Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3042af11 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Prevent race condition between SavedQuery and Query Loader" into oc-mr1-dev

parents 2716e841 21aed344
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -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 */);
    }
}
+33 −27
Original line number Diff line number Diff line
@@ -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() {
+2 −2
Original line number Diff line number Diff line
@@ -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));
    }