Filtering posts to specific type when the type chip is clicked in posts. Minor bugs fixed related to PostDataSource to continue loading posts.

This commit is contained in:
Alex Ning 2019-08-05 15:28:53 +08:00
parent 0d1fcecde6
commit 199690355b
20 changed files with 471 additions and 161 deletions

Binary file not shown.

Binary file not shown.

View File

@ -19,6 +19,10 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"> android:usesCleartextTraffic="true">
<activity
android:name=".FilteredPostsActivity"
android:parentActivityName=".MainActivity"
android:theme="@style/AppTheme.NoActionBar" />
<activity <activity
android:name=".SearchSubredditsResultActivity" android:name=".SearchSubredditsResultActivity"
android:label="@string/search_subreddits_activity_label" android:label="@string/search_subreddits_activity_label"
@ -74,8 +78,8 @@
android:name=".PostTextActivity" android:name=".PostTextActivity"
android:label="@string/post_text_activity_label" android:label="@string/post_text_activity_label"
android:parentActivityName=".MainActivity" android:parentActivityName=".MainActivity"
android:windowSoftInputMode="adjustResize" android:theme="@style/AppTheme.NoActionBar"
android:theme="@style/AppTheme.NoActionBar" /> android:windowSoftInputMode="adjustResize" />
<activity <activity
android:name=".CommentActivity" android:name=".CommentActivity"
android:label="@string/comment_activity_label" android:label="@string/comment_activity_label"

View File

@ -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);
}
}
}

View File

@ -389,22 +389,25 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
fragment.setArguments(bundle); fragment.setArguments(bundle);
return fragment; return fragment;
} else if(position == 1) { } else if(position == 1) {
PostFragment fragment = new PostFragment(); PostFragment fragment = new PostFragment();
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT); 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.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_HOT);
bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
fragment.setArguments(bundle); fragment.setArguments(bundle);
return fragment; return fragment;
} else { } else {
PostFragment fragment = new PostFragment(); PostFragment fragment = new PostFragment();
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT); 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.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_HOT);
bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
fragment.setArguments(bundle); fragment.setArguments(bundle);
return fragment; return fragment;
} }

View File

@ -28,8 +28,8 @@ class ParsePost {
void onParsePostFail(); void onParsePostFail();
} }
static void parsePosts(String response, Locale locale, int nPosts, ParsePostsListingListener parsePostsListingListener) { static void parsePosts(String response, Locale locale, int nPosts, int filter, ParsePostsListingListener parsePostsListingListener) {
new ParsePostDataAsyncTask(response, locale, nPosts, parsePostsListingListener).execute(); new ParsePostDataAsyncTask(response, locale, nPosts, filter, parsePostsListingListener).execute();
} }
static void parsePost(String response, Locale locale, ParsePostListener parsePostListener) { static void parsePost(String response, Locale locale, ParsePostListener parsePostListener) {
@ -40,6 +40,7 @@ class ParsePost {
private JSONArray allData; private JSONArray allData;
private Locale locale; private Locale locale;
private int nPosts; private int nPosts;
private int filter;
private ParsePostsListingListener parsePostsListingListener; private ParsePostsListingListener parsePostsListingListener;
private ParsePostListener parsePostListener; private ParsePostListener parsePostListener;
private ArrayList<Post> newPosts; private ArrayList<Post> newPosts;
@ -47,7 +48,7 @@ class ParsePost {
private String lastItem; private String lastItem;
private boolean parseFailed; private boolean parseFailed;
ParsePostDataAsyncTask(String response, Locale locale, int nPosts, ParsePostDataAsyncTask(String response, Locale locale, int nPosts, int filter,
ParsePostsListingListener parsePostsListingListener) { ParsePostsListingListener parsePostsListingListener) {
this.parsePostsListingListener = parsePostsListingListener; this.parsePostsListingListener = parsePostsListingListener;
try { try {
@ -56,6 +57,7 @@ class ParsePost {
lastItem = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY); lastItem = jsonResponse.getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.AFTER_KEY);
this.locale = locale; this.locale = locale;
this.nPosts = nPosts; this.nPosts = nPosts;
this.filter = filter;
newPosts = new ArrayList<>(); newPosts = new ArrayList<>();
parseFailed = false; parseFailed = false;
} catch (JSONException e) { } catch (JSONException e) {
@ -104,7 +106,14 @@ class ParsePost {
for(int i = 0; i < size; i++) { for(int i = 0; i < size; i++) {
JSONObject data = allData.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY); 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) { } catch (JSONException e) {
@ -192,7 +201,8 @@ class ParsePost {
String subredditNamePrefixed, String author, String formattedPostTime, String subredditNamePrefixed, String author, String formattedPostTime,
String title, String previewUrl, int previewWidth, int previewHeight, String title, String previewUrl, int previewWidth, int previewHeight,
int score, int voteType, int gilded, String flair, boolean spoiler, 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; Post post;
boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY); boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY);

View File

@ -54,7 +54,7 @@ class ParseSubredditData {
JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY); JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY);
mNCurrentOnlineSubscribers = data.getInt(JSONUtils.ACTIVE_USER_COUNT_KEY); mNCurrentOnlineSubscribers = data.getInt(JSONUtils.ACTIVE_USER_COUNT_KEY);
subredditData = parseSubredditData(data); 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 subredditFullName = data.getString(JSONUtils.DISPLAY_NAME);
String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim(); String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();

View File

@ -37,10 +37,11 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private Retrofit retrofit; private Retrofit retrofit;
private String accessToken; private String accessToken;
private Locale locale; private Locale locale;
private String subredditName; private String subredditOrUserName;
private String query; private String query;
private int postType; private int postType;
private String sortType; private String sortType;
private int filter;
private OnPostFetchedCallback onPostFetchedCallback; private OnPostFetchedCallback onPostFetchedCallback;
private MutableLiveData<NetworkState> paginationNetworkStateLiveData; private MutableLiveData<NetworkState> paginationNetworkStateLiveData;
@ -52,7 +53,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private LoadCallback<String, Post> callback; private LoadCallback<String, Post> callback;
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, PostDataSource(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
OnPostFetchedCallback onPostFetchedCallback) { int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
@ -60,45 +61,49 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
initialLoadStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData();
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, int postType,
String sortType, OnPostFetchedCallback onPostFetchedCallback) { String sortType, int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.subredditName = subredditName; this.subredditOrUserName = subredditOrUserName;
paginationNetworkStateLiveData = new MutableLiveData(); paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData();
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, int postType,
OnPostFetchedCallback onPostFetchedCallback) { int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.subredditName = subredditName; this.subredditOrUserName = subredditOrUserName;
paginationNetworkStateLiveData = new MutableLiveData(); paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData();
this.postType = postType; this.postType = postType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query, PostDataSource(Retrofit retrofit, String accessToken, Locale locale, String subredditOrUserName, String query,
int postType, String sortType, OnPostFetchedCallback onPostFetchedCallback) { int postType, String sortType, int filter, OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.subredditName = subredditName; this.subredditOrUserName = subredditOrUserName;
this.query = query; this.query = query;
paginationNetworkStateLiveData = new MutableLiveData(); paginationNetworkStateLiveData = new MutableLiveData();
initialLoadStateLiveData = new MutableLiveData(); initialLoadStateLiveData = new MutableLiveData();
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
@ -119,16 +124,16 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
switch (postType) { switch (postType) {
case TYPE_FRONT_PAGE: case TYPE_FRONT_PAGE:
loadBestPostsInitial(callback); loadBestPostsInitial(callback, null);
break; break;
case TYPE_SUBREDDIT: case TYPE_SUBREDDIT:
loadSubredditPostsInitial(callback); loadSubredditPostsInitial(callback, null);
break; break;
case TYPE_USER: case TYPE_USER:
loadUserPostsInitial(callback, null); loadUserPostsInitial(callback, null);
break; break;
case TYPE_SEARCH: case TYPE_SEARCH:
loadSearchPostsInitial(callback); loadSearchPostsInitial(callback, null);
break; break;
} }
} }
@ -143,7 +148,7 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
this.params = params; this.params = params;
this.callback = callback; this.callback = callback;
if(params.key.equals("null")) { if(params.key.equals("") || params.key.equals("null")) {
return; return;
} }
@ -151,24 +156,24 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
switch (postType) { switch (postType) {
case TYPE_FRONT_PAGE: case TYPE_FRONT_PAGE:
loadBestPostsAfter(params, callback); loadBestPostsAfter(params, callback, null);
break; break;
case TYPE_SUBREDDIT: case TYPE_SUBREDDIT:
loadSubredditPostsAfter(params, callback); loadSubredditPostsAfter(params, callback, null);
break; break;
case TYPE_USER: case TYPE_USER:
loadUserPostsAfter(params, callback, null); loadUserPostsAfter(params, callback, null);
break; break;
case TYPE_SEARCH: case TYPE_SEARCH:
loadSearchPostsAfter(params, callback); loadSearchPostsAfter(params, callback, null);
break; 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); 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>() { bestPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
@ -191,21 +196,27 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
}); });
} else { } else {
ParsePost.parsePosts(response.body(), locale, -1, ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() { new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0) { String nextPageKey;
onPostFetchedCallback.noPost(); if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
} else { } else {
onPostFetchedCallback.hasPost(); nextPageKey = lastItem;
} }
if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { if(newPosts.size() != 0) {
callback.onResult(newPosts, null, null); onPostFetchedCallback.hasPost();
} else if(nextPageKey != null) {
loadBestPostsInitial(callback, nextPageKey);
return;
} else { } else {
callback.onResult(newPosts, null, lastItem); onPostFetchedCallback.noPost();
} }
callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED); 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); 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>() { bestPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
callback.onResult(newPosts, null); loadBestPostsAfter(params, callback, lastItem);
} else { } else {
callback.onResult(newPosts, lastItem); callback.onResult(newPosts, lastItem);
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
} }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
} }
@Override @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); 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>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
@ -294,21 +307,27 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
} }
}); });
} else { } else {
ParsePost.parsePosts(response.body(), locale, -1, ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() { new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0) { String nextPageKey;
onPostFetchedCallback.noPost(); if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
} else { } else {
onPostFetchedCallback.hasPost(); nextPageKey = lastItem;
} }
if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { if(newPosts.size() != 0) {
callback.onResult(newPosts, null, null); onPostFetchedCallback.hasPost();
} else if(nextPageKey != null) {
loadSubredditPostsInitial(callback, nextPageKey);
return;
} else { } else {
callback.onResult(newPosts, null, lastItem); onPostFetchedCallback.noPost();
} }
callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED); 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); 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>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
callback.onResult(newPosts, null); loadSubredditPostsAfter(params, callback, lastItem);
} else { } else {
callback.onResult(newPosts, lastItem); callback.onResult(newPosts, lastItem);
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
} }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
} }
@Override @Override
@ -373,26 +394,32 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
private void loadUserPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback, String lastItem) { private void loadUserPostsInitial(@NonNull final LoadInitialCallback<String, Post> callback, String lastItem) {
RedditAPI api = retrofit.create(RedditAPI.class); 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>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() { new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0) { String nextPageKey;
onPostFetchedCallback.noPost(); if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
} else { } else {
onPostFetchedCallback.hasPost(); nextPageKey = lastItem;
} }
if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { if(newPosts.size() != 0) {
callback.onResult(newPosts, null, null); onPostFetchedCallback.hasPost();
} else if(nextPageKey != null) {
loadUserPostsInitial(callback, nextPageKey);
return;
} else { } else {
callback.onResult(newPosts, null, lastItem); onPostFetchedCallback.noPost();
} }
callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED); initialLoadStateLiveData.postValue(NetworkState.LOADED);
} }
@ -420,15 +447,15 @@ class PostDataSource extends PageKeyedDataSource<String, Post> {
String after = lastItem == null ? params.key : lastItem; String after = lastItem == null ? params.key : lastItem;
RedditAPI api = retrofit.create(RedditAPI.class); 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>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { 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); loadUserPostsAfter(params, callback, lastItem);
} else { } else {
callback.onResult(newPosts, lastItem); 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); RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> getPost; Call<String> getPost;
if(subredditName == null) { if(subredditOrUserName == null) {
getPost = api.searchPosts(query, null, sortType, RedditUtils.getOAuthHeader(accessToken)); getPost = api.searchPosts(query, null, sortType, RedditUtils.getOAuthHeader(accessToken));
} else { } else {
getPost = api.searchPostsInSpecificSubreddit(subredditName, query, null, RedditUtils.getOAuthHeader(accessToken)); getPost = api.searchPostsInSpecificSubreddit(subredditOrUserName, query, null, RedditUtils.getOAuthHeader(accessToken));
} }
getPost.enqueue(new Callback<String>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, ParsePost.parsePosts(response.body(), locale, -1, filter,
new ParsePost.ParsePostsListingListener() { new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(newPosts.size() == 0) { String nextPageKey;
onPostFetchedCallback.noPost(); if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) {
nextPageKey = null;
} else { } else {
onPostFetchedCallback.hasPost(); nextPageKey = lastItem;
} }
callback.onResult(newPosts, null, lastItem); if(newPosts.size() != 0) {
onPostFetchedCallback.hasPost();
} else if(nextPageKey != null) {
loadSearchPostsInitial(callback, nextPageKey);
return;
} else {
onPostFetchedCallback.noPost();
}
callback.onResult(newPosts, null, nextPageKey);
initialLoadStateLiveData.postValue(NetworkState.LOADED); 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); RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> getPost; Call<String> getPost;
if(subredditName == null) { if(subredditOrUserName == null) {
getPost = api.searchPosts(query, params.key, sortType, RedditUtils.getOAuthHeader(accessToken)); getPost = api.searchPosts(query, after, sortType, RedditUtils.getOAuthHeader(accessToken));
} else { } 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>() { getPost.enqueue(new Callback<String>() {
@Override @Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
ParsePost.parsePosts(response.body(), locale, -1, new ParsePost.ParsePostsListingListener() { ParsePost.parsePosts(response.body(), locale, -1, filter, new ParsePost.ParsePostsListingListener() {
@Override @Override
public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) { public void onParsePostsListingSuccess(ArrayList<Post> newPosts, String lastItem) {
if(lastItem == null || lastItem.equals("") || lastItem.equals("null")) { if(newPosts.size() == 0 && lastItem != null && !lastItem.equals("") && !lastItem.equals("null")) {
callback.onResult(newPosts, null); loadSearchPostsAfter(params, callback, lastItem);
} else { } else {
callback.onResult(newPosts, lastItem); callback.onResult(newPosts, lastItem);
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
} }
paginationNetworkStateLiveData.postValue(NetworkState.LOADED);
} }
@Override @Override

View File

@ -15,47 +15,54 @@ class PostDataSourceFactory extends DataSource.Factory {
private String query; private String query;
private int postType; private int postType;
private String sortType; private String sortType;
private int filter;
private PostDataSource.OnPostFetchedCallback onPostFetchedCallback; private PostDataSource.OnPostFetchedCallback onPostFetchedCallback;
private PostDataSource postDataSource; private PostDataSource postDataSource;
private MutableLiveData<PostDataSource> postDataSourceLiveData; private MutableLiveData<PostDataSource> postDataSourceLiveData;
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
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, int filter,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.subredditName = subredditName;
postDataSourceLiveData = new MutableLiveData<>(); postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { int postType, int filter,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.subredditName = subredditName; this.subredditName = subredditName;
postDataSourceLiveData = new MutableLiveData<>(); postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
int postType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { String query, int postType, String sortType, int filter,
this.retrofit = retrofit; PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.accessToken = accessToken;
this.locale = locale;
this.subredditName = subredditName;
postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType;
this.onPostFetchedCallback = onPostFetchedCallback;
}
PostDataSourceFactory(Retrofit retrofit, String accessToken, Locale locale, String subredditName,
String query, int postType, String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
@ -64,19 +71,24 @@ class PostDataSourceFactory extends DataSource.Factory {
postDataSourceLiveData = new MutableLiveData<>(); postDataSourceLiveData = new MutableLiveData<>();
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
@Override @Override
public DataSource create() { public DataSource create() {
if(postType == PostDataSource.TYPE_FRONT_PAGE) { 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) { } 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) { } 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 { } else {
postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback); postDataSource = new PostDataSource(retrofit, accessToken, locale, subredditName, postType,
filter, onPostFetchedCallback);
} }
postDataSourceLiveData.postValue(postDataSource); postDataSourceLiveData.postValue(postDataSource);

View File

@ -3,6 +3,7 @@ package ml.docilealligator.infinityforreddit;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.os.CountDownTimer; import android.os.CountDownTimer;
@ -45,10 +46,13 @@ import retrofit2.Retrofit;
*/ */
public class PostFragment extends Fragment implements FragmentCommunicator { 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_QUERY = "EQ";
static final String EXTRA_POST_TYPE = "EPT"; static final String EXTRA_POST_TYPE = "EPT";
static final String EXTRA_SORT_TYPE = "EST"; 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"; 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); int postType = getArguments().getInt(EXTRA_POST_TYPE);
String sortType = getArguments().getString(EXTRA_SORT_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) String accessToken = activity.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE)
.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); .getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
@ -175,13 +180,30 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
PostViewModel.Factory factory; PostViewModel.Factory factory;
if(postType == PostDataSource.TYPE_SEARCH) { if(postType == PostDataSource.TYPE_SEARCH) {
String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME); String subredditName = getArguments().getString(EXTRA_NAME);
String query = getArguments().getString(EXTRA_QUERY); String query = getArguments().getString(EXTRA_QUERY);
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, 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, 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 @Override
public void hasPost() { public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE); mFetchPostInfoLinearLayout.setVisibility(View.GONE);
@ -196,14 +218,29 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
} }
}); });
} else if(postType == PostDataSource.TYPE_SUBREDDIT) { } 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"); boolean displaySubredditName = subredditName.equals("popular") || subredditName.equals("all");
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, 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, 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 @Override
public void hasPost() { public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE); mFetchPostInfoLinearLayout.setVisibility(View.GONE);
@ -222,13 +259,28 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
params.height = ViewGroup.LayoutParams.WRAP_CONTENT; params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
mFetchPostInfoLinearLayout.setLayoutParams(params); mFetchPostInfoLinearLayout.setLayoutParams(params);
String subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME); String username = getArguments().getString(EXTRA_USER_NAME);
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, 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, factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
getResources().getConfiguration().locale, subredditName, postType, sortType, getResources().getConfiguration().locale, username, postType, sortType, filter,
new PostDataSource.OnPostFetchedCallback() { new PostDataSource.OnPostFetchedCallback() {
@Override @Override
public void hasPost() { public void hasPost() {
@ -245,10 +297,25 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}); });
} else { } else {
mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, 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, factory = new PostViewModel.Factory(mOauthRetrofit, accessToken,
getResources().getConfiguration().locale, postType, sortType, new PostDataSource.OnPostFetchedCallback() { getResources().getConfiguration().locale, postType, sortType, filter, new PostDataSource.OnPostFetchedCallback() {
@Override @Override
public void hasPost() { public void hasPost() {
mFetchPostInfoLinearLayout.setVisibility(View.GONE); mFetchPostInfoLinearLayout.setVisibility(View.GONE);

View File

@ -73,15 +73,16 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
private static final int VIEW_TYPE_LOADING = 2; private static final int VIEW_TYPE_LOADING = 2;
private NetworkState networkState; private NetworkState networkState;
private RetryLoadingMoreCallback retryLoadingMoreCallback; private Callback callback;
interface RetryLoadingMoreCallback { interface Callback {
void retryLoadingMore(); void retryLoadingMore();
void typeChipClicked(int filter);
} }
PostRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, Retrofit retrofit, PostRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, Retrofit retrofit,
SharedPreferences sharedPreferences, int postType, boolean displaySubredditName, SharedPreferences sharedPreferences, int postType,
RetryLoadingMoreCallback retryLoadingMoreCallback) { boolean displaySubredditName, Callback callback) {
super(DIFF_CALLBACK); super(DIFF_CALLBACK);
if(context != null) { if(context != null) {
mContext = context; mContext = context;
@ -93,7 +94,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
glide = Glide.with(mContext.getApplicationContext()); glide = Glide.with(mContext.getApplicationContext());
subredditDao = SubredditRoomDatabase.getDatabase(mContext.getApplicationContext()).subredditDao(); subredditDao = SubredditRoomDatabase.getDatabase(mContext.getApplicationContext()).subredditDao();
userDao = UserRoomDatabase.getDatabase(mContext.getApplicationContext()).userDao(); 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).crosspostImageView.setVisibility(View.VISIBLE);
} }
((DataViewHolder) holder).typeChip.setOnClickListener(view -> callback.typeChipClicked(post.getPostType()));
switch (post.getPostType()) { switch (post.getPostType()) {
case Post.IMAGE_TYPE: case Post.IMAGE_TYPE:
((DataViewHolder) holder).typeChip.setText("IMAGE"); ((DataViewHolder) holder).typeChip.setText(R.string.image);
final String imageUrl = post.getUrl(); final String imageUrl = post.getUrl();
((DataViewHolder) holder).imageView.setOnClickListener(view -> { ((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@ -375,7 +378,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
}); });
break; break;
case Post.LINK_TYPE: case Post.LINK_TYPE:
((DataViewHolder) holder).typeChip.setText("LINK"); ((DataViewHolder) holder).typeChip.setText(R.string.link);
((DataViewHolder) holder).linkTextView.setVisibility(View.VISIBLE); ((DataViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
String domain = Uri.parse(post.getUrl()).getHost(); String domain = Uri.parse(post.getUrl()).getHost();
((DataViewHolder) holder).linkTextView.setText(domain); ((DataViewHolder) holder).linkTextView.setText(domain);
@ -390,7 +393,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
}); });
break; break;
case Post.GIF_VIDEO_TYPE: case Post.GIF_VIDEO_TYPE:
((DataViewHolder) holder).typeChip.setText("GIF"); ((DataViewHolder) holder).typeChip.setText(R.string.gif);
final Uri gifVideoUri = Uri.parse(post.getVideoUrl()); final Uri gifVideoUri = Uri.parse(post.getVideoUrl());
((DataViewHolder) holder).imageView.setOnClickListener(view -> { ((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@ -408,7 +411,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
}); });
break; break;
case Post.VIDEO_TYPE: case Post.VIDEO_TYPE:
((DataViewHolder) holder).typeChip.setText("VIDEO"); ((DataViewHolder) holder).typeChip.setText(R.string.video);
final Uri videoUri = Uri.parse(post.getVideoUrl()); final Uri videoUri = Uri.parse(post.getVideoUrl());
((DataViewHolder) holder).imageView.setOnClickListener(view -> { ((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@ -426,7 +429,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
}); });
break; break;
case Post.NO_PREVIEW_LINK_TYPE: case Post.NO_PREVIEW_LINK_TYPE:
((DataViewHolder) holder).typeChip.setText("LINK"); ((DataViewHolder) holder).typeChip.setText(R.string.link);
String noPreviewLinkUrl = post.getUrl(); String noPreviewLinkUrl = post.getUrl();
((DataViewHolder) holder).linkTextView.setVisibility(View.VISIBLE); ((DataViewHolder) holder).linkTextView.setVisibility(View.VISIBLE);
String noPreviewLinkDomain = Uri.parse(noPreviewLinkUrl).getHost(); String noPreviewLinkDomain = Uri.parse(noPreviewLinkUrl).getHost();
@ -442,7 +445,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
}); });
break; break;
case Post.TEXT_TYPE: case Post.TEXT_TYPE:
((DataViewHolder) holder).typeChip.setText("TEXT"); ((DataViewHolder) holder).typeChip.setText(R.string.text);
break; break;
} }
@ -692,7 +695,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
super(itemView); super(itemView);
ButterKnife.bind(this, itemView); ButterKnife.bind(this, itemView);
errorTextView.setText(R.string.load_posts_error); errorTextView.setText(R.string.load_posts_error);
retryButton.setOnClickListener(view -> retryLoadingMoreCallback.retryLoadingMore()); retryButton.setOnClickListener(view -> callback.retryLoadingMore());
} }
} }

View File

@ -22,8 +22,8 @@ public class PostViewModel extends ViewModel {
private MutableLiveData<String> sortTypeLiveData; private MutableLiveData<String> sortTypeLiveData;
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, sortType, onPostFetchedCallback); postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, postType, sortType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
(Function<PostDataSource, LiveData<NetworkState>>) PostDataSource::getInitialLoadStateLiveData); (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, public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
String sortType, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { String sortType, int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, sortType, onPostFetchedCallback); postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
postType, sortType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
(Function<PostDataSource, LiveData<NetworkState>>) PostDataSource::getInitialLoadStateLiveData); (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, public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback); postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
postType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
dataSource -> dataSource.getInitialLoadStateLiveData()); dataSource -> dataSource.getInitialLoadStateLiveData());
@ -88,9 +90,9 @@ public class PostViewModel extends ViewModel {
} }
public PostViewModel(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query, 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, postDataSourceFactory = new PostDataSourceFactory(retrofit, accessToken, locale, subredditName,
query, postType, sortType, onPostFetchedCallback); query, postType, sortType, filter, onPostFetchedCallback);
initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(), initialLoadingState = Transformations.switchMap(postDataSourceFactory.getPostDataSourceLiveData(),
dataSource -> dataSource.getInitialLoadStateLiveData()); dataSource -> dataSource.getInitialLoadStateLiveData());
@ -148,41 +150,45 @@ public class PostViewModel extends ViewModel {
private String query; private String query;
private int postType; private int postType;
private String sortType; private String sortType;
private int filter;
private PostDataSource.OnPostFetchedCallback onPostFetchedCallback; private PostDataSource.OnPostFetchedCallback onPostFetchedCallback;
public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType, public Factory(Retrofit retrofit, String accessToken, Locale locale, int postType, String sortType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, 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.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.subredditName = subredditName; this.subredditName = subredditName;
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType, public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, int postType,
PostDataSource.OnPostFetchedCallback onPostFetchedCallback) { int filter, PostDataSource.OnPostFetchedCallback onPostFetchedCallback) {
this.retrofit = retrofit; this.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
this.subredditName = subredditName; this.subredditName = subredditName;
this.postType = postType; this.postType = postType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
public Factory(Retrofit retrofit, String accessToken, Locale locale, String subredditName, String query, 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.retrofit = retrofit;
this.accessToken = accessToken; this.accessToken = accessToken;
this.locale = locale; this.locale = locale;
@ -190,6 +196,7 @@ public class PostViewModel extends ViewModel {
this.query = query; this.query = query;
this.postType = postType; this.postType = postType;
this.sortType = sortType; this.sortType = sortType;
this.filter = filter;
this.onPostFetchedCallback = onPostFetchedCallback; this.onPostFetchedCallback = onPostFetchedCallback;
} }
@ -197,13 +204,13 @@ public class PostViewModel extends ViewModel {
@Override @Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) { public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if(postType == PostDataSource.TYPE_FRONT_PAGE) { 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){ } 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) { } 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 { } else {
return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, onPostFetchedCallback); return (T) new PostViewModel(retrofit, accessToken, locale, subredditName, postType, filter, onPostFetchedCallback);
} }
} }
} }

View File

@ -102,6 +102,7 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos
return true; return true;
case R.id.action_search_search_result_activity: case R.id.action_search_search_result_activity:
Intent intent = new Intent(this, SearchActivity.class); Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.EXTRA_SEARCH_ONLY_SUBREDDITS, false);
finish(); finish();
startActivity(intent); startActivity(intent);
return true; return true;
@ -141,8 +142,9 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SEARCH); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SEARCH);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_RELEVANCE); 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.putString(PostFragment.EXTRA_QUERY, mQuery);
bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
mFragment.setArguments(bundle); mFragment.setArguments(bundle);
return mFragment; return mFragment;
} }

View File

@ -3,6 +3,7 @@ package ml.docilealligator.infinityforreddit;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.MenuItem;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@ -58,6 +59,15 @@ public class SearchSubredditsResultActivity extends AppCompatActivity {
finish(); finish();
} }
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId() == android.R.id.home) {
finish();
return true;
}
return false;
}
@Override @Override
protected void onSaveInstanceState(@NonNull Bundle outState) { protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);

View File

@ -259,9 +259,10 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So
if(savedInstanceState == null) { if(savedInstanceState == null) {
mFragment = new PostFragment(); mFragment = new PostFragment();
Bundle bundle = new Bundle(); 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.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
mFragment.setArguments(bundle); mFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
} else { } else {
@ -269,9 +270,10 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So
if(mFragment == null) { if(mFragment == null) {
mFragment = new PostFragment(); mFragment = new PostFragment();
Bundle bundle = new Bundle(); 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.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT);
bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST);
bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER);
mFragment.setArguments(bundle); mFragment.setArguments(bundle);
} }
isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE);

View File

@ -70,7 +70,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
private Menu mMenu; private Menu mMenu;
private AppBarLayout.LayoutParams params; private AppBarLayout.LayoutParams params;
private String userName; private String username;
private boolean subscriptionReady = false; private boolean subscriptionReady = false;
private boolean isInLazyMode = false; private boolean isInLazyMode = false;
private int expandedTabTextColor; private int expandedTabTextColor;
@ -110,8 +110,8 @@ public class ViewUserDetailActivity extends AppCompatActivity {
statusBarHeight = getResources().getDimensionPixelSize(resourceId); statusBarHeight = getResources().getDimensionPixelSize(resourceId);
} }
userName = getIntent().getExtras().getString(EXTRA_USER_NAME_KEY); username = getIntent().getExtras().getString(EXTRA_USER_NAME_KEY);
String title = "u/" + userName; String title = "u/" + username;
userNameTextView.setText(title); userNameTextView.setText(title);
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = findViewById(R.id.toolbar);
@ -152,7 +152,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
subscribedUserDao = SubscribedUserRoomDatabase.getDatabase(this).subscribedUserDao(); subscribedUserDao = SubscribedUserRoomDatabase.getDatabase(this).subscribedUserDao();
glide = Glide.with(this); 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); .get(UserViewModel.class);
userViewModel.getUserLiveData().observe(this, userData -> { userViewModel.getUserLiveData().observe(this, userData -> {
if(userData != null) { if(userData != null) {
@ -166,7 +166,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
Intent intent = new Intent(this, ViewImageActivity.class); Intent intent = new Intent(this, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.TITLE_KEY, title); intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getBanner()); 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); startActivity(intent);
}); });
} }
@ -189,7 +189,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
Intent intent = new Intent(this, ViewImageActivity.class); Intent intent = new Intent(this, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.TITLE_KEY, title); intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getIconUrl()); 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); startActivity(intent);
}); });
} }
@ -201,7 +201,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
subscriptionReady = false; subscriptionReady = false;
if(subscribeUserChip.getText().equals(getResources().getString(R.string.follow))) { if(subscribeUserChip.getText().equals(getResources().getString(R.string.follow))) {
UserFollowing.followUser(mOauthRetrofit, mRetrofit, sharedPreferences, UserFollowing.followUser(mOauthRetrofit, mRetrofit, sharedPreferences,
userName, subscribedUserDao, new UserFollowing.UserFollowingListener() { username, subscribedUserDao, new UserFollowing.UserFollowingListener() {
@Override @Override
public void onUserFollowingSuccess() { public void onUserFollowingSuccess() {
subscribeUserChip.setText(R.string.unfollow); subscribeUserChip.setText(R.string.unfollow);
@ -218,7 +218,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
}); });
} else { } else {
UserFollowing.unfollowUser(mOauthRetrofit, mRetrofit, sharedPreferences, UserFollowing.unfollowUser(mOauthRetrofit, mRetrofit, sharedPreferences,
userName, subscribedUserDao, new UserFollowing.UserFollowingListener() { username, subscribedUserDao, new UserFollowing.UserFollowingListener() {
@Override @Override
public void onUserFollowingSuccess() { public void onUserFollowingSuccess() {
subscribeUserChip.setText(R.string.follow); 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 @Override
public void isSubscribed() { public void isSubscribed() {
subscribeUserChip.setText(R.string.unfollow); 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 @Override
public void onFetchUserDataSuccess(UserData userData) { public void onFetchUserDataSuccess(UserData userData) {
new InsertUserDataAsyncTask(UserRoomDatabase.getDatabase(ViewUserDetailActivity.this).userDao(), userData).execute(); new InsertUserDataAsyncTask(UserRoomDatabase.getDatabase(ViewUserDetailActivity.this).userDao(), userData).execute();
@ -281,7 +281,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
if(savedInstanceState == null) { if(savedInstanceState == null) {
/*mFragment = new PostFragment(); /*mFragment = new PostFragment();
Bundle bundle = new Bundle(); 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); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER);
mFragment.setArguments(bundle); mFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_user_detail_activity, mFragment).commit();*/ 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) { if(mFragment == null) {
mFragment = new PostFragment(); mFragment = new PostFragment();
Bundle bundle = new Bundle(); 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); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER);
mFragment.setArguments(bundle); mFragment.setArguments(bundle);
}*/ }*/
@ -326,7 +326,7 @@ public class ViewUserDetailActivity extends AppCompatActivity {
return true; return true;
case R.id.action_search_view_user_detail_activity: case R.id.action_search_view_user_detail_activity:
Intent intent = new Intent(this, SearchActivity.class); 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_SUBREDDIT_IS_USER, true);
intent.putExtra(SearchActivity.EXTRA_SEARCH_ONLY_SUBREDDITS, false); intent.putExtra(SearchActivity.EXTRA_SEARCH_ONLY_SUBREDDITS, false);
startActivity(intent); startActivity(intent);
@ -440,13 +440,14 @@ public class ViewUserDetailActivity extends AppCompatActivity {
PostFragment fragment = new PostFragment(); PostFragment fragment = new PostFragment();
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER); 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); fragment.setArguments(bundle);
return fragment; return fragment;
} }
CommentsListingFragment fragment = new CommentsListingFragment(); CommentsListingFragment fragment = new CommentsListingFragment();
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString(CommentsListingFragment.EXTRA_USERNAME_KEY, userName); bundle.putString(CommentsListingFragment.EXTRA_USERNAME_KEY, username);
fragment.setArguments(bundle); fragment.setArguments(bundle);
return fragment; return fragment;
} }

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FilteredPostsActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_filtered_posts_activity"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:navigationIcon="?attr/homeAsUpIndicator" />
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/frame_layout_filtered_posts_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -13,6 +13,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:background="@color/backgroundColor"
app:mlpb_progress_stoke_width="3dp" app:mlpb_progress_stoke_width="3dp"
app:mlpb_progress_color="@color/colorAccent" app:mlpb_progress_color="@color/colorAccent"
android:layout_gravity="center_horizontal"/> android:layout_gravity="center_horizontal"/>

View File

@ -13,6 +13,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:background="@color/backgroundColor"
app:mlpb_progress_stoke_width="3dp" app:mlpb_progress_stoke_width="3dp"
app:mlpb_progress_color="@color/colorAccent" app:mlpb_progress_color="@color/colorAccent"
android:layout_gravity="center_horizontal"/> android:layout_gravity="center_horizontal"/>

View File

@ -152,4 +152,12 @@
<string name="no_browser_found">No browser found</string> <string name="no_browser_found">No browser found</string>
<string name="archived_post_vote_unavailable">Archived post. Vote unavailable.</string> <string name="archived_post_vote_unavailable">Archived post. Vote unavailable.</string>
<string name="text">TEXT</string>
<string name="link">LINK</string>
<string name="image">IMAGE</string>
<string name="video">VIDEO</string>
<string name="gif">GIF</string>
<string name="best">Best</string>
<string name="search">Search</string>
</resources> </resources>