Revision control
Copy as Markdown
/* 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
package org.mozilla.focus.settings
import android.content.SharedPreferences
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.Preference
import androidx.preference.PreferenceManager
import org.mozilla.focus.R
import org.mozilla.focus.ext.requireComponents
import org.mozilla.focus.ext.requirePreference
import org.mozilla.focus.ext.showToolbar
import org.mozilla.focus.locale.screen.LanguageStorage.Companion.LOCALE_SYSTEM_DEFAULT
import org.mozilla.focus.locale.screen.LocaleDescriptor
import org.mozilla.focus.state.AppAction
import org.mozilla.focus.state.Screen
import org.mozilla.focus.widget.DefaultBrowserPreference
@Suppress("TooManyFunctions") // code is split into multiple functions with their own purpose.
class GeneralSettingsFragment :
BaseSettingsFragment() {
private lateinit var radioLightTheme: RadioButtonPreference
private lateinit var radioDarkTheme: RadioButtonPreference
private lateinit var radioDefaultTheme: RadioButtonPreference
private lateinit var defaultBrowserPreference: DefaultBrowserPreference
override fun onCreatePreferences(p0: Bundle?, p1: String?) {
addPreferencesFromResource(R.xml.general_settings)
setupPreferences()
}
override fun onResume() {
super.onResume()
defaultBrowserPreference.update()
showToolbar(getString(R.string.preference_category_general))
}
private fun setupPreferences() {
setupDefaultBrowserPreference()
bindLocalePreference()
bindLightTheme()
bindDarkTheme()
bindDefaultTheme()
setupRadioGroups()
}
private fun bindLocalePreference() {
val localePreference: Preference = requirePreference(R.string.pref_key_locale)
localePreference.summary = getLocaleSummary()
localePreference.setOnPreferenceClickListener {
requireComponents.appStore.dispatch(
AppAction.OpenSettings(Screen.Settings.Page.Locale),
)
true
}
}
private fun setupDefaultBrowserPreference() {
defaultBrowserPreference = requirePreference(R.string.pref_key_default_browser)
}
private fun bindLightTheme() {
radioLightTheme = requirePreference(R.string.pref_key_light_theme)
radioLightTheme.onClickListener {
setNewTheme(AppCompatDelegate.MODE_NIGHT_NO)
}
}
private fun bindDarkTheme() {
radioDarkTheme = requirePreference(R.string.pref_key_dark_theme)
radioDarkTheme.onClickListener {
setNewTheme(AppCompatDelegate.MODE_NIGHT_YES)
}
}
private fun bindDefaultTheme() {
radioDefaultTheme = requirePreference(R.string.pref_key_default_theme)
val defaultThemeTitle = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
context?.getString(R.string.preference_follow_device_theme)
} else {
context?.getString(R.string.preference_auto_battery_theme)
}
radioDefaultTheme.apply {
title = defaultThemeTitle
onClickListener {
setDefaultTheme()
}
}
}
private fun getLocaleSummary(): CharSequence? {
val sharedConfig: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
val value: String? =
sharedConfig.getString(
resources.getString(R.string.pref_key_locale),
resources.getString(R.string.preference_language_systemdefault),
)
return value?.let {
if (value.isEmpty() || value == LOCALE_SYSTEM_DEFAULT) {
return resources.getString(R.string.preference_language_systemdefault)
}
LocaleDescriptor(it).getNativeName()
}
}
private fun setupRadioGroups() {
addToRadioGroup(
radioLightTheme,
radioDarkTheme,
radioDefaultTheme,
)
}
private fun setNewTheme(mode: Int) {
if (AppCompatDelegate.getDefaultNightMode() == mode) return
AppCompatDelegate.setDefaultNightMode(mode)
activity?.recreate()
requireComponents.engine.settings.preferredColorScheme = requireComponents.settings.getPreferredColorScheme()
requireComponents.sessionUseCases.reload.invoke()
}
private fun setDefaultTheme() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM,
)
} else {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY,
)
}
}
}