From a59b46fd6e31e602e0e832c2ff3942eaa84cf029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 19:19:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A0=E9=9A=9C=E7=A2=8D?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/modules/__automator__.js | 8 +++- .../accessibility/AccessibilityService.kt | 38 ++++++++++++++++--- .../accessibility/SimpleActionAutomator.kt | 19 +++++++++- .../automator/AccessibilityEventWrapper.kt | 27 +++++++++++++ .../autojs/autojs/runtime/ScriptRuntime.java | 4 +- version.properties | 6 +-- 6 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt diff --git a/app/src/main/assets/modules/__automator__.js b/app/src/main/assets/modules/__automator__.js index 1f7d05bc..fb148f5a 100644 --- a/app/src/main/assets/modules/__automator__.js +++ b/app/src/main/assets/modules/__automator__.js @@ -61,9 +61,15 @@ module.exports = function (scriptRuntime, scope) { return util.java.toJsArray(a11yBridge.windowRoots(), false) .map(root => UiObject.createRoot(root)); }, - stateListener(listener){ + stateListener(listener) { return a11yBridge.setAccessibilityListener(listener); }, + registerEvents(name, listener) { + return rtAutomator.registerEvents(name, listener); + }, + removeEvents(name) { + return rtAutomator.removeEvents(name); + }, waitFor(timeout) { automator.waitForService(timeout); }, diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt index ab6af890..a423910c 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt @@ -9,16 +9,17 @@ import android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED import android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED import android.view.accessibility.AccessibilityNodeInfo import org.autojs.autojs.AutoJs +import org.autojs.autojs.core.automator.AccessibilityEventWrapper import org.autojs.autojs.event.EventDispatcher import org.autojs.autojs.pref.Pref -import java.util.TreeMap +import java.util.* import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock interface AccessibilityServiceCallback { - fun onServiceConnected() - fun onServiceDisconnected() + fun onConnected() + fun onDisconnected() } /** * Created by Stardust on 2017/5/2. @@ -28,16 +29,38 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ val keyInterrupterObserver = KeyInterceptor.Observer() var fastRootInActiveWindow: AccessibilityNodeInfo? = null var bridge: AccessibilityBridge? = null + private val eventBox = TreeMap() private val gestureEventDispatcher = EventDispatcher() private val eventExecutor by lazy { Executors.newSingleThreadExecutor() } + private fun eventNameToType(str: String): Int { + return try { + val sb = StringBuilder() + sb.append("TYPE_") + val upperCase = str.uppercase(Locale.getDefault()) + sb.append(upperCase) + AccessibilityEvent::class.java.getField(sb.toString()).get(null) as Int + } catch (unused: NoSuchFieldException) { + throw IllegalArgumentException("unknown event type: $str") + } + } + + fun addAccessibilityEventCallback(name: String, callback: AccessibilityEventCallback) { + eventBox[eventNameToType(name)] = callback + } + + fun removeAccessibilityEventCallback(name: String) { + eventBox.remove(eventNameToType(name)) + } + override fun onAccessibilityEvent(event: AccessibilityEvent) { if (instance != this) { instance = this } val type = event.eventType + eventBox[type]?.onAccessibilityEvent(AccessibilityEventWrapper(event)) if (containsAllEventTypes || eventTypes.contains(type)) { if (type == TYPE_WINDOW_STATE_CHANGED || type == TYPE_VIEW_FOCUSED) { rootInActiveWindow?.also { fastRootInActiveWindow = it } @@ -90,7 +113,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ instance = null bridge = null eventExecutor.shutdownNow() - callback?.onServiceDisconnected() + callback?.onDisconnected() super.onDestroy() } @@ -107,7 +130,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ } } } - callback?.onServiceConnected() + callback?.onConnected() super.onServiceConnected() LOCK.lock() @@ -147,6 +170,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ fun isNotRunning() = !isRunning() fun addDelegate(uniquePriority: Int, delegate: AccessibilityDelegate) { + //用于记录eventTypes中的事件id delegates[uniquePriority] = delegate val set = delegate.eventTypes if (set == null) { @@ -184,7 +208,9 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ LOCK.unlock() } } - + fun clearAccessibilityEventCallback() { + instance?.eventBox?.clear() + } fun setCallback(listener: AccessibilityServiceCallback) { callback = listener } diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt index 00821d10..1460a2c8 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt @@ -16,6 +16,7 @@ import androidx.annotation.RequiresApi import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import org.autojs.autojs.annotation.ScriptInterface import org.autojs.autojs.core.accessibility.AccessibilityService.Companion.isRunning +import org.autojs.autojs.core.automator.AccessibilityEventWrapper import org.autojs.autojs.core.automator.GlobalActionAutomator import org.autojs.autojs.core.automator.UiObject import org.autojs.autojs.core.automator.action.ActionFactory @@ -27,7 +28,11 @@ import org.autojs.autojs.runtime.accessibility.AccessibilityConfig import org.autojs.autojs.runtime.api.ScreenMetrics import org.autojs.autojs.runtime.api.ScriptPromiseAdapter import org.autojs.autojs.util.DeveloperUtils +import java.util.concurrent.atomic.AtomicInteger +interface AccessibilityEventCallback { + fun onAccessibilityEvent(event: AccessibilityEventWrapper) +} /** * Created by Stardust on 2017/4/2. @@ -182,6 +187,18 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge @ScriptInterface fun ensureService() = accessibilityBridge.ensureServiceEnabled() + //todo:优化实现方式 + fun registerEvents(eventName: String,callback: AccessibilityEventCallback) { + ensureService() + val service = org.autojs.autojs.core.accessibility.AccessibilityService.instance + service?.addAccessibilityEventCallback(eventName,callback) + } + + fun removeEvents(eventName: String) { + val service = org.autojs.autojs.core.accessibility.AccessibilityService.instance + service?.removeAccessibilityEventCallback(eventName) + } + private fun performAction(simpleAction: SimpleAction): Boolean { ensureService() if (AccessibilityConfig.isUnintendedGuardEnabled() && isRunningPackageSelf) { @@ -239,7 +256,7 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge } companion object { - + val accessibilityDelegateCounter = AtomicInteger(1000) val TAG: String = SimpleActionAutomator::class.java.name } diff --git a/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt new file mode 100644 index 00000000..23fb4f6c --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt @@ -0,0 +1,27 @@ +package org.autojs.autojs.core.automator + +import android.view.accessibility.AccessibilityEvent + +class AccessibilityEventWrapper(event: AccessibilityEvent) { + private val node = event.source + + val source = if (node != null) UiObject(node, null, getDepth(), getIndexInParent()) else null + + private fun getDepth(): Int { + var depth = 0 + if (node == null) return 0 + while (node.parent != null) { + depth++ + } + return depth + } + + private fun getIndexInParent(): Int { + val parent = node!!.parent + var index = 0 + while (parent.getChild(index) != node) { + index++ + } + return index + } +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java b/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java index 772a6dbd..89328f8d 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java +++ b/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java @@ -11,6 +11,7 @@ import org.autojs.autojs.AutoJs; import org.autojs.autojs.annotation.ScriptVariable; import org.autojs.autojs.concurrent.VolatileDispose; import org.autojs.autojs.core.accessibility.AccessibilityBridge; +import org.autojs.autojs.core.accessibility.AccessibilityService; import org.autojs.autojs.core.accessibility.SimpleActionAutomator; import org.autojs.autojs.core.accessibility.UiSelector; import org.autojs.autojs.core.activity.ActivityInfoProvider; @@ -527,7 +528,8 @@ public class ScriptRuntime { console.hideDelayed(); } }); - + //清空无障碍事件 + ignoresException(AccessibilityService.Companion::clearAccessibilityEventCallback); ignoresException(RootUtils::resetRuntimeOverriddenRootModeState); ignoresException(ImageWrapper::recycleAll); diff --git a/version.properties b/version.properties index 00646f3d..7fcf9914 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ -#Mon Jul 10 09:35:09 CST 2023 -BUILD_TIME=1688952909391 +#Mon Jul 10 18:23:10 CST 2023 +BUILD_TIME=1688984590330 COMPILE_SDK_VERSION=33 JAVA_VERSION=20 MIN_SDK_VERSION=24 TARGET_SDK_VERSION=33 -VERSION_BUILD=2000 +VERSION_BUILD=2006 VERSION_NAME=6.3.2