summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2021-08-08 13:32:21 +0200
committerByteHamster <info@bytehamster.com>2021-08-08 13:48:38 +0200
commit9de72a2cab66e852735dd0c9cb6e1452b00fc250 (patch)
treea0b785896c6499c3fac1418bf3c4599411d9f2c1 /app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
parent90ad1adbc84bfbeeee3f448ce3f83c655433c7c6 (diff)
downloadAntennaPod-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.java89
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);