aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/ml/docilealligator
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/ml/docilealligator')
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java111
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java7
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java20
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java2
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java187
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java28
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java91
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java27
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java39
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java4
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java10
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java6
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java31
13 files changed, 415 insertions, 148 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java
new file mode 100644
index 00000000..4cddd4d9
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java
@@ -0,0 +1,111 @@
+package ml.docilealligator.infinityforreddit;
+
+import android.os.Bundle;
+import android.view.MenuItem;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.Fragment;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class FilteredPostsActivity extends AppCompatActivity {
+
+ static final String EXTRA_NAME = "ESN";
+ static final String EXTRA_QUERY = "EQ";
+ static final String EXTRA_FILTER = "EF";
+ static final String EXTRA_POST_TYPE = "EPT";
+ static final String EXTRA_SORT_TYPE = "EST";
+
+ private static final String FRAGMENT_OUT_STATE = "FOS";
+
+ @BindView(R.id.toolbar_filtered_posts_activity) Toolbar toolbar;
+
+ private Fragment mFragment;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_filtered_posts);
+
+ ButterKnife.bind(this);
+
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ String name = getIntent().getExtras().getString(EXTRA_NAME);
+ int filter = getIntent().getExtras().getInt(EXTRA_FILTER);
+ int postType = getIntent().getExtras().getInt(EXTRA_POST_TYPE);
+ String sortType = getIntent().getExtras().getString(EXTRA_SORT_TYPE);
+
+ switch (postType) {
+ case PostDataSource.TYPE_FRONT_PAGE:
+ getSupportActionBar().setTitle(name);
+ break;
+ case PostDataSource.TYPE_SEARCH:
+ getSupportActionBar().setTitle(R.string.search);
+ break;
+ case PostDataSource.TYPE_SUBREDDIT:
+ String subredditNamePrefixed = "r/" + name;
+ getSupportActionBar().setTitle(subredditNamePrefixed);
+ case PostDataSource.TYPE_USER:
+ String usernamePrefixed = "u/" + name;
+ getSupportActionBar().setTitle(usernamePrefixed);
+ break;
+ }
+
+ switch (filter) {
+ case Post.TEXT_TYPE:
+ toolbar.setSubtitle(R.string.text);
+ break;
+ case Post.LINK_TYPE:
+ case Post.NO_PREVIEW_LINK_TYPE:
+ toolbar.setSubtitle(R.string.link);
+ break;
+ case Post.IMAGE_TYPE:
+ toolbar.setSubtitle(R.string.image);
+ break;
+ case Post.VIDEO_TYPE:
+ toolbar.setSubtitle(R.string.video);
+ break;
+ case Post.GIF_VIDEO_TYPE:
+ toolbar.setSubtitle(R.string.gif);
+ }
+
+ if(savedInstanceState == null) {
+ mFragment = new PostFragment();
+ Bundle bundle = new Bundle();
+ bundle.putString(PostFragment.EXTRA_NAME, name);
+ bundle.putInt(PostFragment.EXTRA_POST_TYPE, postType);
+ bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType);
+ bundle.putInt(PostFragment.EXTRA_FILTER, filter);
+ if(postType == PostDataSource.TYPE_SEARCH) {
+ bundle.putString(PostFragment.EXTRA_QUERY, getIntent().getExtras().getString(EXTRA_QUERY));
+ }
+ mFragment.setArguments(bundle);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit();
+ } else {
+ mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit();
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if(item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ if (mFragment != null) {
+ getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE, mFragment);
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java
index 64662e0a..7b284a79 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java
@@ -389,22 +389,25 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
+ bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
fragment.setArguments(bundle);
return fragment;
} else if(position == 1) {
PostFragment fragment = new PostFragment();
Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, "popular");
+ bundle.putString(PostFragment.EXTRA_NAME, "popular");
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_HOT);
+ bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
fragment.setArguments(bundle);
return fragment;
} else {
PostFragment fragment = new PostFragment();
Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, "all");
+ bundle.putString(PostFragment.EXTRA_NAME, "all");
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_HOT);
+ bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
fragment.setArguments(bundle);
return fragment;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
index 7003d91a..05890b9b 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
@@ -28,8 +28,8 @@ class ParsePost {
void onParsePostFail();
}
- static void parsePosts(String response, Locale locale, int nPosts, ParsePostsListingListener parsePostsListingListener) {
- new ParsePostDataAsyncTask(response, locale, nPosts, parsePostsListingListener).execute();
+ static void parsePosts(String response, Locale locale, int nPosts, int filter, ParsePostsListingListener parsePostsListingListener) {
+ new ParsePostDataAsyncTask(response, locale, nPosts, filter, parsePostsListingListener).execute();
}
static void parsePost(String response, Locale locale, ParsePostListener parsePostListener) {
@@ -40,6 +40,7 @@ class ParsePost {
private JSONArray allData;
private Locale locale;
private int nPosts;
+ private int filter;
private ParsePostsListingListener parsePostsListingListener;
private ParsePostListener parsePostListener;
private ArrayList<Post> newPosts;
@@ -47,7 +48,7 @@ class ParsePost {
private String lastItem;
private boolean parseFailed;
- ParsePostDataAsyncTask(String response, Locale locale, int nPosts,
+ ParsePostDataAsyncTask(String response, Locale locale, int nPosts, int filter,
ParsePostsListingListener parsePostsListingListener) {
this.parsePostsListingListener = parsePostsListingListener;
try {
@@ -56,6 +57,7 @@ class ParsePost {
lastItem = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY);
this.locale = locale;
this.nPosts = nPosts;
+ this.filter = filter;
newPosts = new ArrayList<>();
parseFailed = false;
} catch (JSONException e) {
@@ -104,7 +106,14 @@ class ParsePost {
for(int i = 0; i < size; i++) {
JSONObject data = allData.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
- newPosts.add(parseBasicData(data, locale, i));
+ 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);
+ }
}
}
} catch (JSONException e) {
@@ -192,7 +201,8 @@ class ParsePost {
String subredditNamePrefixed, String author, String formattedPostTime,
String title, String previewUrl, int previewWidth, int previewHeight,
int score, int voteType, int gilded, String flair, boolean spoiler,
- boolean nsfw, boolean stickied, boolean archived, boolean isCrosspost, int i) throws JSONException {
+ boolean nsfw, boolean stickied, boolean archived, boolean isCrosspost,
+ int i) throws JSONException {
Post post;
boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java
index bfdb084d..22e3787c 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubredditData.java
@@ -54,7 +54,7 @@ class ParseSubredditData {
JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY);
mNCurrentOnlineSubscribers = data.getInt(JSONUtils.ACTIVE_USER_COUNT_KEY);
subredditData = parseSubredditData(data);
- /*String id = data.getString(JSONUtils.EXTRA_SUBREDDIT_NAME);
+ /*String id = data.getString(JSONUtils.EXTRA_NAME);
String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME);
String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
index ff6d5a48..6cd6730c 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
@@ -37,10 +37,11 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private Retrofit retrofit;
private String accessToken;
private Locale locale;
- private String subredditName;
+ private String subredditOrUserName;
private String query;
private int postType;
private String sortType;
+ private int filter;
private OnPostFetchedCallback onPostFetchedCallback;
private MutableLiveData<NetworkState> paginationNetworkStateLiveData;
@@ -52,7 +53,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private LoadCallback<String, Post> callback;
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
- OnPostFetchedCallback onPostFetchedCallback) {
+ int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@@ -60,45 +61,49 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
initialLoadStateLiveData = new MutableLiveData();
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
- PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
- String sortType, OnPostFetchedCallback onPostFetchedCallback) {
+ PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, int postType,
+ String sortType, int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
- this.subredditName = subredditName;
+ this.subredditOrUserName = subredditOrUserName;
paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData();
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
- PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
- OnPostFetchedCallback onPostFetchedCallback) {
+ PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, int postType,
+ int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
- this.subredditName = subredditName;
+ this.subredditOrUserName = subredditOrUserName;
paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData();
this.postType = postType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
- PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
- int postType, String sortType, OnPostFetchedCallback onPostFetchedCallback) {
+ PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, String query,
+ int postType, String sortType, int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
- this.subredditName = subredditName;
+ this.subredditOrUserName = subredditOrUserName;
this.query = query;
paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData();
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@@ -119,16 +124,16 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
switch (postType) {
case TYPE_FRONT_PAGE:
- loadBestPostsInitial(callback);
+ loadBestPostsInitial(callback, null);
break;
case TYPE_SUBREDDIT:
- loadSubredditPostsInitial(callback);
+ loadSubredditPostsInitial(callback, null);
break;
case TYPE_USER:
loadUserPostsInitial(callback, null);
break;
case TYPE_SEARCH:
- loadSearchPostsInitial(callback);
+ loadSearchPostsInitial(callback, null);
break;
}
}
@@ -143,7 +148,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
this.params = params;
this.callback = callback;
- if(params.key.equals("null")) {
+ if(params.key.equals("") || params.key.equals("null")) {
return;
}
@@ -151,24 +156,24 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
switch (postType) {
case TYPE_FRONT_PAGE:
- loadBestPostsAfter(params, callback);
+ loadBestPostsAfter(params, callback, null);
break;
case TYPE_SUBREDDIT:
- loadSubredditPostsAfter(params, callback);
+ loadSubredditPostsAfter(params, callback, null);
break;
case TYPE_USER:
loadUserPostsAfter(params, callback, null);
break;
case TYPE_SEARCH:
- loadSearchPostsAfter(params, callback);
+ loadSearchPostsAfter(params, callback, null);
break;
}
}
- private void loadBestPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback) {
+ private void loadBestPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback, String lastItem) {
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> bestPost = api.getBestPosts(sortType, null, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> bestPost = api.getBestPosts(sortType, lastItem, RedditUtils.getOAuthHeader(accessToken));
bestPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
@@ -191,21 +196,27 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
}
});
} else {
- ParsePost.parsePosts(response.body(), locale, -1,
+ ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(newPosts.size() == 0) {
- onPostFetchedCallback.noPost();
+ String nextPageKey;
+ if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
+ nextPageKey = null;
} else {
- onPostFetchedCallback.hasPost();
+ nextPageKey = lastItem;
}
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null, null);
+ if(newPosts.size() != 0) {
+ onPostFetchedCallback.hasPost();
+ } else if(nextPageKey != null) {
+ loadBestPostsInitial(callback, nextPageKey);
+ return;
} else {
- callback.onResult(newPosts, null, lastItem);
+ onPostFetchedCallback.noPost();
}
+
+ callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED);
}
@@ -230,23 +241,25 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
});
}
- private void loadBestPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback) {
+ private void loadBestPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback, String lastItem) {
+ String after = lastItem == null ? params.key : lastItem;
+
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> bestPost = api.getBestPosts(sortType, params.key, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> bestPost = api.getBestPosts(sortType, after, RedditUtils.getOAuthHeader(accessToken));
bestPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() {
+ ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null);
+ if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
+ loadBestPostsAfter(params, callback, lastItem);
} else {
callback.onResult(newPosts, lastItem);
+ paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
- paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
@Override
@@ -269,9 +282,9 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
});
}
- private void loadSubredditPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback) {
+ private void loadSubredditPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback, String lastItem) {
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> getPost = api.getSubredditBestPosts(subredditName, sortType, null, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> getPost = api.getSubredditBestPosts(subredditOrUserName, sortType, lastItem, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
@@ -294,21 +307,27 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
}
});
} else {
- ParsePost.parsePosts(response.body(), locale, -1,
+ ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(newPosts.size() == 0) {
- onPostFetchedCallback.noPost();
+ String nextPageKey;
+ if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
+ nextPageKey = null;
} else {
- onPostFetchedCallback.hasPost();
+ nextPageKey = lastItem;
}
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null, null);
+ if(newPosts.size() != 0) {
+ onPostFetchedCallback.hasPost();
+ } else if(nextPageKey != null) {
+ loadSubredditPostsInitial(callback, nextPageKey);
+ return;
} else {
- callback.onResult(newPosts, null, lastItem);
+ onPostFetchedCallback.noPost();
}
+
+ callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED);
}
@@ -333,22 +352,24 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
});
}
- private void loadSubredditPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback) {
+ private void loadSubredditPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback, String lastItem) {
+ String after = lastItem == null ? params.key : lastItem;
+
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> getPost = api.getSubredditBestPosts(subredditName, sortType, params.key, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> getPost = api.getSubredditBestPosts(subredditOrUserName, sortType, after, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() {
+ ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null);
+ if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
+ loadSubredditPostsAfter(params, callback, lastItem);
} else {
callback.onResult(newPosts, lastItem);
+ paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
- paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
@Override
@@ -373,26 +394,32 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private void loadUserPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback, String lastItem) {
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> getPost = api.getUserBestPosts(subredditName, lastItem, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> getPost = api.getUserBestPosts(subredditOrUserName, lastItem, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1,
+ ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(newPosts.size() == 0) {
- onPostFetchedCallback.noPost();
+ String nextPageKey;
+ if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
+ nextPageKey = null;
} else {
- onPostFetchedCallback.hasPost();
+ nextPageKey = lastItem;
}
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null, null);
+ if(newPosts.size() != 0) {
+ onPostFetchedCallback.hasPost();
+ } else if(nextPageKey != null) {
+ loadUserPostsInitial(callback, nextPageKey);
+ return;
} else {
- callback.onResult(newPosts, null, lastItem);
+ onPostFetchedCallback.noPost();
}
+
+ callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED);
}
@@ -420,15 +447,15 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
String after = lastItem == null ? params.key : lastItem;
RedditAPI api = retrofit.create(RedditAPI.class);
- Call<String> getPost = api.getUserBestPosts(subredditName, after, RedditUtils.getOAuthHeader(accessToken));
+ Call<String> getPost = api.getUserBestPosts(subredditOrUserName, after, RedditUtils.getOAuthHeader(accessToken));
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() {
+ ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(newPosts.size() == 0 && !lastItem.equals("null")) {
+ if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
loadUserPostsAfter(params, callback, lastItem);
} else {
callback.onResult(newPosts, lastItem);
@@ -456,31 +483,41 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
});
}
- private void loadSearchPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback) {
+ private void loadSearchPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback, String lastItem) {
RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> getPost;
- if(subredditName == null) {
+ if(subredditOrUserName == null) {
getPost = api.searchPosts(query, null, sortType, RedditUtils.getOAuthHeader(accessToken));
} else {
- getPost = api.searchPostsInSpecificSubreddit(subredditName, query, null, RedditUtils.getOAuthHeader(accessToken));
+ getPost = api.searchPostsInSpecificSubreddit(subredditOrUserName, query, null, RedditUtils.getOAuthHeader(accessToken));
}
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1,
+ ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(newPosts.size() == 0) {
- onPostFetchedCallback.noPost();
+ String nextPageKey;
+ if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
+ nextPageKey = null;
} else {
+ nextPageKey = lastItem;
+ }
+
+ if(newPosts.size() != 0) {
onPostFetchedCallback.hasPost();
+ } else if(nextPageKey != null) {
+ loadSearchPostsInitial(callback, nextPageKey);
+ return;
+ } else {
+ onPostFetchedCallback.noPost();
}
- callback.onResult(newPosts, null, lastItem);
+ callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED);
}
@@ -504,29 +541,31 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
});
}
- private void loadSearchPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback) {
+ private void loadSearchPostsAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<String, Post> callback, String lastItem) {
+ String after = lastItem == null ? params.key : lastItem;
+
RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> getPost;
- if(subredditName == null) {
- getPost = api.searchPosts(query, params.key, sortType, RedditUtils.getOAuthHeader(accessToken));
+ if(subredditOrUserName == null) {
+ getPost = api.searchPosts(query, after, sortType, RedditUtils.getOAuthHeader(accessToken));
} else {
- getPost = api.searchPostsInSpecificSubreddit(subredditName, query, params.key, RedditUtils.getOAuthHeader(accessToken));
+ getPost = api.searchPostsInSpecificSubreddit(subredditOrUserName, query, after, RedditUtils.getOAuthHeader(accessToken));
}
getPost.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
- ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() {
+ ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
- if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
- callback.onResult(newPosts, null);
+ if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
+ loadSearchPostsAfter(params, callback, lastItem);
} else {
callback.onResult(newPosts, lastItem);
+ paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
- paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
}
@Override
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java
index 79a533e0..67350b7b 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSourceFactory.java
@@ -15,24 +15,27 @@ class PostDataSourceFactory extends DataSource.Factory {
private String query;
private int postType;
private String sortType;
+ private int filter;
private PostDataSource.OnPostFetchedCallback onPostFetchedCallback;
private PostDataSource postDataSource;
private MutableLiveData<PostDataSource> postDataSourceLiveData;
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
- PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
- int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int postType, String sortType, int filter,
+ PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@@ -40,22 +43,26 @@ class PostDataSourceFactory extends DataSource.Factory {
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
- int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int postType, int filter,
+ PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
this.subredditName = subredditName;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
- String query, int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ String query, int postType, String sortType, int filter,
+ PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@@ -64,19 +71,24 @@ class PostDataSourceFactory extends DataSource.Factory {
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@Override
public DataSource create() {
if(postType == PostDataSource.TYPE_FRONT_PAGE) {
- postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback);
+ postDataSource = new PostDataSource(retrofit, accessToken, locale, postType, sortType,
+ filter, onPostFetchedCallback);
} else if(postType == PostDataSource.TYPE_SEARCH) {
- postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, query, postType, sortType, onPostFetchedCallback);
+ postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, query,
+ postType, sortType, filter, onPostFetchedCallback);
} else if(postType == PostDataSource.TYPE_SUBREDDIT) {
- postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback);
+ postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType,
+ sortType, filter, onPostFetchedCallback);
} else {
- postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback);
+ postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType,
+ filter, onPostFetchedCallback);
}
postDataSourceLiveData.postValue(postDataSource);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
index a5cd86ff..dce8680f 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
@@ -3,6 +3,7 @@ package ml.docilealligator.infinityforreddit;
import android.app.Activity;
import android.content.Context;
+import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
@@ -45,10 +46,13 @@ import retrofit2.Retrofit;
*/
public class PostFragment extends Fragment implements FragmentCommunicator {
- static final String EXTRA_SUBREDDIT_NAME = "EN";
+ static final String EXTRA_NAME = "EN";
+ static final String EXTRA_USER_NAME = "EN";
static final String EXTRA_QUERY = "EQ";
static final String EXTRA_POST_TYPE = "EPT";
static final String EXTRA_SORT_TYPE = "EST";
+ static final String EXTRA_FILTER = "EF";
+ static final int EXTRA_NO_FILTER = -1;
private static final String IS_IN_LAZY_MODE_STATE = "IILMS";
@@ -168,6 +172,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
int postType = getArguments().getInt(EXTRA_POST_TYPE);
String sortType = getArguments().getString(EXTRA_SORT_TYPE);
+ int filter = getArguments().getInt(EXTRA_FILTER);
String accessToken = activity.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE)
.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
@@ -175,13 +180,30 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
PostViewModel.Factory factory;
if(postType == PostDataSource.TYPE_SEARCH) {
- String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME);
+ String subredditName = getArguments().getString(EXTRA_NAME);
String query = getArguments().getString(EXTRA_QUERY);
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit,
- mSharedPreferences, postType, true, () -> mPostViewModel.retryLoadingMore());
+ mSharedPreferences, postType, true, new PostRecyclerViewAdapter.Callback() {
+ @Override
+ public void retryLoadingMore() {
+ mPostViewModel.retryLoadingMore();
+ }
+
+ @Override
+ public void typeChipClicked(int filter) {
+ Intent intent = new Intent(activity, FilteredPostsActivity.class);
+ intent.putExtra(FilteredPostsActivity.EXTRA_NAME, subredditName);
+ intent.putExtra(FilteredPostsActivity.EXTRA_QUERY, query);
+ intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_SORT_TYPE, sortType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_FILTER, filter);
+ startActivity(intent);
+ }
+ });
+
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
- getResources().getConfiguration().locale, subredditName, query, postType, sortType, new PostDataSource.OnPostFetchedCallback() {
+ getResources().getConfiguration().locale, subredditName, query, postType, sortType, filter, new PostDataSource.OnPostFetchedCallback() {
@Override
public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE);
@@ -196,14 +218,29 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}
});
} else if(postType == PostDataSource.TYPE_SUBREDDIT) {
- String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME);
+ String subredditName = getArguments().getString(EXTRA_NAME);
boolean displaySubredditName = subredditName.equals("popular") || subredditName.equals("all");
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit,
- mSharedPreferences, postType, displaySubredditName, () -> mPostViewModel.retryLoadingMore());
+ mSharedPreferences, postType, displaySubredditName, new PostRecyclerViewAdapter.Callback() {
+ @Override
+ public void retryLoadingMore() {
+ mPostViewModel.retryLoadingMore();
+ }
+
+ @Override
+ public void typeChipClicked(int filter) {
+ Intent intent = new Intent(activity, FilteredPostsActivity.class);
+ intent.putExtra(FilteredPostsActivity.EXTRA_NAME, subredditName);
+ intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_SORT_TYPE, sortType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_FILTER, filter);
+ startActivity(intent);
+ }
+ });
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
- getResources().getConfiguration().locale, subredditName, postType, sortType, new PostDataSource.OnPostFetchedCallback() {
+ getResources().getConfiguration().locale, subredditName, postType, sortType, filter, new PostDataSource.OnPostFetchedCallback() {
@Override
public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE);
@@ -222,13 +259,28 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
mFetchPostInfoLinearLayout.setLayoutParams(params);
- String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME);
+ String username = getArguments().getString(EXTRA_USER_NAME);
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit,
- mSharedPreferences, postType, true, () -> mPostViewModel.retryLoadingMore());
+ mSharedPreferences, postType, true, new PostRecyclerViewAdapter.Callback() {
+ @Override
+ public void retryLoadingMore() {
+ mPostViewModel.retryLoadingMore();
+ }
+
+ @Override
+ public void typeChipClicked(int filter) {
+ Intent intent = new Intent(activity, FilteredPostsActivity.class);
+ intent.putExtra(FilteredPostsActivity.EXTRA_NAME, username);
+ intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_SORT_TYPE, sortType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_FILTER, filter);
+ startActivity(intent);
+ }
+ });
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
- getResources().getConfiguration().locale, subredditName, postType, sortType,
+ getResources().getConfiguration().locale, username, postType, sortType, filter,
new PostDataSource.OnPostFetchedCallback() {
@Override
public void hasPost() {
@@ -245,10 +297,25 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
});
} else {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit,
- mSharedPreferences, postType, true, () -> mPostViewModel.retryLoadingMore());
+ mSharedPreferences, postType, true, new PostRecyclerViewAdapter.Callback() {
+ @Override
+ public void retryLoadingMore() {
+ mPostViewModel.retryLoadingMore();
+ }
+
+ @Override
+ public void typeChipClicked(int filter) {
+ Intent intent = new Intent(activity, FilteredPostsActivity.class);
+ intent.putExtra(FilteredPostsActivity.EXTRA_NAME, activity.getString(R.string.best));
+ intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_SORT_TYPE, sortType);
+ intent.putExtra(FilteredPostsActivity.EXTRA_FILTER, filter);
+ startActivity(intent);
+ }
+ });
factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
- getResources().getConfiguration().locale, postType, sortType, new PostDataSource.OnPostFetchedCallback() {
+ getResources().getConfiguration().locale, postType, sortType, filter, new PostDataSource.OnPostFetchedCallback() {
@Override
public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java
index e5c8a896..43db7760 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java
@@ -73,15 +73,16 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
private static final int VIEW_TYPE_LOADING = 2;
private NetworkState networkState;
- private RetryLoadingMoreCallback retryLoadingMoreCallback;
+ private Callback callback;
- interface RetryLoadingMoreCallback {
+ interface Callback {
void retryLoadingMore();
+ void typeChipClicked(int filter);
}
PostRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, Retrofit retrofit,
- SharedPreferences sharedPreferences, int postType, boolean displaySubredditName,
- RetryLoadingMoreCallback retryLoadingMoreCallback) {
+ SharedPreferences sharedPreferences, int postType,
+ boolean displaySubredditName, Callback callback) {
super(DIFF_CALLBACK);
if(context != null) {
mContext = context;
@@ -93,7 +94,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
glide = Glide.with(mContext.getApplicationContext());
subredditDao = SubredditRoomDatabase.getDatabase(mContext.getApplicationContext()).subredditDao();
userDao = UserRoomDatabase.getDatabase(mContext.getApplicationContext()).userDao();
- this.retryLoadingMoreCallback = retryLoadingMoreCallback;
+ this.callback = callback;
}
}
@@ -360,9 +361,11 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
((DataViewHolder) holder).crosspostImageView.setVisibility(View.VISIBLE);
}
+ ((DataViewHolder) holder).typeChip.setOnClickListener(view -> callback.typeChipClicked(post.getPostType()));
+
switch (post.getPostType()) {
case Post.IMAGE_TYPE:
- ((DataViewHolder) holder).typeChip.setText("IMAGE");
+ ((DataViewHolder) holder).typeChip.setText(R.string.image);
final String imageUrl = post.getUrl();
((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@@ -375,7 +378,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
});
break;
case Post.LINK_TYPE:
- ((DataViewHolder) holder).typeChip.setText("LINK");
+ ((DataViewHolder) holder).typeChip.setText(R.string.link);
((DataViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
String domain = Uri.parse(post.getUrl()).getHost();
((DataViewHolder) holder).linkTextView.setText(domain);
@@ -390,7 +393,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
});
break;
case Post.GIF_VIDEO_TYPE:
- ((DataViewHolder) holder).typeChip.setText("GIF");
+ ((DataViewHolder) holder).typeChip.setText(R.string.gif);
final Uri gifVideoUri = Uri.parse(post.getVideoUrl());
((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@@ -408,7 +411,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
});
break;
case Post.VIDEO_TYPE:
- ((DataViewHolder) holder).typeChip.setText("VIDEO");
+ ((DataViewHolder) holder).typeChip.setText(R.string.video);
final Uri videoUri = Uri.parse(post.getVideoUrl());
((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@@ -426,7 +429,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
});
break;
case Post.NO_PREVIEW_LINK_TYPE:
- ((DataViewHolder) holder).typeChip.setText("LINK");
+ ((DataViewHolder) holder).typeChip.setText(R.string.link);
String noPreviewLinkUrl = post.getUrl();
((DataViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
String noPreviewLinkDomain = Uri.parse(noPreviewLinkUrl).getHost();
@@ -442,7 +445,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
});
break;
case Post.TEXT_TYPE:
- ((DataViewHolder) holder).typeChip.setText("TEXT");
+ ((DataViewHolder) holder).typeChip.setText(R.string.text);
break;
}
@@ -692,7 +695,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
super(itemView);
ButterKnife.bind(this, itemView);
errorTextView.setText(R.string.load_posts_error);
- retryButton.setOnClickListener(view -> retryLoadingMoreCallback.retryLoadingMore());
+ retryButton.setOnClickListener(view -> callback.retryLoadingMore());
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java
index c824567f..7986d459 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostViewModel.java
@@ -22,8 +22,8 @@ public class PostViewModel extends ViewModel {
private MutableLiveData<String> sortTypeLiveData;
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
- PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
- postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback);
+ int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, sortType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
(Function<PostDataSource, LiveData<NetworkState>>) PostDataSource::getInitialLoadStateLiveData);
@@ -46,8 +46,9 @@ public class PostViewModel extends ViewModel {
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
- String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
- postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback);
+ String sortType, int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
+ postType, sortType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
(Function<PostDataSource, LiveData<NetworkState>>) PostDataSource::getInitialLoadStateLiveData);
@@ -70,8 +71,9 @@ public class PostViewModel extends ViewModel {
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
- PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
- postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback);
+ int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
+ postType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
dataSource -> dataSource.getInitialLoadStateLiveData());
@@ -88,9 +90,9 @@ public class PostViewModel extends ViewModel {
}
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
- int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int postType, String sortType, int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
- query, postType, sortType, onPostFetchedCallback);
+ query, postType, sortType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
dataSource -> dataSource.getInitialLoadStateLiveData());
@@ -148,41 +150,45 @@ public class PostViewModel extends ViewModel {
private String query;
private int postType;
private String sortType;
+ private int filter;
private PostDataSource.OnPostFetchedCallback onPostFetchedCallback;
public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
- PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
- String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ String sortType, int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
this.subredditName = subredditName;
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
- PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
this.subredditName = subredditName;
this.postType = postType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query,
- int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
+ int postType, String sortType, int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit;
this.accessToken = accessToken;
this.locale = locale;
@@ -190,6 +196,7 @@ public class PostViewModel extends ViewModel {
this.query = query;
this.postType = postType;
this.sortType = sortType;
+ this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback;
}
@@ -197,13 +204,13 @@ 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, locale, postType, sortType, onPostFetchedCallback);
+ return (T) new PostViewModel(retrofit, accessToken, locale, postType, sortType, filter, onPostFetchedCallback);
} else if(postType == PostDataSource.TYPE_SEARCH){
- return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query, postType, sortType, onPostFetchedCallback);
+ return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, query, postType, sortType, filter, onPostFetchedCallback);
} else if(postType == PostDataSource.TYPE_SUBREDDIT) {
- return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback);
+ return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, sortType, filter, onPostFetchedCallback);
} else {
- return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback);
+ return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, filter, onPostFetchedCallback);
}
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java
index c8010021..27ee7708 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java
@@ -102,6 +102,7 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos
return true;
case R.id.action_search_search_result_activity:
Intent intent = new Intent(this, SearchActivity.class);
+ intent.putExtra(SearchActivity.EXTRA_SEARCH_ONLY_SUBREDDITS, false);
finish();
startActivity(intent);
return true;
@@ -141,8 +142,9 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos
Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SEARCH);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_RELEVANCE);
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, mSubredditName);
+ bundle.putString(PostFragment.EXTRA_NAME, mSubredditName);
bundle.putString(PostFragment.EXTRA_QUERY, mQuery);
+ bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
mFragment.setArguments(bundle);
return mFragment;
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java
index e8029bf9..51003eae 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java
@@ -3,6 +3,7 @@ package ml.docilealligator.infinityforreddit;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
+import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
@@ -59,6 +60,15 @@ public class SearchSubredditsResultActivity extends AppCompatActivity {
}
@Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if(item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
if (mFragment != null) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java
index 4b9a0984..6b7c67e9 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java
@@ -259,9 +259,10 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So
if(savedInstanceState == null) {
mFragment = new PostFragment();
Bundle bundle = new Bundle();
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName);
+ bundle.putString(PostFragment.EXTRA_NAME, subredditName);
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
+ bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
mFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
} else {
@@ -269,9 +270,10 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So
if(mFragment == null) {
mFragment = new PostFragment();
Bundle bundle = new Bundle();
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, subredditName);
+ bundle.putString(PostFragment.EXTRA_NAME, subredditName);
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
+ bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
mFragment.setArguments(bundle);
}
isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java
index 47c4faee..d7799bfa 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java
@@ -70,7 +70,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
private Menu mMenu;
private AppBarLayout.LayoutParams params;
- private String userName;
+ private String username;
private boolean subscriptionReady = false;
private boolean isInLazyMode = false;
private int expandedTabTextColor;
@@ -110,8 +110,8 @@ public class ViewUserDetailActivity extends AppCompatActivity {
statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
- userName = getIntent().getExtras().getString(EXTRA_USER_NAME_KEY);
- String title = "u/" + userName;
+ username = getIntent().getExtras().getString(EXTRA_USER_NAME_KEY);
+ String title = "u/" + username;
userNameTextView.setText(title);
Toolbar toolbar = findViewById(R.id.toolbar);
@@ -152,7 +152,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
subscribedUserDao = SubscribedUserRoomDatabase.getDatabase(this).subscribedUserDao();
glide = Glide.with(this);
- userViewModel = ViewModelProviders.of(this, new UserViewModel.Factory(getApplication(), userName))
+ userViewModel = ViewModelProviders.of(this, new UserViewModel.Factory(getApplication(), username))
.get(UserViewModel.class);
userViewModel.getUserLiveData().observe(this, userData -> {
if(userData != null) {
@@ -166,7 +166,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
Intent intent = new Intent(this, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getBanner());
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, userName + "-banner");
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-banner");
startActivity(intent);
});
}
@@ -189,7 +189,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
Intent intent = new Intent(this, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getIconUrl());
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, userName + "-icon");
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-icon");
startActivity(intent);
});
}
@@ -201,7 +201,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
subscriptionReady = false;
if(subscribeUserChip.getText().equals(getResources().getString(R.string.follow))) {
UserFollowing.followUser(mOauthRetrofit, mRetrofit, sharedPreferences,
- userName, subscribedUserDao, new UserFollowing.UserFollowingListener() {
+ username, subscribedUserDao, new UserFollowing.UserFollowingListener() {
@Override
public void onUserFollowingSuccess() {
subscribeUserChip.setText(R.string.unfollow);
@@ -218,7 +218,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
});
} else {
UserFollowing.unfollowUser(mOauthRetrofit, mRetrofit, sharedPreferences,
- userName, subscribedUserDao, new UserFollowing.UserFollowingListener() {
+ username, subscribedUserDao, new UserFollowing.UserFollowingListener() {
@Override
public void onUserFollowingSuccess() {
subscribeUserChip.setText(R.string.follow);
@@ -237,7 +237,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
}
});
- new CheckIsFollowingUserAsyncTask(subscribedUserDao, userName, new CheckIsFollowingUserAsyncTask.CheckIsFollowingUserListener() {
+ new CheckIsFollowingUserAsyncTask(subscribedUserDao, username, new CheckIsFollowingUserAsyncTask.CheckIsFollowingUserListener() {
@Override
public void isSubscribed() {
subscribeUserChip.setText(R.string.unfollow);
@@ -266,7 +266,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
}
});
- FetchUserData.fetchUserData(mRetrofit, userName, new FetchUserData.FetchUserDataListener() {
+ FetchUserData.fetchUserData(mRetrofit, username, new FetchUserData.FetchUserDataListener() {
@Override
public void onFetchUserDataSuccess(UserData userData) {
new InsertUserDataAsyncTask(UserRoomDatabase.getDatabase(ViewUserDetailActivity.this).userDao(), userData).execute();
@@ -281,7 +281,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
if(savedInstanceState == null) {
/*mFragment = new PostFragment();
Bundle bundle = new Bundle();
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, userName);
+ bundle.putString(PostFragment.EXTRA_NAME, username);
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER);
mFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_user_detail_activity, mFragment).commit();*/
@@ -290,7 +290,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
if(mFragment == null) {
mFragment = new PostFragment();
Bundle bundle = new Bundle();
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, userName);
+ bundle.putString(PostFragment.EXTRA_NAME, username);
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER);
mFragment.setArguments(bundle);
}*/
@@ -326,7 +326,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
return true;
case R.id.action_search_view_user_detail_activity:
Intent intent = new Intent(this, SearchActivity.class);
- intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, userName);
+ intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, username);
intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_IS_USER, true);
intent.putExtra(SearchActivity.EXTRA_SEARCH_ONLY_SUBREDDITS, false);
startActivity(intent);
@@ -440,13 +440,14 @@ public class ViewUserDetailActivity extends AppCompatActivity {
PostFragment fragment = new PostFragment();
Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER);
- bundle.putString(PostFragment.EXTRA_SUBREDDIT_NAME, userName);
+ bundle.putString(PostFragment.EXTRA_USER_NAME, username);
+ bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
fragment.setArguments(bundle);
return fragment;
}
CommentsListingFragment fragment = new CommentsListingFragment();
Bundle bundle = new Bundle();
- bundle.putString(CommentsListingFragment.EXTRA_USERNAME_KEY, userName);
+ bundle.putString(CommentsListingFragment.EXTRA_USERNAME_KEY, username);
fragment.setArguments(bundle);
return fragment;
}