From 382da7e8f7374d9c073abe0a6ad94c0174830074 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Wed, 26 Aug 2020 20:04:17 +0300 Subject: [PATCH] terminal view: provide a workaroud for issue with some keyboards Issue https://github.com/termux/termux-app/issues/686. Note that there can be a better workaround which I don't know... --- .../java/com/termux/view/TerminalView.java | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index 76f6380e..b612c510 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -44,6 +44,12 @@ import com.termux.terminal.TerminalEmulator; import com.termux.terminal.TerminalSession; import com.termux.terminal.WcWidth; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Properties; + /** View displaying and interacting with a {@link TerminalSession}. */ public final class TerminalView extends View { @@ -246,14 +252,36 @@ public final class TerminalView extends View { @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { - // Using InputType.NULL is the most correct input type and avoids issues with other hacks. - // - // Previous keyboard issues: - // https://github.com/termux/termux-packages/issues/25 - // https://github.com/termux/termux-app/issues/87. - // https://github.com/termux/termux-app/issues/126. - // https://github.com/termux/termux-app/issues/137 (japanese chars and TYPE_NULL). - outAttrs.inputType = InputType.TYPE_NULL; + File propsFile = new File(getContext().getFilesDir() + "/home/.termux/termux.properties"); + if (!propsFile.exists()) + propsFile = new File(getContext().getFilesDir() + "/home/.config/termux/termux.properties"); + + Properties props = new Properties(); + try { + if (propsFile.isFile() && propsFile.canRead()) { + try (FileInputStream in = new FileInputStream(propsFile)) { + props.load(new InputStreamReader(in, StandardCharsets.UTF_8)); + } + } + } catch (Exception e) { + Log.e("termux", "Error loading props", e); + } + + if (props.getProperty("enforce-char-based-input", "false").equals("true")) { + // Some keyboards seems do not reset the internal state on TYPE_NULL. + // Affects mostly Samsung stock keyboards. + // https://github.com/termux/termux-app/issues/686 + outAttrs.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + } else { + // Using InputType.NULL is the most correct input type and avoids issues with other hacks. + // + // Previous keyboard issues: + // https://github.com/termux/termux-packages/issues/25 + // https://github.com/termux/termux-app/issues/87. + // https://github.com/termux/termux-app/issues/126. + // https://github.com/termux/termux-app/issues/137 (japanese chars and TYPE_NULL). + outAttrs.inputType = InputType.TYPE_NULL; + } // Note that IME_ACTION_NONE cannot be used as that makes it impossible to input newlines using the on-screen // keyboard on Android TV (see https://github.com/termux/termux-app/issues/221).