From 5e39a13a3289d6600e98d4a638e6072bf864a0af Mon Sep 17 00:00:00 2001 From: wisest_wizard <12suhangp34@gmail.com> Date: Fri, 27 Aug 2021 07:57:57 +0530 Subject: [PATCH 01/14] Add feature: Customizable Extra-Keys This will make use of `termux-shared` jitpack library --- app/build.gradle | 4 +- .../java/com/termux/x11/MainActivity.java | 26 ++- .../com/termux/x11/TerminalExtraKeys.java | 149 ++++++++++++++++++ .../termux/x11/TermuxAppSharedProperties.java | 89 +++++++++++ app/src/main/res/layout/main_activity.xml | 12 +- build.gradle | 6 +- 6 files changed, 263 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/com/termux/x11/TerminalExtraKeys.java create mode 100644 app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java diff --git a/app/build.gradle b/app/build.gradle index 9bc38471b..5ea069b31 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 + compileSdkVersion 30 defaultConfig { applicationId "com.termux.x11" minSdkVersion 24 @@ -59,4 +59,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'androidx.annotation:annotation:1.3.0' implementation 'androidx.drawerlayout:drawerlayout:1.1.1' + implementation 'com.termux.termux-app:termux-shared:master-SNAPSHOT' + implementation "com.google.guava:guava:24.1-jre" } diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index 46ed1b601..7cd5042e4 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -18,27 +18,23 @@ import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; +import com.termux.shared.terminal.io.extrakeys.ExtraKeysView; +import com.termux.x11.TermuxAppSharedProperties; +import com.termux.x11.TerminalExtraKeys; public class MainActivity extends AppCompatActivity { - private static int[] keys = { - KeyEvent.KEYCODE_ESCAPE, - KeyEvent.KEYCODE_TAB, - KeyEvent.KEYCODE_CTRL_LEFT, - KeyEvent.KEYCODE_ALT_LEFT, - KeyEvent.KEYCODE_DPAD_UP, - KeyEvent.KEYCODE_DPAD_DOWN, - KeyEvent.KEYCODE_DPAD_LEFT, - KeyEvent.KEYCODE_DPAD_RIGHT, - }; - - AdditionalKeyboardView kbd; + private TermuxAppSharedProperties mProperties; + + ExtraKeysView kbd; FrameLayout frm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - LorieService.setMainActivity(this); + mProperties = new TermuxAppSharedProperties(this); + + LorieService.setMainActivity(this); LorieService.start(LorieService.ACTION_START_FROM_ACTIVITY); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN| @@ -51,6 +47,8 @@ protected void onCreate(Bundle savedInstanceState) { kbd = findViewById(R.id.additionalKbd); frm = findViewById(R.id.frame); + kbd.setExtraKeysViewClient(new TerminalExtraKeys(LorieService.getOnKeyListener(), this)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) getWindow(). getDecorView(). @@ -83,7 +81,7 @@ public void onLorieServiceStart(LorieService instance) { SurfaceView lorieView = findViewById(R.id.lorieView); instance.setListeners(lorieView); - kbd.reload(keys, lorieView, LorieService.getOnKeyListener()); + kbd.reload(mProperties.getExtraKeysInfo()); } @Override diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java new file mode 100644 index 000000000..13727ce5b --- /dev/null +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -0,0 +1,149 @@ +package com.termux.x11; + +import android.view.KeyEvent; +import android.view.View; +import android.widget.Button; +import android.view.SurfaceView; +import android.annotation.SuppressLint; +import android.view.Gravity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.app.PendingIntent; +import android.content.Intent; +import android.view.KeyEvent; +import android.view.KeyCharacterMap; +import android.text.TextUtils; +import android.app.ActivityManager; + +import java.lang.Character; + +import androidx.annotation.NonNull; +import androidx.drawerlayout.widget.DrawerLayout; + +import com.termux.shared.terminal.io.extrakeys.ExtraKeyButton; +import com.termux.shared.terminal.io.extrakeys.ExtraKeysView; +import com.termux.shared.terminal.io.extrakeys.SpecialButton; + +import static com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants.PRIMARY_KEY_CODES_FOR_STRINGS; + +public class TerminalExtraKeys implements ExtraKeysView.IExtraKeysView { + + private final View.OnKeyListener mEventListener; + private final MainActivity act; + + public TerminalExtraKeys(@NonNull View.OnKeyListener eventlistener, MainActivity mact) { + mEventListener = eventlistener; + act = mact; + } + + private final KeyCharacterMap mVirtualKeyboardKeyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); + static final String ACTION_START_PREFERENCES_ACTIVITY = "com.termux.x11.start_preferences_activity"; + + @Override + public void onExtraKeyButtonClick(View view, ExtraKeyButton buttonInfo, Button button) { + if (buttonInfo.isMacro()) { + String[] keys = buttonInfo.getKey().split(" "); + boolean ctrlDown = false; + boolean altDown = false; + boolean shiftDown = false; + boolean fnDown = false; + for (String key : keys) { + if (SpecialButton.CTRL.getKey().equals(key)) { + ctrlDown = true; + } else if (SpecialButton.ALT.getKey().equals(key)) { + altDown = true; + } else if (SpecialButton.SHIFT.getKey().equals(key)) { + shiftDown = true; + } else if (SpecialButton.FN.getKey().equals(key)) { + fnDown = true; + } else { + onTerminalExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); + ctrlDown = false; + altDown = false; + shiftDown = false; + fnDown = false; + } + } + } else { + onLorieExtraKeyButtonClick(view, buttonInfo.getKey(), false, false, false, false); + } + } + + protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrlDown, boolean altDown, boolean shiftDown, boolean fnDown) { + SurfaceView lorieView = act.findViewById(R.id.lorieView); + if (PRIMARY_KEY_CODES_FOR_STRINGS.containsKey(key)) { + Integer keyCode = PRIMARY_KEY_CODES_FOR_STRINGS.get(key); + if (keyCode == null) return; + int metaState = 0; + if (ctrlDown) metaState |= KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON; + if (altDown) metaState |= KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON; + if (shiftDown) metaState |= KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON; + if (fnDown) metaState |= KeyEvent.META_FUNCTION_ON; + + KeyEvent keyEvent = new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState); + mEventListener.onKey(lorieView, keyCode, keyEvent); + + } else { + // not a control char + key.codePoints().forEach(codePoint -> { + char ch[]; + ch = Character.toChars(codePoint); + KeyEvent[] events = mVirtualKeyboardKeyCharacterMap.getEvents(ch); + if (events != null) { + for (KeyEvent event : events) { + Integer keyCode = event.getKeyCode(); + mEventListener.onKey(lorieView, keyCode, event); + } + } + }); + } + } + + @Override + public boolean performExtraKeyButtonHapticFeedback(View view, ExtraKeyButton buttonInfo, Button button) { + return false; + } + + public void paste(CharSequence input) { + SurfaceView lorieView = act.findViewById(R.id.lorieView); + KeyEvent[] events = mVirtualKeyboardKeyCharacterMap.getEvents(input.toString().toCharArray()); + if (events != null) { + for (KeyEvent event : events) { + Integer keyCode = event.getKeyCode(); + mEventListener.onKey(lorieView, keyCode, event); + } + } + } + + @SuppressLint("RtlHardcoded") + public void onLorieExtraKeyButtonClick(View view, String key, boolean ctrlDown, boolean altDown, boolean shiftDown, boolean fnDown) { + if ("KEYBOARD".equals(key)) { + + if (act.kbd!=null) { + act.kbd.requestFocus(); + KeyboardUtils.toggleKeyboardVisibility(act); + } + + } else if ("DRAWER".equals(key)) { + Intent preferencesIntent = new Intent(act, LoriePreferences.class); + preferencesIntent.setAction(ACTION_START_PREFERENCES_ACTIVITY); + + PendingIntent pendingPreferencesIntent = PendingIntent.getActivity(act, 0, preferencesIntent, 0); + + } else if ("PASTE".equals(key)) { + + ClipboardManager clipboard = (ClipboardManager) act.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = clipboard.getPrimaryClip(); + + if (clipData != null) { + CharSequence pasted = clipData.getItemAt(0).coerceToText(act); + if (!TextUtils.isEmpty(pasted)) paste(pasted); + } + + } else { + onTerminalExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); + } + } + +} diff --git a/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java new file mode 100644 index 000000000..53be82860 --- /dev/null +++ b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java @@ -0,0 +1,89 @@ +package com.termux.x11; + +import android.content.Context; + +import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants; +import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants.EXTRA_KEY_DISPLAY_MAPS; +import com.termux.shared.terminal.io.extrakeys.ExtraKeysInfo; +import com.termux.shared.logger.Logger; +import com.termux.shared.settings.properties.TermuxPropertyConstants; +import com.termux.shared.settings.properties.TermuxSharedProperties; + +import org.json.JSONException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import androidx.annotation.NonNull; + +public class TermuxAppSharedProperties extends TermuxSharedProperties { + + private ExtraKeysInfo mExtraKeysInfo; + + private static final String LOG_TAG = "TermuxAppSharedProperties"; + + public TermuxAppSharedProperties(@NonNull Context context) { + super(context); + } + + /** + * Reload the termux properties from disk into an in-memory cache. + */ + @Override + public void loadTermuxPropertiesFromDisk() { + super.loadTermuxPropertiesFromDisk(); + + setExtraKeys(); + } + + /** + * Set the terminal extra keys. + */ + private void setExtraKeys() { + mExtraKeysInfo = null; + + try { + // The mMap stores the extra key and style string values while loading properties + // Check {@link #getExtraKeysInternalPropertyValueFromValue(String)} and + // {@link #getExtraKeysStyleInternalPropertyValueFromValue(String)} + String extrakeys = (String) getInternalPropertyValue(TermuxPropertyConstants.KEY_EXTRA_KEYS, true); + String extraKeysStyle = (String) getInternalPropertyValue(TermuxPropertyConstants.KEY_EXTRA_KEYS_STYLE, true); + + ExtraKeysConstants.ExtraKeyDisplayMap extraKeyDisplayMap = ExtraKeysInfo.getCharDisplayMapForStyle(extraKeysStyle); + if (EXTRA_KEY_DISPLAY_MAPS.DEFAULT_CHAR_DISPLAY.equals(extraKeyDisplayMap) && !TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE.equals(extraKeysStyle)) { + Logger.logError(TermuxSharedProperties.LOG_TAG, "The style \"" + extraKeysStyle + "\" for the key \"" + TermuxPropertyConstants.KEY_EXTRA_KEYS_STYLE + "\" is invalid. Using default style instead."); + extraKeysStyle = TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE; + } + + mExtraKeysInfo = new ExtraKeysInfo(extrakeys, extraKeysStyle, ExtraKeysConstants.CONTROL_CHARS_ALIASES); + } catch (JSONException e) { + Logger.showToast(mContext, "Could not load and set the \"" + TermuxPropertyConstants.KEY_EXTRA_KEYS + "\" property from the properties file: " + e.toString(), true); + Logger.logStackTraceWithMessage(LOG_TAG, "Could not load and set the \"" + TermuxPropertyConstants.KEY_EXTRA_KEYS + "\" property from the properties file: ", e); + + try { + mExtraKeysInfo = new ExtraKeysInfo(TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS, TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE, ExtraKeysConstants.CONTROL_CHARS_ALIASES); + } catch (JSONException e2) { + Logger.showToast(mContext, "Can't create default extra keys",true); + Logger.logStackTraceWithMessage(LOG_TAG, "Could create default extra keys: ", e); + mExtraKeysInfo = null; + } + } + } + + + + public ExtraKeysInfo getExtraKeysInfo() { + return mExtraKeysInfo; + } + + + + /** + * Load the {@link TermuxPropertyConstants#KEY_TERMINAL_TRANSCRIPT_ROWS} value from termux properties file on disk. + */ + public static int getTerminalTranscriptRows(Context context) { + return (int) TermuxSharedProperties.getInternalPropertyValue(context, TermuxPropertyConstants.KEY_TERMINAL_TRANSCRIPT_ROWS); + } + +} diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index 029994187..8ae89d373 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -15,15 +15,13 @@ - - - diff --git a/build.gradle b/build.gradle index 0663994ee..a829c2a77 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,11 @@ allprojects { repositories { google() jcenter() - + + maven { + name 'jitpack' + url 'https://jitpack.io' + } } } From 70a4007ba27df3ca2a3eb1ca02f81598ce451109 Mon Sep 17 00:00:00 2001 From: wisest_wizard <12suhangp34@gmail.com> Date: Mon, 30 Aug 2021 10:52:16 +0530 Subject: [PATCH 02/14] Remove old remnants of AdditionalKeyboardview --- .../termux/x11/AdditionalKeyboardView.java | 202 ------------------ .../java/com/termux/x11/LorieService.java | 20 +- .../java/com/termux/x11/MainActivity.java | 97 +++++++-- .../com/termux/x11/TerminalExtraKeys.java | 68 ++++-- .../termux/x11/TerminalToolbarViewPager.java | 105 +++++++++ .../termux/x11/TermuxAppSharedProperties.java | 7 +- app/src/main/res/layout/main_activity.xml | 20 +- .../view_terminal_toolbar_extra_keys.xml | 8 + .../view_terminal_toolbar_text_input.xml | 16 ++ app/src/main/res/xml/preferences.xml | 8 +- 10 files changed, 286 insertions(+), 265 deletions(-) delete mode 100644 app/src/main/java/com/termux/x11/AdditionalKeyboardView.java create mode 100644 app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java create mode 100644 app/src/main/res/layout/view_terminal_toolbar_extra_keys.xml create mode 100644 app/src/main/res/layout/view_terminal_toolbar_text_input.xml diff --git a/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java b/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java deleted file mode 100644 index 5436afa54..000000000 --- a/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.termux.x11; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; -import android.graphics.Rect; -import android.preference.PreferenceManager; -import androidx.appcompat.widget.AppCompatTextView; -import android.util.AttributeSet; -import android.util.Log; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewTreeObserver; -import android.widget.HorizontalScrollView; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.view.SurfaceView; -import java.util.HashMap; -import java.util.Map; - -@SuppressWarnings({"unused", "FieldCanBeLocal"}) -public class AdditionalKeyboardView extends HorizontalScrollView implements ViewTreeObserver.OnGlobalLayoutListener { - private final static int KEYCODE_BASE = 300; - public final static int PREFERENCES_KEY = KEYCODE_BASE + 1; - public final static int KEY_HEIGHT_DP = 35; - - private boolean softKbdVisible; - private Context ctx; - private View targetView = null; - private View.OnKeyListener targetListener = null; - private int density; - private LinearLayout root; - public AdditionalKeyboardView(Context context) { - super(context); - init(context); - } - public AdditionalKeyboardView(Context context, AttributeSet attrs) { - super(context, attrs); - init(context); - } - - @SuppressLint("SetTextI18n") - private void init(Context context) { - ctx = context; - density = (int) context.getResources().getDisplayMetrics().density; - - getViewTreeObserver().addOnGlobalLayoutListener(this); - - setBackgroundColor(0xFF000000); - LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, KEY_HEIGHT_DP * density); - root = new LinearLayout(context); - root.setLayoutParams(lp); - root.setOrientation(LinearLayout.HORIZONTAL); - addView(root); - } - - @Override - public void onGlobalLayout() { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx); - if (!preferences.getBoolean("showAdditionalKbd", true)) { - if (getVisibility() != View.GONE) - setVisibility(View.GONE); - return; - } else { - - int visibility = View.VISIBLE; - softKbdVisible = (visibility == View.VISIBLE); - - if (!softKbdVisible) - setVisibility(visibility); - } - } - - public void reload(int[] keys, View TargetView, View.OnKeyListener TargetListener) { - targetView = TargetView; - targetListener = TargetListener; - root.removeAllViews(); - LayoutParams lp = new LayoutParams(60 * density,LayoutParams.MATCH_PARENT); - lp.setMargins(density*3, 0, density*3, 0); - for (int keyCode : keys) { - if (keyCode != KeyEvent.KEYCODE_UNKNOWN) { - Key key = new Key(ctx, keyCode); - root.addView(key, lp); - } - } - } - - private class Key extends AppCompatTextView implements View.OnClickListener, View.OnTouchListener { - private static final int TEXT_COLOR = 0xFFFFFFFF; - private static final int BUTTON_COLOR = 0x0000FFFF; - private static final int INTERESTING_COLOR = 0xFF80DEEA; - private static final int BUTTON_PRESSED_COLOR = 0x7FFFFFFF; - /** - * Keys are displayed in a natural looking way, like "▶" for "RIGHT" - */ - final Map keyCodesForString = new HashMap() {{ - put(KeyEvent.KEYCODE_ESCAPE, "ESC"); - put(KeyEvent.KEYCODE_MOVE_HOME, "HOME"); - put(KeyEvent.KEYCODE_MOVE_END, "END"); - put(KeyEvent.KEYCODE_PAGE_UP, "PGUP"); - put(KeyEvent.KEYCODE_PAGE_DOWN, "PGDN"); - put(KeyEvent.KEYCODE_CTRL_LEFT, "CTRL"); - put(KeyEvent.KEYCODE_ALT_LEFT, "ALT"); - put(KeyEvent.KEYCODE_INSERT, "INS"); - put(KeyEvent.KEYCODE_FORWARD_DEL, "⌦"); // U+2326 ⌦ ERASE TO THE RIGHT not well known but easy to understand - put(KeyEvent.KEYCODE_DEL, "⌫"); // U+232B ⌫ ERASE TO THE LEFT sometimes seen and easy to understand - put(KeyEvent.KEYCODE_DPAD_UP, "▲"); // U+25B2 ▲ BLACK UP-POINTING TRIANGLE - put(KeyEvent.KEYCODE_DPAD_LEFT, "◀"); // U+25C0 ◀ BLACK LEFT-POINTING TRIANGLE - put(KeyEvent.KEYCODE_DPAD_RIGHT, "▶"); // U+25B6 ▶ BLACK RIGHT-POINTING TRIANGLE - put(KeyEvent.KEYCODE_DPAD_DOWN, "▼"); // U+25BC ▼ BLACK DOWN-POINTING TRIANGLE - put(KeyEvent.KEYCODE_ENTER, "↲"); // U+21B2 ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS - put(KeyEvent.KEYCODE_TAB, "↹"); // U+21B9 ↹ LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR - put(KeyEvent.KEYCODE_MINUS, "―"); // U+2015 ― HORIZONTAL BAR - put(-1, "⚙"); // U+2699 ⚙ GEAR - }}; - - void sendKey(int keyCode, boolean down) { - if (targetListener == null || targetView == null) { - Log.e("AdditionalKeyboardView", "target view or target listener is unset"); - return; - } - - targetListener.onKey(targetView, keyCode, new KeyEvent((down?KeyEvent.ACTION_DOWN:KeyEvent.ACTION_UP), keyCode)); - } - - boolean toggle; - boolean checked = false; - int kc; - public Key(Context context, int keyCode) { - super(context); - kc = keyCode; - switch (keyCode) { - case KeyEvent.KEYCODE_CTRL_LEFT: - case KeyEvent.KEYCODE_CTRL_RIGHT: - case KeyEvent.KEYCODE_ALT_LEFT: - case KeyEvent.KEYCODE_ALT_RIGHT: - case KeyEvent.KEYCODE_SHIFT_LEFT: - case KeyEvent.KEYCODE_SHIFT_RIGHT: - toggle = true; - break; - default: - toggle = false; - } - - - setTextColor(TEXT_COLOR); - setBackgroundColor(BUTTON_COLOR); - String text = keyCodesForString.get(keyCode); - float textWidth = getPaint().measureText(text); - setWidth((int) (textWidth + 20 * density)); - setText(text); - setGravity(Gravity.CENTER); - setOnClickListener(this); - setOnTouchListener(this); - } - - @Override - public void onClick(View v) { - if (toggle) { - checked = !checked; - if (checked) { - setTextColor(INTERESTING_COLOR); - setBackgroundColor(BUTTON_PRESSED_COLOR); - sendKey(kc, true); - } else { - setTextColor(TEXT_COLOR); - setBackgroundColor(BUTTON_COLOR); - sendKey(kc, false); - } - } - } - - private Rect rect; - @Override - public boolean onTouch(View v, MotionEvent e) { - switch(e.getAction()) { - case MotionEvent.ACTION_BUTTON_PRESS: - case MotionEvent.ACTION_POINTER_DOWN: - case MotionEvent.ACTION_DOWN: - setTextColor(INTERESTING_COLOR); - setBackgroundColor(BUTTON_PRESSED_COLOR); - if (!toggle) sendKey(kc, true); - break; - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_BUTTON_RELEASE: - case MotionEvent.ACTION_POINTER_UP: - case MotionEvent.ACTION_UP: - if (!toggle) { - setTextColor(TEXT_COLOR); - setBackgroundColor(BUTTON_COLOR); - sendKey(kc, false); - } - break; - default: - break; - } - return false; - } - } -} diff --git a/app/src/main/java/com/termux/x11/LorieService.java b/app/src/main/java/com/termux/x11/LorieService.java index ff0a9b25e..2c64ff41f 100644 --- a/app/src/main/java/com/termux/x11/LorieService.java +++ b/app/src/main/java/com/termux/x11/LorieService.java @@ -220,7 +220,6 @@ public int onStartCommand(Intent intent, int flags, int startId) { } onPreferencesChanged(); - return START_REDELIVER_INTENT; } @@ -399,7 +398,7 @@ public boolean onKey(View v, int keyCode, KeyEvent e) { svc.pointerButton(TouchParser.BTN_RIGHT, (e.getAction() == KeyEvent.ACTION_DOWN) ? TouchParser.ACTION_DOWN : TouchParser.ACTION_UP); rightPressed = (e.getAction() == KeyEvent.ACTION_DOWN); } else if (e.getAction() == KeyEvent.ACTION_UP) { - if (act.kbd!=null) act.kbd.requestFocus(); + if (act.getTerminalToolbarViewPager()!=null) act.getTerminalToolbarViewPager().requestFocus(); KeyboardUtils.toggleKeyboardVisibility(act); } return true; @@ -505,28 +504,28 @@ public static void unzip(InputStream zipStream, File targetDirectory) throws IOE private void windowChanged(Surface s, int w, int h, int pw, int ph) {windowChanged(compositor, s, w, h, pw, ph);} private native void windowChanged(long compositor, Surface surface, int width, int height, int mmWidth, int mmHeight); - + private void touchDown(int id, float x, float y) { touchDown(compositor, id, (int) x, (int) y); } private native void touchDown(long compositor, int id, int x, int y); - + private void touchMotion(int id, float x, float y) { touchMotion(compositor, id, (int) x, (int) y); } private native void touchMotion(long compositor, int id, int x, int y); - + private void touchUp(int id) { touchUp(compositor, id); } private native void touchUp(long compositor, int id); - + private void touchFrame() { touchFrame(compositor); } private native void touchFrame(long compositor); - + private void pointerMotion(float x, float y) { pointerMotion(compositor, (int) x, (int) y); } private native void pointerMotion(long compositor, int x, int y); - + private void pointerScroll(int axis, float value) { pointerScroll(compositor, axis, value); } private native void pointerScroll(long compositor, int axis, float value); - + private void pointerButton(int button, int type) { pointerButton(compositor, button, type); } private native void pointerButton(long compositor, int button, int type); - + private void keyboardKey(int key, int type, int shift, String characters) {keyboardKey(compositor, key, type, shift, characters);} private native void keyboardKey(long compositor, int key, int type, int shift, String characters); @@ -534,7 +533,6 @@ public static void unzip(InputStream zipStream, File targetDirectory) throws IOE private native void passWaylandFD(long compositor, int fd); private native long createLorieThread(); - private native void terminate(long compositor); public static native void startLogcatForFd(int fd); diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index 7cd5042e4..23ee80744 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -4,12 +4,15 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; -import android.os.Build; import android.preference.PreferenceManager; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; + import android.os.Bundle; +import android.os.Build; + import android.view.KeyEvent; import android.view.PointerIcon; import android.view.SurfaceView; @@ -17,18 +20,28 @@ import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; + +import android.view.ViewGroup; +import android.view.LayoutInflater; + +import android.widget.Toast; import android.widget.FrameLayout; + import com.termux.shared.terminal.io.extrakeys.ExtraKeysView; + import com.termux.x11.TermuxAppSharedProperties; import com.termux.x11.TerminalExtraKeys; +import com.termux.x11.TerminalToolbarViewPager; public class MainActivity extends AppCompatActivity { private TermuxAppSharedProperties mProperties; + private int mTerminalToolbarDefaultHeight; - ExtraKeysView kbd; + ExtraKeysView mExtraKeysView; FrameLayout frm; @Override + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -44,16 +57,15 @@ protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_activity); - kbd = findViewById(R.id.additionalKbd); frm = findViewById(R.id.frame); - kbd.setExtraKeysViewClient(new TerminalExtraKeys(LorieService.getOnKeyListener(), this)); + setTerminalToolbarView(); + toggleTerminalToolbar(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) getWindow(). getDecorView(). setPointerIcon(PointerIcon.getSystemIcon(this, PointerIcon.TYPE_NULL)); - Intent i = getIntent(); if (i != null && i.getStringExtra(LorieService.LAUNCHED_BY_COMPATION) == null) { LorieService.sendRunCommand(this); @@ -65,7 +77,7 @@ protected void onCreate(Bundle savedInstanceState) { public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); - if (newConfig.orientation != orientation && kbd != null && kbd.getVisibility() == View.VISIBLE) { + if (newConfig.orientation != orientation && this.getTerminalToolbarViewPager() != null && this.getTerminalToolbarViewPager().getVisibility() == View.VISIBLE) { InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); View view = getCurrentFocus(); if (view == null) { @@ -77,11 +89,65 @@ public void onConfigurationChanged(@NonNull Configuration newConfig) { orientation = newConfig.orientation; } + public TermuxAppSharedProperties getProperties() { + return mProperties; + } + + public ExtraKeysView getExtraKeysView() { + return mExtraKeysView; + } + + public void setExtraKeysView(ExtraKeysView extraKeysView) { + mExtraKeysView = extraKeysView; + } + public void onLorieServiceStart(LorieService instance) { + instance.setListeners(this.getlorieView()); + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + } + + public SurfaceView getlorieView() { SurfaceView lorieView = findViewById(R.id.lorieView); + return lorieView; + } + + public ViewPager getTerminalToolbarViewPager() { + return (ViewPager) findViewById(R.id.terminal_toolbar_view_pager); + } + + private void setTerminalToolbarView() { + final ViewPager terminalToolbarViewPager = getTerminalToolbarViewPager(); + + ViewGroup.LayoutParams layoutParams = terminalToolbarViewPager.getLayoutParams(); + mTerminalToolbarDefaultHeight = layoutParams.height; + + setLorieToolbarHeight(); + + terminalToolbarViewPager.setAdapter(new TerminalToolbarViewPager.PageAdapter(this, LorieService.getOnKeyListener())); + terminalToolbarViewPager.addOnPageChangeListener(new TerminalToolbarViewPager.OnPageChangeListener(this, terminalToolbarViewPager)); + } + + private void setLorieToolbarHeight() { + final ViewPager terminalToolbarViewPager = getTerminalToolbarViewPager(); + if (terminalToolbarViewPager == null) return; + + ViewGroup.LayoutParams layoutParams = terminalToolbarViewPager.getLayoutParams(); + layoutParams.height = (int) Math.round(mTerminalToolbarDefaultHeight * + (mProperties.getExtraKeysInfo() == null ? 0 : mProperties.getExtraKeysInfo().getMatrix().length) * + mProperties.getTerminalToolbarHeightScaleFactor()); + terminalToolbarViewPager.setLayoutParams(layoutParams); + } - instance.setListeners(lorieView); - kbd.reload(mProperties.getExtraKeysInfo()); + + public void toggleTerminalToolbar() { + final ViewPager terminalToolbarViewPager = getTerminalToolbarViewPager(); + if (terminalToolbarViewPager == null) return; + + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + boolean showNow = preferences.getBoolean("Toolbar", true); + + terminalToolbarViewPager.setVisibility(showNow ? View.VISIBLE : View.GONE); + findViewById(R.id.terminal_toolbar_view_pager).requestFocus(); } @Override @@ -113,22 +179,15 @@ public void onUserLeaveHint () { @Override public void onPictureInPictureModeChanged (boolean isInPictureInPictureMode, Configuration newConfig) { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); if (isInPictureInPictureMode) { - if (kbd.getVisibility() != View.GONE) - kbd.setVisibility(View.GONE); + if (this.getTerminalToolbarViewPager().getVisibility() != View.GONE) + this.getTerminalToolbarViewPager().setVisibility(View.GONE); frm.setPadding(0,0,0,0); return; } else { - if (kbd.getVisibility() != View.VISIBLE) - if (preferences.getBoolean("showAdditionalKbd", true)) { - kbd.setVisibility(View.VISIBLE); - int paddingDp = 35; - float density = this.getResources().getDisplayMetrics().density; - int paddingPixel = (int)(paddingDp * density); - frm.setPadding(0,0,0,paddingPixel); - } + if (this.getTerminalToolbarViewPager().getVisibility() != View.VISIBLE) + this.getTerminalToolbarViewPager().setVisibility(View.VISIBLE); return; } } diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index 13727ce5b..2def90bce 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -15,6 +15,7 @@ import android.view.KeyCharacterMap; import android.text.TextUtils; import android.app.ActivityManager; +import android.app.Activity; import java.lang.Character; @@ -58,7 +59,7 @@ public void onExtraKeyButtonClick(View view, ExtraKeyButton buttonInfo, Button b } else if (SpecialButton.FN.getKey().equals(key)) { fnDown = true; } else { - onTerminalExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); + onLorieExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); ctrlDown = false; altDown = false; shiftDown = false; @@ -71,18 +72,32 @@ public void onExtraKeyButtonClick(View view, ExtraKeyButton buttonInfo, Button b } protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrlDown, boolean altDown, boolean shiftDown, boolean fnDown) { - SurfaceView lorieView = act.findViewById(R.id.lorieView); if (PRIMARY_KEY_CODES_FOR_STRINGS.containsKey(key)) { Integer keyCode = PRIMARY_KEY_CODES_FOR_STRINGS.get(key); if (keyCode == null) return; int metaState = 0; - if (ctrlDown) metaState |= KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON; - if (altDown) metaState |= KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON; - if (shiftDown) metaState |= KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON; - if (fnDown) metaState |= KeyEvent.META_FUNCTION_ON; + int metaAltState = 0; - KeyEvent keyEvent = new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState); - mEventListener.onKey(lorieView, keyCode, keyEvent); + if (ctrlDown) { + metaState |= KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON; + } + + if (altDown) { + metaState |= KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON; + } + + if (shiftDown) { + metaState |= KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON; + } + + if (fnDown) { + metaState |= KeyEvent.META_FUNCTION_ON; + } + onControlCharused(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState), ctrlDown, fnDown, shiftDown, altDown); + + if (!ctrlDown | !altDown) { + onControlCharused(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState), ctrlDown, fnDown, shiftDown, altDown); + } } else { // not a control char @@ -93,7 +108,7 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl if (events != null) { for (KeyEvent event : events) { Integer keyCode = event.getKeyCode(); - mEventListener.onKey(lorieView, keyCode, event); + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(KeyEvent.ACTION_UP, keyCode)); } } }); @@ -106,12 +121,11 @@ public boolean performExtraKeyButtonHapticFeedback(View view, ExtraKeyButton but } public void paste(CharSequence input) { - SurfaceView lorieView = act.findViewById(R.id.lorieView); KeyEvent[] events = mVirtualKeyboardKeyCharacterMap.getEvents(input.toString().toCharArray()); if (events != null) { for (KeyEvent event : events) { Integer keyCode = event.getKeyCode(); - mEventListener.onKey(lorieView, keyCode, event); + mEventListener.onKey(act.getlorieView(), keyCode, event); } } } @@ -120,16 +134,15 @@ public void paste(CharSequence input) { public void onLorieExtraKeyButtonClick(View view, String key, boolean ctrlDown, boolean altDown, boolean shiftDown, boolean fnDown) { if ("KEYBOARD".equals(key)) { - if (act.kbd!=null) { - act.kbd.requestFocus(); + if (act.getTerminalToolbarViewPager()!=null) { + act.getTerminalToolbarViewPager().requestFocus(); KeyboardUtils.toggleKeyboardVisibility(act); } } else if ("DRAWER".equals(key)) { - Intent preferencesIntent = new Intent(act, LoriePreferences.class); - preferencesIntent.setAction(ACTION_START_PREFERENCES_ACTIVITY); - - PendingIntent pendingPreferencesIntent = PendingIntent.getActivity(act, 0, preferencesIntent, 0); + Intent preferencesIntent = new Intent(act, LoriePreferences.class); + preferencesIntent.setAction(ACTION_START_PREFERENCES_ACTIVITY); + act.startActivity(preferencesIntent); } else if ("PASTE".equals(key)) { @@ -146,4 +159,25 @@ public void onLorieExtraKeyButtonClick(View view, String key, boolean ctrlDown, } } + public void onControlCharused(View mview, int keyCode, KeyEvent e, boolean cd, boolean fnd, boolean sd, boolean altd) { + + mEventListener.onKey(mview, keyCode, e); + if (cd = true) { + readExtraKeysSpecialButton(SpecialButton.CTRL); + } + if (fnd = true) { + readExtraKeysSpecialButton(SpecialButton.FN); + } + if (sd = true) { + readExtraKeysSpecialButton(SpecialButton.SHIFT); + } + if (altd = true) { + readExtraKeysSpecialButton(SpecialButton.ALT); + } + } + + public void readExtraKeysSpecialButton(SpecialButton specialButton) { + Boolean state = act.getExtraKeysView().readSpecialButton(specialButton, true); + + } } diff --git a/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java b/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java new file mode 100644 index 000000000..885795d25 --- /dev/null +++ b/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java @@ -0,0 +1,105 @@ +package com.termux.x11; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.KeyEvent; +import android.view.KeyCharacterMap; + +import android.widget.EditText; + +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import com.termux.shared.terminal.io.extrakeys.ExtraKeysView; +import com.termux.x11.TerminalExtraKeys; + +public class TerminalToolbarViewPager { + + public static class PageAdapter extends PagerAdapter { + + final MainActivity act; + private final View.OnKeyListener mEventListener; + private final KeyCharacterMap mVirtualKeyboardKeyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); + + public PageAdapter(MainActivity activity, View.OnKeyListener listen) { + this.act = activity; + this.mEventListener = listen; + } + + @Override + public int getCount() { + return 2; + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return view == object; + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup collection, int position) { + LayoutInflater inflater = LayoutInflater.from(act); + View layout; + if (position == 0) { + layout = inflater.inflate(R.layout.view_terminal_toolbar_extra_keys, collection, false); + ExtraKeysView extraKeysView = (ExtraKeysView) layout; + extraKeysView.reload(act.getProperties().getExtraKeysInfo()); + extraKeysView.setExtraKeysViewClient(new TerminalExtraKeys(mEventListener, act)); + act.setExtraKeysView(extraKeysView); + } else { + layout = inflater.inflate(R.layout.view_terminal_toolbar_text_input, collection, false); + final EditText editText = layout.findViewById(R.id.terminal_toolbar_text_input); + + editText.setOnEditorActionListener((v, actionId, event) -> { + String textToSend = editText.getText().toString(); + if (textToSend.length() == 0) textToSend = "\r"; + + KeyEvent[] events = mVirtualKeyboardKeyCharacterMap.getEvents(textToSend.toCharArray()); + for (KeyEvent evnt : events) { + Integer keyCode = evnt.getKeyCode(); + mEventListener.onKey(act.getlorieView(), keyCode, evnt); + } + + editText.setText(""); + return true; + }); + } + collection.addView(layout); + return layout; + } + + @Override + public void destroyItem(@NonNull ViewGroup collection, int position, @NonNull Object view) { + collection.removeView((View) view); + } + + } + + + + public static class OnPageChangeListener extends ViewPager.SimpleOnPageChangeListener { + + final MainActivity act; + final ViewPager mTerminalToolbarViewPager; + + public OnPageChangeListener(MainActivity activity, ViewPager viewPager) { + this.act = activity; + this.mTerminalToolbarViewPager = viewPager; + } + + @Override + public void onPageSelected(int position) { + if (position == 0) { + act.getlorieView().requestFocus(); + } else { + final EditText editText = mTerminalToolbarViewPager.findViewById(R.id.terminal_toolbar_text_input); + if (editText != null) editText.requestFocus(); + } + } + + } + +} diff --git a/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java index 53be82860..a0faba33c 100644 --- a/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java +++ b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java @@ -22,9 +22,11 @@ public class TermuxAppSharedProperties extends TermuxSharedProperties { private ExtraKeysInfo mExtraKeysInfo; private static final String LOG_TAG = "TermuxAppSharedProperties"; + public static final String TERMUX_X11_APP_NAME = "Termux:X11"; public TermuxAppSharedProperties(@NonNull Context context) { - super(context); + super(context, TERMUX_X11_APP_NAME, TermuxPropertyConstants.getTermuxPropertiesFile(), + TermuxPropertyConstants.TERMUX_PROPERTIES_LIST, new SharedPropertiesParserClient()); } /** @@ -83,7 +85,8 @@ public ExtraKeysInfo getExtraKeysInfo() { * Load the {@link TermuxPropertyConstants#KEY_TERMINAL_TRANSCRIPT_ROWS} value from termux properties file on disk. */ public static int getTerminalTranscriptRows(Context context) { - return (int) TermuxSharedProperties.getInternalPropertyValue(context, TermuxPropertyConstants.KEY_TERMINAL_TRANSCRIPT_ROWS); + return (int) TermuxSharedProperties.getInternalPropertyValue(context, TermuxPropertyConstants.getTermuxPropertiesFile(), + TermuxPropertyConstants.KEY_TERMINAL_TRANSCRIPT_ROWS, new SharedPropertiesParserClient()); } } diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index 8ae89d373..90cf541a5 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -1,12 +1,13 @@ - + android:id="@+id/frame" + android:layout_above="@+id/terminal_toolbar_view_pager"> - + android:layout_height="37.5dp" + android:background="@android:drawable/screen_background_dark_transparent" + android:layout_alignParentBottom="true" /> - + diff --git a/app/src/main/res/layout/view_terminal_toolbar_extra_keys.xml b/app/src/main/res/layout/view_terminal_toolbar_extra_keys.xml new file mode 100644 index 000000000..2cafc9e43 --- /dev/null +++ b/app/src/main/res/layout/view_terminal_toolbar_extra_keys.xml @@ -0,0 +1,8 @@ + + diff --git a/app/src/main/res/layout/view_terminal_toolbar_text_input.xml b/app/src/main/res/layout/view_terminal_toolbar_text_input.xml new file mode 100644 index 000000000..86b3ce92d --- /dev/null +++ b/app/src/main/res/layout/view_terminal_toolbar_text_input.xml @@ -0,0 +1,16 @@ + + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 827577a94..a577b4ea4 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,12 +1,12 @@ - + - + android:summary="Show keyboard with additional keys. Will apply on app restart" + android:key="Toolbar" /> + Date: Mon, 20 Sep 2021 16:25:22 +0530 Subject: [PATCH 03/14] Code cleanup --- .../com/termux/x11/TerminalExtraKeys.java | 26 ++----------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index 2def90bce..0fc4a3287 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -93,10 +93,10 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl if (fnDown) { metaState |= KeyEvent.META_FUNCTION_ON; } - onControlCharused(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState), ctrlDown, fnDown, shiftDown, altDown); + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState)); if (!ctrlDown | !altDown) { - onControlCharused(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState), ctrlDown, fnDown, shiftDown, altDown); + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); } } else { @@ -158,26 +158,4 @@ public void onLorieExtraKeyButtonClick(View view, String key, boolean ctrlDown, onTerminalExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); } } - - public void onControlCharused(View mview, int keyCode, KeyEvent e, boolean cd, boolean fnd, boolean sd, boolean altd) { - - mEventListener.onKey(mview, keyCode, e); - if (cd = true) { - readExtraKeysSpecialButton(SpecialButton.CTRL); - } - if (fnd = true) { - readExtraKeysSpecialButton(SpecialButton.FN); - } - if (sd = true) { - readExtraKeysSpecialButton(SpecialButton.SHIFT); - } - if (altd = true) { - readExtraKeysSpecialButton(SpecialButton.ALT); - } - } - - public void readExtraKeysSpecialButton(SpecialButton specialButton) { - Boolean state = act.getExtraKeysView().readSpecialButton(specialButton, true); - - } } From bf27a0ad6bd6b4503bd37461e445c98e743465f0 Mon Sep 17 00:00:00 2001 From: Wisest_wizard <12suhangp34@gmail.com> Date: Mon, 27 Sep 2021 08:36:29 +0530 Subject: [PATCH 04/14] Add fullscreen mode again I hope this will not mess up with views like last time --- .../main/java/com/termux/x11/MainActivity.java | 16 ++++++++++++++++ app/src/main/res/xml/preferences.xml | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index 23ee80744..c3c08e6c2 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -157,6 +157,22 @@ public void onWindowFocusChanged(boolean hasFocus) SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); Window window = getWindow(); + if (hasFocus && preferences.getBoolean("fullscreen", false)) + { + window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + decorView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + decorView.setSystemUiVisibility(0); + } + if (preferences.getBoolean("Reseed", true)) { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index a577b4ea4..1c45ab756 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -7,6 +7,11 @@ android:summary="Show keyboard with additional keys. Will apply on app restart" android:key="Toolbar" /> + + Date: Mon, 27 Sep 2021 14:08:10 +0530 Subject: [PATCH 05/14] Try to fix problems with fullscreen and screen Reseeding --- .../java/com/termux/x11/MainActivity.java | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index c3c08e6c2..5434efed7 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -23,6 +23,8 @@ import android.view.ViewGroup; import android.view.LayoutInflater; +import android.view.ViewTreeObserver; +import android.graphics.Rect; import android.widget.Toast; import android.widget.FrameLayout; @@ -175,7 +177,13 @@ public void onWindowFocusChanged(boolean hasFocus) if (preferences.getBoolean("Reseed", true)) { - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + if (preferences.getBoolean("fullscreen", false)) + { + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + } else { + // Taken from Stackoverflow answer https://stackoverflow.com/questions/7417123/android-how-to-adjust-layout-in-full-screen-mode-when-softkeyboard-is-visible/7509285# + AndroidBug5497Workaround.assistActivity(this); + } } else { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN| WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); @@ -209,3 +217,52 @@ public void onPictureInPictureModeChanged (boolean isInPictureInPictureMode, Con } } + + +private class AndroidBug5497Workaround { + + // For more information, see https://issuetracker.google.com/issues/36911528 + // To use this class, simply invoke assistActivity() on an Activity that already has its content view set. + + public static void assistActivity (Activity activity) { + new AndroidBug5497Workaround(activity); + } + + private View mChildOfContent; + private int usableHeightPrevious; + private FrameLayout.LayoutParams frameLayoutParams; + + private AndroidBug5497Workaround(Activity activity) { + FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); + mChildOfContent = content.getChildAt(0); + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + public void onGlobalLayout() { + possiblyResizeChildOfContent(); + } + }); + frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); + } + + private void possiblyResizeChildOfContent() { + int usableHeightNow = computeUsableHeight(); + if (usableHeightNow != usableHeightPrevious) { + int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); + int heightDifference = usableHeightSansKeyboard - usableHeightNow; + if (heightDifference > (usableHeightSansKeyboard/4)) { + // keyboard probably just became visible + frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; + } else { + // keyboard probably just became hidden + frameLayoutParams.height = usableHeightSansKeyboard; + } + mChildOfContent.requestLayout(); + usableHeightPrevious = usableHeightNow; + } + } + + private int computeUsableHeight() { + Rect r = new Rect(); + mChildOfContent.getWindowVisibleDisplayFrame(r); + return (r.bottom - r.top); + } +} From dd8e108097d02eff7dc70148bb8574f436b7236d Mon Sep 17 00:00:00 2001 From: Wisest_wizard <12suhangp34@gmail.com> Date: Mon, 27 Sep 2021 14:29:26 +0530 Subject: [PATCH 06/14] Use a seperate public class for fullscreenworkaround --- .../com/termux/x11/Fullscreenworkaround.java | 55 ++++++++++++++++++ .../java/com/termux/x11/MainActivity.java | 57 ++----------------- 2 files changed, 59 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/com/termux/x11/Fullscreenworkaround.java diff --git a/app/src/main/java/com/termux/x11/Fullscreenworkaround.java b/app/src/main/java/com/termux/x11/Fullscreenworkaround.java new file mode 100644 index 000000000..c0639ef89 --- /dev/null +++ b/app/src/main/java/com/termux/x11/Fullscreenworkaround.java @@ -0,0 +1,55 @@ +package com.termux.x11; + +import android.view.ViewTreeObserver; +import android.graphics.Rect; +import android.widget.FrameLayout; +import android.view.View; +import android.app.Activity; + +public class Fullscreenworkaround { + + // For more information, see https://issuetracker.google.com/issues/36911528 + // To use this class, simply invoke assistActivity() on an Activity that already has its content view set. + + public static void assistActivity (Activity activity) { + new Fullscreenworkaround(activity); + } + + private View mChildOfContent; + private int usableHeightPrevious; + private FrameLayout.LayoutParams frameLayoutParams; + + private Fullscreenworkaround(Activity activity) { + FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); + mChildOfContent = content.getChildAt(0); + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + public void onGlobalLayout() { + possiblyResizeChildOfContent(); + } + }); + frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); + } + + private void possiblyResizeChildOfContent() { + int usableHeightNow = computeUsableHeight(); + if (usableHeightNow != usableHeightPrevious) { + int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); + int heightDifference = usableHeightSansKeyboard - usableHeightNow; + if (heightDifference > (usableHeightSansKeyboard/4)) { + // keyboard probably just became visible + frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; + } else { + // keyboard probably just became hidden + frameLayoutParams.height = usableHeightSansKeyboard; + } + mChildOfContent.requestLayout(); + usableHeightPrevious = usableHeightNow; + } + } + + private int computeUsableHeight() { + Rect r = new Rect(); + mChildOfContent.getWindowVisibleDisplayFrame(r); + return (r.bottom - r.top); + } +} diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index 5434efed7..a1d5c8476 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -23,8 +23,6 @@ import android.view.ViewGroup; import android.view.LayoutInflater; -import android.view.ViewTreeObserver; -import android.graphics.Rect; import android.widget.Toast; import android.widget.FrameLayout; @@ -34,6 +32,7 @@ import com.termux.x11.TermuxAppSharedProperties; import com.termux.x11.TerminalExtraKeys; import com.termux.x11.TerminalToolbarViewPager; +import com.termux.x11.Fullscreenworkaround; public class MainActivity extends AppCompatActivity { @@ -158,6 +157,7 @@ public void onWindowFocusChanged(boolean hasFocus) super.onWindowFocusChanged(hasFocus); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); Window window = getWindow(); + View decorView = window.getDecorView(); if (hasFocus && preferences.getBoolean("fullscreen", false)) { @@ -181,8 +181,8 @@ public void onWindowFocusChanged(boolean hasFocus) { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } else { - // Taken from Stackoverflow answer https://stackoverflow.com/questions/7417123/android-how-to-adjust-layout-in-full-screen-mode-when-softkeyboard-is-visible/7509285# - AndroidBug5497Workaround.assistActivity(this); + // Taken from Stackoverflow answer https://stackoverflow.com/questions/7417123/android-how-to-adjust-layout-in-full-screen-mode-when-softkeyboard-is-visible/7509285# + Fullscreenworkaround.assistActivity(this); } } else { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN| @@ -217,52 +217,3 @@ public void onPictureInPictureModeChanged (boolean isInPictureInPictureMode, Con } } - - -private class AndroidBug5497Workaround { - - // For more information, see https://issuetracker.google.com/issues/36911528 - // To use this class, simply invoke assistActivity() on an Activity that already has its content view set. - - public static void assistActivity (Activity activity) { - new AndroidBug5497Workaround(activity); - } - - private View mChildOfContent; - private int usableHeightPrevious; - private FrameLayout.LayoutParams frameLayoutParams; - - private AndroidBug5497Workaround(Activity activity) { - FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); - mChildOfContent = content.getChildAt(0); - mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - public void onGlobalLayout() { - possiblyResizeChildOfContent(); - } - }); - frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); - } - - private void possiblyResizeChildOfContent() { - int usableHeightNow = computeUsableHeight(); - if (usableHeightNow != usableHeightPrevious) { - int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); - int heightDifference = usableHeightSansKeyboard - usableHeightNow; - if (heightDifference > (usableHeightSansKeyboard/4)) { - // keyboard probably just became visible - frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; - } else { - // keyboard probably just became hidden - frameLayoutParams.height = usableHeightSansKeyboard; - } - mChildOfContent.requestLayout(); - usableHeightPrevious = usableHeightNow; - } - } - - private int computeUsableHeight() { - Rect r = new Rect(); - mChildOfContent.getWindowVisibleDisplayFrame(r); - return (r.bottom - r.top); - } -} From d59149cde1e8817b2d9963344ffe52d1a0fde3aa Mon Sep 17 00:00:00 2001 From: Suhan Paradkar <12suhangp34@gmail.com> Date: Fri, 17 Dec 2021 12:11:06 +0530 Subject: [PATCH 07/14] Try handling CTRL and ALT keys in Lorie --- .../java/com/termux/x11/LorieService.java | 6 ++--- .../com/termux/x11/TerminalExtraKeys.java | 6 ++--- .../jni/lorie/backend/android/android-app.cpp | 25 ++++++++++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/termux/x11/LorieService.java b/app/src/main/java/com/termux/x11/LorieService.java index 2c64ff41f..58393ec66 100644 --- a/app/src/main/java/com/termux/x11/LorieService.java +++ b/app/src/main/java/com/termux/x11/LorieService.java @@ -416,7 +416,7 @@ public boolean onKey(View v, int keyCode, KeyEvent e) { if (e.getAction() == KeyEvent.ACTION_DOWN) action = TouchParser.ACTION_DOWN; if (e.getAction() == KeyEvent.ACTION_UP) action = TouchParser.ACTION_UP; - svc.keyboardKey(action, keyCode, e.isShiftPressed() ? 1 : 0, e.getCharacters()); + svc.keyboardKey(action, keyCode, e.isShiftPressed() ? 1 : 0, e.isCtrlPressed() ? 1 : 0, e.isAltPressed() ? 1 : 0, e.getCharacters()); return true; } @@ -526,8 +526,8 @@ public static void unzip(InputStream zipStream, File targetDirectory) throws IOE private void pointerButton(int button, int type) { pointerButton(compositor, button, type); } private native void pointerButton(long compositor, int button, int type); - private void keyboardKey(int key, int type, int shift, String characters) {keyboardKey(compositor, key, type, shift, characters);} - private native void keyboardKey(long compositor, int key, int type, int shift, String characters); + private void keyboardKey(int key, int type, int shift, int ctrl, int alt, String characters) {keyboardKey(compositor, key, type, shift, ctrl, alt, characters);} + private native void keyboardKey(long compositor, int key, int type, int shift, int ctrl, int alt, String characters); private void passWaylandFD(int fd) {passWaylandFD(compositor, fd);} private native void passWaylandFD(long compositor, int fd); diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index 0fc4a3287..51c4595a9 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -93,11 +93,9 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl if (fnDown) { metaState |= KeyEvent.META_FUNCTION_ON; } - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState)); - if (!ctrlDown | !altDown) { - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); - } + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState)); + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); } else { // not a control char diff --git a/app/src/main/jni/lorie/backend/android/android-app.cpp b/app/src/main/jni/lorie/backend/android/android-app.cpp index 537af65ac..fba2a5c6d 100644 --- a/app/src/main/jni/lorie/backend/android/android-app.cpp +++ b/app/src/main/jni/lorie/backend/android/android-app.cpp @@ -318,7 +318,7 @@ extern "C" void android_keycode_get_eventcode(int kc, int *ec, int *shift); extern "C" JNIEXPORT void JNICALL JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, jlong jcompositor, jint type, - jint key_code, jint jshift, + jint key_code, jint jshift, jint jctrl, jint jalt, jstring characters_) { if (jcompositor == 0) return; LorieBackendAndroid *b = fromLong(jcompositor); @@ -327,6 +327,9 @@ JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, int event_code = 0; int shift = jshift; + int ctrl = jctrl; + int alt = jalt; + if (characters_ != nullptr) characters = (char*) env->GetStringUTFChars(characters_, nullptr); if (key_code && !characters) { android_keycode_get_eventcode(key_code, &event_code, &shift); @@ -363,6 +366,16 @@ JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, b->keyboard_key(42, WL_KEYBOARD_KEY_STATE_PRESSED); // Send KEY_LEFTSHIFT }); + if (ctrl || jctrl) + b->post([b]() { + b->keyboard_key(17, WL_KEYBOARD_KEY_STATE_PRESSED); + }); + + if (alt || jalt) + b->post([b]() { + b->keyboard_key(18, WL_KEYBOARD_KEY_STATE_PRESSED); + }); + // For some reason Android do not send ACTION_DOWN for non-English characters if (characters) b->post([b, event_code]() { @@ -373,6 +386,16 @@ JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, b->keyboard_key(static_cast(event_code), static_cast(type)); }); + if (alt || jalt) + b->post([b]() { + b->keyboard_key(18, WL_KEYBOARD_KEY_STATE_RELEASED); // Send KEY_LEFTSHIFT + }); + + if (ctrl || jctrl) + b->post([b]() { + b->keyboard_key(17, WL_KEYBOARD_KEY_STATE_RELEASED); // Send KEY_LEFTSHIFT + }); + if (shift || jshift) b->post([b]() { b->keyboard_key(42, WL_KEYBOARD_KEY_STATE_RELEASED); // Send KEY_LEFTSHIFT From 4bbc2d0a56db0e6154665b0148a07fb072e0bcad Mon Sep 17 00:00:00 2001 From: Suhan Paradkar <12suhangp34@gmail.com> Date: Sat, 18 Dec 2021 08:06:06 +0530 Subject: [PATCH 08/14] Try implementing seperate events for CTRL and ALT keys --- .../main/java/com/termux/x11/TerminalExtraKeys.java | 12 +++++++++++- .../main/jni/lorie/backend/android/android-app.cpp | 6 +++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index 51c4595a9..553362a49 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -59,12 +59,12 @@ public void onExtraKeyButtonClick(View view, ExtraKeyButton buttonInfo, Button b } else if (SpecialButton.FN.getKey().equals(key)) { fnDown = true; } else { - onLorieExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); ctrlDown = false; altDown = false; shiftDown = false; fnDown = false; } + onLorieExtraKeyButtonClick(view, key, ctrlDown, altDown, shiftDown, fnDown); } } else { onLorieExtraKeyButtonClick(view, buttonInfo.getKey(), false, false, false, false); @@ -80,10 +80,12 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl if (ctrlDown) { metaState |= KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON; + metaAltState |= KeyEvent.KEYCODE_CTRL_LEFT | KeyEvent.KEYCODE_CTRL_RIGHT; } if (altDown) { metaState |= KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON; + metaAltState |= KeyEvent.KEYCODE_ALT_LEFT | KeyEvent.KEYCODE_ALT_RIGHT; } if (shiftDown) { @@ -94,9 +96,17 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl metaState |= KeyEvent.META_FUNCTION_ON; } + if (metaAltState != 0) { + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); + } + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState)); mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); + if (metaAltState != 0) { + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); + } + } else { // not a control char key.codePoints().forEach(codePoint -> { diff --git a/app/src/main/jni/lorie/backend/android/android-app.cpp b/app/src/main/jni/lorie/backend/android/android-app.cpp index fba2a5c6d..814669aea 100644 --- a/app/src/main/jni/lorie/backend/android/android-app.cpp +++ b/app/src/main/jni/lorie/backend/android/android-app.cpp @@ -388,17 +388,17 @@ JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, if (alt || jalt) b->post([b]() { - b->keyboard_key(18, WL_KEYBOARD_KEY_STATE_RELEASED); // Send KEY_LEFTSHIFT + b->keyboard_key(18, WL_KEYBOARD_KEY_STATE_RELEASED); }); if (ctrl || jctrl) b->post([b]() { - b->keyboard_key(17, WL_KEYBOARD_KEY_STATE_RELEASED); // Send KEY_LEFTSHIFT + b->keyboard_key(17, WL_KEYBOARD_KEY_STATE_RELEASED); }); if (shift || jshift) b->post([b]() { - b->keyboard_key(42, WL_KEYBOARD_KEY_STATE_RELEASED); // Send KEY_LEFTSHIFT + b->keyboard_key(42, WL_KEYBOARD_KEY_STATE_RELEASED); }); if (characters_ != nullptr) env->ReleaseStringUTFChars(characters_, characters); From c76185fb150e02081468cb75388e498c9e161827 Mon Sep 17 00:00:00 2001 From: Suhan Paradkar <12suhangp34@gmail.com> Date: Sat, 18 Dec 2021 09:28:23 +0530 Subject: [PATCH 09/14] Revert "Try handling CTRL and ALT keys in Lorie" This reverts commit a1ad9ecd44632116530396894430f78602f55a2d. --- .../java/com/termux/x11/LorieService.java | 6 ++--- .../com/termux/x11/TerminalExtraKeys.java | 6 +++-- .../jni/lorie/backend/android/android-app.cpp | 25 +------------------ 3 files changed, 8 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/termux/x11/LorieService.java b/app/src/main/java/com/termux/x11/LorieService.java index 58393ec66..2c64ff41f 100644 --- a/app/src/main/java/com/termux/x11/LorieService.java +++ b/app/src/main/java/com/termux/x11/LorieService.java @@ -416,7 +416,7 @@ public boolean onKey(View v, int keyCode, KeyEvent e) { if (e.getAction() == KeyEvent.ACTION_DOWN) action = TouchParser.ACTION_DOWN; if (e.getAction() == KeyEvent.ACTION_UP) action = TouchParser.ACTION_UP; - svc.keyboardKey(action, keyCode, e.isShiftPressed() ? 1 : 0, e.isCtrlPressed() ? 1 : 0, e.isAltPressed() ? 1 : 0, e.getCharacters()); + svc.keyboardKey(action, keyCode, e.isShiftPressed() ? 1 : 0, e.getCharacters()); return true; } @@ -526,8 +526,8 @@ public static void unzip(InputStream zipStream, File targetDirectory) throws IOE private void pointerButton(int button, int type) { pointerButton(compositor, button, type); } private native void pointerButton(long compositor, int button, int type); - private void keyboardKey(int key, int type, int shift, int ctrl, int alt, String characters) {keyboardKey(compositor, key, type, shift, ctrl, alt, characters);} - private native void keyboardKey(long compositor, int key, int type, int shift, int ctrl, int alt, String characters); + private void keyboardKey(int key, int type, int shift, String characters) {keyboardKey(compositor, key, type, shift, characters);} + private native void keyboardKey(long compositor, int key, int type, int shift, String characters); private void passWaylandFD(int fd) {passWaylandFD(compositor, fd);} private native void passWaylandFD(long compositor, int fd); diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index 553362a49..25db41115 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -99,9 +99,11 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl if (metaAltState != 0) { mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); } - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState)); - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); + + if (!ctrlDown | !altDown) { + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); + } if (metaAltState != 0) { mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); diff --git a/app/src/main/jni/lorie/backend/android/android-app.cpp b/app/src/main/jni/lorie/backend/android/android-app.cpp index 814669aea..932591b2a 100644 --- a/app/src/main/jni/lorie/backend/android/android-app.cpp +++ b/app/src/main/jni/lorie/backend/android/android-app.cpp @@ -318,7 +318,7 @@ extern "C" void android_keycode_get_eventcode(int kc, int *ec, int *shift); extern "C" JNIEXPORT void JNICALL JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, jlong jcompositor, jint type, - jint key_code, jint jshift, jint jctrl, jint jalt, + jint key_code, jint jshift, jstring characters_) { if (jcompositor == 0) return; LorieBackendAndroid *b = fromLong(jcompositor); @@ -327,9 +327,6 @@ JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, int event_code = 0; int shift = jshift; - int ctrl = jctrl; - int alt = jalt; - if (characters_ != nullptr) characters = (char*) env->GetStringUTFChars(characters_, nullptr); if (key_code && !characters) { android_keycode_get_eventcode(key_code, &event_code, &shift); @@ -366,16 +363,6 @@ JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, b->keyboard_key(42, WL_KEYBOARD_KEY_STATE_PRESSED); // Send KEY_LEFTSHIFT }); - if (ctrl || jctrl) - b->post([b]() { - b->keyboard_key(17, WL_KEYBOARD_KEY_STATE_PRESSED); - }); - - if (alt || jalt) - b->post([b]() { - b->keyboard_key(18, WL_KEYBOARD_KEY_STATE_PRESSED); - }); - // For some reason Android do not send ACTION_DOWN for non-English characters if (characters) b->post([b, event_code]() { @@ -386,16 +373,6 @@ JNI_DECLARE(LorieService, keyboardKey)(JNIEnv *env, unused jobject instance, b->keyboard_key(static_cast(event_code), static_cast(type)); }); - if (alt || jalt) - b->post([b]() { - b->keyboard_key(18, WL_KEYBOARD_KEY_STATE_RELEASED); - }); - - if (ctrl || jctrl) - b->post([b]() { - b->keyboard_key(17, WL_KEYBOARD_KEY_STATE_RELEASED); - }); - if (shift || jshift) b->post([b]() { b->keyboard_key(42, WL_KEYBOARD_KEY_STATE_RELEASED); From 4de8153bdf6b84f639ee1b1f8406afa6c50c531e Mon Sep 17 00:00:00 2001 From: Suhan Paradkar <12suhangp34@gmail.com> Date: Sun, 19 Dec 2021 13:37:46 +0530 Subject: [PATCH 10/14] Fix sharedproperties --- .../java/com/termux/x11/MainActivity.java | 2 +- .../com/termux/x11/TerminalExtraKeys.java | 27 +++++----- .../termux/x11/TermuxAppSharedProperties.java | 49 +++++++++++++++++-- 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index a1d5c8476..ac457103c 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -46,7 +46,7 @@ public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mProperties = new TermuxAppSharedProperties(this); + mProperties = TermuxAppSharedProperties.build(this); LorieService.setMainActivity(this); LorieService.start(LorieService.ACTION_START_FROM_ACTIVITY); diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index 25db41115..98e5d0b13 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -33,6 +33,8 @@ public class TerminalExtraKeys implements ExtraKeysView.IExtraKeysView { private final View.OnKeyListener mEventListener; private final MainActivity act; + private int metaAltState = 0; + public TerminalExtraKeys(@NonNull View.OnKeyListener eventlistener, MainActivity mact) { mEventListener = eventlistener; act = mact; @@ -76,7 +78,6 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl Integer keyCode = PRIMARY_KEY_CODES_FOR_STRINGS.get(key); if (keyCode == null) return; int metaState = 0; - int metaAltState = 0; if (ctrlDown) { metaState |= KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON; @@ -96,18 +97,9 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl metaState |= KeyEvent.META_FUNCTION_ON; } - if (metaAltState != 0) { - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); - } - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState)); - - if (!ctrlDown | !altDown) { - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); - } - if (metaAltState != 0) { - mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); - } + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, metaState)); + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, metaState)); } else { // not a control char @@ -117,8 +109,19 @@ protected void onTerminalExtraKeyButtonClick(View view, String key, boolean ctrl KeyEvent[] events = mVirtualKeyboardKeyCharacterMap.getEvents(ch); if (events != null) { for (KeyEvent event : events) { + Integer keyCode = event.getKeyCode(); + + if (metaAltState != 0) { + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); + } + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(KeyEvent.ACTION_UP, keyCode)); + + if (metaAltState != 0) { + mEventListener.onKey(act.getlorieView(), keyCode, new KeyEvent(metaAltState, keyCode)); + metaAltState = 0; + } } } }); diff --git a/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java index a0faba33c..bb06a57b4 100644 --- a/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java +++ b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java @@ -1,6 +1,7 @@ package com.termux.x11; import android.content.Context; +import android.net.Uri; import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants; import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants.EXTRA_KEY_DISPLAY_MAPS; @@ -8,12 +9,17 @@ import com.termux.shared.logger.Logger; import com.termux.shared.settings.properties.TermuxPropertyConstants; import com.termux.shared.settings.properties.TermuxSharedProperties; +import com.termux.shared.termux.TermuxConstants; import org.json.JSONException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.io.File; +import java.io.InputStream; +import java.io.FileOutputStream; +import java.io.IOException; import androidx.annotation.NonNull; @@ -24,9 +30,46 @@ public class TermuxAppSharedProperties extends TermuxSharedProperties { private static final String LOG_TAG = "TermuxAppSharedProperties"; public static final String TERMUX_X11_APP_NAME = "Termux:X11"; - public TermuxAppSharedProperties(@NonNull Context context) { - super(context, TERMUX_X11_APP_NAME, TermuxPropertyConstants.getTermuxPropertiesFile(), - TermuxPropertyConstants.TERMUX_PROPERTIES_LIST, new SharedPropertiesParserClient()); + private TermuxAppSharedProperties(@NonNull Context context, File propertiesFile) { + super(context, TERMUX_X11_APP_NAME, propertiesFile, + TermuxPropertyConstants.TERMUX_PROPERTIES_LIST, new SharedPropertiesParserClient()); + } + + public static TermuxAppSharedProperties build(Context context) { + Uri propertiesFileUri = Uri.parse("content://" + TermuxConstants.TERMUX_FILE_SHARE_URI_AUTHORITY + TermuxConstants.TERMUX_PROPERTIES_PRIMARY_FILE_PATH); + File propertiesFile = new File(context.getFilesDir(), "termux.properties"); + runTermuxContentProviderReadCommand(context, propertiesFileUri, propertiesFile); + return new TermuxAppSharedProperties(context, propertiesFile); + } + + private static void runTermuxContentProviderReadCommand(Context context, Uri inputUri, File outFile) { + InputStream inputStream = null; + FileOutputStream fileOutputStream = null; + + try { + inputStream = context.getContentResolver().openInputStream(inputUri); + + if (!outFile.exists()) + outFile.createNewFile(); + fileOutputStream = new FileOutputStream(outFile); + byte[] buffer = new byte[4096]; + int readBytes; + while ((readBytes = inputStream.read(buffer)) > 0) { + // Log.d(LOG_TAG, "data: " + new String(buffer, 0, readBytes, Charset.defaultCharset())); + fileOutputStream.write(buffer, 0, readBytes); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (inputStream != null) + inputStream.close(); + if (fileOutputStream != null) + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } /** From f5fdaebac74c4247fe05ac327b8e75077b7becf0 Mon Sep 17 00:00:00 2001 From: Suhan Paradkar <12suhangp34@gmail.com> Date: Wed, 22 Dec 2021 08:00:27 +0530 Subject: [PATCH 11/14] Send Keyevents for Specialbuttons --- app/build.gradle | 2 +- .../java/com/termux/x11/TerminalExtraKeys.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5ea069b31..5b8bf2f35 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,6 +59,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'androidx.annotation:annotation:1.3.0' implementation 'androidx.drawerlayout:drawerlayout:1.1.1' - implementation 'com.termux.termux-app:termux-shared:master-SNAPSHOT' + implementation 'com.github.agnostic-apollo.termux-app:termux-shared:temp-extrakeys-SNAPSHOT' implementation "com.google.guava:guava:24.1-jre" } diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index 98e5d0b13..be7cb67ff 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -43,6 +43,23 @@ public TerminalExtraKeys(@NonNull View.OnKeyListener eventlistener, MainActivity private final KeyCharacterMap mVirtualKeyboardKeyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); static final String ACTION_START_PREFERENCES_ACTIVITY = "com.termux.x11.start_preferences_activity"; + @Override + public void onAnyExtraKeyButtonClick(View view, @NonNull ExtraKeyButton buttonInfo, Button button) { + if (isSpecialButton(buttonInfo)) { + if (mLongPressCount > 0) return; + SpecialButtonState state = mSpecialButtons.get(SpecialButton.valueOf(buttonInfo.getKey())); + if (state == null) return; + super.onExtraKeyButtonClick(view, buttonInfo, button); + + // Toggle active state and disable lock state if new state is not active + state.setIsActive(!state.isActive); + if (!state.isActive) + state.setIsLocked(false); + } else { + super.onExtraKeyButtonClick(view, buttonInfo, button); + } + } + @Override public void onExtraKeyButtonClick(View view, ExtraKeyButton buttonInfo, Button button) { if (buttonInfo.isMacro()) { From c54811f3e8cfbacc83e83da4cd161ed352fb6904 Mon Sep 17 00:00:00 2001 From: Suhan Paradkar <12suhangp34@gmail.com> Date: Wed, 22 Dec 2021 11:49:32 +0530 Subject: [PATCH 12/14] Update TerminalExtraKeys constructor --- app/src/main/java/com/termux/x11/TerminalExtraKeys.java | 4 +++- .../main/java/com/termux/x11/TerminalToolbarViewPager.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index be7cb67ff..d5f83e7e8 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -32,12 +32,14 @@ public class TerminalExtraKeys implements ExtraKeysView.IExtraKeysView { private final View.OnKeyListener mEventListener; private final MainActivity act; + private final ExtraKeysView mExtraKeysView; private int metaAltState = 0; - public TerminalExtraKeys(@NonNull View.OnKeyListener eventlistener, MainActivity mact) { + public TerminalExtraKeys(@NonNull View.OnKeyListener eventlistener, MainActivity mact, ExtraKeysView extrakeysview) { mEventListener = eventlistener; act = mact; + mExtraKeysView = extrakeysview; } private final KeyCharacterMap mVirtualKeyboardKeyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); diff --git a/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java b/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java index 885795d25..2b8c85c05 100644 --- a/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java +++ b/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java @@ -47,7 +47,7 @@ public Object instantiateItem(@NonNull ViewGroup collection, int position) { layout = inflater.inflate(R.layout.view_terminal_toolbar_extra_keys, collection, false); ExtraKeysView extraKeysView = (ExtraKeysView) layout; extraKeysView.reload(act.getProperties().getExtraKeysInfo()); - extraKeysView.setExtraKeysViewClient(new TerminalExtraKeys(mEventListener, act)); + extraKeysView.setExtraKeysViewClient(new TerminalExtraKeys(mEventListener, act, extraKeysView)); act.setExtraKeysView(extraKeysView); } else { layout = inflater.inflate(R.layout.view_terminal_toolbar_text_input, collection, false); From 13d99f6102c47e0f2bc0bba581eea57811d5c364 Mon Sep 17 00:00:00 2001 From: Wisest_wizard <76830230+suhan-paradkar@users.noreply.github.com> Date: Mon, 6 Jun 2022 09:27:23 +0530 Subject: [PATCH 13/14] Update build.gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5b8bf2f35..5ea069b31 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,6 +59,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'androidx.annotation:annotation:1.3.0' implementation 'androidx.drawerlayout:drawerlayout:1.1.1' - implementation 'com.github.agnostic-apollo.termux-app:termux-shared:temp-extrakeys-SNAPSHOT' + implementation 'com.termux.termux-app:termux-shared:master-SNAPSHOT' implementation "com.google.guava:guava:24.1-jre" } From e4884510aacd5736cbe70302f63f727b72a64272 Mon Sep 17 00:00:00 2001 From: Wisest_wizard <12suhangp34@gmail.com> Date: Mon, 6 Jun 2022 11:49:53 +0530 Subject: [PATCH 14/14] Fix imports --- app/src/main/java/com/termux/x11/MainActivity.java | 2 +- .../main/java/com/termux/x11/TerminalExtraKeys.java | 8 ++++---- .../java/com/termux/x11/TerminalToolbarViewPager.java | 2 +- .../java/com/termux/x11/TermuxAppSharedProperties.java | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index ac457103c..ba94a16e7 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -27,7 +27,7 @@ import android.widget.Toast; import android.widget.FrameLayout; -import com.termux.shared.terminal.io.extrakeys.ExtraKeysView; +import com.termux.shared.termux.extrakeys.ExtraKeysView; import com.termux.x11.TermuxAppSharedProperties; import com.termux.x11.TerminalExtraKeys; diff --git a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java index d5f83e7e8..01a0f178f 100644 --- a/app/src/main/java/com/termux/x11/TerminalExtraKeys.java +++ b/app/src/main/java/com/termux/x11/TerminalExtraKeys.java @@ -22,11 +22,11 @@ import androidx.annotation.NonNull; import androidx.drawerlayout.widget.DrawerLayout; -import com.termux.shared.terminal.io.extrakeys.ExtraKeyButton; -import com.termux.shared.terminal.io.extrakeys.ExtraKeysView; -import com.termux.shared.terminal.io.extrakeys.SpecialButton; +import com.termux.shared.termux.extrakeys.ExtraKeyButton; +import com.termux.shared.termux.extrakeys.ExtraKeysView; +import com.termux.shared.termux.extrakeys.SpecialButton; -import static com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants.PRIMARY_KEY_CODES_FOR_STRINGS; +import static com.termux.shared.termux.extrakeys.ExtraKeysConstants.PRIMARY_KEY_CODES_FOR_STRINGS; public class TerminalExtraKeys implements ExtraKeysView.IExtraKeysView { diff --git a/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java b/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java index 2b8c85c05..a6c7a2746 100644 --- a/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java +++ b/app/src/main/java/com/termux/x11/TerminalToolbarViewPager.java @@ -12,7 +12,7 @@ import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; -import com.termux.shared.terminal.io.extrakeys.ExtraKeysView; +import com.termux.shared.termux.extrakeys.ExtraKeysView; import com.termux.x11.TerminalExtraKeys; public class TerminalToolbarViewPager { diff --git a/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java index bb06a57b4..991698f6f 100644 --- a/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java +++ b/app/src/main/java/com/termux/x11/TermuxAppSharedProperties.java @@ -3,12 +3,12 @@ import android.content.Context; import android.net.Uri; -import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants; -import com.termux.shared.terminal.io.extrakeys.ExtraKeysConstants.EXTRA_KEY_DISPLAY_MAPS; -import com.termux.shared.terminal.io.extrakeys.ExtraKeysInfo; +import com.termux.shared.termux.extrakeys.ExtraKeysConstants; +import com.termux.shared.termux.extrakeys.ExtraKeysConstants.EXTRA_KEY_DISPLAY_MAPS; +import com.termux.shared.termux.extrakeys.ExtraKeysInfo; import com.termux.shared.logger.Logger; -import com.termux.shared.settings.properties.TermuxPropertyConstants; -import com.termux.shared.settings.properties.TermuxSharedProperties; +import com.termux.shared.termux.settings.properties.TermuxPropertyConstants; +import com.termux.shared.termux.settings.properties.TermuxSharedProperties; import com.termux.shared.termux.TermuxConstants; import org.json.JSONException;