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

Commit 2980aecd authored by Matthew Fritze's avatar Matthew Fritze Committed by android-build-merger
Browse files

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

am: 3042af11

Change-Id: I95fc4f482d864f6bf8283b10236b74bd8cddf9e1
parents cf37a267 3042af11
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));
    }