Merge pull request #15063 from brave/cookie_consent_dialog_android

Block cookie consent dialog android
This commit is contained in:
Deep Pandya
2022-09-21 23:21:59 -04:00
committed by GitHub
39 changed files with 637 additions and 12 deletions
+17
View File
@@ -55,6 +55,8 @@ brave_java_resources = [
"java/res/drawable-hdpi/ic_ad_free_videos.png",
"java/res/drawable-hdpi/ic_brave_onboarding.png",
"java/res/drawable-hdpi/ic_chrome.png",
"java/res/drawable-hdpi/ic_cookie.png",
"java/res/drawable-hdpi/ic_cookie_background.png",
"java/res/drawable-hdpi/ic_cross_modal.png",
"java/res/drawable-hdpi/ic_delete_white_24dp.png",
"java/res/drawable-hdpi/ic_expand_less_black_24dp.png",
@@ -138,6 +140,8 @@ brave_java_resources = [
"java/res/drawable-mdpi/ic_ad_free_videos.png",
"java/res/drawable-mdpi/ic_brave_onboarding.png",
"java/res/drawable-mdpi/ic_chrome.png",
"java/res/drawable-mdpi/ic_cookie.png",
"java/res/drawable-mdpi/ic_cookie_background.png",
"java/res/drawable-mdpi/ic_cross_modal.png",
"java/res/drawable-mdpi/ic_delete_white_24dp.png",
"java/res/drawable-mdpi/ic_expand_less_black_24dp.png",
@@ -179,6 +183,11 @@ brave_java_resources = [
"java/res/drawable-mdpi/verified_creator_large.png",
"java/res/drawable-mdpi/verified_disclosure.png",
"java/res/drawable-mdpi/yandex.png",
"java/res/drawable-night-hdpi/ic_cookie_background.png",
"java/res/drawable-night-mdpi/ic_cookie_background.png",
"java/res/drawable-night-xhdpi/ic_cookie_background.png",
"java/res/drawable-night-xxhdpi/ic_cookie_background.png",
"java/res/drawable-night-xxxhdpi/ic_cookie_background.png",
"java/res/drawable-nodpi/dylan_malval_sea_min.webp",
"java/res/drawable-nodpi/eth.png",
"java/res/drawable-nodpi/fee_icon.png",
@@ -226,6 +235,8 @@ brave_java_resources = [
"java/res/drawable-xhdpi/ic_ad_free_videos.png",
"java/res/drawable-xhdpi/ic_brave_onboarding.png",
"java/res/drawable-xhdpi/ic_chrome.png",
"java/res/drawable-xhdpi/ic_cookie.png",
"java/res/drawable-xhdpi/ic_cookie_background.png",
"java/res/drawable-xhdpi/ic_cross_modal.png",
"java/res/drawable-xhdpi/ic_delete_white_24dp.png",
"java/res/drawable-xhdpi/ic_expand_less_black_24dp.png",
@@ -308,6 +319,8 @@ brave_java_resources = [
"java/res/drawable-xxhdpi/ic_ad_free_videos.png",
"java/res/drawable-xxhdpi/ic_brave_onboarding.png",
"java/res/drawable-xxhdpi/ic_chrome.png",
"java/res/drawable-xxhdpi/ic_cookie.png",
"java/res/drawable-xxhdpi/ic_cookie_background.png",
"java/res/drawable-xxhdpi/ic_cross_modal.png",
"java/res/drawable-xxhdpi/ic_delete_white_24dp.png",
"java/res/drawable-xxhdpi/ic_expand_less_black_24dp.png",
@@ -389,6 +402,8 @@ brave_java_resources = [
"java/res/drawable-xxxhdpi/ic_ad_free_videos.png",
"java/res/drawable-xxxhdpi/ic_brave_onboarding.png",
"java/res/drawable-xxxhdpi/ic_chrome.png",
"java/res/drawable-xxxhdpi/ic_cookie.png",
"java/res/drawable-xxxhdpi/ic_cookie_background.png",
"java/res/drawable-xxxhdpi/ic_cross_modal.png",
"java/res/drawable-xxxhdpi/ic_delete_white_24dp.png",
"java/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png",
@@ -482,6 +497,7 @@ brave_java_resources = [
"java/res/drawable/brave_sync_warning.xml",
"java/res/drawable/card_bg.xml",
"java/res/drawable/circular_progress.xml",
"java/res/drawable/cookie_consent_tooltip_background.xml",
"java/res/drawable/crypto_wallet_blue_button.xml",
"java/res/drawable/crypto_wallet_hollow_button.xml",
"java/res/drawable/default_dot.xml",
@@ -712,6 +728,7 @@ brave_java_resources = [
"java/res/layout/activity_welcome_onboarding.xml",
"java/res/layout/application_item_layout.xml",
"java/res/layout/approve_tx_bottom_sheet.xml",
"java/res/layout/block_cookie_consent_notices_tooltip.xml",
"java/res/layout/bottom_toolbar.xml",
"java/res/layout/bottom_toolbar_browsing.xml",
"java/res/layout/bottom_toolbar_menu_button.xml",
+1
View File
@@ -303,6 +303,7 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsHandler.java",
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsMenuObserver.java",
"../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/shields/CookieListOptInServiceFactory.java",
"../../brave/android/java/org/chromium/chrome/browser/signin/BraveSigninManager.java",
"../../brave/android/java/org/chromium/chrome/browser/site_settings/BraveSiteSettingsDelegate.java",
"../../brave/android/java/org/chromium/chrome/browser/site_settings/BraveWalletEthereumConnectedSites.java",
@@ -44,4 +44,7 @@ public final class BravePreferenceKeys {
"org.chromium.chrome.browser.Brave_Biometrics_For_Wallet_Encrypted";
public static final String BRAVE_AD_FREE_CALLOUT_DIALOG = "brave_ad_free_callout_dialog";
public static final String BRAVE_OPENED_YOUTUBE = "brave_opened_youtube";
public static final String SHOULD_SHOW_COOKIE_CONSENT_NOTICE =
"should_show_cookie_consent_notice";
public static final String LOADED_SITE_COUNT = "loaded_site_count";
}
@@ -15,12 +15,14 @@ import androidx.preference.PreferenceCategory;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.brave_shields.mojom.CookieListOptInPageAndroidHandler;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveConfig;
import org.chromium.chrome.browser.metrics.UmaSessionStats;
import org.chromium.chrome.browser.preferences.BravePref;
import org.chromium.chrome.browser.preferences.BravePrefServiceBridge;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.preferences.website.BraveShieldsContentSettings;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.privacy.settings.PrivacySettings;
@@ -29,14 +31,17 @@ import org.chromium.chrome.browser.settings.BraveDialogPreference;
import org.chromium.chrome.browser.settings.BravePreferenceDialogFragment;
import org.chromium.chrome.browser.settings.BraveWebrtcPolicyPreference;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.chrome.browser.shields.CookieListOptInServiceFactory;
import org.chromium.components.browser_ui.settings.ChromeBaseCheckBoxPreference;
import org.chromium.components.browser_ui.settings.ChromeBasePreference;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.components.prefs.PrefService;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.system.MojoException;
public class BravePrivacySettings extends PrivacySettings {
public class BravePrivacySettings extends PrivacySettings implements ConnectionErrorHandler {
// Chromium Prefs
private static final String PREF_CAN_MAKE_PAYMENT = "can_make_payment";
private static final String PREF_NETWORK_PREDICTIONS = "preload_pages";
@@ -64,6 +69,7 @@ public class BravePrivacySettings extends PrivacySettings {
private static final String PREF_HTTPSE = "httpse";
private static final String PREF_DE_AMP = "de_amp";
private static final String PREF_IPFS_GATEWAY = "ipfs_gateway";
private static final String PREF_BLOCK_COOKIE_CONSENT_NOTICES = "block_cookie_consent_notices";
private static final String PREF_AD_BLOCK = "ad_block";
private static final String PREF_BLOCK_SCRIPTS = "scripts_block";
public static final String PREF_FINGERPRINTING_PROTECTION = "fingerprinting_protection";
@@ -105,11 +111,11 @@ public class BravePrivacySettings extends PrivacySettings {
PREF_OTHER_PRIVACY_SETTINGS_SECTION, // other section
PREF_WEBRTC_POLICY, PREF_SAFE_BROWSING, PREF_INCOGNITO_LOCK, PREF_CAN_MAKE_PAYMENT,
PREF_UNSTOPPABLE_DOMAINS, PREF_ETH_NAMED_SERVICE, PREF_IPFS_GATEWAY, PREF_SECURE_DNS,
PREF_DO_NOT_TRACK, PREF_PHONE_AS_A_SECURITY_KEY, PREF_CLOSE_TABS_ON_EXIT, PREF_SEND_P3A,
PREF_SEND_CRASH_REPORTS, PREF_BRAVE_STATS_USAGE_PING,
PREF_SHOW_AUTOCOMPLETE_IN_ADDRESS_BAR, PREF_SEARCH_SUGGESTIONS,
PREF_AUTOCOMPLETE_TOP_SITES, PREF_AUTOCOMPLETE_BRAVE_SUGGESTED_SITES, PREF_USAGE_STATS,
PREF_PRIVACY_SANDBOX};
PREF_BLOCK_COOKIE_CONSENT_NOTICES, PREF_DO_NOT_TRACK, PREF_PHONE_AS_A_SECURITY_KEY,
PREF_CLOSE_TABS_ON_EXIT, PREF_SEND_P3A, PREF_SEND_CRASH_REPORTS,
PREF_BRAVE_STATS_USAGE_PING, PREF_SHOW_AUTOCOMPLETE_IN_ADDRESS_BAR,
PREF_SEARCH_SUGGESTIONS, PREF_AUTOCOMPLETE_TOP_SITES,
PREF_AUTOCOMPLETE_BRAVE_SUGGESTED_SITES, PREF_USAGE_STATS, PREF_PRIVACY_SANDBOX};
private final int STRICT = 0;
private final int STANDARD = 1;
@@ -137,6 +143,7 @@ public class BravePrivacySettings extends PrivacySettings {
private ChromeSwitchPreference mSendCrashReports;
private ChromeSwitchPreference mBraveStatsUsagePing;
private ChromeSwitchPreference mIpfsGatewayPref;
private ChromeSwitchPreference mBlockCookieConsentNoticesPref;
private PreferenceCategory mSocialBlockingCategory;
private ChromeSwitchPreference mSocialBlockingGoogle;
private ChromeSwitchPreference mHttpsEverywhere;
@@ -147,6 +154,31 @@ public class BravePrivacySettings extends PrivacySettings {
private ChromeSwitchPreference mClearBrowsingDataOnExit;
private Preference mUstoppableDomains;
private ChromeSwitchPreference mFingerprntLanguagePref;
private CookieListOptInPageAndroidHandler mCookieListOptInPageAndroidHandler;
@Override
public void onConnectionError(MojoException e) {
mCookieListOptInPageAndroidHandler = null;
initCookieListOptInPageAndroidHandler();
}
private void initCookieListOptInPageAndroidHandler() {
if (mCookieListOptInPageAndroidHandler != null) {
return;
}
mCookieListOptInPageAndroidHandler =
CookieListOptInServiceFactory.getInstance().getCookieListOptInPageAndroidHandler(
this);
}
@Override
public void onDestroy() {
if (mCookieListOptInPageAndroidHandler != null) {
mCookieListOptInPageAndroidHandler.close();
}
super.onDestroy();
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -157,6 +189,8 @@ public class BravePrivacySettings extends PrivacySettings {
SettingsUtils.addPreferencesFromResource(this, R.xml.brave_privacy_preferences);
initCookieListOptInPageAndroidHandler();
mHttpsePref = (ChromeSwitchPreference) findPreference(PREF_HTTPSE);
mHttpsePref.setOnPreferenceChangeListener(this);
@@ -178,6 +212,10 @@ public class BravePrivacySettings extends PrivacySettings {
mIpfsGatewayPref = (ChromeSwitchPreference) findPreference(PREF_IPFS_GATEWAY);
mIpfsGatewayPref.setOnPreferenceChangeListener(this);
mBlockCookieConsentNoticesPref =
(ChromeSwitchPreference) findPreference(PREF_BLOCK_COOKIE_CONSENT_NOTICES);
mBlockCookieConsentNoticesPref.setOnPreferenceChangeListener(this);
mBlockCrosssiteCookies =
(BraveDialogPreference) findPreference(PREF_BLOCK_CROSS_SITE_COOKIES);
mBlockCrosssiteCookies.setOnPreferenceChangeListener(this);
@@ -245,6 +283,14 @@ public class BravePrivacySettings extends PrivacySettings {
removePreferenceIfPresent(PREF_PRIVACY_SANDBOX);
removePreferenceIfPresent(PREF_SAFE_BROWSING);
if (mCookieListOptInPageAndroidHandler != null) {
mCookieListOptInPageAndroidHandler.shouldShowDialog(shouldShowDialog -> {
if (!shouldShowDialog) {
removePreferenceIfPresent(PREF_BLOCK_COOKIE_CONSENT_NOTICES);
}
});
}
updateBravePreferences();
}
@@ -295,6 +341,11 @@ public class BravePrivacySettings extends PrivacySettings {
} else if (PREF_IPFS_GATEWAY.equals(key)) {
BravePrefServiceBridge.getInstance().setIpfsGatewayEnabled((boolean) newValue);
} else if (PREF_BLOCK_COOKIE_CONSENT_NOTICES.equals(key)) {
if (mCookieListOptInPageAndroidHandler != null) {
mCookieListOptInPageAndroidHandler.enableFilter((boolean) newValue);
}
} else if (PREF_FINGERPRINTING_PROTECTION.equals(key)) {
if (newValue instanceof String
&& String.valueOf(newValue).equals(
@@ -522,6 +573,10 @@ public class BravePrivacySettings extends PrivacySettings {
mAutocompleteBraveSuggestedSites.setEnabled(autocompleteEnabled);
mFingerprntLanguagePref.setChecked(UserPrefs.get(Profile.getLastUsedRegularProfile())
.getBoolean(BravePref.REDUCE_LANGUAGE_ENABLED));
if (mCookieListOptInPageAndroidHandler != null) {
mCookieListOptInPageAndroidHandler.isFilterListEnabled(
isEnabled -> { mBlockCookieConsentNoticesPref.setChecked(isEnabled); });
}
}
private void removePreferenceIfPresent(String key) {
@@ -0,0 +1,58 @@
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.shields;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.brave_shields.mojom.CookieListOptInPageAndroidHandler;
import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.bindings.Interface;
import org.chromium.mojo.bindings.Interface.Proxy.Handler;
import org.chromium.mojo.system.MessagePipeHandle;
import org.chromium.mojo.system.impl.CoreImpl;
@JNINamespace("chrome::android")
public class CookieListOptInServiceFactory {
private static final Object lock = new Object();
private static CookieListOptInServiceFactory instance;
public static CookieListOptInServiceFactory getInstance() {
synchronized (lock) {
if (instance == null) {
instance = new CookieListOptInServiceFactory();
}
}
return instance;
}
private CookieListOptInServiceFactory() {}
public CookieListOptInPageAndroidHandler getCookieListOptInPageAndroidHandler(
ConnectionErrorHandler connectionErrorHandler) {
Profile profile = Utils.getProfile(false); // Always use regular profile
int nativeHandle =
CookieListOptInServiceFactoryJni.get().getInterfaceToCookieListOptInService(
profile);
MessagePipeHandle handle = wrapNativeHandle(nativeHandle);
CookieListOptInPageAndroidHandler cookieListOptInPageAndroidHandler =
CookieListOptInPageAndroidHandler.MANAGER.attachProxy(handle, 0);
Handler handler = ((Interface.Proxy) cookieListOptInPageAndroidHandler).getProxyHandler();
handler.setErrorHandler(connectionErrorHandler);
return cookieListOptInPageAndroidHandler;
}
private MessagePipeHandle wrapNativeHandle(int nativeHandle) {
return CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle();
}
@NativeMethods
interface Natives {
int getInterfaceToCookieListOptInService(Profile profile);
}
}
@@ -53,11 +53,13 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.BraveFeatureList;
import org.chromium.base.BraveReflectionUtil;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.base.MathUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.supplier.BooleanSupplier;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.task.AsyncTask;
import org.chromium.brave_shields.mojom.CookieListOptInPageAndroidHandler;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveAdsNativeHelper;
import org.chromium.chrome.browser.BraveRelaunchUtils;
@@ -98,6 +100,7 @@ import org.chromium.chrome.browser.settings.BraveSearchEngineUtils;
import org.chromium.chrome.browser.shields.BraveShieldsHandler;
import org.chromium.chrome.browser.shields.BraveShieldsMenuObserver;
import org.chromium.chrome.browser.shields.BraveShieldsUtils;
import org.chromium.chrome.browser.shields.CookieListOptInServiceFactory;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.browser.tab.TabSelectionType;
@@ -123,6 +126,8 @@ import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.system.MojoException;
import org.chromium.ui.UiUtils;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
import org.chromium.ui.util.ColorUtils;
@@ -143,7 +148,8 @@ import java.util.Set;
public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
implements BraveToolbarLayout, OnClickListener, View.OnLongClickListener,
BraveRewardsObserver, BraveRewardsNativeWorker.PublisherObserver {
BraveRewardsObserver, BraveRewardsNativeWorker.PublisherObserver,
ConnectionErrorHandler {
private static final String JAPAN_COUNTRY_CODE = "JP";
private static final String YOUTUBE_DOMAIN = "youtube.com";
private static final List<String> mBraveSearchEngineDefaultRegions =
@@ -181,6 +187,7 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
private boolean mIsInitialNotificationPosted; // initial red circle notification
private PopupWindowTooltip mShieldsPopupWindowTooltip;
private PopupWindowTooltip mCookieConsentTooltip;
private boolean mIsBottomToolbarVisible;
@@ -190,6 +197,8 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
private final Set<Integer> mTabsWithWalletIcon =
Collections.synchronizedSet(new HashSet<Integer>());
private CookieListOptInPageAndroidHandler mCookieListOptInPageAndroidHandler;
private enum BIGTECH_COMPANY { Google, Facebook, Amazon }
public BraveToolbarLayoutImpl(Context context, AttributeSet attrs) {
@@ -201,8 +210,10 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
if (mBraveShieldsContentSettings != null) {
mBraveShieldsContentSettings.removeObserver(mBraveShieldsContentSettingsObserver);
}
if (mCookieListOptInPageAndroidHandler != null) {
mCookieListOptInPageAndroidHandler.close();
}
super.destroy();
if (mBraveRewardsNativeWorker != null) {
mBraveRewardsNativeWorker.RemoveObserver(this);
mBraveRewardsNativeWorker.RemovePublisherObserver(this);
@@ -336,9 +347,26 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
}
}
@Override
public void onConnectionError(MojoException e) {
mCookieListOptInPageAndroidHandler = null;
initCookieListOptInPageAndroidHandler();
}
private void initCookieListOptInPageAndroidHandler() {
if (mCookieListOptInPageAndroidHandler != null) {
return;
}
mCookieListOptInPageAndroidHandler =
CookieListOptInServiceFactory.getInstance().getCookieListOptInPageAndroidHandler(
this);
}
@Override
protected void onNativeLibraryReady() {
super.onNativeLibraryReady();
initCookieListOptInPageAndroidHandler();
mBraveShieldsContentSettings = BraveShieldsContentSettings.getInstance();
mBraveShieldsContentSettings.addObserver(mBraveShieldsContentSettingsObserver);
@@ -409,6 +437,17 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
&& mBraveShieldsHandler != null && !mBraveShieldsHandler.isShowing()) {
checkForTooltip(tab);
}
if (mBraveShieldsButton != null && mBraveShieldsButton.isShown()
&& mBraveShieldsHandler != null && !mBraveShieldsHandler.isShowing()
&& !url.getSpec().startsWith(UrlConstants.CHROME_SCHEME)
&& !UrlUtilities.isNTPUrl(url.getSpec())) {
SharedPreferencesManager.getInstance().writeInt(
BravePreferenceKeys.LOADED_SITE_COUNT,
SharedPreferencesManager.getInstance().readInt(
BravePreferenceKeys.LOADED_SITE_COUNT, 0)
+ 1);
maybeShowCookieConsentTooltip();
}
}
String countryCode = Locale.getDefault().getCountry();
@@ -581,6 +620,72 @@ public abstract class BraveToolbarLayoutImpl extends ToolbarLayout
}
}
private void maybeShowCookieConsentTooltip() {
if (mCookieListOptInPageAndroidHandler != null) {
mCookieListOptInPageAndroidHandler.shouldShowDialog(shouldShowDialog -> {
mCookieListOptInPageAndroidHandler.isFilterListEnabled(isEnabled -> {
if (!isEnabled && shouldShowDialog
&& SharedPreferencesManager.getInstance().readBoolean(
BravePreferenceKeys.SHOULD_SHOW_COOKIE_CONSENT_NOTICE, true)
&& SharedPreferencesManager.getInstance().readInt(
BravePreferenceKeys.LOADED_SITE_COUNT, 0)
> 5) {
showCookieConsentTooltip();
}
});
});
}
}
private void showCookieConsentTooltip() {
ViewGroup viewGroup =
BraveActivity.getBraveActivity().getWindow().getDecorView().findViewById(
android.R.id.content);
float padding = (float) dpToPx(getContext(), 20);
mCookieConsentTooltip = new PopupWindowTooltip.Builder(getContext())
.anchorView(mBraveShieldsButton)
.arrowColor(ContextCompat.getColor(
getContext(), R.color.cookie_consent_tooltip_color))
.gravity(Gravity.BOTTOM)
.dismissOnOutsideTouch(true)
.dismissOnInsideTouch(false)
.backgroundDimDisabled(false)
.padding(padding)
.parentPaddingHorizontal(dpToPx(getContext(), 10))
.modal(true)
.onDismissListener(tooltip
-> {
})
.contentView(R.layout.block_cookie_consent_notices_tooltip)
.build();
Button btnAction = mCookieConsentTooltip.findViewById(R.id.btn_action);
btnAction.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCookieListOptInPageAndroidHandler != null) {
mCookieListOptInPageAndroidHandler.enableFilter(true);
}
mCookieConsentTooltip.dismiss();
}
}));
TextView txtNoThanks = mCookieConsentTooltip.findViewById(R.id.txt_no_thanks);
txtNoThanks.setOnClickListener((new View.OnClickListener() {
@Override
public void onClick(View v) {
mCookieConsentTooltip.dismiss();
}
}));
if (mBraveShieldsButton != null && mBraveShieldsButton.isShown()) {
mCookieConsentTooltip.show();
SharedPreferencesManager.getInstance().writeBoolean(
BravePreferenceKeys.SHOULD_SHOW_COOKIE_CONSENT_NOTICE, false);
}
}
public void dismissShieldsTooltip() {
if (mShieldsPopupWindowTooltip != null && mShieldsPopupWindowTooltip.isShowing()) {
mShieldsPopupWindowTooltip.dismiss();
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 The Brave Authors. All rights reserved.
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at http://mozilla.org/MPL/2.0/. -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/ic_cookie_background" />
<item>
<shape android:shape="rectangle">
<corners android:radius="8dp"/>
</shape>
</item>
</layer-list>
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2022 The Brave Authors. All rights reserved.
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at http://mozilla.org/MPL/2.0/. -->
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/shields_tooltip_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/cookie_consent_tooltip_background"
android:fadeScrollbars="false">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginTop="24dp"
android:layout_gravity="center_horizontal"
app:srcCompat="@drawable/ic_cookie"
android:contentDescription="@null" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:layout_marginTop="22dp"
android:layout_marginBottom="16dp"
android:gravity="center_horizontal"
android:text="@string/block_cookie_notices_title"
android:textColor="@color/cookie_consent_text_color"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_marginBottom="32dp"
android:gravity="center_horizontal"
android:text="@string/block_cookie_notices_text"
android:textColor="@color/cookie_consent_text_color"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn_action"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:background="@drawable/crypto_wallet_blue_button"
android:text="@string/block_cookie_notices_action_text"
android:textAllCaps="false"
android:textSize="14sp"
android:paddingVertical="8dp"
android:paddingBottom="8dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:layout_marginBottom="16dp"
android:textColor="@android:color/white"
style="?android:attr/borderlessButtonStyle"/>
<TextView
android:id="@+id/txt_no_thanks"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="30dp"
android:text="@string/no_thanks"
android:textAlignment="center"
android:textColor="@color/cookie_consent_action_color"
android:textSize="14sp" />
</LinearLayout>
</ScrollView>
@@ -120,4 +120,8 @@
<!-- Brave Wallet DApp -->
<color name="brave_wallet_dapp_text_color">@android:color/white</color>
<color name="cookie_consent_action_color">@android:color/white</color>
<color name="cookie_consent_text_color">#F0F2FF</color>
<color name="cookie_consent_tooltip_color">#1E2029</color>
</resources>
+4
View File
@@ -212,4 +212,8 @@
<!-- Brave Wallet DApp -->
<color name="brave_wallet_dapp_text_color">#171919</color>
<color name="cookie_consent_action_color">@color/brave_action_color</color>
<color name="cookie_consent_text_color">#212529</color>
<color name="cookie_consent_tooltip_color">@android:color/white</color>
</resources>
@@ -108,6 +108,12 @@
android:title="@string/ipfs_gateway_title"
android:summary="@string/ipfs_gateway_summary"
android:defaultValue="true" />
<org.chromium.components.browser_ui.settings.ChromeSwitchPreference
android:key="block_cookie_consent_notices"
android:order="25"
android:title="@string/block_cookie_consent_notices_title"
android:summary="@string/block_cookie_consent_notices_summary"
android:defaultValue="false" />
<Preference
android:fragment="org.chromium.chrome.browser.decentralized_dns.settings.UnstoppableDomainsSettingsFragment"
android:key="unstoppable_domains"
+2 -1
View File
@@ -563,7 +563,8 @@ constexpr char kBraveVerticalTabsDescription[] =
{"brave-adblock-cookie-list-opt-in", \
flag_descriptions::kBraveAdblockCookieListOptInName, \
flag_descriptions::kBraveAdblockCookieListOptInDescription, \
kOsDesktop, FEATURE_VALUE_TYPE(kBraveAdblockCookieListOptIn)}, \
kOsDesktop | kOsAndroid, \
FEATURE_VALUE_TYPE(kBraveAdblockCookieListOptIn)}, \
{"brave-adblock-cosmetic-filtering", \
flag_descriptions::kBraveAdblockCosmeticFilteringName, \
flag_descriptions::kBraveAdblockCosmeticFilteringDescription, kOsAll, \
@@ -0,0 +1,26 @@
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "base/android/jni_android.h"
#include "brave/browser/brave_shields/cookie_list_opt_in_service_factory.h"
#include "brave/build/android/jni_headers/CookieListOptInServiceFactory_jni.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
namespace chrome {
namespace android {
static jint
JNI_CookieListOptInServiceFactory_GetInterfaceToCookieListOptInService(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& profile_android) {
auto* profile = ProfileAndroid::FromProfileAndroid(profile_android);
auto pending = brave_shields::CookieListOptInServiceFactory::GetInstance()
->GetForContext(profile);
return static_cast<jint>(pending.PassPipe().release().value());
}
} // namespace android
} // namespace chrome
@@ -0,0 +1,66 @@
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/browser/brave_shields/cookie_list_opt_in_service_factory.h"
#include <utility>
#include "brave/browser/brave_browser_process.h"
#include "brave/components/brave_shields/browser/cookie_list_opt_in_service.h"
#include "chrome/browser/profiles/incognito_helpers.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
namespace brave_shields {
// static
CookieListOptInServiceFactory* CookieListOptInServiceFactory::GetInstance() {
return base::Singleton<CookieListOptInServiceFactory>::get();
}
// static
mojo::PendingRemote<mojom::CookieListOptInPageAndroidHandler>
CookieListOptInServiceFactory::GetForContext(content::BrowserContext* context) {
return static_cast<CookieListOptInService*>(
GetInstance()->GetServiceForBrowserContext(context, true))
->MakeRemote();
}
// static
CookieListOptInService* CookieListOptInServiceFactory::GetServiceForContext(
content::BrowserContext* context) {
return static_cast<CookieListOptInService*>(
GetInstance()->GetServiceForBrowserContext(context, true));
}
// static
void CookieListOptInServiceFactory::BindForContext(
content::BrowserContext* context,
mojo::PendingReceiver<mojom::CookieListOptInPageAndroidHandler> receiver) {
auto* cookie_list_opt_in_service =
CookieListOptInServiceFactory::GetServiceForContext(context);
if (cookie_list_opt_in_service) {
cookie_list_opt_in_service->Bind(std::move(receiver));
}
}
CookieListOptInServiceFactory::CookieListOptInServiceFactory()
: BrowserContextKeyedServiceFactory(
"CookieListOptInService",
BrowserContextDependencyManager::GetInstance()) {}
CookieListOptInServiceFactory::~CookieListOptInServiceFactory() = default;
KeyedService* CookieListOptInServiceFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
auto* ad_block_service = g_brave_browser_process->ad_block_service();
return new CookieListOptInService(ad_block_service);
}
content::BrowserContext* CookieListOptInServiceFactory::GetBrowserContextToUse(
content::BrowserContext* context) const {
return chrome::GetBrowserContextRedirectedInIncognito(context);
}
} // namespace brave_shields
@@ -0,0 +1,49 @@
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_BROWSER_BRAVE_SHIELDS_COOKIE_LIST_OPT_IN_SERVICE_FACTORY_H_
#define BRAVE_BROWSER_BRAVE_SHIELDS_COOKIE_LIST_OPT_IN_SERVICE_FACTORY_H_
#include "base/memory/singleton.h"
#include "brave/components/brave_shields/common/cookie_list_opt_in.mojom.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/browser_context.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
namespace brave_shields {
class CookieListOptInService;
class CookieListOptInServiceFactory : public BrowserContextKeyedServiceFactory {
public:
CookieListOptInServiceFactory(const CookieListOptInServiceFactory&) = delete;
CookieListOptInServiceFactory& operator=(
const CookieListOptInServiceFactory&) = delete;
static mojo::PendingRemote<mojom::CookieListOptInPageAndroidHandler>
GetForContext(content::BrowserContext* context);
static CookieListOptInService* GetServiceForContext(
content::BrowserContext* context);
static CookieListOptInServiceFactory* GetInstance();
static void BindForContext(
content::BrowserContext* context,
mojo::PendingReceiver<mojom::CookieListOptInPageAndroidHandler> receiver);
private:
friend struct base::DefaultSingletonTraits<CookieListOptInServiceFactory>;
CookieListOptInServiceFactory();
~CookieListOptInServiceFactory() override;
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
content::BrowserContext* GetBrowserContextToUse(
content::BrowserContext* context) const override;
};
} // namespace brave_shields
#endif // BRAVE_BROWSER_BRAVE_SHIELDS_COOKIE_LIST_OPT_IN_SERVICE_FACTORY_H_
+10 -3
View File
@@ -10,6 +10,8 @@ brave_browser_brave_shields_sources = [
"//brave/browser/brave_shields/ad_block_subscription_download_manager_getter.h",
"//brave/browser/brave_shields/brave_shields_web_contents_observer.cc",
"//brave/browser/brave_shields/brave_shields_web_contents_observer.h",
"//brave/browser/brave_shields/cookie_list_opt_in_service_factory.cc",
"//brave/browser/brave_shields/cookie_list_opt_in_service_factory.h",
"//brave/browser/brave_shields/https_everywhere_component_installer.cc",
"//brave/browser/brave_shields/https_everywhere_component_installer.h",
]
@@ -34,7 +36,12 @@ brave_browser_brave_shields_deps = [
]
if (is_android) {
brave_browser_brave_shields_sources += [ "//brave/browser/brave_shields/brave_shields_web_contents_observer_android.cc" ]
brave_browser_brave_shields_deps +=
[ "//brave/browser/android:android_browser_process" ]
brave_browser_brave_shields_sources += [
"//brave/browser/brave_shields/android/cookie_list_opt_in_service_factory_android.cc",
"//brave/browser/brave_shields/brave_shields_web_contents_observer_android.cc",
]
brave_browser_brave_shields_deps += [
"//brave/browser/android:android_browser_process",
"//brave/build/android:jni_headers",
]
}
@@ -212,6 +212,12 @@ This file contains all "about" strings. It is set to NOT be translated, in tran
<message name="IDS_IPFS_GATEWAY_SUMMARY" desc="Summary for IPFS gateway setting.">
Allows for navigation to IPFS resources through an IPFS Gateway
</message>
<message name="IDS_BLOCK_COOKIE_CONSENT_NOTICES_TITLE" desc="Title for Block cookie consent notices setting.">
Block cookie consent notices
</message>
<message name="IDS_BLOCK_COOKIE_CONSENT_NOTICES_SUMMARY" desc="Summary for Block cookie consent notices setting.">
Blocks website pop-ups that ask you to accept / decline cookies on their site
</message>
<message name="IDS_UNSTOPPABLE_DOMAINS_TITLE" desc="Title for Unstoppable Domains settings.">
Unstoppable Domains
</message>
@@ -2947,6 +2953,15 @@ If you don't accept this request, VPN will not reconnect and your internet conne
<message name="IDS_BACKUP_WALLET_PASSWORD" desc="Brave Wallet prompt to enter a password">
Enter your Brave Wallet password
</message>
<message name="IDS_BLOCK_COOKIE_NOTICES_ACTION_TEXT" desc="Block cookie consent notices action text">
Block cookie notices
</message>
<message name="IDS_BLOCK_COOKIE_NOTICES_TITLE" desc="Block cookie consent notices title">
Tired of cookie consent notices?
</message>
<message name="IDS_BLOCK_COOKIE_NOTICES_TEXT" desc="Block cookie consent notices text">
Brave already blocks third-party cookies. We can block cookie consent notices, too.
</message>
</messages>
</release>
</grit>
+1
View File
@@ -198,6 +198,7 @@ generate_jni("jni_headers") {
"//brave/android/java/org/chromium/chrome/browser/preferences/BravePrefServiceBridge.java",
"//brave/android/java/org/chromium/chrome/browser/preferences/website/BraveShieldsContentSettings.java",
"//brave/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java",
"//brave/android/java/org/chromium/chrome/browser/shields/CookieListOptInServiceFactory.java",
"//brave/android/java/org/chromium/chrome/browser/signin/BraveSigninManager.java",
"//brave/android/java/org/chromium/chrome/browser/sync/BraveSyncDevices.java",
"//brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java",
+1
View File
@@ -20,6 +20,7 @@ brave_chrome_java_deps = [
"//brave/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/settings:java",
"//brave/browser/ui/android/omnibox:java",
"//brave/browser/ui/android/theme:java",
"//brave/components/brave_shields/common:mojom_java",
"//brave/components/brave_today/common:mojom_java",
"//brave/components/brave_wallet/common:mojom_java",
"//brave/components/browser_ui/site_settings/android:java",
@@ -42,6 +42,8 @@ if (!is_ios) {
"brave_shields_p3a.h",
"brave_shields_util.cc",
"brave_shields_util.h",
"cookie_list_opt_in_service.cc",
"cookie_list_opt_in_service.h",
"domain_block_controller_client.cc",
"domain_block_controller_client.h",
"domain_block_navigation_throttle.cc",
@@ -0,0 +1,58 @@
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/components/brave_shields/browser/cookie_list_opt_in_service.h"
#include <utility>
#include "base/feature_list.h"
#include "brave/components/brave_shields/browser/ad_block_regional_service_manager.h"
#include "brave/components/brave_shields/browser/ad_block_service.h"
#include "brave/components/brave_shields/common/brave_shield_constants.h"
#include "brave/components/brave_shields/common/cookie_list_opt_in.mojom-forward.h"
#include "brave/components/brave_shields/common/cookie_list_opt_in.mojom-shared.h"
#include "brave/components/brave_shields/common/features.h"
namespace brave_shields {
CookieListOptInService::CookieListOptInService(AdBlockService* ad_block_service)
: ad_block_service_(ad_block_service) {}
CookieListOptInService::~CookieListOptInService() = default;
mojo::PendingRemote<mojom::CookieListOptInPageAndroidHandler>
CookieListOptInService::MakeRemote() {
mojo::PendingRemote<mojom::CookieListOptInPageAndroidHandler> remote;
receivers_.Add(this, remote.InitWithNewPipeAndPassReceiver());
return remote;
}
void CookieListOptInService::Bind(
mojo::PendingReceiver<mojom::CookieListOptInPageAndroidHandler> receiver) {
receivers_.Add(this, std::move(receiver));
}
void CookieListOptInService::ShouldShowDialog(
ShouldShowDialogCallback callback) {
bool should_show_dialog =
base::FeatureList::IsEnabled(
brave_shields::features::kBraveAdblockCookieListOptIn) &&
ad_block_service_->regional_service_manager()->IsFilterListAvailable(
brave_shields::kCookieListUuid);
std::move(callback).Run(should_show_dialog);
}
void CookieListOptInService::IsFilterListEnabled(
IsFilterListEnabledCallback callback) {
std::move(callback).Run(
ad_block_service_->regional_service_manager()->IsFilterListEnabled(
brave_shields::kCookieListUuid));
}
void CookieListOptInService::EnableFilter(bool shouldEnableFilter) {
ad_block_service_->regional_service_manager()->EnableFilterList(
brave_shields::kCookieListUuid, shouldEnableFilter);
}
} // namespace brave_shields
@@ -0,0 +1,46 @@
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_COOKIE_LIST_OPT_IN_SERVICE_H_
#define BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_COOKIE_LIST_OPT_IN_SERVICE_H_
#include "base/memory/weak_ptr.h"
#include "brave/components/brave_shields/common/cookie_list_opt_in.mojom-forward.h"
#include "brave/components/brave_shields/common/cookie_list_opt_in.mojom.h"
#include "components/keyed_service/core/keyed_service.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace brave_shields {
class AdBlockService;
// This class is not thread-safe and should have single owner
class CookieListOptInService : public KeyedService,
public mojom::CookieListOptInPageAndroidHandler {
public:
explicit CookieListOptInService(AdBlockService* ad_block_service);
~CookieListOptInService() override;
mojo::PendingRemote<mojom::CookieListOptInPageAndroidHandler> MakeRemote();
void Bind(
mojo::PendingReceiver<mojom::CookieListOptInPageAndroidHandler> receiver);
void ShouldShowDialog(ShouldShowDialogCallback callback) override;
void IsFilterListEnabled(IsFilterListEnabledCallback callback) override;
void EnableFilter(bool shouldEnableFilter) override;
private:
raw_ptr<AdBlockService> ad_block_service_ = nullptr;
mojo::ReceiverSet<mojom::CookieListOptInPageAndroidHandler> receivers_;
base::WeakPtrFactory<CookieListOptInService> discovery_weak_factory_{this};
CookieListOptInService(const CookieListOptInService&) = delete;
CookieListOptInService& operator=(const CookieListOptInService&) = delete;
};
} // namespace brave_shields
#endif // BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_COOKIE_LIST_OPT_IN_SERVICE_H_
+1
View File
@@ -27,6 +27,7 @@ static_library("common") {
}
mojom("mojom") {
generate_java = true
sources = [
"brave_shields.mojom",
"brave_shields_panel.mojom",
@@ -14,3 +14,9 @@ interface CookieListOptInPageHandler {
CloseUI();
EnableFilter();
};
interface CookieListOptInPageAndroidHandler {
ShouldShowDialog() => (bool should_show_dialog);
IsFilterListEnabled() => (bool is_enabled);
EnableFilter(bool should_enable_filter);
};