From 6225448eeeb4ed5b0611300369fd6e4ce3c1a8f7 Mon Sep 17 00:00:00 2001 From: Dimo Karaivanov Date: Wed, 17 Apr 2024 17:23:40 +0300 Subject: [PATCH] Virtual keyboard minor bugfixes (#491) * prevent incorrect keycodes when holding the virtual number keys * fixed incorrect handling of unset hotkeys * fixed touch listeners being assigned to the wrong virtual key sometimes --- .../io/github/sspanak/tt9/ime/HotkeyHandler.java | 4 ++++ .../tt9/preferences/settings/SettingsHotkeys.java | 3 ++- .../github/sspanak/tt9/ui/main/keys/SoftKey.java | 15 +++++++++++---- .../tt9/ui/main/keys/SoftKeyInputMode.java | 2 +- .../sspanak/tt9/ui/main/keys/SoftNumberKey.java | 7 ++++--- app/src/main/res/layout/main_numpad.xml | 1 + app/src/main/res/layout/main_small.xml | 1 + 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java index e810ee21..aaf1dc69 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java @@ -63,6 +63,10 @@ public abstract class HotkeyHandler extends TypingHandler { public boolean onHotkey(int keyCode, boolean repeat, boolean validateOnly) { + if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { + return false; + } + if (keyCode == settings.getKeyAddWord()) { return onKeyAddWord(validateOnly); } diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java index 8fb66d43..b005affe 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHotkeys.java @@ -1,6 +1,7 @@ package io.github.sspanak.tt9.preferences.settings; import android.content.Context; +import android.view.KeyEvent; import io.github.sspanak.tt9.preferences.screens.hotkeys.SectionKeymap; @@ -40,7 +41,7 @@ class SettingsHotkeys extends SettingsHacks { public int getFunctionKey(String functionName) { - return getStringifiedInt(functionName, 0); + return getStringifiedInt(functionName, KeyEvent.KEYCODE_UNKNOWN); } 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 f074a90a..70d81c82 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 @@ -23,6 +23,8 @@ import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.util.Logger; public class SoftKey extends androidx.appcompat.widget.AppCompatButton implements View.OnTouchListener, View.OnLongClickListener { + private final String LOG_TAG = getClass().getSimpleName(); + protected TraditionalT9 tt9; protected float complexLabelTitleSize = SettingsStore.SOFT_KEY_COMPLEX_LABEL_TITLE_SIZE; @@ -63,8 +65,13 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement @Override protected void onFinishInflate() { super.onFinishInflate(); - getRootView().setOnTouchListener(this); - getRootView().setOnLongClickListener(this); + View keyView = findViewById(getId()); + if (keyView != null) { + keyView.setOnTouchListener(this); + keyView.setOnLongClickListener(this); + } else { + Logger.e(LOG_TAG, "Failed settings touch listeners. Cannot find SoftKey with ID: " + getId()); + } } @Override @@ -94,7 +101,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement // sometimes this gets called twice, so we debounce the call to the repeating function repeatHandler.removeCallbacks(this::repeatOnLongPress); - repeatHandler.postDelayed(this::repeatOnLongPress, 1); + repeatHandler.postDelayed(this::repeatOnLongPress, 5); return true; } @@ -155,7 +162,7 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement protected boolean validateTT9Handler() { if (tt9 == null) { - Logger.w(getClass().getCanonicalName(), "Traditional T9 handler is not set. Ignoring key press."); + Logger.w(LOG_TAG, "Traditional T9 handler is not set. Ignoring key press."); return false; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyInputMode.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyInputMode.java index f8af1c3f..cffc318b 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyInputMode.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyInputMode.java @@ -4,7 +4,7 @@ import android.content.Context; import android.util.AttributeSet; public class SoftKeyInputMode extends SoftKey { - public SoftKeyInputMode(Context context) { + public SoftKeyInputMode(Context context) { super(context); } 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 ed03cb1a..bea9e19f 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 @@ -29,12 +29,13 @@ public class SoftNumberKey extends SoftKey { @Override protected boolean handleHold() { - if (tt9 == null) { - return super.handleHold(); + int keyCode = Key.numberToCode(getUpsideDownNumber(getId())); + if (keyCode < 0 || !validateTT9Handler()) { + return false; } preventRepeat(); - int keyCode = Key.numberToCode(getUpsideDownNumber(getId())); + tt9.onKeyLongPress(keyCode, new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); tt9.onKeyUp(keyCode, new KeyEvent(KeyEvent.ACTION_UP, keyCode)); diff --git a/app/src/main/res/layout/main_numpad.xml b/app/src/main/res/layout/main_numpad.xml index b58ab460..1c43a572 100644 --- a/app/src/main/res/layout/main_numpad.xml +++ b/app/src/main/res/layout/main_numpad.xml @@ -127,6 +127,7 @@