Merge "Prevent race condition between SavedQuery and Query Loader" into oc-mr1-dev am: 3042af11f0
am: 2980aecd96
Change-Id: I092b68b491669505dc2e46029d19c1fcc4061836
This commit is contained in:
@@ -34,10 +34,6 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
||||
MenuItem.OnMenuItemClickListener {
|
||||
|
||||
// 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;
|
||||
private static final int LOADER_ID_REMOVE_QUERY_TASK = 1;
|
||||
private static final int LOADER_ID_SAVED_QUERIES = 2;
|
||||
private static final String ARG_QUERY = "remove_query";
|
||||
private static final String TAG = "SearchSavedQueryCtrl";
|
||||
|
||||
@@ -60,11 +56,11 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
||||
@Override
|
||||
public Loader onCreateLoader(int id, Bundle args) {
|
||||
switch (id) {
|
||||
case LOADER_ID_SAVE_QUERY_TASK:
|
||||
case SearchFragment.SearchLoaderId.SAVE_QUERY_TASK:
|
||||
return new SavedQueryRecorder(mContext, args.getString(ARG_QUERY));
|
||||
case LOADER_ID_REMOVE_QUERY_TASK:
|
||||
case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
|
||||
return new SavedQueryRemover(mContext);
|
||||
case LOADER_ID_SAVED_QUERIES:
|
||||
case SearchFragment.SearchLoaderId.SAVED_QUERIES:
|
||||
return mSearchFeatureProvider.getSavedQueryLoader(mContext);
|
||||
}
|
||||
return null;
|
||||
@@ -73,10 +69,11 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
||||
@Override
|
||||
public void onLoadFinished(Loader loader, Object data) {
|
||||
switch (loader.getId()) {
|
||||
case LOADER_ID_REMOVE_QUERY_TASK:
|
||||
mLoaderManager.restartLoader(LOADER_ID_SAVED_QUERIES, null, this);
|
||||
case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
|
||||
mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES,
|
||||
null /* args */, this /* callback */);
|
||||
break;
|
||||
case LOADER_ID_SAVED_QUERIES:
|
||||
case SearchFragment.SearchLoaderId.SAVED_QUERIES:
|
||||
if (SettingsSearchIndexablesProvider.DEBUG) {
|
||||
Log.d(TAG, "Saved queries loaded");
|
||||
}
|
||||
@@ -107,7 +104,8 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
||||
public void saveQuery(String query) {
|
||||
final Bundle args = new Bundle();
|
||||
args.putString(ARG_QUERY, query);
|
||||
mLoaderManager.restartLoader(LOADER_ID_SAVE_QUERY_TASK, args, this);
|
||||
mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVE_QUERY_TASK, args,
|
||||
this /* callback */);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -115,13 +113,15 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
||||
*/
|
||||
public void removeQueries() {
|
||||
final Bundle args = new Bundle();
|
||||
mLoaderManager.restartLoader(LOADER_ID_REMOVE_QUERY_TASK, args, this);
|
||||
mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK, args,
|
||||
this /* callback */);
|
||||
}
|
||||
|
||||
public void loadSavedQueries() {
|
||||
if (SettingsSearchIndexablesProvider.DEBUG) {
|
||||
Log.d(TAG, "loading saved queries");
|
||||
}
|
||||
mLoaderManager.restartLoader(LOADER_ID_SAVED_QUERIES, null, this);
|
||||
mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES, null /* args */,
|
||||
this /* callback */);
|
||||
}
|
||||
}
|
||||
|
@@ -77,15 +77,19 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
||||
private static final String STATE_NEVER_ENTERED_QUERY = "state_never_entered_query";
|
||||
private static final String STATE_RESULT_CLICK_COUNT = "state_result_click_count";
|
||||
|
||||
// Loader IDs
|
||||
@VisibleForTesting
|
||||
static final int LOADER_ID_DATABASE = 1;
|
||||
@VisibleForTesting
|
||||
static final int LOADER_ID_INSTALLED_APPS = 2;
|
||||
@VisibleForTesting
|
||||
static final int LOADER_ID_ACCESSIBILITY_SERVICES = 3;
|
||||
@VisibleForTesting
|
||||
static final int LOADER_ID_INPUT_DEVICES = 4;
|
||||
static final class SearchLoaderId {
|
||||
// Search Query IDs
|
||||
public static final int DATABASE = 1;
|
||||
public static final int INSTALLED_APPS = 2;
|
||||
public static final int ACCESSIBILITY_SERVICES = 3;
|
||||
public static final int INPUT_DEVICES = 4;
|
||||
|
||||
// Saved Query IDs
|
||||
public static final int SAVE_QUERY_TASK = 5;
|
||||
public static final int REMOVE_QUERY_TASK = 6;
|
||||
public static final int SAVED_QUERIES = 7;
|
||||
}
|
||||
|
||||
|
||||
private static final int NUM_QUERY_LOADERS = 4;
|
||||
|
||||
@@ -283,10 +287,10 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
||||
|
||||
if (isEmptyQuery) {
|
||||
final LoaderManager loaderManager = getLoaderManager();
|
||||
loaderManager.destroyLoader(LOADER_ID_DATABASE);
|
||||
loaderManager.destroyLoader(LOADER_ID_INSTALLED_APPS);
|
||||
loaderManager.destroyLoader(LOADER_ID_ACCESSIBILITY_SERVICES);
|
||||
loaderManager.destroyLoader(LOADER_ID_INPUT_DEVICES);
|
||||
loaderManager.destroyLoader(SearchLoaderId.DATABASE);
|
||||
loaderManager.destroyLoader(SearchLoaderId.INSTALLED_APPS);
|
||||
loaderManager.destroyLoader(SearchLoaderId.ACCESSIBILITY_SERVICES);
|
||||
loaderManager.destroyLoader(SearchLoaderId.INPUT_DEVICES);
|
||||
mShowingSavedQuery = true;
|
||||
mSavedQueryController.loadSavedQueries();
|
||||
mSearchFeatureProvider.hideFeedbackButton();
|
||||
@@ -311,13 +315,13 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
||||
final Activity activity = getActivity();
|
||||
|
||||
switch (id) {
|
||||
case LOADER_ID_DATABASE:
|
||||
case SearchLoaderId.DATABASE:
|
||||
return mSearchFeatureProvider.getDatabaseSearchLoader(activity, mQuery);
|
||||
case LOADER_ID_INSTALLED_APPS:
|
||||
case SearchLoaderId.INSTALLED_APPS:
|
||||
return mSearchFeatureProvider.getInstalledAppSearchLoader(activity, mQuery);
|
||||
case LOADER_ID_ACCESSIBILITY_SERVICES:
|
||||
case SearchLoaderId.ACCESSIBILITY_SERVICES:
|
||||
return mSearchFeatureProvider.getAccessibilityServiceResultLoader(activity, mQuery);
|
||||
case LOADER_ID_INPUT_DEVICES:
|
||||
case SearchLoaderId.INPUT_DEVICES:
|
||||
return mSearchFeatureProvider.getInputDeviceResultLoader(activity, mQuery);
|
||||
default:
|
||||
return null;
|
||||
@@ -351,13 +355,13 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
||||
mSavedQueryController.loadSavedQueries();
|
||||
} else {
|
||||
final LoaderManager loaderManager = getLoaderManager();
|
||||
loaderManager.initLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
|
||||
loaderManager.initLoader(SearchLoaderId.DATABASE, null /* args */, this /* callback */);
|
||||
loaderManager.initLoader(
|
||||
LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
|
||||
SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
|
||||
loaderManager.initLoader(
|
||||
LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
|
||||
SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
|
||||
loaderManager.initLoader(
|
||||
LOADER_ID_INPUT_DEVICES, null /* args */, this /* callback */);
|
||||
SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
|
||||
}
|
||||
|
||||
requery();
|
||||
@@ -395,12 +399,14 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
||||
mShowingSavedQuery = false;
|
||||
final LoaderManager loaderManager = getLoaderManager();
|
||||
mUnfinishedLoadersCount.set(NUM_QUERY_LOADERS);
|
||||
loaderManager.restartLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
|
||||
loaderManager.restartLoader(LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
|
||||
loaderManager.restartLoader(LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */,
|
||||
this /* callback */);
|
||||
loaderManager.restartLoader(LOADER_ID_INPUT_DEVICES, null /* args */,
|
||||
this /* callback */);
|
||||
loaderManager.restartLoader(
|
||||
SearchLoaderId.DATABASE, null /* args */, this /* callback */);
|
||||
loaderManager.restartLoader(
|
||||
SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
|
||||
loaderManager.restartLoader(
|
||||
SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
|
||||
loaderManager.restartLoader(
|
||||
SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
|
||||
}
|
||||
|
||||
public String getQuery() {
|
||||
|
@@ -410,9 +410,9 @@ public class SearchFragmentTest {
|
||||
|
||||
fragment.onIndexingFinished();
|
||||
|
||||
verify(loaderManager).initLoader(eq(SearchFragment.LOADER_ID_DATABASE),
|
||||
verify(loaderManager).initLoader(eq(SearchFragment.SearchLoaderId.DATABASE),
|
||||
eq(null), any(LoaderManager.LoaderCallbacks.class));
|
||||
verify(loaderManager).initLoader(eq(SearchFragment.LOADER_ID_INSTALLED_APPS),
|
||||
verify(loaderManager).initLoader(eq(SearchFragment.SearchLoaderId.INSTALLED_APPS),
|
||||
eq(null), any(LoaderManager.LoaderCallbacks.class));
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user