Apply theme changing without restarting

pull/173/head
Koitharu 4 years ago
parent ce7960e5e9
commit 473135bfc5
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -43,9 +43,13 @@ abstract class BaseActivity<B : ViewBinding> :
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val settings = get<AppSettings>() val settings = get<AppSettings>()
val isAmoled = settings.isAmoledTheme
val isDynamic = settings.isDynamicTheme
// TODO support DialogWhenLarge theme
when { when {
settings.isAmoledTheme -> setTheme(R.style.ThemeOverlay_Kotatsu_AMOLED) isAmoled && isDynamic -> setTheme(R.style.Theme_Kotatsu_Monet_Amoled)
settings.isDynamicTheme -> setTheme(R.style.Theme_Kotatsu_Monet) isAmoled -> setTheme(R.style.Theme_Kotatsu_Amoled)
isDynamic -> setTheme(R.style.Theme_Kotatsu_Monet)
} }
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)

@ -4,7 +4,6 @@ import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.Uri import android.net.Uri
import android.os.Build
import android.provider.Settings import android.provider.Settings
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.collection.arraySetOf import androidx.collection.arraySetOf
@ -52,7 +51,7 @@ class AppSettings(context: Context) {
get() = prefs.getString(KEY_THEME, null)?.toIntOrNull() ?: AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM get() = prefs.getString(KEY_THEME, null)?.toIntOrNull() ?: AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
val isDynamicTheme: Boolean val isDynamicTheme: Boolean
get() = prefs.getBoolean(KEY_DYNAMIC_THEME, false) get() = DynamicColors.isDynamicColorAvailable() && prefs.getBoolean(KEY_DYNAMIC_THEME, false)
val isAmoledTheme: Boolean val isAmoledTheme: Boolean
get() = prefs.getBoolean(KEY_THEME_AMOLED, false) get() = prefs.getBoolean(KEY_THEME_AMOLED, false)
@ -324,12 +323,5 @@ class AppSettings(context: Context) {
private const val NETWORK_NEVER = 0 private const val NETWORK_NEVER = 0
private const val NETWORK_ALWAYS = 1 private const val NETWORK_ALWAYS = 1
private const val NETWORK_NON_METERED = 2 private const val NETWORK_NON_METERED = 2
val isDynamicColorAvailable: Boolean
get() = DynamicColors.isDynamicColorAvailable() ||
(isSamsung && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
private val isSamsung
get() = Build.MANUFACTURER.equals("samsung", ignoreCase = true)
} }
} }

@ -5,10 +5,11 @@ import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.postDelayed
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.TwoStatePreference import androidx.preference.TwoStatePreference
import java.util.* import com.google.android.material.color.DynamicColors
import org.koin.android.ext.android.get import org.koin.android.ext.android.get
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.base.ui.BasePreferenceFragment
@ -19,6 +20,7 @@ import org.koitharu.kotatsu.parsers.util.names
import org.koitharu.kotatsu.settings.protect.ProtectSetupActivity import org.koitharu.kotatsu.settings.protect.ProtectSetupActivity
import org.koitharu.kotatsu.settings.utils.SliderPreference import org.koitharu.kotatsu.settings.utils.SliderPreference
import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat
import java.util.*
class AppearanceSettingsFragment : class AppearanceSettingsFragment :
BasePreferenceFragment(R.string.appearance), BasePreferenceFragment(R.string.appearance),
@ -38,7 +40,7 @@ class AppearanceSettingsFragment :
entryValues = ListMode.values().names() entryValues = ListMode.values().names()
setDefaultValueCompat(ListMode.GRID.name) setDefaultValueCompat(ListMode.GRID.name)
} }
findPreference<Preference>(AppSettings.KEY_DYNAMIC_THEME)?.isVisible = AppSettings.isDynamicColorAvailable findPreference<Preference>(AppSettings.KEY_DYNAMIC_THEME)?.isVisible = DynamicColors.isDynamicColorAvailable()
findPreference<ListPreference>(AppSettings.KEY_DATE_FORMAT)?.run { findPreference<ListPreference>(AppSettings.KEY_DATE_FORMAT)?.run {
entryValues = resources.getStringArray(R.array.date_formats) entryValues = resources.getStringArray(R.array.date_formats)
val now = Date().time val now = Date().time
@ -73,10 +75,10 @@ class AppearanceSettingsFragment :
AppCompatDelegate.setDefaultNightMode(settings.theme) AppCompatDelegate.setDefaultNightMode(settings.theme)
} }
AppSettings.KEY_DYNAMIC_THEME -> { AppSettings.KEY_DYNAMIC_THEME -> {
get<ActivityRecreationHandle>().recreateAll() postRestart()
} }
AppSettings.KEY_THEME_AMOLED -> { AppSettings.KEY_THEME_AMOLED -> {
get<ActivityRecreationHandle>().recreateAll() postRestart()
} }
AppSettings.KEY_APP_PASSWORD -> { AppSettings.KEY_APP_PASSWORD -> {
findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP) findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP)
@ -100,4 +102,10 @@ class AppearanceSettingsFragment :
else -> super.onPreferenceTreeClick(preference) else -> super.onPreferenceTreeClick(preference)
} }
} }
private fun postRestart() {
view?.postDelayed(400) {
get<ActivityRecreationHandle>().recreateAll()
}
}
} }

@ -33,7 +33,7 @@ class SettingsHeadersFragment : PreferenceHeaderFragmentCompat(), SlidingPaneLay
fun setTitle(title: CharSequence?) { fun setTitle(title: CharSequence?) {
currentTitle = title currentTitle = title
if (slidingPaneLayout.isSlideable && slidingPaneLayout.isOpen) { if (slidingPaneLayout.isOpen) {
activity?.title = title activity?.title = title
} }
} }

@ -3,9 +3,12 @@
<style name="ThemeOverlay.Kotatsu" parent="ThemeOverlay.Material3.Dark" /> <style name="ThemeOverlay.Kotatsu" parent="ThemeOverlay.Material3.Dark" />
<!--== AMOLED Mode Overlay ==--> <style name="Theme.Kotatsu.Amoled">
<style name="ThemeOverlay.Kotatsu.AMOLED" parent=""> <item name="colorSurface">@color/surface_amoled</item>
<!-- Theme Colors --> <item name="android:colorBackground">@color/background_amoled</item>
</style>
<style name="Theme.Kotatsu.Monet.Amoled">
<item name="colorSurface">@color/surface_amoled</item> <item name="colorSurface">@color/surface_amoled</item>
<item name="android:colorBackground">@color/background_amoled</item> <item name="android:colorBackground">@color/background_amoled</item>
</style> </style>

@ -86,9 +86,11 @@
<!-- Monet theme only support S+ --> <!-- Monet theme only support S+ -->
<style name="Theme.Kotatsu.Monet" /> <style name="Theme.Kotatsu.Monet" />
<style name="ThemeOverlay.Kotatsu" parent="ThemeOverlay.Material3.Light" /> <style name="Theme.Kotatsu.Amoled" />
<style name="Theme.Kotatsu.Monet.Amoled" />
<style name="ThemeOverlay.Kotatsu.AMOLED" parent="" /> <style name="ThemeOverlay.Kotatsu" parent="ThemeOverlay.Material3.Light" />
<style name="Theme.Kotatsu.Dialog" parent=""> <style name="Theme.Kotatsu.Dialog" parent="">
<item name="android:windowNoTitle">true</item> <item name="android:windowNoTitle">true</item>

Loading…
Cancel
Save