Commit 4cc88874 authored by Andrey Zaytsev's avatar Andrey Zaytsev Committed by Chromium LUCI CQ

Privacy Sandbox Settings: added a Snackbar to Cookie Settings

Mock: https://docs.google.com/presentation/d/1_6jDegg169xJ5qgaABZ_wV3-Csd_OL5bf9H1NeUqS9Y/edit?pli=1#slide=id.gac1f62eb2c_0_23
Screenshot: https://screenshot.googleplex.com/8oc3STHihHMNwaF.png

Bug: 1152351
Change-Id: Ib4692d6a540652ab761ab373de619385f76fa08e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2611098
Commit-Queue: Andrey Zaytsev <andzaytsev@google.com>
Reviewed-by: default avatarKamila Hasanbega <hkamila@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Reviewed-by: default avatarMartin Šrámek <msramek@chromium.org>
Reviewed-by: default avatarEvan Stade <estade@chromium.org>
Auto-Submit: Andrey Zaytsev <andzaytsev@google.com>
Cr-Commit-Position: refs/heads/master@{#842981}
parent b2bf02c3
......@@ -5,6 +5,7 @@ include_rules = [
"+chrome/browser/banners/android/java",
"+chrome/browser/device",
"+chrome/browser/privacy",
"+chrome/browser/privacy_sandbox",
"+chrome/browser/profiles/android/java",
"+chrome/browser/share/android",
"+chrome/browser/tab",
......
......@@ -46,6 +46,8 @@ import org.chromium.chrome.browser.safety_check.SafetyCheckSettingsFragment;
import org.chromium.chrome.browser.safety_check.SafetyCheckUpdatesDelegateImpl;
import org.chromium.chrome.browser.signin.SigninActivityLauncherImpl;
import org.chromium.chrome.browser.site_settings.ChromeSiteSettingsDelegate;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarManageable;
import org.chromium.components.browser_ui.settings.FragmentSettingsLauncher;
import org.chromium.components.browser_ui.settings.SettingsLauncher;
import org.chromium.components.browser_ui.settings.SettingsUtils;
......@@ -68,7 +70,7 @@ import org.chromium.ui.util.ColorUtils;
* {@link SettingsUtils#getShowShadowOnScrollListener(View, View)}.
*/
public class SettingsActivity extends ChromeBaseAppCompatActivity
implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback, SnackbarManageable {
/**
* Preference fragments may implement this interface to intercept "Back" button taps in this
* activity.
......@@ -96,6 +98,8 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity
/** An instance of settings launcher that can be injected into a fragment */
private SettingsLauncher mSettingsLauncher = new SettingsLauncherImpl();
private SnackbarManager mSnackbarManager;
@SuppressLint("InlinedApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -165,9 +169,18 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
ViewGroup contentView = findViewById(android.R.id.content);
mSnackbarManager = new SnackbarManager(this, contentView, null);
Fragment fragment = getMainFragment();
if (fragment instanceof SiteSettingsPreferenceFragment) {
ChromeSiteSettingsDelegate delegate =
(ChromeSiteSettingsDelegate) (((SiteSettingsPreferenceFragment) fragment)
.getSiteSettingsDelegate());
delegate.setSnackbarManager(mSnackbarManager);
}
ViewGroup listView = null;
if (fragment instanceof PreferenceFragmentCompat) {
listView = ((PreferenceFragmentCompat) fragment).getListView();
......@@ -178,8 +191,8 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity
if (listView == null) return;
// Append action bar shadow to layout.
View inflatedView = getLayoutInflater().inflate(
R.layout.settings_action_bar_shadow, findViewById(android.R.id.content));
View inflatedView =
getLayoutInflater().inflate(R.layout.settings_action_bar_shadow, contentView);
// Display shadow on scroll.
listView.getViewTreeObserver().addOnScrollChangedListener(
......@@ -331,6 +344,11 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity
}
}
@Override
public SnackbarManager getSnackbarManager() {
return mSnackbarManager;
}
private void ensureActivityNotExported() {
if (sActivityNotExportedChecked) return;
sActivityNotExportedChecked = true;
......
......@@ -19,10 +19,13 @@ import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedW
import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
import org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxSnackbarController;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
import org.chromium.chrome.browser.ui.favicon.FaviconHelper;
import org.chromium.chrome.browser.ui.favicon.FaviconHelper.FaviconImageCallback;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.chrome.browser.webapps.WebappRegistry;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
......@@ -52,12 +55,23 @@ public class ChromeSiteSettingsDelegate implements SiteSettingsDelegate {
private final Context mContext;
private final BrowserContextHandle mBrowserContext;
private ManagedPreferenceDelegate mManagedPreferenceDelegate;
private PrivacySandboxSnackbarController mPrivacySandboxController;
public ChromeSiteSettingsDelegate(Context context, BrowserContextHandle browserContext) {
mContext = context;
mBrowserContext = browserContext;
}
/**
* Used to set an instance of {@link SnackbarManager} by the parent activity.
*/
public void setSnackbarManager(SnackbarManager manager) {
if (manager != null) {
mPrivacySandboxController = new PrivacySandboxSnackbarController(
mContext, manager, new SettingsLauncherImpl());
}
}
@Override
public BrowserContextHandle getBrowserContextHandle() {
return mBrowserContext;
......@@ -220,4 +234,22 @@ public class ChromeSiteSettingsDelegate implements SiteSettingsDelegate {
public Set<String> getAllDelegatedNotificationOrigins() {
return TrustedWebActivityPermissionManager.get().getAllDelegatedOrigins();
}
@Override
public void maybeDisplayPrivacySandboxSnackbar() {
if (mPrivacySandboxController == null
|| !ChromeFeatureList.isEnabled(ChromeFeatureList.PRIVACY_SANDBOX_SETTINGS)) {
return;
}
mPrivacySandboxController.showSnackbar();
}
@Override
public void dismissPrivacySandboxSnackbar() {
if (mPrivacySandboxController == null
|| !ChromeFeatureList.isEnabled(ChromeFeatureList.PRIVACY_SANDBOX_SETTINGS)) {
return;
}
mPrivacySandboxController.dismissSnackbar();
}
}
......@@ -10,9 +10,14 @@ android_library("java") {
"//chrome/android:chrome_all_java",
"//chrome/android:chrome_java",
]
sources = [ "java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragment.java" ]
sources = [
"java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSettingsFragment.java",
"java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSnackbarController.java",
]
deps = [
":java_resources",
"//base:base_java",
"//chrome/browser/ui/messages/android:java",
"//components/browser_ui/settings/android:java",
"//third_party/android_deps:androidx_fragment_fragment_java",
"//third_party/android_deps:androidx_preference_preference_java",
......
// Copyright 2021 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.privacy_sandbox;
import android.content.Context;
import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.components.browser_ui.settings.SettingsLauncher;
/**
* Shows the snackbar for Privacy Sandbox settings, allowing the user to quickly navigate there.
*/
public class PrivacySandboxSnackbarController implements SnackbarManager.SnackbarController {
private Context mContext;
private SettingsLauncher mSettingsLauncher;
private SnackbarManager mSnackbarManager;
/**
* Creates an instance of the controller given a SnackbarManager and a SettingsLauncher.
*/
public PrivacySandboxSnackbarController(
Context context, SnackbarManager manager, SettingsLauncher launcher) {
ThreadUtils.assertOnUiThread();
assert manager != null;
mContext = context;
mSnackbarManager = manager;
mSettingsLauncher = launcher;
}
/**
* Displays a snackbar, showing the user an option to go to Privacy Sandbox settings.
*/
public void showSnackbar() {
mSnackbarManager.dismissSnackbars(this);
mSnackbarManager.showSnackbar(
Snackbar.make(mContext.getString(R.string.privacy_sandbox_snackbar_message), this,
Snackbar.TYPE_ACTION, Snackbar.UMA_PRIVACY_SANDBOX_PAGE_OPEN)
.setAction(mContext.getString(R.string.more), null));
}
/**
* Dismisses the snackbar, if it is active.
*/
public void dismissSnackbar() {
mSnackbarManager.dismissSnackbars(this);
}
// Implement SnackbarController.
@Override
public void onAction(Object actionData) {
mSettingsLauncher.launchSettingsActivity(mContext, PrivacySandboxSettingsFragment.class);
}
@Override
public void onDismissNoAction(Object actionData) {}
}
......@@ -794,6 +794,9 @@ For example, some websites may respond to this request by showing you ads that a
<message name="IDS_PRIVACY_SANDBOX_BULLET_TWO" desc="Second bullet point of the Privacy Sandbox description">
Allow advertisers to study ad campaigns using non-identifiable information.
</message>
<message name="IDS_PRIVACY_SANDBOX_SNACKBAR_MESSAGE" desc="The text displayed in the snackbar, which gives the user an option to navigate to the Privacy Sandbox settings page. 'Privacy sandbox' has TC ID 5753235213964358658.">
Explore the Privacy Sandbox
</message>
<!-- Secure DNS Settings. Used by //chrome/browser/privacy. -->
<message name="IDS_SETTINGS_CUSTOM" desc="Label for a custom option in a dropdown menu.">
......
......@@ -90,6 +90,7 @@ public class Snackbar {
public static final int UMA_CONDITIONAL_TAB_STRIP_DISMISS_UNDO = 35;
public static final int UMA_PAINT_PREVIEW_UPGRADE_NOTIFICATION = 36;
public static final int UMA_READING_LIST_BOOKMARK_ADDED = 37;
public static final int UMA_PRIVACY_SANDBOX_PAGE_OPEN = 38;
private SnackbarController mController;
private CharSequence mText;
......
......@@ -490,6 +490,13 @@ public class SingleCategorySettings extends SiteSettingsPreferenceFragment
return;
}
getSiteSettingsDelegate().dismissPrivacySandboxSnackbar();
// Display the Privacy Sandbox snackbar whenever third-party/all cookies are blocked.
if (mode == CookieControlsMode.BLOCK_THIRD_PARTY) {
getSiteSettingsDelegate().maybeDisplayPrivacySandboxSnackbar();
}
WebsitePreferenceBridge.setCategoryEnabled(
getSiteSettingsDelegate().getBrowserContextHandle(), ContentSettingsType.COOKIES,
allowCookies);
......
......@@ -112,4 +112,15 @@ public interface SiteSettingsDelegate {
* @return The set of all origins whose notification permissions are delegated to another app.
*/
Set<String> getAllDelegatedNotificationOrigins();
/**
* Displays a snackbar, informing the user about the Privacy Sandbox settings page, when the
* corresponding flag is enabled.
*/
void maybeDisplayPrivacySandboxSnackbar();
/**
* Dismisses the Privacy Sandbox snackbar, if active.
*/
void dismissPrivacySandboxSnackbar();
}
......@@ -25,7 +25,7 @@ public abstract class SiteSettingsPreferenceFragment extends PreferenceFragmentC
/**
* @return the SiteSettingsDelegate instance to use when rendering the Site Settings UI.
*/
protected SiteSettingsDelegate getSiteSettingsDelegate() {
public SiteSettingsDelegate getSiteSettingsDelegate() {
assert mSiteSettingsDelegate != null : "SiteSettingsDelegate not set";
return mSiteSettingsDelegate;
}
......
......@@ -69823,6 +69823,7 @@ https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.1.pdf
<int value="34" label="UMA_HOMEPAGE_PROMO_CHANGED_UNDO"/>
<int value="35" label="UMA_CONDITIONAL_TAB_STRIP_DISMISS_UNDO"/>
<int value="37" label="UMA_READING_LIST_BOOKMARK_ADDED"/>
<int value="38" label="UMA_PRIVACY_SANDBOX_PAGE_OPEN"/>
</enum>
<enum name="SnapshotItemId">
......@@ -142,4 +142,10 @@ public class WebLayerSiteSettingsDelegate
public Set<String> getAllDelegatedNotificationOrigins() {
return Collections.EMPTY_SET;
}
@Override
public void maybeDisplayPrivacySandboxSnackbar() {}
@Override
public void dismissPrivacySandboxSnackbar() {}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment