diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 80ec0e937..15439fd78 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -33,7 +33,6 @@ import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.ThumbnailsFeature import mozilla.components.feature.sitepermissions.SitePermissionsFeature import mozilla.components.feature.sitepermissions.SitePermissionsRules -import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.ASK_TO_ALLOW import mozilla.components.support.base.feature.BackHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.ktx.android.view.enterToImmersiveMode @@ -345,16 +344,10 @@ class BrowserFragment : Fragment(), BackHandler { private fun assignSitePermissionsRules() { val settings = Settings.getInstance(requireContext()) - val recommendedSettings = SitePermissionsRules( - camera = ASK_TO_ALLOW, - notification = ASK_TO_ALLOW, - location = ASK_TO_ALLOW, - microphone = ASK_TO_ALLOW - ) - val rules: SitePermissionsRules? = if (settings.shouldRecommendedSettingsBeActivated) { - recommendedSettings + val rules: SitePermissionsRules = if (settings.shouldRecommendedSettingsBeActivated) { + settings.getSitePermissionsRecommendedSettingsRules() } else { - null + settings.getSitePermissionsCustomSettingsRules() } sitePermissionsFeature.withFeature { it.sitePermissionsRules = rules diff --git a/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt b/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt new file mode 100644 index 000000000..4c9777432 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/Extensions.kt @@ -0,0 +1,20 @@ +/* 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 mozilla.components.feature.sitepermissions.SitePermissionsRules +import org.mozilla.fenix.R + +internal fun SitePermissionsRules.Action.toString(context: Context): String { + return when (this) { + SitePermissionsRules.Action.ASK_TO_ALLOW -> { + context.getString(R.string.preference_option_phone_feature_ask_to_allow) + } + SitePermissionsRules.Action.BLOCKED -> { + context.getString(R.string.preference_option_phone_feature_block) + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt index 3ec9400c8..331614fea 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/RadioButtonPreference.kt @@ -8,9 +8,11 @@ import android.view.View import androidx.preference.PreferenceViewHolder import android.widget.TextView import android.content.Context +import android.content.res.TypedArray import android.text.TextUtils import android.util.AttributeSet import android.widget.RadioButton +import androidx.core.content.res.TypedArrayUtils import androidx.core.text.HtmlCompat import androidx.preference.Preference import org.mozilla.fenix.R @@ -20,19 +22,22 @@ class RadioButtonPreference : Preference { private lateinit var summaryView: TextView private lateinit var radioButton: RadioButton var shouldSummaryBeParsedAsHtmlContent: Boolean = true + private var defaultValue: Boolean = false private var clickListener: (() -> Unit)? = null init { layoutResource = R.layout.preference_widget_radiobutton } - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + val typedArray = context.obtainStyledAttributes( + attrs, androidx.preference.R.styleable.Preference, TypedArrayUtils.getAttr( + context, androidx.preference.R.attr.preferenceStyle, + android.R.attr.preferenceStyle + ), 0 + ) + initDefaultValue(typedArray) + } fun addToRadioGroup(radioPreference: RadioButtonPreference) { radioGroups.add(radioPreference) @@ -67,7 +72,15 @@ class RadioButtonPreference : Preference { private fun bindRadioButton(holder: PreferenceViewHolder) { radioButton = holder.findViewById(R.id.radio_button) as RadioButton - radioButton.isChecked = getPersistedBoolean(false) + radioButton.isChecked = getPersistedBoolean(defaultValue) + } + + private fun initDefaultValue(typedArray: TypedArray) { + if (typedArray.hasValue(androidx.preference.R.styleable.Preference_defaultValue)) { + defaultValue = typedArray.getBoolean(androidx.preference.R.styleable.Preference_defaultValue, false) + } else if (typedArray.hasValue(androidx.preference.R.styleable.Preference_android_defaultValue)) { + defaultValue = typedArray.getBoolean(androidx.preference.R.styleable.Preference_android_defaultValue, false) + } } private fun toggleRadioGroups() { diff --git a/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsFragment.kt index 274ef77f1..dcc6bc1a2 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsFragment.kt @@ -17,6 +17,7 @@ import org.mozilla.fenix.settings.SitePermissionsManagePhoneFeature.PhoneFeature import org.mozilla.fenix.settings.SitePermissionsManagePhoneFeature.PhoneFeature.LOCATION import org.mozilla.fenix.settings.SitePermissionsManagePhoneFeature.PhoneFeature.CAMERA import org.mozilla.fenix.settings.SitePermissionsManagePhoneFeature.PhoneFeature.MICROPHONE +import org.mozilla.fenix.utils.Settings @SuppressWarnings("TooManyFunctions") class SitePermissionsFragment : PreferenceFragmentCompat() { @@ -82,15 +83,35 @@ class SitePermissionsFragment : PreferenceFragmentCompat() { if (isCategoryActivate) { categoryPhoneFeatures.isVisible = true } - initPhoneFeature(CAMERA) - initPhoneFeature(LOCATION) - initPhoneFeature(MICROPHONE) - initPhoneFeature(NOTIFICATION) + + val settings = Settings.getInstance(requireContext()) + + val cameraAction = settings + .getSitePermissionsPhoneFeatureCameraAction() + .toString(requireContext()) + + val locationAction = settings + .getSitePermissionsPhoneFeatureLocation() + .toString(requireContext()) + + val microPhoneAction = settings + .getSitePermissionsPhoneFeatureMicrophoneAction() + .toString(requireContext()) + + val notificationAction = settings + .getSitePermissionsPhoneFeatureNotificationAction() + .toString(requireContext()) + + initPhoneFeature(CAMERA, cameraAction) + initPhoneFeature(LOCATION, locationAction) + initPhoneFeature(MICROPHONE, microPhoneAction) + initPhoneFeature(NOTIFICATION, notificationAction) } - private fun initPhoneFeature(phoneFeature: PhoneFeature) { + private fun initPhoneFeature(phoneFeature: PhoneFeature, summary: String) { val keyPreference = getPreferenceKeyBy(phoneFeature) val cameraPhoneFeatures: Preference = requireNotNull(findPreference(keyPreference)) + cameraPhoneFeatures.summary = summary cameraPhoneFeatures.onPreferenceClickListener = OnPreferenceClickListener { navigateToPhoneFeature(phoneFeature) diff --git a/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsManagePhoneFeature.kt b/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsManagePhoneFeature.kt index e14f37c0c..4a878b360 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsManagePhoneFeature.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SitePermissionsManagePhoneFeature.kt @@ -12,7 +12,8 @@ import android.content.Intent import android.graphics.Color import android.net.Uri import android.os.Bundle -import android.provider.Settings +import android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS +import org.mozilla.fenix.utils.Settings import android.text.SpannableString import android.text.SpannableStringBuilder import android.text.Spanned.SPAN_EXCLUSIVE_INCLUSIVE @@ -29,12 +30,16 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat.FROM_HTML_MODE_COMPACT import androidx.fragment.app.Fragment +import mozilla.components.feature.sitepermissions.SitePermissionsRules +import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.BLOCKED +import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.ASK_TO_ALLOW import mozilla.components.support.ktx.android.content.isPermissionGranted import org.mozilla.fenix.R class SitePermissionsManagePhoneFeature : Fragment() { private lateinit var phoneFeature: PhoneFeature + private lateinit var settings: Settings override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -45,6 +50,7 @@ class SitePermissionsManagePhoneFeature : Fragment() { (activity as AppCompatActivity).title = phoneFeature.label (activity as AppCompatActivity).supportActionBar?.show() + settings = Settings.getInstance(requireContext()) } override fun onCreateView( @@ -55,14 +61,14 @@ class SitePermissionsManagePhoneFeature : Fragment() { val rootView = inflater.inflate(R.layout.fragment_manage_site_permissions_feature_phone, container, false) initAskToAllowRadio(rootView) - + initBlockRadio(rootView) initBockedByAndroidContainer(rootView) return rootView } private fun initAskToAllowRadio(rootView: View) { - val radio = rootView.findViewById(R.id.ask_to_allow_switch) + val radio = rootView.findViewById(R.id.ask_to_allow_radio) val askToAllowText = getString(R.string.preference_option_phone_feature_ask_to_allow) val recommendedText = getString(R.string.phone_feature_recommended) val recommendedTextSize = resources.getDimensionPixelSize(R.dimen.phone_feature_label_recommended_text_size) @@ -87,6 +93,24 @@ class SitePermissionsManagePhoneFeature : Fragment() { append(recommendedSpannable) this } + radio.setOnClickListener { + saveActionInSettings(ASK_TO_ALLOW) + } + radio.restoreState(ASK_TO_ALLOW) + } + + private fun RadioButton.restoreState(action: SitePermissionsRules.Action) { + if (phoneFeature.action == action) { + this.isChecked = true + } + } + + private fun initBlockRadio(rootView: View) { + val radio = rootView.findViewById(R.id.block_radio) + radio.setOnClickListener { + saveActionInSettings(BLOCKED) + } + radio.restoreState(BLOCKED) } private fun initBockedByAndroidContainer(rootView: View) { @@ -141,6 +165,16 @@ class SitePermissionsManagePhoneFeature : Fragment() { } } + private val PhoneFeature.action: SitePermissionsRules.Action + get() { + return when (phoneFeature) { + PhoneFeature.CAMERA -> settings.getSitePermissionsPhoneFeatureCameraAction() + PhoneFeature.LOCATION -> settings.getSitePermissionsPhoneFeatureLocation() + PhoneFeature.MICROPHONE -> settings.getSitePermissionsPhoneFeatureMicrophoneAction() + PhoneFeature.NOTIFICATION -> settings.getSitePermissionsPhoneFeatureNotificationAction() + } + } + private fun initSettingsButton(rootView: View) { val button = rootView.findViewById