diff options
author | ByteHamster <info@bytehamster.com> | 2021-08-08 13:32:21 +0200 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2021-08-08 13:48:38 +0200 |
commit | 9de72a2cab66e852735dd0c9cb6e1452b00fc250 (patch) | |
tree | a0b785896c6499c3fac1418bf3c4599411d9f2c1 /app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java | |
parent | 90ad1adbc84bfbeeee3f448ce3f83c655433c7c6 (diff) | |
download | AntennaPod-9de72a2cab66e852735dd0c9cb6e1452b00fc250.zip |
Live results in local search
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java | 89 |
1 files changed, 60 insertions, 29 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index 855078d03..f8326d9c1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -1,6 +1,8 @@ package de.danoeh.antennapod.fragment; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; @@ -55,6 +57,7 @@ public class SearchFragment extends Fragment { private static final String ARG_QUERY = "query"; private static final String ARG_FEED = "feed"; private static final String ARG_FEED_NAME = "feedName"; + private static final int SEARCH_DEBOUNCE_INTERVAL = 1500; private EpisodeItemListAdapter adapter; private FeedSearchResultAdapter adapterFeeds; @@ -64,27 +67,35 @@ public class SearchFragment extends Fragment { private EpisodeItemListRecyclerView recyclerView; private List<FeedItem> results; private Chip chip; + private SearchView searchView; + private Handler automaticSearchDebouncer; + private long lastQueryChange = 0; /** * Create a new SearchFragment that searches all feeds. */ - public static SearchFragment newInstance(String query) { - if (query == null) { - query = ""; - } + public static SearchFragment newInstance() { SearchFragment fragment = new SearchFragment(); Bundle args = new Bundle(); - args.putString(ARG_QUERY, query); args.putLong(ARG_FEED, 0); fragment.setArguments(args); return fragment; } /** + * Create a new SearchFragment that searches all feeds with pre-defined query. + */ + public static SearchFragment newInstance(String query) { + SearchFragment fragment = newInstance(); + fragment.getArguments().putString(ARG_QUERY, query); + return fragment; + } + + /** * Create a new SearchFragment that searches one specific feed. */ - public static SearchFragment newInstance(String query, long feed, String feedTitle) { - SearchFragment fragment = newInstance(query); + public static SearchFragment newInstance(long feed, String feedTitle) { + SearchFragment fragment = newInstance(); fragment.getArguments().putLong(ARG_FEED, feed); fragment.getArguments().putString(ARG_FEED_NAME, feedTitle); return fragment; @@ -94,12 +105,7 @@ public class SearchFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - } - - @Override - public void onStart() { - super.onStart(); - search(); + automaticSearchDebouncer = new Handler(Looper.getMainLooper()); } @Override @@ -134,13 +140,19 @@ public class SearchFragment extends Fragment { emptyViewHandler.attachToRecyclerView(recyclerView); emptyViewHandler.setIcon(R.drawable.ic_search); emptyViewHandler.setTitle(R.string.search_status_no_results); + emptyViewHandler.setMessage(R.string.type_to_search); EventBus.getDefault().register(this); chip = layout.findViewById(R.id.feed_title_chip); chip.setOnCloseIconClickListener(v -> { getArguments().putLong(ARG_FEED, 0); - search(); + searchWithProgressBar(); }); + chip.setVisibility((getArguments().getLong(ARG_FEED, 0) == 0) ? View.GONE : View.VISIBLE); + chip.setText(getArguments().getString(ARG_FEED_NAME, "")); + if (getArguments().getString(ARG_QUERY, null) != null) { + search(); + } return layout; } @@ -157,21 +169,30 @@ public class SearchFragment extends Fragment { MenuItem item = toolbar.getMenu().findItem(R.id.action_search); item.expandActionView(); - final SearchView sv = (SearchView) item.getActionView(); - sv.setQueryHint(getString(R.string.search_label)); - sv.clearFocus(); - sv.setQuery(getArguments().getString(ARG_QUERY), false); - sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + searchView = (SearchView) item.getActionView(); + searchView.setQueryHint(getString(R.string.search_label)); + searchView.requestFocus(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { - sv.clearFocus(); - getArguments().putString(ARG_QUERY, s); - search(); + searchView.clearFocus(); + searchWithProgressBar(); return true; } @Override public boolean onQueryTextChange(String s) { + automaticSearchDebouncer.removeCallbacksAndMessages(null); + if (s.isEmpty() || s.endsWith(" ") || (lastQueryChange != 0 + && System.currentTimeMillis() > lastQueryChange + SEARCH_DEBOUNCE_INTERVAL)) { + search(); + } else { + automaticSearchDebouncer.postDelayed(() -> { + search(); + lastQueryChange = 0; // Don't search instantly with first symbol after some pause + }, SEARCH_DEBOUNCE_INTERVAL / 2); + } + lastQueryChange = System.currentTimeMillis(); return false; } }); @@ -256,12 +277,17 @@ public class SearchFragment extends Fragment { search(); } + private void searchWithProgressBar() { + progressBar.setVisibility(View.VISIBLE); + emptyViewHandler.hide(); + search(); + } + private void search() { if (disposable != null) { disposable.dispose(); } - progressBar.setVisibility(View.VISIBLE); - emptyViewHandler.hide(); + chip.setVisibility((getArguments().getLong(ARG_FEED, 0) == 0) ? View.GONE : View.VISIBLE); disposable = Observable.fromCallable(this::performSearch) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -271,19 +297,24 @@ public class SearchFragment extends Fragment { adapter.updateItems(results.first); if (getArguments().getLong(ARG_FEED, 0) == 0) { adapterFeeds.updateData(results.second); - chip.setVisibility(View.GONE); } else { adapterFeeds.updateData(Collections.emptyList()); - chip.setText(getArguments().getString(ARG_FEED_NAME, "")); } - String query = getArguments().getString(ARG_QUERY); - emptyViewHandler.setMessage(getString(R.string.no_results_for_query, query)); + + if (searchView.getQuery().toString().isEmpty()) { + emptyViewHandler.setMessage(R.string.type_to_search); + } else { + emptyViewHandler.setMessage(getString(R.string.no_results_for_query, searchView.getQuery())); + } }, error -> Log.e(TAG, Log.getStackTraceString(error))); } @NonNull private Pair<List<FeedItem>, List<Feed>> performSearch() { - String query = getArguments().getString(ARG_QUERY); + String query = searchView.getQuery().toString(); + if (query.isEmpty()) { + return new Pair<>(Collections.emptyList(), Collections.emptyList()); + } long feed = getArguments().getLong(ARG_FEED); List<FeedItem> items = FeedSearcher.searchFeedItems(getContext(), query, feed); List<Feed> feeds = FeedSearcher.searchFeeds(getContext(), query); |