Skip to content

Commit d270378

Browse files
Searching posts inside a multireddit is available.
1 parent 7b9ece7 commit d270378

File tree

5 files changed

+163
-30
lines changed

5 files changed

+163
-30
lines changed

app/src/main/java/ml/docilealligator/infinityforreddit/activities/SearchResultActivity.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -804,8 +804,19 @@ public Fragment createFragment(int position) {
804804
private Fragment createPostFragment() {
805805
PostFragment mFragment = new PostFragment();
806806
Bundle bundle = new Bundle();
807-
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_SEARCH);
808-
bundle.putString(PostFragment.EXTRA_NAME, mSearchInThingType == SelectThingReturnKey.THING_TYPE.USER ? "u_" + mSearchInSubredditOrUserName : mSearchInSubredditOrUserName);
807+
switch (mSearchInThingType) {
808+
case SelectThingReturnKey.THING_TYPE.SUBREDDIT:
809+
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_SEARCH);
810+
bundle.putString(PostFragment.EXTRA_NAME, mSearchInSubredditOrUserName);
811+
break;
812+
case SelectThingReturnKey.THING_TYPE.USER:
813+
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_SEARCH);
814+
bundle.putString(PostFragment.EXTRA_NAME, "u_" + mSearchInSubredditOrUserName);
815+
break;
816+
case SelectThingReturnKey.THING_TYPE.MULTIREDDIT:
817+
bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_MULTI_REDDIT);
818+
bundle.putString(PostFragment.EXTRA_NAME, mSearchInMultiReddit.getPath());
819+
}
809820
bundle.putString(PostFragment.EXTRA_QUERY, mQuery);
810821
bundle.putString(PostFragment.EXTRA_TRENDING_SOURCE, getIntent().getStringExtra(EXTRA_TRENDING_SOURCE));
811822
mFragment.setArguments(bundle);

app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,27 @@ ListenableFuture<Response<String>> searchPostsInSpecificSubredditListenableFutur
320320

321321
@GET("{multipath}?raw_json=1&limit=100")
322322
ListenableFuture<Response<String>> getMultiRedditPostsListenableFuture(@Path(value = "multipath", encoded = true) String multiPath,
323+
@Path(value = "sortType", encoded = true) SortType.Type sortType,
323324
@Query("after") String after, @Query("t") SortType.Time sortTime);
324325

325-
@GET("{multipath}.json?raw_json=1&limit=100")
326+
@GET("{multipath}/{sortType}.json?raw_json=1&limit=100")
326327
ListenableFuture<Response<String>> getMultiRedditPostsOauthListenableFuture(@Path(value = "multipath", encoded = true) String multiPath,
327-
@Query("after") String after, @Query("t") SortType.Time sortTime,
328-
@HeaderMap Map<String, String> headers);
328+
@Path(value = "sortType", encoded = true) SortType.Type sortType,
329+
@Query("after") String after, @Query("t") SortType.Time sortTime,
330+
@HeaderMap Map<String, String> headers);
331+
332+
@GET("{multipath}/search.json?raw_json=1&limit=100&type=link&restrict_sr=on&sr_detail=true&include_over_18=1&always_show_media=1")
333+
ListenableFuture<Response<String>> searchMultiRedditPostsListenableFuture(@Path(value = "multipath", encoded = true) String multiPath, @Query("q") String query,
334+
@Query("after") String after,
335+
@Query("sort") SortType.Type sortType,
336+
@Query("t") SortType.Time sortTime);
337+
338+
@GET("{multipath}/search.json?raw_json=1&limit=100&type=link&restrict_sr=on&sr_detail=true&include_over_18=1&always_show_media=1")
339+
ListenableFuture<Response<String>> searchMultiRedditPostsOauthListenableFuture(@Path(value = "multipath", encoded = true) String multiPath, @Query("q") String query,
340+
@Query("after") String after,
341+
@Query("sort") SortType.Type sortType,
342+
@Query("t") SortType.Time sortTime,
343+
@HeaderMap Map<String, String> headers);
329344

330345
@GET("{sortType}?raw_json=1&limit=100")
331346
Call<String> getBestPosts(@Path("sortType") SortType.Type sortType, @Query("t") SortType.Time sortTime,

app/src/main/java/ml/docilealligator/infinityforreddit/fragments/PostFragment.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,9 @@ public void delayTransition() {
558558
});
559559
} else if (postType == PostPagingSource.TYPE_MULTI_REDDIT) {
560560
multiRedditPath = getArguments().getString(EXTRA_NAME);
561+
query = getArguments().getString(EXTRA_QUERY);
561562
if (savedInstanceState == null) {
562-
postFragmentId += multiRedditPath.hashCode();
563+
postFragmentId += multiRedditPath.hashCode() + (query == null ? 0 : query.hashCode());
563564
}
564565

565566
usage = PostFilterUsage.MULTIREDDIT_TYPE;
@@ -592,6 +593,7 @@ public void delayTransition() {
592593
public void typeChipClicked(int filter) {
593594
Intent intent = new Intent(activity, FilteredPostsActivity.class);
594595
intent.putExtra(FilteredPostsActivity.EXTRA_NAME, multiRedditPath);
596+
intent.putExtra(FilteredPostsActivity.EXTRA_QUERY, query);
595597
intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
596598
intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE_FILTER, filter);
597599
startActivity(intent);
@@ -601,6 +603,7 @@ public void typeChipClicked(int filter) {
601603
public void flairChipClicked(String flair) {
602604
Intent intent = new Intent(activity, FilteredPostsActivity.class);
603605
intent.putExtra(FilteredPostsActivity.EXTRA_NAME, multiRedditPath);
606+
intent.putExtra(FilteredPostsActivity.EXTRA_QUERY, query);
604607
intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
605608
intent.putExtra(FilteredPostsActivity.EXTRA_CONTAIN_FLAIR, flair);
606609
startActivity(intent);
@@ -610,6 +613,7 @@ public void flairChipClicked(String flair) {
610613
public void nsfwChipClicked() {
611614
Intent intent = new Intent(activity, FilteredPostsActivity.class);
612615
intent.putExtra(FilteredPostsActivity.EXTRA_NAME, multiRedditPath);
616+
intent.putExtra(FilteredPostsActivity.EXTRA_QUERY, query);
613617
intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
614618
intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE_FILTER, Post.NSFW_TYPE);
615619
startActivity(intent);
@@ -1190,7 +1194,7 @@ private void initializeAndBindPostViewModel() {
11901194
} else if (postType == PostPagingSource.TYPE_MULTI_REDDIT) {
11911195
mPostViewModel = new ViewModelProvider(PostFragment.this, new PostViewModel.Factory(mExecutor,
11921196
activity.accountName.equals(Account.ANONYMOUS_ACCOUNT) ? mRetrofit : mOauthRetrofit, activity.accessToken, activity.accountName, mSharedPreferences, mPostFeedScrolledPositionSharedPreferences,
1193-
mPostHistorySharedPreferences, multiRedditPath, postType, sortType, postFilter, readPosts))
1197+
mPostHistorySharedPreferences, multiRedditPath, query, postType, sortType, postFilter, readPosts))
11941198
.get(PostViewModel.class);
11951199
} else if (postType == PostPagingSource.TYPE_USER) {
11961200
mPostViewModel = new ViewModelProvider(PostFragment.this, new PostViewModel.Factory(mExecutor,
@@ -1208,7 +1212,6 @@ private void initializeAndBindPostViewModel() {
12081212
}
12091213

12101214
private void initializeAndBindPostViewModelForAnonymous(String concatenatedSubredditNames) {
1211-
//For anonymous user
12121215
if (postType == PostPagingSource.TYPE_SEARCH) {
12131216
mPostViewModel = new ViewModelProvider(PostFragment.this, new PostViewModel.Factory(mExecutor,
12141217
mRetrofit, null, activity.accountName, mSharedPreferences,
@@ -1669,6 +1672,7 @@ public void filterPosts() {
16691672
} else if (postType == PostPagingSource.TYPE_MULTI_REDDIT || postType == PostPagingSource.TYPE_ANONYMOUS_MULTIREDDIT) {
16701673
Intent intent = new Intent(activity, CustomizePostFilterActivity.class);
16711674
intent.putExtra(FilteredPostsActivity.EXTRA_NAME, multiRedditPath);
1675+
intent.putExtra(FilteredPostsActivity.EXTRA_QUERY, query);
16721676
intent.putExtra(FilteredPostsActivity.EXTRA_POST_TYPE, postType);
16731677
intent.putExtra(CustomizePostFilterActivity.EXTRA_START_FILTERED_POSTS_WHEN_FINISH, true);
16741678
startActivity(intent);

app/src/main/java/ml/docilealligator/infinityforreddit/post/PostPagingSource.java

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -76,35 +76,24 @@ public class PostPagingSource extends ListenableFuturePagingSource<String, Post>
7676
postLinkedHashSet = new LinkedHashSet<>();
7777
}
7878

79+
// PostPagingSource.TYPE_SUBREDDIT || PostPagingSource.TYPE_ANONYMOUS_FRONT_PAGE || PostPagingSource.TYPE_ANONYMOUS_MULTIREDDIT:
7980
PostPagingSource(Executor executor, Retrofit retrofit, @Nullable String accessToken, @NonNull String accountName,
8081
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
81-
String path, int postType, SortType sortType, PostFilter postFilter,
82+
String name, int postType, SortType sortType, PostFilter postFilter,
8283
List<String> readPostList) {
8384
this.executor = executor;
8485
this.retrofit = retrofit;
8586
this.accessToken = accessToken;
8687
this.accountName = accountName;
8788
this.sharedPreferences = sharedPreferences;
8889
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
89-
if (postType == TYPE_SUBREDDIT || postType == TYPE_ANONYMOUS_FRONT_PAGE || postType == TYPE_ANONYMOUS_MULTIREDDIT) {
90-
this.subredditOrUserName = path;
91-
if (subredditOrUserName == null) {
92-
subredditOrUserName = "popular";
93-
}
94-
} else {
95-
if (sortType != null) {
96-
if (path.endsWith("/")) {
97-
multiRedditPath = path + sortType.getType().value;
98-
} else {
99-
multiRedditPath = path + "/" + sortType.getType().value;
100-
}
101-
} else {
102-
multiRedditPath = path;
103-
}
90+
this.subredditOrUserName = name;
91+
if (subredditOrUserName == null) {
92+
subredditOrUserName = "popular";
10493
}
10594
this.postType = postType;
10695
if (sortType == null) {
107-
if ("popular".equals(path) || "all".equals(path)) {
96+
if ("popular".equals(name) || "all".equals(name)) {
10897
this.sortType = new SortType(SortType.Type.HOT);
10998
} else {
11099
this.sortType = new SortType(SortType.Type.BEST);
@@ -117,6 +106,34 @@ public class PostPagingSource extends ListenableFuturePagingSource<String, Post>
117106
postLinkedHashSet = new LinkedHashSet<>();
118107
}
119108

109+
// PostPagingSource.TYPE_MULTI_REDDIT
110+
PostPagingSource(Executor executor, Retrofit retrofit, @Nullable String accessToken, @NonNull String accountName,
111+
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
112+
String path, String query, int postType, SortType sortType, PostFilter postFilter,
113+
List<String> readPostList) {
114+
this.executor = executor;
115+
this.retrofit = retrofit;
116+
this.accessToken = accessToken;
117+
this.accountName = accountName;
118+
this.sharedPreferences = sharedPreferences;
119+
this.postFeedScrolledPositionSharedPreferences = postFeedScrolledPositionSharedPreferences;
120+
if (path.endsWith("/")) {
121+
multiRedditPath = path.substring(0, multiRedditPath.length() - 1);
122+
} else {
123+
multiRedditPath = path;
124+
}
125+
this.query = query;
126+
this.postType = postType;
127+
if (sortType == null) {
128+
this.sortType = new SortType(SortType.Type.HOT);
129+
} else {
130+
this.sortType = sortType;
131+
}
132+
this.postFilter = postFilter;
133+
this.readPostList = readPostList;
134+
postLinkedHashSet = new LinkedHashSet<>();
135+
}
136+
120137
PostPagingSource(Executor executor, Retrofit retrofit, @Nullable String accessToken, @NonNull String accountName,
121138
SharedPreferences sharedPreferences, SharedPreferences postFeedScrolledPositionSharedPreferences,
122139
String subredditOrUserName, int postType, SortType sortType, PostFilter postFilter,
@@ -308,10 +325,20 @@ private ListenableFuture<LoadResult<String, Post>> loadSearchPosts(@NonNull Load
308325
private ListenableFuture<LoadResult<String, Post>> loadMultiRedditPosts(@NonNull LoadParams<String> loadParams, RedditAPI api) {
309326
ListenableFuture<Response<String>> multiRedditPosts;
310327
if (accountName.equals(Account.ANONYMOUS_ACCOUNT)) {
311-
multiRedditPosts = api.getMultiRedditPostsListenableFuture(multiRedditPath, loadParams.getKey(), sortType.getTime());
328+
if (query != null && !query.isEmpty()) {
329+
multiRedditPosts = api.searchMultiRedditPostsListenableFuture(multiRedditPath, query, loadParams.getKey(),
330+
sortType.getType(), sortType.getTime());
331+
} else {
332+
multiRedditPosts = api.getMultiRedditPostsListenableFuture(multiRedditPath, sortType.getType(), loadParams.getKey(), sortType.getTime());
333+
}
312334
} else {
313-
multiRedditPosts = api.getMultiRedditPostsOauthListenableFuture(multiRedditPath, loadParams.getKey(),
314-
sortType.getTime(), APIUtils.getOAuthHeader(accessToken));
335+
if (query != null && !query.isEmpty()) {
336+
multiRedditPosts = api.searchMultiRedditPostsOauthListenableFuture(multiRedditPath, query, loadParams.getKey(),
337+
sortType.getType(), sortType.getTime(), APIUtils.getOAuthHeader(accessToken));
338+
} else {
339+
multiRedditPosts = api.getMultiRedditPostsOauthListenableFuture(multiRedditPath, sortType.getType(), loadParams.getKey(),
340+
sortType.getTime(), APIUtils.getOAuthHeader(accessToken));
341+
}
315342
}
316343

317344
ListenableFuture<LoadResult<String, Post>> pageFuture = Futures.transform(multiRedditPosts, this::transformData, executor);

0 commit comments

Comments
 (0)