From 49b3ace1dcbc3cd224531ee64ec5fe3b9a6347ee Mon Sep 17 00:00:00 2001
From: green-green-avk <45503261+green-green-avk@users.noreply.github.com>
Date: Sun, 13 Sep 2020 11:25:37 -0700
Subject: [PATCH] https://github.com/green-green-avk/AnotherTerm/issues/12 -
allow to map VOLUME UP/DOWN
---
.../java/green_green_avk/anotherterm/App.java | 12 +++++------
.../anotherterm/HwKeyMapEditorFragment.java | 13 +++++++-----
.../anotherterm/HwKeyMapManager.java | 20 ++++++++++++++-----
.../anotherterm/HwKeyMapTable.java | 10 ++++------
app/src/main/res/values/strings.xml | 9 +++++----
5 files changed, 38 insertions(+), 26 deletions(-)
diff --git a/app/src/main/java/green_green_avk/anotherterm/App.java b/app/src/main/java/green_green_avk/anotherterm/App.java
index 7f1a3937..c935a914 100644
--- a/app/src/main/java/green_green_avk/anotherterm/App.java
+++ b/app/src/main/java/green_green_avk/anotherterm/App.java
@@ -65,12 +65,12 @@ protected void onAfterChange(@NonNull final String key, @Nullable final Object v
}
public final Settings settings = new Settings();
- private static Settings sSettings = null;
+// private static Settings sSettings = null;
- @Nullable
- public static Settings getSettings() {
- return sSettings;
- }
+// @Nullable
+// public static Settings getSettings() {
+// return sSettings;
+// }
public ScratchpadManager scratchpadManager = null;
@@ -87,7 +87,7 @@ public void onCreate() {
super.onCreate();
PluginsManager.init(this);
settings.init(this, PreferenceManager.getDefaultSharedPreferences(this));
- sSettings = settings;
+// sSettings = settings;
FontsManager.init(this);
FontsManager.setFrom(settings.terminal_font_default_fromfiles);
TermKeyMapManager.init(this);
diff --git a/app/src/main/java/green_green_avk/anotherterm/HwKeyMapEditorFragment.java b/app/src/main/java/green_green_avk/anotherterm/HwKeyMapEditorFragment.java
index 0b4ff326..fe14060a 100644
--- a/app/src/main/java/green_green_avk/anotherterm/HwKeyMapEditorFragment.java
+++ b/app/src/main/java/green_green_avk/anotherterm/HwKeyMapEditorFragment.java
@@ -24,11 +24,14 @@
import green_green_avk.anotherterm.ui.HwKeyMap;
public final class HwKeyMapEditorFragment extends Fragment {
- private static final int[] devIdsDict = new int[HwKeyMapTable.DEV_IDS_NUM];
+ private static final int[] devIdsDict = new int[]{
+ R.string.label_dev_built_in,
+ R.string.label_dev_external
+ };
- static {
- devIdsDict[HwKeyMapTable.BUILT_IN] = R.string.label_built_in;
- devIdsDict[HwKeyMapTable.EXTERNAL] = R.string.label_external;
+ private int getDevIdLabel(final int devId) {
+ if (devId < 0 || devId >= devIdsDict.length) return R.string.label_dev_unknown;
+ return devIdsDict[devId];
}
private final class ToKeycode {
@@ -121,7 +124,7 @@ public View getView(final int position, final View convertView, final ViewGroup
.inflate(R.layout.hw_key_map_editor_entry, parent, false);
final HwKeyMapTable.Entry entry = keymap.getEntry(position);
v.findViewById(R.id.keycode).setText(TermKeyMap.keyCodeToString(entry.keycode));
- v.findViewById(R.id.devId).setText(devIdsDict[entry.devId]);
+ v.findViewById(R.id.devId).setText(getDevIdLabel(entry.devId));
final Spinner wToKeycode = v.findViewById(R.id.toKeycode);
final List al = KeyEvent.isModifierKey(entry.keycode) ?
toKeycodeListForModifiers : toKeycodeList;
diff --git a/app/src/main/java/green_green_avk/anotherterm/HwKeyMapManager.java b/app/src/main/java/green_green_avk/anotherterm/HwKeyMapManager.java
index ac35c9c9..192b4f6f 100644
--- a/app/src/main/java/green_green_avk/anotherterm/HwKeyMapManager.java
+++ b/app/src/main/java/green_green_avk/anotherterm/HwKeyMapManager.java
@@ -2,6 +2,7 @@
import android.content.Context;
import android.content.SharedPreferences;
+import android.os.Build;
import android.util.SparseIntArray;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
@@ -66,20 +67,29 @@ public static void set(@NonNull final HwKeyMap hwKeyMap) {
else throw new IllegalArgumentException("Unable to process this HwKeyMap type");
}
+ public static boolean isVirtual(@NonNull final KeyEvent event) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ return event.getDevice().isVirtual();
+ return event.getDeviceId() == KeyCharacterMap.VIRTUAL_KEYBOARD;
+ }
+
+ public static boolean isExternal(@NonNull final KeyEvent event) {
+ // We can only guess before API 29.
+ return event.getDeviceId() > KeyCharacterMap.SPECIAL_FUNCTION;
+ }
+
public static boolean isBypassKey(@NonNull final KeyEvent event) {
if ((event.getSource() & InputDevice.SOURCE_ANY & (
InputDevice.SOURCE_MOUSE
| InputDevice.SOURCE_STYLUS
| InputDevice.SOURCE_TRACKBALL
)) != 0) return true; // Mouse right & middle buttons...
- if (event.getDeviceId() == KeyCharacterMap.VIRTUAL_KEYBOARD) return event.isSystem();
- if (event.getDeviceId() <= KeyCharacterMap.SPECIAL_FUNCTION)
+ if (isVirtual(event)) return event.isSystem();
+ if (!isExternal(event))
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_HOME:
- case KeyEvent.KEYCODE_VOLUME_UP: // Font size.
- case KeyEvent.KEYCODE_VOLUME_DOWN: // Font size.
case KeyEvent.KEYCODE_POWER:
- return true; // Don't prevent default behavior.
+ return true; // Just in case.
}
return false;
}
diff --git a/app/src/main/java/green_green_avk/anotherterm/HwKeyMapTable.java b/app/src/main/java/green_green_avk/anotherterm/HwKeyMapTable.java
index 3bf7f413..840cc371 100644
--- a/app/src/main/java/green_green_avk/anotherterm/HwKeyMapTable.java
+++ b/app/src/main/java/green_green_avk/anotherterm/HwKeyMapTable.java
@@ -1,7 +1,6 @@
package green_green_avk.anotherterm;
import android.util.SparseIntArray;
-import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
@@ -11,18 +10,17 @@
public final class HwKeyMapTable extends HwKeyMap {
public static final int BUILT_IN = 0;
public static final int EXTERNAL = 1;
- public static final int DEV_IDS_NUM = 2;
private final SparseIntArray map = new SparseIntArray();
private int key(final int keycode, final int devId) {
- return (keycode & 0xFFFF) | ((devId & 0xFFFF) << 16);
+ return (keycode & 0xFFFF) | (devId << 16);
}
@Override
public int getDevId(@NonNull final KeyEvent event) {
- if (event.getDeviceId() == KeyCharacterMap.VIRTUAL_KEYBOARD) return -1; // Of no use.
- return event.getDeviceId() <= KeyCharacterMap.SPECIAL_FUNCTION ? BUILT_IN : EXTERNAL;
+ if (HwKeyMapManager.isVirtual(event)) return -1; // Of no use.
+ return HwKeyMapManager.isExternal(event) ? EXTERNAL : BUILT_IN;
}
@Override
@@ -44,7 +42,7 @@ static final class Entry {
private Entry(final int key, final int toKeycode) {
keycode = key & 0xFFFF;
- devId = key >>> 16;
+ devId = key >> 16;
this.toKeycode = toKeycode;
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9528464a..f32133d9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -258,8 +258,6 @@
Please, don\'t hesitate report anything you have doubts about:
it\'s an experimental feature.
- VOLUME_UP and VOLUME_DOWN buttons
- are already used for font size adjustment and thus cannot be mapped.
- \"Block\" means \"Completely turn off a key\"
- \"Bypass\" means \"Bypass as is and use to determine the final key code only,
@@ -271,10 +269,13 @@
Android own modifier flags are used by default
but in some cases they could be broken by IME.
Mapping a modifier key to itself could help in this case.
+ Note: This application own screen keyboard is not affected by and does not affect
+ Android soft input / hardware keyboard modifier keys state.
]]>
Press a key to add
- Built-in
- External
+ Unknown
+ Built-in
+ External
Block
Bypass