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
}
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();
}

View File

@ -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

View File

@ -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();

View File

@ -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<UiObjectCollection> 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);

View File

@ -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;
}