From bd6347ddda0a233607fe14afb44449d925c4715a Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Thu, 16 Jun 2022 18:31:08 +0500 Subject: [PATCH] Added: Add support for sending terminal cursor position to accessibility apps like brltty --- .../java/com/termux/view/TerminalView.java | 9 ++++- .../TerminalAccessibilityDelegate.java | 39 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 terminal-view/src/main/java/com/termux/view/accessibility/TerminalAccessibilityDelegate.java 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 2bed7cab..0e081bd1 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -23,6 +23,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewTreeObserver; +import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.autofill.AutofillValue; import android.view.inputmethod.BaseInputConnection; @@ -35,6 +36,7 @@ import androidx.annotation.RequiresApi; import com.termux.terminal.KeyHandler; import com.termux.terminal.TerminalEmulator; import com.termux.terminal.TerminalSession; +import com.termux.view.accessibility.TerminalAccessibilityDelegate; import com.termux.view.textselection.TextSelectionCursorController; /** View displaying and interacting with a {@link TerminalSession}. */ @@ -217,6 +219,7 @@ public final class TerminalView extends View { mScroller = new Scroller(context); AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE); mAccessibilityEnabled = am.isEnabled(); + setAccessibilityDelegate(new TerminalAccessibilityDelegate(this)); } @@ -443,7 +446,9 @@ public final class TerminalView extends View { mEmulator.clearScrollCounter(); invalidate(); - if (mAccessibilityEnabled) setContentDescription(getText()); + + if (mAccessibilityEnabled) + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); } /** @@ -938,7 +943,7 @@ public final class TerminalView extends View { return mTermSession; } - private CharSequence getText() { + public CharSequence getText() { return mEmulator.getScreen().getSelectedText(0, mTopRow, mEmulator.mColumns, mTopRow + mEmulator.mRows); } diff --git a/terminal-view/src/main/java/com/termux/view/accessibility/TerminalAccessibilityDelegate.java b/terminal-view/src/main/java/com/termux/view/accessibility/TerminalAccessibilityDelegate.java new file mode 100644 index 00000000..4ad3a326 --- /dev/null +++ b/terminal-view/src/main/java/com/termux/view/accessibility/TerminalAccessibilityDelegate.java @@ -0,0 +1,39 @@ +package com.termux.view.accessibility; + +import android.os.Bundle; +import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; + +import androidx.annotation.NonNull; + +import com.termux.view.TerminalView; + +public class TerminalAccessibilityDelegate extends View.AccessibilityDelegate { + + private static final String LOG_TAG = "TerminalAccessibilityDelegate"; + + public static String EXTRA_ACCESSIBILITY_NODE_TYPE = "accessibility-node-type"; + public static String EXTRA_TERMINAL_CURSOR_COL = "terminal-cursor-col"; + public static String EXTRA_TERMINAL_CURSOR_ROW = "terminal-cursor-row"; + + private final TerminalView mTerminalView; + + public TerminalAccessibilityDelegate(@NonNull TerminalView terminalView) { + mTerminalView = terminalView; + } + + @Override + public void onInitializeAccessibilityNodeInfo(@NonNull View host, @NonNull AccessibilityNodeInfo info) { + mTerminalView.mClient.logInfo(LOG_TAG, "onInitializeAccessibilityNodeInfo"); + super.onInitializeAccessibilityNodeInfo(host, info); + Bundle extra = info.getExtras(); + if (mTerminalView.mEmulator != null) { + extra.putString(EXTRA_ACCESSIBILITY_NODE_TYPE, "terminal"); + extra.putInt(EXTRA_TERMINAL_CURSOR_COL, mTerminalView.mEmulator.getCursorCol()); + extra.putInt(EXTRA_TERMINAL_CURSOR_ROW, mTerminalView.mEmulator.getCursorRow()); + mTerminalView.mClient.logInfo(LOG_TAG, "col=" + mTerminalView.mEmulator.getCursorCol() + ", row=" + mTerminalView.mEmulator.getCursorRow()); + } + + info.setContentDescription(mTerminalView.getText()); + } +}