From b3f000d2409b248cca6a1f6f939b427d38dfabd8 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 1 Apr 2018 14:07:18 +0800 Subject: [PATCH] api(engines): engines.all(), ScriptEngine.emit() api(events): events.broadcast --- app/build.gradle | 4 +-- autojs/src/main/assets/init.js | 10 +++++- autojs/src/main/assets/modules/__engines__.js | 4 +++ .../autojs/core/accessibility/UiSelector.java | 5 +-- .../autojs/core/boardcast/Broadcast.java | 27 ++++++++++++++++ .../core/boardcast/BroadcastEmitter.java | 31 +++++++++++++++++++ .../autojs/core/eventloop/EventEmitter.java | 1 - .../autojs/core/image/TemplateMatching.java | 2 ++ .../stardust/autojs/core/looper/Timer.java | 2 +- .../autojs/engine/JavaScriptEngine.java | 10 ++++++ .../autojs/engine/RhinoJavaScriptEngine.java | 2 +- .../autojs/runtime/ScriptBridges.java | 11 +++++-- .../stardust/autojs/runtime/api/Engines.java | 7 +++++ .../stardust/autojs/runtime/api/Events.java | 6 ++++ 14 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/core/boardcast/Broadcast.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/boardcast/BroadcastEmitter.java diff --git a/app/build.gradle b/app/build.gradle index ea54fba5..5c7d64a1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 259 - versionName "3.1.1 Alpha3" + versionCode 260 + versionName "3.1.1 Alpha4" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/autojs/src/main/assets/init.js b/autojs/src/main/assets/init.js index 63ee9547..4d1630ea 100644 --- a/autojs/src/main/assets/init.js +++ b/autojs/src/main/assets/init.js @@ -33,7 +33,7 @@ runtime.init(); } return func.apply(target, arr); }, - toArray: function(list){ + asArray: function(list){ var arr = []; for(var i = 0; i < list.size(); i++){ arr.push(list.get(i)); @@ -50,6 +50,14 @@ runtime.init(); } return arr; }, + toArray: function(iterable){ + var iterator = iterable.iterator(); + var arr = []; + while(iterator.hasNext()){ + arr.push(iterator.next()); + } + return arr; + }, toString: function(o){ return String(o); } diff --git a/autojs/src/main/assets/modules/__engines__.js b/autojs/src/main/assets/modules/__engines__.js index 8a2d68fe..cb2a0299 100644 --- a/autojs/src/main/assets/modules/__engines__.js +++ b/autojs/src/main/assets/modules/__engines__.js @@ -20,6 +20,10 @@ module.exports = function(__runtime__, scope){ return rtEngines.myEngine(); } + engines.all = function(){ + return rtEngines.all(); + } + engines.stopAll = rtEngines.stopAll.bind(rtEngines); engines.stopAllAndToast = rtEngines.stopAllAndToast.bind(rtEngines); 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 2f627f33..6121f88f 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 @@ -5,6 +5,7 @@ import android.support.annotation.NonNull; import android.util.Log; import android.view.accessibility.AccessibilityNodeInfo; +import com.stardust.autojs.BuildConfig; import com.stardust.autojs.annotation.ScriptInterface; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.automator.ActionArgument; @@ -73,7 +74,8 @@ public class UiSelector extends UiGlobalSelector { public UiObjectCollection find() { ensureAccessibilityServiceEnabled(); AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow(); - Log.d(TAG, "find: root = " + root); + if (BuildConfig.DEBUG) + Log.d(TAG, "find: root = " + root); if (root == null) { return UiObjectCollection.EMPTY; } @@ -160,7 +162,6 @@ public class UiSelector extends UiGlobalSelector { } uiObjectCollection = find(); } - return uiObjectCollection.get(0); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/boardcast/Broadcast.java b/autojs/src/main/java/com/stardust/autojs/core/boardcast/Broadcast.java new file mode 100644 index 00000000..ddc56110 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/boardcast/Broadcast.java @@ -0,0 +1,27 @@ +package com.stardust.autojs.core.boardcast; + +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Created by Stardust on 2018/4/1. + */ + +public class Broadcast { + + private static CopyOnWriteArrayList sEventEmitters = new CopyOnWriteArrayList<>(); + + public static void registerListener(BroadcastEmitter eventEmitter) { + sEventEmitters.add(eventEmitter); + } + + public static boolean unregisterListener(BroadcastEmitter eventEmitter) { + return sEventEmitters.remove(eventEmitter); + } + + public static void send(String eventName, Object[] args) { + for (BroadcastEmitter emitter : sEventEmitters) { + emitter.onBroadcast(eventName, args); + } + } + +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/boardcast/BroadcastEmitter.java b/autojs/src/main/java/com/stardust/autojs/core/boardcast/BroadcastEmitter.java new file mode 100644 index 00000000..a5e77f9d --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/boardcast/BroadcastEmitter.java @@ -0,0 +1,31 @@ +package com.stardust.autojs.core.boardcast; + +import com.stardust.autojs.core.eventloop.EventEmitter; +import com.stardust.autojs.core.looper.Timer; +import com.stardust.autojs.runtime.ScriptBridges; + +/** + * Created by Stardust on 2018/4/1. + */ + +public class BroadcastEmitter extends EventEmitter { + + public BroadcastEmitter(ScriptBridges bridges, Timer timer) { + super(bridges, timer); + Broadcast.registerListener(this); + } + + public boolean onBroadcast(String eventName, Object... args) { + return super.emit(eventName, args); + } + + public void unregister() { + Broadcast.unregisterListener(this); + } + + @Override + public boolean emit(String eventName, Object... args) { + Broadcast.send(eventName, args); + return true; + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/eventloop/EventEmitter.java b/autojs/src/main/java/com/stardust/autojs/core/eventloop/EventEmitter.java index 04b4376f..92e98514 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/eventloop/EventEmitter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/eventloop/EventEmitter.java @@ -117,7 +117,6 @@ public class EventEmitter { getListeners(eventName).add(listener, true); return this; } - @NonNull private Listeners getListeners(String eventName) { Listeners listeners = mListenersMap.get(eventName); diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java b/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java index a222f17a..983463e3 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java @@ -173,6 +173,8 @@ public class TemplateMatching { public static Mat matchTemplate(Mat img, Mat temp, int match_method) { int result_cols = img.cols() - temp.cols() + 1; int result_rows = img.rows() - temp.rows() + 1; + Log.d(LOG_TAG, String.format("matchTemplate: rows = %d, cols = %d", result_rows, result_cols)); + Log.d(LOG_TAG, String.format("matchTemplate: img = %s, temp = %s", img.toString(), temp.toString())); Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1); Imgproc.matchTemplate(img, temp, result, match_method); return result; diff --git a/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java b/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java index 1e3ab11d..2cef26ae 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java +++ b/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java @@ -69,7 +69,7 @@ public class Timer { return id; } - private void postDelayed(Runnable r, long interval) { + public void postDelayed(Runnable r, long interval) { long uptime = SystemClock.uptimeMillis() + interval; mHandler.postAtTime(r, uptime); mMaxCallbackUptimeMillis = Math.max(mMaxCallbackUptimeMillis, uptime); diff --git a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java index 60c1fe52..1bcff0e2 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java @@ -36,5 +36,15 @@ public abstract class JavaScriptEngine extends ScriptEngine.AbstractScriptEngine put("runtime", runtime); } + public void emit(String eventName, Object... args) { + mRuntime.timers.getMainTimer().postDelayed(() -> mRuntime.events.emit(eventName, args), 0); + } + @Override + public String toString() { + return "ScriptEngine@" + Integer.toHexString(hashCode()) + "{" + + "source='" + getTag(TAG_SOURCE) + "'," + + "cwd='" + cwd() + "'" + + "}"; + } } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java index eda99bfc..dbeac413 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -164,7 +164,7 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine { return getRuntime().bridges.toString(obj.toString()); } if (staticType == UiObjectCollection.class) { - return getRuntime().bridges.toArray(obj); + return getRuntime().bridges.asArray(obj); } return super.wrap(cx, scope, obj, staticType); 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 86450f0a..4d0ea4c1 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptBridges.java @@ -17,7 +17,9 @@ public class ScriptBridges { Object call(Object func, Object target, Object arg); - Object toArray(Object o); + Object toArray(Iterable o); + + Object asArray(Object o); Object toString(Object obj); @@ -40,11 +42,16 @@ public class ScriptBridges { } - public Object toArray(Object c) { + public Object toArray(Iterable c) { checkBridges(); return mBridges.toArray(c); } + public Object asArray(Object o) { + checkBridges(); + return mBridges.asArray(o); + } + public Object toString(Object obj) { checkBridges(); diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java index b04dc5fd..0e5f6972 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Engines.java @@ -12,6 +12,9 @@ import com.stardust.autojs.script.JavaScriptFileSource; import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.StringScriptSource; +import java.util.ArrayList; +import java.util.List; + /** * Created by Stardust on 2017/8/4. */ @@ -39,6 +42,10 @@ public class Engines { return mEngineService.execute(new AutoFileSource(mScriptRuntime.files.path(path)), config); } + public Object all() { + return mScriptRuntime.bridges.toArray(mEngineService.getEngines()); + } + public int stopAll() { return mEngineService.stopAll(); } 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 ec3c9e43..8989c60d 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 @@ -12,6 +12,8 @@ import android.view.KeyEvent; import com.stardust.autojs.R; import com.stardust.autojs.core.accessibility.AccessibilityBridge; +import com.stardust.autojs.core.boardcast.Broadcast; +import com.stardust.autojs.core.boardcast.BroadcastEmitter; import com.stardust.autojs.core.eventloop.EventEmitter; import com.stardust.autojs.core.looper.Loopers; import com.stardust.autojs.core.looper.MainThreadProxy; @@ -55,12 +57,15 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver private KeyInterceptor mKeyInterceptor; private Set mInterceptedKeys = new HashSet<>(); + public final BroadcastEmitter broadcast; + public Events(Context context, AccessibilityBridge accessibilityBridge, ScriptRuntime runtime) { super(runtime.bridges); mAccessibilityBridge = accessibilityBridge; mContext = context; mLoopers = runtime.loopers; mScriptRuntime = runtime; + broadcast = new BroadcastEmitter(runtime.bridges, runtime.timers.getMainTimer()); } public EventEmitter emitter() { @@ -230,6 +235,7 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver public void recycle() { + broadcast.unregister(); if (mListeningKey) { AccessibilityService service = mAccessibilityBridge.getService(); if (service != null) {