From ad7083b423380ef4cb1f8ee215105450b15a7237 Mon Sep 17 00:00:00 2001 From: Balazs Toldi Date: Mon, 24 Jul 2023 22:21:21 +0200 Subject: [PATCH] Basic search post functionality Signed-off-by: Balazs Toldi --- .../eu/toldi/infinityforlemmy/SortType.java | 9 +++++ .../activities/SearchActivity.java | 7 ++++ .../activities/SearchResultActivity.java | 10 ++++-- .../ViewSubredditDetailActivity.java | 1 + .../activities/ViewUserDetailActivity.java | 1 + .../toldi/infinityforlemmy/apis/LemmyAPI.java | 14 ++++++++ .../fragments/PostFragment.java | 4 +-- .../post/PostPagingSource.java | 35 ++++++------------- 8 files changed, 52 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/SortType.java b/app/src/main/java/eu/toldi/infinityforlemmy/SortType.java index 6cac55f6..f4a24392 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/SortType.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/SortType.java @@ -57,6 +57,15 @@ public class SortType { this.value = value; this.fullName = fullName; } + + public static Type fromValue(String value) { + for (Type type : values()) { + if (type.value.equals(value)) { + return type; + } + } + return null; + } } public enum Time { diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchActivity.java b/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchActivity.java index f9cb1603..5508dac7 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchActivity.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchActivity.java @@ -75,6 +75,7 @@ public class SearchActivity extends BaseActivity { public static final String EXTRA_RETURN_USER_ICON_URL = "ERUIU"; public static final String EXTRA_IS_MULTI_SELECTION = "EIMS"; public static final int SUICIDE_PREVENTION_ACTIVITY_REQUEST_CODE = 101; + public static final String EXTRA_COMMUNITY_FULL_NAME = "ECF"; private static final String SUBREDDIT_NAME_STATE = "SNS"; private static final String SUBREDDIT_IS_USER_STATE = "SIUS"; @@ -82,6 +83,7 @@ public class SearchActivity extends BaseActivity { private static final int SUBREDDIT_SELECTION_REQUEST_CODE = 0; private static final int SUBREDDIT_SEARCH_REQUEST_CODE = 1; private static final int USER_SEARCH_REQUEST_CODE = 2; + private static final String COMMUNITY_QUALIFIED_NAME = "CQN"; @BindView(R.id.coordinator_layout_search_activity) CoordinatorLayout coordinatorLayout; @@ -125,6 +127,8 @@ public class SearchActivity extends BaseActivity { private String mAccessToken; private String query; private String subredditName; + + private String communityQualifiedName; private boolean subredditIsUser; private boolean searchOnlySubreddits; private boolean searchOnlyUsers; @@ -296,6 +300,7 @@ public class SearchActivity extends BaseActivity { Intent intent = getIntent(); if (intent.hasExtra(EXTRA_SUBREDDIT_NAME)) { subredditName = intent.getStringExtra(EXTRA_SUBREDDIT_NAME); + communityQualifiedName = intent.getStringExtra(EXTRA_COMMUNITY_FULL_NAME); subredditNameTextView.setText(subredditName); subredditIsUser = intent.getBooleanExtra(EXTRA_SUBREDDIT_IS_USER, false); } @@ -364,6 +369,7 @@ public class SearchActivity extends BaseActivity { intent.putExtra(SearchResultActivity.EXTRA_SUBREDDIT_NAME, "u_" + subredditName); } else { intent.putExtra(SearchResultActivity.EXTRA_SUBREDDIT_NAME, subredditName); + intent.putExtra(SearchResultActivity.EXTRA_COMMUNITY_QUALIFIED_NAME, communityQualifiedName); } } startActivity(intent); @@ -477,6 +483,7 @@ public class SearchActivity extends BaseActivity { public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putString(SUBREDDIT_NAME_STATE, subredditName); + outState.putString(COMMUNITY_QUALIFIED_NAME, communityQualifiedName); outState.putBoolean(SUBREDDIT_IS_USER_STATE, subredditIsUser); } diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchResultActivity.java b/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchResultActivity.java index 047a3ddc..2e543764 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchResultActivity.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/activities/SearchResultActivity.java @@ -90,6 +90,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect static final String EXTRA_SUBREDDIT_NAME = "ESN"; private static final String INSERT_SEARCH_QUERY_SUCCESS_STATE = "ISQSS"; + public static final String EXTRA_COMMUNITY_QUALIFIED_NAME = "ECQN"; @BindView(R.id.coordinator_layout_search_result_activity) CoordinatorLayout coordinatorLayout; @BindView(R.id.appbar_layout_search_result_activity) @@ -132,8 +133,11 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect private Call subredditAutocompleteCall; private String mAccessToken; private String mAccountName; + + private String mAccountQualifiedName; private String mQuery; private String mSubredditName; + private String mCommunityQualifiedName; private boolean mInsertSearchQuerySuccess; private FragmentManager fragmentManager; private SectionsPagerAdapter sectionsPagerAdapter; @@ -192,6 +196,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect String query = intent.getStringExtra(EXTRA_QUERY); mSubredditName = intent.getStringExtra(EXTRA_SUBREDDIT_NAME); + mCommunityQualifiedName = intent.getStringExtra(EXTRA_COMMUNITY_QUALIFIED_NAME); if (query != null) { mQuery = query; @@ -202,6 +207,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null); mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null); + mAccountQualifiedName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, null); if (savedInstanceState != null) { mInsertSearchQuerySuccess = savedInstanceState.getBoolean(INSERT_SEARCH_QUERY_SUCCESS_STATE); @@ -386,7 +392,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect }); if (mAccountName != null && mSharedPreferences.getBoolean(SharedPreferencesUtils.ENABLE_SEARCH_HISTORY, true) && !mInsertSearchQuerySuccess && mQuery != null) { - InsertRecentSearchQuery.insertRecentSearchQueryListener(mRedditDataRoomDatabase, mAccountName, + InsertRecentSearchQuery.insertRecentSearchQueryListener(mRedditDataRoomDatabase, mAccountQualifiedName, mQuery, () -> mInsertSearchQuerySuccess = true); } } @@ -768,7 +774,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect PostFragment mFragment = new PostFragment(); Bundle bundle = new Bundle(); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_SEARCH); - bundle.putString(PostFragment.EXTRA_NAME, mSubredditName); + bundle.putString(PostFragment.EXTRA_NAME, mCommunityQualifiedName); bundle.putString(PostFragment.EXTRA_QUERY, mQuery); bundle.putString(PostFragment.EXTRA_TRENDING_SOURCE, getIntent().getStringExtra(EXTRA_TRENDING_SOURCE)); bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewSubredditDetailActivity.java b/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewSubredditDetailActivity.java index 8195d976..01aa859a 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewSubredditDetailActivity.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewSubredditDetailActivity.java @@ -1123,6 +1123,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp } else if (itemId == R.id.action_search_view_subreddit_detail_activity) { Intent intent = new Intent(this, SearchActivity.class); intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, subredditName); + intent.putExtra(SearchActivity.EXTRA_COMMUNITY_FULL_NAME, qualifiedName); startActivity(intent); return true; } else if (itemId == R.id.action_refresh_view_subreddit_detail_activity) { diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewUserDetailActivity.java b/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewUserDetailActivity.java index 9e9cc561..31770020 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewUserDetailActivity.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/activities/ViewUserDetailActivity.java @@ -1130,6 +1130,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele } else if (itemId == R.id.action_search_view_user_detail_activity) { Intent intent = new Intent(this, SearchActivity.class); intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_NAME, username); + intent.putExtra(SearchActivity.EXTRA_COMMUNITY_FULL_NAME, qualifiedName); intent.putExtra(SearchActivity.EXTRA_SUBREDDIT_IS_USER, true); startActivity(intent); return true; diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/apis/LemmyAPI.java b/app/src/main/java/eu/toldi/infinityforlemmy/apis/LemmyAPI.java index 22ff3be6..06e42961 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/apis/LemmyAPI.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/apis/LemmyAPI.java @@ -78,4 +78,18 @@ public interface LemmyAPI { @Query("saved_only") Boolean savedOnly, @Query("auth") String auth ); + + @GET("api/v3/search") + ListenableFuture> search( + @Query("q") String q, + @Query("community_id") Integer communityId, + @Query("community_name") String communityName, + @Query("creator_id") Integer creatorId, + @Query("type_") String type, + @Query("sort") String sort, + @Query("listing_type") String listingType, + @Query("page") Integer page, + @Query("limit") Integer limit, + @Query("auth") String auth + ); } diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/fragments/PostFragment.java b/app/src/main/java/eu/toldi/infinityforlemmy/fragments/PostFragment.java index f6a4bf85..48923ee1 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/fragments/PostFragment.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/fragments/PostFragment.java @@ -458,9 +458,9 @@ public class PostFragment extends Fragment implements FragmentCommunicator { usage = PostFilterUsage.SEARCH_TYPE; nameOfUsage = PostFilterUsage.NO_USAGE; - String sort = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TYPE_SEARCH_POST, SortType.Type.TOP.value); + String sort = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TYPE_SEARCH_POST, SortType.Type.TOP_ALL.value); String sortTime = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TIME_SEARCH_POST, SortType.Time.ALL.name()); - sortType = new SortType(SortType.Type.valueOf(sort), SortType.Time.valueOf(sortTime)); + sortType = new SortType(SortType.Type.fromValue(sort), SortType.Time.valueOf(sortTime)); postLayout = mPostLayoutSharedPreferences.getInt(SharedPreferencesUtils.POST_LAYOUT_SEARCH_POST, defaultPostLayout); mAdapter = new PostRecyclerViewAdapter(activity, this, mExecutor, mRetrofit.getRetrofit(), mGfycatRetrofit, diff --git a/app/src/main/java/eu/toldi/infinityforlemmy/post/PostPagingSource.java b/app/src/main/java/eu/toldi/infinityforlemmy/post/PostPagingSource.java index fe4d6c92..6792e74b 100644 --- a/app/src/main/java/eu/toldi/infinityforlemmy/post/PostPagingSource.java +++ b/app/src/main/java/eu/toldi/infinityforlemmy/post/PostPagingSource.java @@ -174,9 +174,9 @@ public class PostPagingSource extends ListenableFuturePagingSource> loadSearchPosts(@NonNull LoadParams loadParams, LemmyAPI api) { + + private ListenableFuture> loadSearchPosts(@NonNull LoadParams loadParams, LemmyAPI api) { ListenableFuture> searchPosts; - if (subredditOrUserName == null) { - if (accessToken == null) { - searchPosts = api.searchPostsListenableFuture(query, loadParams.getKey(), sortType.getType(), sortType.getTime(), - trendingSource); - } else { - searchPosts = api.searchPostsOauthListenableFuture(query, loadParams.getKey(), sortType.getType(), - sortType.getTime(), trendingSource, APIUtils.getOAuthHeader(accessToken)); - } - } else { - if (accessToken == null) { - searchPosts = api.searchPostsInSpecificSubredditListenableFuture(subredditOrUserName, query, - sortType.getType(), sortType.getTime(), loadParams.getKey()); - } else { - searchPosts = api.searchPostsInSpecificSubredditOauthListenableFuture(subredditOrUserName, query, - sortType.getType(), sortType.getTime(), loadParams.getKey(), - APIUtils.getOAuthHeader(accessToken)); - } - } - ListenableFuture> pageFuture = Futures.transform(searchPosts, this::transformData, executor); + searchPosts = api.search(query, null, subredditOrUserName, null, "Posts", sortType.getType().value, "All", loadParams.getKey(), 25, accessToken); - ListenableFuture> partialLoadResultFuture = + + ListenableFuture> pageFuture = Futures.transform(searchPosts, this::transformData, executor); + + ListenableFuture> partialLoadResultFuture = Futures.catching(pageFuture, HttpException.class, LoadResult.Error::new, executor); return Futures.catching(partialLoadResultFuture, IOException.class, LoadResult.Error::new, executor); } - +/* private ListenableFuture> loadMultiRedditPosts(@NonNull LoadParams loadParams, LemmyAPI api) { ListenableFuture> multiRedditPosts; if (accessToken == null) {