diff --git a/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt b/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt index 302ae0828..2ca133cf2 100644 --- a/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt +++ b/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt @@ -28,6 +28,7 @@ enum class BrowserDirection(@IdRes val fragmentId: Int) { FromAbout(R.id.aboutFragment), FromTrackingProtection(R.id.trackingProtectionFragment), FromHttpsOnlyMode(R.id.httpsOnlyFragment), + FromCookieBanner(R.id.cookieBannerFragment), FromTrackingProtectionDialog(R.id.trackingProtectionPanelDialogFragment), FromSavedLoginsFragment(R.id.savedLoginsFragment), FromAddNewDeviceFragment(R.id.addNewDeviceFragment), diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 62f4e4043..4c994f077 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -116,6 +116,7 @@ import org.mozilla.fenix.perf.StartupTimeline import org.mozilla.fenix.perf.StartupTypeTelemetry import org.mozilla.fenix.search.SearchDialogFragmentDirections import org.mozilla.fenix.session.PrivateNotificationService +import org.mozilla.fenix.settings.CookieBannersFragmentDirections import org.mozilla.fenix.settings.HttpsOnlyFragmentDirections import org.mozilla.fenix.settings.SettingsFragmentDirections import org.mozilla.fenix.settings.TrackingProtectionFragmentDirections @@ -850,6 +851,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { HistoryMetadataGroupFragmentDirections.actionGlobalBrowser(customTabSessionId) BrowserDirection.FromTrackingProtectionExceptions -> TrackingProtectionExceptionsFragmentDirections.actionGlobalBrowser(customTabSessionId) + BrowserDirection.FromCookieBanner -> + CookieBannersFragmentDirections.actionGlobalBrowser(customTabSessionId) BrowserDirection.FromHttpsOnlyMode -> HttpsOnlyFragmentDirections.actionGlobalBrowser(customTabSessionId) BrowserDirection.FromAbout -> diff --git a/app/src/main/java/org/mozilla/fenix/settings/CookieBannersFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/CookieBannersFragment.kt index 56a0d4988..20f3183f9 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/CookieBannersFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/CookieBannersFragment.kt @@ -7,7 +7,7 @@ package org.mozilla.fenix.settings import android.os.Bundle import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreference +import androidx.preference.SwitchPreferenceCompat import mozilla.components.concept.engine.EngineSession.CookieBannerHandlingMode.DISABLED import mozilla.components.concept.engine.EngineSession.CookieBannerHandlingMode.REJECT_OR_ACCEPT_ALL import mozilla.components.concept.engine.Settings @@ -37,7 +37,7 @@ class CookieBannersFragment : PreferenceFragmentCompat() { } private fun setupPreferences() { - requirePreference(R.string.pref_key_cookie_banner_v1).apply { + requirePreference(R.string.pref_key_cookie_banner_v1).apply { onPreferenceChangeListener = object : SharedPreferenceUpdater() { override fun onPreferenceChange( preference: Preference, diff --git a/app/src/main/java/org/mozilla/fenix/settings/CookieBannersSwitchPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/CookieBannersSwitchPreference.kt new file mode 100644 index 000000000..42bf3e6c1 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/CookieBannersSwitchPreference.kt @@ -0,0 +1,21 @@ +/* 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.mozilla.fenix.settings + +import android.content.Context +import android.util.AttributeSet + +/** + * Cookie banners switch preference with a learn more link. + */ +class CookieBannersSwitchPreference(context: Context, attrs: AttributeSet?) : + LearnMoreSwitchPreference(context, attrs) { + + override fun getLearnMoreUrl(): String { + return SupportUtils.getGenericSumoURLForTopic( + SupportUtils.SumoTopic.COOKIE_BANNER, + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/settings/LearnMoreSwitchPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/LearnMoreSwitchPreference.kt new file mode 100644 index 000000000..9f3e24e0e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/LearnMoreSwitchPreference.kt @@ -0,0 +1,65 @@ +/* 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.mozilla.fenix.settings + +import android.content.Context +import android.util.AttributeSet +import android.widget.TextView +import androidx.core.view.isVisible +import androidx.preference.PreferenceViewHolder +import androidx.preference.SwitchPreferenceCompat +import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.asActivity + +/** + * A [SwitchPreferenceCompat] that include a learn more link. + */ +abstract class LearnMoreSwitchPreference(context: Context, attrs: AttributeSet?) : + SwitchPreferenceCompat(context, attrs) { + + init { + layoutResource = R.layout.preference_switch_learn_more + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + + getDescription()?.let { + val summaryView = holder.findViewById(android.R.id.summary) as TextView + summaryView.text = it + summaryView.isVisible = true + } + + val learnMoreLink = holder.findViewById(R.id.link) as TextView + learnMoreLink.paint?.isUnderlineText = true + learnMoreLink.setOnClickListener { + it.context.asActivity()?.let { activity -> + (activity as HomeActivity).openToBrowserAndLoad( + searchTermOrURL = getLearnMoreUrl(), + newTab = true, + from = BrowserDirection.FromCookieBanner, + ) + } + } + + val backgroundDrawableArray = + context.obtainStyledAttributes(intArrayOf(R.attr.selectableItemBackground)) + val backgroundDrawable = backgroundDrawableArray.getDrawable(0) + backgroundDrawableArray.recycle() + learnMoreLink.background = backgroundDrawable + } + + /** + * Returns the description to be used the UI. + */ + open fun getDescription(): String? = null + + /** + * Returns the URL that should be used when the learn more link is clicked. + */ + abstract fun getLearnMoreUrl(): String +} diff --git a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt index 5d26e9891..3814632f7 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt @@ -54,6 +54,7 @@ object SupportUtils { SMARTBLOCK("smartblock-enhanced-tracking-protection"), SPONSOR_PRIVACY("sponsor-privacy"), HTTPS_ONLY_MODE("https-only-mode-firefox-android"), + COOKIE_BANNER("cookie-banner-reduction-firefox-android"), } enum class MozillaPage(internal val path: String) { diff --git a/app/src/main/res/layout/preference_switch_learn_more.xml b/app/src/main/res/layout/preference_switch_learn_more.xml new file mode 100644 index 000000000..430c4fe97 --- /dev/null +++ b/app/src/main/res/layout/preference_switch_learn_more.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/cookie_banner_preferences.xml b/app/src/main/res/xml/cookie_banner_preferences.xml index ee77bdade..4d0411e21 100644 --- a/app/src/main/res/xml/cookie_banner_preferences.xml +++ b/app/src/main/res/xml/cookie_banner_preferences.xml @@ -2,7 +2,7 @@ - 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/. --> -