From 70dd3f323ed44b69c5340ccea43dde9d8c2c1d9a Mon Sep 17 00:00:00 2001 From: mcfans Date: Mon, 30 Oct 2023 07:46:29 +0800 Subject: [PATCH] fix: update text selection for API level lower than 33 --- .../com/carriez/flutter_hbb/InputService.kt | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt index 86608e3c3..7637cb1bb 100644 --- a/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt +++ b/flutter/android/app/src/main/kotlin/com/carriez/flutter_hbb/InputService.kt @@ -19,6 +19,7 @@ import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo import android.accessibilityservice.AccessibilityServiceInfo import android.accessibilityservice.AccessibilityServiceInfo.FLAG_INPUT_METHOD_EDITOR +import android.view.inputmethod.EditorInfo import androidx.annotation.RequiresApi import java.util.* import java.lang.Character @@ -319,6 +320,9 @@ class InputService : AccessibilityService() { } private fun insertAccessibilityNode(list: LinkedList, node: AccessibilityNodeInfo) { + if (node == null) { + return + } if (list.contains(node)) { return } @@ -410,6 +414,8 @@ class InputService : AccessibilityService() { private fun trySendKeyEvent(event: android.view.KeyEvent, node: AccessibilityNodeInfo, textToCommit: String?): Boolean { node.refresh() + this.fakeEditTextForTextStateCalculation?.setSelection(0,0) + this.fakeEditTextForTextStateCalculation?.setText(null) val text = node.getText() var isShowingHint = false if (Build.VERSION.SDK_INT >= 26) { @@ -463,7 +469,13 @@ class InputService : AccessibilityService() { textSelectionEnd ) } - this.fakeEditTextForTextStateCalculation?.dispatchKeyEvent(event) + + this.fakeEditTextForTextStateCalculation?.let { + val inputConnection = it.onCreateInputConnection(EditorInfo()) + if (inputConnection != null) { + success = inputConnection.sendKeyEvent(event) + } + } this.fakeEditTextForTextStateCalculation?.getText()?.let { newText -> val arguments = Bundle() @@ -473,6 +485,24 @@ class InputService : AccessibilityService() { ) success = node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments) } + + if (success && this.fakeEditTextForTextStateCalculation != null) { + val selectionStart = this.fakeEditTextForTextStateCalculation?.selectionStart + val selectionEnd = this.fakeEditTextForTextStateCalculation?.selectionEnd + + if (selectionStart != null && selectionEnd != null) { + val arguments = Bundle() + arguments.putInt( + AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, + selectionStart + ) + arguments.putInt( + AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, + selectionEnd + ) + success = node.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments) + } + } } return success }