Enabling or disabling nsfw are now available.

This commit is contained in:
Alex Ning 2019-08-22 09:45:27 +08:00
parent 9bad5024ff
commit a2fe95912b
32 changed files with 498 additions and 171 deletions

View File

@ -4,8 +4,13 @@ package Settings;
import android.os.Bundle;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;
import org.greenrobot.eventbus.EventBus;
import ml.docilealligator.infinityforreddit.ChangeNSFWEvent;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.SharedPreferencesUtils;
/**
* A simple {@link PreferenceFragmentCompat} subclass.
@ -14,5 +19,13 @@ public class MainPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.main_preferences, rootKey);
SwitchPreference nsfwSwitch = findPreference(SharedPreferencesUtils.NSFW_KEY);
if(nsfwSwitch != null) {
nsfwSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
EventBus.getDefault().post(new ChangeNSFWEvent((Boolean) newValue));
return true;
});
}
}
}

View File

@ -1,20 +1,141 @@
package Settings;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;
import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkInfo;
import androidx.work.WorkManager;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.PullNotificationWorker;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.SharedPreferencesUtils;
/**
* A simple {@link Fragment} subclass.
*/
public class NotificationPreferenceFragment extends PreferenceFragmentCompat {
private boolean enableNotification;
private long notificationInterval;
private WorkManager workManager;
@Inject
SharedPreferences sharedPreferences;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.notification_preferences, rootKey);
Activity activity = getActivity();
if(activity != null) {
workManager = WorkManager.getInstance(activity);
((Infinity) activity.getApplication()).getAppComponent().inject(this);
SwitchPreference enableNotificationSwitchPreference = findPreference(SharedPreferencesUtils.ENABLE_NOTIFICATION_KEY);
ListPreference notificationIntervalListPreference = findPreference(SharedPreferencesUtils.NOTIFICATION_INTERVAL_KEY);
enableNotification = sharedPreferences.getBoolean(SharedPreferencesUtils.ENABLE_NOTIFICATION_KEY, true);
notificationInterval = Long.parseLong(sharedPreferences.getString(SharedPreferencesUtils.NOTIFICATION_INTERVAL_KEY, "1"));
if(enableNotification) {
if (notificationIntervalListPreference != null) {
notificationIntervalListPreference.setVisible(true);
}
}
if(enableNotificationSwitchPreference != null) {
enableNotificationSwitchPreference.setOnPreferenceChangeListener((preference, newValue) -> {
enableNotification = ((Boolean) newValue);
if(notificationIntervalListPreference != null) {
notificationIntervalListPreference.setVisible(enableNotification);
}
if(enableNotification) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest pullNotificationRequest =
new PeriodicWorkRequest.Builder(PullNotificationWorker.class,
notificationInterval, TimeUnit.HOURS)
.setConstraints(constraints)
.build();
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else {
ListenableFuture<List<WorkInfo>> workInfo = workManager.getWorkInfosByTag(PullNotificationWorker.WORKER_TAG);
try {
List<WorkInfo> list = workInfo.get();
if(list != null && list.size() != 0) {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
return true;
});
}
if(notificationIntervalListPreference != null) {
notificationIntervalListPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
notificationInterval = (Long) newValue;
if(enableNotification) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest pullNotificationRequest =
new PeriodicWorkRequest.Builder(PullNotificationWorker.class,
notificationInterval, TimeUnit.HOURS)
.setConstraints(constraints)
.build();
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else {
ListenableFuture<List<WorkInfo>> workInfo = workManager.getWorkInfosByTag(PullNotificationWorker.WORKER_TAG);
try {
List<WorkInfo> list = workInfo.get();
if(list != null && list.size() != 0) {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
return true;
}
});
}
}
}
}

View File

@ -255,4 +255,9 @@ public class AccountPostsActivity extends AppCompatActivity implements UserThing
public void onAccountSwitchEvent(SwitchAccountEvent event) {
finish();
}
@Subscribe
public void onChangeNSFWEvent(ChangeNSFWEvent changeNSFWEvent) {
((FragmentCommunicator) mFragment).changeNSFW(changeNSFWEvent.nsfw);
}
}

View File

@ -2,11 +2,12 @@ package ml.docilealligator.infinityforreddit;
import javax.inject.Singleton;
import Settings.NotificationPreferenceFragment;
import dagger.Component;
@Singleton
@Component(modules = AppModule.class)
interface AppComponent {
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(LoginActivity loginActivity);
void inject(PostFragment postFragment);
@ -36,4 +37,5 @@ interface AppComponent {
void inject(AccountPostsActivity accountPostsActivity);
void inject(PullNotificationWorker pullNotificationWorker);
void inject(ViewMessageActivity viewMessageActivity);
void inject(NotificationPreferenceFragment notificationPreferenceFragment);
}

View File

@ -1,6 +1,9 @@
package ml.docilealligator.infinityforreddit;
import android.app.Application;
import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
import javax.inject.Named;
import javax.inject.Singleton;
@ -78,4 +81,10 @@ class AppModule {
RedditDataRoomDatabase provideRedditDataRoomDatabase() {
return RedditDataRoomDatabase.getDatabase(mApplication);
}
@Provides
@Singleton
SharedPreferences provideSharedPreferences() {
return PreferenceManager.getDefaultSharedPreferences(mApplication);
}
}

View File

@ -0,0 +1,8 @@
package ml.docilealligator.infinityforreddit;
public class ChangeNSFWEvent {
boolean nsfw;
public ChangeNSFWEvent(boolean nsfw) {
this.nsfw = nsfw;
}
}

View File

@ -51,16 +51,18 @@ class FetchSubredditData {
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call failed", t.getMessage());
Log.i("call failed", "message " + t.getMessage());
fetchSubredditDataListener.onFetchSubredditDataFail();
}
});
}
static void fetchSubredditListingData(Retrofit retrofit, String query, String after, String sortType, final FetchSubredditListingDataListener fetchSubredditListingDataListener) {
static void fetchSubredditListingData(Retrofit retrofit, String query, String after, String sortType,
boolean nsfw,
final FetchSubredditListingDataListener fetchSubredditListingDataListener) {
RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> subredditDataCall = api.searchSubreddits(query, after, sortType);
Call<String> subredditDataCall = api.searchSubreddits(query, after, sortType, nsfw);
subredditDataCall.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
@ -85,7 +87,7 @@ class FetchSubredditData {
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call failed", t.getMessage());
Log.i("call failed", "message " + t.getMessage());
fetchSubredditListingDataListener.onFetchSubredditListingDataFail();
}
});

View File

@ -49,17 +49,18 @@ public class FetchUserData {
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call failed", t.getMessage());
Log.i("call failed", "message " + t.getMessage());
fetchUserDataListener.onFetchUserDataFailed();
}
});
}
public static void fetchUserListingData(Retrofit retrofit, String query, String after, String sortType,
boolean nsfw,
FetchUserListingDataListener fetchUserListingDataListener) {
RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> userInfo = api.searchUsers(query, after, sortType);
Call<String> userInfo = api.searchUsers(query, after, sortType, nsfw);
userInfo.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
@ -83,7 +84,7 @@ public class FetchUserData {
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call failed", t.getMessage());
Log.i("call failed", "message " + t.getMessage());
fetchUserListingDataListener.onFetchUserListingDataFailed();
}
});

View File

@ -2,6 +2,7 @@ package ml.docilealligator.infinityforreddit;
interface FragmentCommunicator {
void refresh();
default void changeNSFW(boolean nsfw) {};
default void startLazyMode() {}
default void stopLazyMode() {}
default void resumeLazyMode(boolean resumeNow) {}
@ -9,4 +10,5 @@ interface FragmentCommunicator {
default boolean isInLazyMode() {
return false;
}
}

View File

@ -2,6 +2,7 @@ package ml.docilealligator.infinityforreddit;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
@ -36,6 +37,7 @@ import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkInfo;
import androidx.work.WorkManager;
import com.bumptech.glide.Glide;
@ -45,10 +47,13 @@ import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import com.google.common.util.concurrent.ListenableFuture;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
@ -145,6 +150,9 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
@Inject
RedditDataRoomDatabase mRedditDataRoomDatabase;
@Inject
SharedPreferences mSharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -255,6 +263,11 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
private void getCurrentAccountAndBindView() {
new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> {
boolean enableNotification = mSharedPreferences.getBoolean(SharedPreferencesUtils.ENABLE_NOTIFICATION_KEY, true);
String notificationInterval = mSharedPreferences.getString(SharedPreferencesUtils.NOTIFICATION_INTERVAL_KEY, "1");
WorkManager workManager = WorkManager.getInstance(this);
if(mNewAccountName != null) {
if(account == null || !account.getUsername().equals(mNewAccountName)) {
new SwitchAccountAsyncTask(mRedditDataRoomDatabase, mNewAccountName, newAccount -> {
@ -270,18 +283,31 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
mProfileImageUrl = newAccount.getProfileImageUrl();
mBannerImageUrl = newAccount.getBannerImageUrl();
mKarma = newAccount.getKarma();
}
if(enableNotification) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest pullNotificationRequest =
new PeriodicWorkRequest.Builder(PullNotificationWorker.class, 1, TimeUnit.HOURS)
new PeriodicWorkRequest.Builder(PullNotificationWorker.class,
Long.parseLong(notificationInterval), TimeUnit.HOURS)
.setConstraints(constraints)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else {
ListenableFuture<List<WorkInfo>> workInfo = workManager.getWorkInfosByTag(PullNotificationWorker.WORKER_TAG);
try {
List<WorkInfo> list = workInfo.get();
if(list != null && list.size() != 0) {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
bindView();
@ -293,17 +319,30 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
mBannerImageUrl = account.getBannerImageUrl();
mKarma = account.getKarma();
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
if(enableNotification) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest pullNotificationRequest =
new PeriodicWorkRequest.Builder(PullNotificationWorker.class, 1, TimeUnit.HOURS)
.setConstraints(constraints)
.build();
PeriodicWorkRequest pullNotificationRequest =
new PeriodicWorkRequest.Builder(PullNotificationWorker.class,
Long.parseLong(notificationInterval), TimeUnit.HOURS)
.setConstraints(constraints)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else {
ListenableFuture<List<WorkInfo>> workInfo = workManager.getWorkInfosByTag(PullNotificationWorker.WORKER_TAG);
try {
List<WorkInfo> list = workInfo.get();
if(list != null && list.size() != 0) {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
bindView();
}
@ -316,18 +355,31 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
mProfileImageUrl = account.getProfileImageUrl();
mBannerImageUrl = account.getBannerImageUrl();
mKarma = account.getKarma();
}
if(enableNotification) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest pullNotificationRequest =
new PeriodicWorkRequest.Builder(PullNotificationWorker.class, 1, TimeUnit.HOURS)
new PeriodicWorkRequest.Builder(PullNotificationWorker.class,
Long.parseLong(notificationInterval), TimeUnit.HOURS)
.setConstraints(constraints)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else {
ListenableFuture<List<WorkInfo>> workInfo = workManager.getWorkInfosByTag(PullNotificationWorker.WORKER_TAG);
try {
List<WorkInfo> list = workInfo.get();
if(list != null && list.size() != 0) {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
bindView();
@ -748,6 +800,11 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
}
}
@Subscribe
public void onChangeNSFWEvent(ChangeNSFWEvent changeNSFWEvent) {
sectionsPagerAdapter.changeNSFW(changeNSFWEvent.nsfw);
}
private class SectionsPagerAdapter extends FragmentPagerAdapter {
private PostFragment frontPagePostFragment;
private PostFragment popularPostFragment;
@ -993,5 +1050,17 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
}
}
}
public void changeNSFW(boolean nsfw) {
if(frontPagePostFragment != null) {
frontPagePostFragment.changeNSFW(nsfw);
}
if(popularPostFragment != null) {
popularPostFragment.changeNSFW(nsfw);
}
if(allPostFragment != null) {
allPostFragment.changeNSFW(nsfw);
}
}
}
}

View File

@ -28,12 +28,13 @@ class ParsePost {
void onParsePostFail();
}
static void parsePosts(String response, Locale locale, int nPosts, int filter, ParsePostsListingListener parsePostsListingListener) {
new ParsePostDataAsyncTask(response, locale, nPosts, filter, parsePostsListingListener).execute();
static void parsePosts(String response, Locale locale, int nPosts, int filter, boolean nsfw,
ParsePostsListingListener parsePostsListingListener) {
new ParsePostDataAsyncTask(response, locale, nPosts, filter, nsfw, parsePostsListingListener).execute();
}
static void parsePost(String response, Locale locale, ParsePostListener parsePostListener) {
new ParsePostDataAsyncTask(response, locale, parsePostListener).execute();
new ParsePostDataAsyncTask(response, locale, true, parsePostListener).execute();
}
private static class ParsePostDataAsyncTask extends AsyncTask<Void, Void, Void> {
@ -41,6 +42,7 @@ class ParsePost {
private Locale locale;
private int nPosts;
private int filter;
private boolean nsfw;
private ParsePostsListingListener parsePostsListingListener;
private ParsePostListener parsePostListener;
private ArrayList<Post> newPosts;
@ -48,7 +50,7 @@ class ParsePost {
private String lastItem;
private boolean parseFailed;
ParsePostDataAsyncTask(String response, Locale locale, int nPosts, int filter,
ParsePostDataAsyncTask(String response, Locale locale, int nPosts, int filter, boolean nsfw,
ParsePostsListingListener parsePostsListingListener) {
this.parsePostsListingListener = parsePostsListingListener;
try {
@ -58,6 +60,7 @@ class ParsePost {
this.locale = locale;
this.nPosts = nPosts;
this.filter = filter;
this.nsfw = nsfw;
newPosts = new ArrayList<>();
parseFailed = false;
} catch (JSONException e) {
@ -66,12 +69,13 @@ class ParsePost {
}
}
ParsePostDataAsyncTask(String response, Locale locale,
ParsePostDataAsyncTask(String response, Locale locale, boolean nsfw,
ParsePostListener parsePostListener) {
this.parsePostListener = parsePostListener;
try {
allData = new JSONArray(response).getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
this.locale = locale;
this.nsfw = nsfw;
parseFailed = false;
} catch (JSONException e) {
e.printStackTrace();
@ -112,12 +116,14 @@ class ParsePost {
try {
JSONObject data = allData.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
Post post = parseBasicData(data, locale, i);
if (filter == PostFragment.EXTRA_NO_FILTER) {
newPosts.add(post);
} else if (filter == post.getPostType()) {
newPosts.add(post);
} else if (filter == Post.LINK_TYPE && post.getPostType() == Post.NO_PREVIEW_LINK_TYPE) {
newPosts.add(post);
if(!(!nsfw && post.isNSFW())) {
if (filter == PostFragment.EXTRA_NO_FILTER) {
newPosts.add(post);
} else if (filter == post.getPostType()) {
newPosts.add(post);
} else if (filter == Post.LINK_TYPE && post.getPostType() == Post.NO_PREVIEW_LINK_TYPE) {
newPosts.add(post);
}
}
} catch (JSONException e) {
Log.e("parsing post error", "message: " + e.getMessage());

View File

@ -44,6 +44,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private String query;
private int postType;
private String sortType;
private boolean nsfw;
private int filter;
private String userWhere;
@ -57,7 +58,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private LoadCallback<String, Post> callback;
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
int filter) {
int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -67,10 +68,11 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, int postType,
String sortType, int filter) {
String sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -81,10 +83,11 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, int postType,
String sortType, String where, int filter) {
String sortType, String where, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -96,10 +99,11 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
this.sortType = sortType;
userWhere = where;
this.filter = filter;
this.nsfw = nsfw;
}
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, String query,
int postType, String sortType, int filter) {
int postType, String sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -111,6 +115,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
MutableLiveData<NetworkState> getPaginationNetworkStateLiveData() {
@ -206,7 +211,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
}
});
} else {
ParsePost.parsePosts(response.body(), locale, -1, filter,
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
@ -261,7 +266,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
@ -323,7 +329,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
}
});
} else {
ParsePost.parsePosts(response.body(), locale, -1, filter,
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
@ -384,7 +390,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
@ -429,7 +436,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, filter,
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
@ -489,7 +496,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
@ -526,16 +534,16 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
if(subredditOrUserName == null) {
if(accessToken == null) {
getPost = api.searchPosts(query, lastItem, sortType);
getPost = api.searchPosts(query, lastItem, sortType, nsfw);
} else {
getPost = api.searchPostsOauth(query, lastItem, sortType, RedditUtils.getOAuthHeader(accessToken));
getPost = api.searchPostsOauth(query, lastItem, sortType, nsfw, RedditUtils.getOAuthHeader(accessToken));
}
} else {
if(accessToken == null) {
getPost = api.searchPostsInSpecificSubreddit(subredditOrUserName, query, lastItem);
getPost = api.searchPostsInSpecificSubreddit(subredditOrUserName, query, lastItem, nsfw);
} else {
getPost = api.searchPostsInSpecificSubredditOauth(subredditOrUserName, query, lastItem,
RedditUtils.getOAuthHeader(accessToken));
nsfw, RedditUtils.getOAuthHeader(accessToken));
}
}
@ -543,7 +551,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, filter,
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
@ -595,15 +603,16 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
if(subredditOrUserName == null) {
if(accessToken == null) {
getPost = api.searchPosts(query, after, sortType);
getPost = api.searchPosts(query, after, sortType, nsfw);
} else {
getPost = api.searchPostsOauth(query, after, sortType, RedditUtils.getOAuthHeader(accessToken));
getPost = api.searchPostsOauth(query, after, sortType, nsfw, RedditUtils.getOAuthHeader(accessToken));
}
} else {
if(accessToken == null) {
getPost = api.searchPostsInSpecificSubreddit(subredditOrUserName, query, after);
getPost = api.searchPostsInSpecificSubreddit(subredditOrUserName, query, after, nsfw);
} else {
getPost = api.searchPostsInSpecificSubredditOauth(subredditOrUserName, query, after, RedditUtils.getOAuthHeader(accessToken));
getPost = api.searchPostsInSpecificSubredditOauth(subredditOrUserName, query, after,
nsfw, RedditUtils.getOAuthHeader(accessToken));
}
}
@ -611,7 +620,8 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
ParsePost.parsePosts(response.body(), locale, -1, filter, nsfw,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {

View File

@ -17,12 +17,13 @@ class PostDataSourceFactory extends DataSource.Factory {
private String sortType;
private String userWhere;
private int filter;
private boolean nsfw;
private PostDataSource postDataSource;
private MutableLiveData<PostDataSource> postDataSourceLiveData;
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
int filter) {
int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -30,10 +31,11 @@ class PostDataSourceFactory extends DataSource.Factory {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
int postType, String sortType, int filter) {
int postType, String sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -42,10 +44,11 @@ class PostDataSourceFactory extends DataSource.Factory {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
int postType, String sortType, String where, int filter) {
int postType, String sortType, String where, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -55,10 +58,11 @@ class PostDataSourceFactory extends DataSource.Factory {
this.sortType = sortType;
userWhere = where;
this.filter = filter;
this.nsfw = nsfw;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
String query, int postType, String sortType, int filter) {
String query, int postType, String sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -68,22 +72,23 @@ class PostDataSourceFactory extends DataSource.Factory {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
@Override
public DataSource create() {
if(postType == PostDataSource.TYPE_FRONT_PAGE) {
postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, sortType,
filter);
filter, nsfw);
} else if(postType == PostDataSource.TYPE_SEARCH) {
postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, query,
postType, sortType, filter);
postType, sortType, filter, nsfw);
} else if(postType == PostDataSource.TYPE_SUBREDDIT) {
postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType,
sortType, filter);
sortType, filter, nsfw);
} else {
postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType,
sortType, userWhere, filter);
sortType, userWhere, filter, nsfw);
}
postDataSourceLiveData.postValue(postDataSource);
@ -102,8 +107,8 @@ class PostDataSourceFactory extends DataSource.Factory {
this.sortType = sortType;
}
void changeAccessTokenAndSortType(String accessToken, String sortType) {
this.accessToken = accessToken;
void changeNSFWAndSortType(boolean nsfw, String sortType) {
this.nsfw = nsfw;
this.sortType = sortType;
}
}

View File

@ -4,6 +4,7 @@ package ml.docilealligator.infinityforreddit;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
@ -49,7 +50,7 @@ import retrofit2.Retrofit;
public class PostFragment extends Fragment implements FragmentCommunicator {
static final String EXTRA_NAME = "EN";
static final String EXTRA_USER_NAME = "EN";
static final String EXTRA_USER_NAME = "EUN";
static final String EXTRA_USER_WHERE = "EUW";
static final String EXTRA_QUERY = "EQ";
static final String EXTRA_POST_TYPE = "EPT";
@ -57,6 +58,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
static final String EXTRA_FILTER = "EF";
static final int EXTRA_NO_FILTER = -1;
static final String EXTRA_ACCESS_TOKEN = "EAT";
static final String EXTRA_NSFW = "ENSFW";
private static final String IS_IN_LAZY_MODE_STATE = "IILMS";
@ -91,7 +93,10 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
Retrofit mOauthRetrofit;
@Inject
RedditDataRoomDatabase redditDataRoomDatabase;
RedditDataRoomDatabase mRedditDataRoomDatabase;
@Inject
SharedPreferences mSharedPreferences;
public PostFragment() {
// Required empty public constructor
@ -188,6 +193,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
String sortType = getArguments().getString(EXTRA_SORT_TYPE);
int filter = getArguments().getInt(EXTRA_FILTER);
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
boolean nsfw = mSharedPreferences.getBoolean(SharedPreferencesUtils.NSFW_KEY, true);
PostViewModel.Factory factory;
@ -195,7 +201,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
String subredditName = getArguments().getString(EXTRA_NAME);
String query = getArguments().getString(EXTRA_QUERY);
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase,
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
accessToken, postType, true, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
@ -216,16 +222,18 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if(accessToken == null) {
factory = new PostViewModel.Factory(mRetrofit, accessToken,
getResources().getConfiguration().locale, subredditName, query, postType, sortType, filter);
getResources().getConfiguration().locale, subredditName, query, postType,
sortType, filter, nsfw);
} else {
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
getResources().getConfiguration().locale, subredditName, query, postType, sortType, filter);
getResources().getConfiguration().locale, subredditName, query, postType,
sortType, filter, nsfw);
}
} else if(postType == PostDataSource.TYPE_SUBREDDIT) {
String subredditName = getArguments().getString(EXTRA_NAME);
boolean displaySubredditName = subredditName.equals("popular") || subredditName.equals("all");
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase,
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
accessToken, postType, displaySubredditName, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
@ -245,10 +253,12 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if(accessToken == null) {
factory = new PostViewModel.Factory(mRetrofit, accessToken,
getResources().getConfiguration().locale, subredditName, postType, sortType, filter);
getResources().getConfiguration().locale, subredditName, postType, sortType,
filter, nsfw);
} else {
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
getResources().getConfiguration().locale, subredditName, postType, sortType, filter);
getResources().getConfiguration().locale, subredditName, postType, sortType,
filter, nsfw);
}
} else if(postType == PostDataSource.TYPE_USER) {
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mFetchPostInfoLinearLayout.getLayoutParams();
@ -258,7 +268,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
String username = getArguments().getString(EXTRA_USER_NAME);
String where = getArguments().getString(EXTRA_USER_WHERE);
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase,
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
accessToken, postType, true, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
@ -279,13 +289,15 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if(accessToken == null) {
factory = new PostViewModel.Factory(mRetrofit, accessToken,
getResources().getConfiguration().locale, username, postType, sortType, where, filter);
getResources().getConfiguration().locale, username, postType, sortType, where,
filter, nsfw);
} else {
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
getResources().getConfiguration().locale, username, postType, sortType, where, filter);
getResources().getConfiguration().locale, username, postType, sortType, where,
filter, nsfw);
}
} else {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase,
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, mRedditDataRoomDatabase,
accessToken, postType, true, new PostRecyclerViewAdapter.Callback() {
@Override
public void retryLoadingMore() {
@ -304,7 +316,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
});
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
getResources().getConfiguration().locale, postType, sortType, filter);
getResources().getConfiguration().locale, postType, sortType, filter, nsfw);
}
mPostRecyclerView.setAdapter(mAdapter);
@ -369,6 +381,11 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}
}
@Override
public void changeNSFW(boolean nsfw) {
mPostViewModel.changeNSFW(nsfw);
}
@Override
public void startLazyMode() {
isInLazyMode = true;

View File

@ -21,13 +21,14 @@ public class PostViewModel extends ViewModel {
private LiveData<NetworkState> initialLoadingState;
private LiveData<Boolean> hasPostLiveData;
private LiveData<PagedList<Post>> posts;
private MutableLiveData<String> accessTokenLiveData;
private MutableLiveData<Boolean> nsfwLiveData;
private MutableLiveData<String> sortTypeLiveData;
private AccessTokenAndSortTypeLiveData accessTokenAndSortTypeLiveData;
private nsfwAndSortTypeLiveData NSFWAndSortTypeLiveData;
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
int filter) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, sortType, filter);
int filter, boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType,
sortType, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
@ -36,12 +37,12 @@ public class PostViewModel extends ViewModel {
hasPostLiveData = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::hasPostLiveData);
accessTokenLiveData = new MutableLiveData<>();
accessTokenLiveData.postValue(accessToken);
nsfwLiveData = new MutableLiveData<>();
nsfwLiveData.postValue(nsfw);
sortTypeLiveData = new MutableLiveData<>();
sortTypeLiveData.postValue(sortType);
accessTokenAndSortTypeLiveData = new AccessTokenAndSortTypeLiveData(accessTokenLiveData, sortTypeLiveData);
NSFWAndSortTypeLiveData = new nsfwAndSortTypeLiveData(nsfwLiveData, sortTypeLiveData);
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder())
@ -49,16 +50,16 @@ public class PostViewModel extends ViewModel {
.setPageSize(25)
.build();
posts = Transformations.switchMap(accessTokenAndSortTypeLiveData, sort -> {
postDataSourceFactory.changeAccessTokenAndSortType(accessTokenLiveData.getValue(), sortTypeLiveData.getValue());
posts = Transformations.switchMap(NSFWAndSortTypeLiveData, sort -> {
postDataSourceFactory.changeNSFWAndSortType(nsfwLiveData.getValue(), sortTypeLiveData.getValue());
return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
});
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
String sortType, int filter) {
String sortType, int filter, boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
postType, sortType, filter);
postType, sortType, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
@ -67,12 +68,12 @@ public class PostViewModel extends ViewModel {
hasPostLiveData = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::hasPostLiveData);
accessTokenLiveData = new MutableLiveData<>();
accessTokenLiveData.postValue(accessToken);
nsfwLiveData = new MutableLiveData<>();
nsfwLiveData.postValue(nsfw);
sortTypeLiveData = new MutableLiveData<>();
sortTypeLiveData.postValue(sortType);
accessTokenAndSortTypeLiveData = new AccessTokenAndSortTypeLiveData(accessTokenLiveData, sortTypeLiveData);
NSFWAndSortTypeLiveData = new nsfwAndSortTypeLiveData(nsfwLiveData, sortTypeLiveData);
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder())
@ -80,16 +81,16 @@ public class PostViewModel extends ViewModel {
.setPageSize(25)
.build();
posts = Transformations.switchMap(accessTokenAndSortTypeLiveData, sort -> {
postDataSourceFactory.changeAccessTokenAndSortType(accessTokenLiveData.getValue(), sortTypeLiveData.getValue());
posts = Transformations.switchMap(NSFWAndSortTypeLiveData, sort -> {
postDataSourceFactory.changeNSFWAndSortType(nsfwLiveData.getValue(), sortTypeLiveData.getValue());
return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
});
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
String sortType, String where, int filter) {
String sortType, String where, int filter, boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
postType, sortType, where, filter);
postType, sortType, where, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
@ -98,12 +99,12 @@ public class PostViewModel extends ViewModel {
hasPostLiveData = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::hasPostLiveData);
accessTokenLiveData = new MutableLiveData<>();
accessTokenLiveData.postValue(accessToken);
nsfwLiveData = new MutableLiveData<>();
nsfwLiveData.postValue(nsfw);
sortTypeLiveData = new MutableLiveData<>();
sortTypeLiveData.postValue(sortType);
accessTokenAndSortTypeLiveData = new AccessTokenAndSortTypeLiveData(accessTokenLiveData, sortTypeLiveData);
NSFWAndSortTypeLiveData = new nsfwAndSortTypeLiveData(nsfwLiveData, sortTypeLiveData);
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder())
@ -111,16 +112,16 @@ public class PostViewModel extends ViewModel {
.setPageSize(25)
.build();
posts = Transformations.switchMap(accessTokenAndSortTypeLiveData, sort -> {
postDataSourceFactory.changeAccessTokenAndSortType(accessTokenLiveData.getValue(), sortTypeLiveData.getValue());
posts = Transformations.switchMap(NSFWAndSortTypeLiveData, sort -> {
postDataSourceFactory.changeNSFWAndSortType(nsfwLiveData.getValue(), sortTypeLiveData.getValue());
return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
});
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
int postType, String sortType, int filter) {
int postType, String sortType, int filter, boolean nsfw) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
query, postType, sortType, filter);
query, postType, sortType, filter, nsfw);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::getInitialLoadStateLiveData);
@ -129,12 +130,12 @@ public class PostViewModel extends ViewModel {
hasPostLiveData = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
PostDataSource::hasPostLiveData);
accessTokenLiveData = new MutableLiveData<>();
accessTokenLiveData.postValue(accessToken);
nsfwLiveData = new MutableLiveData<>();
nsfwLiveData.postValue(nsfw);
sortTypeLiveData = new MutableLiveData<>();
sortTypeLiveData.postValue(sortType);
accessTokenAndSortTypeLiveData = new AccessTokenAndSortTypeLiveData(accessTokenLiveData, sortTypeLiveData);
NSFWAndSortTypeLiveData = new nsfwAndSortTypeLiveData(nsfwLiveData, sortTypeLiveData);
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder())
@ -143,7 +144,7 @@ public class PostViewModel extends ViewModel {
.build();
posts = Transformations.switchMap(sortTypeLiveData, sort -> {
postDataSourceFactory.changeAccessTokenAndSortType(accessTokenLiveData.getValue(), sortTypeLiveData.getValue());
postDataSourceFactory.changeNSFWAndSortType(nsfwLiveData.getValue(), sortTypeLiveData.getValue());
return (new LivePagedListBuilder(postDataSourceFactory, pagedListConfig)).build();
});
}
@ -180,8 +181,8 @@ public class PostViewModel extends ViewModel {
sortTypeLiveData.postValue(sortType);
}
void changeAccessToken(String accessToken) {
accessTokenLiveData.postValue(accessToken);
void changeNSFW(boolean nsfw) {
nsfwLiveData.postValue(nsfw);
}
public static class Factory extends ViewModelProvider.NewInstanceFactory {
@ -194,19 +195,21 @@ public class PostViewModel extends ViewModel {
private String sortType;
private String userWhere;
private int filter;
private boolean nsfw;
public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
int filter) {
int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
String sortType, int filter) {
String sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -214,10 +217,11 @@ public class PostViewModel extends ViewModel {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
String sortType, String where, int filter) {
String sortType, String where, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -226,10 +230,11 @@ public class PostViewModel extends ViewModel {
this.sortType = sortType;
userWhere = where;
this.filter = filter;
this.nsfw = nsfw;
}
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
int postType, String sortType, int filter) {
int postType, String sortType, int filter, boolean nsfw) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@ -238,27 +243,32 @@ public class PostViewModel extends ViewModel {
this.postType = postType;
this.sortType = sortType;
this.filter = filter;
this.nsfw = nsfw;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if(postType == PostDataSource.TYPE_FRONT_PAGE) {
return (T) new PostViewModel(retrofit, accessToken, locale, postType, sortType, filter);
return (T) new PostViewModel(retrofit, accessToken, locale, postType, sortType, filter,
nsfw);
} else if(postType == PostDataSource.TYPE_SEARCH){
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query, postType, sortType, filter);
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query,
postType, sortType, filter, nsfw);
} else if(postType == PostDataSource.TYPE_SUBREDDIT) {
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, sortType, filter);
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType,
sortType, filter, nsfw);
} else {
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, sortType, userWhere, filter);
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType,
sortType, userWhere, filter, nsfw);
}
}
}
private static class AccessTokenAndSortTypeLiveData extends MediatorLiveData<Pair<String, String>> {
public AccessTokenAndSortTypeLiveData(LiveData<String> accessToken, LiveData<String> sortType) {
addSource(accessToken, accessToken1 -> setValue(Pair.create(accessToken1, sortType.getValue())));
addSource(sortType, sortType1 -> setValue(Pair.create(accessToken.getValue(), sortType1)));
private static class nsfwAndSortTypeLiveData extends MediatorLiveData<Pair<Boolean, String>> {
public nsfwAndSortTypeLiveData(LiveData<Boolean> nsfw, LiveData<String> sortType) {
addSource(nsfw, accessToken1 -> setValue(Pair.create(accessToken1, sortType.getValue())));
addSource(sortType, sortType1 -> setValue(Pair.create(nsfw.getValue(), sortType1)));
}
}
}

View File

@ -30,7 +30,7 @@ import retrofit2.Response;
import retrofit2.Retrofit;
public class PullNotificationWorker extends Worker {
static final String WORKER_TAG = "PNWT";
public static final String WORKER_TAG = "PNWT";
private Context context;

View File

@ -73,26 +73,33 @@ public interface RedditAPI {
@GET("/api/info.json?raw_json=1")
Call<String> getInfo(@Query("id") String id);
@GET("subreddits/search.json?raw_json=1&include_over_18=on")
Call<String> searchSubreddits(@Query("q") String subredditName, @Query("after") String after, @Query("sort") String sort);
@GET("subreddits/search.json?raw_json=1")
Call<String> searchSubreddits(@Query("q") String subredditName, @Query("after") String after,
@Query("sort") String sort, @Query("include_over_18") boolean nsfw);
@GET("search.json?raw_json=1&type=user&include_over_18=on")
Call<String> searchUsers(@Query("q") String profileName, @Query("after") String after, @Query("sort") String sort);
@GET("search.json?raw_json=1&type=user")
Call<String> searchUsers(@Query("q") String profileName, @Query("after") String after,
@Query("sort") String sort, @Query("include_over_18") boolean nsfw);
@GET("search.json?raw_json=1&type=link&include_over_18=on")
Call<String> searchPostsOauth(@Query("q") String query, @Query("after") String after, @Query("sort") String sort,
@GET("search.json?raw_json=1&type=link")
Call<String> searchPostsOauth(@Query("q") String query, @Query("after") String after,
@Query("sort") String sort, @Query("include_over_18") boolean nsfw,
@HeaderMap Map<String, String> headers);
@GET("search.json?raw_json=1&type=link&include_over_18=on")
Call<String> searchPosts(@Query("q") String query, @Query("after") String after, @Query("sort") String sort);
@GET("search.json?raw_json=1&type=link")
Call<String> searchPosts(@Query("q") String query, @Query("after") String after,
@Query("sort") String sort, @Query("include_over_18") boolean nsfw);
@GET("r/{subredditName}/search.json?raw_json=1&type=link&restrict_sr=true&include_over_18=on")
Call<String> searchPostsInSpecificSubredditOauth(@Path("subredditName") String subredditName, @Query("q") String query,
@Query("after") String after, @HeaderMap Map<String, String> headers);
@GET("r/{subredditName}/search.json?raw_json=1&type=link&restrict_sr=true")
Call<String> searchPostsInSpecificSubredditOauth(@Path("subredditName") String subredditName,
@Query("q") String query, @Query("after") String after,
@Query("include_over_18") boolean nsfw,
@HeaderMap Map<String, String> headers);
@GET("r/{subredditName}/search.json?raw_json=1&type=link&restrict_sr=true&include_over_18=on")
Call<String> searchPostsInSpecificSubreddit(@Path("subredditName") String subredditName, @Query("q") String query,
@Query("after") String after);
@GET("r/{subredditName}/search.json?raw_json=1&type=link&restrict_sr=true")
Call<String> searchPostsInSpecificSubreddit(@Path("subredditName") String subredditName,
@Query("q") String query, @Query("after") String after,
@Query("include_over_18") boolean nsfw);
@FormUrlEncoded
@POST("api/comment")

View File

@ -132,11 +132,9 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos
// Get the intent, verify the action and get the query
Intent intent = getIntent();
String query = intent.getExtras().getString(EXTRA_QUERY);
String query = intent.getStringExtra(EXTRA_QUERY);
if(intent.hasExtra(EXTRA_SUBREDDIT_NAME)) {
mSubredditName = intent.getExtras().getString(EXTRA_SUBREDDIT_NAME);
}
mSubredditName = intent.getStringExtra(EXTRA_SUBREDDIT_NAME);
if(query != null) {
mQuery = query;
@ -233,6 +231,11 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos
finish();
}
@Subscribe
public void onChangeNSFWEvent(ChangeNSFWEvent changeNSFWEvent) {
sectionsPagerAdapter.changeNSFW(changeNSFWEvent.nsfw);
}
private class SectionsPagerAdapter extends FragmentPagerAdapter {
private PostFragment postFragment;
@ -349,5 +352,11 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos
getItem(1);
getItem(2);
}
public void changeNSFW(boolean nsfw) {
if(postFragment != null) {
postFragment.changeNSFW(nsfw);
}
}
}
}

View File

@ -5,13 +5,7 @@ package ml.docilealligator.infinityforreddit;
*/
public class SharedPreferencesUtils {
static final String AUTH_CODE_FILE_KEY = "Auth_Code_Pref";
static final String USER_INFO_FILE_KEY = "User_Info";
static final String AUTH_CODE_KEY = "code";
public static final String ACCESS_TOKEN_KEY = "accessToken";
static final String REFRESH_TOKEN_KEY = "refreshToken";
static final String USER_KEY = "user";
static final String PROFILE_IMAGE_URL_KEY = "profileImageUrl";
static final String BANNER_IMAGE_URL_KEY = "bannerImageUrl";
static final String KARMA_KEY = "karma";
public static final String ENABLE_NOTIFICATION_KEY = "enable_notification";
public static final String NOTIFICATION_INTERVAL_KEY = "notificaiton_interval";
public static final String NSFW_KEY = "nsfw";
}

View File

@ -14,6 +14,7 @@ public class SubredditListingDataSource extends PageKeyedDataSource<String, Subr
private Retrofit retrofit;
private String query;
private String sortType;
private boolean nsfw;
private MutableLiveData<NetworkState> paginationNetworkStateLiveData;
private MutableLiveData<NetworkState> initialLoadStateLiveData;
@ -24,10 +25,11 @@ public class SubredditListingDataSource extends PageKeyedDataSource<String, Subr
private LoadParams<String> params;
private LoadCallback<String, SubredditData> callback;
SubredditListingDataSource(Retrofit retrofit, String query, String sortType) {
SubredditListingDataSource(Retrofit retrofit, String query, String sortType, boolean nsfw) {
this.retrofit = retrofit;
this.query = query;
this.sortType = sortType;
this.nsfw = nsfw;
paginationNetworkStateLiveData = new MutableLiveData<>();
initialLoadStateLiveData = new MutableLiveData<>();
hasSubredditLiveData = new MutableLiveData<>();
@ -52,7 +54,8 @@ public class SubredditListingDataSource extends PageKeyedDataSource<String, Subr
initialLoadStateLiveData.postValue(NetworkState.LOADING);
FetchSubredditData.fetchSubredditListingData(retrofit, query, null, sortType, new FetchSubredditData.FetchSubredditListingDataListener() {
FetchSubredditData.fetchSubredditListingData(retrofit, query, null, sortType, nsfw,
new FetchSubredditData.FetchSubredditListingDataListener() {
@Override
public void onFetchSubredditListingDataSuccess(ArrayList<SubredditData> subredditData, String after) {
if(subredditData.size() == 0) {
@ -86,7 +89,8 @@ public class SubredditListingDataSource extends PageKeyedDataSource<String, Subr
return;
}
FetchSubredditData.fetchSubredditListingData(retrofit, query, params.key, sortType, new FetchSubredditData.FetchSubredditListingDataListener() {
FetchSubredditData.fetchSubredditListingData(retrofit, query, params.key, sortType, nsfw,
new FetchSubredditData.FetchSubredditListingDataListener() {
@Override
public void onFetchSubredditListingDataSuccess(ArrayList<SubredditData> subredditData, String after) {
callback.onResult(subredditData, after);

View File

@ -9,21 +9,23 @@ public class SubredditListingDataSourceFactory extends DataSource.Factory {
private Retrofit retrofit;
private String query;
private String sortType;
private boolean nsfw;
private SubredditListingDataSource subredditListingDataSource;
private MutableLiveData<SubredditListingDataSource> subredditListingDataSourceMutableLiveData;
SubredditListingDataSourceFactory(Retrofit retrofit, String query, String sortType) {
SubredditListingDataSourceFactory(Retrofit retrofit, String query, String sortType, boolean nsfw) {
this.retrofit = retrofit;
this.query = query;
this.sortType = sortType;
this.nsfw = nsfw;
subredditListingDataSourceMutableLiveData = new MutableLiveData<>();
}
@NonNull
@Override
public DataSource create() {
subredditListingDataSource = new SubredditListingDataSource(retrofit, query, sortType);
subredditListingDataSource = new SubredditListingDataSource(retrofit, query, sortType, nsfw);
subredditListingDataSourceMutableLiveData.postValue(subredditListingDataSource);
return subredditListingDataSource;
}

View File

@ -41,6 +41,7 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun
static final String EXTRA_IS_POSTING = "EIP";
static final String EXTRA_ACCESS_TOKEN = "EAT";
static final String EXTRA_ACCOUNT_NAME = "EAN";
static final String EXTRA_NSFW = "EN";
@BindView(R.id.coordinator_layout_subreddit_listing_fragment) CoordinatorLayout mCoordinatorLayout;
@BindView(R.id.recycler_view_subreddit_listing_fragment) RecyclerView mSubredditListingRecyclerView;
@ -99,6 +100,7 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun
boolean isPosting = getArguments().getBoolean(EXTRA_IS_POSTING);
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
String accountName = getArguments().getString(EXTRA_ACCOUNT_NAME);
boolean nsfw = getArguments().getBoolean(EXTRA_NSFW);
mAdapter = new SubredditListingRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit,
accessToken, accountName, redditDataRoomDatabase,
@ -123,7 +125,7 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun
mSubredditListingRecyclerView.setAdapter(mAdapter);
SubredditListingViewModel.Factory factory = new SubredditListingViewModel.Factory(mRetrofit, query,
PostDataSource.SORT_TYPE_RELEVANCE);
PostDataSource.SORT_TYPE_RELEVANCE, nsfw);
mSubredditListingViewModel = new ViewModelProvider(this, factory).get(SubredditListingViewModel.class);
mSubredditListingViewModel.getSubreddits().observe(this, subredditData -> mAdapter.submitList(subredditData));

View File

@ -20,8 +20,8 @@ public class SubredditListingViewModel extends ViewModel {
private LiveData<PagedList<SubredditData>> subreddits;
private MutableLiveData<String> sortTypeLiveData;
SubredditListingViewModel(Retrofit retrofit, String query, String sortType) {
subredditListingDataSourceFactory = new SubredditListingDataSourceFactory(retrofit, query, sortType);
SubredditListingViewModel(Retrofit retrofit, String query, String sortType, boolean nsfw) {
subredditListingDataSourceFactory = new SubredditListingDataSourceFactory(retrofit, query, sortType, nsfw);
initialLoadingState = Transformations.switchMap(subredditListingDataSourceFactory.getSubredditListingDataSourceMutableLiveData(),
SubredditListingDataSource::getInitialLoadStateLiveData);
@ -81,17 +81,19 @@ public class SubredditListingViewModel extends ViewModel {
private Retrofit retrofit;
private String query;
private String sortType;
private boolean nsfw;
public Factory(Retrofit retrofit, String query, String sortType) {
public Factory(Retrofit retrofit, String query, String sortType, boolean nsfw) {
this.retrofit = retrofit;
this.query = query;
this.sortType = sortType;
this.nsfw = nsfw;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new SubredditListingViewModel(retrofit, query, sortType);
return (T) new SubredditListingViewModel(retrofit, query, sortType, nsfw);
}
}
}

View File

@ -14,6 +14,7 @@ public class UserListingDataSource extends PageKeyedDataSource<String, UserData>
private Retrofit retrofit;
private String query;
private String sortType;
private boolean nsfw;
private MutableLiveData<NetworkState> paginationNetworkStateLiveData;
private MutableLiveData<NetworkState> initialLoadStateLiveData;
@ -24,10 +25,11 @@ public class UserListingDataSource extends PageKeyedDataSource<String, UserData>
private PageKeyedDataSource.LoadParams<String> params;
private PageKeyedDataSource.LoadCallback<String, UserData> callback;
UserListingDataSource(Retrofit retrofit, String query, String sortType) {
UserListingDataSource(Retrofit retrofit, String query, String sortType, boolean nsfw) {
this.retrofit = retrofit;
this.query = query;
this.sortType = sortType;
this.nsfw = nsfw;
paginationNetworkStateLiveData = new MutableLiveData<>();
initialLoadStateLiveData = new MutableLiveData<>();
hasUserLiveData = new MutableLiveData<>();
@ -52,7 +54,8 @@ public class UserListingDataSource extends PageKeyedDataSource<String, UserData>
initialLoadStateLiveData.postValue(NetworkState.LOADING);
FetchUserData.fetchUserListingData(retrofit, query, null, sortType, new FetchUserData.FetchUserListingDataListener() {
FetchUserData.fetchUserListingData(retrofit, query, null, sortType, nsfw,
new FetchUserData.FetchUserListingDataListener() {
@Override
public void onFetchUserListingDataSuccess(ArrayList<UserData> UserData, String after) {
if(UserData.size() == 0) {
@ -86,7 +89,8 @@ public class UserListingDataSource extends PageKeyedDataSource<String, UserData>
return;
}
FetchUserData.fetchUserListingData(retrofit, query, params.key, sortType, new FetchUserData.FetchUserListingDataListener() {
FetchUserData.fetchUserListingData(retrofit, query, params.key, sortType, nsfw,
new FetchUserData.FetchUserListingDataListener() {
@Override
public void onFetchUserListingDataSuccess(ArrayList<UserData> UserData, String after) {
callback.onResult(UserData, after);

View File

@ -9,21 +9,23 @@ public class UserListingDataSourceFactory extends DataSource.Factory {
private Retrofit retrofit;
private String query;
private String sortType;
private boolean nsfw;
private UserListingDataSource userListingDataSource;
private MutableLiveData<UserListingDataSource> userListingDataSourceMutableLiveData;
UserListingDataSourceFactory(Retrofit retrofit, String query, String sortType) {
UserListingDataSourceFactory(Retrofit retrofit, String query, String sortType, boolean nsfw) {
this.retrofit = retrofit;
this.query = query;
this.sortType = sortType;
this.nsfw = nsfw;
userListingDataSourceMutableLiveData = new MutableLiveData<>();
}
@NonNull
@Override
public DataSource create() {
userListingDataSource = new UserListingDataSource(retrofit, query, sortType);
userListingDataSource = new UserListingDataSource(retrofit, query, sortType, nsfw);
userListingDataSourceMutableLiveData.postValue(userListingDataSource);
return userListingDataSource;
}

View File

@ -37,6 +37,7 @@ public class UserListingFragment extends Fragment implements FragmentCommunicato
static final String EXTRA_QUERY = "EQ";
static final String EXTRA_ACCESS_TOKEN = "EAT";
static final String EXTRA_ACCOUNT_NAME = "EAN";
static final String EXTRA_NSFW = "EN";
@BindView(R.id.coordinator_layout_user_listing_fragment) CoordinatorLayout mCoordinatorLayout;
@BindView(R.id.recycler_view_user_listing_fragment) RecyclerView mUserListingRecyclerView;
@ -102,7 +103,7 @@ public class UserListingFragment extends Fragment implements FragmentCommunicato
mUserListingRecyclerView.setAdapter(mAdapter);
UserListingViewModel.Factory factory = new UserListingViewModel.Factory(mRetrofit, mQuery,
PostDataSource.SORT_TYPE_RELEVANCE);
PostDataSource.SORT_TYPE_RELEVANCE, getArguments().getBoolean(EXTRA_NSFW));
mUserListingViewModel = new ViewModelProvider(this, factory).get(UserListingViewModel.class);
mUserListingViewModel.getUsers().observe(this, UserData -> mAdapter.submitList(UserData));

View File

@ -20,8 +20,8 @@ public class UserListingViewModel extends ViewModel {
private LiveData<PagedList<UserData>> users;
private MutableLiveData<String> sortTypeLiveData;
UserListingViewModel(Retrofit retrofit, String query, String sortType) {
userListingDataSourceFactory = new UserListingDataSourceFactory(retrofit, query, sortType);
UserListingViewModel(Retrofit retrofit, String query, String sortType, boolean nsfw) {
userListingDataSourceFactory = new UserListingDataSourceFactory(retrofit, query, sortType, nsfw);
initialLoadingState = Transformations.switchMap(userListingDataSourceFactory.getUserListingDataSourceMutableLiveData(),
UserListingDataSource::getInitialLoadStateLiveData);
@ -81,17 +81,19 @@ public class UserListingViewModel extends ViewModel {
private Retrofit retrofit;
private String query;
private String sortType;
private boolean nsfw;
public Factory(Retrofit retrofit, String query, String sortType) {
public Factory(Retrofit retrofit, String query, String sortType, boolean nsfw) {
this.retrofit = retrofit;
this.query = query;
this.sortType = sortType;
this.nsfw = nsfw;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new UserListingViewModel(retrofit, query, sortType);
return (T) new UserListingViewModel(retrofit, query, sortType, nsfw);
}
}
}

View File

@ -545,6 +545,12 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So
}
}
@Subscribe
public void onChangeNSFWEvent(ChangeNSFWEvent changeNSFWEvent) {
((FragmentCommunicator) mFragment).changeNSFW(changeNSFWEvent.nsfw);
}
private static class InsertSubredditDataAsyncTask extends AsyncTask<Void, Void, Void> {
interface InsertSubredditDataAsyncTaskListener {

View File

@ -572,6 +572,11 @@ public class ViewUserDetailActivity extends AppCompatActivity implements UserThi
}
}
@Subscribe
public void onChangeNSFWEvent(ChangeNSFWEvent changeNSFWEvent) {
sectionsPagerAdapter.changeNSFW(changeNSFWEvent.nsfw);
}
private static class InsertUserDataAsyncTask extends AsyncTask<Void, Void, Void> {
interface InsertUserDataAsyncTaskListener {
@ -710,5 +715,11 @@ public class ViewUserDetailActivity extends AppCompatActivity implements UserThi
}
}
}
public void changeNSFW(boolean nsfw) {
if(postFragment != null) {
postFragment.changeNSFW(nsfw);
}
}
}
}

View File

@ -59,10 +59,10 @@
android:id="@+id/subreddit_name_relative_layout_search_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground">
android:padding="16dp">
<TextView
android:id="@+id/search_in_text_view_search_activity"

View File

@ -18,7 +18,7 @@
app:useSimpleSummaryProvider="true" />
<SwitchPreference
app:defaultValue="true"
app:defaultValue="false"
app:key="nsfw"
app:title="@string/settings_enable_nsfw_title"/>

View File

@ -9,12 +9,13 @@
app:title="@string/settings_notification_enable_notification_title"/>
<ListPreference
app:defaultValue="2"
app:defaultValue="1"
app:entries="@array/settings_notification_interval"
app:entryValues="@array/settings_notification_interval_values"
app:key="notificaiton_interval"
app:icon="@drawable/ic_outline_access_time_24px"
app:title="@string/settings_notification_interval_title"
app:useSimpleSummaryProvider="true" />
app:useSimpleSummaryProvider="true"
app:isPreferenceVisible="false" />
</androidx.preference.PreferenceScreen>