SearchManagerService.java revision 444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.server.search;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ISearchManager;
208d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.app.ISearchManagerCallback;
218d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.app.SearchManager;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
278d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.os.Bundle;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
298d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.util.Log;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
316d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringertimport java.util.List;
326d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
34444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert * The search manager service handles the search UI, and maintains a registry of searchable
35444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert * activities.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
37444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringertpublic class SearchManagerService extends ISearchManager.Stub {
38444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert
39444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // general debugging support
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "SearchManagerService";
418d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    private static final boolean DBG = false;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // Context that the service is running in.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
45f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
46444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // This field is initialized in initialize(), and then never modified.
47444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // It is volatile since it can be accessed by multiple threads.
48444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    private volatile Searchables mSearchables;
493ed6a3342b89651e8359956cefcc0076b6a4a30aKarl Rosaen
50444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // This field is initialized in initialize(), and then never modified.
51444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // It is volatile since it can be accessed by multiple threads.
52444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    private volatile SearchDialogWrapper mSearchDialog;
533ed6a3342b89651e8359956cefcc0076b6a4a30aKarl Rosaen
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
55875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * Initializes the Search Manager service in the provided system context.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Only one instance of this object should be created!
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context to use for accessing DB, window manager, etc.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    public SearchManagerService(Context context)  {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
62444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        // call initialize() after all pending actions on the main system thread have finished
63444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        new Handler().post(new Runnable() {
64444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            public void run() {
65444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                initialize();
66444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            }
67444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        });
68444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    }
69f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
70444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    /**
71444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Initializes the search UI and the list of searchable activities.
72444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     */
73444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    void initialize() {
74444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        mSearchables = createSearchables();
75444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        mSearchDialog = new SearchDialogWrapper(mContext);
76444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    }
77444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert
78444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    private Searchables createSearchables() {
79444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        Searchables searchables = new Searchables(mContext);
80444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        searchables.buildSearchableList();
81f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
82444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        IntentFilter packageFilter = new IntentFilter();
83444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
84444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
85444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
86444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        packageFilter.addDataScheme("package");
87444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        mContext.registerReceiver(mPackageChangedReceiver, packageFilter);
883ed6a3342b89651e8359956cefcc0076b6a4a30aKarl Rosaen
89444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        return searchables;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
91f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
93444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Refreshes the "searchables" list when packages are added/removed.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
95444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    private BroadcastReceiver mPackageChangedReceiver = new BroadcastReceiver() {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String action = intent.getAction();
99f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
100444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            if (Intent.ACTION_PACKAGE_ADDED.equals(action) ||
101444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                    Intent.ACTION_PACKAGE_REMOVED.equals(action) ||
102444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                    Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
103444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                if (DBG) Log.d(TAG, "Got " + action);
104444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                // Dismiss search dialog, since the search context may no longer be valid
105444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                mSearchDialog.stopSearch();
106444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                // Update list of searchable activities
107444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                mSearchables.buildSearchableList();
108444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                broadcastSearchablesChanged();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
112f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
114444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Informs all listeners that the list of searchables has been updated.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
116444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    void broadcastSearchablesChanged() {
117444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        mContext.sendBroadcast(
118444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                new Intent(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED));
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
121444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    //
122444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // Searchable activities API
123444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    //
124a48a5af931f2fb43c948416180b85dfe9ecdc9a1Bjorn Bringert
125a48a5af931f2fb43c948416180b85dfe9ecdc9a1Bjorn Bringert    /**
126444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Returns the SearchableInfo for a given activity.
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param launchActivity The activity from which we're launching this search.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalSearch If false, this will only launch the search that has been specifically
130f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     * defined by the application (which is usually defined as a local search).  If no default
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * search is defined in the current application or activity, no search will be launched.
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If true, this will always launch a platform-global (e.g. web-based) search instead.
133875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * @return Returns a SearchableInfo record describing the parameters of the search,
134875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen     * or null if no searchable metadata was available.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
136444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    public SearchableInfo getSearchableInfo(final ComponentName launchActivity,
137444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            final boolean globalSearch) {
138444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        if (mSearchables == null) return null;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (globalSearch) {
140444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            return mSearchables.getDefaultSearchable();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1428d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            if (launchActivity == null) {
1438d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert                Log.e(TAG, "getSearchableInfo(), activity == null");
1448d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert                return null;
1458d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert            }
146444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            return mSearchables.getSearchableInfo(launchActivity);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
149f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
1506d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert    /**
1516d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert     * Returns a list of the searchable activities that can be included in global search.
1526d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert     */
1536d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert    public List<SearchableInfo> getSearchablesInGlobalSearch() {
154444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        if (mSearchables == null) return null;
1556d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert        return mSearchables.getSearchablesInGlobalSearchList();
1566d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert    }
157875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen
158f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    /**
159f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     * Returns a list of the searchable activities that handle web searches.
160444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Can be called from any thread.
161f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     */
162f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    public List<SearchableInfo> getSearchablesForWebSearch() {
163444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        if (mSearchables == null) return null;
164f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath        return mSearchables.getSearchablesForWebSearchList();
165f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    }
166f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
167f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    /**
168f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     * Returns the default searchable activity for web searches.
169444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Can be called from any thread.
170f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     */
171f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    public SearchableInfo getDefaultSearchableForWebSearch() {
172444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        if (mSearchables == null) return null;
173f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath        return mSearchables.getDefaultSearchableForWebSearch();
174f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    }
175f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath
176f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    /**
177f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     * Sets the default searchable activity for web searches.
178444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Can be called from any thread.
179f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath     */
180444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    public void setDefaultWebSearch(final ComponentName component) {
181444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        if (mSearchables == null) return;
182f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath        mSearchables.setDefaultWebSearch(component);
183444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        broadcastSearchablesChanged();
184f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath    }
1858d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
186444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    // Search UI API
187444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert
1888d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    /**
189444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Launches the search UI. Can be called from any thread.
1908d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert     *
191444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * @see SearchManager#startSearch(String, boolean, ComponentName, Bundle, boolean)
1928d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert     */
193444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    public void startSearch(String initialQuery,
194444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            boolean selectInitialQuery,
195444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            ComponentName launchActivity,
196444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            Bundle appSearchData,
197444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            boolean globalSearch,
198444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert            ISearchManagerCallback searchManagerCallback) {
199444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        if (mSearchDialog == null) return;
200444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        mSearchDialog.startSearch(initialQuery,
201444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                selectInitialQuery,
202444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                launchActivity,
203444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                appSearchData,
204444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                globalSearch,
205444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert                searchManagerCallback);
2068d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    }
2078d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
208444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    /**
209444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     * Cancels the search dialog. Can be called from any thread.
210444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert     */
211444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert    public void stopSearch() {
212444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        if (mSearchDialog == null) return;
213444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert        mSearchDialog.stopSearch();
2148d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert    }
2158d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringert
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
217