Search works in a reactive way

pull/760/head
konradkluz 6 years ago
parent 944a112dbc
commit 5082a73302

@ -46,6 +46,9 @@ import com.todoroo.astrid.service.TaskCreator;
import com.todoroo.astrid.service.TaskDeleter; import com.todoroo.astrid.service.TaskDeleter;
import com.todoroo.astrid.service.TaskMover; import com.todoroo.astrid.service.TaskMover;
import com.todoroo.astrid.timers.TimerPlugin; import com.todoroo.astrid.timers.TimerPlugin;
import io.reactivex.disposables.Disposable;
import io.reactivex.subjects.PublishSubject;
import java.util.concurrent.TimeUnit;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
@ -88,6 +91,7 @@ public class TaskListFragment extends InjectingFragment
private static final String FRAG_TAG_SORT_DIALOG = "frag_tag_sort_dialog"; private static final String FRAG_TAG_SORT_DIALOG = "frag_tag_sort_dialog";
// --- instance variables // --- instance variables
private static final int REQUEST_EDIT_FILTER = 11544; private static final int REQUEST_EDIT_FILTER = 11544;
private static final int SEARCH_DEBOUNCE_TIMEOUT = 300;
private final RefreshReceiver refreshReceiver = new RefreshReceiver(); private final RefreshReceiver refreshReceiver = new RefreshReceiver();
@Inject protected Tracker tracker; @Inject protected Tracker tracker;
protected Filter filter; protected Filter filter;
@ -124,7 +128,10 @@ public class TaskListFragment extends InjectingFragment
private TaskAdapter taskAdapter = null; private TaskAdapter taskAdapter = null;
private TaskListRecyclerAdapter recyclerAdapter; private TaskListRecyclerAdapter recyclerAdapter;
/* private PublishSubject<String> searchSubject;
private Disposable searchDisposable;
/*
* ====================================================================== * ======================================================================
* ======================================================= initialization * ======================================================= initialization
* ====================================================================== * ======================================================================
@ -247,34 +254,53 @@ public class TaskListFragment extends InjectingFragment
} }
menu.findItem(R.id.menu_voice_add).setVisible(device.voiceInputAvailable()); menu.findItem(R.id.menu_voice_add).setVisible(device.voiceInputAvailable());
setupSearchView(menu);
}
private void setupSearchView(Menu menu) {
final MenuItem item = menu.findItem(R.id.menu_search); final MenuItem item = menu.findItem(R.id.menu_search);
final SearchView actionView = (SearchView) MenuItemCompat.getActionView(item); final SearchView actionView = (SearchView) MenuItemCompat.getActionView(item);
searchSubject = PublishSubject.create();
searchDisposable = searchSubject
.debounce(SEARCH_DEBOUNCE_TIMEOUT, TimeUnit.MILLISECONDS)
.subscribe(query -> searchByQuery(query));
actionView.setOnQueryTextListener( actionView.setOnQueryTextListener(
new SearchView.OnQueryTextListener() { new SearchView.OnQueryTextListener() {
@Override @Override
public boolean onQueryTextSubmit(String query) { public boolean onQueryTextSubmit(String query) {
query = query.trim(); return false;
String title = getString(R.string.FLA_search_filter, query); }
Filter savedFilter =
new Filter( @Override
title, public boolean onQueryTextChange(String query) {
new QueryTemplate() searchSubject.onNext(query);
.where( return true;
Criterion.and( }
Task.DELETION_DATE.eq(0), });
Criterion.or( }
private void searchByQuery(String query) {
query = query.trim();
if (!query.isEmpty()) {
Filter savedFilter = createSearchFilter(query);
taskListViewModel.searchByFilter(savedFilter);
} else {
MainActivity activity = (MainActivity) getActivity();
taskListViewModel.searchByFilter(activity.defaultFilterProvider.getDefaultFilter());
}
}
private Filter createSearchFilter(String query){
String title = getString(R.string.FLA_search_filter, query);
return new Filter(
title, new QueryTemplate()
.where(
Criterion.and(
Task.DELETION_DATE.eq(0),
Criterion.or(
Task.NOTES.like("%" + query + "%"), Task.NOTES.like("%" + query + "%"),
Task.TITLE.like("%" + query + "%"))))); Task.TITLE.like("%" + query + "%")))));
((MainActivity) getActivity()).onFilterItemClicked(savedFilter);
MenuItemCompat.collapseActionView(item);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
return false;
}
});
} }
@Override @Override
@ -405,7 +431,13 @@ public class TaskListFragment extends InjectingFragment
localBroadcastManager.unregisterReceiver(refreshReceiver); localBroadcastManager.unregisterReceiver(refreshReceiver);
} }
/** @Override
public void onDestroyView() {
super.onDestroyView();
searchDisposable.dispose();
}
/**
* Called by the RefreshReceiver when the task list receives a refresh broadcast. Subclasses * Called by the RefreshReceiver when the task list receives a refresh broadcast. Subclasses
* should override this. * should override this.
*/ */

@ -49,12 +49,12 @@ public class TaskListViewModel extends ViewModel {
public LiveData<PagedList<Task>> getTasks(Filter filter, Property<?>[] properties) { public LiveData<PagedList<Task>> getTasks(Filter filter, Property<?>[] properties) {
if (tasks == null || !filter.equals(this.filter)) { if (tasks == null || !filter.equals(this.filter)) {
this.filter = filter; this.filter = filter;
tasks = getLiveData(filter, properties); tasks = getLiveData(properties);
} }
return tasks; return tasks;
} }
private LiveData<PagedList<Task>> getLiveData(Filter filter, Property<?>[] properties) { private LiveData<PagedList<Task>> getLiveData(Property<?>[] properties) {
return new LivePagedListBuilder<>( return new LivePagedListBuilder<>(
new Factory<Integer, Task>() { new Factory<Integer, Task>() {
@Override @Override
@ -131,6 +131,11 @@ public class TaskListViewModel extends ViewModel {
return new LimitOffsetDataSource(database, query); return new LimitOffsetDataSource(database, query);
} }
public void searchByFilter(Filter filter){
this.filter = filter;
invalidate();
}
public void invalidate() { public void invalidate() {
if (latest != null) { if (latest != null) {
latest.invalidate(); latest.invalidate();

@ -7,13 +7,13 @@
android:id="@+id/menu_voice_add" android:id="@+id/menu_voice_add"
android:icon="@drawable/ic_outline_mic_none_24px" android:icon="@drawable/ic_outline_mic_none_24px"
android:title="@string/EPr_voiceInputEnabled_title" android:title="@string/EPr_voiceInputEnabled_title"
app:showAsAction="ifRoom"/> app:showAsAction="always"/>
<item <item
android:id="@+id/menu_search" android:id="@+id/menu_search"
android:icon="@drawable/ic_outline_search_24px" android:icon="@drawable/ic_outline_search_24px"
android:title="@string/TLA_menu_search" android:title="@string/TLA_menu_search"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView"/> app:showAsAction="always|collapseActionView"/>
<item <item
android:id="@+id/menu_sort" android:id="@+id/menu_sort"
android:icon="@drawable/ic_outline_sort_24px" android:icon="@drawable/ic_outline_sort_24px"

Loading…
Cancel
Save