SearchableSources.java revision 49fd8e0994577badc6194c2c3b5f771f2b793fe4
1fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert/* 2fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * Copyright (C) 2009 The Android Open Source Project 3fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * 4fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 5fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * you may not use this file except in compliance with the License. 6fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * You may obtain a copy of the License at 7fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * 8fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 9fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * 10fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * Unless required by applicable law or agreed to in writing, software 11fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 12fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * See the License for the specific language governing permissions and 14fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * limitations under the License. 15fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert */ 16fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 17fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertpackage com.android.quicksearchbox; 18fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 1949fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringertimport com.android.quicksearchbox.google.GoogleSource; 2049fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert 21fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport android.app.SearchManager; 22fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport android.app.SearchableInfo; 23fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport android.content.ComponentName; 24fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport android.content.Context; 25fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport android.content.pm.PackageManager.NameNotFoundException; 26fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport android.util.Log; 27fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 28fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport java.util.Collection; 29fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringertimport java.util.HashMap; 30b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringertimport java.util.List; 31fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 32fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert/** 33fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * Maintains a list of search sources. 34fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert */ 35883c1bf364e38c5b133afb55f8493a14b65f4dd4Bjorn Bringertpublic class SearchableSources implements Sources { 36fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 37fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert // set to true to enable the more verbose debug logging for this file 38fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert private static final boolean DBG = false; 39fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert private static final String TAG = "QSB.SearchableSources"; 40fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 41fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert private final Context mContext; 42fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert private final SearchManager mSearchManager; 43fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 4462adab88055fd0ef6779242245cdc8c3ae5f999cBjorn Bringert // All suggestion sources, by name. 4562adab88055fd0ef6779242245cdc8c3ae5f999cBjorn Bringert private HashMap<String, Source> mSources; 46fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 47fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert // The web search source to use. 48fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert private Source mWebSearchSource; 49fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 50fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** 51fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * 52fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert * @param context Used for looking up source information etc. 53fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert */ 5421bff9bbf4286907b01d3153bff2fbd6b5ec5df8Bjorn Bringert public SearchableSources(Context context) { 55fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert mContext = context; 56fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert mSearchManager = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE); 57fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 58fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 5949fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert protected Context getContext() { 6049fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert return mContext; 6149fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert } 6249fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert 6349fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert protected SearchManager getSearchManager() { 6449fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert return mSearchManager; 6549fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert } 6649fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert 67fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public Collection<Source> getSources() { 68fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert return mSources.values(); 69fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 70fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 7162adab88055fd0ef6779242245cdc8c3ae5f999cBjorn Bringert public Source getSource(String name) { 72fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert return mSources.get(name); 73fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 74fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 75fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert public Source getWebSearchSource() { 76fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert return mWebSearchSource; 77fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 78fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 79fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert /** 8021bff9bbf4286907b01d3153bff2fbd6b5ec5df8Bjorn Bringert * Updates the list of suggestion sources. 81fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert */ 8221bff9bbf4286907b01d3153bff2fbd6b5ec5df8Bjorn Bringert public void update() { 8321bff9bbf4286907b01d3153bff2fbd6b5ec5df8Bjorn Bringert if (DBG) Log.d(TAG, "update()"); 8462adab88055fd0ef6779242245cdc8c3ae5f999cBjorn Bringert mSources = new HashMap<String,Source>(); 85b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert 86b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert addSearchableSources(); 87b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert 88b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert mWebSearchSource = createWebSearchSource(); 89b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert addSource(mWebSearchSource); 90b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert } 91b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert 92b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert private void addSearchableSources() { 93b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert List<SearchableInfo> searchables = mSearchManager.getSearchablesInGlobalSearch(); 94b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert if (searchables == null) { 95b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert Log.e(TAG, "getSearchablesInGlobalSearch() returned null"); 96b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert return; 97b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert } 98b46040af250f9d5cf65ea4e39595c7b88531241aBjorn Bringert for (SearchableInfo searchable : searchables) { 99cc10dcf07c4e787abd66f4e2cfed31a09580a3b0Bjorn Bringert SearchableSource source = createSearchableSource(searchable); 10081a0897ff9685f3313c58294bf7973700c468b2bBjorn Bringert if (source != null) { 101fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert if (DBG) Log.d(TAG, "Created source " + source); 102fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert addSource(source); 103fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 104fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 105fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 106fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 107fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert private void addSource(Source source) { 10862adab88055fd0ef6779242245cdc8c3ae5f999cBjorn Bringert mSources.put(source.getName(), source); 109fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 110fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 11149fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert protected Source createWebSearchSource() { 11249fd8e0994577badc6194c2c3b5f771f2b793fe4Bjorn Bringert return new GoogleSource(getContext()); 113fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 114fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert 115cc10dcf07c4e787abd66f4e2cfed31a09580a3b0Bjorn Bringert private SearchableSource createSearchableSource(SearchableInfo searchable) { 116fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert if (searchable == null) return null; 117fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert try { 118fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert return new SearchableSource(mContext, searchable); 119fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } catch (NameNotFoundException ex) { 120fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert Log.e(TAG, "Source not found: " + ex); 121fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert return null; 122fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 123fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert } 1241e53e72fbfc32995a97bbd25ae44bfea7b8781deMathew Inwood 1251e53e72fbfc32995a97bbd25ae44bfea7b8781deMathew Inwood public Source createSourceFor(ComponentName component) { 1261e53e72fbfc32995a97bbd25ae44bfea7b8781deMathew Inwood SearchableInfo info = mSearchManager.getSearchableInfo(component); 1271e53e72fbfc32995a97bbd25ae44bfea7b8781deMathew Inwood SearchableSource source = createSearchableSource(info); 1282fd5aa82682f077660faa8ec60c04238026a8731Mathew Inwood if (DBG) Log.d(TAG, "SearchableSource for " + component + ": " + source); 1291e53e72fbfc32995a97bbd25ae44bfea7b8781deMathew Inwood return source; 1301e53e72fbfc32995a97bbd25ae44bfea7b8781deMathew Inwood } 131fde948e69f59589cf0d217ea414af7947de600bbBjorn Bringert} 132