chromium/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/RWSCookieSettings.java

// Copyright 2022 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.browser_ui.site_settings;

import static org.chromium.components.content_settings.PrefNames.COOKIE_CONTROLS_MODE;

import android.os.Bundle;

import androidx.preference.Preference;

import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
import org.chromium.components.browser_ui.settings.SettingsPage;
import org.chromium.components.browser_ui.settings.SettingsUtils;
import org.chromium.components.browser_ui.settings.TextMessagePreference;
import org.chromium.components.content_settings.CookieControlsMode;
import org.chromium.components.prefs.PrefService;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.BrowserContextHandle;

/** Related Website Sets preference page. It's a TriStateCookieSettingsPreference subpage. */
public class RWSCookieSettings extends BaseSiteSettingsFragment
        implements SettingsPage, Preference.OnPreferenceChangeListener {
    public static final String ALLOW_RWS_COOKIE_PREFERENCE = "allow_rws";
    public static final String SUBTITLE = "subtitle";
    public static final String BULLET_TWO = "bullet_two";

    public static final String EXTRA_COOKIE_PAGE_STATE = "cookie_page_state";

    // UI Elements.
    private ChromeSwitchPreference mAllowRWSPreference;
    private TextMessagePreference mSubtitle;
    private TextMessagePreference mBulletTwo;

    private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();

    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        SettingsUtils.addPreferencesFromResource(this, R.xml.rws_cookie_settings);

        mPageTitle.set(getContext().getString(R.string.cookies_title));
        mSubtitle = (TextMessagePreference) findPreference(SUBTITLE);
        mBulletTwo = (TextMessagePreference) findPreference(BULLET_TWO);
        mAllowRWSPreference = (ChromeSwitchPreference) findPreference(ALLOW_RWS_COOKIE_PREFERENCE);

        @CookieControlsMode
        int pageState = getArguments().getInt(RWSCookieSettings.EXTRA_COOKIE_PAGE_STATE);

        if (pageState == CookieControlsMode.BLOCK_THIRD_PARTY) {
            setupAllowRWSPreference();
            mSubtitle.setTitle(
                    R.string.website_settings_category_cookie_block_third_party_subtitle);
            mBulletTwo.setSummary(R.string.website_settings_category_cookie_subpage_bullet_two);
            mAllowRWSPreference.setVisible(true);
        } else if (pageState == CookieControlsMode.INCOGNITO_ONLY) {
            mSubtitle.setTitle(
                    R.string.website_settings_category_cookie_block_third_party_incognito_subtitle);
            mBulletTwo.setSummary(
                    R.string.website_settings_category_cookie_subpage_incognito_bullet_two);
            mAllowRWSPreference.setVisible(false);
        } else {
            assert false
                    : "Unexpected cookies subpage state: "
                            + pageState
                            + "."
                            + "Cookies subpage state must be either "
                            + CookieControlsMode.BLOCK_THIRD_PARTY
                            + " or "
                            + CookieControlsMode.INCOGNITO_ONLY;
        }
    }

    @Override
    public ObservableSupplier<String> getPageTitle() {
        return mPageTitle;
    }

    private void setupAllowRWSPreference() {
        var mManagedPreferenceDelegate =
                new RWSCookieSettingsManagedPreferenceDelegate(
                        getSiteSettingsDelegate().getManagedPreferenceDelegate());
        mAllowRWSPreference.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
        mAllowRWSPreference.setChecked(
                getSiteSettingsDelegate().isRelatedWebsiteSetsDataAccessEnabled());

        if (!isBlockThirdPartyCookieSelected()) {
            mAllowRWSPreference.setEnabled(false);
        }
        mAllowRWSPreference.setOnPreferenceChangeListener(this);
    }

    private boolean isBlockThirdPartyCookieSelected() {
        BrowserContextHandle context = getSiteSettingsDelegate().getBrowserContextHandle();
        PrefService prefService = UserPrefs.get(context);
        return prefService.getInteger(COOKIE_CONTROLS_MODE) == CookieControlsMode.BLOCK_THIRD_PARTY;
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        String key = preference.getKey();
        if (ALLOW_RWS_COOKIE_PREFERENCE.equals(key)) {
            getSiteSettingsDelegate().setRelatedWebsiteSetsDataAccessEnabled((boolean) newValue);
        } else {
            assert false : "Should not be reached";
        }
        return true;
    }

    private class RWSCookieSettingsManagedPreferenceDelegate
            extends ForwardingManagedPreferenceDelegate {
        RWSCookieSettingsManagedPreferenceDelegate(ManagedPreferenceDelegate base) {
            super(base);
        }

        @Override
        public boolean isPreferenceControlledByPolicy(Preference preference) {
            String key = preference.getKey();
            if (ALLOW_RWS_COOKIE_PREFERENCE.equals(key)) {
                return getSiteSettingsDelegate().isRelatedWebsiteSetsDataAccessManaged();
            } else {
                assert false : "Should not be reached";
            }
            return false;
        }
    }
}