Skip to content

Commit

Permalink
refactor: split out CommonKeyboardActionListener from TextInputManager
Browse files Browse the repository at this point in the history
  • Loading branch information
WhiredPlanck committed Sep 7, 2024
1 parent 03613a5 commit 94be029
Show file tree
Hide file tree
Showing 13 changed files with 348 additions and 295 deletions.
4 changes: 0 additions & 4 deletions app/src/main/java/com/osfans/trime/core/Rime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -311,10 +311,6 @@ class Rime :
@JvmStatic
fun getOption(option: String): Boolean = getRimeOption(option)

fun toggleOption(option: String) {
setOption(option, !getOption(option))
}

@JvmStatic
fun setCaretPos(caretPos: Int) {
setRimeCaretPos(caretPos)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ import com.osfans.trime.data.theme.ThemeManager
import com.osfans.trime.data.theme.model.CompositionComponent
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.keyboard.Event
import com.osfans.trime.ime.keyboard.KeyboardActionListener
import com.osfans.trime.ime.keyboard.KeyboardPrefs.isLandscapeMode
import com.osfans.trime.ime.keyboard.KeyboardSwitcher
import com.osfans.trime.ime.text.TextInputManager
import com.osfans.trime.util.sp
import splitties.dimensions.dp
import kotlin.math.absoluteValue
Expand All @@ -50,7 +50,6 @@ class Composition(
) : TextView(context, attrs) {
private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop
private val theme = ThemeManager.activeTheme
private val textInputManager = TextInputManager.instanceOrNull()

private val keyTextSize = theme.generalStyle.keyTextSize
private val labelTextSize = theme.generalStyle.labelTextSize
Expand Down Expand Up @@ -102,6 +101,7 @@ class Composition(
private var initialY = 0f
private var onActionMove: ((Float, Float) -> Unit)? = null
private var onSelectCandidate: ((Int) -> Unit)? = null
private var keyboardActionListener: KeyboardActionListener? = null

private val stickyLines: Int
get() =
Expand Down Expand Up @@ -167,12 +167,16 @@ class Composition(
onSelectCandidate = listener
}

fun setKeyboardActionListener(listener: KeyboardActionListener?) {
keyboardActionListener = listener
}

private inner class EventSpan(
private val event: Event,
) : ClickableSpan() {
override fun onClick(tv: View) {
textInputManager?.onPress(event.code)
textInputManager?.onEvent(event)
keyboardActionListener?.onPress(event.code)
keyboardActionListener?.onEvent(event)
}

override fun updateDrawState(ds: TextPaint) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import com.osfans.trime.ime.bar.QuickBar
import com.osfans.trime.ime.broadcast.InputBroadcastReceiver
import com.osfans.trime.ime.dependency.InputScope
import com.osfans.trime.ime.enums.PopupPosition
import com.osfans.trime.ime.keyboard.CommonKeyboardActionListener
import me.tatarka.inject.annotations.Inject
import splitties.dimensions.dp
import timber.log.Timber
Expand All @@ -41,6 +42,7 @@ class CompositionPopupWindow(
private val ctx: Context,
private val rime: RimeSession,
private val theme: Theme,
private val commonKeyboardActionListener: CommonKeyboardActionListener,
private val bar: QuickBar,
) : InputBroadcastReceiver {
// 顯示懸浮窗口
Expand All @@ -58,6 +60,7 @@ class CompositionPopupWindow(
setOnSelectCandidateListener { idx ->
rime.launchOnReady { it.selectCandidate(idx) }
}
setKeyboardActionListener(commonKeyboardActionListener.listener)
}
}

Expand Down
3 changes: 2 additions & 1 deletion app/src/main/java/com/osfans/trime/ime/core/InputView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,9 @@ class InputView(
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 inputComponent = InputComponent::class.create(this, themedContext, theme, service, rime)
private val broadcaster = inputComponent.broadcaster
val commonKeyboardActionListener = inputComponent.commonKeyboardActionListener
private val windowManager = inputComponent.windowManager
private val quickBar: QuickBar = inputComponent.quickBar
val composition: CompositionPopupWindow = inputComponent.composition
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import com.osfans.trime.data.theme.ThemeManager
import com.osfans.trime.ime.broadcast.IntentReceiver
import com.osfans.trime.ime.enums.FullscreenMode
import com.osfans.trime.ime.enums.InlinePreeditMode
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
Expand All @@ -68,7 +69,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.consumeEach
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import splitties.bitflags.hasFlag
Expand All @@ -88,11 +88,13 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
private val prefs: AppPrefs
get() = AppPrefs.defaultInstance()
var inputView: InputView? = null
private val commonKeyboardActionListener: CommonKeyboardActionListener?
get() = inputView?.commonKeyboardActionListener
private var initializationUi: InitializationUi? = null
private var eventListeners = WeakHashSet<EventListener>()
private var mIntentReceiver: IntentReceiver? = null
private var isWindowShown = false // 键盘窗口是否已显示
var textInputManager: TextInputManager? = null // 文字输入管理器
private var textInputManager: TextInputManager? = null // 文字输入管理器

var shouldUpdateRimeOption = false

Expand Down Expand Up @@ -275,11 +277,11 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
}

fun inputSymbol(text: String) {
textInputManager!!.onPress(KeyEvent.KEYCODE_UNKNOWN)
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)
textInputManager!!.onText("{Escape}$text")
commonKeyboardActionListener?.listener?.onText("{Escape}$text")
if (asciiPunch) Rime.setOption("ascii_punct", true)
self!!.selectLiquidKeyboard(-1)
}
Expand Down Expand Up @@ -842,10 +844,10 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
keyEventCode: Int,
metaState: Int,
): Boolean { // 軟鍵盤
textInputManager!!.needSendUpRimeKey = false
commonKeyboardActionListener?.needSendUpRimeKey = false
if (onRimeKey(Event.getRimeEvent(keyEventCode, metaState))) {
// 如果输入法消费了按键事件,则需要释放按键
textInputManager!!.needSendUpRimeKey = true
commonKeyboardActionListener?.needSendUpRimeKey = true
Timber.d(
"\t<TrimeInput>\thandleKey()\trimeProcess, keycode=%d, metaState=%d",
keyEventCode,
Expand All @@ -861,7 +863,7 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
// 打开系统默认应用
Timber.d("\t<TrimeInput>\thandleKey()\topenCategory keycode=%d", keyEventCode)
} else {
textInputManager!!.needSendUpRimeKey = true
commonKeyboardActionListener?.needSendUpRimeKey = true
Timber.d(
"\t<TrimeInput>\thandleKey()\treturn FALSE, keycode=%d, metaState=%d",
keyEventCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ import com.osfans.trime.ime.bar.QuickBar
import com.osfans.trime.ime.broadcast.InputBroadcaster
import com.osfans.trime.ime.candidates.CompactCandidateModule
import com.osfans.trime.ime.composition.CompositionPopupWindow
import com.osfans.trime.ime.core.InputView
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.keyboard.CommonKeyboardActionListener
import com.osfans.trime.ime.keyboard.KeyboardWindow
import com.osfans.trime.ime.symbol.LiquidKeyboard
import com.osfans.trime.ime.window.BoardWindowManager
Expand All @@ -21,12 +23,14 @@ import me.tatarka.inject.annotations.Provides
@InputScope
@Component
abstract class InputComponent(
@get:InputScope @get:Provides val inputView: InputView,
@get:InputScope @get:Provides val themedContext: Context,
@get:InputScope @get:Provides val theme: Theme,
@get:InputScope @get:Provides val service: TrimeInputMethodService,
@get:InputScope @get:Provides val rime: RimeSession,
) {
abstract val broadcaster: InputBroadcaster
abstract val commonKeyboardActionListener: CommonKeyboardActionListener
abstract val quickBar: QuickBar
abstract val composition: CompositionPopupWindow
abstract val windowManager: BoardWindowManager
Expand Down
Loading

0 comments on commit 94be029

Please sign in to comment.