fix(autojs): EventEmitter.once(), view._id() ; feat(autojs): auto.getService(), auto.getWindows(), auto.setWindowFilter(), util.java.toJsArray()

This commit is contained in:
hyb1996
2018-09-09 21:37:53 +08:00
parent e09966505c
commit 769529585d
13 changed files with 82 additions and 18 deletions

View File

@@ -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']);

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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();

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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);
}
}
}