mirror of https://git.sr.ht/~oppen/ariane
add day night theme overide
This commit is contained in:
parent
0f41297cf4
commit
50a13884a5
|
@ -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?"
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue