Skip to content

Commit

Permalink
feat: update candidates via rime response shared flow
Browse files Browse the repository at this point in the history
feat: create CompatCandidateModule to manage current candidate view
  • Loading branch information
WhiredPlanck committed Aug 30, 2024
1 parent 256c956 commit dbe0386
Show file tree
Hide file tree
Showing 8 changed files with 140 additions and 148 deletions.
3 changes: 0 additions & 3 deletions app/src/main/java/com/osfans/trime/core/Rime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,6 @@ class Rime : RimeApi, RimeLifecycleOwner {
}
}

val candidatesWithoutSwitch: Array<RimeProto.Candidate>
get() = inputContext?.menu?.candidates ?: arrayOf()

@JvmStatic
val candHighlightIndex: Int
get() = inputContext?.menu?.highlightedCandidateIndex ?: -1
Expand Down
33 changes: 15 additions & 18 deletions app/src/main/java/com/osfans/trime/ime/bar/QuickBar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,25 @@
package com.osfans.trime.ime.bar

import android.content.Context
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.ViewAnimator
import androidx.lifecycle.lifecycleScope
import com.osfans.trime.core.RimeNotification.OptionNotification
import com.osfans.trime.core.RimeProto
import com.osfans.trime.core.SchemaItem
import com.osfans.trime.daemon.RimeSession
import com.osfans.trime.daemon.launchOnReady
import com.osfans.trime.data.prefs.AppPrefs
import com.osfans.trime.data.schema.SchemaManager
import com.osfans.trime.data.theme.ColorManager
import com.osfans.trime.data.theme.Theme
import com.osfans.trime.databinding.CandidateBarBinding
import com.osfans.trime.ime.bar.ui.AlwaysUi
import com.osfans.trime.ime.bar.ui.TabUi
import com.osfans.trime.ime.broadcast.InputBroadcastReceiver
import com.osfans.trime.ime.candidates.CompatCandidateModule
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.dependency.InputScope
import com.osfans.trime.ime.symbol.SymbolBoardType
import com.osfans.trime.ime.window.BoardWindow
import kotlinx.coroutines.launch
import me.tatarka.inject.annotations.Inject
Expand All @@ -40,6 +38,7 @@ class QuickBar(
private val service: TrimeInputMethodService,
private val rime: RimeSession,
private val theme: Theme,
private val compatCandidate: CompatCandidateModule,
) : InputBroadcastReceiver {
private val prefs = AppPrefs.defaultInstance()

Expand Down Expand Up @@ -86,32 +85,28 @@ class QuickBar(
}

val oldCandidateBar by lazy {
CandidateBarBinding.inflate(LayoutInflater.from(context)).apply {
with(root) {
setPageStr(
{ service.handleKey(KeyEvent.KEYCODE_PAGE_DOWN, 0) },
{ service.handleKey(KeyEvent.KEYCODE_PAGE_UP, 0) },
{ service.selectLiquidKeyboard(SymbolBoardType.CANDIDATE) },
)
}
with(candidates) {
setCandidateListener(service.textInputManager)
rime.launchOnReady { shouldShowComment = !it.getRuntimeOption("_hide_comment") }
}
}
compatCandidate.binding
}

private val tabUi by lazy {
TabUi(context)
}

override fun onInputContextUpdate(ctx: RimeProto.Context) {
if (ctx.composition.length > 0) {
switchUiByState(State.Candidate)
} else {
switchUiByState(State.Always)
}
}

enum class State {
Always,
Candidate,
Tab,
}

fun switchUiByState(state: State) {
private fun switchUiByState(state: State) {
val index = state.ordinal
if (view.displayedChild == index) return
val new = view.getChildAt(index)
Expand Down Expand Up @@ -181,6 +176,8 @@ class QuickBar(
if (window is BoardWindow.BarBoardWindow) {
window.onCreateBarView()?.let { tabUi.addExternal(it) }
switchUiByState(State.Tab)
} else {
switchUiByState(State.Always)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package com.osfans.trime.ime.broadcast

import android.view.inputmethod.EditorInfo
import com.osfans.trime.core.RimeNotification.OptionNotification
import com.osfans.trime.core.RimeProto
import com.osfans.trime.core.SchemaItem
import com.osfans.trime.ime.window.BoardWindow

Expand All @@ -21,6 +22,8 @@ interface InputBroadcastReceiver {

fun onRimeOptionUpdated(value: OptionNotification.Value) {}

fun onInputContextUpdate(ctx: RimeProto.Context) {}

fun onWindowAttached(window: BoardWindow) {}

fun onWindowDetached(window: BoardWindow) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package com.osfans.trime.ime.broadcast

import android.view.inputmethod.EditorInfo
import com.osfans.trime.core.RimeNotification.OptionNotification
import com.osfans.trime.core.RimeProto
import com.osfans.trime.core.SchemaItem
import com.osfans.trime.ime.dependency.InputScope
import com.osfans.trime.ime.window.BoardWindow
Expand Down Expand Up @@ -52,6 +53,10 @@ class InputBroadcaster : InputBroadcastReceiver {
receivers.forEach { it.onRimeOptionUpdated(value) }
}

override fun onInputContextUpdate(ctx: RimeProto.Context) {
receivers.forEach { it.onInputContextUpdate(ctx) }
}

override fun onWindowAttached(window: BoardWindow) {
receivers.forEach { it.onWindowAttached(window) }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.osfans.trime.ime.candidates

import android.content.Context
import android.view.KeyEvent
import android.view.LayoutInflater
import com.osfans.trime.core.RimeProto
import com.osfans.trime.daemon.RimeSession
import com.osfans.trime.daemon.launchOnReady
import com.osfans.trime.databinding.CandidateBarBinding
import com.osfans.trime.ime.broadcast.InputBroadcastReceiver
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.dependency.InputScope
import com.osfans.trime.ime.symbol.SymbolBoardType
import me.tatarka.inject.annotations.Inject

@InputScope
@Inject
class CompatCandidateModule(
val context: Context,
val service: TrimeInputMethodService,
val rime: RimeSession,
) : InputBroadcastReceiver {
val binding by lazy {
CandidateBarBinding.inflate(LayoutInflater.from(context)).apply {
root.setPageStr(
{ service.handleKey(KeyEvent.KEYCODE_PAGE_DOWN, 0) },
{ service.handleKey(KeyEvent.KEYCODE_PAGE_UP, 0) },
{ service.selectLiquidKeyboard(SymbolBoardType.CANDIDATE) },
)
candidates.run {
setCandidateListener(service.textInputManager)
rime.launchOnReady { shouldShowComment = !it.getRuntimeOption("_hide_comment") }
}
}
}

override fun onInputContextUpdate(ctx: RimeProto.Context) {
binding.candidates.updateCandidatesFromMenu(ctx.menu)
}
}
32 changes: 21 additions & 11 deletions app/src/main/java/com/osfans/trime/ime/core/InputView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@ import androidx.core.view.updateLayoutParams
import androidx.lifecycle.lifecycleScope
import com.osfans.trime.core.Rime
import com.osfans.trime.core.RimeNotification
import com.osfans.trime.core.RimeResponse
import com.osfans.trime.daemon.RimeSession
import com.osfans.trime.data.prefs.AppPrefs
import com.osfans.trime.data.theme.ColorManager
import com.osfans.trime.data.theme.ThemeManager
import com.osfans.trime.ime.bar.QuickBar
import com.osfans.trime.ime.candidates.CompatCandidateModule
import com.osfans.trime.ime.composition.CompositionPopupWindow
import com.osfans.trime.ime.dependency.InputComponent
import com.osfans.trime.ime.dependency.create
Expand Down Expand Up @@ -94,20 +96,23 @@ class InputView(
}

private val notificationHandlerJob: Job
private val responseHandlerJob: Job

private val themedContext = context.withTheme(android.R.style.Theme_DeviceDefault_Settings)
private val inputComponent = InputComponent::class.create(themedContext, theme, service, rime)
private val broadcaster = inputComponent.broadcaster
private val windowManager = inputComponent.windowManager
val quickBar: QuickBar = inputComponent.quickBar
private val quickBar: QuickBar = inputComponent.quickBar
val composition: CompositionPopupWindow = inputComponent.composition
val keyboardWindow: KeyboardWindow = inputComponent.keyboardWindow
val liquidKeyboard: LiquidKeyboard = inputComponent.liquidKeyboard
private val compatCandidate: CompatCandidateModule = inputComponent.compatCandidate

private fun addBroadcastReceivers() {
broadcaster.addReceiver(quickBar)
broadcaster.addReceiver(keyboardWindow)
broadcaster.addReceiver(liquidKeyboard)
broadcaster.addReceiver(compatCandidate)
}

private val keyboardSidePadding = theme.generalStyle.keyboardPadding
Expand Down Expand Up @@ -141,6 +146,13 @@ class InputView(
}
}

responseHandlerJob =
service.lifecycleScope.launch {
rime.run { responseFlow }.collect {
handleRimeResponse(it)
}
}

windowManager.cacheResidentWindow(keyboardWindow, createView = true)
windowManager.cacheResidentWindow(liquidKeyboard)

Expand Down Expand Up @@ -318,6 +330,13 @@ class InputView(
}
}

private fun handleRimeResponse(response: RimeResponse) {
val ctx = response.context
if (ctx != null) {
broadcaster.onInputContextUpdate(ctx)
}
}

enum class Board {
Main,
Symbol,
Expand All @@ -335,12 +354,10 @@ class InputView(
}

fun updateComposing(ic: InputConnection?) {
val candidateView = quickBar.oldCandidateBar.candidates
val compositionView = composition.composition.compositionView
val mainKeyboardView = keyboardWindow.mainKeyboardView
if (composition.isPopupWindowEnabled) {
val offset = Rime.inputContext?.let { compositionView.update(it) } ?: 0
candidateView.setText(offset)
Rime.inputContext?.let { compositionView.update(it) } ?: 0
val isCursorUpdated =
if (ic != null && !composition.isWinFixed()) {
ic.requestCursorUpdates(InputConnection.CURSOR_UPDATE_IMMEDIATE)
Expand All @@ -352,13 +369,6 @@ class InputView(
if (!isCursorUpdated) {
composition.updateView()
}
} else {
candidateView.setText(0)
}
if (Rime.isComposing) {
quickBar.switchUiByState(QuickBar.State.Candidate)
} else {
quickBar.switchUiByState(QuickBar.State.Always)
}
mainKeyboardView.invalidateComposingKeys()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.osfans.trime.daemon.RimeSession
import com.osfans.trime.data.theme.Theme
import com.osfans.trime.ime.bar.QuickBar
import com.osfans.trime.ime.broadcast.InputBroadcaster
import com.osfans.trime.ime.candidates.CompatCandidateModule
import com.osfans.trime.ime.composition.CompositionPopupWindow
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.keyboard.KeyboardWindow
Expand All @@ -31,4 +32,5 @@ abstract class InputComponent(
abstract val windowManager: BoardWindowManager
abstract val keyboardWindow: KeyboardWindow
abstract val liquidKeyboard: LiquidKeyboard
abstract val compatCandidate: CompatCandidateModule
}
Loading

0 comments on commit dbe0386

Please sign in to comment.