From a5f773619bd6fd9f7ee3eeaa82ceae79b4c17163 Mon Sep 17 00:00:00 2001 From: Lee0701 Date: Fri, 14 May 2021 12:32:02 +0900 Subject: [PATCH] Use software string event for HangulCombiner composing word processing to fix auto spacing problem --- .../openboard/inputmethod/event/Event.kt | 7 +++++++ .../inputmethod/event/HangulCombiner.kt | 19 +++---------------- .../inputmethod/latin/KoreanDictionary.java | 8 +++++--- .../latin/inputlogic/InputLogic.java | 3 +++ 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/event/Event.kt b/app/src/main/java/org/dslul/openboard/inputmethod/event/Event.kt index 7dfeb7a41..7f595d4a7 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/event/Event.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/event/Event.kt @@ -206,6 +206,13 @@ class Event private constructor(// The type of event - one of the constants abov null /* suggestedWordInfo */, FLAG_NONE, null /* next */) } + @JvmStatic + fun createSoftwareTextEvent(text: CharSequence?, keyCode: Int, next: Event): Event { + return Event(EVENT_TYPE_SOFTWARE_GENERATED_STRING, text, NOT_A_CODE_POINT, keyCode, + Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, + null /* suggestedWordInfo */, FLAG_NONE, next) + } + /** * Creates an input event representing the manual pick of a punctuation suggestion. * @return an event for this suggestion pick. diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/event/HangulCombiner.kt b/app/src/main/java/org/dslul/openboard/inputmethod/event/HangulCombiner.kt index c4b3c83b0..03aee483f 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/event/HangulCombiner.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/event/HangulCombiner.kt @@ -43,9 +43,7 @@ class HangulCombiner : Combiner { val currentSyllable = syllable ?: HangulSyllable() val jamo = HangulJamo.of(event.mCodePoint) if(!event.isCombining || jamo is HangulJamo.NonHangul) { - val text = combiningStateFeedback - reset() - return createEventChainFromSequence(text, event) + composingWord.append(jamo.string) } else { when(jamo) { is HangulJamo.Consonant -> { @@ -316,19 +314,8 @@ class HangulCombiner : Combiner { 0x11b8 to 0x11ba to 0x11b9, // ㅄ 0x11ba to 0x11ba to 0x11bb // ㅆ ) - private fun createEventChainFromSequence(text: CharSequence, originalEvent: Event?): Event? { - var index = text.length - if (index <= 0) { - return originalEvent - } - var lastEvent: Event? = originalEvent - do { - val codePoint = Character.codePointBefore(text, index) - lastEvent = Event.Companion.createHardwareKeypressEvent(codePoint, - originalEvent!!.mKeyCode, lastEvent, false /* isKeyRepeat */) - index -= Character.charCount(codePoint) - } while (index > 0) - return lastEvent + private fun createEventChainFromSequence(text: CharSequence, originalEvent: Event): Event { + return Event.createSoftwareTextEvent(text, Constants.CODE_OUTPUT_TEXT, originalEvent); } } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/KoreanDictionary.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/KoreanDictionary.java index 9f17573d2..e6c49ed23 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/KoreanDictionary.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/KoreanDictionary.java @@ -26,9 +26,9 @@ public class KoreanDictionary extends Dictionary { private String processInput(String input) { String normalized = Normalizer.normalize(input, Normalizer.Form.NFD); StringBuilder result = new StringBuilder(); - for(char c : normalized.toCharArray()) { + for (char c : normalized.toCharArray()) { int index = COMPAT_JAMO.indexOf(c); - if(index == -1) result.append(c); + if (index == -1) result.append(c); else result.append(STANDARD_JAMO.charAt(index)); } return result.toString(); @@ -43,7 +43,7 @@ public class KoreanDictionary extends Dictionary { composedData = new ComposedData(composedData.mInputPointers, composedData.mIsBatchMode, processInput(composedData.mTypedWord)); ArrayList suggestions = mDictionary.getSuggestions(composedData, ngramContext, proximityInfoHandle, settingsValuesForSuggestion, sessionId, weightForLocale, inOutWeightOfLangModelVsSpatialModel); ArrayList result = new ArrayList<>(); - for(SuggestedWords.SuggestedWordInfo info : suggestions) { + for (SuggestedWords.SuggestedWordInfo info : suggestions) { result.add(new SuggestedWords.SuggestedWordInfo(processOutput(info.mWord), info.mPrevWordsContext, info.mScore, info.mKindAndFlags, info.mSourceDict, info.mIndexOfTouchPointOfSecondWord, info.mAutoCommitFirstWordConfidence)); } @@ -67,6 +67,8 @@ public class KoreanDictionary extends Dictionary { @Override protected boolean same(char[] word, int length, String typedWord) { + word = processInput(new String(word)).toCharArray(); + typedWord = processInput(typedWord); return mDictionary.same(word, length, typedWord); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java index f0d2feb50..7e996cf4a 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java @@ -702,6 +702,9 @@ public final class InputLogic { // line, so that does affect the contents of the editor. inputTransaction.setDidAffectContents(); break; + case Constants.CODE_OUTPUT_TEXT: + mWordComposer.applyProcessedEvent(event); + break; default: throw new RuntimeException("Unknown key code : " + event.getMKeyCode()); }