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