Skip to content

Commit 857e487

Browse files
WhiredPlancknopdan
andcommitted
fix: color would be repeatedly updated on some custom ROMs
Co-authored-by: nopdan <[email protected]>
1 parent ff944c3 commit 857e487

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

app/src/main/java/com/osfans/trime/data/theme/Theme.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class Theme(private var isDarkMode: Boolean) {
108108
}.getOrElse {
109109
Timber.e("Failed to parse the theme: ${it.message}")
110110
if (appPrefs.themeAndColor.selectedTheme != DEFAULT_THEME_NAME) {
111-
ThemeManager.switchTheme(DEFAULT_THEME_NAME)
111+
appPrefs.themeAndColor.selectedTheme = DEFAULT_THEME_NAME
112112
init()
113113
}
114114
}

app/src/main/java/com/osfans/trime/data/theme/ThemeManager.kt

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@ import android.content.res.Configuration
44
import androidx.annotation.Keep
55
import com.osfans.trime.data.AppPrefs
66
import com.osfans.trime.data.DataManager
7+
import com.osfans.trime.util.WeakHashSet
78
import com.osfans.trime.util.isNightMode
89
import java.io.File
910

1011
object ThemeManager {
12+
fun interface OnThemeChangeListener {
13+
fun onThemeChange(theme: Theme)
14+
}
15+
1116
/**
1217
* Update sharedThemes and userThemes.
1318
*/
@@ -28,11 +33,6 @@ object ThemeManager {
2833
?.toMutableList() ?: mutableListOf()
2934
}
3035

31-
@JvmStatic
32-
fun switchTheme(theme: String) {
33-
AppPrefs.defaultInstance().themeAndColor.selectedTheme = theme
34-
}
35-
3636
val sharedThemes: MutableList<String> = listThemes(DataManager.sharedDataDir)
3737

3838
val userThemes: MutableList<String> = listThemes(DataManager.userDataDir)
@@ -60,15 +60,32 @@ object ThemeManager {
6060
private set(value) {
6161
if (_activeTheme == value) return
6262
_activeTheme = value
63+
fireChange()
6364
}
6465

6566
private var isNightMode = false
6667

68+
private val onChangeListeners = WeakHashSet<OnThemeChangeListener>()
69+
70+
@JvmStatic
71+
fun addOnChangedListener(listener: OnThemeChangeListener) {
72+
onChangeListeners.add(listener)
73+
}
74+
75+
@JvmStatic
76+
fun removeOnChangedListener(listener: OnThemeChangeListener) {
77+
onChangeListeners.remove(listener)
78+
}
79+
80+
private fun fireChange() {
81+
onChangeListeners.forEach { it.onThemeChange(_activeTheme) }
82+
}
83+
6784
val prefs = AppPrefs.defaultInstance().themeAndColor
6885

6986
fun setNormalTheme(name: String) {
7087
AppPrefs.defaultInstance().themeAndColor.selectedTheme = name
71-
_activeTheme = evalActiveTheme()
88+
activeTheme = evalActiveTheme()
7289
}
7390

7491
private fun evalActiveTheme(): Theme {
@@ -87,11 +104,9 @@ object ThemeManager {
87104

88105
@JvmStatic
89106
fun onSystemNightModeChange(isNight: Boolean) {
107+
if (isNightMode == isNight) return
90108
isNightMode = isNight
91-
if (::_activeTheme.isInitialized) {
92-
activeTheme.systemChangeColor(isNightMode)
93-
} else {
94-
activeTheme = evalActiveTheme()
95-
}
109+
_activeTheme.systemChangeColor(isNightMode)
110+
fireChange()
96111
}
97112
}

app/src/main/java/com/osfans/trime/ime/core/Trime.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import android.view.inputmethod.CursorAnchorInfo
4040
import android.view.inputmethod.EditorInfo
4141
import android.view.inputmethod.ExtractedTextRequest
4242
import android.widget.FrameLayout
43+
import androidx.annotation.Keep
4344
import androidx.core.view.updateLayoutParams
4445
import com.osfans.trime.BuildConfig
4546
import com.osfans.trime.R
@@ -107,6 +108,12 @@ open class Trime : LifecycleInputMethodService() {
107108
private var mCompositionPopupWindow: CompositionPopupWindow? = null
108109
private var candidateExPage = false
109110

111+
@Keep
112+
private val onThemeChangeListener =
113+
ThemeManager.OnThemeChangeListener {
114+
initKeyboard()
115+
}
116+
110117
fun hasCandidateExPage(): Boolean {
111118
return candidateExPage
112119
}
@@ -227,6 +234,7 @@ open class Trime : LifecycleInputMethodService() {
227234
// and lead to a crash loop
228235
Timber.d("onCreate")
229236
val context: InputMethodService = this
237+
ThemeManager.addOnChangedListener(onThemeChangeListener)
230238
RimeWrapper.startup {
231239
Timber.d("Running Trime.onCreate")
232240
ThemeManager.init(resources.configuration)
@@ -405,6 +413,7 @@ open class Trime : LifecycleInputMethodService() {
405413
if (mCompositionPopupWindow != null) {
406414
mCompositionPopupWindow!!.destroy()
407415
}
416+
ThemeManager.removeOnChangedListener(onThemeChangeListener)
408417
super.onDestroy()
409418
self = null
410419
}

0 commit comments

Comments
 (0)