diff --git a/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt index 8719769fc..c42b61fa7 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/DataChoicesFragment.kt @@ -4,7 +4,6 @@ package org.mozilla.fenix.settings -import android.content.SharedPreferences import android.os.Bundle import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference @@ -20,23 +19,18 @@ import org.mozilla.fenix.ext.showToolbar */ class DataChoicesFragment : PreferenceFragmentCompat() { - private val preferenceChangeListener = - SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> - when (key) { - getPreferenceKey(R.string.pref_key_telemetry) -> { - if (sharedPreferences.getBoolean(key, requireContext().settings().isTelemetryEnabled)) { - context?.components?.analytics?.metrics?.start() - } else { - context?.components?.analytics?.metrics?.stop() - } - } - } - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - context?.let { - preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener) + + val context = requireContext() + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) { sharedPreferences, key -> + if (key == getPreferenceKey(R.string.pref_key_telemetry)) { + if (sharedPreferences.getBoolean(key, context.settings().isTelemetryEnabled)) { + context.components.analytics.metrics.start() + } else { + context.components.analytics.metrics.stop() + } + } } } @@ -45,13 +39,6 @@ class DataChoicesFragment : PreferenceFragmentCompat() { showToolbar(getString(R.string.preferences_data_collection)) } - override fun onDestroy() { - context?.let { - preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener) - } - super.onDestroy() - } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.data_choices_preferences, rootKey) diff --git a/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserSettingsFragment.kt index 7d0180c5b..993f535f1 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/DefaultBrowserSettingsFragment.kt @@ -5,7 +5,6 @@ package org.mozilla.fenix.settings import android.content.Intent -import android.content.SharedPreferences import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Bundle @@ -17,7 +16,6 @@ import mozilla.components.support.utils.Browsers import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R -import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar @@ -27,30 +25,8 @@ import org.mozilla.fenix.ext.showToolbar */ class DefaultBrowserSettingsFragment : PreferenceFragmentCompat() { - private val preferenceChangeListener = - SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> - when (key) { - getPreferenceKey(R.string.pref_key_telemetry) -> { - if (sharedPreferences.getBoolean( - key, - requireContext().settings().isTelemetryEnabled - ) - ) { - context?.components?.analytics?.metrics?.start() - } else { - context?.components?.analytics?.metrics?.stop() - } - } - } - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - context?.let { - preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener( - preferenceChangeListener - ) - } val makeDefaultBrowserKey = getPreferenceKey(R.string.pref_key_make_default_browser) val preferenceMakeDefaultBrowser = findPreference(makeDefaultBrowserKey) @@ -66,15 +42,6 @@ class DefaultBrowserSettingsFragment : PreferenceFragmentCompat() { updatePreferences() } - override fun onDestroy() { - context?.let { - preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener( - preferenceChangeListener - ) - } - super.onDestroy() - } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.default_browser_preferences, rootKey) updatePreferences() @@ -94,9 +61,7 @@ class DefaultBrowserSettingsFragment : PreferenceFragmentCompat() { private fun getClickListenerForMakeDefaultBrowser(): Preference.OnPreferenceClickListener { return if (SDK_INT >= Build.VERSION_CODES.N) { Preference.OnPreferenceClickListener { - val intent = Intent( - ACTION_MANAGE_DEFAULT_APPS_SETTINGS - ) + val intent = Intent(ACTION_MANAGE_DEFAULT_APPS_SETTINGS) startActivity(intent) true } @@ -104,7 +69,7 @@ class DefaultBrowserSettingsFragment : PreferenceFragmentCompat() { Preference.OnPreferenceClickListener { (activity as HomeActivity).openToBrowserAndLoad( searchTermOrURL = SupportUtils.getSumoURLForTopic( - context!!, + requireContext(), SupportUtils.SumoTopic.SET_AS_DEFAULT_BROWSER ), newTab = true, diff --git a/app/src/main/java/org/mozilla/fenix/settings/OnSharedPreferenceChangeListener.kt b/app/src/main/java/org/mozilla/fenix/settings/OnSharedPreferenceChangeListener.kt new file mode 100644 index 000000000..b0e689710 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/OnSharedPreferenceChangeListener.kt @@ -0,0 +1,39 @@ +/* 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.SharedPreferences +import androidx.lifecycle.Lifecycle.Event.ON_CREATE +import androidx.lifecycle.Lifecycle.Event.ON_DESTROY +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.OnLifecycleEvent + +class OnSharedPreferenceChangeListener( + private val sharedPreferences: SharedPreferences, + private val listener: (SharedPreferences, String) -> Unit +) : SharedPreferences.OnSharedPreferenceChangeListener, LifecycleObserver { + + @OnLifecycleEvent(ON_CREATE) + fun onCreate() { + sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + @OnLifecycleEvent(ON_DESTROY) + fun onDestroy() { + sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + listener(sharedPreferences, key) + } +} + +fun SharedPreferences.registerOnSharedPreferenceChangeListener( + owner: LifecycleOwner, + listener: (SharedPreferences, String) -> Unit +) { + owner.lifecycle.addObserver(OnSharedPreferenceChangeListener(this, listener)) +} diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 1439db2bf..512d2ebcf 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -7,12 +7,11 @@ package org.mozilla.fenix.settings import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent -import android.content.SharedPreferences import android.net.Uri import android.os.Bundle import androidx.lifecycle.lifecycleScope import androidx.navigation.NavDirections -import androidx.navigation.Navigation +import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.Preference.OnPreferenceClickListener @@ -65,30 +64,32 @@ import org.mozilla.fenix.settings.account.AccountAuthErrorPreference import org.mozilla.fenix.settings.account.AccountPreference import org.mozilla.fenix.utils.ItsNotBrokenSnack -@SuppressWarnings("TooManyFunctions", "LargeClass") -class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { - private val preferenceChangeListener = - SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> - try { - context?.let { - it.components.analytics.metrics.track( - Event.PreferenceToggled - (key, sharedPreferences.getBoolean(key, false), it) - ) - } - } catch (e: IllegalArgumentException) { - // The event is not tracked - } catch (e: ClassCastException) { - // The setting is not a boolean, not tracked +@Suppress("LargeClass") +class SettingsFragment : PreferenceFragmentCompat() { + + private val accountObserver = object : AccountObserver { + private fun updateAccountUi(profile: Profile? = null) { + val context = context ?: return + lifecycleScope.launch { + updateAccountUIState( + context = context, + profile = profile ?: context.components.backgroundServices.accountManager.accountProfile() + ) } } + override fun onAuthenticated(account: OAuthAccount, authType: AuthType) = updateAccountUi() + override fun onLoggedOut() = updateAccountUi() + override fun onProfileUpdated(profile: Profile) = updateAccountUi(profile) + override fun onAuthenticationProblems() = updateAccountUi() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Observe account changes to keep the UI up-to-date. requireComponents.backgroundServices.accountManager.register( - this, + accountObserver, owner = this, autoPause = true ) @@ -102,9 +103,20 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { requireComponents.backgroundServices.accountManager.accountProfile() ) - preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener( - preferenceChangeListener - ) + preferenceManager.sharedPreferences + .registerOnSharedPreferenceChangeListener(this) { sharedPreferences, key -> + try { + context?.let { context -> + context.components.analytics.metrics.track( + Event.PreferenceToggled(key, sharedPreferences.getBoolean(key, false), context) + ) + } + } catch (e: IllegalArgumentException) { + // The event is not tracked + } catch (e: ClassCastException) { + // The setting is not a boolean, not tracked + } + } } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -178,33 +190,35 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { @Suppress("ComplexMethod", "LongMethod") override fun onPreferenceTreeClick(preference: Preference): Boolean { - when (preference.key) { + val directions: NavDirections? = when (preference.key) { resources.getString(pref_key_search_settings) -> { - navigateToSearchEngineSettings() + SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment() } resources.getString(pref_key_tracking_protection_settings) -> { requireContext().metrics.track(Event.TrackingProtectionSettings) - navigateToTrackingProtectionSettings() + SettingsFragmentDirections.actionSettingsFragmentToTrackingProtectionFragment() } resources.getString(pref_key_site_permissions) -> { - navigateToSitePermissions() + SettingsFragmentDirections.actionSettingsFragmentToSitePermissionsFragment() } resources.getString(pref_key_add_private_browsing_shortcut) -> { requireContext().metrics.track(Event.PrivateBrowsingCreateShortcut) PrivateShortcutCreateManager.createPrivateShortcut(requireContext()) + null } resources.getString(pref_key_accessibility) -> { - navigateToAccessibility() + SettingsFragmentDirections.actionSettingsFragmentToAccessibilityFragment() } resources.getString(pref_key_language) -> { // TODO #220 - ItsNotBrokenSnack(context!!).showSnackbar(issueNumber = "220") + ItsNotBrokenSnack(requireContext()).showSnackbar(issueNumber = "220") + null } resources.getString(pref_key_make_default_browser) -> { - navigateToDefaultBrowserSettingsFragment() + SettingsFragmentDirections.actionSettingsFragmentToDefaultBrowserSettingsFragment() } resources.getString(pref_key_data_choices) -> { - navigateToDataChoices() + SettingsFragmentDirections.actionSettingsFragmentToDataChoicesFragment() } resources.getString(pref_key_help) -> { (activity as HomeActivity).openToBrowserAndLoad( @@ -215,6 +229,7 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { newTab = true, from = BrowserDirection.FromSettings ) + null } resources.getString(pref_key_rate) -> { try { @@ -228,60 +243,55 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { from = BrowserDirection.FromSettings ) } + null } resources.getString(pref_key_passwords) -> { - navigateToLoginsSettingsFragment() + SettingsFragmentDirections.actionSettingsFragmentToLoginsFragment() } resources.getString(pref_key_about) -> { - navigateToAbout() + SettingsFragmentDirections.actionSettingsFragmentToAboutFragment() } resources.getString(pref_key_account) -> { - navigateToAccountSettings() + SettingsFragmentDirections.actionSettingsFragmentToAccountSettingsFragment() } resources.getString(pref_key_account_auth_error) -> { - navigateToAccountProblem() + SettingsFragmentDirections.actionSettingsFragmentToAccountProblemFragment() } resources.getString(pref_key_delete_browsing_data) -> { - navigateToDeleteBrowsingData() + SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataFragment() } resources.getString(pref_key_delete_browsing_data_on_quit_preference) -> { - navigateToDeleteBrowsingDataOnQuit() + SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataOnQuitFragment() } resources.getString(pref_key_theme) -> { - navigateToThemeSettings() + SettingsFragmentDirections.actionSettingsFragmentToThemeFragment() } resources.getString(pref_key_toolbar) -> { - navigateToToolbarSettings() + SettingsFragmentDirections.actionSettingsFragmentToToolbarSettingsFragment() } resources.getString(pref_key_privacy_link) -> { - requireContext().let { context -> - val intent = SupportUtils.createCustomTabIntent( - context, - SupportUtils.getPrivacyNoticeUrl() - ) - startActivity(intent) - } + val intent = SupportUtils.createCustomTabIntent( + requireContext(), + SupportUtils.getPrivacyNoticeUrl() + ) + startActivity(intent) + null } resources.getString(pref_key_your_rights) -> { - requireContext().let { context -> - val intent = SupportUtils.createCustomTabIntent( - context, - SupportUtils.getSumoURLForTopic(context, SupportUtils.SumoTopic.YOUR_RIGHTS) - ) - startActivity(intent) - } + val context = requireContext() + val intent = SupportUtils.createCustomTabIntent( + context, + SupportUtils.getSumoURLForTopic(context, SupportUtils.SumoTopic.YOUR_RIGHTS) + ) + startActivity(intent) + null } + else -> null } + directions?.let { navigateFromSettings(directions) } return super.onPreferenceTreeClick(preference) } - override fun onDestroy() { - super.onDestroy() - preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener( - preferenceChangeListener - ) - } - private fun getClickListenerForSignIn(): OnPreferenceClickListener { return OnPreferenceClickListener { context!!.components.services.launchPairingSignIn(context!!, findNavController()) @@ -313,132 +323,13 @@ class SettingsFragment : PreferenceFragmentCompat(), AccountObserver { } private fun navigateFromSettings(directions: NavDirections) { - view?.let { - val navController = Navigation.findNavController(it) + view?.findNavController()?.let { navController -> if (navController.currentDestination?.id == R.id.settingsFragment) { navController.navigate(directions) } } } - private fun navigateToLoginsSettingsFragment() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToLoginsFragment() - navigateFromSettings(directions) - } - - private fun navigateToSearchEngineSettings() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment() - navigateFromSettings(directions) - } - - private fun navigateToTrackingProtectionSettings() { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToTrackingProtectionFragment() - navigateFromSettings(directions) - } - - private fun navigateToThemeSettings() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToThemeFragment() - navigateFromSettings(directions) - } - - private fun navigateToToolbarSettings() { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToToolbarSettingsFragment() - navigateFromSettings(directions) - } - - private fun navigateToSitePermissions() { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToSitePermissionsFragment() - navigateFromSettings(directions) - } - - private fun navigateToAccessibility() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToAccessibilityFragment() - navigateFromSettings(directions) - } - - private fun navigateToDefaultBrowserSettingsFragment() { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToDefaultBrowserSettingsFragment() - navigateFromSettings(directions) - } - - private fun navigateToDataChoices() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToDataChoicesFragment() - navigateFromSettings(directions) - } - - private fun navigateToAbout() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToAboutFragment() - navigateFromSettings(directions) - } - - private fun navigateToAccountProblem() { - val directions = SettingsFragmentDirections.actionSettingsFragmentToAccountProblemFragment() - navigateFromSettings(directions) - } - - private fun navigateToAccountSettings() { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToAccountSettingsFragment() - navigateFromSettings(directions) - } - - private fun navigateToDeleteBrowsingData() { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataFragment() - navigateFromSettings(directions) - } - - private fun navigateToDeleteBrowsingDataOnQuit() { - val directions = - SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataOnQuitFragment() - navigateFromSettings(directions) - } - - override fun onAuthenticated(account: OAuthAccount, authType: AuthType) { - lifecycleScope.launch { - context?.let { - updateAccountUIState( - it, - it.components.backgroundServices.accountManager.accountProfile() - ) - } - } - } - - override fun onLoggedOut() { - lifecycleScope.launch { - context?.let { - updateAccountUIState( - it, - it.components.backgroundServices.accountManager.accountProfile() - ) - } - } - } - - override fun onProfileUpdated(profile: Profile) { - lifecycleScope.launch { - context?.let { - updateAccountUIState(it, profile) - } - } - } - - override fun onAuthenticationProblems() { - lifecycleScope.launch { - context?.let { - updateAccountUIState( - it, - it.components.backgroundServices.accountManager.accountProfile() - ) - } - } - } - /** * Updates the UI to reflect current account state. * Possible conditions are logged-in without problems, logged-out, and logged-in but needs to re-authenticate. diff --git a/app/src/main/java/org/mozilla/fenix/settings/ToolbarSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/ToolbarSettingsFragment.kt index 75447a8b9..cc155f929 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/ToolbarSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/ToolbarSettingsFragment.kt @@ -5,16 +5,17 @@ package org.mozilla.fenix.settings import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import androidx.preference.PreferenceFragmentCompat import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey +import org.mozilla.fenix.ext.showToolbar +/** + * Settings to adjust the position of the browser toolbar. + */ class ToolbarSettingsFragment : PreferenceFragmentCompat() { - private lateinit var topPreference: RadioButtonPreference - private lateinit var bottomPreference: RadioButtonPreference override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.toolbar_preferences, rootKey) @@ -22,16 +23,14 @@ class ToolbarSettingsFragment : PreferenceFragmentCompat() { override fun onResume() { super.onResume() - (activity as AppCompatActivity).title = getString(R.string.preferences_toolbar) - (activity as AppCompatActivity).supportActionBar?.show() + showToolbar(getString(R.string.preferences_toolbar)) - setupClickListeners() - setupRadioGroups() + setupPreferences() } - private fun setupClickListeners() { + private fun setupPreferences() { val keyToolbarTop = getPreferenceKey(R.string.pref_key_toolbar_top) - topPreference = requireNotNull(findPreference(keyToolbarTop)) + val topPreference = requireNotNull(findPreference(keyToolbarTop)) topPreference.onClickListener { requireContext().components.analytics.metrics.track(Event.ToolbarPositionChanged( Event.ToolbarPositionChanged.Position.TOP @@ -39,15 +38,13 @@ class ToolbarSettingsFragment : PreferenceFragmentCompat() { } val keyToolbarBottom = getPreferenceKey(R.string.pref_key_toolbar_bottom) - bottomPreference = requireNotNull(findPreference(keyToolbarBottom)) + val bottomPreference = requireNotNull(findPreference(keyToolbarBottom)) bottomPreference.onClickListener { requireContext().components.analytics.metrics.track(Event.ToolbarPositionChanged( Event.ToolbarPositionChanged.Position.BOTTOM )) } - } - private fun setupRadioGroups() { topPreference.addToRadioGroup(bottomPreference) bottomPreference.addToRadioGroup(topPreference) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt index 747a5c5c3..aa3a0dff4 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/EditCustomSearchEngineFragment.kt @@ -6,15 +6,13 @@ package org.mozilla.fenix.settings.search import android.net.Uri import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs import kotlinx.android.synthetic.main.custom_search_engine.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main @@ -26,12 +24,13 @@ import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.searchengine.CustomSearchEngineStore import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.settings.SupportUtils import java.util.Locale class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_engine) { private val engineIdentifier: String by lazy { - navArgs().value.searchEngineIdentifier + EditCustomSearchEngineFragmentArgs.fromBundle(requireArguments()).searchEngineIdentifier } private lateinit var searchEngine: SearchEngine @@ -68,8 +67,7 @@ class EditCustomSearchEngineFragment : Fragment(R.layout.fragment_add_search_eng override fun onResume() { super.onResume() - (activity as AppCompatActivity).title = getString(R.string.search_engine_edit_custom_search_engine_title) - (activity as AppCompatActivity).supportActionBar?.show() + showToolbar(getString(R.string.search_engine_edit_custom_search_engine_title)) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { diff --git a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt index 6c7209b05..05c493279 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsDetailsExceptionsFragment.kt @@ -8,12 +8,13 @@ import android.content.DialogInterface import android.os.Bundle import androidx.appcompat.app.AlertDialog import androidx.lifecycle.lifecycleScope -import androidx.navigation.Navigation +import androidx.navigation.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import mozilla.components.feature.sitepermissions.SitePermissions import org.mozilla.fenix.R import org.mozilla.fenix.ext.components @@ -47,28 +48,22 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { val context = requireContext() sitePermissions = requireNotNull(context.components.core.permissionStorage.findSitePermissionsBy(sitePermissions.origin)) - launch(Main) { + withContext(Main) { bindCategoryPhoneFeatures() } } } private fun bindCategoryPhoneFeatures() { - val context = requireContext() - - val cameraAction = CAMERA.getActionLabel(context, sitePermissions) - val locationAction = LOCATION.getActionLabel(context, sitePermissions) - val microphoneAction = MICROPHONE.getActionLabel(context, sitePermissions) - val notificationAction = NOTIFICATION.getActionLabel(context, sitePermissions) - - initPhoneFeature(CAMERA, cameraAction) - initPhoneFeature(LOCATION, locationAction) - initPhoneFeature(MICROPHONE, microphoneAction) - initPhoneFeature(NOTIFICATION, notificationAction) + initPhoneFeature(CAMERA) + initPhoneFeature(LOCATION) + initPhoneFeature(MICROPHONE) + initPhoneFeature(NOTIFICATION) bindClearPermissionsButton() } - private fun initPhoneFeature(phoneFeature: PhoneFeature, summary: String) { + private fun initPhoneFeature(phoneFeature: PhoneFeature) { + val summary = phoneFeature.getActionLabel(requireContext(), sitePermissions) val keyPreference = phoneFeature.getPreferenceKey(requireContext()) val cameraPhoneFeatures: Preference = requireNotNull(findPreference(keyPreference)) cameraPhoneFeatures.summary = summary @@ -103,8 +98,8 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { private fun clearSitePermissions() { lifecycleScope.launch(IO) { requireContext().components.core.permissionStorage.deleteSitePermissions(sitePermissions) - launch(Main) { - Navigation.findNavController(requireNotNull(view)).popBackStack() + withContext(Main) { + requireView().findNavController().popBackStack() } } } @@ -115,6 +110,6 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() { phoneFeatureId = phoneFeature.id, sitePermissions = sitePermissions ) - Navigation.findNavController(view!!).navigate(directions) + requireView().findNavController().navigate(directions) } }