SearchSettingsImpl.java revision 8074f659cbe5406f0a31c8d1cd764660964f0d53
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
67c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    private static final String SEARCH_BASE_URL = "search_base_url";
68c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath
69c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    /**
70c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath     * This is the time at which the base URL was stored, and is set using
71c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath     * @link{System.currentTimeMillis()}.
72c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath     */
73c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    private static final String SEARCH_BASE_URL_APPLY_TIME = "search_base_url_apply_time";
74c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath
75c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    /**
7696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     * Prefix of per-corpus enable preference
7796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     */
7896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    private static final String CORPUS_ENABLED_PREF_PREFIX = "enable_corpus_";
7996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
8096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    private final Context mContext;
8196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
8296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    private final Config mConfig;
8396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
8496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public SearchSettingsImpl(Context context, Config config) {
8596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        mContext = context;
8696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        mConfig = config;
8796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
8896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
8996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    protected Context getContext() {
9096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return mContext;
9196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
9296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
9396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    protected Config getConfig() {
9496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return mConfig;
9596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
9696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
9796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public void upgradeSettingsIfNeeded() {
9896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
9996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
10096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public Intent getSearchableItemsIntent() {
10196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        Intent intent = new Intent(ACTION_SEARCHABLE_ITEMS);
10296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        intent.setPackage(getContext().getPackageName());
10396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return intent;
10496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
10596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
10696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    /**
10796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     * Gets the preference key of the preference for whether the given corpus
10896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     * is enabled. The preference is stored in the {@link #PREFERENCES_NAME}
10996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     * preferences file.
11096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     */
11196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public static String getCorpusEnabledPreference(Corpus corpus) {
11296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return CORPUS_ENABLED_PREF_PREFIX + corpus.getName();
11396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
11496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
11596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public boolean isCorpusEnabled(Corpus corpus) {
11696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        boolean defaultEnabled = corpus.isCorpusDefaultEnabled();
11796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        String sourceEnabledPref = getCorpusEnabledPreference(corpus);
11896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return getSearchPreferences().getBoolean(sourceEnabledPref, defaultEnabled);
11996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
12096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
12196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    protected SharedPreferences getSearchPreferences() {
12296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return getContext().getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
12396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
12496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
125d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    protected void storeBoolean(String name, boolean value) {
126269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert        SharedPreferencesCompat.apply(getSearchPreferences().edit().putBoolean(name, value));
127d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    }
128d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert
129d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    protected void storeInt(String name, int value) {
130269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert        SharedPreferencesCompat.apply(getSearchPreferences().edit().putInt(name, value));
131d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    }
132d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert
133d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    protected void storeLong(String name, long value) {
134269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert        SharedPreferencesCompat.apply(getSearchPreferences().edit().putLong(name, value));
135d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    }
136d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert
137d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    protected void storeString(String name, String value) {
138269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert        SharedPreferencesCompat.apply(getSearchPreferences().edit().putString(name, value));
139d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    }
140d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert
141d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    protected void removePref(String name) {
142269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert        SharedPreferencesCompat.apply(getSearchPreferences().edit().remove(name));
143d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    }
144d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert
14596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    /**
14696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     * Informs our listeners about the updated settings data.
14796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert     */
14896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public void broadcastSettingsChanged() {
14996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        // We use a message broadcast since the listeners could be in multiple processes.
15096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        Intent intent = new Intent(SearchManager.INTENT_ACTION_SEARCH_SETTINGS_CHANGED);
15196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        Log.i(TAG, "Broadcasting: " + intent);
15296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        getContext().sendBroadcast(intent);
15396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
15496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
15573a375928e0b8f0b2bfa09e4b252cfcbdad4ef84Bjorn Bringert    public void addMenuItems(Menu menu, boolean showDisabled) {
15696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        MenuInflater inflater = new MenuInflater(getContext());
15796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        inflater.inflate(R.menu.settings, menu);
15896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        MenuItem item = menu.findItem(R.id.menu_settings);
15996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        item.setIntent(getSearchSettingsIntent());
16096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
16196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
16296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public Intent getSearchSettingsIntent() {
16396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        Intent settings = new Intent(SearchManager.INTENT_ACTION_SEARCH_SETTINGS);
16496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        settings.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
16596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        settings.setPackage(getContext().getPackageName());
16696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return settings;
16796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
16896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
16996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public int getNextVoiceSearchHintIndex(int size) {
17096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            int i = getAndIncrementIntPreference(getSearchPreferences(),
17196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert                    NEXT_VOICE_SEARCH_HINT_INDEX_PREF);
17296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            return i % size;
17396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
17496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
17596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    // TODO: Could this be made atomic to avoid races?
176d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert    private int getAndIncrementIntPreference(SharedPreferences prefs, String name) {
17796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        int i = prefs.getInt(name, 0);
178d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert        storeInt(name, i + 1);
17996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        return i;
18096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
18196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
18296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public void resetVoiceSearchHintFirstSeenTime() {
183d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert        storeLong(FIRST_VOICE_HINT_DISPLAY_TIME, System.currentTimeMillis());
18496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
18596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
18696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    public boolean haveVoiceSearchHintsExpired(int currentVoiceSearchVersion) {
18796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        SharedPreferences prefs = getSearchPreferences();
18896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
18996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        if (currentVoiceSearchVersion != 0) {
19096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            long currentTime = System.currentTimeMillis();
19196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            int lastVoiceSearchVersion = prefs.getInt(LAST_SEEN_VOICE_SEARCH_VERSION, 0);
19296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            long firstHintTime = prefs.getLong(FIRST_VOICE_HINT_DISPLAY_TIME, 0);
19396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            if (firstHintTime == 0 || currentVoiceSearchVersion != lastVoiceSearchVersion) {
194269256d0aff25596395479cbfcd7cca5f60a2531Bjorn Bringert                SharedPreferencesCompat.apply(prefs.edit()
19596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert                        .putInt(LAST_SEEN_VOICE_SEARCH_VERSION, currentVoiceSearchVersion)
196d84f30fc2964eded2bf559c06d6d8e77ae26a2d0Bjorn Bringert                        .putLong(FIRST_VOICE_HINT_DISPLAY_TIME, currentTime));
19796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert                firstHintTime = currentTime;
19896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            }
19996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            if (currentTime - firstHintTime > getConfig().getVoiceSearchHintActivePeriod()) {
20096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert                if (DBG) Log.d(TAG, "Voice seach hint period expired; not showing hints.");
20196fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert                return true;
20296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            } else {
20396fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert                return false;
20496fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            }
20596fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        } else {
20696fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            if (DBG) Log.d(TAG, "Could not determine voice search version; not showing hints.");
20796fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert            return true;
20896fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert        }
20996fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert    }
21096fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert
2118749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert    public boolean allowWebSearchShortcuts() {
2128749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert        return true;
2138749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert    }
2148749e77dddec9e7984ee86a7be6f5ba4fce44362Bjorn Bringert
215c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    /**
216c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath     * @return true if user searches should always be based at google.com, false
217c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath     *     otherwise.
218c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath     */
219c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    @Override
220c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    public boolean shouldUseGoogleCom() {
221c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        // Note that this preserves the old behaviour of using google.com
222c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        // for searches, with the gl= parameter set.
2238074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath        return getSearchPreferences().getBoolean(USE_GOOGLE_COM_PREF, true);
224c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    }
225c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath
226c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    @Override
227c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    public void setUseGoogleCom(boolean useGoogleCom) {
2288074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath        storeBoolean(USE_GOOGLE_COM_PREF, useGoogleCom);
229c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    }
230c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath
2318074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath    @Override
232c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    public long getSearchBaseUrlApplyTime() {
233c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        return getSearchPreferences().getLong(SEARCH_BASE_URL_APPLY_TIME, -1);
234c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    }
235c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath
2368074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath    @Override
237c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    public String getSearchBaseUrl() {
238c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        // Its better that an exception is thrown at this point, because
239c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        // this should always be called after checking that
240c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        // getSearchBaseUrlApplyTime() >= 0.
241c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        return getSearchPreferences().getString(SEARCH_BASE_URL, null);
242c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    }
243c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath
2448074f659cbe5406f0a31c8d1cd764660964f0d53Narayan Kamath    @Override
245c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    public void setSearchBaseUrl(String searchBaseUrl) {
246c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        Editor sharedPrefEditor = getSearchPreferences().edit();
247c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        sharedPrefEditor.putString(SEARCH_BASE_URL, searchBaseUrl);
248c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        sharedPrefEditor.putLong(SEARCH_BASE_URL_APPLY_TIME, System.currentTimeMillis());
249c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath
250c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath        SharedPreferencesCompat.apply(sharedPrefEditor);
251c953ef06f0fc1fb4157fe67aa145cf702ee204d0Narayan Kamath    }
25296fec862c3d494aebcb4e1d93589a241385a2ba7Bjorn Bringert}
253