[go: nahoru, domu]

Tracking Protection: Connect prefs to switches in UI

Tested manually - render tests will be added once the UI is finished.
Low-Coverage-Reason: render tests not implemented yet.

Bug: b:295926938
Change-Id: Ie8a722803a51170632d58df2ecbdfffe0a32200d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4889645
Commit-Queue: Andrey Zaytsev <andzaytsev@google.com>
Reviewed-by: Nicola Tommasi <tommasin@chromium.org>
Reviewed-by: Ted Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1201138}
diff --git a/chrome/android/DEPS b/chrome/android/DEPS
index e602190..21a3802 100644
--- a/chrome/android/DEPS
+++ b/chrome/android/DEPS
@@ -48,6 +48,7 @@
   "+components/permissions/android/nfc",
   "+components/policy",
   "+components/prefs/android",
+  "+components/privacy_sandbox/android",
   "+components/query_tiles",
   "+components/safe_browsing/android/java",
   "+components/security_interstitials/content/android",
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 aae0554..2bc58ae 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
@@ -63,6 +63,7 @@
 import org.chromium.chrome.browser.password_manager.settings.PasswordSettings;
 import org.chromium.chrome.browser.privacy_guide.PrivacyGuideFragment;
 import org.chromium.chrome.browser.privacy_sandbox.AdMeasurementFragment;
+import org.chromium.chrome.browser.privacy_sandbox.ChromeTrackingProtectionDelegate;
 import org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxSettingsBaseFragment;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
@@ -93,6 +94,7 @@
 import org.chromium.components.browser_ui.widget.displaystyle.ViewResizer;
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
 import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
+import org.chromium.components.privacy_sandbox.TrackingProtectionSettings;
 import org.chromium.ui.KeyboardVisibilityDelegate;
 import org.chromium.ui.UiUtils;
 import org.chromium.ui.base.ActivityWindowAndroid;
@@ -604,6 +606,10 @@
         if (fragment instanceof AutofillOptionsFragment) {
             AutofillOptionsCoordinator.createFor((AutofillOptionsFragment) fragment);
         }
+        if (fragment instanceof TrackingProtectionSettings) {
+            ((TrackingProtectionSettings) fragment)
+                    .setTrackingProtectionDelegate(new ChromeTrackingProtectionDelegate(mProfile));
+        }
     }
 
     @Override
diff --git a/chrome/browser/privacy_sandbox/android/BUILD.gn b/chrome/browser/privacy_sandbox/android/BUILD.gn
index e18fff5..979ffda5 100644
--- a/chrome/browser/privacy_sandbox/android/BUILD.gn
+++ b/chrome/browser/privacy_sandbox/android/BUILD.gn
@@ -14,6 +14,7 @@
     "java/src/org/chromium/chrome/browser/privacy_sandbox/AdMeasurementFragment.java",
     "java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationFragment.java",
     "java/src/org/chromium/chrome/browser/privacy_sandbox/AdPersonalizationRemovedFragment.java",
+    "java/src/org/chromium/chrome/browser/privacy_sandbox/ChromeTrackingProtectionDelegate.java",
     "java/src/org/chromium/chrome/browser/privacy_sandbox/FledgePreference.java",
     "java/src/org/chromium/chrome/browser/privacy_sandbox/LearnMoreFragment.java",
     "java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxBottomSheetNotice.java",
@@ -62,6 +63,7 @@
     "//components/browser_ui/widget/android:java",
     "//components/favicon/android:java",
     "//components/prefs/android:java",
+    "//components/privacy_sandbox/android:java",
     "//components/user_prefs/android:java",
     "//content/public/android:content_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/ChromeTrackingProtectionDelegate.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/ChromeTrackingProtectionDelegate.java
new file mode 100644
index 0000000..a801d36
--- /dev/null
+++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/ChromeTrackingProtectionDelegate.java
@@ -0,0 +1,38 @@
+// Copyright 2023 The Chromium Authors
+// 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.privacy_sandbox;
+
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.components.privacy_sandbox.TrackingProtectionDelegate;
+import org.chromium.components.user_prefs.UserPrefs;
+
+public class ChromeTrackingProtectionDelegate implements TrackingProtectionDelegate {
+    private final Profile mProfile;
+
+    public ChromeTrackingProtectionDelegate(Profile profile) {
+        mProfile = profile;
+    }
+
+    @Override
+    public boolean isBlockAll3PCDEnabled() {
+        return UserPrefs.get(mProfile).getBoolean(Pref.BLOCK_ALL3PC_TOGGLE_ENABLED);
+    }
+
+    @Override
+    public void setBlockAll3PCD(boolean enabled) {
+        UserPrefs.get(mProfile).setBoolean(Pref.BLOCK_ALL3PC_TOGGLE_ENABLED, enabled);
+    }
+
+    @Override
+    public boolean isDoNotTrackEnabled() {
+        return UserPrefs.get(mProfile).getBoolean(Pref.ENABLE_DO_NOT_TRACK);
+    }
+
+    @Override
+    public void setDoNotTrack(boolean enabled) {
+        UserPrefs.get(mProfile).setBoolean(Pref.ENABLE_DO_NOT_TRACK, enabled);
+    }
+}
diff --git a/components/privacy_sandbox/android/BUILD.gn b/components/privacy_sandbox/android/BUILD.gn
index f56eb840..cb54a92 100644
--- a/components/privacy_sandbox/android/BUILD.gn
+++ b/components/privacy_sandbox/android/BUILD.gn
@@ -5,12 +5,19 @@
 import("//build/config/android/rules.gni")
 
 android_library("java") {
-  sources = [ "java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java" ]
+  sources = [
+    "java/src/org/chromium/components/privacy_sandbox/TrackingProtectionDelegate.java",
+    "java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java",
+  ]
   resources_package = "org.chromium.components.privacy_sandbox"
   deps = [
     ":java_resources",
     "//components/browser_ui/settings/android:java",
+    "//components/prefs/android:java",
     "//components/strings:components_strings_grd",
+    "//components/user_prefs/android:java",
+    "//content/public/android:content_java",
+    "//third_party/androidx:androidx_fragment_fragment_java",
     "//third_party/androidx:androidx_preference_preference_java",
   ]
 }
diff --git a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionDelegate.java b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionDelegate.java
new file mode 100644
index 0000000..be85b41e7
--- /dev/null
+++ b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionDelegate.java
@@ -0,0 +1,20 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.privacy_sandbox;
+
+/** Interface implemented by the embedder to access embedder-specific logic. */
+public interface TrackingProtectionDelegate {
+    /** @return whether block all 3PCD pref is enabled. */
+    boolean isBlockAll3PCDEnabled();
+
+    /** Set the value of the block all 3PCD pref. */
+    void setBlockAll3PCD(boolean enabled);
+
+    /** @return whether the Do Not Track pref is enabled. */
+    boolean isDoNotTrackEnabled();
+
+    /** Set the value of the Do Not Track Pref. */
+    void setDoNotTrack(boolean enabled);
+}
diff --git a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java
index 1415fa0..fd08381b 100644
--- a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java
+++ b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java
@@ -8,12 +8,43 @@
 
 import androidx.preference.PreferenceFragmentCompat;
 
+import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
 import org.chromium.components.browser_ui.settings.SettingsUtils;
 
 /** Fragment to manage settings for tracking protection. */
 public class TrackingProtectionSettings extends PreferenceFragmentCompat {
+    // Must match keys in tracking_protection_preferences.xml.
+    private static final String PREF_BLOCK_ALL_TOGGLE = "block_all_3pcd_toggle";
+    private static final String PREF_DNT_TOGGLE = "dnt_toggle";
+
+    private TrackingProtectionDelegate mDelegate;
+
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         SettingsUtils.addPreferencesFromResource(this, R.xml.tracking_protection_preferences);
+        getActivity().setTitle(R.string.privacy_sandbox_tracking_protection_title);
+
+        ChromeSwitchPreference blockAll3PCookiesSwitch =
+                (ChromeSwitchPreference) findPreference(PREF_BLOCK_ALL_TOGGLE);
+        ChromeSwitchPreference doNotTrackSwitch =
+                (ChromeSwitchPreference) findPreference(PREF_DNT_TOGGLE);
+
+        // Block all 3PCD switch.
+        blockAll3PCookiesSwitch.setChecked(mDelegate.isBlockAll3PCDEnabled());
+        blockAll3PCookiesSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+            mDelegate.setBlockAll3PCD((boolean) newValue);
+            return true;
+        });
+
+        // Do not track switch.
+        doNotTrackSwitch.setChecked(mDelegate.isDoNotTrackEnabled());
+        doNotTrackSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+            mDelegate.setDoNotTrack((boolean) newValue);
+            return true;
+        });
+    }
+
+    public void setTrackingProtectionDelegate(TrackingProtectionDelegate delegate) {
+        mDelegate = delegate;
     }
 }
diff --git a/components/privacy_sandbox_strings.grdp b/components/privacy_sandbox_strings.grdp
index 73cf265..cbf3bd91 100644
--- a/components/privacy_sandbox_strings.grdp
+++ b/components/privacy_sandbox_strings.grdp
@@ -2163,6 +2163,9 @@
 
   <!-- Tracking Protection -->
   <!-- TODO(b/295926938: finalize the strings. -->
+  <message name="IDS_PRIVACY_SANDBOX_TRACKING_PROTECTION_TITLE" desc="" translateable="false" formatter_data="android_java">
+    Tracking Protection
+  </message>
   <message name="IDS_PRIVACY_SANDBOX_TRACKING_PROTECTION_DESCRIPTION" desc="" translateable="false" formatter_data="android_java">
     Chrome limits the amount of information sites can use to track you as you browse. You can change your settings to choose your own level of protection.
   </message>