From 7b0bd309e422158294c71694dbc34caa28abb7a0 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:55:24 +0800 Subject: [PATCH] Fix light splash screen in dark theme on API >= 31 --- .../kotlin/com/hippo/ehviewer/EhApplication.kt | 6 +++++- .../com/hippo/ehviewer/SettingsCollector.kt | 16 ++++++++++++++-- .../kotlin/com/hippo/ehviewer/util/SDKUtils.kt | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt index 2627bcd65..b4b48c062 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt @@ -49,6 +49,7 @@ import com.hippo.ehviewer.util.FileUtils import com.hippo.ehviewer.util.ReadableTime import com.hippo.ehviewer.util.isAtLeastP import com.hippo.ehviewer.util.isAtLeastQ +import com.hippo.ehviewer.util.isAtLeastS import com.hippo.ehviewer.util.isCronetSupported import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor @@ -68,7 +69,10 @@ class EhApplication : Application(), ImageLoaderFactory { override fun onCreate() { // Initialize Settings on first access lifecycleScope.launchIO { - AppCompatDelegate.setDefaultNightMode(Settings.theme) + val mode = Settings.theme + if (!isAtLeastS) { + AppCompatDelegate.setDefaultNightMode(mode) + } } lifecycle.addObserver(lockObserver) val handler = Thread.getDefaultUncaughtExceptionHandler() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt b/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt index a64bd9628..65443df6a 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/SettingsCollector.kt @@ -1,5 +1,6 @@ package com.hippo.ehviewer +import android.app.UiModeManager import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY import androidx.core.os.LocaleListCompat @@ -8,6 +9,7 @@ import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.dailycheck.updateDailyCheckWork import com.hippo.ehviewer.ui.keepNoMediaFileStatus +import com.hippo.ehviewer.util.isAtLeastS import eu.kanade.tachiyomi.util.lang.launchIO import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -17,6 +19,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import splitties.init.appCtx import splitties.preferences.PrefDelegate +import splitties.systemservices.uiModeManager private val collectScope = CoroutineScope(Dispatchers.Main + SupervisorJob()) fun > R.observed(func: (Unit) -> Unit) = apply { collectScope.launch { changesFlow().collect(func) } } @@ -44,14 +47,23 @@ fun updateWhenKeepMediaStatusChanges() { fun updateWhenThemeChanges() { collectScope.launch { delay(100) // Avoid recompose being cancelled - AppCompatDelegate.setDefaultNightMode(Settings.theme) + if (isAtLeastS) { + val mode = when (Settings.theme) { + AppCompatDelegate.MODE_NIGHT_NO -> UiModeManager.MODE_NIGHT_NO + AppCompatDelegate.MODE_NIGHT_YES -> UiModeManager.MODE_NIGHT_YES + else -> UiModeManager.MODE_NIGHT_AUTO + } + uiModeManager.setApplicationNightMode(mode) + } else { + AppCompatDelegate.setDefaultNightMode(Settings.theme) + } } } fun updateWhenAmoledModeChanges() { collectScope.launch { delay(100) // Avoid recompose being cancelled - AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_AUTO_BATTERY) + AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_AUTO_BATTERY) // Trigger onNightModeChanged AppCompatDelegate.setDefaultNightMode(Settings.theme) } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/util/SDKUtils.kt b/app/src/main/kotlin/com/hippo/ehviewer/util/SDKUtils.kt index 2ef238743..64c943654 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/util/SDKUtils.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/util/SDKUtils.kt @@ -8,6 +8,7 @@ val isAtLeastO = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O val isAtLeastP = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P val isAtLeastQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q val isAtLeastR = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R +val isAtLeastS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S val isAtLeastT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU val isAtLeastU = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE val isAtLeastSExtension7 = isAtLeastR && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7