Use SharedPreferences to store post feed scrolled position instead of QNCache. Add an option to save the scrolled position.

This commit is contained in:
Alex Ning 2020-07-30 23:12:34 +08:00
parent bb598531b5
commit 61d3302a30
12 changed files with 234 additions and 152 deletions

View File

@ -95,7 +95,6 @@ dependencies {
implementation 'me.zhanghai.android.fastscroll:library:1.1.2'
implementation "com.thefuntasty.hauler:core:3.1.0"
implementation 'com.github.Piasy:BigImageViewer:1.6.5'
implementation 'com.fewlaps.quitnowcache:quitnow-cache:3.4.0'
def toroVersion = '3.7.0.2010003'
implementation "im.ene.toro3:toro:$toroVersion"

View File

@ -6,7 +6,6 @@ import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
import com.fewlaps.quitnowcache.QNCache;
import com.google.android.exoplayer2.database.ExoDatabaseProvider;
import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor;
import com.google.android.exoplayer2.upstream.cache.SimpleCache;
@ -24,8 +23,8 @@ import im.ene.toro.exoplayer.ExoCreator;
import im.ene.toro.exoplayer.MediaSourceBuilder;
import im.ene.toro.exoplayer.ToroExo;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.Utils.CustomThemeSharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.Utils.APIUtils;
import ml.docilealligator.infinityforreddit.Utils.CustomThemeSharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
@ -200,6 +199,12 @@ class AppModule {
return mApplication.getSharedPreferences(SharedPreferencesUtils.POST_LAYOUT_SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE);
}
@Provides
@Named("post_feed_scrolled_position_cache")
SharedPreferences providePostFeedScrolledPositionSharedPreferences() {
return mApplication.getSharedPreferences(SharedPreferencesUtils.POST_LAYOUT_SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE);
}
@Provides
@Singleton
CustomThemeWrapper provideCustomThemeWrapper(@Named("light_theme") SharedPreferences lightThemeSharedPreferences,
@ -217,10 +222,4 @@ class AppModule {
.build();
return ToroExo.with(mApplication).getCreator(config);
}
@Provides
@Singleton
QNCache<String> provideQNCache() {
return new QNCache.Builder().build();
}
}

View File

@ -0,0 +1,9 @@
package ml.docilealligator.infinityforreddit.Event;
public class ChangeSavePostFeedScrolledPositionEvent {
public boolean savePostFeedScrolledPosition;
public ChangeSavePostFeedScrolledPositionEvent(boolean savePostFeedScrolledPosition) {
this.savePostFeedScrolledPosition = savePostFeedScrolledPosition;
}
}

View File

@ -38,7 +38,6 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.fewlaps.quitnowcache.QNCache;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@ -67,6 +66,7 @@ import ml.docilealligator.infinityforreddit.Event.ChangeMuteAutoplayingVideosEve
import ml.docilealligator.infinityforreddit.Event.ChangeMuteNSFWVideoEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeNSFWBlurEvent;
import ml.docilealligator.infinityforreddit.Event.ChangePostLayoutEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeSavePostFeedScrolledPositionEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeShowAbsoluteNumberOfVotesEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeShowElapsedTimeEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeSpoilerBlurEvent;
@ -87,7 +87,6 @@ import ml.docilealligator.infinityforreddit.Post.PostViewModel;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.SortType;
import ml.docilealligator.infinityforreddit.Utils.CacheUtils;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.Utils.Utils;
import retrofit2.Retrofit;
@ -147,7 +146,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
@Inject
ExoCreator exoCreator;
@Inject
QNCache<String> cache;
@Named("post_feed_scrolled_position_cache")
SharedPreferences postFeedScrolledPositionSharedPreferences;
private RequestManager mGlide;
private AppCompatActivity activity;
private LinearLayoutManager mLinearLayoutManager;
@ -157,6 +157,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
private boolean isLazyModePaused = false;
private boolean hasPost = false;
private boolean isShown = false;
private boolean savePostFeedScrolledPosition;
private PostRecyclerViewAdapter mAdapter;
private RecyclerView.SmoothScroller smoothScroller;
private Window window;
@ -368,6 +369,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
accountName = getArguments().getString(EXTRA_ACCOUNT_NAME);
boolean nsfw = mSharedPreferences.getBoolean(SharedPreferencesUtils.NSFW_KEY, false);
int defaultPostLayout = Integer.parseInt(mSharedPreferences.getString(SharedPreferencesUtils.DEFAULT_POST_LAYOUT_KEY, "0"));
savePostFeedScrolledPosition = mSharedPreferences.getBoolean(SharedPreferencesUtils.SAVE_POST_FEED_SCROLLED_POSITION, true);
Locale locale = getResources().getConfiguration().locale;
if (postType == PostDataSource.TYPE_SEARCH) {
@ -407,12 +409,12 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if (accessToken == null) {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mRetrofit, null,
accountName, getResources().getConfiguration().locale, cache, subredditName, query, postType,
sortType, filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, subredditName, query, postType, sortType, filter, nsfw)).get(PostViewModel.class);
} else {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mOauthRetrofit, accessToken,
accountName, getResources().getConfiguration().locale, cache, subredditName, query, postType,
sortType, filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, subredditName, query, postType, sortType, filter, nsfw)).get(PostViewModel.class);
}
} else if (postType == PostDataSource.TYPE_SUBREDDIT) {
subredditName = getArguments().getString(EXTRA_NAME);
@ -475,12 +477,12 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if (accessToken == null) {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mRetrofit, accessToken,
accountName, getResources().getConfiguration().locale, cache, subredditName, postType, sortType,
filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, subredditName, postType, sortType, filter, nsfw)).get(PostViewModel.class);
} else {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mOauthRetrofit, accessToken,
accountName, getResources().getConfiguration().locale, cache, subredditName, postType, sortType,
filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, subredditName, postType, sortType, filter, nsfw)).get(PostViewModel.class);
}
} else if(postType == PostDataSource.TYPE_MULTI_REDDIT) {
multiRedditPath = getArguments().getString(EXTRA_NAME);
@ -529,12 +531,12 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if (accessToken == null) {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mRetrofit, null,
accountName, getResources().getConfiguration().locale, cache, multiRedditPath, postType, sortType,
filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, multiRedditPath, postType, sortType, filter, nsfw)).get(PostViewModel.class);
} else {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mOauthRetrofit, accessToken,
accountName, getResources().getConfiguration().locale, cache, multiRedditPath, postType, sortType,
filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, multiRedditPath, postType, sortType, filter, nsfw)).get(PostViewModel.class);
}
} else if (postType == PostDataSource.TYPE_USER) {
username = getArguments().getString(EXTRA_USER_NAME);
@ -582,12 +584,12 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if (accessToken == null) {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mRetrofit, accessToken,
accountName, getResources().getConfiguration().locale, cache, username, postType, sortType, where,
filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, username, postType, sortType, where, filter, nsfw)).get(PostViewModel.class);
} else {
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mOauthRetrofit, accessToken,
accountName, getResources().getConfiguration().locale, cache, username, postType, sortType, where,
filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences,
postFeedScrolledPositionSharedPreferences, username, postType, sortType, where, filter, nsfw)).get(PostViewModel.class);
}
} else {
String sort = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TYPE_BEST_POST, SortType.Type.BEST.name());
@ -625,7 +627,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
});
mPostViewModel = new ViewModelProvider(this, new PostViewModel.Factory(mOauthRetrofit, accessToken,
accountName, getResources().getConfiguration().locale, cache, postType, sortType, filter, nsfw)).get(PostViewModel.class);
accountName, getResources().getConfiguration().locale, mSharedPreferences, postFeedScrolledPositionSharedPreferences,
postType, sortType, filter, nsfw)).get(PostViewModel.class);
}
if (activity instanceof ActivityToolbarInterface) {
@ -714,29 +717,29 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}
private void saveCache() {
if (isShown && mAdapter != null) {
if (savePostFeedScrolledPosition && isShown && mAdapter != null) {
String key;
Post currentPost = mAdapter.getItemByPosition(maxPosition);
if (currentPost != null) {
String accountNameForCache = accountName == null ? CacheUtils.ANONYMOUS : accountName;
String accountNameForCache = accountName == null ? SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_ANONYMOUS : accountName;
String value = currentPost.getFullName();
switch (postType) {
case PostDataSource.TYPE_FRONT_PAGE:
key = accountNameForCache + CacheUtils.FRONT_PAGE_BASE;
key = accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_FRONT_PAGE_BASE;
break;
case PostDataSource.TYPE_SUBREDDIT:
key = accountNameForCache + CacheUtils.SUBREDDIT_BASE + subredditName;
key = accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_SUBREDDIT_BASE + subredditName;
break;
case PostDataSource.TYPE_USER:
key = accountNameForCache + CacheUtils.USER_BASE + username;
key = accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_USER_BASE + username;
break;
case PostDataSource.TYPE_MULTI_REDDIT:
key = accountNameForCache + CacheUtils.MULTI_REDDIT_BASE + multiRedditPath;
key = accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_MULTI_REDDIT_BASE + multiRedditPath;
break;
default:
return;
}
cache.set(key, value);
postFeedScrolledPositionSharedPreferences.edit().putString(key, value).apply();
}
}
}
@ -1042,6 +1045,11 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}
}
@Subscribe
public void onChangeSavePostFeedScrolledPositionEvent(ChangeSavePostFeedScrolledPositionEvent changeSavePostFeedScrolledPositionEvent) {
savePostFeedScrolledPosition = changeSavePostFeedScrolledPositionEvent.savePostFeedScrolledPosition;
}
private void refreshAdapter() {
int previousPosition = -1;
if (mLinearLayoutManager != null) {

View File

@ -1,11 +1,11 @@
package ml.docilealligator.infinityforreddit.Post;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import androidx.paging.PageKeyedDataSource;
import com.fewlaps.quitnowcache.QNCache;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
@ -15,7 +15,7 @@ import ml.docilealligator.infinityforreddit.API.RedditAPI;
import ml.docilealligator.infinityforreddit.NetworkState;
import ml.docilealligator.infinityforreddit.SortType;
import ml.docilealligator.infinityforreddit.Utils.APIUtils;
import ml.docilealligator.infinityforreddit.Utils.CacheUtils;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
@ -39,7 +39,8 @@ public class PostDataSource extends PageKeyedDataSource<String, Post> {
private String accessToken;
private String accountName;
private Locale locale;
private QNCache<String> cache;
private SharedPreferences sharedPreferences;
private SharedPreferences postFeedScrolledPositionSharedPreferences;
private String subredditOrUserName;
private String query;
private int postType;
@ -57,13 +58,15 @@ public class PostDataSource extends PageKeyedDataSource<String, Post> {
private LoadParams<String> params;
private LoadCallback<String, Post> callback;
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
int postType, SortType sortType, int filter, boolean nsfw) {
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, int postType,
SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
paginationNetworkStateLiveData = new MutableLiveData<>();
initialLoadStateLiveData = new MutableLiveData<>();
hasPostLiveData = new MutableLiveData<>();
@ -74,13 +77,15 @@ public class PostDataSource extends PageKeyedDataSource<String, Post> {
postLinkedHashSet = new LinkedHashSet<>();
}
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String path, int postType, SortType sortType, int filter, boolean nsfw) {
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String path, int postType,
SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
if (postType == TYPE_SUBREDDIT) {
this.subredditOrUserName = path;
} else {
@ -112,14 +117,15 @@ public class PostDataSource extends PageKeyedDataSource<String, Post> {
postLinkedHashSet = new LinkedHashSet<>();
}
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditOrUserName, int postType, SortType sortType, String where, int filter,
boolean nsfw) {
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String subredditOrUserName,
int postType, SortType sortType, String where, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditOrUserName = subredditOrUserName;
paginationNetworkStateLiveData = new MutableLiveData<>();
initialLoadStateLiveData = new MutableLiveData<>();
@ -132,14 +138,15 @@ public class PostDataSource extends PageKeyedDataSource<String, Post> {
postLinkedHashSet = new LinkedHashSet<>();
}
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditOrUserName, String query, int postType, SortType sortType, int filter,
boolean nsfw) {
PostDataSource(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String subredditOrUserName,
String query, int postType, SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditOrUserName = subredditOrUserName;
this.query = query;
paginationNetworkStateLiveData = new MutableLiveData<>();
@ -168,22 +175,39 @@ public class PostDataSource extends PageKeyedDataSource<String, Post> {
public void loadInitial(@NonNull LoadInitialParams<String> params, @NonNull final LoadInitialCallback<String, Post> callback) {
initialLoadStateLiveData.postValue(NetworkState.LOADING);
String accountNameForCache = accountName == null ? CacheUtils.ANONYMOUS : accountName;
boolean savePostFeedScrolledPosition = sharedPreferences.getBoolean(SharedPreferencesUtils.SAVE_POST_FEED_SCROLLED_POSITION, true);
String accountNameForCache = accountName == null ? SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_ANONYMOUS : accountName;
switch (postType) {
case TYPE_FRONT_PAGE:
loadBestPostsInitial(callback, cache.get(accountNameForCache + CacheUtils.FRONT_PAGE_BASE));
if (savePostFeedScrolledPosition) {
loadBestPostsInitial(callback, postFeedScrolledPositionSharedPreferences.getString(accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_FRONT_PAGE_BASE, null));
} else {
loadBestPostsInitial(callback, null);
}
break;
case TYPE_SUBREDDIT:
loadSubredditPostsInitial(callback, cache.get(accountNameForCache + CacheUtils.SUBREDDIT_BASE + subredditOrUserName));
if (savePostFeedScrolledPosition) {
loadSubredditPostsInitial(callback, postFeedScrolledPositionSharedPreferences.getString(accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_SUBREDDIT_BASE + subredditOrUserName, null));
} else {
loadSubredditPostsInitial(callback, null);
}
break;
case TYPE_USER:
loadUserPostsInitial(callback, cache.get(accountNameForCache + CacheUtils.USER_BASE + subredditOrUserName));
if (savePostFeedScrolledPosition) {
loadUserPostsInitial(callback, postFeedScrolledPositionSharedPreferences.getString(accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_USER_BASE + subredditOrUserName, null));
} else {
loadUserPostsInitial(callback, null);
}
break;
case TYPE_SEARCH:
loadSearchPostsInitial(callback, null);
break;
case TYPE_MULTI_REDDIT:
loadMultiRedditPostsInitial(callback, cache.get(accountNameForCache + CacheUtils.MULTI_REDDIT_BASE + multiRedditPath));
if (savePostFeedScrolledPosition) {
loadMultiRedditPostsInitial(callback, postFeedScrolledPositionSharedPreferences.getString(accountNameForCache + SharedPreferencesUtils.POST_FEED_SCROLLED_POSITION_MULTI_REDDIT_BASE + multiRedditPath, null));
} else {
loadMultiRedditPostsInitial(callback, null);
}
break;
}
}

View File

@ -1,11 +1,11 @@
package ml.docilealligator.infinityforreddit.Post;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import androidx.paging.DataSource;
import com.fewlaps.quitnowcache.QNCache;
import java.util.Locale;
import ml.docilealligator.infinityforreddit.SortType;
@ -16,7 +16,8 @@ class PostDataSourceFactory extends DataSource.Factory {
private String accessToken;
private String accountName;
private Locale locale;
private QNCache<String> cache;
private SharedPreferences sharedPreferences;
private SharedPreferences postFeedScrolledPositionSharedPreferences;
private String subredditName;
private String query;
private int postType;
@ -28,13 +29,15 @@ class PostDataSourceFactory extends DataSource.Factory {
private PostDataSource postDataSource;
private MutableLiveData<PostDataSource> postDataSourceLiveData;
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
int postType, SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
this.sortType = sortType;
@ -42,13 +45,15 @@ class PostDataSourceFactory extends DataSource.Factory {
this.nsfw = nsfw;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
String subredditName, int postType, SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditName = subredditName;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
@ -57,14 +62,16 @@ class PostDataSourceFactory extends DataSource.Factory {
this.nsfw = nsfw;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
String subredditName, int postType, SortType sortType, String where, int filter,
boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditName = subredditName;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
@ -74,14 +81,16 @@ class PostDataSourceFactory extends DataSource.Factory {
this.nsfw = nsfw;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
PostDataSourceFactory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
String subredditName, String query, int postType, SortType sortType, int filter,
boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditName = subredditName;
this.query = query;
postDataSourceLiveData = new MutableLiveData<>();
@ -95,17 +104,17 @@ class PostDataSourceFactory extends DataSource.Factory {
@Override
public DataSource<String, Post> create() {
if (postType == PostDataSource.TYPE_FRONT_PAGE) {
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale, cache,
postType, sortType, filter, nsfw);
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale,
sharedPreferences, postFeedScrolledPositionSharedPreferences, postType, sortType, filter, nsfw);
} else if (postType == PostDataSource.TYPE_SEARCH) {
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale, cache,
subredditName, query, postType, sortType, filter, nsfw);
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale,
sharedPreferences, postFeedScrolledPositionSharedPreferences, subredditName, query, postType, sortType, filter, nsfw);
} else if (postType == PostDataSource.TYPE_SUBREDDIT || postType == PostDataSource.TYPE_MULTI_REDDIT) {
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale, cache,
subredditName, postType, sortType, filter, nsfw);
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale,
sharedPreferences, postFeedScrolledPositionSharedPreferences, subredditName, postType, sortType, filter, nsfw);
} else {
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale, cache,
subredditName, postType, sortType, userWhere, filter, nsfw);
postDataSource = new PostDataSource(retrofit, accessToken, accountName, locale,
sharedPreferences, postFeedScrolledPositionSharedPreferences, subredditName, postType, sortType, userWhere, filter, nsfw);
}
postDataSourceLiveData.postValue(postDataSource);

View File

@ -1,5 +1,7 @@
package ml.docilealligator.infinityforreddit.Post;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.core.util.Pair;
import androidx.lifecycle.LiveData;
@ -11,8 +13,6 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.paging.LivePagedListBuilder;
import androidx.paging.PagedList;
import com.fewlaps.quitnowcache.QNCache;
import java.util.Locale;
import ml.docilealligator.infinityforreddit.NetworkState;
@ -29,10 +29,43 @@ public class PostViewModel extends ViewModel {
private MutableLiveData<SortType> sortTypeLiveData;
private NSFWAndSortTypeLiveData nsfwAndSortTypeLiveData;
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences cache, int postType,
SortType sortType, int filter, boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale,
sharedPreferences, cache, postType, sortType, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
paginationNetworkState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getPaginationNetworkStateLiveData);
hasPostLiveData = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::hasPostLiveData);
nsfwLiveData = new MutableLiveData<>();
nsfwLiveData.postValue(nsfw);
sortTypeLiveData = new MutableLiveData<>();
sortTypeLiveData.postValue(sortType);
nsfwAndSortTypeLiveData = new NSFWAndSortTypeLiveData(nsfwLiveData, sortTypeLiveData);
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder())
.setEnablePlaceholders(false)
.setPageSize(25)
.build();
posts = Transformations.switchMap(nsfwAndSortTypeLiveData, nsfwAndSort -> {
postDataSourceFactory.changeNSFWAndSortType(nsfwLiveData.getValue(), sortTypeLiveData.getValue());
return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
});
}
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences cache, String subredditName,
int postType, SortType sortType, int filter, boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale, cache,
postType, sortType, filter, nsfw);
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale,
sharedPreferences, cache, subredditName, postType, sortType, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
@ -60,42 +93,12 @@ public class PostViewModel extends ViewModel {
});
}
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditName, int postType, SortType sortType, int filter, boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale, cache,
subredditName, postType, sortType, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
paginationNetworkState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getPaginationNetworkStateLiveData);
hasPostLiveData = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::hasPostLiveData);
nsfwLiveData = new MutableLiveData<>();
nsfwLiveData.postValue(nsfw);
sortTypeLiveData = new MutableLiveData<>();
sortTypeLiveData.postValue(sortType);
nsfwAndSortTypeLiveData = new NSFWAndSortTypeLiveData(nsfwLiveData, sortTypeLiveData);
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder())
.setEnablePlaceholders(false)
.setPageSize(25)
.build();
posts = Transformations.switchMap(nsfwAndSortTypeLiveData, nsfwAndSort -> {
postDataSourceFactory.changeNSFWAndSortType(nsfwLiveData.getValue(), sortTypeLiveData.getValue());
return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
});
}
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditName, int postType, SortType sortType, String where, int filter,
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences cache, String subredditName,
int postType, SortType sortType, String where, int filter,
boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale, cache,
subredditName, postType, sortType, where, filter, nsfw);
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale,
sharedPreferences, cache, subredditName, postType, sortType, where, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
@ -123,11 +126,12 @@ public class PostViewModel extends ViewModel {
});
}
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditName, String query, int postType, SortType sortType, int filter,
public PostViewModel(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences cache, String subredditName,
String query, int postType, SortType sortType, int filter,
boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale, cache,
subredditName, query, postType, sortType, filter, nsfw);
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, accountName, locale,
sharedPreferences, cache, subredditName, query, postType, sortType, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
@ -192,7 +196,8 @@ public class PostViewModel extends ViewModel {
private String accessToken;
private String accountName;
private Locale locale;
private QNCache<String> cache;
private SharedPreferences sharedPreferences;
private SharedPreferences postFeedScrolledPositionSharedPreferences;
private String subredditName;
private String query;
private int postType;
@ -201,26 +206,30 @@ public class PostViewModel extends ViewModel {
private int filter;
private boolean nsfw;
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
int postType, SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditName, int postType, SortType sortType, int filter, boolean nsfw) {
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String subredditName,
int postType, SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditName = subredditName;
this.postType = postType;
this.sortType = sortType;
@ -229,14 +238,16 @@ public class PostViewModel extends ViewModel {
}
//User posts
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditName, int postType, SortType sortType, String where, int filter,
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String subredditName,
int postType, SortType sortType, String where, int filter,
boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditName = subredditName;
this.postType = postType;
this.sortType = sortType;
@ -245,14 +256,15 @@ public class PostViewModel extends ViewModel {
this.nsfw = nsfw;
}
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale, QNCache<String> cache,
String subredditName, String query, int postType, SortType sortType, int filter,
boolean nsfw) {
public Factory(Retrofit retrofit, String accessToken, String accountName, Locale locale,
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences, String subredditName,
String query, int postType, SortType sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.accountName = accountName;
this.locale = locale;
this.cache = cache;
this.sharedPreferences = sharedPreferences;
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
this.subredditName = subredditName;
this.query = query;
this.postType = postType;
@ -265,17 +277,17 @@ public class PostViewModel extends ViewModel {
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (postType == PostDataSource.TYPE_FRONT_PAGE) {
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, cache, postType,
sortType, filter, nsfw);
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, sharedPreferences,
postFeedScrolledPositionSharedPreferences, postType, sortType, filter, nsfw);
} else if (postType == PostDataSource.TYPE_SEARCH) {
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, cache, subredditName,
query, postType, sortType, filter, nsfw);
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, sharedPreferences,
postFeedScrolledPositionSharedPreferences, subredditName, query, postType, sortType, filter, nsfw);
} else if (postType == PostDataSource.TYPE_SUBREDDIT || postType == PostDataSource.TYPE_MULTI_REDDIT) {
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, cache, subredditName,
postType, sortType, filter, nsfw);
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, sharedPreferences,
postFeedScrolledPositionSharedPreferences, subredditName, postType, sortType, filter, nsfw);
} else {
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, cache, subredditName,
postType, sortType, userWhere, filter, nsfw);
return (T) new PostViewModel(retrofit, accessToken, accountName, locale, sharedPreferences,
postFeedScrolledPositionSharedPreferences, subredditName, postType, sortType, userWhere, filter, nsfw);
}
}
}

View File

@ -17,6 +17,7 @@ import javax.inject.Named;
import ml.docilealligator.infinityforreddit.Event.ChangeNSFWBlurEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeNSFWEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeSavePostFeedScrolledPositionEvent;
import ml.docilealligator.infinityforreddit.Event.ChangeSpoilerBlurEvent;
import ml.docilealligator.infinityforreddit.Event.RecreateActivityEvent;
import ml.docilealligator.infinityforreddit.Infinity;
@ -28,6 +29,9 @@ public class MainPreferenceFragment extends PreferenceFragmentCompat {
@Inject
@Named("default")
SharedPreferences sharedPreferences;
@Inject
@Named("post_feed_scrolled_position_cache")
SharedPreferences cache;
private Activity activity;
@Override
@ -35,11 +39,22 @@ public class MainPreferenceFragment extends PreferenceFragmentCompat {
setPreferencesFromResource(R.xml.main_preferences, rootKey);
((Infinity) activity.getApplication()).getAppComponent().inject(this);
SwitchPreference savePostFeedScrolledPositionSwitch = findPreference(SharedPreferencesUtils.SAVE_POST_FEED_SCROLLED_POSITION);
SwitchPreference confirmToExitSwitch = findPreference(SharedPreferencesUtils.CONFIRM_TO_EXIT);
SwitchPreference nsfwSwitch = findPreference(SharedPreferencesUtils.NSFW_KEY);
SwitchPreference blurNSFWSwitch = findPreference(SharedPreferencesUtils.BLUR_NSFW_KEY);
SwitchPreference blurSpoilerSwitch = findPreference(SharedPreferencesUtils.BLUR_SPOILER_KEY);
if (savePostFeedScrolledPositionSwitch != null) {
savePostFeedScrolledPositionSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
if (!(Boolean) newValue) {
cache.edit().clear().apply();
}
EventBus.getDefault().post(new ChangeSavePostFeedScrolledPositionEvent((Boolean) newValue));
return true;
});
}
if (confirmToExitSwitch != null) {
confirmToExitSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new RecreateActivityEvent());

View File

@ -1,9 +0,0 @@
package ml.docilealligator.infinityforreddit.Utils;
public class CacheUtils {
public static final String FRONT_PAGE_BASE = "_front_page";
public static final String SUBREDDIT_BASE = "_subreddit_";
public static final String USER_BASE = "_user_";
public static final String MULTI_REDDIT_BASE = "_multireddit_";
public static final String ANONYMOUS = ".anonymous";
}

View File

@ -73,6 +73,13 @@ public class SharedPreferencesUtils {
public static final int POST_LAYOUT_CARD = 0;
public static final int POST_LAYOUT_COMPACT = 1;
public static final String POST_FEED_SCROLLED_POSITION_SHARED_PREFERENCES_FILE = "ml.docilealligator.infinityforreddit.post_feed_scrolled_position";
public static final String POST_FEED_SCROLLED_POSITION_FRONT_PAGE_BASE = "_front_page";
public static final String POST_FEED_SCROLLED_POSITION_SUBREDDIT_BASE = "_subreddit_";
public static final String POST_FEED_SCROLLED_POSITION_USER_BASE = "_user_";
public static final String POST_FEED_SCROLLED_POSITION_MULTI_REDDIT_BASE = "_multireddit_";
public static final String POST_FEED_SCROLLED_POSITION_ANONYMOUS = ".anonymous";
public static final String PULL_NOTIFICATION_TIME = "pull_notification_time";
public static final String SHOW_ELAPSED_TIME_KEY = "show_elapsed_time";
public static final String TIME_FORMAT_KEY = "time_format";
@ -132,4 +139,5 @@ public class SharedPreferencesUtils {
public static final String START_AUTOPLAY_VISIBLE_AREA_OFFSET_LANDSCAPE = "start_autoplay_visible_area_offset_landscape";
public static final String MUTE_NSFW_VIDEO = "mute_nsfw_video";
public static final String VIDEO_PLAYER_IGNORE_NAV_BAR = "video_player_ignore_nav_bar";
public static final String SAVE_POST_FEED_SCROLLED_POSITION = "save_post_feed_scrolled_position";
}

View File

@ -348,6 +348,8 @@
<string name="settings_amoled_dark_title">Amoled Dark</string>
<string name="settings_interface_title">Interface</string>
<string name="settings_gestures_and_buttons_title">Gestures &amp; Buttons</string>
<string name="settings_save_post_feed_scrolled_position_title">Save Scrolled Position in Post Feed</string>
<string name="settings_save_post_feed_scrolled_position_summary">Browse new posts after refreshing</string>
<string name="settings_open_link_in_app_title">Open Link In App</string>
<string name="settigns_video_title">Video</string>
<string name="settings_video_autoplay_title">Video Autoplay</string>

View File

@ -36,6 +36,12 @@
app:title="@string/settings_lazy_mode_interval_title"
app:useSimpleSummaryProvider="true" />
<SwitchPreference
app:defaultValue="true"
app:key="save_post_feed_scrolled_position"
app:title="@string/settings_save_post_feed_scrolled_position_title"
app:summary="@string/settings_save_post_feed_scrolled_position_summary" />
<SwitchPreference
app:defaultValue="false"
app:icon="@drawable/ic_link"