Skip to content

Commit c873442

Browse files
committed
refactor: move the composing logic to the view into InputView
1 parent 2c1bcb3 commit c873442

File tree

3 files changed

+47
-41
lines changed

3 files changed

+47
-41
lines changed

app/src/main/java/com/osfans/trime/ime/composition/CompositionPopupWindow.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import android.view.WindowManager
1919
import android.view.inputmethod.CursorAnchorInfo
2020
import android.widget.PopupWindow
2121
import androidx.core.math.MathUtils
22+
import com.osfans.trime.core.Rime
2223
import com.osfans.trime.data.prefs.AppPrefs
2324
import com.osfans.trime.data.theme.ColorManager
2425
import com.osfans.trime.data.theme.Theme
@@ -175,7 +176,7 @@ class CompositionPopupWindow(
175176
popupWindowPos !== PopupPosition.LEFT_UP && popupWindowPos !== PopupPosition.RIGHT_UP
176177
}
177178

178-
fun updatePopupWindow(
179+
private fun updatePopupWindow(
179180
offsetX: Int,
180181
offsetY: Int,
181182
) {
@@ -186,12 +187,20 @@ class CompositionPopupWindow(
186187
mPopupWindow.update(popupWindowX, popupWindowY, -1, -1, true)
187188
}
188189

189-
fun hideCompositionView() {
190+
fun updateView() {
191+
if (Rime.isComposing) {
192+
updateCompositionView()
193+
} else {
194+
hideCompositionView()
195+
}
196+
}
197+
198+
private fun hideCompositionView() {
190199
mPopupWindow.dismiss()
191200
mPopupHandler.removeCallbacks(mPopupTimer)
192201
}
193202

194-
fun updateCompositionView() {
203+
private fun updateCompositionView() {
195204
if (isPopupWindowMovable == "once") {
196205
popupWindowPos = PopupPosition.fromString(ThemeManager.activeTheme.generalStyle.layout.position)
197206
}
@@ -234,5 +243,6 @@ class CompositionPopupWindow(
234243
}
235244
cursorAnchorInfo.matrix.mapRect(mPopupRectF)
236245
}
246+
updateView()
237247
}
238248
}

app/src/main/java/com/osfans/trime/ime/core/InputView.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ import android.os.Build
1212
import android.view.View
1313
import android.view.View.OnClickListener
1414
import android.view.WindowManager
15+
import android.view.inputmethod.CursorAnchorInfo
1516
import android.view.inputmethod.EditorInfo
17+
import android.view.inputmethod.InputConnection
1618
import android.widget.ImageView
1719
import androidx.constraintlayout.widget.ConstraintLayout
1820
import androidx.core.view.ViewCompat
1921
import androidx.core.view.WindowCompat
2022
import androidx.core.view.WindowInsetsCompat
2123
import androidx.core.view.updateLayoutParams
2224
import androidx.lifecycle.lifecycleScope
25+
import com.osfans.trime.core.Rime
2326
import com.osfans.trime.core.RimeNotification
2427
import com.osfans.trime.daemon.RimeSession
2528
import com.osfans.trime.data.prefs.AppPrefs
@@ -329,6 +332,34 @@ class InputView(
329332
}
330333
}
331334

335+
fun updateCursorAnchorInfo(info: CursorAnchorInfo) {
336+
composition.updateCursorAnchorInfo(info)
337+
}
338+
339+
fun updateComposing(ic: InputConnection?) {
340+
val candidateView = quickBar.oldCandidateBar.candidates
341+
val compositionView = composition.composition.compositionView
342+
val mainKeyboardView = keyboardWindow.oldMainInputView.mainKeyboardView
343+
if (composition.isPopupWindowEnabled) {
344+
val offset = Rime.inputContext?.let { compositionView.update(it) } ?: 0
345+
candidateView.setText(offset)
346+
val isCursorUpdated =
347+
if (ic != null && !composition.isWinFixed()) {
348+
ic.requestCursorUpdates(InputConnection.CURSOR_UPDATE_IMMEDIATE)
349+
} else {
350+
false
351+
}.also { composition.isCursorUpdated = it }
352+
// if isCursorUpdated, updateView will be called in onUpdateCursorAnchorInfo
353+
// otherwise we need to call it here
354+
if (!isCursorUpdated) {
355+
composition.updateView()
356+
}
357+
} else {
358+
candidateView.setText(0)
359+
}
360+
mainKeyboardView.invalidateComposingKeys()
361+
}
362+
332363
private var showingDialog: Dialog? = null
333364

334365
fun showDialog(dialog: Dialog) {

app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import com.osfans.trime.data.prefs.AppPrefs
4343
import com.osfans.trime.data.theme.ColorManager
4444
import com.osfans.trime.data.theme.ThemeManager
4545
import com.osfans.trime.ime.broadcast.IntentReceiver
46-
import com.osfans.trime.ime.composition.CompositionPopupWindow
4746
import com.osfans.trime.ime.enums.FullscreenMode
4847
import com.osfans.trime.ime.enums.InlinePreeditMode
4948
import com.osfans.trime.ime.enums.Keycode
@@ -55,7 +54,6 @@ import com.osfans.trime.ime.keyboard.KeyboardSwitcher
5554
import com.osfans.trime.ime.keyboard.KeyboardView
5655
import com.osfans.trime.ime.symbol.SymbolBoardType
5756
import com.osfans.trime.ime.symbol.TabManager
58-
import com.osfans.trime.ime.text.Candidate
5957
import com.osfans.trime.ime.text.TextInputManager
6058
import com.osfans.trime.util.ShortcutUtils
6159
import com.osfans.trime.util.ShortcutUtils.openCategory
@@ -88,15 +86,13 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
8886
private val prefs: AppPrefs
8987
get() = AppPrefs.defaultInstance()
9088
private var mainKeyboardView: KeyboardView? = null // 主軟鍵盤
91-
private var mCandidate: Candidate? = null // 候選
9289
var inputView: InputView? = null
9390
private var initializationUi: InitializationUi? = null
9491
private var eventListeners = WeakHashSet<EventListener>()
9592
private var mIntentReceiver: IntentReceiver? = null
9693
private var isWindowShown = false // 键盘窗口是否已显示
9794
private var isAutoCaps = false // 句首自動大寫
9895
var textInputManager: TextInputManager? = null // 文字输入管理器
99-
private var mCompositionPopupWindow: CompositionPopupWindow? = null
10096
var candidateExPage = false
10197

10298
var shouldUpdateRimeOption = false
@@ -318,24 +314,12 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
318314
commitTextByChar(checkNotNull(ShortcutUtils.pasteFromClipboard(this)).toString())
319315
}
320316

321-
private fun showCompositionView() {
322-
if (Rime.isComposing) {
323-
mCompositionPopupWindow?.updateCompositionView()
324-
} else {
325-
mCompositionPopupWindow?.hideCompositionView()
326-
}
327-
}
328-
329317
/** Must be called on the UI thread
330318
*
331319
* 重置鍵盤、候選條、狀態欄等 !!注意,如果其中調用Rime.setOption,切換方案會卡住 */
332320
fun recreateInputView() {
333321
inputView = InputView(this, rime)
334322
mainKeyboardView = inputView!!.keyboardWindow.oldMainInputView.mainKeyboardView
335-
// 初始化候选栏
336-
mCandidate = inputView!!.quickBar.oldCandidateBar.candidates
337-
338-
mCompositionPopupWindow = inputView!!.composition
339323

340324
loadConfig()
341325
KeyboardSwitcher.newOrReset()
@@ -351,7 +335,6 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
351335
mIntentReceiver = null
352336
InputFeedbackManager.destroy()
353337
inputView = null
354-
mCompositionPopupWindow = null
355338
for (listener in eventListeners) {
356339
listener.onDestroy()
357340
}
@@ -392,8 +375,7 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
392375
}
393376

394377
override fun onUpdateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo) {
395-
mCompositionPopupWindow?.updateCursorAnchorInfo(cursorAnchorInfo)
396-
showCompositionView()
378+
inputView?.updateCursorAnchorInfo(cursorAnchorInfo)
397379
}
398380

399381
override fun onUpdateSelection(
@@ -1110,27 +1092,10 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
11101092
}
11111093

11121094
/** 更新Rime的中西文狀態、編輯區文本 */
1113-
fun updateComposing(): Int {
1114-
val ic = currentInputConnection
1095+
fun updateComposing() {
11151096
updateComposingText()
1116-
if (ic != null && mCompositionPopupWindow?.isWinFixed() == false) {
1117-
mCompositionPopupWindow?.isCursorUpdated = ic.requestCursorUpdates(1)
1118-
}
1119-
var startNum = 0
1120-
if (mCompositionPopupWindow?.isPopupWindowEnabled == true) {
1121-
val composition = mCompositionPopupWindow!!.composition
1122-
composition.compositionView.visibility = View.VISIBLE
1123-
startNum = Rime.inputContext?.let { composition.compositionView.update(it) } ?: 0
1124-
mCandidate?.setText(startNum)
1125-
// if isCursorUpdated, showCompositionView will be called in onUpdateCursorAnchorInfo
1126-
// otherwise we need to call it here
1127-
if (mCompositionPopupWindow?.isCursorUpdated == false) showCompositionView()
1128-
} else {
1129-
mCandidate?.setText(0)
1130-
}
1131-
mainKeyboardView?.invalidateComposingKeys()
1097+
inputView?.updateComposing(currentInputConnection)
11321098
if (!onEvaluateInputViewShown()) setCandidatesViewShown(textInputManager!!.isComposable) // 實體鍵盤打字時顯示候選欄
1133-
return startNum
11341099
}
11351100

11361101
/**

0 commit comments

Comments
 (0)