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 package oppen.ariane
import android.app.Application import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.PreferenceManager
class Ariane: Application() { 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{ companion object{
const val DEFAULT_HOME_CAPSULE = "gemini://gemini.circumlunar.space/~oppen/index.gmi" const val DEFAULT_HOME_CAPSULE = "gemini://gemini.circumlunar.space/~oppen/index.gmi"
const val GEMINI_USER_SEARCH_BASE = "gemini://gus.guru/search?" const val GEMINI_USER_SEARCH_BASE = "gemini://gus.guru/search?"

View File

@ -1,10 +1,12 @@
package oppen.ariane.ui.settings package oppen.ariane.ui.settings
import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.text.Spannable import android.text.Spannable
import android.text.SpannableString import android.text.SpannableString
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.preference.* import androidx.preference.*
import oppen.ariane.Ariane import oppen.ariane.Ariane
@ -16,9 +18,13 @@ import javax.net.ssl.SSLSocketFactory
class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener { class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
lateinit var prefs: SharedPreferences
lateinit var protocols: Array<String> lateinit var protocols: Array<String>
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
prefs = preferenceManager.sharedPreferences
val context = preferenceManager.context val context = preferenceManager.context
val screen = preferenceManager.createPreferenceScreen(context) val screen = preferenceManager.createPreferenceScreen(context)
@ -35,10 +41,7 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
homePreference.title = "Home Capsule" homePreference.title = "Home Capsule"
homePreference.key = "home_capsule" homePreference.key = "home_capsule"
val homecapsule = preferenceManager.sharedPreferences.getString( val homecapsule = preferenceManager.sharedPreferences.getString("home_capsule", Ariane.DEFAULT_HOME_CAPSULE)
"home_capsule",
Ariane.DEFAULT_HOME_CAPSULE
)
homePreference.summary = homecapsule homePreference.summary = homecapsule
homePreference.positiveButtonText = getThemedSpan("Update") homePreference.positiveButtonText = getThemedSpan("Update")
@ -54,6 +57,39 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
} }
appCategory.addPreference(homePreference) 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 * TLS Settings
*/ */
@ -91,24 +127,61 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
} }
override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean { 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 -> preference.key?.let { key ->
when { when {
key.startsWith("tls_") -> { key.startsWith("tls_") -> {
if(key != "tls_Default"){ if (key != "tls_Default") {
val default = preferenceScreen.findPreference<SwitchPreferenceCompat>("tls_Default") val default = preferenceScreen.findPreference<SwitchPreferenceCompat>("tls_Default")
default?.isChecked = false default?.isChecked = false
} }
if(key != "tls_All_Supported"){ if (key != "tls_All_Supported") {
val default = preferenceScreen.findPreference<SwitchPreferenceCompat>("tls_All_Supported") val all = preferenceScreen.findPreference<SwitchPreferenceCompat>("tls_All_Supported")
default?.isChecked = false all?.isChecked = false
} }
protocols.forEach { protocol -> protocols.forEach { protocol ->
val tlsSwitchKey = "tls_${protocol.toLowerCase(Locale.getDefault())}" val tlsSwitchKey = "tls_${protocol.toLowerCase(Locale.getDefault())}"
if (tlsSwitchKey != key) { if (tlsSwitchKey != key) {
val otherTLSSwitch = preferenceScreen.findPreference<SwitchPreferenceCompat>( val otherTLSSwitch =
tlsSwitchKey preferenceScreen.findPreference<SwitchPreferenceCompat>(
) tlsSwitchKey
)
otherTLSSwitch?.isChecked = false otherTLSSwitch?.isChecked = false
} }
} }
@ -124,34 +197,19 @@ class SettingsFragment: PreferenceFragmentCompat(), Preference.OnPreferenceChang
setTLSProtocol(prefTitle) setTLSProtocol(prefTitle)
} }
} }
return true
} }
return false
} }
private fun setTLSProtocol(protocol: String){ private fun setTLSProtocol(protocol: String) = preferenceManager.sharedPreferences.edit().putString("tls_protocol", protocol).apply()
preferenceManager.sharedPreferences.edit().putString(
"tls_protocol",
protocol
).apply()
}
/** /**
* Unfortunately it doesn't look like EditTextPreference supports Day/Night theme * 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{ private fun getThemedSpan(text: String): Spannable{
val textSpan = SpannableString(text) val textSpan = SpannableString(text)
textSpan.setSpan( textSpan.setSpan(ForegroundColorSpan(ContextCompat.getColor(requireContext(), oppen.ariane.R.color.themed_text)), 0, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
ForegroundColorSpan(
ContextCompat.getColor(
requireContext(),
oppen.ariane.R.color.themed_text
)
), 0, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
return textSpan return textSpan
} }
} }