Theme switching

This commit is contained in:
2021-02-21 00:31:02 +03:00
parent 06aa41cab1
commit 35c45fd34f
34 changed files with 447 additions and 155 deletions
@@ -0,0 +1,203 @@
package com.meloda.fast.fragment
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen
import com.meloda.fast.R
import com.meloda.fast.activity.DropUserDataActivity
import com.meloda.fast.activity.UpdateActivity
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.common.TaskManager
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.util.AndroidUtils
class SettingsFragment : PreferenceFragmentCompat(),
Preference.OnPreferenceClickListener,
Preference.OnPreferenceChangeListener {
companion object {
const val CATEGORY_GENERAL = "general"
const val KEY_HIDE_KEYBOARD_ON_SCROLL_UP = "hide_keyboard_on_scroll_up"
const val CATEGORY_APPEARANCE = "appearance"
const val KEY_EXTENDED_CONVERSATIONS = "appearance_extended_conversations"
const val KEY_THEME = "appearance_theme"
const val CATEGORY_ABOUT = "about"
const val KEY_APP_VERSION = "app_version"
const val CATEGORY_ACCOUNT = "account"
const val KEY_ACCOUNT_LOGOUT = "account_logout"
const val CATEGORY_DEBUG = "debug"
const val KEY_CLEAR_USERS_GROUPS_CACHE = "clear_users_groups_cache"
}
private var currentPreferenceLayout = 0
private var isRestoringState = false
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.fragment_settings, rootKey)
currentPreferenceLayout = R.xml.fragment_settings
init()
}
private fun init() {
setTitle()
setPreferencesFromResource(currentPreferenceLayout, null)
val general = findPreference<Preference>(CATEGORY_GENERAL)
general?.onPreferenceClickListener = rootLayoutClickListener
val account = findPreference<Preference>(CATEGORY_ACCOUNT)
account?.onPreferenceClickListener = rootLayoutClickListener
val logout = findPreference<Preference>(KEY_ACCOUNT_LOGOUT)
logout?.onPreferenceClickListener = this
val about = findPreference<Preference>(CATEGORY_ABOUT)
about?.onPreferenceClickListener = rootLayoutClickListener
val appVersion = findPreference<Preference>(KEY_APP_VERSION)
appVersion?.onPreferenceClickListener = this
val appearance = findPreference<Preference>(CATEGORY_APPEARANCE)
appearance?.onPreferenceClickListener = rootLayoutClickListener
val extendedConversations = findPreference<Preference>(KEY_EXTENDED_CONVERSATIONS)
extendedConversations?.onPreferenceChangeListener = this
val theme = findPreference<Preference>(KEY_THEME)
theme?.onPreferenceChangeListener = this
val debug = findPreference<Preference>(CATEGORY_DEBUG)
debug?.onPreferenceClickListener = rootLayoutClickListener
updateDebugCategoryVisibility()
val clearUsersGroupsCache = findPreference<Preference>(KEY_CLEAR_USERS_GROUPS_CACHE)
clearUsersGroupsCache?.onPreferenceClickListener = this
applyTintInPreferenceScreen(preferenceScreen)
}
override fun onResume() {
super.onResume()
updateDebugCategoryVisibility()
}
private fun updateDebugCategoryVisibility() {
findPreference<Preference>(CATEGORY_DEBUG)?.isVisible =
AndroidUtils.isDeveloperSettingsEnabled(requireContext())
}
private val rootLayoutClickListener =
Preference.OnPreferenceClickListener { changeRootLayout(it) }
private fun setTitle() {
var title = R.string.navigation_settings
when (currentPreferenceLayout) {
R.xml.fragment_settings_general -> title = R.string.prefs_general
R.xml.fragment_settings_appearance -> title = R.string.prefs_appearance
R.xml.fragment_settings_about -> title = R.string.prefs_about
R.xml.fragment_settings_account -> title = R.string.prefs_account
}
requireActivity().setTitle(title)
}
private fun changeRootLayout(preference: Preference): Boolean {
currentPreferenceLayout = when (preference.key) {
CATEGORY_GENERAL -> R.xml.fragment_settings_general
CATEGORY_ABOUT -> R.xml.fragment_settings_about
CATEGORY_ACCOUNT -> R.xml.fragment_settings_account
CATEGORY_APPEARANCE -> R.xml.fragment_settings_appearance
CATEGORY_DEBUG -> R.xml.fragment_settings_debug
else -> R.xml.fragment_settings
}
init()
return true
}
private fun applyTintInPreferenceScreen(rootScreen: PreferenceScreen) {
if (rootScreen.preferenceCount > 0) {
for (i in 0 until rootScreen.preferenceCount) {
val preference = rootScreen.getPreference(i)
tintPreference(preference)
}
}
}
private fun tintPreference(preference: Preference) {
if (preference.icon != null && context != null) {
preference.icon.setTint(requireContext().color(R.color.accent))
}
}
override fun onPreferenceClick(preference: Preference): Boolean {
when (preference.key) {
KEY_ACCOUNT_LOGOUT -> {
logout()
return true
}
KEY_APP_VERSION -> {
openUpdateScreen()
return true
}
KEY_CLEAR_USERS_GROUPS_CACHE -> {
showClearCacheConfirmation()
}
}
return false
}
private fun showClearCacheConfirmation() {
val builder = AlertDialog.Builder(requireContext())
builder.setMessage("Clear cache?")
builder.setPositiveButton("Yes") { _, _ ->
TaskManager.execute {
AppGlobal.database.users.clear()
AppGlobal.database.groups.clear()
}
}
builder.setNegativeButton("No", null)
builder.show()
}
private fun openUpdateScreen() {
startActivity(Intent(requireContext(), UpdateActivity::class.java))
}
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
when (preference.key) {
KEY_EXTENDED_CONVERSATIONS -> {
return true
}
KEY_THEME -> {
val nightMode = AppGlobal.instance.applyNightMode(newValue as String)
(requireActivity() as AppCompatActivity).delegate.localNightMode = nightMode
return true
}
}
return false
}
fun onBackPressed() = if (currentPreferenceLayout == R.xml.fragment_settings) {
true
} else {
currentPreferenceLayout = R.xml.fragment_settings
init()
false
}
private fun logout() {
startActivity(Intent(requireContext(), DropUserDataActivity::class.java))
}
}