Show cookie settings from page info
Show cookie settings when the user clicks on "Settings" link. As chrome
and weblayer have different ways of creating intents, this happens in
the pageinfo delegate.
Bug: 1077766
Change-Id: Iefd81c06ce3947eb4e95107db1360c375955ed01
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2343033
Commit-Queue: Christian Dullweber <dullweber@chromium.org>
Reviewed-by: Mugdha Lakhani <nator@chromium.org>
Reviewed-by: Ehimare Okoyomon <eokoyomon@chromium.org>
Reviewed-by: Balazs Engedy <engedy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800557}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java
index 2d3f87d..cdb30a1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java
@@ -30,6 +30,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.site_settings.ChromeSiteSettingsClient;
 import org.chromium.chrome.browser.vr.VrModuleProvider;
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
 import org.chromium.components.browser_ui.site_settings.SiteSettingsClient;
 import org.chromium.components.content_settings.CookieControlsBridge;
 import org.chromium.components.content_settings.CookieControlsObserver;
@@ -246,6 +247,11 @@
         SiteSettingsHelper.showSiteSettings(mContext, url);
     }
 
+    @Override
+    public void showCookieSettings() {
+        SiteSettingsHelper.showCategorySettings(mContext, SiteSettingsCategory.Type.COOKIES);
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java
index 15c2b40..c333fbb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java
@@ -6,13 +6,17 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 
 import org.chromium.base.StrictModeContext;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
 import org.chromium.chrome.browser.previews.PreviewsAndroidBridge;
 import org.chromium.chrome.browser.settings.SettingsLauncher;
 import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
+import org.chromium.components.browser_ui.site_settings.ContentSettingsResources;
+import org.chromium.components.browser_ui.site_settings.SingleCategorySettings;
 import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.WebContents;
@@ -49,9 +53,30 @@
         Intent preferencesIntent = settingsLauncher.createSettingsActivityIntent(context,
                 SingleWebsiteSettings.class.getName(),
                 SingleWebsiteSettings.createFragmentArgsForSite(fullUrl));
+        launchIntent(context, preferencesIntent);
+    }
+
+    /**
+     * Show the single category settings page for given category and type.
+     */
+    public static void showCategorySettings(
+            Context context, @SiteSettingsCategory.Type int category) {
+        SettingsLauncher settingsLauncher = new SettingsLauncherImpl();
+        Bundle extras = new Bundle();
+        extras.putString(SingleCategorySettings.EXTRA_CATEGORY,
+                SiteSettingsCategory.preferenceKey(category));
+        extras.putString(SingleCategorySettings.EXTRA_TITLE,
+                context.getResources().getString(ContentSettingsResources.getTitle(
+                        SiteSettingsCategory.contentSettingsType(category))));
+        Intent preferencesIntent = settingsLauncher.createSettingsActivityIntent(
+                context, SingleCategorySettings.class.getName(), extras);
+        launchIntent(context, preferencesIntent);
+    }
+
+    private static void launchIntent(Context context, Intent intent) {
         // Disabling StrictMode to avoid violations (https://crbug.com/819410).
         try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
-            context.startActivity(preferencesIntent);
+            context.startActivity(intent);
         }
     }
 }
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
index cae527c..f844d3ea 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
@@ -271,8 +271,8 @@
                     this, view2.getConnectionRowView(), mWebContents, mDelegate.getVrHandler());
             mPermissionsController = new PageInfoPermissionsController(
                     this, view2.getPermissionsRowView(), mDelegate, mDisplayUrlBuilder.toString());
-            mCookiesController = new PageInfoCookiesController(
-                    this, view2.getCookiesRowView(), viewParams.cookieControlsShown, mFullUrl);
+            mCookiesController = new PageInfoCookiesController(this, view2.getCookiesRowView(),
+                    mDelegate, viewParams.cookieControlsShown, mFullUrl);
         } else {
             mView.showPerformanceInfo(mDelegate.shouldShowPerformanceBadge(mFullUrl));
             mView.showHttpsImageCompressionInfo(mDelegate.isHttpsImageCompressionApplied());
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java
index 3241307..525742d 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java
@@ -200,6 +200,11 @@
     public abstract void showSiteSettings(String url);
 
     /**
+     * Show cookie settings.
+     */
+    public abstract void showCookieSettings();
+
+    /**
      * Creates Cookie Controls Bridge.
      * @param observer The CookieControlsObserver to create the bridge with.
      * @return the object that facilitates interfacing with native code.
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java
index a8bbcda1..888a760 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java
@@ -25,6 +25,7 @@
     private PageInfoMainPageController mMainController;
     private PageInfoRowView mRowView;
     private CookieControlsBridge mBridge;
+    private PageInfoControllerDelegate mDelegate;
     private String mFullUrl;
     private String mTitle;
     private PageInfoCookiesPreference mSubPage;
@@ -35,9 +36,11 @@
     private boolean mIsEnforced;
 
     public PageInfoCookiesController(PageInfoMainPageController mainController,
-            PageInfoRowView rowView, boolean isVisible, String fullUrl) {
+            PageInfoRowView rowView, PageInfoControllerDelegate delegate, boolean isVisible,
+            String fullUrl) {
         mMainController = mainController;
         mRowView = rowView;
+        mDelegate = delegate;
         mFullUrl = fullUrl;
         mTitle = mRowView.getContext().getResources().getString(R.string.cookies_title);
 
@@ -72,6 +75,7 @@
                 new PageInfoCookiesPreference.PageInfoCookiesViewParams();
         params.onCheckedChangedCallback = this::onCheckedChangedCallback;
         params.onClearCallback = this::clearData;
+        params.onCookieSettingsLinkClicked = mDelegate::showCookieSettings;
         mSubPage.setParams(params);
         // TODO(crbug.com/1077766): Get storage size.
         mSubPage.setCookiesCount(mAllowedCookies, mBlockedCookies);
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesPreference.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesPreference.java
index 62ec668..92180b2 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesPreference.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesPreference.java
@@ -36,6 +36,7 @@
         // Called when the toggle controlling third-party cookie blocking changes.
         public Callback<Boolean> onCheckedChangedCallback;
         public Runnable onClearCallback;
+        public Runnable onCookieSettingsLinkClicked;
     }
 
     @Override
@@ -43,9 +44,8 @@
         SettingsUtils.addPreferencesFromResource(this, R.xml.page_info_cookie_preference);
 
         Preference cookieSummary = findPreference(COOKIE_SUMMARY_PREFERENCE);
-        // TODO(crbug.com/1077766): Show cookie settings.
-        NoUnderlineClickableSpan linkSpan =
-                new NoUnderlineClickableSpan(getResources(), view -> {});
+        NoUnderlineClickableSpan linkSpan = new NoUnderlineClickableSpan(
+                getResources(), (view) -> { mParams.onCookieSettingsLinkClicked.run(); });
         cookieSummary.setSummary(
                 SpanApplier.applySpans(getString(R.string.page_info_cookies_description),
                         new SpanApplier.SpanInfo("<link>", "</link>", linkSpan)));
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/PageInfoControllerDelegateImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/PageInfoControllerDelegateImpl.java
index e9ff295..5e3df5ae 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/PageInfoControllerDelegateImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/PageInfoControllerDelegateImpl.java
@@ -11,7 +11,10 @@
 
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.components.browser_ui.site_settings.ContentSettingsResources;
+import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory;
 import org.chromium.components.browser_ui.site_settings.SiteSettingsClient;
+import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.content_settings.CookieControlsBridge;
 import org.chromium.components.content_settings.CookieControlsObserver;
 import org.chromium.components.embedder_support.browser_context.BrowserContextHandle;
@@ -59,6 +62,21 @@
                 mContext, mProfile.getName(), url);
 
         // Disabling StrictMode to avoid violations (https://crbug.com/819410).
+        launchIntent(intent);
+    }
+
+    @Override
+    public void showCookieSettings() {
+        String category = SiteSettingsCategory.preferenceKey(SiteSettingsCategory.Type.COOKIES);
+        String title = mContext.getResources().getString(
+                ContentSettingsResources.getTitle(ContentSettingsType.COOKIES));
+        Intent intent = SiteSettingsIntentHelper.createIntentForSingleCategory(
+                mContext, mProfile.getName(), category, title);
+        launchIntent(intent);
+    }
+
+    private void launchIntent(Intent intent) {
+        // Disabling StrictMode to avoid violations (https://crbug.com/819410).
         try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
             mContext.startActivity(intent);
         }