From 0228c5fd810f056cdcf18ad6537a6e4ab02eecaf Mon Sep 17 00:00:00 2001 From: sspanak Date: Tue, 27 Aug 2024 16:39:36 +0300 Subject: [PATCH] fixed SoftKey repeat sometimes being too fast --- .../sspanak/tt9/ime/modes/InputMode.java | 2 +- .../preferences/settings/SettingsStore.java | 2 +- .../tt9/ui/main/keys/SoftBackspaceKey.java | 21 +++++--------- .../tt9/ui/main/keys/SoftCommandKey.java | 4 ++- .../sspanak/tt9/ui/main/keys/SoftKey.java | 29 ++++++++++++------- .../sspanak/tt9/ui/main/keys/SoftKeyLF2.java | 3 +- .../sspanak/tt9/ui/main/keys/SoftKeyRF3.java | 4 +-- .../tt9/ui/main/keys/SoftNumberKey.java | 4 +-- 8 files changed, 37 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java b/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java index 17530565..62903891 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/modes/InputMode.java @@ -102,7 +102,7 @@ abstract public class InputMode { public boolean shouldDeletePrecedingSpace(InputType inputType) { return false; } public boolean shouldIgnoreText(String text) { return text == null || text.isEmpty(); } public boolean shouldSelectNextSuggestion() { return false; } - + public void reset() { autoAcceptTimeout = -1; specialCharSelectedGroup = -1; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsStore.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsStore.java index e1891b57..3923d6cd 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsStore.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsStore.java @@ -9,7 +9,6 @@ public class SettingsStore extends SettingsUI { /************* internal settings *************/ public static final int BACKSPACE_ACCELERATION_MAX_CHARS = 10; public static final int BACKSPACE_ACCELERATION_HARD_KEY_REPEAT_DEBOUNCE = 5; - public static final int BACKSPACE_ACCELERATION_SOFT_KEY_REPEAT_DEBOUNCE = 7; public final static int CLIPBOARD_PREVIEW_LENGTH = 20; public final static int CUSTOM_WORDS_IMPORT_MAX_LINES = 250; public final static int CUSTOM_WORDS_MAX = 1000; @@ -23,6 +22,7 @@ public class SettingsStore extends SettingsUI { public final static byte SLOW_QUERY_TIME = 50; // ms public final static int SOFT_KEY_DOUBLE_CLICK_DELAY = 500; // ms public final static int SOFT_KEY_REPEAT_DELAY = 40; // ms + public final static int SOFT_KEY_BACKSPACE_ACCELERATION_REPEAT_DELAY = SOFT_KEY_REPEAT_DELAY * BACKSPACE_ACCELERATION_HARD_KEY_REPEAT_DEBOUNCE; // ms public final static int SOFT_KEY_TITLE_SIZE = 18; // sp public final static float SOFT_KEY_COMPLEX_LABEL_TITLE_RELATIVE_SIZE = 0.55f; public final static float SOFT_KEY_COMPLEX_LABEL_ARABIC_TITLE_RELATIVE_SIZE = 0.72f; diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java index da6c73ef..fb36ae36 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftBackspaceKey.java @@ -11,7 +11,6 @@ import io.github.sspanak.tt9.ui.Vibration; public class SoftBackspaceKey extends SoftKey { private boolean hold; - private int repeatCount = 0; public SoftBackspaceKey(Context context) { super(context); @@ -29,23 +28,12 @@ public class SoftBackspaceKey extends SoftKey { final protected boolean handlePress() { super.handlePress(); hold = false; - repeatCount = 0; - return validateTT9Handler() && deleteText(); + return deleteText(); } @Override final protected void handleHold() { hold = true; - - if ( - validateTT9Handler() - && tt9.getSettings().getBackspaceAcceleration() - && ++repeatCount < SettingsStore.BACKSPACE_ACCELERATION_SOFT_KEY_REPEAT_DEBOUNCE - ) { - return; - } - - repeatCount = 0; deleteText(); } @@ -56,8 +44,13 @@ public class SoftBackspaceKey extends SoftKey { return true; } + @Override + final protected int getLongPressRepeatDelay() { + return tt9 != null && tt9.getSettings().getBackspaceAcceleration() ? SettingsStore.SOFT_KEY_BACKSPACE_ACCELERATION_REPEAT_DELAY : super.getLongPressRepeatDelay(); + } + private boolean deleteText() { - if (!tt9.onBackspace(hold && tt9.getSettings().getBackspaceAcceleration())) { + if (validateTT9Handler() && !tt9.onBackspace(hold && tt9.getSettings().getBackspaceAcceleration())) { // Limited or special numeric field (e.g. formatted money or dates) cannot always return // the text length, therefore onBackspace() seems them as empty and does nothing. This results // in fallback to the default hardware key action. Here we simulate the hardware BACKSPACE. diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftCommandKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftCommandKey.java index 168ce0ec..0d0c7d9c 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftCommandKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftCommandKey.java @@ -19,7 +19,9 @@ public class SoftCommandKey extends SoftNumberKey { public SoftCommandKey(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr);} - @Override protected void handleHold() {} + @Override protected void handleHold() { + preventRepeat(); + } @Override diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java index 13135cb7..2c7f3af1 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java @@ -34,6 +34,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement private boolean hold = false; private boolean repeat = false; + private long lastLongClickTime = 0; private final Handler repeatHandler = new Handler(Looper.getMainLooper()); private static int lastPressedKey = -1; @@ -98,11 +99,15 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement @Override public boolean onLongClick(View view) { - hold = true; - // sometimes this gets called twice, so we debounce the call to the repeating function - repeatHandler.removeCallbacks(this::repeatOnLongPress); - repeatHandler.postDelayed(this::repeatOnLongPress, 5); + final long now = System.currentTimeMillis(); + if (now - lastLongClickTime < SettingsStore.SOFT_KEY_DOUBLE_CLICK_DELAY) { + return false; + } + + hold = true; + lastLongClickTime = now; + repeatOnLongPress(); return true; } @@ -112,21 +117,25 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement * Repeatedly calls "handleHold()" upon holding the respective SoftKey, to simulate physical keyboard behavior. */ private void repeatOnLongPress() { - if (!validateTT9Handler()) { - hold = false; - return; - } - if (hold) { repeat = true; handleHold(); lastPressedKey = getId(); repeatHandler.removeCallbacks(this::repeatOnLongPress); - repeatHandler.postDelayed(this::repeatOnLongPress, SettingsStore.SOFT_KEY_REPEAT_DELAY); + repeatHandler.postDelayed(this::repeatOnLongPress, getLongPressRepeatDelay()); } } + /** + * Returns the delay between repeated calls to "handleHold()" when the SoftKey is being held. + * Used in "repeatOnLongPress()". + */ + protected int getLongPressRepeatDelay() { + return SettingsStore.SOFT_KEY_REPEAT_DELAY; + } + + /** * preventRepeat * Prevents "handleHold()" from being called repeatedly when the SoftKey is being held. diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyLF2.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyLF2.java index aa3c92b7..09be63cd 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyLF2.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyLF2.java @@ -13,11 +13,12 @@ public class SoftKeyLF2 extends SoftKey { @Override protected void handleHold() { + preventRepeat(); + if (!validateTT9Handler()) { return; } - preventRepeat(); vibrate(Vibration.getHoldVibration()); tt9.addWord(); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyRF3.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyRF3.java index 3fd281ee..0b588f03 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyRF3.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyRF3.java @@ -30,12 +30,12 @@ public class SoftKeyRF3 extends SoftKey { @Override protected void handleHold() { + preventRepeat(); + if (!validateTT9Handler() || isTextEdtingActive()) { return; } - preventRepeat(); - if (tt9.isVoiceInputActive()) { tt9.toggleVoiceInput(); } else { diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java index 34316898..ac6206ad 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java @@ -30,13 +30,13 @@ public class SoftNumberKey extends SoftKey { @Override protected void handleHold() { + preventRepeat(); + int keyCode = Key.numberToCode(getUpsideDownNumber(getId())); if (keyCode < 0 || !validateTT9Handler()) { return; } - preventRepeat(); - vibrate(Vibration.getHoldVibration()); tt9.onKeyLongPress(keyCode, new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); tt9.onKeyUp(keyCode, new KeyEvent(KeyEvent.ACTION_UP, keyCode));