Skip to content

Commit

Permalink
refactor: update composition view from external context data
Browse files Browse the repository at this point in the history
  • Loading branch information
WhiredPlanck committed May 8, 2024
1 parent debca2b commit df55afb
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 21 deletions.
24 changes: 10 additions & 14 deletions app/src/main/java/com/osfans/trime/core/Rime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ class Rime : RimeApi, RimeLifecycleOwner {
}

companion object {
private var mContext: RimeContext? = null
var inputContext: RimeContext? = null
private var mStatus: RimeStatus? = null
private val notificationFlow_ =
MutableSharedFlow<RimeNotification<*>>(
Expand All @@ -122,7 +122,7 @@ class Rime : RimeApi, RimeLifecycleOwner {
fun updateContext() {
Timber.d("Update Rime context ...")
measureTimeMillis {
mContext = getRimeContext() ?: RimeContext()
inputContext = getRimeContext() ?: RimeContext()
}.also { Timber.d("Took $it ms to get context") }
updateStatus()
}
Expand Down Expand Up @@ -164,17 +164,17 @@ class Rime : RimeApi, RimeLifecycleOwner {

@JvmStatic
fun hasMenu(): Boolean {
return isComposing && mContext?.menu?.numCandidates != 0
return isComposing && inputContext?.menu?.numCandidates != 0
}

@JvmStatic
fun hasLeft(): Boolean {
return hasMenu() && mContext?.menu?.pageNo != 0
return hasMenu() && inputContext?.menu?.pageNo != 0
}

@JvmStatic
fun hasRight(): Boolean {
return hasMenu() && mContext?.menu?.isLastPage == false
return hasMenu() && inputContext?.menu?.isLastPage == false
}

@JvmStatic
Expand All @@ -184,19 +184,15 @@ class Rime : RimeApi, RimeLifecycleOwner {

@JvmStatic
val composition: RimeComposition?
get() = mContext?.composition
get() = inputContext?.composition

@JvmStatic
val compositionText: String
get() = composition?.preedit ?: ""

@JvmStatic
val composingText: String
get() = mContext?.commitTextPreview ?: ""

@JvmStatic
val selectLabels: Array<String>
get() = mContext?.selectLabels ?: arrayOf()
get() = inputContext?.commitTextPreview ?: ""

@JvmStatic
fun isVoidKeycode(keycode: Int): Boolean {
Expand Down Expand Up @@ -243,16 +239,16 @@ class Rime : RimeApi, RimeLifecycleOwner {
return if (!isComposing && showSwitches) {
SchemaManager.getStatusSwitches()
} else {
mContext?.candidates ?: arrayOf()
inputContext?.candidates ?: arrayOf()
}
}

val candidatesWithoutSwitch: Array<CandidateListItem>
get() = if (isComposing) mContext?.candidates ?: arrayOf() else arrayOf()
get() = if (isComposing) inputContext?.candidates ?: arrayOf() else arrayOf()

@JvmStatic
val candHighlightIndex: Int
get() = if (isComposing) mContext?.menu?.highlightedCandidateIndex ?: -1 else -1
get() = if (isComposing) inputContext?.menu?.highlightedCandidateIndex ?: -1 else -1

fun commitComposition(): Boolean {
return commitRimeComposition().also {
Expand Down
19 changes: 13 additions & 6 deletions app/src/main/java/com/osfans/trime/ime/composition/Composition.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import androidx.core.text.inSpans
import com.osfans.trime.core.CandidateListItem
import com.osfans.trime.core.Rime
import com.osfans.trime.core.RimeComposition
import com.osfans.trime.core.RimeContext
import com.osfans.trime.data.theme.ColorManager
import com.osfans.trime.data.theme.EventManager
import com.osfans.trime.data.theme.FontManager
Expand Down Expand Up @@ -387,19 +388,25 @@ class Composition(context: Context, attrs: AttributeSet?) : TextView(context, at
*
* @return 悬浮窗显示的候选词数量
*/
fun update(): Int {
fun update(inputContext: RimeContext): Int {
if (visibility != VISIBLE) return 0
Rime.composition?.preedit?.takeIf { it.isNotBlank() } ?: return 0
val candidates = Rime.candidatesWithoutSwitch
val startNum = calculateOffset(candidates.map { it.text })
inputContext.composition?.preedit?.takeIf { it.isNotBlank() } ?: return 0
val candidates = inputContext.candidates
val startNum = calculateOffset(candidates)
val content =
buildSpannedString {
for (component in windowComponents) {
when {
component.move.isNotBlank() -> buildSpannedMove(component)
component.composition.isNotBlank() -> buildSpannedComposition(component, Rime.composition!!)
component.composition.isNotBlank() -> buildSpannedComposition(component, inputContext.composition)
component.click.isNotBlank() -> buildSpannedButton(component)
component.candidate.isNotBlank() -> buildSpannedCandidates(component, candidates, Rime.selectLabels, startNum)
component.candidate.isNotBlank() ->
buildSpannedCandidates(
component,
candidates,
inputContext.selectLabels,
startNum,
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1096,7 +1096,7 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
if (mCompositionPopupWindow?.isPopupWindowEnabled == true) {
val composition = mCompositionPopupWindow!!.composition
composition.compositionView.visibility = View.VISIBLE
startNum = composition.compositionView.update()
startNum = Rime.inputContext?.let { composition.compositionView.update(it) } ?: 0
mCandidate?.setText(startNum)
// if isCursorUpdated, showCompositionView will be called in onUpdateCursorAnchorInfo
// otherwise we need to call it here
Expand Down

0 comments on commit df55afb

Please sign in to comment.