196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert/* 296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Copyright (C) 2009 The Android Open Source Project 396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * 496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * you may not use this file except in compliance with the License. 696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * You may obtain a copy of the License at 796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * 896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * 1096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 1196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 1296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * See the License for the specific language governing permissions and 1496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * limitations under the License. 1596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 1696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 1796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertpackage com.android.quicksearchbox; 1896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 19269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringertimport com.android.common.SharedPreferencesCompat; 20d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 2196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.app.SearchManager; 2296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.content.Context; 2396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.content.Intent; 2496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.content.SharedPreferences; 25c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamathimport android.content.SharedPreferences.Editor; 2696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.util.Log; 2796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.view.Menu; 2896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.view.MenuInflater; 2996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.view.MenuItem; 3096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 3196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert/** 3296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Manages user settings. 3396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 3496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertpublic class SearchSettingsImpl implements SearchSettings { 3596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 3696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final boolean DBG = false; 3796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String TAG = "QSB.SearchSettingsImpl"; 3896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 3996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert // Name of the preferences file used to store search preference 4096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public static final String PREFERENCES_NAME = "SearchSettings"; 4196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 4296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert // Intent action that opens the "Searchable Items" preference 4396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String ACTION_SEARCHABLE_ITEMS = 4496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert "com.android.quicksearchbox.action.SEARCHABLE_ITEMS"; 4596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 4696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 4796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Preference key used for storing the index of the next voice search hint to show. 4896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 4996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String NEXT_VOICE_SEARCH_HINT_INDEX_PREF = "next_voice_search_hint"; 5096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 5196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 5296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Preference key used to store the time at which the first voice search hint was displayed. 5396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 5496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String FIRST_VOICE_HINT_DISPLAY_TIME = "first_voice_search_hint_time"; 5596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 5696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 5796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Preference key for the version of voice search we last got hints from. 5896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 5996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String LAST_SEEN_VOICE_SEARCH_VERSION = "voice_search_version"; 6096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 6196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 628074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath * Preference key for storing whether searches always go to google.com. Public 638074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath * so that it can be used by PreferenceControllers. 64c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath */ 658074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath public static final String USE_GOOGLE_COM_PREF = "use_google_com"; 66c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 673ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath /** 683ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath * Preference key for the base search URL. This value is normally set by 693ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath * a SearchBaseUrlHelper instance. Public so classes can listen to changes 703ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath * on this key. 713ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath */ 728f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public static final String SEARCH_BASE_DOMAIN_PREF = "search_base_domain"; 73c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 74c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath /** 75c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * This is the time at which the base URL was stored, and is set using 76c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * @link{System.currentTimeMillis()}. 77c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath */ 788f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath private static final String SEARCH_BASE_DOMAIN_APPLY_TIME = "search_base_domain_apply_time"; 79c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 80c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath /** 8196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Prefix of per-corpus enable preference 8296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 8396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String CORPUS_ENABLED_PREF_PREFIX = "enable_corpus_"; 8496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 8596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private final Context mContext; 8696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 8796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private final Config mConfig; 8896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 8996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public SearchSettingsImpl(Context context, Config config) { 9096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert mContext = context; 9196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert mConfig = config; 9296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 9396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 9496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert protected Context getContext() { 9596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return mContext; 9696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 9796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 9896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert protected Config getConfig() { 9996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return mConfig; 10096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 10196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 10296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public void upgradeSettingsIfNeeded() { 10396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 10496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 10596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public Intent getSearchableItemsIntent() { 10696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert Intent intent = new Intent(ACTION_SEARCHABLE_ITEMS); 10796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert intent.setPackage(getContext().getPackageName()); 10896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return intent; 10996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 11096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 11196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 11296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Gets the preference key of the preference for whether the given corpus 11396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * is enabled. The preference is stored in the {@link #PREFERENCES_NAME} 11496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * preferences file. 11596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 11696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public static String getCorpusEnabledPreference(Corpus corpus) { 11796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return CORPUS_ENABLED_PREF_PREFIX + corpus.getName(); 11896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 11996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 12096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public boolean isCorpusEnabled(Corpus corpus) { 12196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert boolean defaultEnabled = corpus.isCorpusDefaultEnabled(); 12296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert String sourceEnabledPref = getCorpusEnabledPreference(corpus); 12396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return getSearchPreferences().getBoolean(sourceEnabledPref, defaultEnabled); 12496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 12596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 126b1cdcbce5d9c5edb20309c59b7cb52f76bbfac72Narayan Kamath public SharedPreferences getSearchPreferences() { 12796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return getContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); 12896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 12996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 130d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeBoolean(String name, boolean value) { 131269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putBoolean(name, value)); 132d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 133d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 134d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeInt(String name, int value) { 135269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putInt(name, value)); 136d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 137d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 138d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeLong(String name, long value) { 139269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putLong(name, value)); 140d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 141d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 142d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeString(String name, String value) { 143269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putString(name, value)); 144d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 145d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 146d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void removePref(String name) { 147269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().remove(name)); 148d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 149d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 15096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 15196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Informs our listeners about the updated settings data. 15296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 15396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public void broadcastSettingsChanged() { 15496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert // We use a message broadcast since the listeners could be in multiple processes. 15596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert Intent intent = new Intent(SearchManager.INTENT_ACTION_SEARCH_SETTINGS_CHANGED); 15696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert Log.i(TAG, "Broadcasting: " + intent); 15796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert getContext().sendBroadcast(intent); 15896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 15996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 16073a375928e0b8f0b2bfa09e4b252cfcbdad4ef84Bjorn Bringert public void addMenuItems(Menu menu, boolean showDisabled) { 16196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert MenuInflater inflater = new MenuInflater(getContext()); 16296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert inflater.inflate(R.menu.settings, menu); 16396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert MenuItem item = menu.findItem(R.id.menu_settings); 16496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert item.setIntent(getSearchSettingsIntent()); 16596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 16696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 16796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public Intent getSearchSettingsIntent() { 16896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert Intent settings = new Intent(SearchManager.INTENT_ACTION_SEARCH_SETTINGS); 16996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert settings.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 17096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert settings.setPackage(getContext().getPackageName()); 17196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return settings; 17296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 17396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 17496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public int getNextVoiceSearchHintIndex(int size) { 17596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert int i = getAndIncrementIntPreference(getSearchPreferences(), 17696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert NEXT_VOICE_SEARCH_HINT_INDEX_PREF); 17796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return i % size; 17896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 17996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 18096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert // TODO: Could this be made atomic to avoid races? 181d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert private int getAndIncrementIntPreference(SharedPreferences prefs, String name) { 18296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert int i = prefs.getInt(name, 0); 183d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert storeInt(name, i + 1); 18496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return i; 18596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 18696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 18796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public void resetVoiceSearchHintFirstSeenTime() { 188d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert storeLong(FIRST_VOICE_HINT_DISPLAY_TIME, System.currentTimeMillis()); 18996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 19096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 19196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public boolean haveVoiceSearchHintsExpired(int currentVoiceSearchVersion) { 19296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert SharedPreferences prefs = getSearchPreferences(); 19396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 19496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (currentVoiceSearchVersion != 0) { 19596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert long currentTime = System.currentTimeMillis(); 19696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert int lastVoiceSearchVersion = prefs.getInt(LAST_SEEN_VOICE_SEARCH_VERSION, 0); 19796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert long firstHintTime = prefs.getLong(FIRST_VOICE_HINT_DISPLAY_TIME, 0); 19896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (firstHintTime == 0 || currentVoiceSearchVersion != lastVoiceSearchVersion) { 199269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(prefs.edit() 20096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert .putInt(LAST_SEEN_VOICE_SEARCH_VERSION, currentVoiceSearchVersion) 201d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert .putLong(FIRST_VOICE_HINT_DISPLAY_TIME, currentTime)); 20296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert firstHintTime = currentTime; 20396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 20496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (currentTime - firstHintTime > getConfig().getVoiceSearchHintActivePeriod()) { 20596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (DBG) Log.d(TAG, "Voice seach hint period expired; not showing hints."); 20696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return true; 20796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } else { 20896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return false; 20996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 21096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } else { 21196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (DBG) Log.d(TAG, "Could not determine voice search version; not showing hints."); 21296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return true; 21396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 21496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 21596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 2168749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert public boolean allowWebSearchShortcuts() { 2178749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert return true; 2188749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert } 2198749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert 220c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath /** 221c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * @return true if user searches should always be based at google.com, false 222c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * otherwise. 223c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath */ 224c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath @Override 225c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath public boolean shouldUseGoogleCom() { 226c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath // Note that this preserves the old behaviour of using google.com 227c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath // for searches, with the gl= parameter set. 2288074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath return getSearchPreferences().getBoolean(USE_GOOGLE_COM_PREF, true); 229c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 230c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 231c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath @Override 232c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath public void setUseGoogleCom(boolean useGoogleCom) { 2338074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath storeBoolean(USE_GOOGLE_COM_PREF, useGoogleCom); 234c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 235c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 2368074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath @Override 2378f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public long getSearchBaseDomainApplyTime() { 2388f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath return getSearchPreferences().getLong(SEARCH_BASE_DOMAIN_APPLY_TIME, -1); 239c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 240c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 2418074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath @Override 2428f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public String getSearchBaseDomain() { 243f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // Note that the only time this will return null is on the first run 244f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // of the app, or when settings have been cleared. Callers should 245f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // ideally check that getSearchBaseDomainApplyTime() is not -1 before 246f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // calling this function. 2478f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath return getSearchPreferences().getString(SEARCH_BASE_DOMAIN_PREF, null); 248c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 249c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 2508074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath @Override 2518f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public void setSearchBaseDomain(String searchBaseUrl) { 252c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath Editor sharedPrefEditor = getSearchPreferences().edit(); 2538f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath sharedPrefEditor.putString(SEARCH_BASE_DOMAIN_PREF, searchBaseUrl); 2548f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath sharedPrefEditor.putLong(SEARCH_BASE_DOMAIN_APPLY_TIME, System.currentTimeMillis()); 255c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 256c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath SharedPreferencesCompat.apply(sharedPrefEditor); 257c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 25896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert} 259