From cc9952525b96c56c61f43477fbbcfa881694adec Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Wed, 22 Sep 2021 20:17:33 +0800 Subject: [PATCH] Only save read post ids in PostFragment. Add read post ids to readPosts in PostFragment. --- ...eadPostsAndConcatenatedSubredditNames.java | 10 ++-- .../activities/ViewPostDetailActivity.java | 8 +++ .../adapters/Paging3LoadingStateAdapter.java | 4 -- .../adapters/PostRecyclerViewAdapter.java | 3 ++ .../fragments/PostFragment.java | 11 ++-- .../infinityforreddit/post/ParsePost.java | 54 ++----------------- .../post/PostPagingSource.java | 10 ++-- .../infinityforreddit/post/PostViewModel.java | 21 ++++---- .../infinityforreddit/readpost/ReadPost.java | 5 -- 9 files changed, 43 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchPostFilterReadPostsAndConcatenatedSubredditNames.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchPostFilterReadPostsAndConcatenatedSubredditNames.java index 328a2e52..468a1ce2 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchPostFilterReadPostsAndConcatenatedSubredditNames.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchPostFilterReadPostsAndConcatenatedSubredditNames.java @@ -12,7 +12,7 @@ import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubred public class FetchPostFilterReadPostsAndConcatenatedSubredditNames { public interface FetchPostFilterAndReadPostsListener { - void success(PostFilter postFilter, ArrayList readPostList); + void success(PostFilter postFilter, ArrayList readPostList); } public interface FetchPostFilterAndConcatenatecSubredditNamesListener { @@ -26,8 +26,12 @@ public class FetchPostFilterReadPostsAndConcatenatedSubredditNames { List postFilters = redditDataRoomDatabase.postFilterDao().getValidPostFilters(postFilterUsage, nameOfUsage); PostFilter mergedPostFilter = PostFilter.mergePostFilter(postFilters); if (accountName != null) { - ArrayList readPosts = (ArrayList) redditDataRoomDatabase.readPostDao().getAllReadPosts(accountName); - handler.post(() -> fetchPostFilterAndReadPostsListener.success(mergedPostFilter, readPosts)); + List readPosts = redditDataRoomDatabase.readPostDao().getAllReadPosts(accountName); + ArrayList readPostStrings = new ArrayList<>(); + for (ReadPost readPost : readPosts) { + readPostStrings.add(readPost.getId()); + } + handler.post(() -> fetchPostFilterAndReadPostsListener.success(mergedPostFilter, readPostStrings)); } else { handler.post(() -> fetchPostFilterAndReadPostsListener.success(mergedPostFilter, null)); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewPostDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewPostDetailActivity.java index ae3538b1..21d40979 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewPostDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewPostDetailActivity.java @@ -314,6 +314,14 @@ public class ViewPostDetailActivity extends BaseActivity implements SortTypeSele if (savedInstanceState == null) { viewPager2.setCurrentItem(getIntent().getIntExtra(EXTRA_POST_LIST_POSITION, 0), false); } + if (mSharedPreferences.getBoolean(mAccountName + SharedPreferencesUtils.MARK_POSTS_AS_READ_BASE, false)) { + viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + //EventBus.getDefault().post(new (getClass().getName())); + } + }); + } searchPanelMaterialCardView.setOnClickListener(null); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/Paging3LoadingStateAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/Paging3LoadingStateAdapter.java index 0c094f4f..3f80d65e 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/Paging3LoadingStateAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/Paging3LoadingStateAdapter.java @@ -1,6 +1,5 @@ package ml.docilealligator.infinityforreddit.adapters; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -60,12 +59,9 @@ public class Paging3LoadingStateAdapter extends LoadStateAdapter readPosts; + private ArrayList readPosts; private Unbinder unbinder; private Map subredditOrUserIcons = new HashMap<>(); @@ -390,7 +389,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { recyclerViewPosition = savedInstanceState.getInt(RECYCLER_VIEW_POSITION_STATE); isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); - readPosts = savedInstanceState.getParcelableArrayList(READ_POST_LIST_STATE); + readPosts = savedInstanceState.getStringArrayList(READ_POST_LIST_STATE); postFilter = savedInstanceState.getParcelable(POST_FILTER_STATE); concatenatedSubredditNames = savedInstanceState.getString(CONCATENATED_SUBREDDIT_NAMES_STATE); postFragmentId = savedInstanceState.getLong(POST_FRAGMENT_ID_STATE); @@ -1264,7 +1263,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode); - outState.putParcelableArrayList(READ_POST_LIST_STATE, readPosts); + outState.putStringArrayList(READ_POST_LIST_STATE, readPosts); if (mLinearLayoutManager != null) { outState.putInt(RECYCLER_VIEW_POSITION_STATE, mLinearLayoutManager.findFirstVisibleItemPosition()); } else if (mStaggeredGridLayoutManager != null) { @@ -1561,6 +1560,10 @@ public class PostFragment extends Fragment implements FragmentCommunicator { } } + public void markPostAsRead(Post post) { + readPosts.add(post.getId()); + } + @Subscribe public void onPostUpdateEvent(PostUpdateEventToPostList event) { ItemSnapshotList posts = mAdapter.snapshot(); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java index 8b02bab9..ff341041 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java @@ -17,7 +17,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import ml.docilealligator.infinityforreddit.postfilter.PostFilter; -import ml.docilealligator.infinityforreddit.readpost.ReadPost; import ml.docilealligator.infinityforreddit.utils.JSONUtils; import ml.docilealligator.infinityforreddit.utils.Utils; @@ -26,54 +25,7 @@ import ml.docilealligator.infinityforreddit.utils.Utils; */ public class ParsePost { - public static void parsePosts(Executor executor, Handler handler, String response, int nPosts, - PostFilter postFilter, List readPostList, - ParsePostsListingListener parsePostsListingListener) { - executor.execute(() -> { - LinkedHashSet newPosts = new LinkedHashSet<>(); - try { - JSONObject jsonResponse = new JSONObject(response); - JSONArray allData = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY); - String lastItem = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY); - - //Posts listing - int size; - if (nPosts < 0 || nPosts > allData.length()) { - size = allData.length(); - } else { - size = nPosts; - } - - HashSet readPostHashSet = null; - if (readPostList != null) { - readPostHashSet = new HashSet<>(readPostList); - } - for (int i = 0; i < size; i++) { - try { - if (allData.getJSONObject(i).getString(JSONUtils.KIND_KEY).equals("t3")) { - JSONObject data = allData.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY); - Post post = parseBasicData(data); - if (readPostHashSet != null && readPostHashSet.contains(ReadPost.convertPost(post))) { - post.markAsRead(false); - } - if (PostFilter.isPostAllowed(post, postFilter)) { - newPosts.add(post); - } - } - } catch (JSONException e) { - e.printStackTrace(); - } - } - - handler.post(() -> parsePostsListingListener.onParsePostsListingSuccess(newPosts, lastItem)); - } catch (JSONException e) { - e.printStackTrace(); - handler.post(parsePostsListingListener::onParsePostsListingFail); - } - }); - } - - public static LinkedHashSet parsePostsSync(String response, int nPosts, PostFilter postFilter, List readPostList) { + public static LinkedHashSet parsePostsSync(String response, int nPosts, PostFilter postFilter, List readPostList) { LinkedHashSet newPosts = new LinkedHashSet<>(); try { JSONObject jsonResponse = new JSONObject(response); @@ -87,7 +39,7 @@ public class ParsePost { size = nPosts; } - HashSet readPostHashSet = null; + HashSet readPostHashSet = null; if (readPostList != null) { readPostHashSet = new HashSet<>(readPostList); } @@ -96,7 +48,7 @@ public class ParsePost { if (allData.getJSONObject(i).getString(JSONUtils.KIND_KEY).equals("t3")) { JSONObject data = allData.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY); Post post = parseBasicData(data); - if (readPostHashSet != null && readPostHashSet.contains(ReadPost.convertPost(post))) { + if (readPostHashSet != null && readPostHashSet.contains(post.getId())) { post.markAsRead(false); } if (PostFilter.isPostAllowed(post, postFilter)) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostPagingSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostPagingSource.java index 38288785..fe19a962 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostPagingSource.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostPagingSource.java @@ -54,7 +54,7 @@ public class PostPagingSource extends ListenableFuturePagingSource private int postType; private SortType sortType; private PostFilter postFilter; - private List readPostList; + private List readPostList; private String userWhere; private String multiRedditPath; private LinkedHashSet postLinkedHashSet; @@ -62,7 +62,7 @@ public class PostPagingSource extends ListenableFuturePagingSource PostPagingSource(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, int postType, - SortType sortType, PostFilter postFilter, List readPostList) { + SortType sortType, PostFilter postFilter, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -79,7 +79,7 @@ public class PostPagingSource extends ListenableFuturePagingSource PostPagingSource(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String path, int postType, SortType sortType, PostFilter postFilter, - List readPostList) { + List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -117,7 +117,7 @@ public class PostPagingSource extends ListenableFuturePagingSource PostPagingSource(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String subredditOrUserName, int postType, SortType sortType, PostFilter postFilter, - String where, List readPostList) { + String where, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -136,7 +136,7 @@ public class PostPagingSource extends ListenableFuturePagingSource PostPagingSource(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String subredditOrUserName, String query, String trendingSource, int postType, - SortType sortType, PostFilter postFilter, List readPostList) { + SortType sortType, PostFilter postFilter, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java index ca574517..66505924 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/PostViewModel.java @@ -23,7 +23,6 @@ import java.util.concurrent.Executor; import ml.docilealligator.infinityforreddit.SortType; import ml.docilealligator.infinityforreddit.postfilter.PostFilter; -import ml.docilealligator.infinityforreddit.readpost.ReadPost; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import retrofit2.Retrofit; @@ -41,7 +40,7 @@ public class PostViewModel extends ViewModel { private SortType sortType; private PostFilter postFilter; private String userWhere; - private List readPostList; + private List readPostList; private MutableLiveData currentlyReadPostIdsLiveData = new MutableLiveData<>(); private LiveData> posts; @@ -54,7 +53,7 @@ public class PostViewModel extends ViewModel { public PostViewModel(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, @Nullable SharedPreferences postHistorySharedPreferences, int postType, - SortType sortType, PostFilter postFilter, List readPostList) { + SortType sortType, PostFilter postFilter, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -95,7 +94,7 @@ public class PostViewModel extends ViewModel { public PostViewModel(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, @Nullable SharedPreferences postHistorySharedPreferences, String subredditName, int postType, - SortType sortType, PostFilter postFilter, List readPostList) { + SortType sortType, PostFilter postFilter, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -139,7 +138,7 @@ public class PostViewModel extends ViewModel { SharedPreferences postFeedScrolledPositionSharedPreferences, @Nullable SharedPreferences postHistorySharedPreferences, String username, int postType, SortType sortType, PostFilter postFilter, String userWhere, - List readPostList) { + List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -183,7 +182,7 @@ public class PostViewModel extends ViewModel { SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, @Nullable SharedPreferences postHistorySharedPreferences, String subredditName, String query, String trendingSource, int postType, SortType sortType, PostFilter postFilter, - List readPostList) { + List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -290,12 +289,12 @@ public class PostViewModel extends ViewModel { private SortType sortType; private PostFilter postFilter; private String userWhere; - private List readPostList; + private List readPostList; public Factory(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, SharedPreferences postHistorySharedPreferences, int postType, SortType sortType, - PostFilter postFilter, List readPostList) { + PostFilter postFilter, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -312,7 +311,7 @@ public class PostViewModel extends ViewModel { public Factory(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, SharedPreferences postHistorySharedPreferences, String name, int postType, SortType sortType, - PostFilter postFilter, List readPostList) { + PostFilter postFilter, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -331,7 +330,7 @@ public class PostViewModel extends ViewModel { public Factory(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, SharedPreferences postHistorySharedPreferences, String username, int postType, - SortType sortType, PostFilter postFilter, String where, List readPostList) { + SortType sortType, PostFilter postFilter, String where, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; @@ -350,7 +349,7 @@ public class PostViewModel extends ViewModel { public Factory(Executor executor, Retrofit retrofit, String accessToken, String accountName, SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, SharedPreferences postHistorySharedPreferences, String name, String query, String trendingSource, - int postType, SortType sortType, PostFilter postFilter, List readPostList) { + int postType, SortType sortType, PostFilter postFilter, List readPostList) { this.executor = executor; this.retrofit = retrofit; this.accessToken = accessToken; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/readpost/ReadPost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/readpost/ReadPost.java index df704f3d..2a3da252 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/readpost/ReadPost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/readpost/ReadPost.java @@ -10,7 +10,6 @@ import androidx.room.Entity; import androidx.room.ForeignKey; import ml.docilealligator.infinityforreddit.account.Account; -import ml.docilealligator.infinityforreddit.post.Post; @Entity(tableName = "read_posts", primaryKeys = {"username", "id"}, foreignKeys = @ForeignKey(entity = Account.class, parentColumns = "username", @@ -23,10 +22,6 @@ public class ReadPost implements Parcelable { @ColumnInfo(name = "id") private String id; - public static ReadPost convertPost(Post post) { - return new ReadPost("temp", post.getId()); - } - public ReadPost(@NonNull String username, @NonNull String id) { this.username = username; this.id = id;