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