Showing recents in search

A list of recent queries will display when search first launches, or
when text query is empty.

Fix: 32452066
Test: make RunSettingsRoboTests
Change-Id: Ic697f8c0795f2315a01406537c7ce1bbf9a813be
This commit is contained in:
Fan Zhang
2017-01-19 16:17:16 -08:00
parent e44be9f729
commit a8b089db8a
20 changed files with 658 additions and 38 deletions

View File

@@ -52,8 +52,9 @@ public class SearchFragment extends InstrumentedFragment implements
private static final String STATE_RESULT_CLICK_COUNT = "state_result_click_count";
// Loader IDs
private static final int LOADER_ID_DATABASE = 0;
private static final int LOADER_ID_INSTALLED_APPS = 1;
private static final int LOADER_ID_RECENTS = 0;
private static final int LOADER_ID_DATABASE = 1;
private static final int LOADER_ID_INSTALLED_APPS = 2;
// Logging
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
@@ -61,6 +62,10 @@ public class SearchFragment extends InstrumentedFragment implements
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
String mQuery;
private final SaveQueryRecorderCallback mSaveQueryRecorderCallback =
new SaveQueryRecorderCallback();
private boolean mNeverEnteredQuery = true;
private int mResultClickCount;
private MetricsFeatureProvider mMetricsFeatureProvider;
@@ -68,6 +73,7 @@ public class SearchFragment extends InstrumentedFragment implements
private SearchResultsAdapter mSearchAdapter;
private RecyclerView mResultsRecyclerView;
private SearchView mSearchView;
@Override
public int getMetricsCategory() {
@@ -86,18 +92,21 @@ public class SearchFragment extends InstrumentedFragment implements
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mSearchAdapter = new SearchResultsAdapter(this);
final LoaderManager loaderManager = getLoaderManager();
if (savedInstanceState != null) {
mQuery = savedInstanceState.getString(STATE_QUERY);
mNeverEnteredQuery = savedInstanceState.getBoolean(STATE_NEVER_ENTERED_QUERY);
mResultClickCount = savedInstanceState.getInt(STATE_RESULT_CLICK_COUNT);
final LoaderManager loaderManager = getLoaderManager();
loaderManager.initLoader(LOADER_ID_DATABASE, null, this);
loaderManager.initLoader(LOADER_ID_INSTALLED_APPS, null, this);
} else {
loaderManager.initLoader(LOADER_ID_RECENTS, null, this);
}
final Activity activity = getActivity();
final ActionBar actionBar = activity.getActionBar();
actionBar.setCustomView(makeSearchView(actionBar, mQuery));
mSearchView = makeSearchView(actionBar, mQuery);
actionBar.setCustomView(mSearchView);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
@@ -151,7 +160,10 @@ public class SearchFragment extends InstrumentedFragment implements
mSearchAdapter.clearResults();
if (TextUtils.isEmpty(mQuery)) {
getLoaderManager().destroyLoader(LOADER_ID_DATABASE);
final LoaderManager loaderManager = getLoaderManager();
loaderManager.destroyLoader(LOADER_ID_DATABASE);
loaderManager.destroyLoader(LOADER_ID_INSTALLED_APPS);
loaderManager.restartLoader(LOADER_ID_RECENTS, null /* args */, this /* callback */);
} else {
restartLoaders();
}
@@ -161,6 +173,10 @@ public class SearchFragment extends InstrumentedFragment implements
@Override
public boolean onQueryTextSubmit(String query) {
// Save submitted query.
getLoaderManager().restartLoader(SaveQueryRecorderCallback.LOADER_ID_SAVE_QUERY_TASK, null,
mSaveQueryRecorderCallback);
return true;
}
@@ -173,6 +189,8 @@ public class SearchFragment extends InstrumentedFragment implements
return mSearchFeatureProvider.getDatabaseSearchLoader(activity, mQuery);
case LOADER_ID_INSTALLED_APPS:
return mSearchFeatureProvider.getInstalledAppSearchLoader(activity, mQuery);
case LOADER_ID_RECENTS:
return mSearchFeatureProvider.getSavedQueryLoader(activity);
default:
return null;
}
@@ -191,6 +209,12 @@ public class SearchFragment extends InstrumentedFragment implements
mResultClickCount++;
}
public void onSavedQueryClicked(CharSequence query) {
final String queryString = query.toString();
mSearchView.setQuery(queryString, false /* submit */);
onQueryTextChange(queryString);
}
private void restartLoaders() {
final LoaderManager loaderManager = getLoaderManager();
loaderManager.restartLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
@@ -207,4 +231,25 @@ public class SearchFragment extends InstrumentedFragment implements
searchView.setLayoutParams(lp);
return searchView;
}
private class SaveQueryRecorderCallback implements LoaderManager.LoaderCallbacks<Void> {
// TODO: make a generic background task manager to handle one-off tasks like this one.
private static final int LOADER_ID_SAVE_QUERY_TASK = 0;
@Override
public Loader<Void> onCreateLoader(int id, Bundle args) {
return new SavedQueryRecorder(getActivity(), mQuery);
}
@Override
public void onLoadFinished(Loader<Void> loader, Void data) {
}
@Override
public void onLoaderReset(Loader<Void> loader) {
}
}
}