| Index: chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
|
| index fbb2897d1f6ffa99fe9709650e2c2e7c4f161e91..cb1ce7091c08bf605b145c170ac463be8ecc5bbf 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
|
| @@ -5,29 +5,57 @@
|
| package org.chromium.chrome.browser.locale;
|
|
|
| import android.content.Context;
|
| +import android.content.Intent;
|
| import android.content.SharedPreferences;
|
|
|
| import org.chromium.base.ContextUtils;
|
| import org.chromium.base.ThreadUtils;
|
| +import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.ChromeApplication;
|
| import org.chromium.chrome.browser.ChromeFeatureList;
|
| +import org.chromium.chrome.browser.preferences.PreferencesLauncher;
|
| +import org.chromium.chrome.browser.preferences.SearchEnginePreference;
|
| +import org.chromium.chrome.browser.snackbar.Snackbar;
|
| +import org.chromium.chrome.browser.snackbar.SnackbarManager;
|
| +import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
|
| +
|
| +import java.lang.ref.WeakReference;
|
|
|
| /**
|
| * Manager for some locale specific logics.
|
| */
|
| public class LocaleManager {
|
| + public static final String PREF_AUTO_SWITCH = "LocaleManager_PREF_AUTO_SWITCH";
|
| public static final String PREF_PROMO_SHOWN = "LocaleManager_PREF_PROMO_SHOWN";
|
| public static final String PREF_WAS_IN_SPECIAL_LOCALE = "LocaleManager_WAS_IN_SPECIAL_LOCALE";
|
| public static final String SPECIAL_LOCALE_ID = "US";
|
|
|
| private static LocaleManager sInstance;
|
|
|
| + // LocaleManager is a singleton and it should not have strong reference to UI objects.
|
| + // SnackbarManager is owned by ChromeActivity and is not null as long as the activity is alive.
|
| + private WeakReference<SnackbarManager> mSnackbarManager;
|
| private SpecialLocaleHandler mLocaleHandler;
|
|
|
| + private SnackbarController mSnackbarController = new SnackbarController() {
|
| + @Override
|
| + public void onDismissNoAction(Object actionData) { }
|
| +
|
| + @Override
|
| + public void onAction(Object actionData) {
|
| + Context context = ContextUtils.getApplicationContext();
|
| + Intent intent = PreferencesLauncher.createIntentForSettingsPage(context,
|
| + SearchEnginePreference.class.getName());
|
| + context.startActivity(intent);
|
| + }
|
| + };
|
| +
|
| /**
|
| * Starts listening to state changes of the phone.
|
| */
|
| - public void startObservingPhoneChanges() {}
|
| + public void startObservingPhoneChanges() {
|
| + maybeAutoSwitchSearchEngine();
|
| + }
|
|
|
| /**
|
| * Stops listening to state changes of the phone.
|
| @@ -82,21 +110,48 @@ public class LocaleManager {
|
| }
|
|
|
| /**
|
| + * Removes local search engines for special locale.
|
| + */
|
| + public void removeSpecialSearchEngines() {
|
| + if (isSpecialLocaleEnabled()) return;
|
| + getSpecialLocaleHandler().removeTemplateUrls();
|
| + }
|
| +
|
| + /**
|
| * Overrides the default search engine to a different search engine we designate. This is a
|
| - * no-op if the user has changed DSP settings before.
|
| + * no-op if the user has manually changed DSP settings.
|
| */
|
| public void overrideDefaultSearchEngine() {
|
| - // TODO(ianwen): Implement search engine auto switching.
|
| - if (!isSpecialLocaleEnabled()) return;
|
| + if (!isSearchEngineAutoSwitchEnabled() || !isSpecialLocaleEnabled()) return;
|
| getSpecialLocaleHandler().overrideDefaultSearchProvider();
|
| + showSnackbar(ContextUtils.getApplicationContext().getString(R.string.using_sogou));
|
| }
|
|
|
| /**
|
| - * Removes local search engines for special locale.
|
| + * Reverts the temporary change made in {@link #overrideDefaultSearchEngine()}. This is a no-op
|
| + * if the user has manually changed DSP settings.
|
| */
|
| - public void removeSpecialSearchEngines() {
|
| - if (isSpecialLocaleEnabled()) return;
|
| - getSpecialLocaleHandler().removeTemplateUrls();
|
| + public void revertDefaultSearchEngineOverride() {
|
| + if (!isSearchEngineAutoSwitchEnabled() || isSpecialLocaleEnabled()) return;
|
| + getSpecialLocaleHandler().setGoogleAsDefaultSearch();
|
| + showSnackbar(ContextUtils.getApplicationContext().getString(R.string.using_google));
|
| + }
|
| +
|
| + /**
|
| + * Switches the default search engine based on the current locale, if the user has delegated
|
| + * Chrome to do so.
|
| + */
|
| + protected void maybeAutoSwitchSearchEngine() {
|
| + SharedPreferences preferences = ContextUtils.getAppSharedPreferences();
|
| + boolean wasInSpecialLocale = preferences.getBoolean(PREF_WAS_IN_SPECIAL_LOCALE, false);
|
| + boolean isInSpecialLocale = isSpecialLocaleEnabled();
|
| + if (wasInSpecialLocale && !isInSpecialLocale) {
|
| + revertDefaultSearchEngineOverride();
|
| + removeSpecialSearchEngines();
|
| + } else if (isInSpecialLocale && !wasInSpecialLocale) {
|
| + addSpecialSearchEngines();
|
| + overrideDefaultSearchEngine();
|
| + }
|
| }
|
|
|
| /**
|
| @@ -119,6 +174,39 @@ public class LocaleManager {
|
| }
|
|
|
| /**
|
| + * @return Whether auto switch for search engine is enabled.
|
| + */
|
| + public boolean isSearchEngineAutoSwitchEnabled() {
|
| + return ContextUtils.getAppSharedPreferences().getBoolean(PREF_AUTO_SWITCH, false);
|
| + }
|
| +
|
| + /**
|
| + * Sets whether auto switch for search engine is enabled.
|
| + */
|
| + public void setSearchEngineAutoSwitch(boolean isEnabled) {
|
| + ContextUtils.getAppSharedPreferences().edit().putBoolean(PREF_AUTO_SWITCH, isEnabled)
|
| + .apply();
|
| + }
|
| +
|
| + /**
|
| + * Sets the {@link SnackbarManager} used by this instance.
|
| + */
|
| + public void setSnackbarManager(SnackbarManager manager) {
|
| + mSnackbarManager = new WeakReference<SnackbarManager>(manager);
|
| + }
|
| +
|
| + private void showSnackbar(CharSequence title) {
|
| + SnackbarManager manager = mSnackbarManager.get();
|
| + if (manager == null) return;
|
| +
|
| + Context context = ContextUtils.getApplicationContext();
|
| + Snackbar snackbar = Snackbar.make(title, mSnackbarController, Snackbar.TYPE_NOTIFICATION,
|
| + Snackbar.UMA_SPECIAL_LOCALE);
|
| + snackbar.setAction(context.getString(R.string.preferences), null);
|
| + manager.showSnackbar(snackbar);
|
| + }
|
| +
|
| + /**
|
| * Does some extra checking about whether the user is in special locale.
|
| * @param inSpecialLocale Whether the variation service thinks the client is in special locale.
|
| * @return The result after extra confirmation.
|
|
|