From aa83f448f91de733c4466c7e9a0324d0d4378937 Mon Sep 17 00:00:00 2001 From: KoheiYamashita Date: Sun, 22 Feb 2026 12:08:32 +0900 Subject: [PATCH] fix: inputText searches non-overlay windows for focused input field Same rootInActiveWindow issue as getCurrentPackage - the overlay window was being searched instead of the actual foreground app. Co-Authored-By: Claude Opus 4.6 --- .../io/picoclaw/android/assistant/DeviceController.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/io/picoclaw/android/assistant/DeviceController.kt b/android/app/src/main/java/io/picoclaw/android/assistant/DeviceController.kt index 0405c759b..d0dad59cc 100644 --- a/android/app/src/main/java/io/picoclaw/android/assistant/DeviceController.kt +++ b/android/app/src/main/java/io/picoclaw/android/assistant/DeviceController.kt @@ -66,8 +66,15 @@ class DeviceController { suspend fun inputText(text: String): Boolean { val svc = service ?: return false - val focusedNode = svc.rootInActiveWindow?.findFocus(AccessibilityNodeInfo.FOCUS_INPUT) - ?: return false + val ownPackage = svc.packageName + // Search non-overlay windows for the focused input field + val focusedNode = svc.windows + .filter { it.type == android.view.accessibility.AccessibilityWindowInfo.TYPE_APPLICATION } + .firstNotNullOfOrNull { win -> + val root = win.root ?: return@firstNotNullOfOrNull null + if (root.packageName?.toString() == ownPackage) return@firstNotNullOfOrNull null + root.findFocus(AccessibilityNodeInfo.FOCUS_INPUT) + } ?: return false val args = Bundle().apply { putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text) }