From 769529585dfdac73b1ec68ff4722f48076d479ab Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 9 Sep 2018 21:37:53 +0800 Subject: [PATCH] fix(autojs): EventEmitter.once(), view._id() ; feat(autojs): auto.getService(), auto.getWindows(), auto.setWindowFilter(), util.java.toJsArray() --- app/src/main/AndroidManifest.xml | 3 ++ .../storage/database/TimedTaskDatabase.java | 2 ++ .../autojs/timing/TimedTaskScheduler.java | 1 + .../ui/timing/TimedTaskSettingActivity.java | 15 +++++----- app/src/main/res/values/strings.xml | 1 + .../src/main/assets/modules/__automator__.js | 25 +++++++++++++++-- .../src/main/assets/modules/__java_util__.js | 14 ++++++++++ autojs/src/main/assets/modules/__ui__.js | 2 +- .../accessibility/AccessibilityBridge.java | 28 ++++++++++++++++++- .../accessibility/SimpleActionAutomator.java | 2 +- .../autojs/core/accessibility/UiSelector.java | 2 +- .../autojs/core/eventloop/EventEmitter.java | 3 +- common/release/output.json | 2 +- 13 files changed, 82 insertions(+), 18 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0964d242..68ed7ccb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,8 @@ + + @@ -238,6 +240,7 @@ + diff --git a/app/src/main/java/org/autojs/autojs/storage/database/TimedTaskDatabase.java b/app/src/main/java/org/autojs/autojs/storage/database/TimedTaskDatabase.java index b3798e32..8e3fc3c9 100644 --- a/app/src/main/java/org/autojs/autojs/storage/database/TimedTaskDatabase.java +++ b/app/src/main/java/org/autojs/autojs/storage/database/TimedTaskDatabase.java @@ -7,4 +7,6 @@ import com.raizlabs.android.dbflow.annotation.Database; */ @Database(version = 1) public class TimedTaskDatabase { + + } diff --git a/app/src/main/java/org/autojs/autojs/timing/TimedTaskScheduler.java b/app/src/main/java/org/autojs/autojs/timing/TimedTaskScheduler.java index 295c9614..5373d21c 100644 --- a/app/src/main/java/org/autojs/autojs/timing/TimedTaskScheduler.java +++ b/app/src/main/java/org/autojs/autojs/timing/TimedTaskScheduler.java @@ -7,6 +7,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; +import android.provider.AlarmClock; import android.util.Log; import java.util.concurrent.TimeUnit; diff --git a/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java b/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java index b77e98d6..995c2ced 100644 --- a/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java @@ -1,6 +1,5 @@ package org.autojs.autojs.ui.timing; -import android.Manifest; import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.content.Intent; @@ -9,7 +8,6 @@ import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.provider.Settings; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.Toolbar; import android.text.TextUtils; @@ -30,6 +28,11 @@ import android.widget.Toast; import com.github.aakira.expandablelayout.ExpandableRelativeLayout; import com.stardust.autojs.execution.ExecutionConfig; +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.CheckedChange; +import org.androidannotations.annotations.Click; +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.ViewById; import org.autojs.autojs.R; import org.autojs.autojs.external.ScriptIntents; import org.autojs.autojs.model.script.ScriptFile; @@ -37,12 +40,6 @@ import org.autojs.autojs.timing.TaskReceiver; import org.autojs.autojs.timing.TimedTask; import org.autojs.autojs.timing.TimedTaskManager; import org.autojs.autojs.ui.BaseActivity; - -import org.androidannotations.annotations.AfterViews; -import org.androidannotations.annotations.CheckedChange; -import org.androidannotations.annotations.Click; -import org.androidannotations.annotations.EActivity; -import org.androidannotations.annotations.ViewById; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.joda.time.LocalTime; @@ -269,6 +266,8 @@ public class TimedTaskSettingActivity extends BaseActivity { } else { createOrUpdateTimedTask(); } + + return true; } return super.onOptionsItemSelected(item); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 32e0e9b3..f972154c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -379,4 +379,5 @@ 结果 关闭 执行 + 使用系统闹钟唤醒Auto.js diff --git a/autojs/src/main/assets/modules/__automator__.js b/autojs/src/main/assets/modules/__automator__.js index f90a8440..5e75e666 100644 --- a/autojs/src/main/assets/modules/__automator__.js +++ b/autojs/src/main/assets/modules/__automator__.js @@ -109,18 +109,18 @@ module.exports = function(runtime, global){ "fast": 1 } - global.auto = function(mode){ + var auto = function(mode){ if(mode){ global.auto.setMode(mode); } runtime.accessibilityBridge.ensureServiceEnabled(); } - global.auto.waitFor = function(){ + auto.waitFor = function(){ runtime.accessibilityBridge.waitForServiceEnabled(); } - global.auto.setMode = function(mode){ + auto.setMode = function(mode){ if(typeof(mode) !== "string"){ throw new TypeError("mode should be a string"); } @@ -128,6 +128,25 @@ module.exports = function(runtime, global){ runtime.accessibilityBridge.setMode(mode); } + auto.getService = function(){ + return runtime.accessibilityBridge.getService(); + } + + auto.getWindows = function(){ + var service = auto.getService(); + return service == null ? [] : util.java.toJsArray(service.getWindows(), true); + } + + auto.getRoot = function(){ + var root = runtime.accessibilityBridge.getRootInCurrentWindow(); + return com.stardust.automator.UiObject.createRoot(root); + } + + auto.setWindowFilter = function(filter){ + runtime.accessibilityBridge.setWindowFilter(new com.stardust.autojs.core.accessibility.AccessibilityBridge.WindowFilter(filter)); + } + + global.auto = auto; global.__asGlobal__(runtime.automator, ['back', 'home', 'powerDialog', 'notifications', 'quickSettings', 'recents', 'splitScreen']); global.__asGlobal__(automator, ['click', 'longClick', 'press', 'swipe', 'gesture', 'gestures', 'gestureAsync', 'gesturesAsync', 'scrollDown', 'scrollUp', 'input', 'setText']); diff --git a/autojs/src/main/assets/modules/__java_util__.js b/autojs/src/main/assets/modules/__java_util__.js index 9fe8feba..83faaee7 100644 --- a/autojs/src/main/assets/modules/__java_util__.js +++ b/autojs/src/main/assets/modules/__java_util__.js @@ -32,4 +32,18 @@ function array(type) { J.array = array; +J.toJsArray = function(list, nullListToEmptyArray){ + if(list == null || list == undefined){ + if(nullListToEmptyArray){ + return []; + } + return null; + } + let arr = Array(list.size()); + for(let i = 0; i < list.size(); i++){ + arr[i] = list.get(i); + } + return arr; +} + module.exports = J; \ No newline at end of file diff --git a/autojs/src/main/assets/modules/__ui__.js b/autojs/src/main/assets/modules/__ui__.js index d5b6e446..ba603891 100644 --- a/autojs/src/main/assets/modules/__ui__.js +++ b/autojs/src/main/assets/modules/__ui__.js @@ -267,7 +267,7 @@ module.exports = function (runtime, global) { }); } view._id = function (id) { - return ui.findById(view, id); + return ui.findByStringId(view, id); } view.click = function (listener) { if (listener) { 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 b563ef9f..57a0924b 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 @@ -1,26 +1,35 @@ package com.stardust.autojs.core.accessibility; +import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; 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.view.accessibility.AccessibilityInfoProvider; import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.NotificationListener; + /** * Created by Stardust on 2017/4/2. */ public abstract class AccessibilityBridge { + public interface WindowFilter { + boolean filter(AccessibilityWindowInfo info); + } + 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 AccessibilityBridge(AccessibilityConfig config) { mConfig = config; @@ -35,16 +44,33 @@ public abstract class AccessibilityBridge { public abstract AccessibilityService getService(); @Nullable - public AccessibilityNodeInfo getRootInActiveWindow() { + public AccessibilityNodeInfo getRootInCurrentWindow() { AccessibilityService service = getService(); if (service == null) return null; + if (mWindowFilter != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + AccessibilityWindowInfo activeWindow = null; + for (AccessibilityWindowInfo window : service.getWindows()) { + if (mWindowFilter.filter(window)) { + return window.getRoot(); + } + if (window.isActive()) { + activeWindow = window; + } + } + if (activeWindow != null) { + return activeWindow.getRoot(); + } + } if (mMode == MODE_FAST) { return service.fastRootInActiveWindow(); } return service.getRootInActiveWindow(); } + public void setWindowFilter(WindowFilter windowFilter) { + mWindowFilter = windowFilter; + } @NonNull public abstract AccessibilityInfoProvider getInfoProvider(); 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 aaffd60b..19cb6565 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 @@ -253,7 +253,7 @@ public class SimpleActionAutomator { Log.d(TAG, "performAction: running package is self. return false"); return false; } - AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow(); + AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow(); if (root == null) return false; Log.v(TAG, "performAction: " + simpleAction + " root = " + root); 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 0e535be6..3d999f94 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 @@ -72,7 +72,7 @@ public class UiSelector extends UiGlobalSelector { @ScriptInterface public UiObjectCollection find() { ensureAccessibilityServiceEnabled(); - AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow(); + AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow(); if (BuildConfig.DEBUG) Log.d(TAG, "find: root = " + root); if (root == null) { 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 92e98514..e10aeb5d 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 @@ -23,7 +23,6 @@ import java.util.concurrent.CopyOnWriteArrayList; public class EventEmitter { - private static class ListenerWrapper { Object listener; boolean isOnce; @@ -63,7 +62,7 @@ public class EventEmitter { mBridges.callFunction(listenerWrapper.listener, EventEmitter.this, args); } if (listenerWrapper.isOnce) { - listenerIterator.remove(); + mListenerWrappers.remove(listenerWrapper); } } } diff --git a/common/release/output.json b/common/release/output.json index 6ca2aae6..77d9be0a 100644 --- a/common/release/output.json +++ b/common/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":410},"path":"commonRelease-4.0.2 Alpha5.apk","properties":{"packageId":"org.autojs.autojs","split":"","minSdkVersion":"17"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":411},"path":"commonRelease-4.0.2 Alpha6.apk","properties":{"packageId":"org.autojs.autojs","split":"","minSdkVersion":"17"}}] \ No newline at end of file