SearchManagerService.java revision ab5d96c5daf4bcc9b7a0cde44357454a11a8e48a
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 19ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringertimport com.android.internal.content.PackageMonitor; 20ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ISearchManager; 228d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.app.SearchManager; 232126aac7f992b57fc52141a8bd09fa7a45ac2509Bjorn Bringertimport android.app.SearchableInfo; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 278d17f3f24bbda9a9cd7ea08c5925508dc2c011beBjorn Bringertimport android.util.Log; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 296d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringertimport java.util.List; 306d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 32444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert * The search manager service handles the search UI, and maintains a registry of searchable 33444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert * activities. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringertpublic class SearchManagerService extends ISearchManager.Stub { 36444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert 37444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert // general debugging support 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "SearchManagerService"; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert // Context that the service is running in. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 42f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 43ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert // This field is initialized lazily in getSearchables(), and then never modified. 449bc75cb9c23e5df528a28acc1fbbb4b5be51c33dBjorn Bringert private Searchables mSearchables; 453ed6a3342b89651e8359956cefcc0076b6a4a30aKarl Rosaen 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 47875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Initializes the Search Manager service in the provided system context. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Only one instance of this object should be created! 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context to use for accessing DB, window manager, etc. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath public SearchManagerService(Context context) { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 54444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert } 55444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert 569bc75cb9c23e5df528a28acc1fbbb4b5be51c33dBjorn Bringert private synchronized Searchables getSearchables() { 57ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert if (mSearchables == null) { 58ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert mSearchables = new Searchables(mContext); 59ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert mSearchables.buildSearchableList(); 60ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert new MyPackageMonitor().register(mContext, true); 61ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert } 629bc75cb9c23e5df528a28acc1fbbb4b5be51c33dBjorn Bringert return mSearchables; 639bc75cb9c23e5df528a28acc1fbbb4b5be51c33dBjorn Bringert } 643ed6a3342b89651e8359956cefcc0076b6a4a30aKarl Rosaen 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 66444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert * Refreshes the "searchables" list when packages are added/removed. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 68ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert class MyPackageMonitor extends PackageMonitor { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 70ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert public void onSomePackagesChanged() { 71ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert // Update list of searchable activities 72ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert getSearchables().buildSearchableList(); 73ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert // Inform all listeners that the list of searchables has been updated. 74ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert Intent intent = new Intent(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED); 75ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 76ab5d96c5daf4bcc9b7a0cde44357454a11a8e48aBjorn Bringert mContext.sendBroadcast(intent); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert // 81444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert // Searchable activities API 82444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert // 83a48a5af931f2fb43c948416180b85dfe9ecdc9a1Bjorn Bringert 84a48a5af931f2fb43c948416180b85dfe9ecdc9a1Bjorn Bringert /** 85444c727e0eecf83e9d0b9c4e7af5cbf5fc4135f8Bjorn Bringert * Returns the SearchableInfo for a given activity. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param launchActivity The activity from which we're launching this search. 88875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return Returns a SearchableInfo record describing the parameters of the search, 89875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * or null if no searchable metadata was available. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 916cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert public SearchableInfo getSearchableInfo(final ComponentName launchActivity) { 926cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert if (launchActivity == null) { 936cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert Log.e(TAG, "getSearchableInfo(), activity == null"); 946cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return null; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 966cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return getSearchables().getSearchableInfo(launchActivity); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 98f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 996d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert /** 1006d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert * Returns a list of the searchable activities that can be included in global search. 1016d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert */ 1026d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert public List<SearchableInfo> getSearchablesInGlobalSearch() { 1039bc75cb9c23e5df528a28acc1fbbb4b5be51c33dBjorn Bringert return getSearchables().getSearchablesInGlobalSearchList(); 1046d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert } 105875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 106f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 1076cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * Gets the name of the global search activity. 108f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 1096cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert public ComponentName getGlobalSearchActivity() { 1106cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return getSearchables().getGlobalSearchActivity(); 111f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 112f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 113f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath /** 1146cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert * Gets the name of the web search activity. 115f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath */ 1166cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert public ComponentName getWebSearchActivity() { 1176cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return getSearchables().getWebSearchActivity(); 118f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath } 119f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 121