diff --git a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java index 4ac354a4d..834cc1561 100644 --- a/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java @@ -95,6 +95,11 @@ public final class InputLogic { private int mSpaceState; // Never null private SuggestedWords mSuggestedWords = SuggestedWords.getEmptyInstance(); + // #14 spacing-policy signals — recomputed every keystroke from the suggestion results at zero + // extra native cost (see computeSpacingSignals / setSuggestedWords). Consumed by the upcoming + // signal-driven grace + two-gate Assisted-tier logic. + private boolean mSpacingComplete; // typed word is a real dictionary word + private float mSpacingPrefixRichScore; // fraction of candidates that are completions [0..1] private final Suggest mSuggest; private final DictionaryFacilitator mDictionaryFacilitator; private SingleDictionaryFacilitator mEmojiDictionaryFacilitator; @@ -1399,6 +1404,9 @@ public void setSuggestedWords(final SuggestedWords suggestedWords) { mWordComposer.setAutoCorrection(suggestedWordInfo); } mSuggestedWords = suggestedWords; + final SpacingSignals spacingSignals = computeSpacingSignals(suggestedWords); + mSpacingComplete = spacingSignals.complete; + mSpacingPrefixRichScore = spacingSignals.prefixRichScore; final boolean newAutoCorrectionIndicator = suggestedWords.mWillAutoCorrect; // Put a blue underline to a word in TextView which will be auto-corrected. @@ -1416,6 +1424,43 @@ public void setSuggestedWords(final SuggestedWords suggestedWords) { } } + /** + * #14 spacing-policy signals derived from the current suggestion results, computed every + * keystroke at zero extra native cost. + *
diff --git a/app/src/test/java/helium314/keyboard/latin/inputlogic/SpacingSignalsTest.kt b/app/src/test/java/helium314/keyboard/latin/inputlogic/SpacingSignalsTest.kt
new file mode 100644
index 000000000..e3296d37d
--- /dev/null
+++ b/app/src/test/java/helium314/keyboard/latin/inputlogic/SpacingSignalsTest.kt
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-3.0-only
+package helium314.keyboard.latin.inputlogic
+
+import helium314.keyboard.latin.SuggestedWords
+import helium314.keyboard.latin.SuggestedWords.SuggestedWordInfo
+import helium314.keyboard.latin.dictionary.Dictionary
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+/**
+ * Unit tests for [InputLogic.computeSpacingSignals] (#14 spacing policy): the free per-keystroke
+ * `complete` + `prefixRichScore` signals derived from the suggestion results. Pure logic.
+ */
+class SpacingSignalsTest {
+
+ // mDictType != "user_typed" -> counts as a "real" dictionary source for `complete`.
+ private val realDict: Dictionary = Dictionary.DICTIONARY_APPLICATION_DEFINED
+ private val userTyped: Dictionary = Dictionary.DICTIONARY_USER_TYPED
+
+ private fun info(word: String, kind: Int, dict: Dictionary): SuggestedWordInfo =
+ SuggestedWordInfo(word, "", 0, kind, dict,
+ SuggestedWordInfo.NOT_AN_INDEX, SuggestedWordInfo.NOT_A_CONFIDENCE)
+
+ private fun words(typed: SuggestedWordInfo?, typedValid: Boolean,
+ list: List