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