Commit 754e9e09 authored by Robbie McElrath's avatar Robbie McElrath Committed by Commit Bot

[WebLayer] Create a SiteSettingsClient interface.

This interface is used by the Site Settings UI to get embedder-specific
logic, and will be used to abstract Chrome-specific logic so the rest
of the Site Settings UI can be componentized. The Client is set in the
Fragment by SettingsActivity.

As of this CL, only the ManagedPreferenceDelegate is accessible through
this new interface, but other embedder-specific logic will be moved
behind it as well in future CLs.

See go/weblayer-site-settings for more information.

Bug: 1058597
Change-Id: I247cdc14fa6ac7cefd4e1b1d64b275b68ca7889e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2119259
Commit-Queue: Robbie McElrath <rmcelrath@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Reviewed-by: default avatarFinnur Thorarinsson <finnur@chromium.org>
Cr-Commit-Position: refs/heads/master@{#754572}
parent 6b8db919
......@@ -1480,6 +1480,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/site_settings/AddExceptionPreference.java",
"java/src/org/chromium/chrome/browser/site_settings/ChosenObjectInfo.java",
"java/src/org/chromium/chrome/browser/site_settings/ChosenObjectSettings.java",
"java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClient.java",
"java/src/org/chromium/chrome/browser/site_settings/ClearWebsiteStorage.java",
"java/src/org/chromium/chrome/browser/site_settings/ClearWebsiteStorageDialog.java",
"java/src/org/chromium/chrome/browser/site_settings/ContentSetting.java",
......@@ -1487,6 +1488,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/site_settings/ContentSettingsResources.java",
"java/src/org/chromium/chrome/browser/site_settings/CookieControlsBridge.java",
"java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java",
"java/src/org/chromium/chrome/browser/site_settings/ForwardingManagedPreferenceDelegate.java",
"java/src/org/chromium/chrome/browser/site_settings/FourStateCookieSettingsPreference.java",
"java/src/org/chromium/chrome/browser/site_settings/LocalStorageInfo.java",
"java/src/org/chromium/chrome/browser/site_settings/LocationCategory.java",
......@@ -1500,7 +1502,9 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/site_settings/SiteDataCleaner.java",
"java/src/org/chromium/chrome/browser/site_settings/SiteSettings.java",
"java/src/org/chromium/chrome/browser/site_settings/SiteSettingsCategory.java",
"java/src/org/chromium/chrome/browser/site_settings/SiteSettingsClient.java",
"java/src/org/chromium/chrome/browser/site_settings/SiteSettingsPreference.java",
"java/src/org/chromium/chrome/browser/site_settings/SiteSettingsPreferenceFragment.java",
"java/src/org/chromium/chrome/browser/site_settings/StorageInfo.java",
"java/src/org/chromium/chrome/browser/site_settings/TriStateSiteSettingsPreference.java",
"java/src/org/chromium/chrome/browser/site_settings/Website.java",
......
......@@ -31,6 +31,8 @@ import org.chromium.chrome.browser.help.HelpAndFeedback;
import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
import org.chromium.chrome.browser.site_settings.ChromeSiteSettingsClient;
import org.chromium.chrome.browser.site_settings.SiteSettingsPreferenceFragment;
import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.ui.UiUtils;
import org.chromium.ui.util.ColorUtils;
......@@ -260,6 +262,14 @@ public class SettingsActivity extends ChromeBaseAppCompatActivity
}
}
@Override
public void onAttachFragment(Fragment fragment) {
if (fragment instanceof SiteSettingsPreferenceFragment) {
((SiteSettingsPreferenceFragment) fragment)
.setSiteSettingsClient(new ChromeSiteSettingsClient());
}
}
private void ensureActivityNotExported() {
if (sActivityNotExportedChecked) return;
sActivityNotExportedChecked = true;
......
......@@ -17,7 +17,6 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.SearchView;
import androidx.core.view.MenuItemCompat;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
......@@ -25,7 +24,6 @@ import org.chromium.base.annotations.RemovableInRelease;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.help.HelpAndFeedback;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.components.browser_ui.settings.ChromeImageViewPreference;
import org.chromium.components.browser_ui.settings.ManagedPreferencesUtils;
......@@ -37,7 +35,7 @@ import java.util.Locale;
* Shows a particular chosen object (e.g. a USB device) and the list of sites that have been
* granted access to it by the user.
*/
public class ChosenObjectSettings extends PreferenceFragmentCompat {
public class ChosenObjectSettings extends SiteSettingsPreferenceFragment {
public static final String EXTRA_OBJECT_INFOS = "org.chromium.chrome.preferences.object_infos";
public static final String EXTRA_SITES = "org.chromium.chrome.preferences.site_set";
public static final String EXTRA_CATEGORY =
......@@ -287,17 +285,13 @@ public class ChosenObjectSettings extends PreferenceFragmentCompat {
getInfo();
});
preference.setManagedPreferenceDelegate(new ChromeManagedPreferenceDelegate() {
preference.setManagedPreferenceDelegate(new ForwardingManagedPreferenceDelegate(
getSiteSettingsClient().getManagedPreferenceDelegate()) {
@Override
public boolean isPreferenceControlledByPolicy(Preference preference) {
return info.isManaged();
}
@Override
public boolean isPreferenceControlledByCustodian(Preference preference) {
return false;
}
@Override
public boolean isPreferenceClickDisabledByPolicy(Preference preference) {
return false;
......
// Copyright 2020 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.site_settings;
import androidx.preference.Preference;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
/**
* A SiteSettingsClient instance that contains Chrome-specific Site Settings logic.
*/
public class ChromeSiteSettingsClient implements SiteSettingsClient {
private ManagedPreferenceDelegate mManagedPreferenceDelegate;
@Override
public ManagedPreferenceDelegate getManagedPreferenceDelegate() {
if (mManagedPreferenceDelegate == null) {
mManagedPreferenceDelegate = new ChromeManagedPreferenceDelegate() {
@Override
public boolean isPreferenceControlledByPolicy(Preference preference) {
return false;
}
};
}
return mManagedPreferenceDelegate;
}
}
// Copyright 2020 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.site_settings;
import androidx.preference.Preference;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
/**
* A ManagedPreferenceDelegate that forwards all method calls to a base ManagedPreferenceDelegate
* instance.
*
* Methods in this class should be overridden to provide custom behavior. Non-overridden methods
* will forward to the base implementation, which will typically be the embedder-provided
* ManagedPreferenceDelegate instance.
*/
class ForwardingManagedPreferenceDelegate implements ManagedPreferenceDelegate {
private final ManagedPreferenceDelegate mBase;
public ForwardingManagedPreferenceDelegate(ManagedPreferenceDelegate base) {
this.mBase = base;
}
@Override
public boolean isPreferenceControlledByPolicy(Preference preference) {
return mBase.isPreferenceControlledByPolicy(preference);
}
@Override
public boolean isPreferenceControlledByCustodian(Preference preference) {
return mBase.isPreferenceControlledByCustodian(preference);
}
@Override
public boolean doesProfileHaveMultipleCustodians() {
return mBase.doesProfileHaveMultipleCustodians();
}
@Override
public boolean isPreferenceClickDisabledByPolicy(Preference preference) {
return mBase.isPreferenceClickDisabledByPolicy(preference);
}
}
......@@ -26,7 +26,7 @@ settings status to the user:
[SingleWebsiteSettings](https://cs.chromium.org/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettings.java?type=cs&g=0)
class.
All of these implement `PreferenceFragmentCompat` and use a layout xml to define
All of these implement `SiteSettingsPreferenceFragment` and use a layout xml to define
the preferences that form the screens.
## Site Settings
......
......@@ -28,7 +28,6 @@ import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
......@@ -44,13 +43,13 @@ import org.chromium.chrome.browser.help.HelpAndFeedback;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.chrome.browser.site_settings.FourStateCookieSettingsPreference.CookieSettingsState;
import org.chromium.chrome.browser.site_settings.Website.StoredDataClearedCallback;
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.ExpandablePreferenceGroup;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
import org.chromium.components.browser_ui.settings.ManagedPreferencesUtils;
import org.chromium.components.browser_ui.settings.SearchUtils;
import org.chromium.components.browser_ui.settings.SettingsUtils;
......@@ -75,7 +74,7 @@ import java.util.Set;
* the websites with microphone permissions. When the user selects a site, SingleWebsiteSettings
* is launched to allow the user to see or modify the settings for that particular website.
*/
public class SingleCategorySettings extends PreferenceFragmentCompat
public class SingleCategorySettings extends SiteSettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
AddExceptionPreference.SiteAddedCallback, View.OnClickListener,
PreferenceManager.OnPreferenceTreeClickListener {
......@@ -168,7 +167,11 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
/** Called by common settings code to determine if a Preference is managed. */
private class SingleCategoryManagedPreferenceDelegate
implements ChromeManagedPreferenceDelegate {
extends ForwardingManagedPreferenceDelegate {
SingleCategoryManagedPreferenceDelegate(ManagedPreferenceDelegate base) {
super(base);
}
@Override
public boolean isPreferenceControlledByPolicy(Preference preference) {
// TODO(bauerb): Align the ManagedPreferenceDelegate and
......@@ -1053,7 +1056,8 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
}
binaryToggle.setSummaryOff(ContentSettingsResources.getDisabledSummary(contentType));
binaryToggle.setManagedPreferenceDelegate(new SingleCategoryManagedPreferenceDelegate());
binaryToggle.setManagedPreferenceDelegate(new SingleCategoryManagedPreferenceDelegate(
getSiteSettingsClient().getManagedPreferenceDelegate()));
// Set the checked value.
if (mCategory.showSites(SiteSettingsCategory.Type.DEVICE_LOCATION)) {
......@@ -1071,10 +1075,14 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
PrefServiceBridge.getInstance().getBoolean(Pref.BLOCK_THIRD_PARTY_COOKIES));
thirdPartyCookiesPref.setEnabled(
WebsitePreferenceBridge.isCategoryEnabled(ContentSettingsType.COOKIES));
thirdPartyCookiesPref.setManagedPreferenceDelegate(
(ChromeManagedPreferenceDelegate) preference
-> PrefServiceBridge.getInstance().isManagedPreference(
Pref.BLOCK_THIRD_PARTY_COOKIES));
thirdPartyCookiesPref.setManagedPreferenceDelegate(new ForwardingManagedPreferenceDelegate(
getSiteSettingsClient().getManagedPreferenceDelegate()) {
@Override
public boolean isPreferenceControlledByPolicy(Preference preference) {
return PrefServiceBridge.getInstance().isManagedPreference(
Pref.BLOCK_THIRD_PARTY_COOKIES);
}
});
}
private void updateNotificationsSecondaryControls() {
......@@ -1110,8 +1118,9 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
private void showManagedToast() {
if (mCategory.isManagedByCustodian()) {
ManagedPreferencesUtils.showManagedByParentToast(
getActivity(), new SingleCategoryManagedPreferenceDelegate());
ManagedPreferencesUtils.showManagedByParentToast(getActivity(),
new SingleCategoryManagedPreferenceDelegate(
getSiteSettingsClient().getManagedPreferenceDelegate()));
} else {
ManagedPreferencesUtils.showManagedByAdministratorToast(getActivity());
}
......
......@@ -22,7 +22,6 @@ import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
import org.chromium.base.Callback;
......@@ -31,7 +30,6 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate;
import org.chromium.components.browser_ui.settings.ChromeImageViewPreference;
import org.chromium.components.browser_ui.settings.ManagedPreferencesUtils;
import org.chromium.components.browser_ui.settings.SettingsUtils;
......@@ -46,7 +44,7 @@ import java.util.Set;
/**
* Shows the permissions and other settings for a particular website.
*/
public class SingleWebsiteSettings extends PreferenceFragmentCompat
public class SingleWebsiteSettings extends SiteSettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
// SingleWebsiteSettings expects either EXTRA_SITE (a Website) or
// EXTRA_SITE_ADDRESS (a WebsiteAddress) to be present (but not both). If
......@@ -593,21 +591,12 @@ public class SingleWebsiteSettings extends PreferenceFragmentCompat
}
});
preference.setManagedPreferenceDelegate(new ChromeManagedPreferenceDelegate() {
preference.setManagedPreferenceDelegate(new ForwardingManagedPreferenceDelegate(
getSiteSettingsClient().getManagedPreferenceDelegate()) {
@Override
public boolean isPreferenceControlledByPolicy(Preference preference) {
return info.isManaged();
}
@Override
public boolean isPreferenceControlledByCustodian(Preference preference) {
return false;
}
@Override
public boolean isPreferenceClickDisabledByPolicy(Preference preference) {
return info.isManaged();
}
});
if (info.isManaged()) {
......
......@@ -7,7 +7,6 @@ package org.chromium.chrome.browser.site_settings;
import android.os.Bundle;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import org.chromium.base.CommandLine;
import org.chromium.chrome.R;
......@@ -28,7 +27,7 @@ import java.util.List;
* browser-wide.
*/
public class SiteSettings
extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
extends SiteSettingsPreferenceFragment implements Preference.OnPreferenceClickListener {
// The keys for each category shown on the Site Settings page
// are defined in the SiteSettingsCategory.
......
// Copyright 2020 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.site_settings;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
/**
* An interface implemented by the embedder that allows the Site Settings UI to access
* embedder-specific logic.
*/
public interface SiteSettingsClient {
/**
* @return the ManagedPreferenceDelegate instance that should be used when rendering
* Preferences.
*/
ManagedPreferenceDelegate getManagedPreferenceDelegate();
}
// Copyright 2020 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.site_settings;
import androidx.preference.PreferenceFragmentCompat;
/**
* Preference fragment for showing the Site Settings UI.
*/
public abstract class SiteSettingsPreferenceFragment extends PreferenceFragmentCompat {
private SiteSettingsClient mSiteSettingsClient;
/**
* Sets the SiteSettingsClient instance this Fragment should use.
*
* This should be called by the embedding Activity.
*/
public void setSiteSettingsClient(SiteSettingsClient client) {
assert mSiteSettingsClient == null;
mSiteSettingsClient = client;
}
/**
* @return the SiteSettingsClient instance to use when rendering the Site Settings UI.
*/
protected SiteSettingsClient getSiteSettingsClient() {
assert mSiteSettingsClient != null : "SiteSettingsClient not set";
return mSiteSettingsClient;
}
}
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