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