From 8a55450d62494fae9db6078f97da84e5b7cbbcee Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 31 Oct 2017 10:55:03 +0800 Subject: [PATCH] just to save works --- .idea/modules.xml | 2 +- .../stardust/scriptdroid/autojs/AutoJs.java | 2 +- .../core/accessibility/ScriptUiObject.java | 36 +++++ .../accessibility/SimpleActionAutomator.java | 4 +- .../autojs/core/accessibility/UiSelector.java | 61 +++++++-- .../AccessibilityBridge.java | 2 +- .../autojs/core/bridge/ScriptBridges.java | 20 +++ .../autojs/runtime/ScriptBridges.java | 3 +- .../autojs/runtime/ScriptRuntime.java | 3 +- .../stardust/autojs/runtime/api/Events.java | 3 +- .../stardust/automator/UiGlobalSelector.java | 10 +- .../java/com/stardust/automator/UiObject.java | 7 +- .../automator/UiObjectCollection.java | 126 +++++++++++++++++- .../com/stardust/auojs/inrt/rt/AutoJs.java | 2 +- 14 files changed, 247 insertions(+), 34 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/core/accessibility/ScriptUiObject.java rename autojs/src/main/java/com/stardust/autojs/core/{accessibility => bridge}/AccessibilityBridge.java (96%) create mode 100644 autojs/src/main/java/com/stardust/autojs/core/bridge/ScriptBridges.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 4fac18b4..7e950955 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,8 @@ + - diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java index 5fe8743c..efdf45bb 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -15,7 +15,7 @@ import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; import com.stardust.autojs.engine.RootAutomatorEngine; import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.engine.ScriptEngineManager; -import com.stardust.autojs.core.accessibility.AccessibilityBridge; +import com.stardust.autojs.core.bridge.AccessibilityBridge; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.core.console.GlobalStardustConsole; import com.stardust.autojs.runtime.exception.ScriptException; diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/ScriptUiObject.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/ScriptUiObject.java new file mode 100644 index 00000000..9bbc47af --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/ScriptUiObject.java @@ -0,0 +1,36 @@ +package com.stardust.autojs.core.accessibility; + +import com.stardust.autojs.core.bridge.ScriptBridges; +import com.stardust.automator.UiObject; +import com.stardust.automator.UiObjectCollection; +import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; + +/** + * Created by Stardust on 2017/10/31. + */ + +public class ScriptUiObject extends UiObject { + + private ScriptBridges mScriptBridges; + + public ScriptUiObject(Object info, ScriptBridges scriptBridges) { + super(info); + mScriptBridges = scriptBridges; + } + + public ScriptUiObject(Object info, AccessibilityNodeInfoAllocator allocator, boolean isRootNode, ScriptBridges scriptBridges) { + super(info, allocator, isRootNode); + mScriptBridges = scriptBridges; + } + + public ScriptUiObject(Object info, AccessibilityNodeInfoAllocator allocator, ScriptBridges scriptBridges) { + super(info, allocator); + mScriptBridges = scriptBridges; + } + + + @Override + public Object children() { + return super.children(); + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java index f301d902..2b1180cb 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java @@ -10,6 +10,7 @@ import android.util.Log; import android.view.accessibility.AccessibilityNodeInfo; import com.stardust.autojs.annotation.ScriptInterface; +import com.stardust.autojs.core.bridge.AccessibilityBridge; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.accessibility.AutomatorConfig; import com.stardust.automator.GlobalActionAutomator; @@ -20,9 +21,6 @@ import com.stardust.automator.simple_action.SimpleAction; import com.stardust.util.DeveloperUtils; import com.stardust.util.ScreenMetrics; -import org.mozilla.javascript.Context; -import org.mozilla.javascript.NativeJavaObject; - /** * Created by Stardust on 2017/4/2. */ 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 8893e549..8d75935c 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,11 +1,15 @@ package com.stardust.autojs.core.accessibility; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.util.Log; import android.view.accessibility.AccessibilityNodeInfo; import com.stardust.autojs.annotation.ScriptInterface; +import com.stardust.autojs.core.bridge.AccessibilityBridge; +import com.stardust.autojs.core.bridge.ScriptBridges; import com.stardust.autojs.runtime.accessibility.AutomatorConfig; +import com.stardust.autojs.runtime.api.UI; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.automator.ActionArgument; import com.stardust.automator.UiGlobalSelector; @@ -55,22 +59,33 @@ public class UiSelector extends UiGlobalSelector { private static final String TAG = "UiSelector"; + private static Object sEmptyUiCollection; private AccessibilityBridge mAccessibilityBridge; private AccessibilityNodeInfoAllocator mAllocator = null; + private ScriptBridges mScriptBridges; - public UiSelector(AccessibilityBridge accessibilityBridge) { - mAccessibilityBridge = accessibilityBridge; + public UiSelector(ScriptBridges bridges) { + this(bridges, null); } - public UiSelector(AccessibilityBridge accessibilityBridge, AccessibilityNodeInfoAllocator allocator) { - mAccessibilityBridge = accessibilityBridge; + public UiSelector(ScriptBridges bridges, AccessibilityNodeInfoAllocator allocator) { + mAccessibilityBridge = bridges.getAccessibilityBrige(); + mScriptBridges = bridges; mAllocator = allocator; } @NonNull @ScriptInterface - public UiObjectCollection find() { + public Object find() { + UiObjectCollection c = findInner(); + if(c == UiObjectCollection.EMPTY){ + return emptyUiCollection(); + } + return mScriptBridges.wrapAsArray(c); + } + + protected UiObjectCollection findInner(){ ensureAccessibilityServiceEnabled(); if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) { Log.d(TAG, "isSelfPackage return null"); @@ -80,7 +95,22 @@ public class UiSelector extends UiGlobalSelector { if (root == null) { return UiObjectCollection.EMPTY; } - return findOf(UiObject.createRoot(root, mAllocator)); + return super.findOf(UiObject.createRoot(root, mAllocator)); + } + + @SuppressWarnings("unchecked") + @Override + public Object findOf(UiObject node) { + return mScriptBridges.wrapAsArray((Iterable) super.findOf(node)); + } + + + @NonNull + private Object emptyUiCollection() { + if(sEmptyUiCollection == null){ + sEmptyUiCollection = mScriptBridges.wrapAsArray(UiObjectCollection.EMPTY); + } + return sEmptyUiCollection; } @@ -95,8 +125,15 @@ public class UiSelector extends UiGlobalSelector { @ScriptInterface @NonNull - public UiObjectCollection untilFind() { - UiObjectCollection uiObjectCollection = find(); + public Object untilFind() { + return mScriptBridges.wrapAsArray(untilFindInner()); + } + + + @ScriptInterface + @NonNull + protected UiObjectCollection untilFindInner() { + UiObjectCollection uiObjectCollection = findInner(); while (uiObjectCollection.empty()) { if (Thread.currentThread().isInterrupted()) { throw new ScriptInterruptedException(); @@ -106,7 +143,7 @@ public class UiSelector extends UiGlobalSelector { } catch (InterruptedException e) { throw new ScriptInterruptedException(); } - uiObjectCollection = find(); + uiObjectCollection = findInner(); } return uiObjectCollection; } @@ -118,13 +155,13 @@ public class UiSelector extends UiGlobalSelector { @ScriptInterface public boolean exists() { - UiObjectCollection collection = find(); + UiObjectCollection collection = findInner(); return collection.nonEmpty(); } @NonNull public UiObject untilFindOne() { - UiObjectCollection collection = untilFind(); + UiObjectCollection collection = untilFindInner(); return new UiObject(collection.get(0).getInfo()); } @@ -151,7 +188,7 @@ public class UiSelector extends UiGlobalSelector { private boolean performAction(int action, ActionArgument... arguments) { - return untilFind().performAction(action, arguments); + return untilFindInner().performAction(action, arguments); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java b/autojs/src/main/java/com/stardust/autojs/core/bridge/AccessibilityBridge.java similarity index 96% rename from autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java rename to autojs/src/main/java/com/stardust/autojs/core/bridge/AccessibilityBridge.java index 8d100675..e7c014e5 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java +++ b/autojs/src/main/java/com/stardust/autojs/core/bridge/AccessibilityBridge.java @@ -1,4 +1,4 @@ -package com.stardust.autojs.core.accessibility; +package com.stardust.autojs.core.bridge; import android.content.Context; import android.support.annotation.NonNull; diff --git a/autojs/src/main/java/com/stardust/autojs/core/bridge/ScriptBridges.java b/autojs/src/main/java/com/stardust/autojs/core/bridge/ScriptBridges.java new file mode 100644 index 00000000..07b8f724 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/bridge/ScriptBridges.java @@ -0,0 +1,20 @@ +package com.stardust.autojs.core.bridge; + +/** + * Created by Stardust on 2017/10/31. + */ + +public abstract class ScriptBridges { + + + public abstract Object toArray(Object[] nativeArray); + + public abstract Object toString(String nativeString); + + public abstract Object callFunction(Object function, Object target, Object[] args); + + public abstract Object wrapAsArray(Iterable iterable); + + public abstract AccessibilityBridge getAccessibilityBrige(); + +} diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.java index 404497bb..d232b254 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.java @@ -6,7 +6,6 @@ package com.stardust.autojs.runtime; public class ScriptBridges { - public interface FunctionCaller { Object[] NO_ARGUMENTS = new Object[0]; @@ -25,4 +24,6 @@ public class ScriptBridges { throw new IllegalStateException("no function caller"); return mFunctionCaller.call(func, target, args); } + + } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index e6385aef..ed7233dc 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -7,7 +7,7 @@ import android.os.Looper; import com.stardust.autojs.R; import com.stardust.autojs.ScriptEngineService; import com.stardust.autojs.annotation.ScriptVariable; -import com.stardust.autojs.core.accessibility.AccessibilityBridge; +import com.stardust.autojs.core.bridge.AccessibilityBridge; import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.rhino.AndroidClassLoader; import com.stardust.autojs.runtime.api.AbstractShell; @@ -25,7 +25,6 @@ import com.stardust.autojs.runtime.exception.ScriptEnvironmentException; import com.stardust.autojs.runtime.exception.ScriptException; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.autojs.core.accessibility.SimpleActionAutomator; -import com.stardust.concurrent.VolatileBox; import com.stardust.autojs.runtime.api.UI; import com.stardust.concurrent.VolatileDispose; import com.stardust.pio.UncheckedIOException; diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java index 988e0d35..033de836 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Events.java @@ -6,10 +6,9 @@ import android.graphics.Point; import android.os.Build; import android.os.Handler; import android.view.KeyEvent; -import android.view.accessibility.AccessibilityEvent; import com.stardust.autojs.R; -import com.stardust.autojs.core.accessibility.AccessibilityBridge; +import com.stardust.autojs.core.bridge.AccessibilityBridge; import com.stardust.autojs.core.eventloop.EventEmitter; import com.stardust.notification.Notification; import com.stardust.notification.NotificationListenerService; diff --git a/automator/src/main/java/com/stardust/automator/UiGlobalSelector.java b/automator/src/main/java/com/stardust/automator/UiGlobalSelector.java index d1ddaeb2..f73d4b34 100644 --- a/automator/src/main/java/com/stardust/automator/UiGlobalSelector.java +++ b/automator/src/main/java/com/stardust/automator/UiGlobalSelector.java @@ -351,13 +351,19 @@ public class UiGlobalSelector { return this; } - public UiObjectCollection findOf(UiObject node) { + + /** + * Note: The method use a dirty template to make its child class can + * change the type of return value. + */ + @SuppressWarnings("unchecked") + public T findOf(UiObject node) { List list = new ArrayList<>(); list.add(node); for (ListFilter filter : mFilters) { list = filter.filter(list); } - return UiObjectCollection.of(list); + return (T) UiObjectCollection.of(list); } @Nullable diff --git a/automator/src/main/java/com/stardust/automator/UiObject.java b/automator/src/main/java/com/stardust/automator/UiObject.java index 0da339af..ca6f8402 100644 --- a/automator/src/main/java/com/stardust/automator/UiObject.java +++ b/automator/src/main/java/com/stardust/automator/UiObject.java @@ -97,7 +97,7 @@ public class UiObject extends AccessibilityNodeInfoCompat { } } - public UiObjectCollection find(UiGlobalSelector selector) { + public T find(UiGlobalSelector selector) { return selector.findOf(this); } @@ -105,12 +105,13 @@ public class UiObject extends AccessibilityNodeInfoCompat { return selector.findOneOf(this); } - public UiObjectCollection children() { + @SuppressWarnings("unchecked") + public T children() { ArrayList list = new ArrayList<>(getChildCount()); for (int i = 0; i < getChildCount(); i++) { list.add(getChild(i)); } - return UiObjectCollection.ofCompat(list); + return (T) UiObjectCollection.ofCompat(list); } public int childCount() { diff --git a/automator/src/main/java/com/stardust/automator/UiObjectCollection.java b/automator/src/main/java/com/stardust/automator/UiObjectCollection.java index 4f89a4e0..70b518d8 100644 --- a/automator/src/main/java/com/stardust/automator/UiObjectCollection.java +++ b/automator/src/main/java/com/stardust/automator/UiObjectCollection.java @@ -2,6 +2,7 @@ package com.stardust.automator; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.view.accessibility.AccessibilityNodeInfo; @@ -10,8 +11,11 @@ import com.stardust.util.Consumer; import com.stardust.util.Func1; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.*; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CONTEXT_CLICK; @@ -27,7 +31,7 @@ import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat. * Created by Stardust on 2017/3/9. */ -public class UiObjectCollection { +public class UiObjectCollection implements List { public static final UiObjectCollection EMPTY = UiObjectCollection.of(Collections.emptyList()); @@ -49,7 +53,7 @@ public class UiObjectCollection { private List mNodes; - private UiObjectCollection(List list) { + protected UiObjectCollection(List list) { mNodes = list; } @@ -189,14 +193,126 @@ public class UiObjectCollection { new ActionArgument.IntActionArgument(ACTION_ARGUMENT_COLUMN_INT, column)); } + @Override public UiObject get(int i) { return mNodes.get(i); } + @Override + public UiObject set(int index, UiObject element) { + return mNodes.set(index, element); + } + + @Override + public void add(int index, UiObject element) { + mNodes.add(index, element); + } + + @Override + public UiObject remove(int index) { + return mNodes.remove(index); + } + + @Override + public int indexOf(Object o) { + return mNodes.indexOf(o); + } + + @Override + public int lastIndexOf(Object o) { + return mNodes.lastIndexOf(o); + } + + @NonNull + @Override + public ListIterator listIterator() { + return mNodes.listIterator(); + } + + @NonNull + @Override + public ListIterator listIterator(int index) { + return mNodes.listIterator(index); + } + + @NonNull + @Override + public UiObjectCollection subList(int fromIndex, int toIndex) { + return UiObjectCollection.of(mNodes.subList(fromIndex, toIndex)); + } + public int size() { return mNodes.size(); } + @Override + public boolean isEmpty() { + return mNodes.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return mNodes.contains(o); + } + + @NonNull + @Override + public Iterator iterator() { + return mNodes.iterator(); + } + + @NonNull + @Override + public Object[] toArray() { + return mNodes.toArray(); + } + + @NonNull + @Override + public T[] toArray(@NonNull T[] a) { + return mNodes.toArray(a); + } + + @Override + public boolean add(UiObject uiObject) { + return mNodes.add(uiObject); + } + + @Override + public boolean remove(Object o) { + return mNodes.remove(o); + } + + @Override + public boolean containsAll(@NonNull Collection c) { + return mNodes.containsAll(c); + } + + @Override + public boolean addAll(@NonNull Collection c) { + return mNodes.addAll(c); + } + + @Override + public boolean addAll(int index, @NonNull Collection c) { + return mNodes.addAll(index, c); + } + + @Override + public boolean removeAll(@NonNull Collection c) { + return mNodes.retainAll(c); + } + + @Override + public boolean retainAll(@NonNull Collection c) { + return mNodes.retainAll(c); + } + + @Override + public void clear() { + mNodes.clear(); + } + public UiObjectCollection each(Consumer consumer) { for (UiObject uiObject : mNodes) { consumer.accept(uiObject); @@ -216,7 +332,7 @@ public class UiObjectCollection { public UiObjectCollection find(UiGlobalSelector selector) { List list = new ArrayList<>(); for (UiObject object : mNodes) { - list.addAll(selector.findOf(object).mNodes); + list.addAll(((UiObjectCollection) selector.findOf(object)).mNodes); } return of(list); } @@ -232,11 +348,11 @@ public class UiObjectCollection { } public boolean empty() { - return size() == 0; + return isEmpty(); } public boolean nonEmpty() { - return size() != 0; + return !isEmpty(); } } diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java b/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java index 723434ec..39f66911 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java @@ -13,7 +13,7 @@ import com.stardust.auojs.inrt.App; import com.stardust.auojs.inrt.R; import com.stardust.autojs.ScriptEngineService; import com.stardust.autojs.ScriptEngineServiceBuilder; -import com.stardust.autojs.core.accessibility.AccessibilityBridge; +import com.stardust.autojs.core.bridge.AccessibilityBridge; import com.stardust.autojs.core.console.GlobalStardustConsole; import com.stardust.autojs.core.inputevent.InputEventObserver; import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder;