package com.uservoice.uservoicesdk.ui; import android.content.Context; import android.widget.BaseAdapter; import com.uservoice.uservoicesdk.rest.Callback; import com.uservoice.uservoicesdk.rest.RestTask; import java.util.ArrayList; import java.util.List; import java.util.TimerTask; public abstract class SearchAdapter<T> extends BaseAdapter { protected List<T> searchResults = new ArrayList<T>(); protected boolean searchActive = false; protected boolean loading; protected Context context; protected String currentQuery; protected String pendingQuery; protected int scope; protected SearchTask currentSearch; public void performSearch(String query) { pendingQuery = query; if (query.isEmpty()) { searchResults = new ArrayList<T>(); loading = false; notifyDataSetChanged(); } else { loading = true; notifyDataSetChanged(); if (currentSearch != null) { currentSearch.cancel(); } currentSearch = new SearchTask(query); currentSearch.run(); } } public void setSearchActive(boolean searchActive) { this.searchActive = searchActive; loading = false; notifyDataSetChanged(); } protected void searchResultsUpdated() { } protected boolean shouldShowSearchResults() { return searchActive && pendingQuery != null && !pendingQuery.isEmpty(); } protected RestTask search(String query, Callback<List<T>> callback) { return null; } public void setScope(int scope) { this.scope = scope; notifyDataSetChanged(); } private class SearchTask extends TimerTask { private final String query; private boolean stop; private RestTask task; public SearchTask(String query) { this.query = query; } @Override public boolean cancel() { stop = true; task.cancel(true); return true; } @Override public void run() { currentQuery = query; task = search(query, new DefaultCallback<List<T>>(context) { @Override public void onModel(List<T> model) { if (!stop) { searchResults = model; loading = false; notifyDataSetChanged(); searchResultsUpdated(); } } }); } } }