diff --git a/app/src/main/java/oppen/ariane/Ariane.kt b/app/src/main/java/oppen/ariane/Ariane.kt index 77819c1..16c4774 100644 --- a/app/src/main/java/oppen/ariane/Ariane.kt +++ b/app/src/main/java/oppen/ariane/Ariane.kt @@ -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?" diff --git a/app/src/main/java/oppen/ariane/ui/settings/SettingsFragment.kt b/app/src/main/java/oppen/ariane/ui/settings/SettingsFragment.kt index db889ab..7eb8b4a 100644 --- a/app/src/main/java/oppen/ariane/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/oppen/ariane/ui/settings/SettingsFragment.kt @@ -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 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("theme_Light")?.isChecked = false + preferenceScreen.findPreference("theme_Dark")?.isChecked = false + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + } + "theme_Light" -> { + preferenceScreen.findPreference("theme_FollowSystem")?.isChecked = false + preferenceScreen.findPreference("theme_Dark")?.isChecked = false + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + } + "theme_Dark" -> { + preferenceScreen.findPreference("theme_FollowSystem")?.isChecked = false + preferenceScreen.findPreference("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("tls_Default") default?.isChecked = false } - if(key != "tls_All_Supported"){ - val default = preferenceScreen.findPreference("tls_All_Supported") - default?.isChecked = false + if (key != "tls_All_Supported") { + val all = preferenceScreen.findPreference("tls_All_Supported") + all?.isChecked = false } protocols.forEach { protocol -> val tlsSwitchKey = "tls_${protocol.toLowerCase(Locale.getDefault())}" if (tlsSwitchKey != key) { - val otherTLSSwitch = preferenceScreen.findPreference( - tlsSwitchKey - ) + val otherTLSSwitch = + preferenceScreen.findPreference( + 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 } }