Skip to content

Commit

Permalink
refactor: handle window switching in input(view) scope as more as pos…
Browse files Browse the repository at this point in the history
…sible
  • Loading branch information
WhiredPlanck committed Oct 4, 2024
1 parent 014a001 commit 4af1789
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 63 deletions.
28 changes: 13 additions & 15 deletions app/src/main/java/com/osfans/trime/ime/core/InputView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputConnection
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
Expand Down Expand Up @@ -105,9 +106,9 @@ class InputView(
private val enterKeyLabel = inputComponent.enterKeyLabel
private val windowManager = inputComponent.windowManager
private val quickBar: QuickBar = inputComponent.quickBar
val composition: CompositionPopupWindow = inputComponent.composition
val keyboardWindow: KeyboardWindow = inputComponent.keyboardWindow
val liquidKeyboard: LiquidKeyboard = inputComponent.liquidKeyboard
private val composition: CompositionPopupWindow = inputComponent.composition
private val keyboardWindow: KeyboardWindow = inputComponent.keyboardWindow
private val liquidKeyboard: LiquidKeyboard = inputComponent.liquidKeyboard
private val compactCandidate: CompactCandidateModule = inputComponent.compactCandidate

private fun addBroadcastReceivers() {
Expand Down Expand Up @@ -326,9 +327,18 @@ class InputView(
when (it) {
is RimeNotification.SchemaNotification -> {
broadcaster.onRimeSchemaUpdated(it.value)

windowManager.attachWindow(KeyboardWindow)
}
is RimeNotification.OptionNotification -> {
broadcaster.onRimeOptionUpdated(it.value)

if (it.value.option == "_liquid_keyboard") {
ContextCompat.getMainExecutor(service).execute {
windowManager.attachWindow(LiquidKeyboard)
liquidKeyboard.select(0)
}
}
}
else -> {}
}
Expand All @@ -354,18 +364,6 @@ class InputView(
}
}

enum class Board {
Main,
Symbol,
}

fun switchBoard(board: Board) {
when (board) {
Board.Main -> windowManager.attachWindow(KeyboardWindow)
Board.Symbol -> windowManager.attachWindow(LiquidKeyboard)
}
}

fun updateCursorAnchorInfo(info: CursorAnchorInfo) {
composition.updateCursorAnchorInfo(info)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,6 @@ import com.osfans.trime.ime.keyboard.CommonKeyboardActionListener
import com.osfans.trime.ime.keyboard.Event
import com.osfans.trime.ime.keyboard.InitializationUi
import com.osfans.trime.ime.keyboard.InputFeedbackManager
import com.osfans.trime.ime.symbol.SymbolBoardType
import com.osfans.trime.ime.symbol.TabManager
import com.osfans.trime.util.ShortcutUtils
import com.osfans.trime.util.ShortcutUtils.openCategory
import com.osfans.trime.util.findSectionFrom
Expand Down Expand Up @@ -268,7 +266,6 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
if (notification is RimeNotification.SchemaNotification) {
SchemaManager.init(notification.value.id)
recreateInputView()
inputView?.switchBoard(InputView.Board.Main)
} else if (notification is RimeNotification.OptionNotification) {
val value = notification.value.value
when (val option = notification.value.option) {
Expand All @@ -281,7 +278,6 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
-> {
setCandidatesViewShown(isComposable && !value)
}
"_liquid_keyboard" -> selectLiquidKeyboard(0)
else ->
if (option.startsWith("_key_") && option.length > 5 && value) {
shouldUpdateRimeOption = false // 防止在 handleRimeNotification 中 setOption
Expand All @@ -307,44 +303,6 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
updateComposing()
}

fun inputSymbol(text: String) {
commonKeyboardActionListener?.listener?.onPress(KeyEvent.KEYCODE_UNKNOWN)
if (Rime.isAsciiMode) Rime.setOption("ascii_mode", false)
val asciiPunch = Rime.isAsciiPunch
if (asciiPunch) Rime.setOption("ascii_punct", false)
commonKeyboardActionListener?.listener?.onText("{Escape}$text")
if (asciiPunch) Rime.setOption("ascii_punct", true)
selectLiquidKeyboard(-1)
}

private fun selectLiquidKeyboard(tabIndex: Int) {
if (inputView == null) return
if (tabIndex >= 0) {
inputView!!.switchBoard(InputView.Board.Symbol)
inputView!!.liquidKeyboard.select(tabIndex)
} else {
// 设置液体键盘处于隐藏状态
TabManager.setTabExited()
inputView!!.switchBoard(InputView.Board.Main)
updateComposing()
}
}

// 按键需要通过tab name来打开liquidKeyboard的指定tab
fun selectLiquidKeyboard(name: String) {
if (name.matches("-?\\d+".toRegex())) {
selectLiquidKeyboard(name.toInt())
} else if (name.matches("[A-Z]+".toRegex())) {
selectLiquidKeyboard(SymbolBoardType.valueOf(name))
} else {
selectLiquidKeyboard(TabManager.tabTags.indexOfFirst { it.text == name })
}
}

private fun selectLiquidKeyboard(type: SymbolBoardType) {
selectLiquidKeyboard(TabManager.tabTags.indexOfFirst { it.type == type })
}

fun pasteByChar() {
commitTextByChar(checkNotNull(ShortcutUtils.pasteFromClipboard(this)).toString())
}
Expand Down Expand Up @@ -504,7 +462,6 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
postRimeJob(Dispatchers.Main) {
InputFeedbackManager.loadSoundEffects(this@TrimeInputMethodService)
InputFeedbackManager.resetPlayProgress()
selectLiquidKeyboard(-1)
isComposable =
arrayOf(
InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ import com.osfans.trime.ime.dialog.AvailableSchemaPickerDialog
import com.osfans.trime.ime.dialog.EnabledSchemaPickerDialog
import com.osfans.trime.ime.enums.Keycode
import com.osfans.trime.ime.enums.Keycode.Companion.toStdKeyEvent
import com.osfans.trime.ime.symbol.LiquidKeyboard
import com.osfans.trime.ime.symbol.SymbolBoardType
import com.osfans.trime.ime.symbol.TabManager
import com.osfans.trime.ime.window.BoardWindowManager
import com.osfans.trime.ui.main.settings.ColorPickerDialog
import com.osfans.trime.ui.main.settings.KeySoundEffectPickerDialog
import com.osfans.trime.ui.main.settings.ThemePickerDialog
Expand All @@ -42,6 +46,8 @@ class CommonKeyboardActionListener(
private val service: TrimeInputMethodService,
private val rime: RimeSession,
private val inputView: InputView,
private val liquidKeyboard: LiquidKeyboard,
private val windowManager: BoardWindowManager,
) {
companion object {
/** Pattern for braced key event like `{Left}`, `{Right}`, etc. */
Expand Down Expand Up @@ -171,7 +177,23 @@ class CommonKeyboardActionListener(
}

when (event.command) {
"liquid_keyboard" -> service.selectLiquidKeyboard(arg)
"liquid_keyboard" -> {
val target =
when {
arg.matches("-?\\d+".toRegex()) -> arg.toInt()
arg.matches("[A-Z]+".toRegex()) -> {
val type = SymbolBoardType.valueOf(arg)
TabManager.tabTags.indexOfFirst { it.type == type }
}
else -> TabManager.tabTags.indexOfFirst { it.text == arg }
}
if (target >= 0) {
windowManager.attachWindow(LiquidKeyboard)
liquidKeyboard.select(target)
} else {
windowManager.attachWindow(KeyboardWindow)
}
}
"paste_by_char" -> service.pasteByChar()
"set_color_scheme" -> ColorManager.setColorScheme(arg)
else -> {
Expand Down
29 changes: 26 additions & 3 deletions app/src/main/java/com/osfans/trime/ime/symbol/LiquidKeyboard.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
package com.osfans.trime.ime.symbol

import android.content.Context
import android.view.KeyEvent
import android.view.View
import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView
Expand All @@ -15,6 +17,7 @@ import com.google.android.flexbox.AlignItems
import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent
import com.osfans.trime.daemon.RimeSession
import com.osfans.trime.daemon.launchOnReady
import com.osfans.trime.data.SymbolHistory
import com.osfans.trime.data.db.ClipboardHelper
import com.osfans.trime.data.db.CollectionHelper
Expand All @@ -25,7 +28,9 @@ import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.dependency.InputScope
import com.osfans.trime.ime.keyboard.CommonKeyboardActionListener
import com.osfans.trime.ime.keyboard.KeyboardSwitcher
import com.osfans.trime.ime.keyboard.KeyboardWindow
import com.osfans.trime.ime.window.BoardWindow
import com.osfans.trime.ime.window.BoardWindowManager
import com.osfans.trime.ime.window.ResidentWindow
import kotlinx.coroutines.launch
import me.tatarka.inject.annotations.Inject
Expand All @@ -40,10 +45,12 @@ class LiquidKeyboard(
private val service: TrimeInputMethodService,
private val rime: RimeSession,
private val theme: Theme,
private val commonKeyboardActionListener: CommonKeyboardActionListener,
private val windowManager: BoardWindowManager,
lazyCommonKeyboardActionListener: Lazy<CommonKeyboardActionListener>,
) : BoardWindow.BarBoardWindow(),
ResidentWindow,
ClipboardHelper.OnClipboardUpdateListener {
private val commonKeyboardActionListener by lazyCommonKeyboardActionListener
private lateinit var liquidLayout: LiquidLayout
private val symbolHistory = SymbolHistory(180)
private lateinit var currentBoardType: SymbolBoardType
Expand All @@ -56,7 +63,7 @@ class LiquidKeyboard(
setHasStableIds(true)
setListener {
when (currentBoardType) {
SymbolBoardType.SYMBOL -> service.inputSymbol(this.text)
SymbolBoardType.SYMBOL -> triggerSymbolInput(this.text)
else -> {
service.commitText(this.text)
if (currentBoardType != SymbolBoardType.HISTORY) {
Expand All @@ -74,7 +81,7 @@ class LiquidKeyboard(
setOnDebouncedItemClick { _, _, position ->
val item = items[position]
when (currentBoardType) {
SymbolBoardType.SYMBOL -> service.inputSymbol(item.first)
SymbolBoardType.SYMBOL -> triggerSymbolInput(item.first)
SymbolBoardType.TABS -> {
val realPosition = TabManager.tabTags.indexOfFirst { it.text == item.first }
select(realPosition)
Expand Down Expand Up @@ -215,6 +222,22 @@ class LiquidKeyboard(
varLengthAdapter.submitList(data)
}

private fun triggerSymbolInput(symbol: String) {
commonKeyboardActionListener.listener.onPress(KeyEvent.KEYCODE_UNKNOWN)
rime.launchOnReady {
val (isAsciiMode, isAsciiPunch) = it.inputStatusCached.run { isAsciiMode to isAsciiPunch }
if (isAsciiMode) it.setRuntimeOption("ascii_mode", false)
if (isAsciiPunch) it.setRuntimeOption("ascii_punch", false)
commonKeyboardActionListener.listener.onText("{Escape}$symbol")
if (isAsciiPunch) it.setRuntimeOption("ascii_punch", true)
ContextCompat.getMainExecutor(service).execute {
TabManager.setTabExited()
windowManager.attachWindow(KeyboardWindow)
service.updateComposing()
}
}
}

/**
* 实现 OnClipboardUpdateListener 中的 onUpdate
* 当剪贴板内容变化且剪贴板视图处于开启状态时,更新视图.
Expand Down
1 change: 0 additions & 1 deletion app/src/main/java/com/osfans/trime/util/ShortcutUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ object ShortcutUtils {
"commit" -> return option
"run" -> context.startIntent(option)
"share_text" -> TrimeInputMethodService.getService().shareText()
"liquid_keyboard" -> TrimeInputMethodService.getService().selectLiquidKeyboard(option)
else -> context.startIntent(command, option)
}
return null
Expand Down

0 comments on commit 4af1789

Please sign in to comment.