Skip to content

Commit

Permalink
perf: remember last dark/light color scheme
Browse files Browse the repository at this point in the history
  • Loading branch information
nopdan authored and Bambooin committed Feb 3, 2024
1 parent 92fd2eb commit f801439
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 45 deletions.
111 changes: 74 additions & 37 deletions app/src/main/java/com/osfans/trime/data/theme/Theme.kt
Expand Up @@ -32,21 +32,30 @@ import com.osfans.trime.util.bitmapDrawable
import com.osfans.trime.util.dp2px
import timber.log.Timber
import java.io.File
import java.lang.IllegalArgumentException
import java.util.Objects
import kotlin.system.measureTimeMillis

/** 主题和样式配置 */
class Theme(private var isDarkMode: Boolean) {
private var currentColorSchemeId: String? = null
private var generalStyle: Map<String, Any?>? = null
private var fallbackColors: Map<String, String>? = null
private var presetColorSchemes: Map<String, Map<String, Any>?>? = null
private var presetKeyboards: Map<String, Any?>? = null
private var liquidKeyboard: Map<String, Any?>? = null

// 当前配色 id
lateinit var currentColorSchemeId: String

// 遍历当前配色方案的值、fallback的值,从而获得当前方案的全部配色Map
private val currentColors: MutableMap<String, Any> = hashMapOf()

// 上一个 light 配色
private var lastLightColorSchemeId: String? = null

// 上一个 dark 配色
private var lastDarkColorSchemeId: String? = null

@JvmField
val style = Style(this)

Expand Down Expand Up @@ -102,7 +111,7 @@ class Theme(private var isDarkMode: Boolean) {
liquidKeyboard = fullThemeConfigMap!!["liquid_keyboard"] as Map<String, Any?>?
}.also { Timber.d("Setting up all theme config map takes $it ms") }
measureTimeMillis {
systemChangeColor(isDarkMode)
initColorScheme()
}.also { Timber.d("Initializing cache takes $it ms") }
Timber.i("The theme is initialized")
}.getOrElse {
Expand Down Expand Up @@ -284,32 +293,75 @@ class Theme(private var isDarkMode: Boolean) {
}

/**
* 获取暗黑模式/明亮模式下配色方案的名称
*
* @return 配色方案名称
* 第一次载入主题,初始化默认配色
* */
private fun initColorScheme() {
var colorScheme = appPrefs.theme.selectedColor
if (!presetColorSchemes!!.containsKey(colorScheme)) colorScheme = style.getString("color_scheme") // 主題中指定的配色
if (!presetColorSchemes!!.containsKey(colorScheme)) colorScheme = "default" // 主題中的default配色
currentColorSchemeId = colorScheme
// 配色表中没有这个 id
if (!presetColorSchemes!!.containsKey(currentColorSchemeId)) {
Timber.e("Color scheme %s not found", currentColorSchemeId)
throw IllegalArgumentException("Color scheme $currentColorSchemeId not found!")
}
switchDarkMode(isDarkMode)
}

/**
* 切换到指定配色,切换成功后写入 AppPrefs
* @param colorSchemeId 配色 id
* */
fun setColorScheme(colorSchemeId: String) {
if (!presetColorSchemes!!.containsKey(colorSchemeId)) {
Timber.w("Color scheme %s not found", colorSchemeId)
return
}
if (currentColorSchemeId == colorSchemeId && currentColors.isNotEmpty()) return
Timber.d("switch color scheme from %s to %s", currentColorSchemeId, colorSchemeId)
currentColorSchemeId = colorSchemeId
refreshColorValues()
if (isDarkMode) {
lastDarkColorSchemeId = colorSchemeId
} else {
lastLightColorSchemeId = colorSchemeId
}
AppPrefs.defaultInstance().theme.selectedColor = colorSchemeId
}

/**
* 切换深色/亮色模式
* */
fun switchDarkMode(isDarkMode: Boolean) {
this.isDarkMode = isDarkMode
val newId = getColorSchemeId()
if (newId != null) setColorScheme(newId)
Timber.d(
"System changing color, current ColorScheme: $currentColorSchemeId, isDarkMode=$isDarkMode",
)
}

/**
* @return 切换深色/亮色模式后配色的 id
*/
private fun getColorSchemeName(): String? {
val final =
appPrefs.theme.selectedColor
.takeIf { presetColorSchemes!!.containsKey(it) }
?: style.getString("color_scheme") // 主題中指定的配色
.takeIf { presetColorSchemes!!.containsKey(it) }
?: "default" // 主題中的default配色
val colorMap = presetColorSchemes!![final] as Map<String, Any>
private fun getColorSchemeId(): String? {
val colorMap = presetColorSchemes!![currentColorSchemeId] as Map<String, Any>
if (isDarkMode) {
if (colorMap.containsKey("dark_scheme")) {
return (colorMap["dark_scheme"] as String?).also {
if (!it.isNullOrEmpty()) appPrefs.theme.selectedColor = it
}
return colorMap["dark_scheme"] as String?
}
if (lastDarkColorSchemeId != null) {
return lastDarkColorSchemeId
}
} else {
if (colorMap.containsKey("light_scheme")) {
return (colorMap["light_scheme"] as String?).also {
if (!it.isNullOrEmpty()) appPrefs.theme.selectedColor = it
}
return colorMap["light_scheme"] as String?
}
if (lastLightColorSchemeId != null) {
return lastLightColorSchemeId
}
}
return final
return currentColorSchemeId
}

private fun joinToFullImagePath(value: String): String {
Expand All @@ -331,23 +383,7 @@ class Theme(private var isDarkMode: Boolean) {
}
}

// 当切换暗黑模式时,刷新键盘配色方案
fun systemChangeColor(isDarkMode: Boolean) {
this.isDarkMode = isDarkMode
currentColorSchemeId = getColorSchemeName()
Timber.d(
"System changing color, current ColorScheme: $currentColorSchemeId, isDarkMode=$isDarkMode",
)
refreshColorValues()
}

fun fireChangeColor() {
currentColorSchemeId = getColorSchemeName()
Timber.d("Fire changing color, current color scheme: $currentColorSchemeId")
refreshColorValues()
}

private fun refreshColorValues() {
fun refreshColorValues() {
currentColors.clear()
val colorMap = presetColorSchemes!![currentColorSchemeId]
if (colorMap == null) {
Expand All @@ -373,6 +409,7 @@ class Theme(private var isDarkMode: Boolean) {
Timber.w("Cannot parse color key: %s, value: %s", key, value)
}
}
Timber.d("Refresh color scheme, current color scheme: $currentColorSchemeId")
}

// 处理 value 值,转为颜色(Int)或图片path string 或者 fallback
Expand Down
Expand Up @@ -106,7 +106,7 @@ object ThemeManager {
fun onSystemNightModeChange(isNight: Boolean) {
if (isNightMode == isNight) return
isNightMode = isNight
_activeTheme.systemChangeColor(isNightMode)
_activeTheme.switchDarkMode(isNightMode)
fireChange()
}
}
2 changes: 1 addition & 1 deletion app/src/main/java/com/osfans/trime/ime/core/Trime.kt
Expand Up @@ -390,7 +390,7 @@ open class Trime : LifecycleInputMethodService() {
inputView!!.switchUiByState(KeyboardWindow.State.Main)
loadConfig()
val theme = ThemeManager.activeTheme
theme.fireChangeColor()
theme.refreshColorValues()
SoundThemeManager.switchSound(theme.colors.getString("sound"))
resetCandidate()
KeyboardSwitcher.newOrReset()
Expand Down
8 changes: 2 additions & 6 deletions app/src/main/java/com/osfans/trime/ui/main/Pickers.kt
Expand Up @@ -42,31 +42,27 @@ suspend fun Context.themePicker(
ThemeManager.setNormalTheme(if (this == "trime") this else "$this.trime")
TabManager.updateSelf()
}
launch {
Trime.getServiceOrNull()?.initKeyboard()
}
}
}.create()
}

suspend fun Context.colorPicker(
@StyleRes themeResId: Int = 0,
): AlertDialog {
val prefs by lazy { AppPrefs.defaultInstance() }
return CoroutineChoiceDialog(this, themeResId).apply {
title = getString(R.string.looks__selected_color_title)
initDispatcher = Dispatchers.Default
val all by lazy { ThemeManager.activeTheme.getPresetColorSchemes() }
onInit {
items = all.map { it.second }.toTypedArray()
val current = prefs.theme.selectedColor
val current = ThemeManager.activeTheme.currentColorSchemeId
val schemeIds = all.map { it.first }
checkedItem = schemeIds.indexOf(current).takeIf { it > -1 } ?: 1
}
postiveDispatcher = Dispatchers.Default
onOKButton {
val schemeIds = all.map { it.first }
prefs.theme.selectedColor = schemeIds[checkedItem]
ThemeManager.activeTheme.setColorScheme(schemeIds[checkedItem])
launch {
Trime.getServiceOrNull()?.initKeyboard() // 立刻重初始化键盘生效
}
Expand Down

0 comments on commit f801439

Please sign in to comment.