add day night theme overide

This commit is contained in:
Jonathan Fisher 2020-11-15 19:43:22 +00:00
parent 0f41297cf4
commit 50a13884a5
2 changed files with 104 additions and 31 deletions

View File

@ -1,9 +1,24 @@
package oppen.ariane
import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.PreferenceManager
class Ariane: Application() {
override fun onCreate() {
super.onCreate()
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
when {
prefs.getBoolean("theme_Light", false) -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
prefs.getBoolean("theme_Dark", false) -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
prefs.getBoolean("theme_FollowSystem", true) -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
}
companion object{
const val DEFAULT_HOME_CAPSULE = "gemini://gemini.circumlunar.space/~oppen/index.gmi"
const val GEMINI_USER_SEARCH_BASE = "gemini://gus.guru/search?"

View File

@ -1,10 +1,12 @@
package oppen.ariane.ui.settings
import android.content.SharedPreferences
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.inputmethod.EditorInfo
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat
import androidx.preference.*
import oppen.ariane.Ariane
@ -16,9 +18,13 @@ import javax.net.ssl.SSLSocketFactory
class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
lateinit var prefs: SharedPreferences
lateinit var protocols: Array<String>
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
prefs = preferenceManager.sharedPreferences
val context = preferenceManager.context
val screen = preferenceManager.createPreferenceScreen(context)
@ -35,10 +41,7 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
homePreference.title = "Home Capsule"
homePreference.key = "home_capsule"
val homecapsule = preferenceManager.sharedPreferences.getString(
"home_capsule",
Ariane.DEFAULT_HOME_CAPSULE
)
val homecapsule = preferenceManager.sharedPreferences.getString("home_capsule", Ariane.DEFAULT_HOME_CAPSULE)
homePreference.summary = homecapsule
homePreference.positiveButtonText = getThemedSpan("Update")
@ -54,6 +57,39 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
}
appCategory.addPreference(homePreference)
/**
* Day/Night Theme
*/
val themeCategory = PreferenceCategory(context)
themeCategory.key = "theme_category"
themeCategory.title = "Theme"
appCategory.addPreference(themeCategory)
val themeFollowSystemPreference = SwitchPreferenceCompat(context)
themeFollowSystemPreference.key = "theme_FollowSystem"
themeFollowSystemPreference.title = "System Default"
themeFollowSystemPreference.onPreferenceChangeListener = this
themeCategory.addPreference(themeFollowSystemPreference)
val themeLightPreference = SwitchPreferenceCompat(context)
themeLightPreference.key = "theme_Light"
themeLightPreference.title = "Light"
themeLightPreference.onPreferenceChangeListener = this
themeCategory.addPreference(themeLightPreference)
val themeDarkPreference = SwitchPreferenceCompat(context)
themeDarkPreference.key = "theme_Dark"
themeDarkPreference.title = "Dark"
themeDarkPreference.onPreferenceChangeListener = this
themeCategory.addPreference(themeDarkPreference)
val isThemePrefSet =
prefs.getBoolean("theme_FollowSystem", false) ||
prefs.getBoolean("theme_Light", false) ||
prefs.getBoolean("theme_Dark", false)
if(!isThemePrefSet) themeFollowSystemPreference.isChecked = true
/**
* TLS Settings
*/
@ -91,24 +127,61 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
}
override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean {
if(preference is SwitchPreferenceCompat && newValue is Boolean && newValue == true) {
if(preference == null) return false
if(preference.key.startsWith("tls")){
tlsChangeListener(preference, newValue)
return true
}
if(preference.key.startsWith("theme")){
when(preference.key){
"theme_FollowSystem" -> {
preferenceScreen.findPreference<SwitchPreferenceCompat>("theme_Light")?.isChecked = false
preferenceScreen.findPreference<SwitchPreferenceCompat>("theme_Dark")?.isChecked = false
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
"theme_Light" -> {
preferenceScreen.findPreference<SwitchPreferenceCompat>("theme_FollowSystem")?.isChecked = false
preferenceScreen.findPreference<SwitchPreferenceCompat>("theme_Dark")?.isChecked = false
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
"theme_Dark" -> {
preferenceScreen.findPreference<SwitchPreferenceCompat>("theme_FollowSystem")?.isChecked = false
preferenceScreen.findPreference<SwitchPreferenceCompat>("theme_Light")?.isChecked = false
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
return true
}
return false
}
private fun tlsChangeListener(
preference: Preference?,
newValue: Any?
) {
if (preference is SwitchPreferenceCompat && newValue is Boolean && newValue == true) {
preference.key?.let { key ->
when {
key.startsWith("tls_") -> {
if(key != "tls_Default"){
if (key != "tls_Default") {
val default = preferenceScreen.findPreference<SwitchPreferenceCompat>("tls_Default")
default?.isChecked = false
}
if(key != "tls_All_Supported"){
val default = preferenceScreen.findPreference<SwitchPreferenceCompat>("tls_All_Supported")
default?.isChecked = false
if (key != "tls_All_Supported") {
val all = preferenceScreen.findPreference<SwitchPreferenceCompat>("tls_All_Supported")
all?.isChecked = false
}
protocols.forEach { protocol ->
val tlsSwitchKey = "tls_${protocol.toLowerCase(Locale.getDefault())}"
if (tlsSwitchKey != key) {
val otherTLSSwitch = preferenceScreen.findPreference<SwitchPreferenceCompat>(
tlsSwitchKey
)
val otherTLSSwitch =
preferenceScreen.findPreference<SwitchPreferenceCompat>(
tlsSwitchKey
)
otherTLSSwitch?.isChecked = false
}
}
@ -124,34 +197,19 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
setTLSProtocol(prefTitle)
}
}
return true
}
return false
}
private fun setTLSProtocol(protocol: String){
preferenceManager.sharedPreferences.edit().putString(
"tls_protocol",
protocol
).apply()
}
private fun setTLSProtocol(protocol: String) = preferenceManager.sharedPreferences.edit().putString("tls_protocol", protocol).apply()
/**
* Unfortunately it doesn't look like EditTextPreference supports Day/Night theme
* or else is otherwise broken. Use Spannable to set a suitable text colour for the dialog buttons
* or else is otherwise broken - OR I'M MISSING SOMETHING.
* Use Spannable to set a suitable text colour for the dialog buttons
*/
private fun getThemedSpan(text: String): Spannable{
val textSpan = SpannableString(text)
textSpan.setSpan(
ForegroundColorSpan(
ContextCompat.getColor(
requireContext(),
oppen.ariane.R.color.themed_text
)
), 0, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textSpan.setSpan(ForegroundColorSpan(ContextCompat.getColor(requireContext(), oppen.ariane.R.color.themed_text)), 0, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return textSpan
}
}