From 61a2eed0580b2da724b2d79143ada67942dd59e7 Mon Sep 17 00:00:00 2001 From: oogee Date: Mon, 4 Mar 2019 16:43:36 +0200 Subject: [PATCH 1/7] RecentItem --- app/build.gradle | 1 + .../activities/main/recent/RecentAdapter.java | 37 +++++++-- .../main/recent/RecentFragment.java | 78 +++++-------------- .../gr/thmmy/mthmmy/base/BaseApplication.java | 7 ++ .../gr/thmmy/mthmmy/model/RecentItem.java | 53 +++++++++++++ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 7 files changed, 113 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java diff --git a/app/build.gradle b/app/build.gradle index 12853e57..2a09832c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,6 +72,7 @@ dependencies { implementation 'com.google.android.material:material:1.0.0' implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.google.firebase:firebase-messaging:17.3.4' + implementation 'com.google.firebase:firebase-firestore:18.1.0' implementation 'com.crashlytics.sdk.android:crashlytics:2.9.8' implementation 'com.squareup.okhttp3:okhttp:3.12.0' implementation 'com.squareup.picasso:picasso:2.5.2' diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java index 31871069..725298ab 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java @@ -6,7 +6,16 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; +import com.google.firebase.database.collection.ArraySortedMap; +import com.google.firebase.firestore.DocumentReference; +import com.google.firebase.firestore.DocumentSnapshot; + +import java.util.ArrayList; import java.util.List; +import java.util.Map; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; @@ -21,12 +30,26 @@ import gr.thmmy.mthmmy.model.TopicSummary; */ class RecentAdapter extends RecyclerView.Adapter { private final Context context; - private final List recentList; + private final List postSummaries; private final RecentFragment.RecentFragmentInteractionListener mListener; - RecentAdapter(Context context, @NonNull List topicSummaryList, BaseFragment.FragmentInteractionListener listener) { + RecentAdapter(Context context, @NonNull List postSummaries, BaseFragment.FragmentInteractionListener listener) { this.context = context; - this.recentList = topicSummaryList; + List> tasks = new ArrayList<>(); + for (DocumentReference documentReference : postSummaries) { + Task documentSnapshotTask = documentReference.get(); + tasks.add(documentSnapshotTask); + } + Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener>() { + @Override + public void onSuccess(List objects) { + ArrayList posts = new ArrayList<>(); + for (Object object : objects) { + posts.add((Map) object); + } + } + }) + this.postSummaries = postSummaries; mListener = (RecentFragment.RecentFragmentInteractionListener) listener; } @@ -41,9 +64,11 @@ class RecentAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(final ViewHolder holder, final int position) { - holder.mTitleView.setText(recentList.get(position).getSubject()); - holder.mDateTimeView.setText(recentList.get(position).getDateTimeModified()); - holder.mUserView.setText(recentList.get(position).getLastUser()); + ArraySortedMap map = (ArraySortedMap) postSummaries.get("posts"); + ArraySortedMap post = (ArraySortedMap) map.get(position); + holder.mTitleView.setText(post.get("topicTitle").toString()); + holder.mDateTimeView.setText(post.get("timestamp").toString()); + holder.mUserView.setText(post.get("poster").toString()); holder.topic = recentList.get(position); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index 6c194c0e..924ad497 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -9,6 +9,11 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.Toast; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.firestore.DocumentReference; +import com.google.firebase.firestore.DocumentSnapshot; + import org.jsoup.nodes.Document; import org.jsoup.select.Elements; @@ -17,10 +22,12 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import androidx.annotation.NonNull; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.TopicSummary; import gr.thmmy.mthmmy.session.SessionManager; @@ -49,7 +56,7 @@ public class RecentFragment extends BaseFragment { private SwipeRefreshLayout swipeRefreshLayout; private RecentAdapter recentAdapter; - private List topicSummaries; + private DocumentSnapshot recentDocument; private RecentTask recentTask; @@ -74,13 +81,20 @@ public class RecentFragment extends BaseFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - topicSummaries = new ArrayList<>(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - if (topicSummaries.isEmpty()) { + if (recentDocument == null) { + DocumentReference docRef = BaseApplication.getInstance().getFirestoredb() + .collection("recent_posts") + .document("recent"); + docRef.get().addOnCompleteListener(task -> { + if (task.isSuccessful()) { + recentDocument = task.getResult(); + } + }); recentTask = new RecentTask(this::onRecentTaskStarted, this::onRecentTaskFinished); recentTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, SessionManager.indexUrl.toString()); @@ -98,7 +112,7 @@ public class RecentFragment extends BaseFragment { // Set the adapter if (rootView instanceof RelativeLayout) { progressBar = rootView.findViewById(R.id.progressBar); - recentAdapter = new RecentAdapter(getActivity(), topicSummaries, fragmentInteractionListener); + recentAdapter = new RecentAdapter(getActivity(), (List) recentDocument.get("posts"), fragmentInteractionListener); CustomRecyclerView recyclerView = rootView.findViewById(R.id.list); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(recyclerView.getContext()); @@ -154,60 +168,4 @@ public class RecentFragment extends BaseFragment { progressBar.setVisibility(ProgressBar.INVISIBLE); swipeRefreshLayout.setRefreshing(false); } - - //---------------------------------------ASYNC TASK----------------------------------- - private class RecentTask extends NewParseTask> { - - RecentTask(OnTaskStartedListener onTaskStartedListener, - OnNetworkTaskFinishedListener> onParseTaskFinishedListener) { - super(onTaskStartedListener, onParseTaskFinishedListener); - } - - @Override - protected ArrayList parse(Document document, Response response) throws ParseException { - ArrayList fetchedRecent = new ArrayList<>(); - Elements recent = document.select("#block8 :first-child div"); - if (!recent.isEmpty()) { - for (int i = 0; i < recent.size(); i += 3) { - String link = recent.get(i).child(0).attr("href"); - String title = recent.get(i).child(0).attr("title"); - title = title.trim(); - - String lastUser = recent.get(i + 1).text(); - Pattern pattern = Pattern.compile("\\b (.*)"); - Matcher matcher = pattern.matcher(lastUser); - if (matcher.find()) - lastUser = matcher.group(1); - else - throw new ParseException("Parsing failed (lastUser)"); - - String dateTime = recent.get(i + 2).text(); - pattern = Pattern.compile("\\[(.*)]"); - matcher = pattern.matcher(dateTime); - if (matcher.find()) { - dateTime = matcher.group(1); - if (dateTime.contains(" am") || dateTime.contains(" pm") || - dateTime.contains(" πμ") || dateTime.contains(" μμ")) { - dateTime = dateTime.replaceAll(":[0-5][0-9] ", " "); - } else { - dateTime = dateTime.substring(0, dateTime.lastIndexOf(":")); - } - if (!dateTime.contains(",")) { - dateTime = dateTime.replaceAll(".+? ([0-9])", "$1"); - } - } else - throw new ParseException("Parsing failed (dateTime)"); - - fetchedRecent.add(new TopicSummary(link, title, lastUser, dateTime)); - } - return fetchedRecent; - } - throw new ParseException("Parsing failed"); - } - - @Override - protected int getResultCode(Response response, ArrayList data) { - return NetworkResultCodes.SUCCESSFUL; - } - } } diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java index ce4e4068..7730fed9 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java @@ -16,6 +16,7 @@ import com.franmontiel.persistentcookiejar.PersistentCookieJar; import com.franmontiel.persistentcookiejar.cache.SetCookieCache; import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor; import com.google.firebase.analytics.FirebaseAnalytics; +import com.google.firebase.firestore.FirebaseFirestore; import com.itkacher.okhttpprofiler.OkHttpProfilerInterceptor; import com.jakewharton.picasso.OkHttp3Downloader; import com.mikepenz.fontawesome_typeface_library.FontAwesome; @@ -52,6 +53,7 @@ public class BaseApplication extends Application { //Firebase Analytics private FirebaseAnalytics firebaseAnalytics; + private FirebaseFirestore firestoredb; //Client & SessionManager private OkHttpClient client; @@ -93,6 +95,7 @@ public class BaseApplication extends Application { Timber.i("Starting app with Analytics enabled."); else Timber.i("Starting app with Analytics disabled."); + firestoredb = FirebaseFirestore.getInstance(); SharedPrefsCookiePersistor sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(getApplicationContext()); PersistentCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), sharedPrefsCookiePersistor); @@ -181,6 +184,10 @@ public class BaseApplication extends Application { return client; } + public FirebaseFirestore getFirestoredb() { + return firestoredb; + } + public SessionManager getSessionManager() { return sessionManager; } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java new file mode 100644 index 00000000..82417bce --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java @@ -0,0 +1,53 @@ +package gr.thmmy.mthmmy.model; + +import java.util.Date; + +public class RecentItem { + private int boardId, postId, topicId, posterId; + private String boardTitle, topicTitle, poster; + private Date timestamp; + + public RecentItem(int boardId, String boardTitle, int postId, String poster, int posterId, int timestamp, int topicId, + String topicTitle) { + this.boardId = boardId; + this.postId = postId; + this.poster = poster; + this.posterId = posterId; + this.topicId = topicId; + this.boardTitle = boardTitle; + this.topicTitle = topicTitle; + this.timestamp = new Date(timestamp); + } + + public Date getTimestamp() { + return timestamp; + } + + public int getBoardId() { + return boardId; + } + + public int getPosterId() { + return posterId; + } + + public int getPostId() { + return postId; + } + + public int getTopicId() { + return topicId; + } + + public String getBoardTitle() { + return boardTitle; + } + + public String getPoster() { + return poster; + } + + public String getTopicTitle() { + return topicTitle; + } +} diff --git a/build.gradle b/build.gradle index 463af701..be2e6a2a 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.3.1' classpath 'com.google.gms:google-services:4.2.0' classpath 'io.fabric.tools:gradle:1.26.1' classpath 'org.ajoberstar.grgit:grgit-core:3.0.0' // Also change in app/gradle/grgit.gradle diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 07d9d5c1..d9234066 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Sep 28 13:21:54 EEST 2018 +#Sat Mar 02 17:05:57 EET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip From 280878882145a5c464921544388113a744b75eaa Mon Sep 17 00:00:00 2001 From: oogee Date: Mon, 4 Mar 2019 17:00:56 +0200 Subject: [PATCH 2/7] modify RecentAdapter --- .../mthmmy/activities/main/MainActivity.java | 7 +-- .../activities/main/recent/RecentAdapter.java | 47 +++++-------------- .../main/recent/RecentFragment.java | 41 ++++++++-------- .../gr/thmmy/mthmmy/model/RecentItem.java | 4 +- 4 files changed, 38 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java index af1a4cf2..e527ca90 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java @@ -31,6 +31,7 @@ import gr.thmmy.mthmmy.activities.settings.SettingsActivity; import gr.thmmy.mthmmy.activities.topic.TopicActivity; import gr.thmmy.mthmmy.base.BaseActivity; import gr.thmmy.mthmmy.model.Board; +import gr.thmmy.mthmmy.model.RecentItem; import gr.thmmy.mthmmy.model.ThmmyPage; import gr.thmmy.mthmmy.model.TopicSummary; import timber.log.Timber; @@ -144,10 +145,10 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF } @Override - public void onRecentFragmentInteraction(TopicSummary topicSummary) { + public void onRecentFragmentInteraction(RecentItem recentItem) { Intent i = new Intent(MainActivity.this, TopicActivity.class); - i.putExtra(BUNDLE_TOPIC_URL, topicSummary.getTopicUrl()); - i.putExtra(BUNDLE_TOPIC_TITLE, topicSummary.getSubject()); + i.putExtra(BUNDLE_TOPIC_URL, recentItem.getTopicUrl()); + i.putExtra(BUNDLE_TOPIC_TITLE, recentItem.getTopicTitle()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(i); } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java index 725298ab..abd9ec41 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java @@ -6,21 +6,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.android.gms.tasks.Task; -import com.google.android.gms.tasks.Tasks; -import com.google.firebase.database.collection.ArraySortedMap; -import com.google.firebase.firestore.DocumentReference; -import com.google.firebase.firestore.DocumentSnapshot; - -import java.util.ArrayList; import java.util.List; -import java.util.Map; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.base.BaseFragment; +import gr.thmmy.mthmmy.model.RecentItem; import gr.thmmy.mthmmy.model.TopicSummary; @@ -30,26 +22,13 @@ import gr.thmmy.mthmmy.model.TopicSummary; */ class RecentAdapter extends RecyclerView.Adapter { private final Context context; - private final List postSummaries; + private final List recentItems; private final RecentFragment.RecentFragmentInteractionListener mListener; - RecentAdapter(Context context, @NonNull List postSummaries, BaseFragment.FragmentInteractionListener listener) { + RecentAdapter(Context context, @NonNull List recentItems, BaseFragment.FragmentInteractionListener listener) { this.context = context; - List> tasks = new ArrayList<>(); - for (DocumentReference documentReference : postSummaries) { - Task documentSnapshotTask = documentReference.get(); - tasks.add(documentSnapshotTask); - } - Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener>() { - @Override - public void onSuccess(List objects) { - ArrayList posts = new ArrayList<>(); - for (Object object : objects) { - posts.add((Map) object); - } - } - }) - this.postSummaries = postSummaries; + + this.recentItems = recentItems; mListener = (RecentFragment.RecentFragmentInteractionListener) listener; } @@ -64,13 +43,10 @@ class RecentAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(final ViewHolder holder, final int position) { - ArraySortedMap map = (ArraySortedMap) postSummaries.get("posts"); - ArraySortedMap post = (ArraySortedMap) map.get(position); - holder.mTitleView.setText(post.get("topicTitle").toString()); - holder.mDateTimeView.setText(post.get("timestamp").toString()); - holder.mUserView.setText(post.get("poster").toString()); - - holder.topic = recentList.get(position); + RecentItem recentItem = recentItems.get(position); + holder.mTitleView.setText(recentItem.getTopicTitle()); + holder.mDateTimeView.setText(recentItem.getTimestamp().toString()); + holder.mUserView.setText(recentItem.getPoster()); holder.mView.setOnClickListener(new View.OnClickListener() { @Override @@ -79,7 +55,7 @@ class RecentAdapter extends RecyclerView.Adapter { if (null != mListener) { // Notify the active callbacks interface (the activity, if the // fragment is attached to one) that an item has been selected. - mListener.onRecentFragmentInteraction(holder.topic); //? + mListener.onRecentFragmentInteraction(recentItems.get(holder.getAdapterPosition())); //? } @@ -89,7 +65,7 @@ class RecentAdapter extends RecyclerView.Adapter { @Override public int getItemCount() { - return recentList.size(); + return recentItems.size(); } class ViewHolder extends RecyclerView.ViewHolder { @@ -97,7 +73,6 @@ class RecentAdapter extends RecyclerView.Adapter { final TextView mTitleView; final TextView mUserView; final TextView mDateTimeView; - public TopicSummary topic; ViewHolder(View view) { super(view); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index 924ad497..a459ea4d 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -9,34 +9,26 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.Toast; -import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.DocumentSnapshot; -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - import java.util.ArrayList; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import androidx.annotation.NonNull; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseFragment; +import gr.thmmy.mthmmy.model.RecentItem; import gr.thmmy.mthmmy.model.TopicSummary; import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.CustomRecyclerView; import gr.thmmy.mthmmy.utils.NetworkResultCodes; -import gr.thmmy.mthmmy.utils.parsing.NewParseTask; -import gr.thmmy.mthmmy.utils.parsing.ParseException; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; -import okhttp3.Response; import timber.log.Timber; @@ -56,13 +48,12 @@ public class RecentFragment extends BaseFragment { private SwipeRefreshLayout swipeRefreshLayout; private RecentAdapter recentAdapter; - private DocumentSnapshot recentDocument; - - private RecentTask recentTask; + private ArrayList recentItems; // Required empty public constructor public RecentFragment() {} + /** * Use ONLY this factory method to create a new instance of * this fragment using the provided parameters. @@ -86,18 +77,28 @@ public class RecentFragment extends BaseFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - if (recentDocument == null) { + if (recentItems == null) { DocumentReference docRef = BaseApplication.getInstance().getFirestoredb() .collection("recent_posts") .document("recent"); docRef.get().addOnCompleteListener(task -> { if (task.isSuccessful()) { - recentDocument = task.getResult(); + DocumentSnapshot recentDocument = task.getResult(); + List posts = (List) recentDocument.get("posts"); + List> tasks = new ArrayList<>(); + for (DocumentReference documentReference : posts) { + Task documentSnapshotTask = documentReference.get(); + tasks.add(documentSnapshotTask); + } + Tasks.whenAllSuccess(tasks).addOnSuccessListener(objects -> { + ArrayList recentItems = new ArrayList<>(); + for (Object object : objects) { + RecentItem recentItem = ((DocumentSnapshot) object).toObject(RecentItem.class); + recentItems.add(recentItem); + } + }); } }); - recentTask = new RecentTask(this::onRecentTaskStarted, this::onRecentTaskFinished); - recentTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, SessionManager.indexUrl.toString()); - } Timber.d("onActivityCreated"); } @@ -112,7 +113,7 @@ public class RecentFragment extends BaseFragment { // Set the adapter if (rootView instanceof RelativeLayout) { progressBar = rootView.findViewById(R.id.progressBar); - recentAdapter = new RecentAdapter(getActivity(), (List) recentDocument.get("posts"), fragmentInteractionListener); + recentAdapter = new RecentAdapter(getActivity(), recentItems, fragmentInteractionListener); CustomRecyclerView recyclerView = rootView.findViewById(R.id.list); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(recyclerView.getContext()); @@ -146,7 +147,7 @@ public class RecentFragment extends BaseFragment { public interface RecentFragmentInteractionListener extends FragmentInteractionListener { - void onRecentFragmentInteraction(TopicSummary topicSummary); + void onRecentFragmentInteraction(RecentItem topicSummary); } private void onRecentTaskStarted() { diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java index 82417bce..d03c17d2 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java @@ -7,8 +7,8 @@ public class RecentItem { private String boardTitle, topicTitle, poster; private Date timestamp; - public RecentItem(int boardId, String boardTitle, int postId, String poster, int posterId, int timestamp, int topicId, - String topicTitle) { + public RecentItem(int boardId, String boardTitle, int postId, String poster, int posterId, int timestamp, + int topicId, String topicTitle) { this.boardId = boardId; this.postId = postId; this.poster = poster; From d4a3e90093cbe3c6b148c9cc4ddbc4298b2194ab Mon Sep 17 00:00:00 2001 From: oogee Date: Mon, 4 Mar 2019 23:30:28 +0200 Subject: [PATCH 3/7] finish recent fragment --- .../mthmmy/activities/main/MainActivity.java | 4 +- .../main/recent/RecentFragment.java | 89 +++++++------------ 2 files changed, 36 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java index e527ca90..9ec5aa28 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java @@ -147,7 +147,9 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF @Override public void onRecentFragmentInteraction(RecentItem recentItem) { Intent i = new Intent(MainActivity.this, TopicActivity.class); - i.putExtra(BUNDLE_TOPIC_URL, recentItem.getTopicUrl()); + //TODO: Improve this shit with a thmmy url class in model probably + i.putExtra(BUNDLE_TOPIC_URL, "https://www.thmmy.gr/smf/index.php?topic=" + + recentItem.getTopicId() + ".msg" + recentItem.getPostId() + ";topicseen#new"); i.putExtra(BUNDLE_TOPIC_TITLE, recentItem.getTopicTitle()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(i); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index a459ea4d..86691365 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -24,10 +24,7 @@ import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.RecentItem; -import gr.thmmy.mthmmy.model.TopicSummary; -import gr.thmmy.mthmmy.session.SessionManager; import gr.thmmy.mthmmy.utils.CustomRecyclerView; -import gr.thmmy.mthmmy.utils.NetworkResultCodes; import me.zhanghai.android.materialprogressbar.MaterialProgressBar; import timber.log.Timber; @@ -48,7 +45,7 @@ public class RecentFragment extends BaseFragment { private SwipeRefreshLayout swipeRefreshLayout; private RecentAdapter recentAdapter; - private ArrayList recentItems; + private ArrayList recentItems = new ArrayList<>(); // Required empty public constructor public RecentFragment() {} @@ -78,27 +75,41 @@ public class RecentFragment extends BaseFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (recentItems == null) { - DocumentReference docRef = BaseApplication.getInstance().getFirestoredb() - .collection("recent_posts") - .document("recent"); - docRef.get().addOnCompleteListener(task -> { - if (task.isSuccessful()) { - DocumentSnapshot recentDocument = task.getResult(); - List posts = (List) recentDocument.get("posts"); - List> tasks = new ArrayList<>(); - for (DocumentReference documentReference : posts) { - Task documentSnapshotTask = documentReference.get(); - tasks.add(documentSnapshotTask); - } - Tasks.whenAllSuccess(tasks).addOnSuccessListener(objects -> { - ArrayList recentItems = new ArrayList<>(); - for (Object object : objects) { - RecentItem recentItem = ((DocumentSnapshot) object).toObject(RecentItem.class); - recentItems.add(recentItem); + Timber.d("I'm ere"); + new AsyncTask() { + + @Override + protected Void doInBackground(Void... voids) { + DocumentReference docRef = BaseApplication.getInstance().getFirestoredb() + .collection("recent_posts") + .document("recent"); + Timber.d("I'm here"); + docRef.get().addOnCompleteListener(task -> { + Timber.d("I'm there"); + progressBar.setVisibility(ProgressBar.INVISIBLE); + if (task.isSuccessful()) { + DocumentSnapshot recentDocument = task.getResult(); + List posts = (List) recentDocument.get("posts"); + List> tasks = new ArrayList<>(); + for (DocumentReference documentReference : posts) { + Task documentSnapshotTask = documentReference.get(); + tasks.add(documentSnapshotTask); + } + Tasks.whenAllSuccess(tasks).addOnSuccessListener(objects -> { + ArrayList recentItems = new ArrayList<>(); + for (Object object : objects) { + RecentItem recentItem = ((DocumentSnapshot) object).toObject(RecentItem.class); + recentItems.add(recentItem); + } + }); + } else { + Toast.makeText(getContext(), "Network error", Toast.LENGTH_SHORT).show(); } }); + return null; } - }); + }.execute(); + progressBar.setVisibility(ProgressBar.VISIBLE); } Timber.d("onActivityCreated"); } @@ -126,47 +137,13 @@ public class RecentFragment extends BaseFragment { swipeRefreshLayout = rootView.findViewById(R.id.swiperefresh); swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.primary); swipeRefreshLayout.setColorSchemeResources(R.color.accent); - swipeRefreshLayout.setOnRefreshListener(() -> { - if (!recentTask.isRunning()) { - recentTask = new RecentTask(this::onRecentTaskStarted, this::onRecentTaskFinished); - recentTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, SessionManager.indexUrl.toString()); - } - } - ); } return rootView; } - @Override - public void onDestroy() { - super.onDestroy(); - if (recentTask.isRunning()) - recentTask.cancel(true); - } - public interface RecentFragmentInteractionListener extends FragmentInteractionListener { void onRecentFragmentInteraction(RecentItem topicSummary); } - - private void onRecentTaskStarted() { - progressBar.setVisibility(ProgressBar.VISIBLE); - } - - private void onRecentTaskFinished(int resultCode, ArrayList fetchedRecent) { - if (resultCode == NetworkResultCodes.SUCCESSFUL) { - topicSummaries.clear(); - topicSummaries.addAll(fetchedRecent); - recentAdapter.notifyDataSetChanged(); - } else if (resultCode == NetworkResultCodes.NETWORK_ERROR) { - Toast.makeText(getContext(), "Network error", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(getContext(), "Unexpected error," + - " please contact the developers with the details", Toast.LENGTH_LONG).show(); - } - - progressBar.setVisibility(ProgressBar.INVISIBLE); - swipeRefreshLayout.setRefreshing(false); - } } From cf7fae9880d781af777989a104597ec90ba256b6 Mon Sep 17 00:00:00 2001 From: oogee Date: Tue, 5 Mar 2019 21:57:28 +0200 Subject: [PATCH 4/7] maybe fix something --- .../main/recent/RecentFragment.java | 69 +++++++------------ .../gr/thmmy/mthmmy/base/BaseApplication.java | 6 -- .../gr/thmmy/mthmmy/model/RecentItem.java | 5 ++ build.gradle | 2 +- 4 files changed, 32 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index 86691365..0e0594ef 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -1,6 +1,5 @@ package gr.thmmy.mthmmy.activities.main.recent; -import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -9,19 +8,17 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.Toast; -import com.google.android.gms.tasks.Task; -import com.google.android.gms.tasks.Tasks; import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.DocumentSnapshot; +import com.google.firebase.firestore.FirebaseFirestore; import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import gr.thmmy.mthmmy.R; -import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseFragment; import gr.thmmy.mthmmy.model.RecentItem; import gr.thmmy.mthmmy.utils.CustomRecyclerView; @@ -48,7 +45,8 @@ public class RecentFragment extends BaseFragment { private ArrayList recentItems = new ArrayList<>(); // Required empty public constructor - public RecentFragment() {} + public RecentFragment() { + } /** @@ -74,44 +72,29 @@ public class RecentFragment extends BaseFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - if (recentItems == null) { - Timber.d("I'm ere"); - new AsyncTask() { - - @Override - protected Void doInBackground(Void... voids) { - DocumentReference docRef = BaseApplication.getInstance().getFirestoredb() - .collection("recent_posts") - .document("recent"); - Timber.d("I'm here"); - docRef.get().addOnCompleteListener(task -> { - Timber.d("I'm there"); - progressBar.setVisibility(ProgressBar.INVISIBLE); - if (task.isSuccessful()) { - DocumentSnapshot recentDocument = task.getResult(); - List posts = (List) recentDocument.get("posts"); - List> tasks = new ArrayList<>(); - for (DocumentReference documentReference : posts) { - Task documentSnapshotTask = documentReference.get(); - tasks.add(documentSnapshotTask); - } - Tasks.whenAllSuccess(tasks).addOnSuccessListener(objects -> { - ArrayList recentItems = new ArrayList<>(); - for (Object object : objects) { - RecentItem recentItem = ((DocumentSnapshot) object).toObject(RecentItem.class); - recentItems.add(recentItem); - } - }); - } else { - Toast.makeText(getContext(), "Network error", Toast.LENGTH_SHORT).show(); - } - }); - return null; - } - }.execute(); - progressBar.setVisibility(ProgressBar.VISIBLE); - } + Timber.d("onActivityCreated"); + + DocumentReference docRef = FirebaseFirestore.getInstance() + .collection("recent_posts") + .document("recent"); + Timber.i("I'm here"); + docRef.get().addOnCompleteListener(task -> { + Timber.i("I'm there"); + progressBar.setVisibility(ProgressBar.INVISIBLE); + if (task.isSuccessful()) { + DocumentSnapshot recentDocument = task.getResult(); + Timber.i("Type: " + recentDocument.get("posts").getClass().getName()); + ArrayList> posts = (ArrayList>) recentDocument.get("posts"); + for (HashMap map : posts) { + RecentItem recentItem = new RecentItem(map); + recentItems.add(recentItem); + } + } else { + Toast.makeText(getContext(), "Network error", Toast.LENGTH_SHORT).show(); + } + }); + progressBar.setVisibility(ProgressBar.VISIBLE); } diff --git a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java index 7730fed9..55b1a9be 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java +++ b/app/src/main/java/gr/thmmy/mthmmy/base/BaseApplication.java @@ -53,7 +53,6 @@ public class BaseApplication extends Application { //Firebase Analytics private FirebaseAnalytics firebaseAnalytics; - private FirebaseFirestore firestoredb; //Client & SessionManager private OkHttpClient client; @@ -95,7 +94,6 @@ public class BaseApplication extends Application { Timber.i("Starting app with Analytics enabled."); else Timber.i("Starting app with Analytics disabled."); - firestoredb = FirebaseFirestore.getInstance(); SharedPrefsCookiePersistor sharedPrefsCookiePersistor = new SharedPrefsCookiePersistor(getApplicationContext()); PersistentCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), sharedPrefsCookiePersistor); @@ -184,10 +182,6 @@ public class BaseApplication extends Application { return client; } - public FirebaseFirestore getFirestoredb() { - return firestoredb; - } - public SessionManager getSessionManager() { return sessionManager; } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java index d03c17d2..4baf0b42 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java @@ -1,6 +1,7 @@ package gr.thmmy.mthmmy.model; import java.util.Date; +import java.util.HashMap; public class RecentItem { private int boardId, postId, topicId, posterId; @@ -19,6 +20,10 @@ public class RecentItem { this.timestamp = new Date(timestamp); } + public RecentItem(HashMap keymap) { + + } + public Date getTimestamp() { return timestamp; } diff --git a/build.gradle b/build.gradle index be2e6a2a..278b54aa 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' + classpath 'com.android.tools.build:gradle:3.3.2' classpath 'com.google.gms:google-services:4.2.0' classpath 'io.fabric.tools:gradle:1.26.1' classpath 'org.ajoberstar.grgit:grgit-core:3.0.0' // Also change in app/gradle/grgit.gradle From ab8ee7060ccef64595d545f72c3ae8bf584d3f5c Mon Sep 17 00:00:00 2001 From: Ezerous Date: Wed, 6 Mar 2019 13:43:41 +0200 Subject: [PATCH 5/7] RecentItem fix --- .../gr/thmmy/mthmmy/model/RecentItem.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java index 4baf0b42..4221566a 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java @@ -1,27 +1,22 @@ package gr.thmmy.mthmmy.model; import java.util.Date; -import java.util.HashMap; +import java.util.Map; public class RecentItem { private int boardId, postId, topicId, posterId; private String boardTitle, topicTitle, poster; private Date timestamp; - public RecentItem(int boardId, String boardTitle, int postId, String poster, int posterId, int timestamp, - int topicId, String topicTitle) { - this.boardId = boardId; - this.postId = postId; - this.poster = poster; - this.posterId = posterId; - this.topicId = topicId; - this.boardTitle = boardTitle; - this.topicTitle = topicTitle; - this.timestamp = new Date(timestamp); - } - - public RecentItem(HashMap keymap) { - + public RecentItem(Map map) { + this.boardId = ((Long) map.get("boardId")).intValue(); + this.postId = ((Long) map.get("postId")).intValue(); + this.poster = String.valueOf(map.get("poster")); + this.posterId = ((Long) map.get("posterId")).intValue(); + this.topicId = ((Long) map.get("topicId")).intValue(); + this.boardTitle = String.valueOf(map.get("boardTitle")); + this.topicTitle = String.valueOf(map.get("topicTitle")); + this.timestamp = new Date((long)(map.get("timestamp")) * 1000); } public Date getTimestamp() { From 016067b336733cca8ba72d85b76103638f251512 Mon Sep 17 00:00:00 2001 From: oogee Date: Tue, 2 Apr 2019 13:40:28 +0300 Subject: [PATCH 6/7] add relative time textview to display timestamp --- app/build.gradle | 1 + .../activities/main/recent/RecentAdapter.java | 21 +++++++++---------- .../main/recent/RecentFragment.java | 6 +----- .../gr/thmmy/mthmmy/model/RecentItem.java | 6 +++--- .../main/res/layout/fragment_recent_row.xml | 2 +- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2a09832c..10106341 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,6 +90,7 @@ dependencies { implementation 'ru.noties:markwon:2.0.0' implementation 'net.gotev:uploadservice:3.4.2' implementation 'net.gotev:uploadservice-okhttp:3.4.2' + implementation 'com.github.curioustechizen.android-ago:library:1.4.0' implementation 'com.itkacher.okhttpprofiler:okhttpprofiler:1.0.4' //Plugin: https://plugins.jetbrains.com/plugin/11249-okhttp-profiler } diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java index abd9ec41..3350c740 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentAdapter.java @@ -6,6 +6,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import com.github.curioustechizen.ago.RelativeTimeTextView; + import java.util.List; import androidx.annotation.NonNull; @@ -45,21 +47,18 @@ class RecentAdapter extends RecyclerView.Adapter { public void onBindViewHolder(final ViewHolder holder, final int position) { RecentItem recentItem = recentItems.get(position); holder.mTitleView.setText(recentItem.getTopicTitle()); - holder.mDateTimeView.setText(recentItem.getTimestamp().toString()); + holder.mDateTimeView.setReferenceTime(recentItem.getTimestamp()); holder.mUserView.setText(recentItem.getPoster()); - holder.mView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - if (null != mListener) { - // Notify the active callbacks interface (the activity, if the - // fragment is attached to one) that an item has been selected. - mListener.onRecentFragmentInteraction(recentItems.get(holder.getAdapterPosition())); //? + holder.mView.setOnClickListener(v -> { - } + if (null != mListener) { + // Notify the active callbacks interface (the activity, if the + // fragment is attached to one) that an item has been selected. + mListener.onRecentFragmentInteraction(recentItems.get(holder.getAdapterPosition())); //? } + }); } @@ -72,7 +71,7 @@ class RecentAdapter extends RecyclerView.Adapter { final View mView; final TextView mTitleView; final TextView mUserView; - final TextView mDateTimeView; + final RelativeTimeTextView mDateTimeView; ViewHolder(View view) { super(view); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index 0e0594ef..ac70841b 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -73,23 +73,19 @@ public class RecentFragment extends BaseFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - Timber.d("onActivityCreated"); - DocumentReference docRef = FirebaseFirestore.getInstance() .collection("recent_posts") .document("recent"); - Timber.i("I'm here"); docRef.get().addOnCompleteListener(task -> { - Timber.i("I'm there"); progressBar.setVisibility(ProgressBar.INVISIBLE); if (task.isSuccessful()) { DocumentSnapshot recentDocument = task.getResult(); - Timber.i("Type: " + recentDocument.get("posts").getClass().getName()); ArrayList> posts = (ArrayList>) recentDocument.get("posts"); for (HashMap map : posts) { RecentItem recentItem = new RecentItem(map); recentItems.add(recentItem); } + recentAdapter.notifyDataSetChanged(); } else { Toast.makeText(getContext(), "Network error", Toast.LENGTH_SHORT).show(); } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java index 4221566a..667ab826 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/RecentItem.java @@ -6,7 +6,7 @@ import java.util.Map; public class RecentItem { private int boardId, postId, topicId, posterId; private String boardTitle, topicTitle, poster; - private Date timestamp; + private long timestamp; public RecentItem(Map map) { this.boardId = ((Long) map.get("boardId")).intValue(); @@ -16,10 +16,10 @@ public class RecentItem { this.topicId = ((Long) map.get("topicId")).intValue(); this.boardTitle = String.valueOf(map.get("boardTitle")); this.topicTitle = String.valueOf(map.get("topicTitle")); - this.timestamp = new Date((long)(map.get("timestamp")) * 1000); + this.timestamp = (long)(map.get("timestamp")) * 1000; } - public Date getTimestamp() { + public long getTimestamp() { return timestamp; } diff --git a/app/src/main/res/layout/fragment_recent_row.xml b/app/src/main/res/layout/fragment_recent_row.xml index 7d136a4e..b816afb6 100644 --- a/app/src/main/res/layout/fragment_recent_row.xml +++ b/app/src/main/res/layout/fragment_recent_row.xml @@ -32,7 +32,7 @@ android:layout_below="@+id/title" android:layout_toEndOf="@+id/dateTime"/> - Date: Tue, 2 Apr 2019 19:24:16 +0300 Subject: [PATCH 7/7] listen for recent updates --- .../main/recent/RecentFragment.java | 42 ++++++++++++------- app/src/main/res/layout/fragment_recent.xml | 31 ++++++-------- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java index ac70841b..78483887 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/recent/RecentFragment.java @@ -11,6 +11,7 @@ import android.widget.Toast; import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.DocumentSnapshot; import com.google.firebase.firestore.FirebaseFirestore; +import com.google.firebase.firestore.ListenerRegistration; import java.util.ArrayList; import java.util.HashMap; @@ -39,11 +40,12 @@ public class RecentFragment extends BaseFragment { // Fragment initialization parameters, e.g. ARG_SECTION_NUMBER private MaterialProgressBar progressBar; - private SwipeRefreshLayout swipeRefreshLayout; private RecentAdapter recentAdapter; private ArrayList recentItems = new ArrayList<>(); + private ListenerRegistration recentSnapshotListener; + // Required empty public constructor public RecentFragment() { } @@ -78,21 +80,23 @@ public class RecentFragment extends BaseFragment { .document("recent"); docRef.get().addOnCompleteListener(task -> { progressBar.setVisibility(ProgressBar.INVISIBLE); - if (task.isSuccessful()) { - DocumentSnapshot recentDocument = task.getResult(); - ArrayList> posts = (ArrayList>) recentDocument.get("posts"); - for (HashMap map : posts) { - RecentItem recentItem = new RecentItem(map); - recentItems.add(recentItem); - } - recentAdapter.notifyDataSetChanged(); - } else { - Toast.makeText(getContext(), "Network error", Toast.LENGTH_SHORT).show(); - } + + if (task.isSuccessful()) onNewDocumentSnapshot(task.getResult()); + else Toast.makeText(getContext(), "Network error", Toast.LENGTH_SHORT).show(); }); + recentSnapshotListener = docRef.addSnapshotListener((documentSnapshot, e) -> { + Timber.i("New doc"); + onNewDocumentSnapshot(documentSnapshot); + } + ); progressBar.setVisibility(ProgressBar.VISIBLE); } + @Override + public void onDestroy() { + super.onDestroy(); + recentSnapshotListener.remove(); + } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -112,15 +116,21 @@ public class RecentFragment extends BaseFragment { linearLayoutManager.getOrientation()); recyclerView.addItemDecoration(dividerItemDecoration); recyclerView.setAdapter(recentAdapter); - - swipeRefreshLayout = rootView.findViewById(R.id.swiperefresh); - swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.primary); - swipeRefreshLayout.setColorSchemeResources(R.color.accent); } return rootView; } + public void onNewDocumentSnapshot(DocumentSnapshot recentDocument) { + recentItems.clear(); + ArrayList> posts = (ArrayList>) recentDocument.get("posts"); + for (HashMap map : posts) { + RecentItem recentItem = new RecentItem(map); + recentItems.add(recentItem); + } + recentAdapter.notifyDataSetChanged(); + } + public interface RecentFragmentInteractionListener extends FragmentInteractionListener { void onRecentFragmentInteraction(RecentItem topicSummary); diff --git a/app/src/main/res/layout/fragment_recent.xml b/app/src/main/res/layout/fragment_recent.xml index 356f96ae..0ed39317 100644 --- a/app/src/main/res/layout/fragment_recent.xml +++ b/app/src/main/res/layout/fragment_recent.xml @@ -1,28 +1,21 @@ - - - - - + android:layout_height="match_parent" + android:background="@color/background" + android:paddingTop="4dp" + android:paddingBottom="4dp" + app:layoutManager="LinearLayoutManager" + tools:context=".activities.main.recent.RecentFragment" + tools:listitem="@layout/fragment_recent_row" /> + app:mpb_progressStyle="horizontal" /> \ No newline at end of file