diff --git a/autojs/src/main/assets/modules/__automator__.js b/autojs/src/main/assets/modules/__automator__.js index 5e75e666..bf4811c2 100644 --- a/autojs/src/main/assets/modules/__automator__.js +++ b/autojs/src/main/assets/modules/__automator__.js @@ -109,6 +109,10 @@ module.exports = function(runtime, global){ "fast": 1 } + const flagsMap = { + "findOnUiThread": 1 + }; + var auto = function(mode){ if(mode){ global.auto.setMode(mode); @@ -120,14 +124,33 @@ module.exports = function(runtime, global){ runtime.accessibilityBridge.waitForServiceEnabled(); } - auto.setMode = function(mode){ + auto.setMode = function(modeStr){ if(typeof(mode) !== "string"){ throw new TypeError("mode should be a string"); } - mode = modes[mode.toLowerCase()] || 0; + let mode = modes[modeStr]; + if(mode == undefined){ + throw new Error("unknown mode for auto.setMode(): " + modeStr) + } runtime.accessibilityBridge.setMode(mode); } + auto.setFlags = function(flags){ + if(typeof(flags) !== "string"){ + throw new TypeError("flags should be a string"); + } + let flagsInt = 0; + let flagStrings = flags.split("|"); + for(let i = 0; i < flagStrings.length; i++){ + let flag = flagsMap[flagStrings[i]]; + if(flag == undefined){ + throw new Error("unknown flag for auto.setFlags(): " + flagStrings[i]); + } + flagsInt |= flag; + } + runtime.accessibilityBridge.setFlags(flagsInt); + } + auto.getService = function(){ return runtime.accessibilityBridge.getService(); } diff --git a/autojs/src/main/java/com/stardust/autojs/AutoJs.java b/autojs/src/main/java/com/stardust/autojs/AutoJs.java index 90f47f67..6b87bb5f 100644 --- a/autojs/src/main/java/com/stardust/autojs/AutoJs.java +++ b/autojs/src/main/java/com/stardust/autojs/AutoJs.java @@ -111,7 +111,7 @@ public abstract class AutoJs { return new ScriptRuntime.Builder() .setConsole(new StardustConsole(mUiHandler, mGlobalConsole)) .setScreenCaptureRequester(mScreenCaptureRequester) - .setAccessibilityBridge(new AccessibilityBridgeImpl()) + .setAccessibilityBridge(new AccessibilityBridgeImpl(mUiHandler)) .setUiHandler(mUiHandler) .setAppUtils(mAppUtils) .setEngineService(mScriptEngineService) @@ -183,8 +183,8 @@ public abstract class AutoJs { private class AccessibilityBridgeImpl extends AccessibilityBridge { - public AccessibilityBridgeImpl() { - super(createAccessibilityConfig()); + public AccessibilityBridgeImpl(UiHandler uiHandler) { + super(createAccessibilityConfig(), uiHandler); } @Override diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java index 57a0924b..4e59b109 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java @@ -7,11 +7,10 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; import com.stardust.autojs.runtime.accessibility.AccessibilityConfig; -import com.stardust.automator.UiObject; +import com.stardust.util.UiHandler; import com.stardust.view.accessibility.AccessibilityInfoProvider; import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityService; -import com.stardust.view.accessibility.NotificationListener; /** @@ -27,12 +26,17 @@ public abstract class AccessibilityBridge { public static final int MODE_NORMAL = 0; public static final int MODE_FAST = 1; - private int mMode = MODE_NORMAL; - private AccessibilityConfig mConfig; - private WindowFilter mWindowFilter; + public static final int FLAG_FIND_ON_UI_THREAD = 1; - public AccessibilityBridge(AccessibilityConfig config) { + private int mMode = MODE_NORMAL; + private int mFlags = 0; + private final AccessibilityConfig mConfig; + private WindowFilter mWindowFilter; + private final UiHandler mUiHandler; + + public AccessibilityBridge(AccessibilityConfig config, UiHandler uiHandler) { mConfig = config; + mUiHandler = uiHandler; mConfig.seal(); } @@ -40,6 +44,10 @@ public abstract class AccessibilityBridge { public abstract void waitForServiceEnabled(); + public void post(Runnable r) { + mUiHandler.post(r); + } + @Nullable public abstract AccessibilityService getService(); @@ -62,7 +70,7 @@ public abstract class AccessibilityBridge { return activeWindow.getRoot(); } } - if (mMode == MODE_FAST) { + if ((mMode & MODE_FAST) != 0) { return service.fastRootInActiveWindow(); } return service.getRootInActiveWindow(); @@ -75,11 +83,18 @@ public abstract class AccessibilityBridge { @NonNull public abstract AccessibilityInfoProvider getInfoProvider(); - public void setMode(int mode) { mMode = mode; } + public int getFlags() { + return mFlags; + } + + public void setFlags(int flags) { + mFlags = flags; + } + @NonNull public abstract AccessibilityNotificationObserver getNotificationObserver(); diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java index fee7546b..c48192f1 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java @@ -1,5 +1,6 @@ package com.stardust.autojs.core.accessibility; +import android.os.Looper; import android.os.SystemClock; import android.support.annotation.NonNull; import android.util.Log; @@ -13,12 +14,9 @@ import com.stardust.automator.UiGlobalSelector; import com.stardust.automator.UiObject; import com.stardust.automator.UiObjectCollection; import com.stardust.automator.filter.DfsFilter; +import com.stardust.concurrent.VolatileBox; import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; - import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_COLUMN_INT; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE; @@ -76,6 +74,18 @@ public class UiSelector extends UiGlobalSelector { @ScriptInterface public UiObjectCollection find() { ensureAccessibilityServiceEnabled(); + if((mAccessibilityBridge.getFlags() & AccessibilityBridge.FLAG_FIND_ON_UI_THREAD)!=0 + && Looper.myLooper() != Looper.getMainLooper()){ + VolatileBox result = new VolatileBox<>(); + mAccessibilityBridge.post(() -> result.setAndNotify(findImpl())); + return result.blockedGet(); + } + return findImpl(); + } + + @NonNull + @ScriptInterface + protected UiObjectCollection findImpl() { AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow(); if (BuildConfig.DEBUG) Log.d(TAG, "find: root = " + root); diff --git a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java index cdfc3db3..82132b67 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java @@ -140,9 +140,11 @@ public class ScriptExecuteActivity extends AppCompatActivity { protected void onDestroy() { super.onDestroy(); Log.d(LOG_TAG, "onDestroy"); - mScriptEngine.put("activity", null); - mScriptEngine.setTag("activity", null); - mScriptEngine.destroy(); + if(mScriptEngine != null){ + mScriptEngine.put("activity", null); + mScriptEngine.setTag("activity", null); + mScriptEngine.destroy(); + } mScriptExecution = null; }