Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ import com.kazumaproject.markdownhelperkeyboard.ime_service.candidate.CandidateS
import com.kazumaproject.markdownhelperkeyboard.ime_service.candidate.CandidateQueryModeResolver
import com.kazumaproject.markdownhelperkeyboard.ime_service.candidate.CandidateRefreshCoordinator
import com.kazumaproject.markdownhelperkeyboard.ime_service.candidate.CandidateRefreshRequest
import com.kazumaproject.markdownhelperkeyboard.ime_service.candidate.CandidateRefreshTransitionPolicy
import com.kazumaproject.markdownhelperkeyboard.ime_service.candidate.CandidateRequestToken
import com.kazumaproject.markdownhelperkeyboard.ime_service.candidate.CandidateRequestTracker
import com.kazumaproject.markdownhelperkeyboard.ime_service.clipboard.ClipboardUtil
Expand Down Expand Up @@ -14645,10 +14646,11 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
prevFlag,
currentFlag,
)
if (
prevFlag == CandidateShowFlag.Idle &&
currentFlag == CandidateShowFlag.Updating &&
insertString.isNotEmpty()
if (CandidateRefreshTransitionPolicy.shouldEnterActiveCandidatePhase(
previousFlag = prevFlag,
currentFlag = currentFlag,
input = insertString,
)
) {
clearZeroQueryAllState(refresh = false)
shortcutToolbarHiddenForCandidates = true
Expand Down Expand Up @@ -14798,7 +14800,10 @@ class IMEService : InputMethodService(), LifecycleOwner, InputConnection,
}
}
}
prevFlag = currentFlag
prevFlag = CandidateRefreshTransitionPolicy.nextUiPreviousFlag(
currentFlag = currentFlag,
input = insertString,
)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.kazumaproject.markdownhelperkeyboard.ime_service.candidate

import com.kazumaproject.markdownhelperkeyboard.ime_service.models.CandidateShowFlag

/**
* Keeps non-user candidate refreshes from changing the visible conversion phase.
*
* Dictionary loading can publish an Updating request while the composing input is empty. That
* request refreshes data, but it must not consume the Idle -> Updating transition used by the
* candidate-strip UI to show the full-candidate toggle.
*/
internal object CandidateRefreshTransitionPolicy {

fun shouldEnterActiveCandidatePhase(
previousFlag: CandidateShowFlag?,
currentFlag: CandidateShowFlag,
input: String,
): Boolean {
return previousFlag == CandidateShowFlag.Idle &&
currentFlag == CandidateShowFlag.Updating &&
input.isNotEmpty()
}

fun nextUiPreviousFlag(
currentFlag: CandidateShowFlag,
input: String,
): CandidateShowFlag {
return if (currentFlag == CandidateShowFlag.Updating && input.isEmpty()) {
CandidateShowFlag.Idle
} else {
currentFlag
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,34 @@ import org.junit.Test

class CandidateRefreshCoordinatorTest {

@Test
fun emptyUpdatingDoesNotConsumeTheNextActiveCandidateTransition() {
val afterDictionaryRefresh = CandidateRefreshTransitionPolicy.nextUiPreviousFlag(
currentFlag = CandidateShowFlag.Updating,
input = "",
)

assertEquals(CandidateShowFlag.Idle, afterDictionaryRefresh)
assertTrue(
CandidateRefreshTransitionPolicy.shouldEnterActiveCandidatePhase(
previousFlag = afterDictionaryRefresh,
currentFlag = CandidateShowFlag.Updating,
input = "かな",
)
)
}

@Test
fun nonEmptyUpdatingRemainsTheActiveCandidatePhase() {
assertEquals(
CandidateShowFlag.Updating,
CandidateRefreshTransitionPolicy.nextUiPreviousFlag(
currentFlag = CandidateShowFlag.Updating,
input = "かな",
)
)
}

@Test
fun repeatedUpdatingRequestsRemainDistinctAndCarryTheirInputSnapshot() {
val coordinator = CandidateRefreshCoordinator()
Expand Down
Loading