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

Commit 9bc75cb9 authored by Bjorn Bringert's avatar Bjorn Bringert
Browse files

Initialize searchmanager on demand

The initialization of SearchManagerService is delayed, which caused
problems when other services (e.g. GlobalSearch) start up.
This change makes the SearchManagerService components
initialize when they are first needed, or when the server thread
is done with its other processing, whichever comes first.

Fixes http://b/issue?id=1970975
parent ba3ba579
Loading
Loading
Loading
Loading
+39 −30
Original line number Diff line number Diff line
@@ -43,13 +43,13 @@ public class SearchManagerService extends ISearchManager.Stub {
    // Context that the service is running in.
    private final Context mContext;

    // This field is initialized in initialize(), and then never modified.
    // It is volatile since it can be accessed by multiple threads.
    private volatile Searchables mSearchables;
    // This field is initialized in ensureSearchablesCreated(), and then never modified.
    // Only accessed by ensureSearchablesCreated() and getSearchables()
    private Searchables mSearchables;

    // This field is initialized in initialize(), and then never modified.
    // It is volatile since it can be accessed by multiple threads.
    private volatile SearchDialogWrapper mSearchDialog;
    // This field is initialized in ensureSearchDialogCreated(), and then never modified.
    // Only accessed by ensureSearchDialogCreated() and getSearchDialog()
    private SearchDialogWrapper mSearchDialog;

    /**
     * Initializes the Search Manager service in the provided system context.
@@ -68,16 +68,18 @@ public class SearchManagerService extends ISearchManager.Stub {
    }

    /**
     * Initializes the search UI and the list of searchable activities.
     * Initializes the list of searchable activities and the search UI.
     */
    void initialize() {
        mSearchables = createSearchables();
        mSearchDialog = new SearchDialogWrapper(mContext);
        ensureSearchablesCreated();
        ensureSearchDialogCreated();
    }

    private Searchables createSearchables() {
        Searchables searchables = new Searchables(mContext);
        searchables.buildSearchableList();
    private synchronized void ensureSearchablesCreated() {
        if (mSearchables != null) return;  // already created

        mSearchables = new Searchables(mContext);
        mSearchables.buildSearchableList();

        IntentFilter packageFilter = new IntentFilter();
        packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
@@ -85,8 +87,22 @@ public class SearchManagerService extends ISearchManager.Stub {
        packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        packageFilter.addDataScheme("package");
        mContext.registerReceiver(mPackageChangedReceiver, packageFilter);
    }

    private synchronized void ensureSearchDialogCreated() {
        if (mSearchDialog != null) return;

        return searchables;
        mSearchDialog = new SearchDialogWrapper(mContext);
    }

    private synchronized Searchables getSearchables() {
        ensureSearchablesCreated();
        return mSearchables;
    }

    private synchronized SearchDialogWrapper getSearchDialog() {
        ensureSearchDialogCreated();
        return mSearchDialog;
    }

    /**
@@ -102,9 +118,9 @@ public class SearchManagerService extends ISearchManager.Stub {
                    Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
                if (DBG) Log.d(TAG, "Got " + action);
                // Dismiss search dialog, since the search context may no longer be valid
                mSearchDialog.stopSearch();
                getSearchDialog().stopSearch();
                // Update list of searchable activities
                mSearchables.buildSearchableList();
                getSearchables().buildSearchableList();
                broadcastSearchablesChanged();
            }
        }
@@ -135,15 +151,14 @@ public class SearchManagerService extends ISearchManager.Stub {
     */
    public SearchableInfo getSearchableInfo(final ComponentName launchActivity,
            final boolean globalSearch) {
        if (mSearchables == null) return null;
        if (globalSearch) {
            return mSearchables.getDefaultSearchable();
            return getSearchables().getDefaultSearchable();
        } else {
            if (launchActivity == null) {
                Log.e(TAG, "getSearchableInfo(), activity == null");
                return null;
            }
            return mSearchables.getSearchableInfo(launchActivity);
            return getSearchables().getSearchableInfo(launchActivity);
        }
    }

@@ -151,8 +166,7 @@ public class SearchManagerService extends ISearchManager.Stub {
     * Returns a list of the searchable activities that can be included in global search.
     */
    public List<SearchableInfo> getSearchablesInGlobalSearch() {
        if (mSearchables == null) return null;
        return mSearchables.getSearchablesInGlobalSearchList();
        return getSearchables().getSearchablesInGlobalSearchList();
    }

    /**
@@ -160,8 +174,7 @@ public class SearchManagerService extends ISearchManager.Stub {
     * Can be called from any thread.
     */
    public List<SearchableInfo> getSearchablesForWebSearch() {
        if (mSearchables == null) return null;
        return mSearchables.getSearchablesForWebSearchList();
        return getSearchables().getSearchablesForWebSearchList();
    }

    /**
@@ -169,8 +182,7 @@ public class SearchManagerService extends ISearchManager.Stub {
     * Can be called from any thread.
     */
    public SearchableInfo getDefaultSearchableForWebSearch() {
        if (mSearchables == null) return null;
        return mSearchables.getDefaultSearchableForWebSearch();
        return getSearchables().getDefaultSearchableForWebSearch();
    }

    /**
@@ -178,8 +190,7 @@ public class SearchManagerService extends ISearchManager.Stub {
     * Can be called from any thread.
     */
    public void setDefaultWebSearch(final ComponentName component) {
        if (mSearchables == null) return;
        mSearchables.setDefaultWebSearch(component);
        getSearchables().setDefaultWebSearch(component);
        broadcastSearchablesChanged();
    }

@@ -196,8 +207,7 @@ public class SearchManagerService extends ISearchManager.Stub {
            Bundle appSearchData,
            boolean globalSearch,
            ISearchManagerCallback searchManagerCallback) {
        if (mSearchDialog == null) return;
        mSearchDialog.startSearch(initialQuery,
        getSearchDialog().startSearch(initialQuery,
                selectInitialQuery,
                launchActivity,
                appSearchData,
@@ -209,8 +219,7 @@ public class SearchManagerService extends ISearchManager.Stub {
     * Cancels the search dialog. Can be called from any thread.
     */
    public void stopSearch() {
        if (mSearchDialog == null) return;
        mSearchDialog.stopSearch();
        getSearchDialog().stopSearch();
    }

}