[go: nahoru, domu]

Proactive Topics Blocking: Fix the blocking dialog

Merge approved in b/328597172

Screenshot: https://screenshot.googleplex.com/BaR7xJh9yH6bbx6.png

(cherry picked from commit a46db386e9d979a51439739509a9e91bf314f79a)

Bug: 328597172, 327208511
Change-Id: Iaa03446824b4458343b98ec706bbdd2a50435930
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5353080
Reviewed-by: Abe Boujane <boujane@google.com>
Auto-Submit: Andrey Zaytsev <andzaytsev@google.com>
Commit-Queue: Abe Boujane <boujane@google.com>
Cr-Original-Commit-Position: refs/heads/main@{#1270438}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5361435
Commit-Queue: Andrey Zaytsev <andzaytsev@google.com>
Cr-Commit-Position: refs/branch-heads/6312@{#512}
Cr-Branched-From: 6711dcdae48edaf98cbc6964f90fac85b7d9986e-refs/heads/main@{#1262506}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
index eb6efd4..6abe82a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -61,6 +61,7 @@
 import org.chromium.chrome.browser.privacy_guide.PrivacyGuideFragment;
 import org.chromium.chrome.browser.privacy_sandbox.ChromeTrackingProtectionDelegate;
 import org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxSettingsBaseFragment;
+import org.chromium.chrome.browser.privacy_sandbox.TopicsManageFragment;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileManager;
 import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
@@ -624,6 +625,10 @@
             ((AutofillCreditCardEditor) fragment)
                     .setModalDialogManagerSupplier(getModalDialogManagerSupplier());
         }
+        if (fragment instanceof TopicsManageFragment) {
+            ((TopicsManageFragment) fragment)
+                    .setModalDialogManagerSupplier(getModalDialogManagerSupplier());
+        }
     }
 
     @Override
diff --git a/chrome/browser/privacy_sandbox/android/BUILD.gn b/chrome/browser/privacy_sandbox/android/BUILD.gn
index abc7676..2687a20 100644
--- a/chrome/browser/privacy_sandbox/android/BUILD.gn
+++ b/chrome/browser/privacy_sandbox/android/BUILD.gn
@@ -54,6 +54,7 @@
     "//chrome/browser/settings:java",
     "//chrome/browser/ui/messages/android:java",
     "//components/browser_ui/bottomsheet/android:java",
+    "//components/browser_ui/modaldialog/android:java",
     "//components/browser_ui/settings/android:java",
     "//components/browser_ui/styles/android:java",
     "//components/browser_ui/util/android:java",
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragment.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragment.java
index be2063d..511e55d 100644
--- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragment.java
+++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragment.java
@@ -8,13 +8,19 @@
 import android.os.Bundle;
 import android.view.View;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.base.supplier.Supplier;
 import org.chromium.components.browser_ui.settings.SettingsUtils;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modaldialog.SimpleModalDialogController;
+import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.text.NoUnderlineClickableSpan;
 import org.chromium.ui.text.SpanApplier;
 
@@ -29,6 +35,8 @@
 
     private Dialog mConfirmationDialog;
 
+    private Supplier<ModalDialogManager> mModalDialogManagerSupplier;
+
     @Override
     public void onCreatePreferences(@Nullable Bundle bundle, @Nullable String s) {
         super.onCreatePreferences(bundle, s);
@@ -50,6 +58,15 @@
         RecordUserAction.record("Settings.PrivacySandbox.Topics.Manage.PageOpened");
     }
 
+    /**
+     * Sets Supplier for {@lnk ModalDialogManager} used to display {@link
+     * AutofillDeleteCreditCardConfirmationDialog}.
+     */
+    public void setModalDialogManagerSupplier(
+            @NonNull Supplier<ModalDialogManager> modalDialogManagerSupplier) {
+        mModalDialogManagerSupplier = modalDialogManagerSupplier;
+    }
+
     private void populateTopics() {
         mTopicsCategory.removeAll();
         List<Topic> firstLevelTopics = PrivacySandboxBridge.getFirstLevelTopics();
@@ -82,32 +99,49 @@
             return true;
         }
         // There are assigned child topics - display a confirmation prompt.
-        mConfirmationDialog =
-                new AlertDialog.Builder(getContext(), R.style.ThemeOverlay_BrowserUI_AlertDialog)
-                        .setTitle(
-                                getString(
-                                        R.string.settings_manage_topics_dialog_clank_title,
-                                        topic.getName()))
-                        .setMessage(
-                                getString(
-                                        R.string.settings_manage_topics_dialog_clank_body,
-                                        topic.getName()))
-                        .setPositiveButton(
-                                R.string.continue_button,
-                                (dialog, which) -> {
-                                    PrivacySandboxBridge.setTopicAllowed(topic, false);
-                                    RecordUserAction.record(
-                                            "Settings.PrivacySandbox.Topics.Manage.TopicBlockingConfirmed");
-                                })
-                        .setNegativeButton(
-                                R.string.cancel,
-                                (dialog, which) -> {
-                                    preference.setChecked(true);
-                                    mConfirmationDialog = null;
-                                    RecordUserAction.record(
-                                            "Settings.PrivacySandbox.Topics.Manage.TopicBlockingCanceled");
-                                })
-                        .show();
+        assert mModalDialogManagerSupplier != null;
+        ModalDialogManager modalDialogManager = mModalDialogManagerSupplier.get();
+        assert modalDialogManager != null;
+        ModalDialogProperties.Controller dialogController =
+                new SimpleModalDialogController(
+                        modalDialogManager,
+                        dismissalCause -> {
+                            if (dismissalCause == DialogDismissalCause.POSITIVE_BUTTON_CLICKED) {
+                                PrivacySandboxBridge.setTopicAllowed(topic, false);
+                                RecordUserAction.record(
+                                        "Settings.PrivacySandbox.Topics.Manage.TopicBlockingConfirmed");
+                            } else {
+                                preference.setChecked(true);
+                                RecordUserAction.record(
+                                        "Settings.PrivacySandbox.Topics.Manage.TopicBlockingCanceled");
+                            }
+                        });
+        PropertyModel dialog =
+                new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
+                        .with(ModalDialogProperties.CONTROLLER, dialogController)
+                        .with(
+                                ModalDialogProperties.TITLE,
+                                getContext()
+                                        .getString(
+                                                R.string.settings_manage_topics_dialog_clank_title,
+                                                topic.getName()))
+                        .with(
+                                ModalDialogProperties.MESSAGE_PARAGRAPH_1,
+                                getContext()
+                                        .getString(
+                                                R.string.settings_manage_topics_dialog_clank_body,
+                                                topic.getName()))
+                        .with(
+                                ModalDialogProperties.POSITIVE_BUTTON_TEXT,
+                                getContext().getString(R.string.settings_topics_page_block_topic))
+                        .with(
+                                ModalDialogProperties.BUTTON_STYLES,
+                                ModalDialogProperties.ButtonStyles.PRIMARY_FILLED_NEGATIVE_OUTLINE)
+                        .with(
+                                ModalDialogProperties.NEGATIVE_BUTTON_TEXT,
+                                getContext().getString(R.string.cancel))
+                        .build();
+        modalDialogManager.showDialog(dialog, ModalDialogManager.ModalDialogType.APP);
         return true;
     }
 
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java
index 5376b92..acda4d4 100644
--- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java
+++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java
@@ -20,6 +20,7 @@
     private final Set<Topic> mCurrentTopTopics = new LinkedHashSet<>();
     private final Set<Topic> mBlockedTopics = new LinkedHashSet<>();
     private final Set<Topic> mFirstLevelTopics = new LinkedHashSet<>();
+    private final Set<Topic> mChildTopics = new LinkedHashSet<>();
     private final Set<String> mCurrentFledgeSites = new LinkedHashSet<>();
     private final Set<String> mBlockedFledgeSites = new LinkedHashSet<>();
     private @PromptType int mPromptType = PromptType.NONE;
@@ -47,6 +48,13 @@
         }
     }
 
+    public void setChildTopics(String... topics) {
+        mChildTopics.clear();
+        for (String name : topics) {
+            mChildTopics.add(getOrCreateTopic(name));
+        }
+    }
+
     public void setCurrentFledgeSites(String... sites) {
         mCurrentFledgeSites.clear();
         mCurrentFledgeSites.addAll(Arrays.asList(sites));
@@ -124,7 +132,7 @@
 
     @Override
     public Topic[] getChildTopicsCurrentlyAssigned(int topicId, int taxonomyVersion) {
-        return new Topic[] {};
+        return mChildTopics.toArray(new Topic[] {});
     }
 
     @Override
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragmentTest.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragmentTest.java
index 57c04e9..dbeb9098 100644
--- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragmentTest.java
+++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/TopicsManageFragmentTest.java
@@ -6,7 +6,9 @@
 
 import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
 import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.withText;
 
 import static org.hamcrest.Matchers.containsString;
@@ -90,4 +92,22 @@
                 mUserActionTester.getActions(),
                 hasItems("Settings.PrivacySandbox.Topics.Manage.TopicEnabled"));
     }
+
+    @Test
+    @SmallTest
+    public void testToggleTopicDialog() {
+        mFakePrivacySandboxBridge.setFirstLevelTopics(TOPIC_NAME_1);
+        mFakePrivacySandboxBridge.setChildTopics(TOPIC_NAME_1);
+        startTopicsManageSettings();
+        onView(withText(TOPIC_NAME_1)).perform(click());
+        onViewWaiting(withText("Cancel")).check(matches(isDisplayed()));
+        onView(withText("Block")).perform(click());
+        assertThat(
+                mUserActionTester.getActions(),
+                hasItems("Settings.PrivacySandbox.Topics.Manage.TopicBlockingConfirmed"));
+        onView(withText(TOPIC_NAME_1)).perform(click());
+        assertThat(
+                mUserActionTester.getActions(),
+                hasItems("Settings.PrivacySandbox.Topics.Manage.TopicEnabled"));
+    }
 }
diff --git a/components/privacy_sandbox_strings.grdp b/components/privacy_sandbox_strings.grdp
index 95d4c69..d4658a1 100644
--- a/components/privacy_sandbox_strings.grdp
+++ b/components/privacy_sandbox_strings.grdp
@@ -209,7 +209,7 @@
   <message name="IDS_SETTINGS_TOPICS_PAGE_BLOCKED_TOPICS_DESCRIPTION_EMPTY_TEXT_HEADING" desc="A description that appear beneath the 'Blocked topics' title. The ad topics setting could be on but no topics appears in the list. This is part of the text that explains why.">
     No blocked topics
   </message>
-  <message name="IDS_SETTINGS_TOPICS_PAGE_BLOCK_TOPIC" desc="A button associated with each of the user's topics. If the user clicks 'Block', that topic will get moved to the 'Topics you blocked' page.">
+  <message name="IDS_SETTINGS_TOPICS_PAGE_BLOCK_TOPIC" desc="A button associated with each of the user's topics. If the user clicks 'Block', that topic will get moved to the 'Topics you blocked' page." formatter_data="android_java">
     Block
   </message>
   <message name="IDS_SETTINGS_TOPICS_PAGE_BLOCK_TOPIC_A11Y_LABEL" desc="A button label read by screen readers that indicates which topic will get blocked. The full 'pool of topics' is published at https://github.com/patcg-individual-drafts/topics/blob/main/taxonomy_v1.md">