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 1996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.app.SearchManager; 2096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.content.Context; 2196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.content.Intent; 2296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.content.SharedPreferences; 23c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamathimport android.content.SharedPreferences.Editor; 2496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertimport android.util.Log; 25ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood 26ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwoodimport com.android.common.SharedPreferencesCompat; 2796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 2896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert/** 2996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Manages user settings. 3096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 3196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringertpublic class SearchSettingsImpl implements SearchSettings { 3296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 3396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final boolean DBG = false; 3496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String TAG = "QSB.SearchSettingsImpl"; 3596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 3696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert // Name of the preferences file used to store search preference 3796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public static final String PREFERENCES_NAME = "SearchSettings"; 3896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 3996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 4096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Preference key used for storing the index of the next voice search hint to show. 4196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 4296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String NEXT_VOICE_SEARCH_HINT_INDEX_PREF = "next_voice_search_hint"; 4396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 4496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 4596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Preference key used to store the time at which the first voice search hint was displayed. 4696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 4796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String FIRST_VOICE_HINT_DISPLAY_TIME = "first_voice_search_hint_time"; 4896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 4996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 5096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Preference key for the version of voice search we last got hints from. 5196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 5296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private static final String LAST_SEEN_VOICE_SEARCH_VERSION = "voice_search_version"; 5396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 5496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 558074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath * Preference key for storing whether searches always go to google.com. Public 568074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath * so that it can be used by PreferenceControllers. 57c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath */ 588074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath public static final String USE_GOOGLE_COM_PREF = "use_google_com"; 59c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 603ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath /** 613ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath * Preference key for the base search URL. This value is normally set by 623ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath * a SearchBaseUrlHelper instance. Public so classes can listen to changes 633ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath * on this key. 643ee5c8a646ac4d49c0ae6040c7e383d2ad8e985bNarayan Kamath */ 658f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public static final String SEARCH_BASE_DOMAIN_PREF = "search_base_domain"; 66c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 67c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath /** 68c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * This is the time at which the base URL was stored, and is set using 69c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * @link{System.currentTimeMillis()}. 70c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath */ 718f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath private static final String SEARCH_BASE_DOMAIN_APPLY_TIME = "search_base_domain_apply_time"; 72c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 7396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private final Context mContext; 7496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 7596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert private final Config mConfig; 7696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 7796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public SearchSettingsImpl(Context context, Config config) { 7896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert mContext = context; 7996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert mConfig = config; 8096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 8196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 8296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert protected Context getContext() { 8396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return mContext; 8496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 8596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 8696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert protected Config getConfig() { 8796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return mConfig; 8896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 8996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 90ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood @Override 9196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public void upgradeSettingsIfNeeded() { 9296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 9396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 94b1cdcbce5d9c5edb20309c59b7cb52f76bbfac72Narayan Kamath public SharedPreferences getSearchPreferences() { 9596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return getContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); 9696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 9796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 98d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeBoolean(String name, boolean value) { 99269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putBoolean(name, value)); 100d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 101d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 102d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeInt(String name, int value) { 103269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putInt(name, value)); 104d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 105d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 106d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeLong(String name, long value) { 107269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putLong(name, value)); 108d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 109d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 110d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void storeString(String name, String value) { 111269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().putString(name, value)); 112d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 113d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 114d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert protected void removePref(String name) { 115269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(getSearchPreferences().edit().remove(name)); 116d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert } 117d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert 11896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert /** 11996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert * Informs our listeners about the updated settings data. 12096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert */ 121ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood @Override 12296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public void broadcastSettingsChanged() { 12396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert // We use a message broadcast since the listeners could be in multiple processes. 12496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert Intent intent = new Intent(SearchManager.INTENT_ACTION_SEARCH_SETTINGS_CHANGED); 12596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert Log.i(TAG, "Broadcasting: " + intent); 12696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert getContext().sendBroadcast(intent); 12796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 12896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 129ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood @Override 13096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public int getNextVoiceSearchHintIndex(int size) { 13196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert int i = getAndIncrementIntPreference(getSearchPreferences(), 13296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert NEXT_VOICE_SEARCH_HINT_INDEX_PREF); 13396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return i % size; 13496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 13596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 13696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert // TODO: Could this be made atomic to avoid races? 137d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert private int getAndIncrementIntPreference(SharedPreferences prefs, String name) { 13896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert int i = prefs.getInt(name, 0); 139d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert storeInt(name, i + 1); 14096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return i; 14196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 14296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 143ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood @Override 14496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public void resetVoiceSearchHintFirstSeenTime() { 145d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert storeLong(FIRST_VOICE_HINT_DISPLAY_TIME, System.currentTimeMillis()); 14696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 14796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 148ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood @Override 14996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert public boolean haveVoiceSearchHintsExpired(int currentVoiceSearchVersion) { 15096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert SharedPreferences prefs = getSearchPreferences(); 15196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 15296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (currentVoiceSearchVersion != 0) { 15396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert long currentTime = System.currentTimeMillis(); 15496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert int lastVoiceSearchVersion = prefs.getInt(LAST_SEEN_VOICE_SEARCH_VERSION, 0); 15596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert long firstHintTime = prefs.getLong(FIRST_VOICE_HINT_DISPLAY_TIME, 0); 15696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (firstHintTime == 0 || currentVoiceSearchVersion != lastVoiceSearchVersion) { 157269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert SharedPreferencesCompat.apply(prefs.edit() 15896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert .putInt(LAST_SEEN_VOICE_SEARCH_VERSION, currentVoiceSearchVersion) 159d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert .putLong(FIRST_VOICE_HINT_DISPLAY_TIME, currentTime)); 16096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert firstHintTime = currentTime; 16196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 16296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (currentTime - firstHintTime > getConfig().getVoiceSearchHintActivePeriod()) { 16396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (DBG) Log.d(TAG, "Voice seach hint period expired; not showing hints."); 16496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return true; 16596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } else { 16696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return false; 16796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 16896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } else { 16996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert if (DBG) Log.d(TAG, "Could not determine voice search version; not showing hints."); 17096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert return true; 17196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 17296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert } 17396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert 174c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath /** 175c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * @return true if user searches should always be based at google.com, false 176c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath * otherwise. 177c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath */ 178c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath @Override 179c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath public boolean shouldUseGoogleCom() { 180c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath // Note that this preserves the old behaviour of using google.com 181c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath // for searches, with the gl= parameter set. 1828074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath return getSearchPreferences().getBoolean(USE_GOOGLE_COM_PREF, true); 183c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 184c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 185c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath @Override 186c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath public void setUseGoogleCom(boolean useGoogleCom) { 1878074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath storeBoolean(USE_GOOGLE_COM_PREF, useGoogleCom); 188c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 189c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 1908074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath @Override 1918f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public long getSearchBaseDomainApplyTime() { 1928f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath return getSearchPreferences().getLong(SEARCH_BASE_DOMAIN_APPLY_TIME, -1); 193c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 194c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 1958074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath @Override 1968f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public String getSearchBaseDomain() { 197f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // Note that the only time this will return null is on the first run 198f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // of the app, or when settings have been cleared. Callers should 199f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // ideally check that getSearchBaseDomainApplyTime() is not -1 before 200f4e4f922ad11b7d5bdc6347436f1e129fbae9041Narayan Kamath // calling this function. 2018f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath return getSearchPreferences().getString(SEARCH_BASE_DOMAIN_PREF, null); 202c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 203c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 2048074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath @Override 2058f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath public void setSearchBaseDomain(String searchBaseUrl) { 206c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath Editor sharedPrefEditor = getSearchPreferences().edit(); 2078f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath sharedPrefEditor.putString(SEARCH_BASE_DOMAIN_PREF, searchBaseUrl); 2088f65daa6e6df644d6cc6a9a2e100c01feb33bbd2Narayan Kamath sharedPrefEditor.putLong(SEARCH_BASE_DOMAIN_APPLY_TIME, System.currentTimeMillis()); 209c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath 210c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath SharedPreferencesCompat.apply(sharedPrefEditor); 211c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath } 21296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert} 213