From 2043e712990019b7369f557e78d94dc9c092f705 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Mon, 15 Apr 2024 19:24:06 +0200 Subject: [PATCH] Show feed search results as soon as they are available (#7100) without waiting for episode search results --- .../antennapod/ui/screen/SearchFragment.java | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java index 85d837a51..0416cca75 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java @@ -6,7 +6,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; -import android.util.Pair; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; @@ -75,7 +74,8 @@ public class SearchFragment extends Fragment implements EpisodeItemListAdapter.O private EpisodeItemListAdapter adapter; private HorizontalFeedListAdapter adapterFeeds; - private Disposable disposable; + private Disposable disposableFeeds; + private Disposable disposableEpisodes; private ProgressBar progressBar; private EmptyViewHandler emptyViewHandler; private EpisodeItemListRecyclerView recyclerView; @@ -127,8 +127,11 @@ public class SearchFragment extends Fragment implements EpisodeItemListAdapter.O @Override public void onStop() { super.onStop(); - if (disposable != null) { - disposable.dispose(); + if (disposableFeeds != null) { + disposableFeeds.dispose(); + } + if (disposableEpisodes != null) { + disposableEpisodes.dispose(); } } @@ -373,44 +376,45 @@ public class SearchFragment extends Fragment implements EpisodeItemListAdapter.O } private void search() { - if (disposable != null) { - disposable.dispose(); + if (disposableFeeds != null) { + disposableFeeds.dispose(); + } + if (disposableEpisodes != null) { + disposableEpisodes.dispose(); } adapterFeeds.setEndButton(R.string.search_online, this::searchOnline); - chip.setVisibility((getArguments().getLong(ARG_FEED, 0) == 0) ? View.GONE : View.VISIBLE); - disposable = Observable.fromCallable(this::performSearch) + long feed = getArguments().getLong(ARG_FEED, 0); + chip.setVisibility((feed == 0) ? View.GONE : View.VISIBLE); + + String query = searchView.getQuery().toString(); + if (query.isEmpty()) { + emptyViewHandler.setMessage(R.string.type_to_search); + return; + } + if (feed != 0) { + // Search within a feed + adapterFeeds.updateData(Collections.emptyList()); + } else { + disposableFeeds = Observable.fromCallable(() -> DBReader.searchFeeds(query)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(results -> { + progressBar.setVisibility(View.GONE); + adapterFeeds.updateData(results); + emptyViewHandler.setMessage(getString(R.string.no_results_for_query, query)); + }, error -> Log.e(TAG, Log.getStackTraceString(error))); + } + disposableEpisodes = Observable.fromCallable(() -> DBReader.searchFeedItems(feed, query)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(results -> { progressBar.setVisibility(View.GONE); - this.results = results.first; - adapter.updateItems(results.first); - if (getArguments().getLong(ARG_FEED, 0) == 0) { - adapterFeeds.updateData(results.second); - } else { - adapterFeeds.updateData(Collections.emptyList()); - } - - if (searchView.getQuery().toString().isEmpty()) { - emptyViewHandler.setMessage(R.string.type_to_search); - } else { - emptyViewHandler.setMessage(getString(R.string.no_results_for_query, searchView.getQuery())); - } + this.results = results; + adapter.updateItems(results); + emptyViewHandler.setMessage(getString(R.string.no_results_for_query, searchView.getQuery())); }, error -> Log.e(TAG, Log.getStackTraceString(error))); } - @NonNull - private Pair, List> performSearch() { - String query = searchView.getQuery().toString(); - if (query.isEmpty()) { - return new Pair<>(Collections.emptyList(), Collections.emptyList()); - } - long feed = getArguments().getLong(ARG_FEED); - List items = DBReader.searchFeedItems(feed, query); - List feeds = DBReader.searchFeeds(query); - return new Pair<>(items, feeds); - } - private void showInputMethod(View view) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) {