From dbb291fb869d885de8c26b05d378f9d11560389e Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Mon, 27 Aug 2018 11:18:46 +0200 Subject: [PATCH] implement a new way to select additional fields in the keyboard, closes https://github.com/PhilippC/keepass2android/issues/377 --- .../app/src/main/AndroidManifest.xml | 1 + .../kbbridge/KeyboardData.java | 8 +- .../kbbridge/KeyboardDataBuilder.java | 7 ++ .../softkeyboard/IKeyboardService.java | 9 ++ .../softkeyboard/KP2AKeyboard.java | 96 ++++++++++++++----- .../softkeyboard/Kp2aDialog.java | 14 +-- .../softkeyboard/LatinKeyboardView.java | 1 + .../app/src/main/res/values/keycodes.xml | 1 + .../app/src/main/res/values/strings.xml | 1 + .../app/src/main/res/xml-pl/kbd_kp2a.xml | 15 ++- .../app/src/main/res/xml/kbd_kp2a.xml | 15 ++- .../app/src/main/res/xml/kbd_kp2a_black.xml | 19 ++-- 12 files changed, 132 insertions(+), 55 deletions(-) create mode 100644 src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/IKeyboardService.java diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/AndroidManifest.xml b/src/java/KP2ASoftkeyboard_AS/app/src/main/AndroidManifest.xml index 1a078d27..e956bbbd 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/AndroidManifest.xml +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ android:resource="@xml/accserviceconfig" /> diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardData.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardData.java index 6f939a5d..ce02f7a1 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardData.java +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardData.java @@ -10,20 +10,18 @@ public class KeyboardData public static List availableFields = new ArrayList(); public static String entryName; public static String entryId; + + public static int kp2aFieldIndex = 0; public static boolean hasData() { return !TextUtils.isEmpty(entryId); } - - public static boolean bla2() - { - return !TextUtils.isEmpty(entryId); - } public static void clear() { availableFields.clear(); entryName = entryId = ""; + kp2aFieldIndex = 0; } } diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardDataBuilder.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardDataBuilder.java index e2dee9f6..1d14606c 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardDataBuilder.java +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/kbbridge/KeyboardDataBuilder.java @@ -1,6 +1,10 @@ package keepass2android.kbbridge; import java.util.ArrayList; import java.util.HashMap; + +import keepass2android.softkeyboard.IKeyboardService; +import keepass2android.softkeyboard.KP2AKeyboard; + public class KeyboardDataBuilder { private ArrayList availableFields = new ArrayList(); @@ -16,5 +20,8 @@ public class KeyboardDataBuilder { public void commit() { KeyboardData.availableFields = this.availableFields; + KeyboardData.kp2aFieldIndex = 0; + if (KP2AKeyboard.CurrentlyRunningService != null) + KP2AKeyboard.CurrentlyRunningService.onNewData(); } } diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/IKeyboardService.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/IKeyboardService.java new file mode 100644 index 00000000..b6f81b9d --- /dev/null +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/IKeyboardService.java @@ -0,0 +1,9 @@ +package keepass2android.softkeyboard; + +import keepass2android.kbbridge.StringForTyping; + +public interface IKeyboardService +{ + void commitStringForTyping(StringForTyping stringForTyping); + void onNewData(); +} diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java index 75b326dd..c47ba66c 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java @@ -62,6 +62,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.LinearLayout; import android.widget.PopupWindow; +import keepass2android.kbbridge.KeyboardData; import keepass2android.kbbridge.StringForTyping; import keepass2android.softkeyboard.LatinIMEUtil.RingCharBuffer; @@ -71,16 +72,13 @@ import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; - -interface IKeyboardService -{ - void commitStringForTyping(StringForTyping stringForTyping); -} +import java.util.Objects; /** * Input method implementation for Qwerty'ish keyboard. @@ -1086,6 +1084,7 @@ public class KP2AKeyboard extends InputMethodService private void reloadKeyboards() { mKeyboardSwitcher.setLanguageSwitcher(mLanguageSwitcher); mKeyboardSwitcher.makeKeyboards(true); + updateKp2aKeyLabels(); } private void commitTyped(InputConnection inputConnection) { @@ -1275,6 +1274,9 @@ public class KP2AKeyboard extends InputMethodService case LatinKeyboardView.KEYCODE_OPTIONS: onOptionKeyPressed(); break; + case LatinKeyboardView.KEYCODE_KP2A_NEXTFIELDS: + onKp2aNextFieldsPressed(); + break; case LatinKeyboardView.KEYCODE_KP2A: onKp2aKeyPressed(); break; @@ -1363,28 +1365,72 @@ public class KP2AKeyboard extends InputMethodService } private void onKp2aPasswordKeyPressed() { - commitStringForTyping(findStringForTyping("Password")); + commitStringForTyping(KeyboardData.availableFields.get(KeyboardData.kp2aFieldIndex+1)); } - private StringForTyping findStringForTyping(String key) { - - for (StringForTyping s: keepass2android.kbbridge.KeyboardData.availableFields) - { - if (key.equals(s.key)) - { - return s; - } - } - //found nothing: return empty struct: - return new StringForTyping(); - } private void onKp2aUserKeyPressed() { - commitStringForTyping(findStringForTyping("UserName")); + commitStringForTyping(KeyboardData.availableFields.get(KeyboardData.kp2aFieldIndex)); } - private void onKp2aKeyPressed() { + + + private void onKp2aNextFieldsPressed() + { + + List availableFields = keepass2android.kbbridge.KeyboardData.availableFields; + if (KeyboardData.kp2aFieldIndex >= availableFields.size()-2) + { + KeyboardData.kp2aFieldIndex = 0; + } + else if (KeyboardData.kp2aFieldIndex == availableFields.size()-3) + { + KeyboardData.kp2aFieldIndex++; + } + else + KeyboardData.kp2aFieldIndex += 2; + + updateKp2aKeyLabels(); + } + + private void updateKp2aKeyLabels() { + for (Keyboard.Key key : mKeyboardSwitcher.getInputView().getKeyboard().getKeys()) { + + boolean isFirstKey = false; + boolean isSecondKey = false; + for (int code : key.codes) { + if (code == -201) + isFirstKey = true; + if (code == -202) + isSecondKey = true; + } + + + int fieldIndex = -1; + if (isFirstKey) { + fieldIndex = KeyboardData.kp2aFieldIndex; + } + if (isSecondKey) + { + fieldIndex = KeyboardData.kp2aFieldIndex+1; + } + if (fieldIndex >= 0) + { + String displayName = KeyboardData.availableFields.get(fieldIndex).displayName; + if ("Password".equals(KeyboardData.availableFields.get(fieldIndex).key)) + displayName = getString(R.string.kp2a_password); //might be a shorter variant + if ("UserName".equals(KeyboardData.availableFields.get(fieldIndex).key )) + displayName = getString(R.string.kp2a_user); //might be a shorter variant + key.label = displayName; + } + mKeyboardSwitcher.getInputView().invalidateAllKeys(); + } + } + + private void onKp2aKeyPressed() { + + if ((mKeyboardSwitcher.getKeyboardMode() == KeyboardSwitcher.MODE_KP2A) || (!mKp2aEnableSimpleKeyboard) || (!keepass2android.kbbridge.KeyboardData.hasData())) @@ -1417,7 +1463,6 @@ public class KP2AKeyboard extends InputMethodService i.putExtra("clientPackageName", clientPackageName); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); - } public void commitStringForTyping(StringForTyping theItem) { @@ -1439,8 +1484,13 @@ public class KP2AKeyboard extends InputMethodService commitKp2aString(theItem.value, getCurrentInputEditorInfo()); } - - public void onText(CharSequence text) { + @Override + public void onNewData() { + updateKp2aKeyLabels(); + } + + + public void onText(CharSequence text) { InputConnection ic = getCurrentInputConnection(); if (ic == null) return; if (text == null) diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/Kp2aDialog.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/Kp2aDialog.java index a532254a..56f19660 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/Kp2aDialog.java +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/Kp2aDialog.java @@ -26,19 +26,13 @@ public class Kp2aDialog extends Activity { getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + setContentView(R.layout.activity_kp2a_dialog); ListView listview = ((ListView)findViewById(R.id.mylist)); final String clientPackageName = getIntent().getStringExtra("clientPackageName"); - List availableFields = keepass2android.kbbridge.KeyboardData.availableFields; - - - final ArrayList items = new ArrayList(); - for (StringForTyping entry : availableFields) - { - items.add(entry.clone()); - } + @@ -117,11 +111,11 @@ public class Kp2aDialog extends Activity { StringForTyping theItem = items.get(item); - Kp2aDialog.this.finish(); KP2AKeyboard.CurrentlyRunningService.commitStringForTyping(theItem); - } + Kp2aDialog.this.finish(); + } }); diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/LatinKeyboardView.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/LatinKeyboardView.java index edc87fe0..dbd3e26c 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/LatinKeyboardView.java +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/LatinKeyboardView.java @@ -43,6 +43,7 @@ public class LatinKeyboardView extends LatinKeyboardBaseView { static final int KEYCODE_KP2A_ALPHA = -203; static final int KEYCODE_KP2A_SWITCH = -204; static final int KEYCODE_KP2A_LOCK = -205; + static final int KEYCODE_KP2A_NEXTFIELDS = -206; private Keyboard mPhoneKeyboard; diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/keycodes.xml b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/keycodes.xml index 3dd1f36f..dc4e97f0 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/keycodes.xml +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/keycodes.xml @@ -35,6 +35,7 @@ -203 -204 -205 + -206 diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/strings.xml b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/strings.xml index ca4fc851..f4c674f2 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/strings.xml +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/values/strings.xml @@ -376,6 +376,7 @@ Android keyboard Debug settings Debug Mode + ]]> diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml-pl/kbd_kp2a.xml b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml-pl/kbd_kp2a.xml index 98a37c8c..5bddde42 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml-pl/kbd_kp2a.xml +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml-pl/kbd_kp2a.xml @@ -12,32 +12,37 @@ + diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a.xml b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a.xml index 2a2c3029..7e9e7ef6 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a.xml +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a.xml @@ -12,32 +12,37 @@ + diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a_black.xml b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a_black.xml index cba42bf1..9fbf4850 100644 --- a/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a_black.xml +++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/res/xml/kbd_kp2a_black.xml @@ -12,32 +12,37 @@ + android:keyWidth="19%p" + /> + android:keyWidth="19%p" + /> +