diff --git a/app/src/main/cpp/androidfrontend/androidfrontend.cpp b/app/src/main/cpp/androidfrontend/androidfrontend.cpp index 62045260..2f29797d 100644 --- a/app/src/main/cpp/androidfrontend/androidfrontend.cpp +++ b/app/src/main/cpp/androidfrontend/androidfrontend.cpp @@ -442,6 +442,11 @@ void AndroidFrontend::showToast(const std::string &s) { void AndroidFrontend::setCandidatePagingMode(const int mode) { pagingMode_ = mode; + if (mode == 0) { + activeIC_->updateCandidatesBulk(); + } else { + activeIC_->updateCandidatesPaged(); + } } void AndroidFrontend::updatePagedCandidate(const PagedCandidateEntity &paged) { diff --git a/app/src/main/java/org/fcitx/fcitx5/android/input/BaseInputView.kt b/app/src/main/java/org/fcitx/fcitx5/android/input/BaseInputView.kt index c43731d3..a3dc2c70 100644 --- a/app/src/main/java/org/fcitx/fcitx5/android/input/BaseInputView.kt +++ b/app/src/main/java/org/fcitx/fcitx5/android/input/BaseInputView.kt @@ -37,6 +37,19 @@ abstract class BaseInputView( } } + open fun refreshWithCachedEvents() { + val inputPanelData = fcitx.runImmediately { inputPanelCached } + val inputMethodEntry = fcitx.runImmediately { inputMethodEntryCached } + val statusAreaActions = fcitx.runImmediately { statusAreaActionsCached } + arrayOf( + FcitxEvent.InputPanelEvent(inputPanelData), + FcitxEvent.IMChangeEvent(inputMethodEntry), + FcitxEvent.StatusAreaEvent( + FcitxEvent.StatusAreaEvent.Data(statusAreaActions, inputMethodEntry) + ) + ).forEach { handleFcitxEvent(it) } + } + var handleEvents = false set(value) { field = value diff --git a/app/src/main/java/org/fcitx/fcitx5/android/input/InputDeviceManager.kt b/app/src/main/java/org/fcitx/fcitx5/android/input/InputDeviceManager.kt index 447e2555..3f8743b3 100644 --- a/app/src/main/java/org/fcitx/fcitx5/android/input/InputDeviceManager.kt +++ b/app/src/main/java/org/fcitx/fcitx5/android/input/InputDeviceManager.kt @@ -20,16 +20,25 @@ class InputDeviceManager(private val onChange: (Boolean) -> Unit) { private var candidatesView: CandidatesView? = null private fun setupInputViewEvents(isVirtual: Boolean) { - inputView?.handleEvents = isVirtual - inputView?.visibility = if (isVirtual) View.VISIBLE else View.GONE + val iv = inputView ?: return + iv.handleEvents = isVirtual + if (isVirtual) { + iv.visibility = View.VISIBLE + } else { + iv.visibility = View.GONE + iv.refreshWithCachedEvents() + } } private fun setupCandidatesViewEvents(isVirtual: Boolean) { - candidatesView?.handleEvents = !isVirtual + val cv = candidatesView ?: return + cv.handleEvents = !isVirtual // hide CandidatesView when entering virtual keyboard mode, // but preserve the visibility when entering physical keyboard mode (in case it's empty) if (isVirtual) { - candidatesView?.visibility = View.GONE + cv.visibility = View.GONE + } else { + cv.refreshWithCachedEvents() } }