add: auto() function and two mode of fetching rootInActiveWindow
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
"auto";
|
auto();
|
||||||
|
|
||||||
var 好友验证信息 = "AutoJs自动添加群好友";
|
var 好友验证信息 = "AutoJs自动添加群好友";
|
||||||
var 延迟 = 500;
|
var 延迟 = 500;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
"auto";
|
auto("fast");
|
||||||
|
|
||||||
|
|
||||||
toast("请打开一个聊天窗口");
|
toast("请打开一个聊天窗口");
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import android.content.SharedPreferences;
|
|||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
import com.stardust.autojs.runtime.api.AutomatorConfig;
|
import com.stardust.autojs.runtime.api.AutomatorConfig;
|
||||||
import com.stardust.automator.AccessibilityEventCommandHost;
|
|
||||||
import com.stardust.scriptdroid.autojs.AutoJs;
|
import com.stardust.scriptdroid.autojs.AutoJs;
|
||||||
|
|
||||||
import org.mozilla.javascript.NativeArray;
|
import org.mozilla.javascript.NativeArray;
|
||||||
@@ -25,9 +24,7 @@ public class Pref {
|
|||||||
private static SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
|
private static SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
if (key.equals(getString(R.string.key_run_mode))) {
|
if (key.equals(getString(R.string.key_guard_mode))) {
|
||||||
AutoJs.getInstance().getCommandHost().setRunMode(getRunModeFromValue(sharedPreferences.getString(key, null)));
|
|
||||||
} else if (key.equals(getString(R.string.key_guard_mode))) {
|
|
||||||
AutomatorConfig.setIsUnintendedGuardEnabled(sharedPreferences.getBoolean(getString(R.string.key_guard_mode), false));
|
AutomatorConfig.setIsUnintendedGuardEnabled(sharedPreferences.getBoolean(getString(R.string.key_guard_mode), false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,19 +34,6 @@ public class Pref {
|
|||||||
AutomatorConfig.setIsUnintendedGuardEnabled(def().getBoolean(getString(R.string.key_guard_mode), false));
|
AutomatorConfig.setIsUnintendedGuardEnabled(def().getBoolean(getString(R.string.key_guard_mode), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getRunModeFromValue(String value) {
|
|
||||||
if (value == null)
|
|
||||||
return AccessibilityEventCommandHost.RUN_MODE_THREAD_POOL;
|
|
||||||
switch (value) {
|
|
||||||
case "KEY_THREAD_POOL":
|
|
||||||
return AccessibilityEventCommandHost.RUN_MODE_THREAD_POOL;
|
|
||||||
case "KEY_NEW_THREAD_EVERY_TIME":
|
|
||||||
return AccessibilityEventCommandHost.RUN_MODE_NEW_THREAD_EVERY_TIME;
|
|
||||||
default:
|
|
||||||
return AccessibilityEventCommandHost.RUN_MODE_SINGLE_THREAD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static SharedPreferences def() {
|
private static SharedPreferences def() {
|
||||||
return PreferenceManager.getDefaultSharedPreferences(App.getApp());
|
return PreferenceManager.getDefaultSharedPreferences(App.getApp());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ import com.stardust.view.accessibility.LayoutInspector;
|
|||||||
* Created by Stardust on 2017/4/2.
|
* Created by Stardust on 2017/4/2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class AutoJs implements AccessibilityBridge {
|
public class AutoJs {
|
||||||
|
|
||||||
private static AutoJs instance;
|
private static AutoJs instance;
|
||||||
|
|
||||||
@@ -56,36 +56,29 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
|
|
||||||
private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder();
|
private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder();
|
||||||
private final LayoutInspector mLayoutInspector = new LayoutInspector();
|
private final LayoutInspector mLayoutInspector = new LayoutInspector();
|
||||||
private final ScriptEngineService mScriptEngineService;
|
private final Context mContext;
|
||||||
private final AccessibilityInfoProvider mAccessibilityInfoProvider;
|
|
||||||
private final UiHandler mUiHandler;
|
private final UiHandler mUiHandler;
|
||||||
private final AppUtils mAppUtils;
|
private final AppUtils mAppUtils;
|
||||||
private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequester.AbstractScreenCaptureRequester() {
|
private final AccessibilityInfoProvider mAccessibilityInfoProvider;
|
||||||
|
private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl();
|
||||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
private final ScriptEngineService mScriptEngineService;
|
||||||
@Override
|
|
||||||
public void request() {
|
|
||||||
Activity activity = mAppUtils.getCurrentActivity();
|
|
||||||
if (activity instanceof OnActivityResultDelegate.DelegateHost) {
|
|
||||||
ScreenCaptureRequester requester = new ActivityScreenCaptureRequester(
|
|
||||||
((OnActivityResultDelegate.DelegateHost) activity).getOnActivityResultDelegateMediator(), activity);
|
|
||||||
requester.setOnActivityResultCallback(mCallback);
|
|
||||||
requester.request();
|
|
||||||
} else {
|
|
||||||
ScreenCaptureRequestActivity.request(mUiHandler.getContext(), mCallback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
private AutoJs(final Context context) {
|
private AutoJs(final Context context) {
|
||||||
|
mContext = context;
|
||||||
mUiHandler = new UiHandler(context);
|
mUiHandler = new UiHandler(context);
|
||||||
mAppUtils = new AppUtils(context);
|
mAppUtils = new AppUtils(context);
|
||||||
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
|
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
|
||||||
ScriptEngineManager manager = createScriptEngineManager(context);
|
mScriptEngineService = buildScriptEngineService();
|
||||||
|
addAccessibilityServiceDelegates();
|
||||||
|
mScriptEngineService.registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener());
|
||||||
|
registerActivityLifecycleCallbacks();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScriptEngineService buildScriptEngineService() {
|
||||||
|
ScriptEngineManager manager = createScriptEngineManager(mContext);
|
||||||
final Console globalConsole = new JraskaConsole();
|
final Console globalConsole = new JraskaConsole();
|
||||||
mScriptEngineService = new ScriptEngineServiceBuilder()
|
return new ScriptEngineServiceBuilder()
|
||||||
.uiHandler(mUiHandler)
|
.uiHandler(mUiHandler)
|
||||||
.globalConsole(globalConsole)
|
.globalConsole(globalConsole)
|
||||||
.engineManger(manager)
|
.engineManger(manager)
|
||||||
@@ -96,21 +89,18 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
return new ScriptRuntime.Builder()
|
return new ScriptRuntime.Builder()
|
||||||
.setConsole(new StardustConsole(mUiHandler, globalConsole))
|
.setConsole(new StardustConsole(mUiHandler, globalConsole))
|
||||||
.setScreenCaptureRequester(mScreenCaptureRequester)
|
.setScreenCaptureRequester(mScreenCaptureRequester)
|
||||||
.setAccessibilityBridge(AutoJs.this)
|
.setAccessibilityBridge(new AccessibilityBridgeImpl())
|
||||||
.setUiHandler(mUiHandler)
|
.setUiHandler(mUiHandler)
|
||||||
.setAppUtils(mAppUtils)
|
.setAppUtils(mAppUtils)
|
||||||
.setShellSupplier(new Supplier<AbstractShell>() {
|
.setShellSupplier(new Supplier<AbstractShell>() {
|
||||||
@Override
|
@Override
|
||||||
public AbstractShell get() {
|
public AbstractShell get() {
|
||||||
return new Shell(context, true);
|
return new Shell(mContext, true);
|
||||||
}
|
}
|
||||||
}).build();
|
}).build();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
addAccessibilityServiceDelegates();
|
|
||||||
mScriptEngineService.registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener());
|
|
||||||
registerActivityLifecycleCallbacks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerActivityLifecycleCallbacks() {
|
private void registerActivityLifecycleCallbacks() {
|
||||||
@@ -159,14 +149,16 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
return mLayoutInspector;
|
return mLayoutInspector;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
public ScriptEngineService getScriptEngineService() {
|
||||||
public AccessibilityService getService() {
|
return mScriptEngineService;
|
||||||
return AccessibilityService.getInstance();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public AccessibilityInfoProvider getInfoProvider() {
|
||||||
public void ensureServiceEnabled() {
|
return mAccessibilityInfoProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ensureAccessibilityServiceEnabled() {
|
||||||
if (AccessibilityService.getInstance() == null) {
|
if (AccessibilityService.getInstance() == null) {
|
||||||
String errorMessage = null;
|
String errorMessage = null;
|
||||||
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), AccessibilityService.class)) {
|
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), AccessibilityService.class)) {
|
||||||
@@ -187,12 +179,40 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public AccessibilityInfoProvider getInfoProvider() {
|
private class AccessibilityBridgeImpl extends AccessibilityBridge {
|
||||||
return mAccessibilityInfoProvider;
|
|
||||||
|
@Override
|
||||||
|
public void ensureServiceEnabled() {
|
||||||
|
AutoJs.this.ensureAccessibilityServiceEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public AccessibilityService getService() {
|
||||||
|
return AccessibilityService.getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessibilityInfoProvider getInfoProvider() {
|
||||||
|
return mAccessibilityInfoProvider;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScriptEngineService getScriptEngineService() {
|
private class ScreenCaptureRequesterImpl extends ScreenCaptureRequester.AbstractScreenCaptureRequester {
|
||||||
return mScriptEngineService;
|
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
@Override
|
||||||
|
public void request() {
|
||||||
|
Activity activity = mAppUtils.getCurrentActivity();
|
||||||
|
if (activity instanceof OnActivityResultDelegate.DelegateHost) {
|
||||||
|
ScreenCaptureRequester requester = new ActivityScreenCaptureRequester(
|
||||||
|
((OnActivityResultDelegate.DelegateHost) activity).getOnActivityResultDelegateMediator(), activity);
|
||||||
|
requester.setOnActivityResultCallback(mCallback);
|
||||||
|
requester.request();
|
||||||
|
} else {
|
||||||
|
ScreenCaptureRequestActivity.request(mContext, mCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
|
|
||||||
__runtime__.init();
|
__runtime__.init();
|
||||||
|
|
||||||
if(__engine_name__ == "rhino"){
|
__importClass__ = importClass;
|
||||||
__importClass__ = importClass;
|
var importClass = function(pack){
|
||||||
var importClass = function(pack){
|
|
||||||
if(typeof(pack) == "string"){
|
if(typeof(pack) == "string"){
|
||||||
__importClass__(Packages[pack]);
|
__importClass__(Packages[pack]);
|
||||||
}else{
|
}else{
|
||||||
__importClass__(pack);
|
__importClass__(pack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var loadJar = function(path){
|
|
||||||
|
var loadJar = function(path){
|
||||||
__runtime__.loadJar(path);
|
__runtime__.loadJar(path);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__runtime__.bridges.setFunctionCaller(function(func, target, args){
|
__runtime__.bridges.setFunctionCaller(function(func, target, args){
|
||||||
|
|||||||
@@ -97,12 +97,28 @@ module.exports = function(__runtime__, scope){
|
|||||||
}
|
}
|
||||||
|
|
||||||
automator.input = function(a, b){
|
automator.input = function(a, b){
|
||||||
if(arguments.length == 1){
|
if(arguments.length == 1){
|
||||||
return __runtime__.automator.appendText(__runtime__.automator.editable(-1), a);
|
return __runtime__.automator.appendText(__runtime__.automator.editable(-1), a);
|
||||||
}else{
|
}else{
|
||||||
return __runtime__.automator.appendText(__runtime__.automator.editable(a), b);
|
return __runtime__.automator.appendText(__runtime__.automator.editable(a), b);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var modes = {
|
||||||
|
"normal": 0,
|
||||||
|
"fast": 1
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.auto = function(mode){
|
||||||
|
if(mode){
|
||||||
|
if(typeof(mode) !== "string"){
|
||||||
|
throw new TypeError("mode should be a string");
|
||||||
|
}
|
||||||
|
mode = modes[mode.toLowerCase()];
|
||||||
|
}
|
||||||
|
mode = mode || 0;
|
||||||
|
__runtime__.accessibilityBridge.setMode(mode);
|
||||||
|
}
|
||||||
|
|
||||||
scope.__asGlobal__(__runtime__.automator, ['back', 'home', 'powerDialog', 'notifications', 'quickSettings', 'recents', 'splitScreen']);
|
scope.__asGlobal__(__runtime__.automator, ['back', 'home', 'powerDialog', 'notifications', 'quickSettings', 'recents', 'splitScreen']);
|
||||||
scope.__asGlobal__(automator, ['click', 'longClick', 'press', 'swipe', 'gesture', 'gestures', 'gestureAsync', 'gesturesAsync', 'scrollDown', 'scrollUp', 'input', 'setText']);
|
scope.__asGlobal__(automator, ['click', 'longClick', 'press', 'swipe', 'gesture', 'gestures', 'gestureAsync', 'gesturesAsync', 'scrollDown', 'scrollUp', 'input', 'setText']);
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ module.exports = function(__runtime__, scope){
|
|||||||
}
|
}
|
||||||
|
|
||||||
return function(){
|
return function(){
|
||||||
return __runtime__.selector(scope.__engine__);
|
var s = __runtime__.selector(scope.__engine__);
|
||||||
|
return s;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.stardust.autojs.runtime;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Looper;
|
|
||||||
import android.support.annotation.CallSuper;
|
import android.support.annotation.CallSuper;
|
||||||
|
|
||||||
import com.stardust.autojs.engine.ScriptEngine;
|
import com.stardust.autojs.engine.ScriptEngine;
|
||||||
@@ -24,6 +23,8 @@ import com.stardust.util.UiHandler;
|
|||||||
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/5/4.
|
* Created by Stardust on 2017/5/4.
|
||||||
@@ -61,16 +62,19 @@ public abstract class AbstractScriptRuntime {
|
|||||||
@ScriptVariable
|
@ScriptVariable
|
||||||
public Timers timers;
|
public Timers timers;
|
||||||
|
|
||||||
|
@ScriptVariable
|
||||||
|
public AccessibilityBridge accessibilityBridge;
|
||||||
|
|
||||||
private Images images;
|
private Images images;
|
||||||
|
|
||||||
private UiHandler mUiHandler;
|
private UiHandler mUiHandler;
|
||||||
private AccessibilityBridge mAccessibilityBridge;
|
|
||||||
private static WeakReference<Context> applicationContext;
|
private static WeakReference<Context> applicationContext;
|
||||||
|
private Map<String, Object> mProperties = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public AbstractScriptRuntime(UiHandler uiHandler, Console console, AccessibilityBridge bridge, AppUtils appUtils, ScreenCaptureRequester screenCaptureRequester) {
|
public AbstractScriptRuntime(UiHandler uiHandler, Console console, AccessibilityBridge bridge, AppUtils appUtils, ScreenCaptureRequester screenCaptureRequester) {
|
||||||
this.app = appUtils;
|
this.app = appUtils;
|
||||||
this.console = console;
|
this.console = console;
|
||||||
mAccessibilityBridge = bridge;
|
accessibilityBridge = bridge;
|
||||||
mUiHandler = uiHandler;
|
mUiHandler = uiHandler;
|
||||||
this.automator = new SimpleActionAutomator(bridge, this);
|
this.automator = new SimpleActionAutomator(bridge, this);
|
||||||
this.info = bridge.getInfoProvider();
|
this.info = bridge.getInfoProvider();
|
||||||
@@ -90,7 +94,7 @@ public abstract class AbstractScriptRuntime {
|
|||||||
if (loopers != null)
|
if (loopers != null)
|
||||||
throw new IllegalStateException("already initialized");
|
throw new IllegalStateException("already initialized");
|
||||||
loopers = new Loopers();
|
loopers = new Loopers();
|
||||||
events = new Events(mUiHandler.getContext(), mAccessibilityBridge, bridges, loopers);
|
events = new Events(mUiHandler.getContext(), accessibilityBridge, bridges, loopers);
|
||||||
timers = new Timers(bridges);
|
timers = new Timers(bridges);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,5 +162,16 @@ public abstract class AbstractScriptRuntime {
|
|||||||
return images;
|
return images;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Object getProperty(String key) {
|
||||||
|
return mProperties.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object putProperty(String key, Object value) {
|
||||||
|
return mProperties.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object removeProperty(String key) {
|
||||||
|
return mProperties.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.stardust.autojs.runtime;
|
package com.stardust.autojs.runtime;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
|
||||||
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
||||||
import com.stardust.view.accessibility.AccessibilityService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
@@ -9,15 +11,37 @@ import com.stardust.view.accessibility.AccessibilityService;
|
|||||||
* Created by Stardust on 2017/4/2.
|
* Created by Stardust on 2017/4/2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public interface AccessibilityBridge {
|
public abstract class AccessibilityBridge {
|
||||||
|
|
||||||
void ensureServiceEnabled();
|
public static final int MODE_NORMAL = 0;
|
||||||
|
public static final int MODE_FAST = 1;
|
||||||
|
|
||||||
AccessibilityInfoProvider getInfoProvider();
|
private int mMode = MODE_NORMAL;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract void ensureServiceEnabled();
|
||||||
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
AccessibilityService getService();
|
public abstract AccessibilityService getService();
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public AccessibilityNodeInfo getRootInActiveWindow() {
|
||||||
|
AccessibilityService service = getService();
|
||||||
|
if (service == null)
|
||||||
|
return null;
|
||||||
|
if (mMode == MODE_FAST) {
|
||||||
|
return service.fastRootInActiveWindow();
|
||||||
|
}
|
||||||
|
return service.getRootInActiveWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public abstract AccessibilityInfoProvider getInfoProvider();
|
||||||
|
|
||||||
|
|
||||||
|
public void setMode(int mode) {
|
||||||
|
mMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.stardust.autojs.runtime.api;
|
package com.stardust.autojs.runtime.api;
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityService;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
|
||||||
@@ -17,6 +17,7 @@ import com.stardust.automator.UiObjectCollection;
|
|||||||
import com.stardust.automator.filter.DfsFilter;
|
import com.stardust.automator.filter.DfsFilter;
|
||||||
import com.stardust.util.DeveloperUtils;
|
import com.stardust.util.DeveloperUtils;
|
||||||
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator;
|
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator;
|
||||||
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
|
|
||||||
import org.mozilla.javascript.NativeArray;
|
import org.mozilla.javascript.NativeArray;
|
||||||
|
|
||||||
@@ -58,6 +59,8 @@ import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.
|
|||||||
|
|
||||||
public class UiSelector extends UiGlobalSelector {
|
public class UiSelector extends UiGlobalSelector {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static final String TAG = "UiSelector";
|
private static final String TAG = "UiSelector";
|
||||||
|
|
||||||
private AccessibilityBridge mAccessibilityBridge;
|
private AccessibilityBridge mAccessibilityBridge;
|
||||||
@@ -80,16 +83,14 @@ public class UiSelector extends UiGlobalSelector {
|
|||||||
Log.d(TAG, "isSelfPackage return null");
|
Log.d(TAG, "isSelfPackage return null");
|
||||||
return UiObjectCollection.EMPTY;
|
return UiObjectCollection.EMPTY;
|
||||||
}
|
}
|
||||||
AccessibilityService service = mAccessibilityBridge.getService();
|
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow();
|
||||||
if (service != null) {
|
if (root == null) {
|
||||||
AccessibilityNodeInfo root = service.getRootInActiveWindow();
|
return UiObjectCollection.EMPTY;
|
||||||
if (root != null) {
|
|
||||||
return findOf(UiObject.createRoot(root, mAllocator));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return UiObjectCollection.EMPTY;
|
return findOf(UiObject.createRoot(root, mAllocator));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void ensureAccessibilityServiceEnabled() {
|
private void ensureAccessibilityServiceEnabled() {
|
||||||
mAccessibilityBridge.ensureServiceEnabled();
|
mAccessibilityBridge.ensureServiceEnabled();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import android.accessibilityservice.GestureDescription;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.RequiresApi;
|
import android.support.annotation.RequiresApi;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
@@ -254,10 +255,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;
|
||||||
}
|
}
|
||||||
AccessibilityService service = mAccessibilityBridge.getService();
|
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow();
|
||||||
if (service == null)
|
|
||||||
return false;
|
|
||||||
AccessibilityNodeInfo root = service.getRootInActiveWindow();
|
|
||||||
if (root == null)
|
if (root == null)
|
||||||
return false;
|
return false;
|
||||||
Log.v(TAG, "performAction: " + simpleAction + " root = " + root);
|
Log.v(TAG, "performAction: " + simpleAction + " root = " + root);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.stardust.view.accessibility;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
@@ -39,8 +40,8 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|||||||
private static boolean containsAllEventTypes = false;
|
private static boolean containsAllEventTypes = false;
|
||||||
private static final Set<Integer> eventTypes = new HashSet<>();
|
private static final Set<Integer> eventTypes = new HashSet<>();
|
||||||
private OnKeyListener.Observer mOnKeyObserver = new OnKeyListener.Observer();
|
private OnKeyListener.Observer mOnKeyObserver = new OnKeyListener.Observer();
|
||||||
private Handler mHandler;
|
|
||||||
private ExecutorService mKeyEventExecutor;
|
private ExecutorService mKeyEventExecutor;
|
||||||
|
private AccessibilityNodeInfo mFastRootInActiveWindow;
|
||||||
|
|
||||||
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
|
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
|
||||||
mDelegates.put(uniquePriority, delegate);
|
mDelegates.put(uniquePriority, delegate);
|
||||||
@@ -64,6 +65,11 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|||||||
Log.v(TAG, "onAccessibilityEvent: " + event);
|
Log.v(TAG, "onAccessibilityEvent: " + event);
|
||||||
if (!containsAllEventTypes && !eventTypes.contains(event.getEventType()))
|
if (!containsAllEventTypes && !eventTypes.contains(event.getEventType()))
|
||||||
return;
|
return;
|
||||||
|
int type = event.getEventType();
|
||||||
|
if (type == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || type == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
|
||||||
|
|| type == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
|
||||||
|
mFastRootInActiveWindow = super.getRootInActiveWindow();
|
||||||
|
}
|
||||||
for (Map.Entry<Integer, AccessibilityDelegate> entry : mDelegates.entrySet()) {
|
for (Map.Entry<Integer, AccessibilityDelegate> entry : mDelegates.entrySet()) {
|
||||||
AccessibilityDelegate delegate = entry.getValue();
|
AccessibilityDelegate delegate = entry.getValue();
|
||||||
Set<Integer> types = delegate.getEventTypes();
|
Set<Integer> types = delegate.getEventTypes();
|
||||||
@@ -127,17 +133,13 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|||||||
LOCK.lock();
|
LOCK.lock();
|
||||||
ENABLED.signalAll();
|
ENABLED.signalAll();
|
||||||
LOCK.unlock();
|
LOCK.unlock();
|
||||||
mHandler = new Handler();
|
|
||||||
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG???
|
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG???
|
||||||
}
|
}
|
||||||
|
|
||||||
private AccessibilityNodeInfo superGetRootInActiveWindow() {
|
|
||||||
try {
|
@Nullable
|
||||||
return super.getRootInActiveWindow();
|
public AccessibilityNodeInfo fastRootInActiveWindow() {
|
||||||
} catch (IllegalStateException e) {
|
return mFastRootInActiveWindow;
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean disable() {
|
public static boolean disable() {
|
||||||
@@ -162,4 +164,5 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|||||||
public static OnKeyListener.Observer getStickOnKeyObserver() {
|
public static OnKeyListener.Observer getStickOnKeyObserver() {
|
||||||
return stickOnKeyObserver;
|
return stickOnKeyObserver;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
|||||||
* Created by Stardust on 2017/7/1.
|
* Created by Stardust on 2017/7/1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class AutoJs implements AccessibilityBridge {
|
public class AutoJs {
|
||||||
|
|
||||||
private static AutoJs instance;
|
private static AutoJs instance;
|
||||||
|
|
||||||
@@ -84,11 +84,12 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
.runtime(new Supplier<ScriptRuntime>() {
|
.runtime(new Supplier<ScriptRuntime>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public com.stardust.autojs.runtime.ScriptRuntime get() {
|
public ScriptRuntime get() {
|
||||||
return new ScriptRuntime.Builder()
|
return new ScriptRuntime.Builder()
|
||||||
.setConsole(new StardustConsole(mUiHandler))
|
.setConsole(new StardustConsole(mUiHandler))
|
||||||
.setScreenCaptureRequester(mScreenCaptureRequester)
|
.setScreenCaptureRequester(mScreenCaptureRequester)
|
||||||
.setAccessibilityBridge(AutoJs.this)
|
// TODO: 2017/7/31
|
||||||
|
.setAccessibilityBridge(null)
|
||||||
.setUiHandler(mUiHandler)
|
.setUiHandler(mUiHandler)
|
||||||
.setAppUtils(mAppUtils)
|
.setAppUtils(mAppUtils)
|
||||||
.setShellSupplier(new Supplier<AbstractShell>() {
|
.setShellSupplier(new Supplier<AbstractShell>() {
|
||||||
@@ -134,12 +135,10 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
|
||||||
public AccessibilityService getService() {
|
public AccessibilityService getService() {
|
||||||
return AccessibilityService.getInstance();
|
return AccessibilityService.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void ensureServiceEnabled() {
|
public void ensureServiceEnabled() {
|
||||||
Context context = mApplication.getApplicationContext();
|
Context context = mApplication.getApplicationContext();
|
||||||
if (AccessibilityService.getInstance() == null) {
|
if (AccessibilityService.getInstance() == null) {
|
||||||
@@ -154,7 +153,6 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public AccessibilityInfoProvider getInfoProvider() {
|
public AccessibilityInfoProvider getInfoProvider() {
|
||||||
return mAccessibilityInfoProvider;
|
return mAccessibilityInfoProvider;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user