Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4456)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java

Issue 2838833002: 🔍 Introduce default search engine dialog (Closed)
Patch Set: COmments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..4720f22b5db7e4a60f7cca4b38be9a059df3c047
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialog.java
@@ -0,0 +1,157 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.locale;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.widget.RadioGroup;
+import android.widget.RadioGroup.OnCheckedChangeListener;
+
+import org.chromium.base.Callback;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.infobar.InfoBarControlLayout;
+import org.chromium.chrome.browser.locale.LocaleManager.SearchEnginePromoType;
+import org.chromium.chrome.browser.search_engines.TemplateUrlService;
+import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrl;
+import org.chromium.chrome.browser.widget.PromoDialog;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/** A dialog that forces the user to choose a default search engine. */
+public class DefaultSearchEnginePromoDialog extends PromoDialog implements OnCheckedChangeListener {
+ /** Used to determine the promo dialog contents. */
+ @SearchEnginePromoType
+ private final int mDialogType;
+
+ /** Called when the dialog is dismissed after the user has chosen a search engine. */
+ private final Callback<Boolean> mOnDismissed;
+
+ private RadioGroup mRadioGroup;
+ private String mSelectedKeyword;
+
+ /**
+ * Construct and show the dialog. Will be asynchronous if the TemplateUrlService has not yet
+ * been loaded.
+ *
+ * @param context Context to build the dialog with.
+ * @param dialogType Type of dialog to show.
+ * @param onDismissed Notified about whether the user chose an engine when it got dismissed.
+ */
+ public static void show(final Context context, @SearchEnginePromoType final int dialogType,
+ @Nullable final Callback<Boolean> onDismissed) {
+ assert LibraryLoader.isInitialized();
+
+ // Load up the search engines.
+ final TemplateUrlService instance = TemplateUrlService.getInstance();
+ instance.registerLoadListener(new TemplateUrlService.LoadListener() {
+ @Override
+ public void onTemplateUrlServiceLoaded() {
+ instance.unregisterLoadListener(this);
+ new DefaultSearchEnginePromoDialog(context, dialogType, onDismissed).show();
+ }
+ });
+ if (!instance.isLoaded()) instance.load();
+ }
+
+ private DefaultSearchEnginePromoDialog(
+ Context context, int dialogType, @Nullable Callback<Boolean> onDismissed) {
+ super(context);
+ mDialogType = dialogType;
+ mOnDismissed = onDismissed;
+ setOnDismissListener(this);
+
+ // No one should be able to bypass this dialog by clicking outside or by hitting back.
+ setCancelable(false);
+ setCanceledOnTouchOutside(false);
+ }
+
+ @Override
+ protected DialogParams getDialogParams() {
+ PromoDialog.DialogParams params = new PromoDialog.DialogParams();
+ params.headerStringResource = R.string.search_engine_dialog_title;
+ params.footerStringResource = R.string.search_engine_dialog_footer;
+ params.primaryButtonStringResource = R.string.ok;
+ return params;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Determine what search engines will be listed.
+ TemplateUrlService instance = TemplateUrlService.getInstance();
+ assert instance.isLoaded();
+ List<TemplateUrl> engines = null;
+ if (mDialogType == LocaleManager.SEARCH_ENGINE_PROMO_SHOW_EXISTING) {
+ engines = instance.getSearchEngines();
+ } else {
+ // TODO(dfalcantara): Handle the new user case.
+ assert false;
+ }
+
+ // Shuffle up the engines.
+ List<CharSequence> engineNames = new ArrayList<>();
+ List<String> engineKeywords = new ArrayList<>();
+ Collections.shuffle(engines);
+ for (int i = 0; i < engines.size(); i++) {
+ TemplateUrl engine = engines.get(i);
+ engineNames.add(engine.getShortName());
+ engineKeywords.add(engine.getKeyword());
+ }
+
+ // Add the search engines to the dialog.
+ InfoBarControlLayout controls = addControlLayout();
+ mRadioGroup = controls.addRadioButtons(
+ engineNames, engineKeywords, InfoBarControlLayout.INVALID_INDEX);
+ mRadioGroup.setOnCheckedChangeListener(this);
+ updateButtonState();
+ }
+
+ @Override
+ public void onCheckedChanged(RadioGroup group, int checkedId) {
+ mSelectedKeyword = (String) group.findViewById(checkedId).getTag();
+ updateButtonState();
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (view.getId() == R.id.button_primary) {
+ if (mSelectedKeyword == null) {
+ updateButtonState();
+ return;
+ }
+
+ dismiss();
+ } else {
+ assert false : "Unhandled click.";
+ }
+
+ // Don't propagate the click to the parent to prevent circumventing the dialog.
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ if (mSelectedKeyword == null) {
+ // This shouldn't happen, but in case it does, finish the Activity so that the user has
+ // to respond to the dialog next time.
+ if (getOwnerActivity() != null) getOwnerActivity().finish();
+ } else {
+ TemplateUrlService.getInstance().setSearchEngine(mSelectedKeyword.toString());
+ // TODO(dfalcantara): Prevent the dialog from appearing again.
+ }
+
+ if (mOnDismissed != null) mOnDismissed.onResult(mSelectedKeyword != null);
+ }
+
+ private void updateButtonState() {
+ findViewById(R.id.button_primary).setEnabled(mSelectedKeyword != null);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698