From c6edb5a7263f9abab67691bb0c17d7cd301e7333 Mon Sep 17 00:00:00 2001 From: Dimo Karaivanov Date: Tue, 1 Aug 2023 10:29:03 +0300 Subject: [PATCH] On-screen keyboard improvements (#323) * holding a number key to type a number in text modes is now possible using the on-screen keyboard * accented letters are no longer displayed on the on-screen keyboard, just plain A-Z * the on-screen keyboard is now more compact; * improved color scheme and other small visual enhancements --- res/drawable/button_background.xml | 4 +- res/layout/main_numpad.xml | 136 +++++++++--------- res/values/colors.xml | 6 +- res/values/dimens.xml | 9 +- .../sspanak/tt9/languages/Language.java | 23 ++- .../sspanak/tt9/ui/main/MainLayoutNumpad.java | 8 +- .../sspanak/tt9/ui/main/keys/SoftKey.java | 1 - .../tt9/ui/main/keys/SoftNumberKey.java | 21 ++- 8 files changed, 121 insertions(+), 87 deletions(-) diff --git a/res/drawable/button_background.xml b/res/drawable/button_background.xml index 84f2e578..19df582a 100644 --- a/res/drawable/button_background.xml +++ b/res/drawable/button_background.xml @@ -2,7 +2,7 @@ diff --git a/res/layout/main_numpad.xml b/res/layout/main_numpad.xml index d1ddf2cb..bd686326 100644 --- a/res/layout/main_numpad.xml +++ b/res/layout/main_numpad.xml @@ -5,28 +5,65 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + + - + - + - + + + + + + + + + + + + - - - - - - - - - - - - - @@ -129,7 +122,7 @@ style="@android:style/Widget.Holo.Button.Borderless" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="1" + android:layout_weight="@dimen/numpad_control_key_layout_weight" android:text="⌫" android:textSize="@dimen/soft_key_icon_size" /> @@ -145,7 +138,7 @@ style="@android:style/Widget.Holo.Button.Borderless" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="1" + android:layout_weight="@dimen/numpad_control_key_layout_weight" android:text="+" android:textStyle="bold" /> @@ -184,7 +177,7 @@ + android:layout_weight="@dimen/numpad_control_key_layout_weight" /> @@ -198,7 +191,7 @@ style="@android:style/Widget.Holo.Button.Borderless" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="1" + android:layout_weight="@dimen/numpad_control_key_layout_weight" android:text="⌨️" android:textSize="@dimen/soft_key_icon_size" /> @@ -234,10 +227,13 @@ android:id="@+id/separator_3_2" style="@style/numSeparator" /> - + android:layout_height="wrap_content" + android:layout_weight="@dimen/numpad_control_key_layout_weight" + android:text="Fltr" /> @@ -252,7 +248,7 @@ style="@android:style/Widget.Holo.Button.Borderless" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="1" + android:layout_weight="@dimen/numpad_control_key_layout_weight" android:text="🌐" /> diff --git a/res/values/colors.xml b/res/values/colors.xml index fb6a1de4..3fc4264d 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -3,12 +3,12 @@ #242424 - #CECECE + #D3D3D3 #202020 - #AAAAAA + #B8B8B8 #888888 - #E7F0E7 + #E7E7E7 #CCC diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 7139e6fb..a5fdec0e 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -15,11 +15,14 @@ 19sp - 15dp + 2dp + 0dp + 56dp - 10dp + 36dp + 0.85 17sp - 32dp + 38dp 36dp diff --git a/src/io/github/sspanak/tt9/languages/Language.java b/src/io/github/sspanak/tt9/languages/Language.java index 28ecf03b..a029a302 100644 --- a/src/io/github/sspanak/tt9/languages/Language.java +++ b/src/io/github/sspanak/tt9/languages/Language.java @@ -12,13 +12,11 @@ public class Language { protected String name; protected Locale locale; protected String dictionaryFile; + protected boolean hasUpperCase = true; protected String abcString; protected final ArrayList> layout = new ArrayList<>(); private final HashMap characterKeyMap = new HashMap<>(); - // settings - protected boolean hasUpperCase = true; - public static Language fromDefinition(LanguageDefinition definition) throws Exception { if (definition.dictionaryFile.isEmpty()) { @@ -149,6 +147,25 @@ public class Language { return hasUpperCase; } + /** + * isLatinBased + * Returns "true" when the language is based on the Latin alphabet or "false" otherwise. + * WARNING: This performs somewhat resource-intensive operations every time, so consider + * caching the result. + */ + public boolean isLatinBased() { + ArrayList letters = getKeyCharacters(2, false); + return letters.contains("a"); + } + + /** + * isGreek + * Similar to "isLatinBased()", this returns "true" when the language is based on the Greek alphabet. + */ + public boolean isGreek() { + ArrayList letters = getKeyCharacters(2, false); + return letters.contains("α"); + } /* ************ utility ************ */ diff --git a/src/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java b/src/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java index d9c7a026..941164be 100644 --- a/src/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java +++ b/src/io/github/sspanak/tt9/ui/main/MainLayoutNumpad.java @@ -72,13 +72,19 @@ class MainLayoutNumpad extends BaseMainLayout { } } + ViewGroup statusBarContainer = view.findViewById(R.id.status_bar_container); + keys.addAll(getKeysFromContainer(statusBarContainer)); + return keys; } protected ArrayList getSeparators() { // it's fine... it's shorter, faster and easier to read than searching with 3 nested loops return new ArrayList<>(Arrays.asList( - view.findViewById(R.id.separator_0), + view.findViewById(R.id.separator_top), + view.findViewById(R.id.separator_candidates_1), + view.findViewById(R.id.separator_candidates_2), + view.findViewById(R.id.separator_candidates_bottom), view.findViewById(R.id.separator_1_1), view.findViewById(R.id.separator_1_2), view.findViewById(R.id.separator_2_1), diff --git a/src/io/github/sspanak/tt9/ui/main/keys/SoftKey.java b/src/io/github/sspanak/tt9/ui/main/keys/SoftKey.java index 51259d6c..3d4875d0 100644 --- a/src/io/github/sspanak/tt9/ui/main/keys/SoftKey.java +++ b/src/io/github/sspanak/tt9/ui/main/keys/SoftKey.java @@ -136,7 +136,6 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement int keyId = getId(); if (keyId == R.id.soft_key_add_word) return tt9.onKeyAddWord(); - if (keyId == R.id.soft_key_clear_filter) return tt9.onKeyFilterClear(); if (keyId == R.id.soft_key_filter_suggestions) return tt9.onKeyFilterSuggestions(repeat); if (keyId == R.id.soft_key_left_arrow) return tt9.onKeyPreviousSuggestion(); if (keyId == R.id.soft_key_right_arrow) return tt9.onKeyNextSuggestion(); diff --git a/src/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java b/src/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java index ad19c292..9698dc4a 100644 --- a/src/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java +++ b/src/io/github/sspanak/tt9/ui/main/keys/SoftNumberKey.java @@ -28,13 +28,13 @@ public class SoftNumberKey extends SoftKey { @Override protected boolean handleHold() { - if (tt9 == null || tt9.getInputMode() != InputMode.MODE_123 || getId() != R.id.soft_key_0) { + if (tt9 == null) { return super.handleHold(); } preventRepeat(); - int zeroCode = Key.numberToCode(0); - tt9.onKeyLongPress(zeroCode, new KeyEvent(KeyEvent.ACTION_DOWN, zeroCode)); + int keyCode = Key.numberToCode(getNumber(getId())); + tt9.onKeyLongPress(keyCode, new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); return true; } @@ -95,11 +95,24 @@ public class SoftNumberKey extends SoftKey { return ""; } + boolean isLatinBased = language.isLatinBased(); + boolean isGreekBased = language.isGreek(); + StringBuilder sb = new StringBuilder(); ArrayList chars = language.getKeyCharacters(number, false); for (int i = 0; i < 5 && i < chars.size(); i++) { + String currentLetter = chars.get(i); + if ( + (isLatinBased && currentLetter.charAt(0) > 'z') + || (isGreekBased && (currentLetter.charAt(0) < 'α' || currentLetter.charAt(0) > 'ω')) + ) { + // As suggested by the community, there is no need to display the accented letters. + // People are used to seeing just A-Z. + continue; + } + sb.append( - tt9.getTextCase() == InputMode.CASE_UPPER ? chars.get(i).toUpperCase(language.getLocale()) : chars.get(i) + tt9.getTextCase() == InputMode.CASE_UPPER ? currentLetter.toUpperCase(language.getLocale()) : currentLetter ); }