From ec1a91d1e09c859445fff7be1bec42dbab6d45a8 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Tue, 17 Oct 2023 20:57:02 +0200 Subject: [PATCH] don't reload when moving cursor within a word using space bar gesture gives performance improvement noticeable at least on slow phones --- .../openboard/inputmethod/latin/LatinIME.java | 13 +++++++++++-- .../inputmethod/latin/RichInputConnection.java | 15 +++++++++++---- .../inputmethod/latin/inputlogic/InputLogic.java | 4 ++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java index 5811441bd..297ef6376 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java @@ -56,6 +56,8 @@ import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.CoordinateUtils; import org.dslul.openboard.inputmethod.latin.common.InputPointers; +import org.dslul.openboard.inputmethod.latin.common.StringUtils; +import org.dslul.openboard.inputmethod.latin.common.StringUtilsKt; import org.dslul.openboard.inputmethod.latin.define.DebugFlags; import org.dslul.openboard.inputmethod.latin.define.ProductionFlags; import org.dslul.openboard.inputmethod.latin.inputlogic.InputLogic; @@ -1397,8 +1399,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // for RTL languages we want to invert pointer movement if (mRichImm.getCurrentSubtype().isRtlSubtype()) steps = -steps; - - mInputLogic.finishInput(); + if (steps < 0) { int availableCharacters = mInputLogic.mConnection.getTextBeforeCursor(64, 0).length(); steps = availableCharacters < -steps ? -availableCharacters : steps; @@ -1409,6 +1410,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } else return; + if (mInputLogic.moveCursorByAndReturnIfInsideComposingWord(steps)) { + // no need to finish input and restart suggestions if we're still in the word + // this is a noticeable performance improvement + int newPosition = mInputLogic.mConnection.mExpectedSelStart + steps; + mInputLogic.mConnection.setSelection(newPosition, newPosition); + return; + } + mInputLogic.finishInput(); int newPosition = mInputLogic.mConnection.mExpectedSelStart + steps; mInputLogic.mConnection.setSelection(newPosition, newPosition); mInputLogic.restartSuggestionsOnWordTouchedByCursor(mSettings.getCurrent(), mKeyboardSwitcher.getCurrentKeyboardScriptId()); diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java index 3c6b6f430..1c79e50df 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java @@ -241,6 +241,10 @@ public final class RichInputConnection implements PrivateCommandPerformer { */ private boolean reloadTextCache() { mCommittedTextBeforeComposingText.setLength(0); + // Clearing composing text was not in original AOSP and OpenBoard, but why? should actually + // be necessary when reloading text. Only when called by setSelection, mComposingText isn't + // always empty, but looks like things still work normally + mComposingText.setLength(0); mIC = mParent.getCurrentInputConnection(); // Call upon the inputconnection directly since our own method is using the cache, and // we want to refresh it. @@ -382,14 +386,17 @@ public final class RichInputConnection implements PrivateCommandPerformer { spacingAndPunctuations, hasSpaceBefore); } - public int getCodePointBeforeCursor() { - final int length = mCommittedTextBeforeComposingText.length(); + public int getCodePointBeforeCursor() { // todo: behavior still correct? also should do this to getCharBeforeBeforeCursor + final CharSequence text = mComposingText.length() == 0 ? mCommittedTextBeforeComposingText : mComposingText; + final int length = text.length(); if (length < 1) return Constants.NOT_A_CODE; - return Character.codePointBefore(mCommittedTextBeforeComposingText, length); + return Character.codePointBefore(text, length); } - public int getCharBeforeBeforeCursor() { + public int getCharBeforeBeforeCursor() { // todo: behavior still correct? + if (mComposingText.length() >= 2) return mComposingText.charAt(mComposingText.length() - 2); final int length = mCommittedTextBeforeComposingText.length(); + if (mComposingText.length() == 1) return mCommittedTextBeforeComposingText.charAt(length - 1); if (length < 2) return Constants.NOT_A_CODE; return mCommittedTextBeforeComposingText.charAt(length - 2); } 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 a35708018..ac41e73ee 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 @@ -409,6 +409,10 @@ public final class InputLogic { return true; } + public boolean moveCursorByAndReturnIfInsideComposingWord(int distance) { + return mWordComposer.moveCursorByAndReturnIfInsideComposingWord(distance); + } + /** * React to a code input. It may be a code point to insert, or a symbolic value that influences * the keyboard behavior.