From 79209034c20e3cc250ddb133a81ffd4fa33808cc Mon Sep 17 00:00:00 2001 From: WhiredPlanck Date: Fri, 4 Oct 2024 20:08:46 +0800 Subject: [PATCH] fix: forgot to invoke response handlers in Rime itself which would make the cached variables not be updated in time --- .../main/java/com/osfans/trime/core/Rime.kt | 55 +++++++------------ .../java/com/osfans/trime/core/Structs.kt | 13 ++++- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/osfans/trime/core/Rime.kt b/app/src/main/java/com/osfans/trime/core/Rime.kt index ddb7dbcaab..bac5013188 100644 --- a/app/src/main/java/com/osfans/trime/core/Rime.kt +++ b/app/src/main/java/com/osfans/trime/core/Rime.kt @@ -53,15 +53,14 @@ class Rime : Timber.i("Starting up Rime APIs ...") startupRime(sharedDataDir, userDataDir, fullCheck) - SchemaManager.init(getCurrentRimeSchema()) - updateStatus() + requestRimeResponse() OpenCCDictManager.buildOpenCCDict() lifecycleImpl.emitState(RimeLifecycle.State.READY) } override fun nativeScheduleTasks() { - updateContext() + requestRimeResponse() } override fun nativeFinalize() { @@ -157,21 +156,25 @@ class Rime : is RimeNotification.SchemaNotification -> schemaItemCached = notif.value else -> {} } - updateContext() + requestRimeResponse() } private fun handleRimeResponse(response: RimeResponse) { + SchemaManager.init(getCurrentRimeSchema()) if (response.status != null) { val (item, status) = - response.status.run { - SchemaItem(schemaId, schemaName) to - InputStatus(isDisabled, isComposing, isAsciiMode, isFullShape, isSimplified, isTraditional, isAsciiPunch) + response.status.let { + SchemaItem.fromStatus(it) to InputStatus.fromStatus(it) } inputStatusCached = status + inputStatus = response.status // for compatibility if (item != schemaItemCached) { schemaItemCached = item } } + if (response.context != null) { + inputContext = response.context // for compatibility + } } fun startup(fullCheck: Boolean) { @@ -205,8 +208,8 @@ class Rime : } companion object { - var inputContext: RimeProto.Context? = null - private var mStatus: RimeProto.Status? = null + private var inputContext: RimeProto.Context? = null + private var inputStatus: RimeProto.Status? = null private val notificationFlow_ = MutableSharedFlow>( extraBufferCapacity = 15, @@ -227,22 +230,6 @@ class Rime : System.loadLibrary("rime_jni") } - fun updateStatus() { - SchemaManager.updateSwitchOptions() - measureTimeMillis { - mStatus = getRimeStatus() - }.also { Timber.d("Took $it ms to get status") } - } - - fun updateContext() { - Timber.d("Update Rime context ...") - measureTimeMillis { - inputContext = getRimeContext() - }.also { Timber.d("Took $it ms to get context") } - updateStatus() - requestRimeResponse() - } - /* Android SDK包含了如下6个修饰键的状态,其中function键会被trime消费掉,因此只处理5个键 Android和librime对按键命名并不一致。读取可能有误。librime按键命名见如下链接, @@ -267,16 +254,13 @@ class Rime : val META_RELEASE_ON = getRimeModifierByName("Release") @JvmStatic - val isComposing get() = mStatus?.isComposing ?: false + val isComposing get() = inputStatus?.isComposing ?: false @JvmStatic - val isAsciiMode get() = mStatus?.isAsciiMode ?: true + val isAsciiMode get() = inputStatus?.isAsciiMode ?: true @JvmStatic - val isAsciiPunch get() = mStatus?.isAsciiPunch ?: true - - @JvmStatic - val currentSchemaName get() = mStatus?.schemaName ?: "" + val currentSchemaName get() = inputStatus?.schemaName ?: "" @JvmStatic fun hasMenu(): Boolean = !inputContext?.menu?.candidates.isNullOrEmpty() @@ -285,7 +269,7 @@ class Rime : fun hasLeft(): Boolean = hasMenu() && inputContext?.menu?.pageNumber != 0 @JvmStatic - fun showAsciiPunch(): Boolean = mStatus?.isAsciiPunch == true || mStatus?.isAsciiMode == true + fun showAsciiPunch(): Boolean = inputStatus?.isAsciiPunch == true || inputStatus?.isAsciiMode == true @JvmStatic val composingText: String @@ -307,7 +291,7 @@ class Rime : Timber.d("processKey: keyCode=$keycode, mask=$mask") return processRimeKey(keycode, mask).also { Timber.d("processKey ${if (it) "success" else "failed"}") - updateContext() + requestRimeResponse() } } @@ -319,7 +303,7 @@ class Rime : sequence.toString().replace("{}", "{braceleft}{braceright}"), ).also { Timber.d("simulateKeySequence ${if (it) "success" else "failed"}") - updateContext() + requestRimeResponse() } } @@ -339,7 +323,7 @@ class Rime : @JvmStatic fun setCaretPos(caretPos: Int) { setRimeCaretPos(caretPos) - updateContext() + requestRimeResponse() } // init @@ -515,6 +499,7 @@ class Rime : fun requestRimeResponse() { val response = RimeResponse(getRimeCommit(), getRimeContext(), getRimeStatus()) Timber.d("Got Rime response: $response") + responseHandlers.forEach { it.invoke(response) } responseFlow_.tryEmit(response) } diff --git a/app/src/main/java/com/osfans/trime/core/Structs.kt b/app/src/main/java/com/osfans/trime/core/Structs.kt index 8f528f3cff..d6bed3c7e2 100644 --- a/app/src/main/java/com/osfans/trime/core/Structs.kt +++ b/app/src/main/java/com/osfans/trime/core/Structs.kt @@ -7,7 +7,11 @@ package com.osfans.trime.core data class SchemaItem( val id: String, val name: String = "", -) +) { + companion object { + fun fromStatus(status: RimeProto.Status) = status.run { SchemaItem(schemaId, schemaName) } + } +} data class CandidateItem( val comment: String, @@ -22,4 +26,9 @@ data class InputStatus( val isSimplified: Boolean = false, val isTraditional: Boolean = false, val isAsciiPunch: Boolean = true, -) +) { + companion object { + fun fromStatus(status: RimeProto.Status) = + status.run { InputStatus(isDisabled, isComposing, isAsciiMode, isFullShape, isSimplified, isTraditional, isAsciiPunch) } + } +}