From 77bb35ec80614ebaeeb66b2a967ae32a4d2e34da Mon Sep 17 00:00:00 2001 From: neverwin Date: Fri, 6 Apr 2018 18:11:57 +0800 Subject: [PATCH 01/20] add support of configurable extra keys --- .../java/com/termux/app/ExtraKeysView.java | 20 +++++++++---------- .../java/com/termux/app/TermuxActivity.java | 6 ++++++ .../com/termux/app/TermuxPreferences.java | 13 ++++++++++++ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 827772bdf2..e4e1ef697a 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -33,8 +33,6 @@ public final class ExtraKeysView extends GridLayout { public ExtraKeysView(Context context, AttributeSet attrs) { super(context, attrs); - - reload(); } static void sendKey(View view, String keyName) { @@ -148,24 +146,24 @@ void popup(View view, String text) { popupWindow.showAsDropDown(view, 0, -2 * height); } - void reload() { + void reload(final String[][] buttons) { altButton = controlButton = null; removeAllViews(); - String[][] buttons = { - {"ESC", "/", "―", "HOME", "↑", "END", "PGUP"}, - {"TAB", "CTRL", "ALT", "←", "↓", "→", "PGDN"} - }; - + int mx = 0; + for (int row = 0; row < rows; row++) { + if(buttons[row].length > mx) mx = buttons[row].length; + } final int rows = buttons.length; - final int[] cols = {buttons[0].length, buttons[1].length}; + final int cols = mx; setRowCount(rows); setColumnCount(cols[0]); for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols[row]; col++) { - final String buttonText = buttons[row][col]; + for (int col = 0; col < cols; col++) { + final String buttonText = (buttons[row][col] == null ? " " : buttons[row][col]); + Button button; switch (buttonText) { case "CTRL": diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index d50ab4304e..65171a7fd7 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -217,6 +217,11 @@ public void onCreate(Bundle bundle) { final ViewPager viewPager = findViewById(R.id.viewpager); if (mSettings.isShowExtraKeys()) viewPager.setVisibility(View.VISIBLE); + + + ViewGroup.LayoutParams layoutParams = viewPager.getLayoutParams(); + layoutParams.height = layoutParams.height * mSettings.mExtraKeys.length; + viewPager.setLayoutParams(layoutParams); viewPager.setAdapter(new PagerAdapter() { @Override @@ -236,6 +241,7 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) { View layout; if (position == 0) { layout = mExtraKeysView = (ExtraKeysView) inflater.inflate(R.layout.extra_keys_main, collection, false); + mExtraKeysView.reload(mSettings.mExtraKeys); } else { layout = inflater.inflate(R.layout.extra_keys_right, collection, false); final EditText editText = layout.findViewById(R.id.text_input); diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 3ab729fcb6..1d7fd3742b 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Properties; +import org.json.JSONArray; final class TermuxPreferences { @@ -103,6 +104,8 @@ static TerminalSession getCurrentSession(TermuxActivity context) { } return null; } + + public String[][] mExtraKeys; public void reloadFromProperties(Context context) { try { @@ -128,6 +131,16 @@ public void reloadFromProperties(Context context) { mBellBehaviour = BELL_VIBRATE; break; } + + JSONArray arr = new JSONArray(props.getProperty("extrakeys", "[[\"ESC\",\"CTRL\",\"ALT\",\"TAB\",\"―\",\"/\",\"|\"]]")); + mExtraKeys = new String[arr.length()][]; + for(int i = 0; i < arr.length(); i++) { + JSONArray line = arr.getJSONArray(i); + mExtraKeys[i] = new String[line.length()]; + for(int j = 0; j < line.length(); j++) { + mExtraKeys[i][j] = line.getString(j); + } + } mBackIsEscape = "escape".equals(props.getProperty("back-key", "back")); From 4f44ef84eab11222681ae4175304f2e7e8f7d7a9 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sun, 29 Jul 2018 17:58:50 +0200 Subject: [PATCH 02/20] ExtraKeys: add possibility for insert, delete, enter and - --- app/src/main/java/com/termux/app/ExtraKeysView.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index e4e1ef697a..588df321fb 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -57,6 +57,12 @@ static void sendKey(View view, String keyName) { case "PGDN": keyCode = KeyEvent.KEYCODE_PAGE_DOWN; break; + case "INS": + keyCode = KeyEvent.KEYCODE_INSERT; + break; + case "DEL": + keyCode = KeyEvent.KEYCODE_FORWARD_DEL; + break; case "↑": keyCode = KeyEvent.KEYCODE_DPAD_UP; break; @@ -69,9 +75,15 @@ static void sendKey(View view, String keyName) { case "↓": keyCode = KeyEvent.KEYCODE_DPAD_DOWN; break; + case "↲": + keyCode = KeyEvent.KEYCODE_ENTER; + break; case "―": chars = "-"; break; + case "-": + chars = "-"; + break; default: chars = keyName; } From 856411e2190d07aece2372800508e5c66a3ebc39 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sun, 29 Jul 2018 17:59:40 +0200 Subject: [PATCH 03/20] Extrakeys: show extra key row per default Might help new users. --- app/src/main/java/com/termux/app/TermuxPreferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 1d7fd3742b..40017ee113 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -55,7 +55,7 @@ final class TermuxPreferences { // to prevent invisible text due to zoom be mistake: MIN_FONTSIZE = (int) (4f * dipInPixels); - mShowExtraKeys = prefs.getBoolean(SHOW_EXTRA_KEYS_KEY, false); + mShowExtraKeys = prefs.getBoolean(SHOW_EXTRA_KEYS_KEY, true); // http://www.google.com/design/spec/style/typography.html#typography-line-height int defaultFontSize = Math.round(12 * dipInPixels); From b9e403b669e120c6e76f125857a3f4f83d6d9534 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sun, 29 Jul 2018 18:01:43 +0200 Subject: [PATCH 04/20] ExtraKeys: fix so app doesn't crash if ctrl/alt aren't in extrakeys Otherwise we get: AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.CompoundButton.isChecked()' on a null object reference AndroidRuntime: at com.termux.app.ExtraKeysView.b(SourceFile:128) --- .../java/com/termux/app/ExtraKeysView.java | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 588df321fb..442e73da5c 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -101,36 +101,48 @@ static void sendKey(View view, String keyName) { private ToggleButton controlButton; private ToggleButton altButton; private ToggleButton fnButton; + private boolean hasControlButton = false; + private boolean hasAltButton = false; + private boolean hasFnButton = false; private ScheduledExecutorService scheduledExecutor; private PopupWindow popupWindow; private int longPressCount; public boolean readControlButton() { - if (controlButton.isPressed()) return true; - boolean result = controlButton.isChecked(); - if (result) { - controlButton.setChecked(false); - controlButton.setTextColor(TEXT_COLOR); + boolean result = false; + if (hasControlButton) { + if (controlButton.isPressed()) return true; + result = controlButton.isChecked(); + if (result) { + controlButton.setChecked(false); + controlButton.setTextColor(TEXT_COLOR); + } } return result; } public boolean readAltButton() { - if (altButton.isPressed()) return true; - boolean result = altButton.isChecked(); - if (result) { - altButton.setChecked(false); - altButton.setTextColor(TEXT_COLOR); + boolean result = false; + if (hasAltButton) { + if (altButton.isPressed()) return true; + result = altButton.isChecked(); + if (result) { + altButton.setChecked(false); + altButton.setTextColor(TEXT_COLOR); + } } return result; } public boolean readFnButton() { - if (fnButton.isPressed()) return true; - boolean result = fnButton.isChecked(); - if (result) { - fnButton.setChecked(false); - fnButton.setTextColor(TEXT_COLOR); + boolean result = false; + if (hasFnButton) { + if (fnButton.isPressed()) return true; + result = fnButton.isChecked(); + if (result) { + fnButton.setChecked(false); + fnButton.setTextColor(TEXT_COLOR); + } } return result; } @@ -159,7 +171,7 @@ void popup(View view, String text) { } void reload(final String[][] buttons) { - altButton = controlButton = null; + altButton = controlButton = fnButton = null; removeAllViews(); int mx = 0; @@ -179,14 +191,17 @@ void reload(final String[][] buttons) { Button button; switch (buttonText) { case "CTRL": + hasControlButton = true; button = controlButton = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); button.setClickable(true); break; case "ALT": + hasAltButton = true; button = altButton = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); button.setClickable(true); break; case "FN": + hasFnButton = true; button = fnButton = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); button.setClickable(true); break; From 8eea4a4faf82a1652a389a554bd5572140449d92 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sun, 29 Jul 2018 18:03:41 +0200 Subject: [PATCH 05/20] Extrakeys: fix rebase error --- app/src/main/java/com/termux/app/ExtraKeysView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 442e73da5c..0b9f6776a3 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -174,15 +174,15 @@ void reload(final String[][] buttons) { altButton = controlButton = fnButton = null; removeAllViews(); + final int rows = buttons.length; int mx = 0; for (int row = 0; row < rows; row++) { if(buttons[row].length > mx) mx = buttons[row].length; } - final int rows = buttons.length; final int cols = mx; setRowCount(rows); - setColumnCount(cols[0]); + setColumnCount(cols); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { From 33bdd326613b7aa821ef0153554c837e163945fa Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sun, 29 Jul 2018 18:04:18 +0200 Subject: [PATCH 06/20] =?UTF-8?q?Extrakeys:=20make=20=E2=80=95=20the=20sam?= =?UTF-8?q?e=20as=20-=20in=20some=20more=20places?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/termux/app/ExtraKeysView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 0b9f6776a3..3cadb32d46 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -255,7 +255,7 @@ public void run() { } return true; case MotionEvent.ACTION_MOVE: - if ("―/".contains(buttonText)) { + if ("―/-".contains(buttonText)) { if (popupWindow == null && event.getY() < 0) { v.setBackgroundColor(BUTTON_COLOR); String text = "―".equals(buttonText) ? "|" : "\\"; @@ -276,7 +276,7 @@ public void run() { scheduledExecutor = null; } if (longPressCount == 0) { - if (popupWindow != null && "―/".contains(buttonText)) { + if (popupWindow != null && "―/-".contains(buttonText)) { popupWindow.setContentView(null); popupWindow.dismiss(); popupWindow = null; From 4d4508509971fd870be93522f044da6f6d2d7e53 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Sun, 29 Jul 2018 18:04:57 +0200 Subject: [PATCH 07/20] Extrakeys: fix typo --- app/src/main/java/com/termux/app/ExtraKeysView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 3cadb32d46..e08e6c41c8 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -296,7 +296,7 @@ public void run() { LayoutParams param = new GridLayout.LayoutParams(); param.width = 0; if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){ //special handle api 21 - param.height = (int)(37.5 * getResources().getDisplayMetrics().density + 0.5); // 37.5 equal to R.id.viewpager layout_heihgt / rows in DP + param.height = (int)(37.5 * getResources().getDisplayMetrics().density + 0.5); // 37.5 equal to R.id.viewpager layout_height / rows in DP }else{ param.height = 0; } From b64a3d2f036365f87e29b7f686e80f9173c6b682 Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Wed, 1 Aug 2018 04:32:09 +0200 Subject: [PATCH 08/20] Use LEFT instead of arrow keys in config, and include arrows characters for special keys (will be easily changed in the properties after) --- .../java/com/termux/app/ExtraKeysView.java | 284 +++++++++++++----- 1 file changed, 211 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index e08e6c41c8..b50802d84a 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -8,6 +8,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.ScheduledExecutorService; +import java.util.Map; +import java.util.HashMap; + import android.view.HapticFeedbackConstants; import android.view.KeyEvent; import android.view.MotionEvent; @@ -29,81 +32,70 @@ public final class ExtraKeysView extends GridLayout { private static final int TEXT_COLOR = 0xFFFFFFFF; private static final int BUTTON_COLOR = 0x00000000; + private static final int INTERESTING_COLOR = 0xFF80DEEA; private static final int BUTTON_PRESSED_COLOR = 0x7FFFFFFF; - + public ExtraKeysView(Context context, AttributeSet attrs) { super(context, attrs); } - - static void sendKey(View view, String keyName) { - int keyCode = 0; - String chars = null; - switch (keyName) { - case "ESC": - keyCode = KeyEvent.KEYCODE_ESCAPE; - break; - case "TAB": - keyCode = KeyEvent.KEYCODE_TAB; - break; - case "HOME": - keyCode = KeyEvent.KEYCODE_MOVE_HOME; - break; - case "END": - keyCode = KeyEvent.KEYCODE_MOVE_END; - break; - case "PGUP": - keyCode = KeyEvent.KEYCODE_PAGE_UP; - break; - case "PGDN": - keyCode = KeyEvent.KEYCODE_PAGE_DOWN; - break; - case "INS": - keyCode = KeyEvent.KEYCODE_INSERT; - break; - case "DEL": - keyCode = KeyEvent.KEYCODE_FORWARD_DEL; - break; - case "↑": - keyCode = KeyEvent.KEYCODE_DPAD_UP; - break; - case "←": - keyCode = KeyEvent.KEYCODE_DPAD_LEFT; - break; - case "→": - keyCode = KeyEvent.KEYCODE_DPAD_RIGHT; - break; - case "↓": - keyCode = KeyEvent.KEYCODE_DPAD_DOWN; - break; - case "↲": - keyCode = KeyEvent.KEYCODE_ENTER; - break; - case "―": - chars = "-"; - break; - case "-": - chars = "-"; - break; - default: - chars = keyName; + + /** + * HashMap that implements Python dict.get(key, default) function. + * Default java.util .get(key) is then the same as .get(key, null); + */ + static class CleverMap extends HashMap { + V get(K key, V defaultValue) { + if(containsKey(key)) + return get(key); + else + return defaultValue; } - + } + + static CharDisplayMap extends CharDisplayMap {} + + /** + * Keys are displayed in a natural looking way, like "→" for "RIGHT" + */ + static final Map keyCodesForString = new HashMap() {{ + put("ESC", KeyEvent.KEYCODE_ESCAPE); + put("TAB", KeyEvent.KEYCODE_TAB); + put("HOME", KeyEvent.KEYCODE_MOVE_HOME); + put("END", KeyEvent.KEYCODE_MOVE_END); + put("PGUP", KeyEvent.KEYCODE_PAGE_UP); + put("PGDN", KeyEvent.KEYCODE_PAGE_DOWN); + put("INS", KeyEvent.KEYCODE_INSERT); + put("DEL", KeyEvent.KEYCODE_FORWARD_DEL); + put("BKSP", KeyEvent.KEYCODE_BACKWARD_DEL); + put("UP", KeyEvent.KEYCODE_DPAD_UP); + put("LEFT", KeyEvent.KEYCODE_DPAD_LEFT); + put("RIGHT", KeyEvent.KEYCODE_DPAD_RIGHT); + put("DOWN", KeyEvent.KEYCODE_DPAD_DOWN); + put("ENTER", KeyEvent.KEYCODE_ENTER); + }}; + + static void sendKey(View view, String keyName) { TerminalView terminalView = view.findViewById(R.id.terminal_view); - if (keyCode > 0) { + if (keyCodesForString.containsKey(keyName)) { + int keyCode = keyCodesForString.get(keyName); terminalView.onKeyDown(keyCode, new KeyEvent(KeyEvent.ACTION_UP, keyCode)); -// view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode)); + // view.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode)); } else { + // not a control char TerminalSession session = terminalView.getCurrentSession(); - if (session != null) session.write(chars); + if (session != null) + session.write(KeyName); } } private ToggleButton controlButton; private ToggleButton altButton; private ToggleButton fnButton; + private boolean hasControlButton = false; private boolean hasAltButton = false; private boolean hasFnButton = false; + private ScheduledExecutorService scheduledExecutor; private PopupWindow popupWindow; private int longPressCount; @@ -169,17 +161,159 @@ void popup(View view, String text) { popupWindow.setFocusable(false); popupWindow.showAsDropDown(view, 0, -2 * height); } - - void reload(final String[][] buttons) { + + static final CharDisplayMap classicArrowsDisplay = new CharDisplayMap() {{ + // classic arrow keys (for ◀ ▶ ▲ ▼ @see arrowVariationDisplay) + put("LEFT", "←"); // U+2190 ← LEFTWARDS ARROW + put("RIGHT", "→"); // U+2192 → RIGHTWARDS ARROW + put("UP", "↑"); // U+2191 ↑ UPWARDS ARROW + put("DOWN", "↓"); // U+2193 ↓ DOWNWARDS ARROW + }}; + + static final CharDisplayMap wellKnownCharactersDisplay = new CharDisplayMap() {{ + // well known characters // https://en.wikipedia.org/wiki/{Enter_key, Tab_key, Delete_key} + put("ENTER", "↲"); // U+21B2 ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS + put("TAB", "↹"); // U+21B9 ↹ LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR + put("BKSP", "⌫"); // U+232B ⌫ ERASE TO THE LEFT sometimes seen and easy to understand + put("DEL", "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand + + static final CharDisplayMap lessKnownCharactersDisplay = new CharDisplayMap() {{ + // https://en.wikipedia.org/wiki/{Home_key, End_key, Page_Up_and_Page_Down_keys} + // home key can mean "goto the beginning of line" or "goto first page" depending on context, hence the diagonal + put("HOME", "⇱"); // from IEC 9995 // U+21F1 ⇱ NORTH WEST ARROW TO CORNER + put("END", "⇲"); // from IEC 9995 // ⇲ // U+21F2 ⇲ SOUTH EAST ARROW TO CORNER + put("PGUP", "⇑"); // no ISO character exists, U+21D1 ⇑ UPWARDS DOUBLE ARROW will do the trick + put("PGDN", "⇓"); // no ISO character exists, U+21D3 ⇓ DOWNWARDS DOUBLE ARROW will do the trick + }}; + + static final CharDisplayMap arrowTriangleVariationDisplay = new CharDisplayMap() {{ + // alternative to classic arrow keys + put("LEFT", "◀"); // U+25C0 ◀ BLACK LEFT-POINTING TRIANGLE + put("RIGHT", "▶"); // U+25B6 ▶ BLACK RIGHT-POINTING TRIANGLE + put("UP", "▲"); // U+25B2 ▲ BLACK UP-POINTING TRIANGLE + put("DOWN", "▼"); // U+25BC ▼ BLACK DOWN-POINTING TRIANGLE + }}; + + static final CharDisplayMap notKnownIsoCharacters = new CharDisplayMap() {{ + // Control chars that are more clear as text // https://en.wikipedia.org/wiki/{Function_key, Alt_key, Control_key, Esc_key} + // put("FN", "FN"); // no ISO character exists + put("CTRL", "⎈"); // ISO character "U+2388 ⎈ HELM SYMBOL" is unknown to people and never printed on computers, however "U+25C7 ◇ WHITE DIAMOND" is a nice presentation, and "^" for terminal app and mac is often used + put("ALT", "⎇"); // ISO character "U+2387 ⎇ ALTERNATIVE KEY SYMBOL'" is unknown to people and only printed as the Option key "⌥" on Mac computer + put("ESC", "⎋"); // ISO character "U+238B ⎋ BROKEN CIRCLE WITH NORTHWEST ARROW" is unknown to people and not often printed on computers + }}; + + static final CharDisplayMap nicerLookingDisplay = new CharDisplayMap() {{ + // nicer looking for most cases + put("-", "―"); // U+2015 ― HORIZONTAL BAR + }}; + + /** + * Keys are displayed in a natural looking way, like "→" for "RIGHT" or "↲" for ENTER + */ + public static final CharDisplayMap defaultCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + putAll(wellKnownCharactersDisplay); + putAll(nicerLookingDisplay); + // all other characters are displayed as themselves + }}; + + public static final CharDisplayMap lotsOfArrowsCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + putAll(wellKnownCharactersDisplay); + putAll(lessKnownCharactersDisplay); // NEW + putAll(nicerLookingDisplay); + }}; + + public static final CharDisplayMap arrowsOnlyCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + // putAll(wellKnownCharactersDisplay); // REMOVED + // putAll(lessKnownCharactersDisplay); // REMOVED + putAll(nicerLookingDisplay); + }}; + + public static final CharDisplayMap fullIsoCharDisplay = new CharDisplayMap() {{ + putAll(classicArrowsDisplay); + putAll(wellKnownCharactersDisplay); + putAll(lessKnownCharactersDisplay); // NEW + putAll(nicerLookingDisplay); + putAll(notKnownIsoCharacters); // NEW + }}; + + /** + * Some people might call our keys differently + */ + static final CharDisplayMap controlCharsAliases = new CharDisplayMap() {{ + put("ESCAPE", "ESC"); + put("CONTROL", "CTRL"); + put("RETURN", "ENTER"); // Technically different keys, but most applications won't see the difference + put("FUNCTION", "FN"); + // no alias for ALT + + // Directions are sometimes written as first and last letter for brevety + put("LT", "LEFT"); + put("RT", "RIGHT"); + put("DN", "DOWN"); + // put("UP", "UP"); well, the direction is already two letters + + put("PAGEUP", "PGUP"); + put("PAGE_UP", "PGUP"); + put("PAGE UP", "PGUP"); + put("PAGE-UP", "PGUP"); + + // no alias for HOME + // no alias for END + + put("PAGEDOWN", "PGDN"); + put("PAGE_DOWN", "PGDN"); + put("PAGE_DOWN", "PGDN"); + put("PAGE-DOWN", "PGDN"); + + put("DELETE", "DEL"); + put("BACKSPACE", "BKSP"); + }}; + + /** + * Applies the 'controlCharsAliases' mapping to all the strings in *buttons* + * Modifies the array, doesn't return a new one. + */ + void replaceAliases(String[][] buttons) { + for(int i = 0; i < buttons.length; i++) + for(int j = 0; j < buttons[i].length; j++) + buttons[i][j] = controlCharsAliases.get(buttons[i][j], buttons[i][j]); + } + + /** + * General util function to compute the longest column length in a matrix. + */ + static int maximumLength(String[][] matrix) { + int m = 0; + for (int i = 0; i < matrix.length; i++) + m = Math.max(m, matrix[i].length); + return m; + } + + /** + * Reload the view given parameters in termux.properties + * + * @buttons matrix of String as defined in termux.properties extrakeys + * Can Contain The Strings CTRL ALT TAB FN ENTER LEFT RIGHT UP DOWN or normal strings + * Some aliases are possible like RETURN for ENTER, LT for LEFT and more (@see controlCharsAliases for the whole list). + * Any string of length > 1 in total Uppercase will print a warning + * + * Examples: + * "ENTER" will trigger the ENTER keycode + * "→" will input a "→" character + * "−" will input a "−" character + * "-_-" will input the string "-_-" + */ + void reload(String[][] buttons, CharDisplayMap charDisplayMap) { altButton = controlButton = fnButton = null; removeAllViews(); + + replaceAliases(buttons); // modifies the array final int rows = buttons.length; - int mx = 0; - for (int row = 0; row < rows; row++) { - if(buttons[row].length > mx) mx = buttons[row].length; - } - final int cols = mx; + final int cols = maximumLength(buttons); setRowCount(rows); setColumnCount(cols); @@ -187,6 +321,7 @@ void reload(final String[][] buttons) { for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { final String buttonText = (buttons[row][col] == null ? " " : buttons[row][col]); + // if (buttons[row][col] == null) then the button will be an empty button outputting a space character Button button; switch (buttonText) { @@ -209,8 +344,10 @@ void reload(final String[][] buttons) { button = new Button(getContext(), null, android.R.attr.buttonBarButtonStyle); break; } - - button.setText(buttonText); + + final String displayedText = charDisplayMap.get(buttonText, buttonText); + + button.setText(displayedText); button.setTextColor(TEXT_COLOR); button.setPadding(0, 0, 0, 0); @@ -226,7 +363,7 @@ public void onClick(View v) { case "FN": ToggleButton self = (ToggleButton) finalButton; self.setChecked(self.isChecked()); - self.setTextColor(self.isChecked() ? 0xFF80DEEA : TEXT_COLOR); + self.setTextColor(self.isChecked() ? INTERESTING_COLOR : TEXT_COLOR); break; default: sendKey(root, buttonText); @@ -243,7 +380,7 @@ public boolean onTouch(View v, MotionEvent event) { case MotionEvent.ACTION_DOWN: longPressCount = 0; v.setBackgroundColor(BUTTON_PRESSED_COLOR); - if ("↑↓←→".contains(buttonText)) { + if (Arrays.asList("UP", "DOWN", "LEFT", "RIGHT").contains(buttonText)) { scheduledExecutor = Executors.newSingleThreadScheduledExecutor(); scheduledExecutor.scheduleWithFixedDelay(new Runnable() { @Override @@ -255,10 +392,11 @@ public void run() { } return true; case MotionEvent.ACTION_MOVE: - if ("―/-".contains(buttonText)) { - if (popupWindow == null && event.getY() < 0) { + // These two keys have a Move-Up button appearing + if (Arrays.asList("/", "-").contains(buttonText)) { + if (popupWindow == null &gfv& event.getY() < 0) { v.setBackgroundColor(BUTTON_COLOR); - String text = "―".equals(buttonText) ? "|" : "\\"; + String text = "-".equals(buttonText) ? "|" : "\\"; popup(v, text); } if (popupWindow != null && event.getY() > 0) { @@ -276,11 +414,11 @@ public void run() { scheduledExecutor = null; } if (longPressCount == 0) { - if (popupWindow != null && "―/-".contains(buttonText)) { + if (popupWindow != null && "/-".contains(buttonText)) { popupWindow.setContentView(null); popupWindow.dismiss(); popupWindow = null; - sendKey(root, "―".equals(buttonText) ? "|" : "\\"); + sendKey(root, "-".equals(buttonText) ? "|" : "\\"); } else { v.performClick(); } From 2b6d06639adb5c82950acf7cf71aace92c55f518 Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Wed, 1 Aug 2018 05:02:36 +0200 Subject: [PATCH 09/20] Refactor Ctrl, Alt, Fn code --- .../java/com/termux/app/ExtraKeysView.java | 143 ++++++++---------- 1 file changed, 66 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index b50802d84a..fe7f553289 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -87,56 +87,58 @@ static void sendKey(View view, String keyName) { session.write(KeyName); } } - - private ToggleButton controlButton; - private ToggleButton altButton; - private ToggleButton fnButton; - private boolean hasControlButton = false; - private boolean hasAltButton = false; - private boolean hasFnButton = false; + public enum SpecialButton { + CTRL, ALT, FN + } + + private static class SpecialButtonState { + boolean isOn = false; + ToggleButton button = null; + } + + private Map specialButtons = new HashMap() {{ + put(SpecialButton.CTRL, new SpecialButtonState()); + put(SpecialButton.ALT, new SpecialButtonState()); + put(SpecialButton.FN, new SpecialButtonState()); + }}; private ScheduledExecutorService scheduledExecutor; private PopupWindow popupWindow; private int longPressCount; - + + /** @deprecated, call readSpecialButton(SpecialButton.CTRL); */ public boolean readControlButton() { - boolean result = false; - if (hasControlButton) { - if (controlButton.isPressed()) return true; - result = controlButton.isChecked(); - if (result) { - controlButton.setChecked(false); - controlButton.setTextColor(TEXT_COLOR); - } - } - return result; + return readSpecialButton(SpecialButton.FN); } - + + /** @deprecated, call readSpecialButton(SpecialButton.ALT); */ public boolean readAltButton() { - boolean result = false; - if (hasAltButton) { - if (altButton.isPressed()) return true; - result = altButton.isChecked(); - if (result) { - altButton.setChecked(false); - altButton.setTextColor(TEXT_COLOR); - } - } - return result; + return readSpecialButton(SpecialButton.FN); } - + + /** @deprecated, call readSpecialButton(SpecialButton.FN); */ public boolean readFnButton() { - boolean result = false; - if (hasFnButton) { - if (fnButton.isPressed()) return true; - result = fnButton.isChecked(); - if (result) { - fnButton.setChecked(false); - fnButton.setTextColor(TEXT_COLOR); - } + return readSpecialButton(SpecialButton.FN); + } + + public boolean readSpecialButton(SpecialButton name) { + SpecialButtonState state = specialButtons.get(name); + if(state == null) + throws Exception("Must be a valid special button (see source)"); + + if (! state.isOn) + return false; + + if (state.button.isPressed()) + return true; + + if (state.button.isChecked()) { + state.button.setChecked(false); + state.button.setTextColor(TEXT_COLOR); } - return result; + + return state.button.isChecked(); } void popup(View view, String text) { @@ -307,7 +309,9 @@ static int maximumLength(String[][] matrix) { * "-_-" will input the string "-_-" */ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { - altButton = controlButton = fnButton = null; + for(SpecialButtonState state : specialButtons.values()) + state.button = null; + removeAllViews(); replaceAliases(buttons); // modifies the array @@ -320,33 +324,24 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { - final String buttonText = (buttons[row][col] == null ? " " : buttons[row][col]); - // if (buttons[row][col] == null) then the button will be an empty button outputting a space character - + String buttonText = buttons[row][col]; + + if(buttonText == null) { + // The button will be an empty button outputting a space character, like s space bar + buttonText = " "; + } + Button button; - switch (buttonText) { - case "CTRL": - hasControlButton = true; - button = controlButton = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); - button.setClickable(true); - break; - case "ALT": - hasAltButton = true; - button = altButton = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); - button.setClickable(true); - break; - case "FN": - hasFnButton = true; - button = fnButton = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); - button.setClickable(true); - break; - default: - button = new Button(getContext(), null, android.R.attr.buttonBarButtonStyle); - break; + if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonText)) { + state = specialButtons.get(SpecialButton.valueOf(buttonText)); // for valueOf: https://stackoverflow.com/a/604426/1980630 + state.isOn = true; + button = state.button = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); + button.setClickable(true); + } else { + button = new Button(getContext(), null, android.R.attr.buttonBarButtonStyle); } final String displayedText = charDisplayMap.get(buttonText, buttonText); - button.setText(displayedText); button.setTextColor(TEXT_COLOR); button.setPadding(0, 0, 0, 0); @@ -357,17 +352,12 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { public void onClick(View v) { finalButton.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); View root = getRootView(); - switch (buttonText) { - case "CTRL": - case "ALT": - case "FN": - ToggleButton self = (ToggleButton) finalButton; - self.setChecked(self.isChecked()); - self.setTextColor(self.isChecked() ? INTERESTING_COLOR : TEXT_COLOR); - break; - default: - sendKey(root, buttonText); - break; + if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonText)) { + ToggleButton self = (ToggleButton) finalButton; + self.setChecked(self.isChecked()); + self.setTextColor(self.isChecked() ? INTERESTING_COLOR : TEXT_COLOR); + } else { + sendKey(root, buttonText); } } }); @@ -427,15 +417,14 @@ public void run() { default: return true; } - } }); LayoutParams param = new GridLayout.LayoutParams(); param.width = 0; - if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){ //special handle api 21 + if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) { //special handle api 21 param.height = (int)(37.5 * getResources().getDisplayMetrics().density + 0.5); // 37.5 equal to R.id.viewpager layout_height / rows in DP - }else{ + } else { param.height = 0; } param.setMargins(0, 0, 0, 0); From 731469273f5e46800d3ce428682d72077a6e6b6a Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Wed, 1 Aug 2018 05:05:40 +0200 Subject: [PATCH 10/20] Fix Typo (KeyEvent.KEYCODE_DEL and others) --- app/src/main/java/com/termux/app/ExtraKeysView.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index fe7f553289..126dba5cdc 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -66,7 +66,7 @@ V get(K key, V defaultValue) { put("PGDN", KeyEvent.KEYCODE_PAGE_DOWN); put("INS", KeyEvent.KEYCODE_INSERT); put("DEL", KeyEvent.KEYCODE_FORWARD_DEL); - put("BKSP", KeyEvent.KEYCODE_BACKWARD_DEL); + put("BKSP", KeyEvent.KEYCODE_DEL); put("UP", KeyEvent.KEYCODE_DPAD_UP); put("LEFT", KeyEvent.KEYCODE_DPAD_LEFT); put("RIGHT", KeyEvent.KEYCODE_DPAD_RIGHT); @@ -84,7 +84,7 @@ static void sendKey(View view, String keyName) { // not a control char TerminalSession session = terminalView.getCurrentSession(); if (session != null) - session.write(KeyName); + session.write(keyName); } } @@ -381,6 +381,7 @@ public void run() { }, 400, 80, TimeUnit.MILLISECONDS); } return true; + case MotionEvent.ACTION_MOVE: // These two keys have a Move-Up button appearing if (Arrays.asList("/", "-").contains(buttonText)) { @@ -396,6 +397,7 @@ public void run() { } } return true; + case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: v.setBackgroundColor(BUTTON_COLOR); @@ -414,6 +416,7 @@ public void run() { } } return true; + default: return true; } @@ -422,7 +425,7 @@ public void run() { LayoutParams param = new GridLayout.LayoutParams(); param.width = 0; - if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) { //special handle api 21 + if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) { // special handle api 21 param.height = (int)(37.5 * getResources().getDisplayMetrics().density + 0.5); // 37.5 equal to R.id.viewpager layout_height / rows in DP } else { param.height = 0; From 4c58c35e0f977ad3754a8b04ab00eea606b96104 Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Wed, 1 Aug 2018 05:43:10 +0200 Subject: [PATCH 11/20] Use utf-8 for config, Activate defaultCharDisplay, Fix Typo --- app/src/main/java/com/termux/app/ExtraKeysView.java | 10 ++++++---- app/src/main/java/com/termux/app/TermuxActivity.java | 2 +- .../main/java/com/termux/app/TermuxPreferences.java | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 126dba5cdc..d88dda6f6b 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.HashMap; +import java.util.Arrays; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; @@ -52,7 +53,7 @@ V get(K key, V defaultValue) { } } - static CharDisplayMap extends CharDisplayMap {} + static class CharDisplayMap extends CleverMap {} /** * Keys are displayed in a natural looking way, like "→" for "RIGHT" @@ -125,7 +126,7 @@ public boolean readFnButton() { public boolean readSpecialButton(SpecialButton name) { SpecialButtonState state = specialButtons.get(name); if(state == null) - throws Exception("Must be a valid special button (see source)"); + throw Exception("Must be a valid special button (see source)"); if (! state.isOn) return false; @@ -304,6 +305,7 @@ static int maximumLength(String[][] matrix) { * * Examples: * "ENTER" will trigger the ENTER keycode + * "LEFT" will trigger the LEFT keycode and be displayed as "←" * "→" will input a "→" character * "−" will input a "−" character * "-_-" will input the string "-_-" @@ -385,7 +387,7 @@ public void run() { case MotionEvent.ACTION_MOVE: // These two keys have a Move-Up button appearing if (Arrays.asList("/", "-").contains(buttonText)) { - if (popupWindow == null &gfv& event.getY() < 0) { + if (popupWindow == null && event.getY() < 0) { v.setBackgroundColor(BUTTON_COLOR); String text = "-".equals(buttonText) ? "|" : "\\"; popup(v, text); @@ -406,7 +408,7 @@ public void run() { scheduledExecutor = null; } if (longPressCount == 0) { - if (popupWindow != null && "/-".contains(buttonText)) { + if (popupWindow != null && Arrays.asList("/", "-").contains(buttonText)) { popupWindow.setContentView(null); popupWindow.dismiss(); popupWindow = null; diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 65171a7fd7..59d318393e 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -241,7 +241,7 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) { View layout; if (position == 0) { layout = mExtraKeysView = (ExtraKeysView) inflater.inflate(R.layout.extra_keys_main, collection, false); - mExtraKeysView.reload(mSettings.mExtraKeys); + mExtraKeysView.reload(mSettings.mExtraKeys, ExtraKeysView.defaultCharDisplay); } else { layout = inflater.inflate(R.layout.extra_keys_right, collection, false); final EditText editText = layout.findViewById(R.id.text_input); diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 40017ee113..0c030ca7cf 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -12,6 +12,7 @@ import java.io.File; import java.io.FileInputStream; +import java.io.InputStreamReader; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -115,8 +116,9 @@ public void reloadFromProperties(Context context) { Properties props = new Properties(); if (propsFile.isFile() && propsFile.canRead()) { + String encoding = "utf-8"; // most useful default nowadays try (FileInputStream in = new FileInputStream(propsFile)) { - props.load(in); + props.load(new InputStreamReader(in, encoding)); } } From 89534cacb4d26778413b2ed9e006d808a9a1093c Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Wed, 1 Aug 2018 15:19:33 +0200 Subject: [PATCH 12/20] Fix typos and build errors --- app/src/main/java/com/termux/app/ExtraKeysView.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index d88dda6f6b..4ff293367b 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -98,7 +98,7 @@ private static class SpecialButtonState { ToggleButton button = null; } - private Map specialButtons = new HashMap() {{ + private Map specialButtons = new HashMap() {{ put(SpecialButton.CTRL, new SpecialButtonState()); put(SpecialButton.ALT, new SpecialButtonState()); put(SpecialButton.FN, new SpecialButtonState()); @@ -110,12 +110,12 @@ private static class SpecialButtonState { /** @deprecated, call readSpecialButton(SpecialButton.CTRL); */ public boolean readControlButton() { - return readSpecialButton(SpecialButton.FN); + return readSpecialButton(SpecialButton.CTRL); } /** @deprecated, call readSpecialButton(SpecialButton.ALT); */ public boolean readAltButton() { - return readSpecialButton(SpecialButton.FN); + return readSpecialButton(SpecialButton.ALT); } /** @deprecated, call readSpecialButton(SpecialButton.FN); */ @@ -126,7 +126,7 @@ public boolean readFnButton() { public boolean readSpecialButton(SpecialButton name) { SpecialButtonState state = specialButtons.get(name); if(state == null) - throw Exception("Must be a valid special button (see source)"); + throw new RuntimeException("Must be a valid special button (see source)"); if (! state.isOn) return false; @@ -172,14 +172,15 @@ void popup(View view, String text) { put("UP", "↑"); // U+2191 ↑ UPWARDS ARROW put("DOWN", "↓"); // U+2193 ↓ DOWNWARDS ARROW }}; - + static final CharDisplayMap wellKnownCharactersDisplay = new CharDisplayMap() {{ // well known characters // https://en.wikipedia.org/wiki/{Enter_key, Tab_key, Delete_key} put("ENTER", "↲"); // U+21B2 ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS put("TAB", "↹"); // U+21B9 ↹ LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR put("BKSP", "⌫"); // U+232B ⌫ ERASE TO THE LEFT sometimes seen and easy to understand put("DEL", "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand - + }}; + static final CharDisplayMap lessKnownCharactersDisplay = new CharDisplayMap() {{ // https://en.wikipedia.org/wiki/{Home_key, End_key, Page_Up_and_Page_Down_keys} // home key can mean "goto the beginning of line" or "goto first page" depending on context, hence the diagonal From ad489b758ba08872a4d2ddcf8000a3c8fb3733d5 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Wed, 1 Aug 2018 15:20:16 +0200 Subject: [PATCH 13/20] Declare buttonText final String, dont't change value inside reload --- app/src/main/java/com/termux/app/ExtraKeysView.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 4ff293367b..67cdd86982 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -327,12 +327,7 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { - String buttonText = buttons[row][col]; - - if(buttonText == null) { - // The button will be an empty button outputting a space character, like s space bar - buttonText = " "; - } + final String buttonText = buttons[row][col]; Button button; if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonText)) { From e7a74d3c4b363023e8a6a25747028a815c3a89dc Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Wed, 1 Aug 2018 15:21:48 +0200 Subject: [PATCH 14/20] state -> SpecialButtonState state --- app/src/main/java/com/termux/app/ExtraKeysView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 67cdd86982..784aa365f4 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -331,7 +331,7 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { Button button; if(Arrays.asList("CTRL", "ALT", "FN").contains(buttonText)) { - state = specialButtons.get(SpecialButton.valueOf(buttonText)); // for valueOf: https://stackoverflow.com/a/604426/1980630 + SpecialButtonState state = specialButtons.get(SpecialButton.valueOf(buttonText)); // for valueOf: https://stackoverflow.com/a/604426/1980630 state.isOn = true; button = state.button = new ToggleButton(getContext(), null, android.R.attr.buttonBarButtonStyle); button.setClickable(true); From 716fc79f14fb6e321910f228e66c379dfb60049f Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Wed, 1 Aug 2018 20:03:26 +0200 Subject: [PATCH 15/20] Fix refactoring, Ctrl, Alt, Fn keys work again --- .../main/java/com/termux/app/ExtraKeysView.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 784aa365f4..a4073ae046 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -125,7 +125,7 @@ public boolean readFnButton() { public boolean readSpecialButton(SpecialButton name) { SpecialButtonState state = specialButtons.get(name); - if(state == null) + if (state == null) throw new RuntimeException("Must be a valid special button (see source)"); if (! state.isOn) @@ -134,12 +134,12 @@ public boolean readSpecialButton(SpecialButton name) { if (state.button.isPressed()) return true; - if (state.button.isChecked()) { - state.button.setChecked(false); - state.button.setTextColor(TEXT_COLOR); - } - - return state.button.isChecked(); + if (! state.button.isChecked()) + return false; + + state.button.setChecked(false); + state.button.setTextColor(TEXT_COLOR); + return true; } void popup(View view, String text) { From 1bd6ac0a54fde6efc5a14f1de720cbca8dc78891 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Wed, 1 Aug 2018 23:54:58 +0200 Subject: [PATCH 16/20] ExtraKeys: Prevent app crash if user specifies different row lengths --- app/src/main/java/com/termux/app/ExtraKeysView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index a4073ae046..4e8079e365 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -326,7 +326,7 @@ void reload(String[][] buttons, CharDisplayMap charDisplayMap) { setColumnCount(cols); for (int row = 0; row < rows; row++) { - for (int col = 0; col < cols; col++) { + for (int col = 0; col < buttons[row].length; col++) { final String buttonText = buttons[row][col]; Button button; From cb4dd095f23fbfcb28a85fa0c7e21efe40530515 Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Thu, 2 Aug 2018 00:38:54 +0200 Subject: [PATCH 17/20] Use extra-keys spelling and correct default setting --- .../main/java/com/termux/app/TermuxPreferences.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 0c030ca7cf..cfe9491a28 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -45,6 +45,13 @@ final class TermuxPreferences { boolean mBackIsEscape; boolean mShowExtraKeys; + + /** + * If value is not in the range [min, max], set it to either min or max. + */ + static int clamp(int value, int min, int max) { + return Math.min(Math.max(value, min), max); + } TermuxPreferences(Context context) { reloadFromProperties(context); @@ -68,7 +75,7 @@ final class TermuxPreferences { } catch (NumberFormatException | ClassCastException e) { mFontSize = defaultFontSize; } - mFontSize = Math.max(MIN_FONTSIZE, Math.min(mFontSize, MAX_FONTSIZE)); + mFontSize = clamp(mFontSize, MIN_FONTSIZE, MAX_FONTSIZE); } boolean isShowExtraKeys() { @@ -134,7 +141,7 @@ public void reloadFromProperties(Context context) { break; } - JSONArray arr = new JSONArray(props.getProperty("extrakeys", "[[\"ESC\",\"CTRL\",\"ALT\",\"TAB\",\"―\",\"/\",\"|\"]]")); + JSONArray arr = new JSONArray(props.getProperty("extra-keys", "[[\"ESC\",\"CTRL\",\"ALT\",\"TAB\",\"-\",\"/\",\"|\"]]")); mExtraKeys = new String[arr.length()][]; for(int i = 0; i < arr.length(); i++) { JSONArray line = arr.getJSONArray(i); From f0120390ab2ec59764ac98f3265e26facda722e8 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Thu, 2 Aug 2018 08:46:03 +0200 Subject: [PATCH 18/20] ExtraKeys: use ' instead of \" in default key string --- app/src/main/java/com/termux/app/TermuxPreferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index cfe9491a28..2d39f8a4da 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -141,7 +141,7 @@ public void reloadFromProperties(Context context) { break; } - JSONArray arr = new JSONArray(props.getProperty("extra-keys", "[[\"ESC\",\"CTRL\",\"ALT\",\"TAB\",\"-\",\"/\",\"|\"]]")); + JSONArray arr = new JSONArray(props.getProperty("extra-keys", "[['ESC','CTRL','ALT','TAB','-','/','|']]")); mExtraKeys = new String[arr.length()][]; for(int i = 0; i < arr.length(); i++) { JSONArray line = arr.getJSONArray(i); From 7bd18c420c469cbe3fb864df9d4710642511d86a Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Thu, 2 Aug 2018 16:34:43 +0200 Subject: [PATCH 19/20] Add aliases for BACKSLASH QUOTE and APOSTROPHE --- app/src/main/java/com/termux/app/ExtraKeysView.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/ExtraKeysView.java b/app/src/main/java/com/termux/app/ExtraKeysView.java index 4e8079e365..cd62740b0d 100644 --- a/app/src/main/java/com/termux/app/ExtraKeysView.java +++ b/app/src/main/java/com/termux/app/ExtraKeysView.java @@ -257,7 +257,7 @@ void popup(View view, String text) { put("LT", "LEFT"); put("RT", "RIGHT"); put("DN", "DOWN"); - // put("UP", "UP"); well, the direction is already two letters + // put("UP", "UP"); well, "UP" is already two letters put("PAGEUP", "PGUP"); put("PAGE_UP", "PGUP"); @@ -274,6 +274,11 @@ void popup(View view, String text) { put("DELETE", "DEL"); put("BACKSPACE", "BKSP"); + + // easier for writing in termux.properties + put("BACKSLASH", "\\"); + put("QUOTE", "\""); + put("APOSTROPHE", "'"); }}; /** From f45c57c82f51f3dfbe891373d7b0e0c0cfef0402 Mon Sep 17 00:00:00 2001 From: Robert Vanden Eynde Date: Wed, 8 Aug 2018 02:33:46 +0200 Subject: [PATCH 20/20] Default extra-keys has TAB after ESC and UP/DOWN arrow keys --- app/src/main/java/com/termux/app/TermuxPreferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/app/TermuxPreferences.java b/app/src/main/java/com/termux/app/TermuxPreferences.java index 2d39f8a4da..4c884435a2 100644 --- a/app/src/main/java/com/termux/app/TermuxPreferences.java +++ b/app/src/main/java/com/termux/app/TermuxPreferences.java @@ -141,7 +141,7 @@ public void reloadFromProperties(Context context) { break; } - JSONArray arr = new JSONArray(props.getProperty("extra-keys", "[['ESC','CTRL','ALT','TAB','-','/','|']]")); + JSONArray arr = new JSONArray(props.getProperty("extra-keys", "[['ESC', 'TAB', 'CTRL', 'ALT', '-', 'DOWN', 'UP']]")); mExtraKeys = new String[arr.length()][]; for(int i = 0; i < arr.length(); i++) { JSONArray line = arr.getJSONArray(i);