fix(autojs): EventEmitter.once(), view._id() ; feat(autojs): auto.getService(), auto.getWindows(), auto.setWindowFilter(), util.java.toJsArray()
This commit is contained in:
@@ -13,6 +13,8 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
||||||
|
<uses-permission android:name="android.permission.SET_ALARM"/>
|
||||||
|
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
|
||||||
|
|
||||||
|
|
||||||
<!-- 非Auto.js运行必需,不会主动申请,某些脚本可以自行申请-->
|
<!-- 非Auto.js运行必需,不会主动申请,某些脚本可以自行申请-->
|
||||||
@@ -238,6 +240,7 @@
|
|||||||
<receiver android:name=".timing.TimedTaskScheduler">
|
<receiver android:name=".timing.TimedTaskScheduler">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.stardust.autojs.action.check_task"/>
|
<action android:name="com.stardust.autojs.action.check_task"/>
|
||||||
|
<action android:name="com.android.deskclock.ALARM_ALERT"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
|||||||
@@ -7,4 +7,6 @@ import com.raizlabs.android.dbflow.annotation.Database;
|
|||||||
*/
|
*/
|
||||||
@Database(version = 1)
|
@Database(version = 1)
|
||||||
public class TimedTaskDatabase {
|
public class TimedTaskDatabase {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.provider.AlarmClock;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package org.autojs.autojs.ui.timing;
|
package org.autojs.autojs.ui.timing;
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.app.DatePickerDialog;
|
import android.app.DatePickerDialog;
|
||||||
import android.app.TimePickerDialog;
|
import android.app.TimePickerDialog;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -9,7 +8,6 @@ import android.os.Build;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.support.annotation.NonNull;
|
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@@ -30,6 +28,11 @@ import android.widget.Toast;
|
|||||||
import com.github.aakira.expandablelayout.ExpandableRelativeLayout;
|
import com.github.aakira.expandablelayout.ExpandableRelativeLayout;
|
||||||
import com.stardust.autojs.execution.ExecutionConfig;
|
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.R;
|
||||||
import org.autojs.autojs.external.ScriptIntents;
|
import org.autojs.autojs.external.ScriptIntents;
|
||||||
import org.autojs.autojs.model.script.ScriptFile;
|
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.TimedTask;
|
||||||
import org.autojs.autojs.timing.TimedTaskManager;
|
import org.autojs.autojs.timing.TimedTaskManager;
|
||||||
import org.autojs.autojs.ui.BaseActivity;
|
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.LocalDate;
|
||||||
import org.joda.time.LocalDateTime;
|
import org.joda.time.LocalDateTime;
|
||||||
import org.joda.time.LocalTime;
|
import org.joda.time.LocalTime;
|
||||||
@@ -269,6 +266,8 @@ public class TimedTaskSettingActivity extends BaseActivity {
|
|||||||
} else {
|
} else {
|
||||||
createOrUpdateTimedTask();
|
createOrUpdateTimedTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
|
|||||||
@@ -379,4 +379,5 @@
|
|||||||
<string name="text_result">结果</string>
|
<string name="text_result">结果</string>
|
||||||
<string name="text_close">关闭</string>
|
<string name="text_close">关闭</string>
|
||||||
<string name="text_execute">执行</string>
|
<string name="text_execute">执行</string>
|
||||||
|
<string name="text_use_alarm_clock">使用系统闹钟唤醒Auto.js</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -109,18 +109,18 @@ module.exports = function(runtime, global){
|
|||||||
"fast": 1
|
"fast": 1
|
||||||
}
|
}
|
||||||
|
|
||||||
global.auto = function(mode){
|
var auto = function(mode){
|
||||||
if(mode){
|
if(mode){
|
||||||
global.auto.setMode(mode);
|
global.auto.setMode(mode);
|
||||||
}
|
}
|
||||||
runtime.accessibilityBridge.ensureServiceEnabled();
|
runtime.accessibilityBridge.ensureServiceEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
global.auto.waitFor = function(){
|
auto.waitFor = function(){
|
||||||
runtime.accessibilityBridge.waitForServiceEnabled();
|
runtime.accessibilityBridge.waitForServiceEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
global.auto.setMode = function(mode){
|
auto.setMode = function(mode){
|
||||||
if(typeof(mode) !== "string"){
|
if(typeof(mode) !== "string"){
|
||||||
throw new TypeError("mode should be a string");
|
throw new TypeError("mode should be a string");
|
||||||
}
|
}
|
||||||
@@ -128,6 +128,25 @@ module.exports = function(runtime, global){
|
|||||||
runtime.accessibilityBridge.setMode(mode);
|
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__(runtime.automator, ['back', 'home', 'powerDialog', 'notifications', 'quickSettings', 'recents', 'splitScreen']);
|
||||||
global.__asGlobal__(automator, ['click', 'longClick', 'press', 'swipe', 'gesture', 'gestures', 'gestureAsync', 'gesturesAsync', 'scrollDown', 'scrollUp', 'input', 'setText']);
|
global.__asGlobal__(automator, ['click', 'longClick', 'press', 'swipe', 'gesture', 'gestures', 'gestureAsync', 'gesturesAsync', 'scrollDown', 'scrollUp', 'input', 'setText']);
|
||||||
|
|||||||
@@ -32,4 +32,18 @@ function array(type) {
|
|||||||
|
|
||||||
J.array = array;
|
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;
|
module.exports = J;
|
||||||
@@ -267,7 +267,7 @@ module.exports = function (runtime, global) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
view._id = function (id) {
|
view._id = function (id) {
|
||||||
return ui.findById(view, id);
|
return ui.findByStringId(view, id);
|
||||||
}
|
}
|
||||||
view.click = function (listener) {
|
view.click = function (listener) {
|
||||||
if (listener) {
|
if (listener) {
|
||||||
|
|||||||
@@ -1,26 +1,35 @@
|
|||||||
package com.stardust.autojs.core.accessibility;
|
package com.stardust.autojs.core.accessibility;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
import android.view.accessibility.AccessibilityWindowInfo;
|
||||||
|
|
||||||
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
|
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
|
||||||
|
import com.stardust.automator.UiObject;
|
||||||
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
||||||
import com.stardust.view.accessibility.AccessibilityNotificationObserver;
|
import com.stardust.view.accessibility.AccessibilityNotificationObserver;
|
||||||
import com.stardust.view.accessibility.AccessibilityService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.view.accessibility.NotificationListener;
|
import com.stardust.view.accessibility.NotificationListener;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/4/2.
|
* Created by Stardust on 2017/4/2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public abstract class AccessibilityBridge {
|
public abstract class AccessibilityBridge {
|
||||||
|
|
||||||
|
public interface WindowFilter {
|
||||||
|
boolean filter(AccessibilityWindowInfo info);
|
||||||
|
}
|
||||||
|
|
||||||
public static final int MODE_NORMAL = 0;
|
public static final int MODE_NORMAL = 0;
|
||||||
public static final int MODE_FAST = 1;
|
public static final int MODE_FAST = 1;
|
||||||
|
|
||||||
private int mMode = MODE_NORMAL;
|
private int mMode = MODE_NORMAL;
|
||||||
private AccessibilityConfig mConfig;
|
private AccessibilityConfig mConfig;
|
||||||
|
private WindowFilter mWindowFilter;
|
||||||
|
|
||||||
public AccessibilityBridge(AccessibilityConfig config) {
|
public AccessibilityBridge(AccessibilityConfig config) {
|
||||||
mConfig = config;
|
mConfig = config;
|
||||||
@@ -35,16 +44,33 @@ public abstract class AccessibilityBridge {
|
|||||||
public abstract AccessibilityService getService();
|
public abstract AccessibilityService getService();
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public AccessibilityNodeInfo getRootInActiveWindow() {
|
public AccessibilityNodeInfo getRootInCurrentWindow() {
|
||||||
AccessibilityService service = getService();
|
AccessibilityService service = getService();
|
||||||
if (service == null)
|
if (service == null)
|
||||||
return 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) {
|
if (mMode == MODE_FAST) {
|
||||||
return service.fastRootInActiveWindow();
|
return service.fastRootInActiveWindow();
|
||||||
}
|
}
|
||||||
return service.getRootInActiveWindow();
|
return service.getRootInActiveWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setWindowFilter(WindowFilter windowFilter) {
|
||||||
|
mWindowFilter = windowFilter;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public abstract AccessibilityInfoProvider getInfoProvider();
|
public abstract AccessibilityInfoProvider getInfoProvider();
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ public class SimpleActionAutomator {
|
|||||||
Log.d(TAG, "performAction: running package is self. return false");
|
Log.d(TAG, "performAction: running package is self. return false");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow();
|
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow();
|
||||||
if (root == null)
|
if (root == null)
|
||||||
return false;
|
return false;
|
||||||
Log.v(TAG, "performAction: " + simpleAction + " root = " + root);
|
Log.v(TAG, "performAction: " + simpleAction + " root = " + root);
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class UiSelector extends UiGlobalSelector {
|
|||||||
@ScriptInterface
|
@ScriptInterface
|
||||||
public UiObjectCollection find() {
|
public UiObjectCollection find() {
|
||||||
ensureAccessibilityServiceEnabled();
|
ensureAccessibilityServiceEnabled();
|
||||||
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow();
|
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow();
|
||||||
if (BuildConfig.DEBUG)
|
if (BuildConfig.DEBUG)
|
||||||
Log.d(TAG, "find: root = " + root);
|
Log.d(TAG, "find: root = " + root);
|
||||||
if (root == null) {
|
if (root == null) {
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||||||
|
|
||||||
public class EventEmitter {
|
public class EventEmitter {
|
||||||
|
|
||||||
|
|
||||||
private static class ListenerWrapper {
|
private static class ListenerWrapper {
|
||||||
Object listener;
|
Object listener;
|
||||||
boolean isOnce;
|
boolean isOnce;
|
||||||
@@ -63,7 +62,7 @@ public class EventEmitter {
|
|||||||
mBridges.callFunction(listenerWrapper.listener, EventEmitter.this, args);
|
mBridges.callFunction(listenerWrapper.listener, EventEmitter.this, args);
|
||||||
}
|
}
|
||||||
if (listenerWrapper.isOnce) {
|
if (listenerWrapper.isOnce) {
|
||||||
listenerIterator.remove();
|
mListenerWrappers.remove(listenerWrapper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"}}]
|
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":411},"path":"commonRelease-4.0.2 Alpha6.apk","properties":{"packageId":"org.autojs.autojs","split":"","minSdkVersion":"17"}}]
|
||||||
Reference in New Issue
Block a user