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 {
|
MenuItem.OnMenuItemClickListener {
|
||||||
|
|
||||||
// TODO: make a generic background task manager to handle one-off tasks like this one.
|
// 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 ARG_QUERY = "remove_query";
|
||||||
private static final String TAG = "SearchSavedQueryCtrl";
|
private static final String TAG = "SearchSavedQueryCtrl";
|
||||||
|
|
||||||
@@ -60,11 +56,11 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
|||||||
@Override
|
@Override
|
||||||
public Loader onCreateLoader(int id, Bundle args) {
|
public Loader onCreateLoader(int id, Bundle args) {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case LOADER_ID_SAVE_QUERY_TASK:
|
case SearchFragment.SearchLoaderId.SAVE_QUERY_TASK:
|
||||||
return new SavedQueryRecorder(mContext, args.getString(ARG_QUERY));
|
return new SavedQueryRecorder(mContext, args.getString(ARG_QUERY));
|
||||||
case LOADER_ID_REMOVE_QUERY_TASK:
|
case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
|
||||||
return new SavedQueryRemover(mContext);
|
return new SavedQueryRemover(mContext);
|
||||||
case LOADER_ID_SAVED_QUERIES:
|
case SearchFragment.SearchLoaderId.SAVED_QUERIES:
|
||||||
return mSearchFeatureProvider.getSavedQueryLoader(mContext);
|
return mSearchFeatureProvider.getSavedQueryLoader(mContext);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -73,10 +69,11 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
|||||||
@Override
|
@Override
|
||||||
public void onLoadFinished(Loader loader, Object data) {
|
public void onLoadFinished(Loader loader, Object data) {
|
||||||
switch (loader.getId()) {
|
switch (loader.getId()) {
|
||||||
case LOADER_ID_REMOVE_QUERY_TASK:
|
case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
|
||||||
mLoaderManager.restartLoader(LOADER_ID_SAVED_QUERIES, null, this);
|
mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES,
|
||||||
|
null /* args */, this /* callback */);
|
||||||
break;
|
break;
|
||||||
case LOADER_ID_SAVED_QUERIES:
|
case SearchFragment.SearchLoaderId.SAVED_QUERIES:
|
||||||
if (SettingsSearchIndexablesProvider.DEBUG) {
|
if (SettingsSearchIndexablesProvider.DEBUG) {
|
||||||
Log.d(TAG, "Saved queries loaded");
|
Log.d(TAG, "Saved queries loaded");
|
||||||
}
|
}
|
||||||
@@ -107,7 +104,8 @@ public class SavedQueryController implements LoaderManager.LoaderCallbacks,
|
|||||||
public void saveQuery(String query) {
|
public void saveQuery(String query) {
|
||||||
final Bundle args = new Bundle();
|
final Bundle args = new Bundle();
|
||||||
args.putString(ARG_QUERY, query);
|
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() {
|
public void removeQueries() {
|
||||||
final Bundle args = new Bundle();
|
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() {
|
public void loadSavedQueries() {
|
||||||
if (SettingsSearchIndexablesProvider.DEBUG) {
|
if (SettingsSearchIndexablesProvider.DEBUG) {
|
||||||
Log.d(TAG, "loading saved queries");
|
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_NEVER_ENTERED_QUERY = "state_never_entered_query";
|
||||||
private static final String STATE_RESULT_CLICK_COUNT = "state_result_click_count";
|
private static final String STATE_RESULT_CLICK_COUNT = "state_result_click_count";
|
||||||
|
|
||||||
// Loader IDs
|
static final class SearchLoaderId {
|
||||||
@VisibleForTesting
|
// Search Query IDs
|
||||||
static final int LOADER_ID_DATABASE = 1;
|
public static final int DATABASE = 1;
|
||||||
@VisibleForTesting
|
public static final int INSTALLED_APPS = 2;
|
||||||
static final int LOADER_ID_INSTALLED_APPS = 2;
|
public static final int ACCESSIBILITY_SERVICES = 3;
|
||||||
@VisibleForTesting
|
public static final int INPUT_DEVICES = 4;
|
||||||
static final int LOADER_ID_ACCESSIBILITY_SERVICES = 3;
|
|
||||||
@VisibleForTesting
|
// Saved Query IDs
|
||||||
static final int LOADER_ID_INPUT_DEVICES = 4;
|
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;
|
private static final int NUM_QUERY_LOADERS = 4;
|
||||||
|
|
||||||
@@ -283,10 +287,10 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
|||||||
|
|
||||||
if (isEmptyQuery) {
|
if (isEmptyQuery) {
|
||||||
final LoaderManager loaderManager = getLoaderManager();
|
final LoaderManager loaderManager = getLoaderManager();
|
||||||
loaderManager.destroyLoader(LOADER_ID_DATABASE);
|
loaderManager.destroyLoader(SearchLoaderId.DATABASE);
|
||||||
loaderManager.destroyLoader(LOADER_ID_INSTALLED_APPS);
|
loaderManager.destroyLoader(SearchLoaderId.INSTALLED_APPS);
|
||||||
loaderManager.destroyLoader(LOADER_ID_ACCESSIBILITY_SERVICES);
|
loaderManager.destroyLoader(SearchLoaderId.ACCESSIBILITY_SERVICES);
|
||||||
loaderManager.destroyLoader(LOADER_ID_INPUT_DEVICES);
|
loaderManager.destroyLoader(SearchLoaderId.INPUT_DEVICES);
|
||||||
mShowingSavedQuery = true;
|
mShowingSavedQuery = true;
|
||||||
mSavedQueryController.loadSavedQueries();
|
mSavedQueryController.loadSavedQueries();
|
||||||
mSearchFeatureProvider.hideFeedbackButton();
|
mSearchFeatureProvider.hideFeedbackButton();
|
||||||
@@ -311,13 +315,13 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
|||||||
final Activity activity = getActivity();
|
final Activity activity = getActivity();
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case LOADER_ID_DATABASE:
|
case SearchLoaderId.DATABASE:
|
||||||
return mSearchFeatureProvider.getDatabaseSearchLoader(activity, mQuery);
|
return mSearchFeatureProvider.getDatabaseSearchLoader(activity, mQuery);
|
||||||
case LOADER_ID_INSTALLED_APPS:
|
case SearchLoaderId.INSTALLED_APPS:
|
||||||
return mSearchFeatureProvider.getInstalledAppSearchLoader(activity, mQuery);
|
return mSearchFeatureProvider.getInstalledAppSearchLoader(activity, mQuery);
|
||||||
case LOADER_ID_ACCESSIBILITY_SERVICES:
|
case SearchLoaderId.ACCESSIBILITY_SERVICES:
|
||||||
return mSearchFeatureProvider.getAccessibilityServiceResultLoader(activity, mQuery);
|
return mSearchFeatureProvider.getAccessibilityServiceResultLoader(activity, mQuery);
|
||||||
case LOADER_ID_INPUT_DEVICES:
|
case SearchLoaderId.INPUT_DEVICES:
|
||||||
return mSearchFeatureProvider.getInputDeviceResultLoader(activity, mQuery);
|
return mSearchFeatureProvider.getInputDeviceResultLoader(activity, mQuery);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
@@ -351,13 +355,13 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
|||||||
mSavedQueryController.loadSavedQueries();
|
mSavedQueryController.loadSavedQueries();
|
||||||
} else {
|
} else {
|
||||||
final LoaderManager loaderManager = getLoaderManager();
|
final LoaderManager loaderManager = getLoaderManager();
|
||||||
loaderManager.initLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
|
loaderManager.initLoader(SearchLoaderId.DATABASE, null /* args */, this /* callback */);
|
||||||
loaderManager.initLoader(
|
loaderManager.initLoader(
|
||||||
LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
|
SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
|
||||||
loaderManager.initLoader(
|
loaderManager.initLoader(
|
||||||
LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
|
SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
|
||||||
loaderManager.initLoader(
|
loaderManager.initLoader(
|
||||||
LOADER_ID_INPUT_DEVICES, null /* args */, this /* callback */);
|
SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
|
||||||
}
|
}
|
||||||
|
|
||||||
requery();
|
requery();
|
||||||
@@ -395,12 +399,14 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
|||||||
mShowingSavedQuery = false;
|
mShowingSavedQuery = false;
|
||||||
final LoaderManager loaderManager = getLoaderManager();
|
final LoaderManager loaderManager = getLoaderManager();
|
||||||
mUnfinishedLoadersCount.set(NUM_QUERY_LOADERS);
|
mUnfinishedLoadersCount.set(NUM_QUERY_LOADERS);
|
||||||
loaderManager.restartLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
|
loaderManager.restartLoader(
|
||||||
loaderManager.restartLoader(LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
|
SearchLoaderId.DATABASE, null /* args */, this /* callback */);
|
||||||
loaderManager.restartLoader(LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */,
|
loaderManager.restartLoader(
|
||||||
this /* callback */);
|
SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
|
||||||
loaderManager.restartLoader(LOADER_ID_INPUT_DEVICES, null /* args */,
|
loaderManager.restartLoader(
|
||||||
this /* callback */);
|
SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
|
||||||
|
loaderManager.restartLoader(
|
||||||
|
SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getQuery() {
|
public String getQuery() {
|
||||||
|
@@ -410,9 +410,9 @@ public class SearchFragmentTest {
|
|||||||
|
|
||||||
fragment.onIndexingFinished();
|
fragment.onIndexingFinished();
|
||||||
|
|
||||||
verify(loaderManager).initLoader(eq(SearchFragment.LOADER_ID_DATABASE),
|
verify(loaderManager).initLoader(eq(SearchFragment.SearchLoaderId.DATABASE),
|
||||||
eq(null), any(LoaderManager.LoaderCallbacks.class));
|
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));
|
eq(null), any(LoaderManager.LoaderCallbacks.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user