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