From 93812fef4640a7f697f6050a79044ff8c437fb71 Mon Sep 17 00:00:00 2001 From: Jeffrey Aaron Jeyasingh Date: Sun, 28 Feb 2021 18:23:59 -0800 Subject: [PATCH 1/2] Implement View Counter For Articles --- AHSMobile_Android/.idea/gradle.xml | 1 + .../main/java/com/hsappdev/ahs/Article.java | 42 +++++++++++++++- .../com/hsappdev/ahs/ArticleActivity.java | 29 +++++++++++ .../java/com/hsappdev/ahs/Article_Slim.java | 9 +++- .../hsappdev/ahs/FirebaseDatabaseHandler.java | 10 +++- .../FeaturedRecyclerAdapter.java | 2 + .../java/com/hsappdev/ahs/misc/Helper.java | 1 + .../main/res/layout/news_article_template.xml | 48 +++++++++++++++---- .../res/layout/news_featured_template.xml | 34 ++++++++++--- .../app/src/main/res/layout/news_template.xml | 35 ++++++++++++-- .../app/src/main/res/values/dimen.xml | 2 +- .../app/src/main/res/values/strings.xml | 1 + 12 files changed, 186 insertions(+), 28 deletions(-) diff --git a/AHSMobile_Android/.idea/gradle.xml b/AHSMobile_Android/.idea/gradle.xml index ac6b0ae..23a89bb 100644 --- a/AHSMobile_Android/.idea/gradle.xml +++ b/AHSMobile_Android/.idea/gradle.xml @@ -15,6 +15,7 @@ diff --git a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java index e27799d..7fd47e7 100644 --- a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java +++ b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java @@ -4,6 +4,9 @@ import androidx.annotation.NonNull; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; + public class Article implements Parcelable { private final String ID; @@ -13,7 +16,7 @@ public class Article implements Parcelable { private final String story; private final String [] imagePaths; private final String [] videoIDS; - + private int views; private final Type type; @@ -40,6 +43,34 @@ public Article( this.imagePaths = imagePaths; this.videoIDS = videoIDS; this.type = type; + this.views = 0; + } + + public Article( + @NonNull + String ID, + long time_updated, + @NonNull + String title, + @NonNull + String author, + @NonNull + String story, + String[] imagePaths, + String[] videoIDS, + Type type, + int views + ) + { + this.ID = ID; + this.time_updated = time_updated; + this.title = title; + this.author = author; + this.story = story; + this.imagePaths = imagePaths; + this.videoIDS = videoIDS; + this.type = type; + this.views = views; } public static final Creator
CREATOR = new Creator
() { @@ -59,6 +90,10 @@ public long getTimeUpdated() { return time_updated; } + public int getViews() + { + return views; + } public String getTitle() { return title; @@ -85,7 +120,8 @@ public String toString() "title::\t" + title + "\n" + "author::\t" + author + "\n" + "story::\t" + ((story.length() > 40) ? story.substring(0,40) : story) + "\n" + // so output might not be overly long - "type::\t" + type.toString(); + "type::\t" + type.toString() + + "views::\t" + views; } // The following methods are for the purpose of extending Parcelable @@ -99,6 +135,7 @@ protected Article(Parcel in) { imagePaths = in.createStringArray(); videoIDS = in.createStringArray(); type = (Type) in.readSerializable(); + views = in.readInt(); } @Override @@ -116,6 +153,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeStringArray(imagePaths); dest.writeStringArray(videoIDS); dest.writeSerializable(type); + dest.writeInt(views); } /** diff --git a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/ArticleActivity.java b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/ArticleActivity.java index ff7fd4e..4883aa3 100644 --- a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/ArticleActivity.java +++ b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/ArticleActivity.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.content.Intent; +import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.util.Log; @@ -17,6 +18,9 @@ import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ServerValue; import com.hsappdev.ahs.misc.FullScreenActivity; import com.hsappdev.ahs.misc.Helper; import com.hsappdev.ahs.misc.MediaYoutubeFragment; @@ -32,6 +36,30 @@ public class ArticleActivity extends FullScreenActivity implements ArticleImageF private ValContainer saved_copy; private Article article; + + public void incrementViews() { + Resources r = getResources(); + final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(r.getString(R.string.fb_news_key)); + Log.d("NewViews", article.getType().getName()+" "+article.getID()); + Log.d("NewViews", ref.child(convertTypeNumCode(article.getType().getNumCode())).child(article.getID()).child(r.getString(R.string.fb_art_views)).toString()); + ref.child(convertTypeNumCode(article.getType().getNumCode())).child(article.getID()).child(r.getString(R.string.fb_art_views)).setValue(ServerValue.increment(1)); + } + + public String convertTypeNumCode(int i){ + switch (i){ + case 1: + return "ASB"; + case 2: + return "District"; + + case 3: + return "General_Info"; + + } + return ""; + + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -39,6 +67,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.article_layout); article = getIntent().getParcelableExtra(data_key); + incrementViews(); final String[] imagePaths= article.getImagePaths(); final String[] videoIDs = article.getVideoIDS(); diff --git a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article_Slim.java b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article_Slim.java index 2839047..ca17d11 100644 --- a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article_Slim.java +++ b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article_Slim.java @@ -14,6 +14,7 @@ public class Article_Slim implements Parcelable, Comparable { private final String title; private final String story; private final String imagePath; + private int views; private final Article.Type type; @@ -28,6 +29,7 @@ public Article_Slim(Article article) { else this.imagePath = ""; this.type = article.getType(); + this.views = article.getViews(); } public static ArrayList toArticle_Slim(ArrayList
articles) { @@ -90,7 +92,10 @@ public String getImagePath() { return imagePath; } - + public int getViews() + { + return views; + } public Article.Type getType() { return type;} @NonNull @@ -113,6 +118,7 @@ protected Article_Slim(Parcel in) { story = in.readString(); imagePath = in.readString(); type = (Article.Type) in.readSerializable(); + views = in.readInt(); } @Override @@ -128,6 +134,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(story); dest.writeString(imagePath); dest.writeSerializable(type); + dest.writeSerializable(views); } @Override diff --git a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/FirebaseDatabaseHandler.java b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/FirebaseDatabaseHandler.java index 8249bac..2677e3a 100644 --- a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/FirebaseDatabaseHandler.java +++ b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/FirebaseDatabaseHandler.java @@ -47,7 +47,8 @@ public void getNewsArticles(final NewsArticleCallback callback) { articleImages = r.getString(R.string.fb_art_images), articleVideos = r.getString(R.string.fb_art_videos), articleTime = r.getString(R.string.fb_art_time), - articleFeatured = r.getString(R.string.fb_art_featured); + articleFeatured = r.getString(R.string.fb_art_featured), + articleViews = r.getString(R.string.fb_art_views); final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(r.getString(R.string.fb_news_key)); ref.addValueEventListener(new ValueEventListener() { @@ -74,6 +75,11 @@ public void onDataChange(@NonNull final DataSnapshot snapshot) { String body = child_sn.child(articleBody).getValue(String.class); if(body == null) body = ""; + int num_views = 0; + Integer num_views_temp = child_sn.child(articleViews).getValue(Integer.class); + if(num_views_temp != null){ + num_views = num_views_temp.intValue(); + } // so html parse works correctly with new line characters body = body.replace("\n","
"); @@ -100,7 +106,7 @@ public void onDataChange(@NonNull final DataSnapshot snapshot) { long article_time = (long) child_sn.child(articleTime).getValue(); - Article article = new Article(ID,article_time,title,author,body,imagePaths,videoIDs, Article.Type.values()[i]); + Article article = new Article(ID,article_time,title,author,body,imagePaths,videoIDs, Article.Type.values()[i], num_views); boolean is_featured = (boolean) child_sn.child(articleFeatured).getValue(); if(is_featured) diff --git a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/homePage_News/FeaturedRecyclerAdapter.java b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/homePage_News/FeaturedRecyclerAdapter.java index 27b7ff9..3bbcbc7 100644 --- a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/homePage_News/FeaturedRecyclerAdapter.java +++ b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/homePage_News/FeaturedRecyclerAdapter.java @@ -95,6 +95,8 @@ public void init(final Article_Slim article) { Helper.setTimeText_toView(timeText, Helper.TimeFromNow(article.getTimeUpdated()) ); + // TODO: REMOVE Testing views functionality only + timeText.setText(timeText.getText()+" | "+Integer.toString(article.getViews()) + " views"); String imagePaths = article.getImagePath(); if(imagePaths != null && imagePaths.length() > 0) Helper.setImageFromUrl_CenterCrop_FullSize( diff --git a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/misc/Helper.java b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/misc/Helper.java index d597f5d..aaf21a7 100644 --- a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/misc/Helper.java +++ b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/misc/Helper.java @@ -101,6 +101,7 @@ public static void setImageFromUrl_CenterCrop(final ImageView view, String url) } + public static void setImageFromUrl_CenterCrop_FullSize(final ImageView view, String url) { Glide .with(view.getContext()) diff --git a/AHSMobile_Android/app/src/main/res/layout/news_article_template.xml b/AHSMobile_Android/app/src/main/res/layout/news_article_template.xml index b9174b4..bc50e5a 100644 --- a/AHSMobile_Android/app/src/main/res/layout/news_article_template.xml +++ b/AHSMobile_Android/app/src/main/res/layout/news_article_template.xml @@ -1,6 +1,7 @@ + app:layout_constraintGuide_percent="0.40" /> + app:layout_constraintStart_toEndOf="@+id/news_featured_typeText" /> + + + + \ No newline at end of file diff --git a/AHSMobile_Android/app/src/main/res/layout/news_featured_template.xml b/AHSMobile_Android/app/src/main/res/layout/news_featured_template.xml index 9453f64..87dd8aa 100644 --- a/AHSMobile_Android/app/src/main/res/layout/news_featured_template.xml +++ b/AHSMobile_Android/app/src/main/res/layout/news_featured_template.xml @@ -2,16 +2,17 @@ @@ -57,17 +59,18 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/type_rounded_bg" android:fontFamily="@font/sf_pro_display" android:paddingLeft="7dp" android:paddingTop="3dp" android:paddingRight="7dp" android:paddingBottom="3dp" android:text="Type" - android:textColor="@color/White" - android:textSize="12sp" + android:textAllCaps="true" + android:textColor="@color/AngryRed_9F0C0C" + android:textSize="14sp" + android:textStyle="bold" app:layout_constraintBottom_toBottomOf="@+id/news_featured_smalldot" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/news_featured_smalldot" /> - + + + + \ No newline at end of file diff --git a/AHSMobile_Android/app/src/main/res/layout/news_template.xml b/AHSMobile_Android/app/src/main/res/layout/news_template.xml index 6a0cdeb..5fde756 100644 --- a/AHSMobile_Android/app/src/main/res/layout/news_template.xml +++ b/AHSMobile_Android/app/src/main/res/layout/news_template.xml @@ -2,6 +2,7 @@ + + android:textColor="@color/AngryRed_9F0C0C" + android:textSize="24sp" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + + diff --git a/AHSMobile_Android/app/src/main/res/values/dimen.xml b/AHSMobile_Android/app/src/main/res/values/dimen.xml index bce1ee4..c039613 100644 --- a/AHSMobile_Android/app/src/main/res/values/dimen.xml +++ b/AHSMobile_Android/app/src/main/res/values/dimen.xml @@ -15,5 +15,5 @@ 4dp - 5dp + 15dp \ No newline at end of file diff --git a/AHSMobile_Android/app/src/main/res/values/strings.xml b/AHSMobile_Android/app/src/main/res/values/strings.xml index a0c6883..4078950 100644 --- a/AHSMobile_Android/app/src/main/res/values/strings.xml +++ b/AHSMobile_Android/app/src/main/res/values/strings.xml @@ -56,6 +56,7 @@ articleVideoIDs articleUnixEpoch isFeatured + views bulletin Academics From eabb89047bed675456c970416f2f7bf9a9463fc3 Mon Sep 17 00:00:00 2001 From: Xing <31298876+FlyOrBoom@users.noreply.github.com> Date: Sun, 28 Feb 2021 20:29:16 -0800 Subject: [PATCH 2/2] Standardize property names Use same property names as the ahs-app database (arcadia-high-mobile database property names minus the article prefix) --- .../main/java/com/hsappdev/ahs/Article.java | 104 +++++++++--------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java index 7fd47e7..cda0bda 100644 --- a/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java +++ b/AHSMobile_Android/app/src/main/java/com/hsappdev/ahs/Article.java @@ -10,67 +10,67 @@ public class Article implements Parcelable { private final String ID; - private final long time_updated; + private final long timestamp; private final String title; private final String author; - private final String story; - private final String [] imagePaths; + private final String body; + private final String [] imageURLs; private final String [] videoIDS; private int views; private final Type type; - public Article( - @NonNull - String ID, - long time_updated, - @NonNull - String title, - @NonNull - String author, - @NonNull - String story, - String[] imagePaths, - String[] videoIDS, - Type type + @NonNull + String ID, + long timestamp, + @NonNull + String title, + @NonNull + String author, + @NonNull + String body, + String[] imageURLs, + String[] videoIDS, + Type type, + int views ) { this.ID = ID; - this.time_updated = time_updated; + this.timestamp = timestamp; this.title = title; this.author = author; - this.story = story; - this.imagePaths = imagePaths; + this.body = body; + this.imageURLs = imageURLs; this.videoIDS = videoIDS; this.type = type; - this.views = 0; + this.views = views; } - + + public Article( - @NonNull - String ID, - long time_updated, - @NonNull - String title, - @NonNull - String author, - @NonNull - String story, - String[] imagePaths, - String[] videoIDS, - Type type, - int views + @NonNull + String ID, + long timestamp, + @NonNull + String title, + @NonNull + String author, + @NonNull + String body, + String[] imageURLs, + String[] videoIDS, + Type type ) { this.ID = ID; - this.time_updated = time_updated; + this.timestamp = timestamp; this.title = title; this.author = author; - this.story = story; - this.imagePaths = imagePaths; + this.body = body; + this.imageURLs = imageURLs; this.videoIDS = videoIDS; this.type = type; - this.views = views; + this.views = 0; } public static final Creator
CREATOR = new Creator
() { @@ -86,9 +86,9 @@ public Article[] newArray(int size) { }; public String getID() {return ID;} - public long getTimeUpdated() + public long getTimestamp() { - return time_updated; + return timestamp; } public int getViews() { @@ -99,13 +99,13 @@ public String getTitle() return title; } public String getAuthor() {return author;} - public String getStory() + public String getBody() { - return story; + return body; } - public String[] getImagePaths() + public String[] getImageURLs() { - return imagePaths; + return imageURLs; } public String[] getVideoIDS() {return videoIDS;} @@ -116,10 +116,10 @@ public String[] getImagePaths() public String toString() { return "ID::\t" + ID + "\n" + - "time::\t" + time_updated + "\n" + + "time::\t" + timestamp + "\n" + "title::\t" + title + "\n" + "author::\t" + author + "\n" + - "story::\t" + ((story.length() > 40) ? story.substring(0,40) : story) + "\n" + // so output might not be overly long + "body::\t" + ((body.length() > 40) ? body.substring(0,40) : body) + "\n" + // so output might not be overly long "type::\t" + type.toString() + "views::\t" + views; } @@ -128,11 +128,11 @@ public String toString() // make sure to update methods should a new field be added protected Article(Parcel in) { ID = in.readString(); - time_updated = in.readLong(); + timestamp = in.readLong(); title = in.readString(); author = in.readString(); - story = in.readString(); - imagePaths = in.createStringArray(); + body = in.readString(); + imageURLs = in.createStringArray(); videoIDS = in.createStringArray(); type = (Type) in.readSerializable(); views = in.readInt(); @@ -146,11 +146,11 @@ public int describeContents() { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(ID); - dest.writeLong(time_updated); + dest.writeLong(timestamp); dest.writeString(title); dest.writeString(author); - dest.writeString(story); - dest.writeStringArray(imagePaths); + dest.writeString(body); + dest.writeStringArray(imageURLs); dest.writeStringArray(videoIDS); dest.writeSerializable(type); dest.writeInt(views);