feat: auto.setFlags("findOnUiThread");

This commit is contained in:
hyb1996
2018-10-06 13:47:11 +08:00
parent 4cae6496b0
commit 8d2c0dd9f3
5 changed files with 70 additions and 20 deletions

View File

@@ -109,6 +109,10 @@ module.exports = function(runtime, global){
"fast": 1 "fast": 1
} }
const flagsMap = {
"findOnUiThread": 1
};
var auto = function(mode){ var auto = function(mode){
if(mode){ if(mode){
global.auto.setMode(mode); global.auto.setMode(mode);
@@ -120,14 +124,33 @@ module.exports = function(runtime, global){
runtime.accessibilityBridge.waitForServiceEnabled(); runtime.accessibilityBridge.waitForServiceEnabled();
} }
auto.setMode = function(mode){ auto.setMode = function(modeStr){
if(typeof(mode) !== "string"){ if(typeof(mode) !== "string"){
throw new TypeError("mode should be a 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); 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(){ auto.getService = function(){
return runtime.accessibilityBridge.getService(); return runtime.accessibilityBridge.getService();
} }

View File

@@ -111,7 +111,7 @@ public abstract class AutoJs {
return new ScriptRuntime.Builder() return new ScriptRuntime.Builder()
.setConsole(new StardustConsole(mUiHandler, mGlobalConsole)) .setConsole(new StardustConsole(mUiHandler, mGlobalConsole))
.setScreenCaptureRequester(mScreenCaptureRequester) .setScreenCaptureRequester(mScreenCaptureRequester)
.setAccessibilityBridge(new AccessibilityBridgeImpl()) .setAccessibilityBridge(new AccessibilityBridgeImpl(mUiHandler))
.setUiHandler(mUiHandler) .setUiHandler(mUiHandler)
.setAppUtils(mAppUtils) .setAppUtils(mAppUtils)
.setEngineService(mScriptEngineService) .setEngineService(mScriptEngineService)
@@ -183,8 +183,8 @@ public abstract class AutoJs {
private class AccessibilityBridgeImpl extends AccessibilityBridge { private class AccessibilityBridgeImpl extends AccessibilityBridge {
public AccessibilityBridgeImpl() { public AccessibilityBridgeImpl(UiHandler uiHandler) {
super(createAccessibilityConfig()); super(createAccessibilityConfig(), uiHandler);
} }
@Override @Override

View File

@@ -7,11 +7,10 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo; import android.view.accessibility.AccessibilityWindowInfo;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig; 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.AccessibilityInfoProvider;
import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityNotificationObserver;
import com.stardust.view.accessibility.AccessibilityService; 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_NORMAL = 0;
public static final int MODE_FAST = 1; public static final int MODE_FAST = 1;
private int mMode = MODE_NORMAL; public static final int FLAG_FIND_ON_UI_THREAD = 1;
private AccessibilityConfig mConfig;
private WindowFilter mWindowFilter;
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; mConfig = config;
mUiHandler = uiHandler;
mConfig.seal(); mConfig.seal();
} }
@@ -40,6 +44,10 @@ public abstract class AccessibilityBridge {
public abstract void waitForServiceEnabled(); public abstract void waitForServiceEnabled();
public void post(Runnable r) {
mUiHandler.post(r);
}
@Nullable @Nullable
public abstract AccessibilityService getService(); public abstract AccessibilityService getService();
@@ -62,7 +70,7 @@ public abstract class AccessibilityBridge {
return activeWindow.getRoot(); return activeWindow.getRoot();
} }
} }
if (mMode == MODE_FAST) { if ((mMode & MODE_FAST) != 0) {
return service.fastRootInActiveWindow(); return service.fastRootInActiveWindow();
} }
return service.getRootInActiveWindow(); return service.getRootInActiveWindow();
@@ -75,11 +83,18 @@ public abstract class AccessibilityBridge {
@NonNull @NonNull
public abstract AccessibilityInfoProvider getInfoProvider(); public abstract AccessibilityInfoProvider getInfoProvider();
public void setMode(int mode) { public void setMode(int mode) {
mMode = mode; mMode = mode;
} }
public int getFlags() {
return mFlags;
}
public void setFlags(int flags) {
mFlags = flags;
}
@NonNull @NonNull
public abstract AccessibilityNotificationObserver getNotificationObserver(); public abstract AccessibilityNotificationObserver getNotificationObserver();

View File

@@ -1,5 +1,6 @@
package com.stardust.autojs.core.accessibility; package com.stardust.autojs.core.accessibility;
import android.os.Looper;
import android.os.SystemClock; import android.os.SystemClock;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.util.Log; import android.util.Log;
@@ -13,12 +14,9 @@ import com.stardust.automator.UiGlobalSelector;
import com.stardust.automator.UiObject; import com.stardust.automator.UiObject;
import com.stardust.automator.UiObjectCollection; import com.stardust.automator.UiObjectCollection;
import com.stardust.automator.filter.DfsFilter; import com.stardust.automator.filter.DfsFilter;
import com.stardust.concurrent.VolatileBox;
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; 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_ACCESSIBILITY_FOCUS;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_COLUMN_INT; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_COLUMN_INT;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE;
@@ -76,6 +74,18 @@ public class UiSelector extends UiGlobalSelector {
@ScriptInterface @ScriptInterface
public UiObjectCollection find() { public UiObjectCollection find() {
ensureAccessibilityServiceEnabled(); ensureAccessibilityServiceEnabled();
if((mAccessibilityBridge.getFlags() & AccessibilityBridge.FLAG_FIND_ON_UI_THREAD)!=0
&& Looper.myLooper() != Looper.getMainLooper()){
VolatileBox<UiObjectCollection> result = new VolatileBox<>();
mAccessibilityBridge.post(() -> result.setAndNotify(findImpl()));
return result.blockedGet();
}
return findImpl();
}
@NonNull
@ScriptInterface
protected UiObjectCollection findImpl() {
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow(); AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow();
if (BuildConfig.DEBUG) if (BuildConfig.DEBUG)
Log.d(TAG, "find: root = " + root); Log.d(TAG, "find: root = " + root);

View File

@@ -140,9 +140,11 @@ public class ScriptExecuteActivity extends AppCompatActivity {
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
Log.d(LOG_TAG, "onDestroy"); Log.d(LOG_TAG, "onDestroy");
mScriptEngine.put("activity", null); if(mScriptEngine != null){
mScriptEngine.setTag("activity", null); mScriptEngine.put("activity", null);
mScriptEngine.destroy(); mScriptEngine.setTag("activity", null);
mScriptEngine.destroy();
}
mScriptExecution = null; mScriptExecution = null;
} }