1848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani/* 2848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * Copyright (C) 2010 The Android Open Source Project 3848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * 4848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 5848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * you may not use this file except in compliance with the License. 6848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * You may obtain a copy of the License at 7848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * 8848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 9848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * 10848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * Unless required by applicable law or agreed to in writing, software 11848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 12848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * See the License for the specific language governing permissions and 14848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * limitations under the License. 15848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani */ 16848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasanipackage com.android.quicksearchbox.google; 17848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 18f3f70e5ae88f06ff6dabdec9e7c71a19ca1e7108Bjorn Bringertimport com.android.quicksearchbox.AbstractInternalSource; 1953aab8c4459f45664d04ec882d67094c52b78695Bjorn Bringertimport com.android.quicksearchbox.Config; 20848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport com.android.quicksearchbox.CursorBackedSourceResult; 21848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport com.android.quicksearchbox.R; 22848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport com.android.quicksearchbox.SourceResult; 23848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport com.android.quicksearchbox.SuggestionCursor; 24516781305d7427e79928c95c6ea2b7689a4bf6ceMathew Inwoodimport com.android.quicksearchbox.util.NamedTaskExecutor; 25848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 26848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport android.content.ComponentName; 27848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport android.content.Context; 28848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport android.content.Intent; 29848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport android.os.Bundle; 30e29d52aa72c96c3147fa91d83aeb8dafc6d1f578Mathew Inwoodimport android.os.Handler; 31848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 32848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani/** 33848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * Special source implementation for Google suggestions. 34848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani */ 35f3f70e5ae88f06ff6dabdec9e7c71a19ca1e7108Bjorn Bringertpublic abstract class AbstractGoogleSource extends AbstractInternalSource implements GoogleSource { 36848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 37848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani /* 38848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * This name corresponds to what was used in previous version of quick search box. We use the 39848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * same name so that shortcuts continue to work after an upgrade. (It also makes logging more 40848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * consistent). 41848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani */ 42848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani private static final String GOOGLE_SOURCE_NAME = 43848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani "com.android.quicksearchbox/.google.GoogleSearch"; 44848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 45516781305d7427e79928c95c6ea2b7689a4bf6ceMathew Inwood public AbstractGoogleSource(Context context, Handler uiThread, NamedTaskExecutor iconLoader) { 46516781305d7427e79928c95c6ea2b7689a4bf6ceMathew Inwood super(context, uiThread, iconLoader); 47848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 48848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 49848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public abstract ComponentName getIntentComponent(); 50848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 51848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public abstract SuggestionCursor refreshShortcut(String shortcutId, String extraData); 52848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 53848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani /** 54848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * Called by QSB to get web suggestions for a query. 55848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani */ 56848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public abstract SourceResult queryInternal(String query); 57848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 58848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani /** 59848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani * Called by external apps to get web suggestions for a query. 60848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani */ 61848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public abstract SourceResult queryExternal(String query); 62848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 63848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public Intent createVoiceSearchIntent(Bundle appData) { 64848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return createVoiceWebSearchIntent(appData); 65848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 66848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 67848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public String getDefaultIntentAction() { 68848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return Intent.ACTION_WEB_SEARCH; 69848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 70848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 71848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public CharSequence getHint() { 72848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return getContext().getString(R.string.google_search_hint); 73848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 74848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 75848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public CharSequence getLabel() { 76848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return getContext().getString(R.string.google_search_label); 77848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 78848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 79848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public String getName() { 80848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return GOOGLE_SOURCE_NAME; 81848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 82848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 83848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public CharSequence getSettingsDescription() { 84848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return getContext().getString(R.string.google_search_description); 85848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 86848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 875229b06f00d20aac76cd8519b37f2a579d61c54fMathew Inwood @Override 88f3f70e5ae88f06ff6dabdec9e7c71a19ca1e7108Bjorn Bringert protected int getSourceIconResource() { 89138c0a8d821f02d13e73bfc579ad9bded7d4d683Ying Wang return R.mipmap.google_icon; 90848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 91848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 92848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public SourceResult getSuggestions(String query, int queryLimit, boolean onlySource) { 93848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return emptyIfNull(queryInternal(query), query); 94848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 95848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 96848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani public SourceResult getSuggestionsExternal(String query) { 97848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return emptyIfNull(queryExternal(query), query); 98848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 99848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 100848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani private SourceResult emptyIfNull(SourceResult result, String query) { 101848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return result == null ? new CursorBackedSourceResult(this, query) : result; 102848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 103848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 104f3f70e5ae88f06ff6dabdec9e7c71a19ca1e7108Bjorn Bringert public boolean voiceSearchEnabled() { 105848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return true; 106848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 107848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 10853aab8c4459f45664d04ec882d67094c52b78695Bjorn Bringert public int getMaxShortcuts(Config config) { 10953aab8c4459f45664d04ec882d67094c52b78695Bjorn Bringert return config.getMaxShortcutsPerWebSource(); 110848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 111848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 112f3f70e5ae88f06ff6dabdec9e7c71a19ca1e7108Bjorn Bringert public boolean includeInAll() { 113848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani return true; 114848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani } 115848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 116848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani} 117