diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java index 946bae89..19135e71 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -8,6 +8,7 @@ import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.accessibility.AccessibilityConfig; import com.stardust.autojs.runtime.exception.ScriptException; import com.stardust.autojs.runtime.api.Console; +import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.Pref; @@ -76,6 +77,31 @@ public class AutoJs extends com.stardust.autojs.AutoJs { } } + @Override + public void waitForAccessibilityServiceEnabled() { + if (AccessibilityService.getInstance() != null) { + return; + } + String errorMessage = null; + if (AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp())) { + errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running); + } else { + if (Pref.shouldEnableAccessibilityServiceByRoot()) { + if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) { + errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout); + } + } else { + errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission); + } + } + if (errorMessage != null) { + AccessibilityServiceTool.goToAccessibilitySetting(); + if (!com.stardust.scriptdroid.accessibility.AccessibilityService.waitForEnabled(-1)) { + throw new ScriptInterruptedException(); + } + } + } + @Override protected AccessibilityConfig createAccessibilityConfig() { AccessibilityConfig config = super.createAccessibilityConfig(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aae36b5e..dd676393 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,7 +10,7 @@ 路径为空 文件不存在 无文件读写权限 - 无障碍服务未启动,脚本已停止运行 + 无障碍服务未启动 关闭侧拉菜单 打开侧拉菜单 撤销 @@ -81,7 +81,7 @@ 文件已存在 无障碍服务 通过Root权限自动启用服务 - 无障碍服务已启用但并未运行,这可能是安卓的BUG,您可能需要重启手机 + 无障碍服务已启用但并未运行,这可能是安卓的BUG,您可能需要重启手机或重启无障碍服务 key_enable_accessibility_service_by_root 使用Root权限启动无障碍服务超时 开启后运行脚本会使用Root权限自动开启无障碍服务 diff --git a/autojs/src/main/assets/modules/__automator__.js b/autojs/src/main/assets/modules/__automator__.js index c5e84f90..19b3fa92 100644 --- a/autojs/src/main/assets/modules/__automator__.js +++ b/autojs/src/main/assets/modules/__automator__.js @@ -1,49 +1,49 @@ -module.exports = function(__runtime__, scope){ +module.exports = function(runtime, global){ var automator = {}; function performAction(action, args){ if(args.length == 4){ - return action(__runtime__.automator.bounds(args[0], args[1], args[2], args[3])); + return action(runtime.automator.bounds(args[0], args[1], args[2], args[3])); }else if(args.length == 2){ - return action(__runtime__.automator.text(args[0], args[1])); + return action(runtime.automator.text(args[0], args[1])); }else { - return action(__runtime__.automator.text(args[0], -1)); + return action(runtime.automator.text(args[0], -1)); } } automator.click = function(){ if(arguments.length == 2 && typeof(arguments[0]) == 'number' && typeof(arguments[1]) == 'number'){ - return __runtime__.automator.click(arguments[0], arguments[1]); + return runtime.automator.click(arguments[0], arguments[1]); } return performAction(function(target){ - return __runtime__.automator.click(target); + return runtime.automator.click(target); }, arguments); } automator.longClick = function(a, b, c, d){ if(arguments.length == 2 && typeof(arguments[0]) == 'number' && typeof(arguments[1]) == 'number'){ - return __runtime__.automator.longClick(arguments[0], arguments[1]); + return runtime.automator.longClick(arguments[0], arguments[1]); } return performAction(function(target){ - return __runtime__.automator.longClick(target); + return runtime.automator.longClick(target); }, arguments); } - automator.press = __runtime__.automator.press.bind(__runtime__.automator); - automator.gesture = __runtime__.automator.gesture.bind(__runtime__.automator, 0); - automator.gestureAsync = __runtime__.automator.gestureAsync.bind(__runtime__.automator, 0); - automator.swipe = __runtime__.automator.swipe.bind(__runtime__.automator); + automator.press = runtime.automator.press.bind(runtime.automator); + automator.gesture = runtime.automator.gesture.bind(runtime.automator, 0); + automator.gestureAsync = runtime.automator.gestureAsync.bind(runtime.automator, 0); + automator.swipe = runtime.automator.swipe.bind(runtime.automator); automator.gestures = function(){ - return __runtime__.automator.gestures(toStrokes(arguments)); + return runtime.automator.gestures(toStrokes(arguments)); } automator.gesturesAsync = function(){ - __runtime__.automator.gesturesAsync(toStrokes(arguments)); + runtime.automator.gesturesAsync(toStrokes(arguments)); } function toStrokes(args){ - var screenMetrics = __runtime__.getScreenMetrics(); + var screenMetrics = runtime.getScreenMetrics(); var len = args.length; var strokes = java.lang.reflect.Array.newInstance(android.accessibilityservice.GestureDescription.StrokeDescription, len); for(var i = 0; i < len; i++){ @@ -70,37 +70,37 @@ module.exports = function(__runtime__, scope){ automator.scrollDown = function(a, b, c, d){ if(arguments.length == 0) - return __runtime__.automator.scrollMaxForward(); + return runtime.automator.scrollMaxForward(); if(arguments.length == 1 && typeof a === 'number') - return __runtime__.automator.scrollForward(a); + return runtime.automator.scrollForward(a); return performAction(function(target){ - return __runtime__.automator.scrollForward(target); + return runtime.automator.scrollForward(target); }, arguments); } automator.scrollUp = function(a, b, c, d){ if(arguments.length == 0) - return __runtime__.automator.scrollMaxBackward(); + return runtime.automator.scrollMaxBackward(); if(arguments.length == 1 && typeof a === 'number') - return __runtime__.automator.scrollBackward(a); + return runtime.automator.scrollBackward(a); return performAction(function(target){ - return __runtime__.automator.scrollBackward(target); + return runtime.automator.scrollBackward(target); }, arguments); } automator.setText = function(a, b){ if(arguments.length == 1){ - return __runtime__.automator.setText(__runtime__.automator.editable(-1), a); + return runtime.automator.setText(runtime.automator.editable(-1), a); }else{ - return __runtime__.automator.setText(__runtime__.automator.editable(a), b); + return runtime.automator.setText(runtime.automator.editable(a), b); } } automator.input = function(a, b){ if(arguments.length == 1){ - return __runtime__.automator.appendText(__runtime__.automator.editable(-1), a); + return runtime.automator.appendText(runtime.automator.editable(-1), a); }else{ - return __runtime__.automator.appendText(__runtime__.automator.editable(a), b); + return runtime.automator.appendText(runtime.automator.editable(a), b); } } @@ -109,7 +109,7 @@ module.exports = function(__runtime__, scope){ "fast": 1 } - scope.auto = function(mode){ + global.auto = function(mode){ if(mode){ if(typeof(mode) !== "string"){ throw new TypeError("mode should be a string"); @@ -117,12 +117,17 @@ module.exports = function(__runtime__, scope){ mode = modes[mode.toLowerCase()]; } mode = mode || 0; - __runtime__.accessibilityBridge.setMode(mode); - __runtime__.accessibilityBridge.ensureServiceEnabled(); + runtime.accessibilityBridge.setMode(mode); + runtime.accessibilityBridge.ensureServiceEnabled(); } - 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']); + global.auto.waitFor = function(){ + runtime.accessibilityBridge.waitForServiceEnabled(); + } + + + 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']); return automator; } diff --git a/autojs/src/main/assets/modules/__globals__.js b/autojs/src/main/assets/modules/__globals__.js index 5e17e93f..113aae27 100644 --- a/autojs/src/main/assets/modules/__globals__.js +++ b/autojs/src/main/assets/modules/__globals__.js @@ -1,72 +1,72 @@ -module.exports = function(__runtime__, scope){ - scope.toast = function(text){ - __runtime__.toast(text); +module.exports = function(runtime, global){ + global.toast = function(text){ + runtime.toast(text); } - scope.toastLog = function(text){ - __runtime__.toast(text); - scope.log(text); + global.toastLog = function(text){ + runtime.toast(text); + global.log(text); } - scope.sleep = __runtime__.sleep.bind(__runtime__); + global.sleep = runtime.sleep.bind(runtime); - scope.isStopped = function(){ - return __runtime__.isStopped(); + global.isStopped = function(){ + return runtime.isStopped(); } - scope.isShuttingDown = scope.isShopped; + global.isShuttingDown = global.isShopped; - scope.notStopped = function(){ + global.notStopped = function(){ return !isStopped(); } - scope.isRunning = scope.notStopped; + global.isRunning = global.notStopped; - scope.exit = __runtime__.exit.bind(__runtime__); + global.exit = runtime.exit.bind(runtime); - scope.stop = scope.exit; + global.stop = global.exit; - scope.setClip = function(text){ - __runtime__.setClip(text); + global.setClip = function(text){ + runtime.setClip(text); } - scope.getClip = function(text){ - return __runtime__.getClip(); + global.getClip = function(text){ + return runtime.getClip(); } - scope.currentPackage = function(){ - scope.auto(); - return __runtime__.info.getLatestPackage(); + global.currentPackage = function(){ + global.auto(); + return runtime.info.getLatestPackage(); } - scope.currentActivity = function(){ - scope.auto(); - return __runtime__.info.getLatestActivity(); + global.currentActivity = function(){ + global.auto(); + return runtime.info.getLatestActivity(); } - scope.waitForActivity = function(activity, period){ + global.waitForActivity = function(activity, period){ period = period || 200; - while(scope.currentActivity() != activity){ + while(global.currentActivity() != activity){ sleep(period); } } - scope.waitForPackage = function(packageName, period){ + global.waitForPackage = function(packageName, period){ period = period || 200; - while(scope.currentPackage() != packageName){ + while(global.currentPackage() != packageName){ sleep(period); } } - scope.random = function(min, max){ + global.random = function(min, max){ if(arguments.length == 0){ return Math.random(); } return Math.floor(Math.random() * (max - min + 1)) + min; } - scope.setScreenMetrics = __runtime__.setScreenMetrics.bind(__runtime__); + global.setScreenMetrics = runtime.setScreenMetrics.bind(runtime); } \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/AutoJs.java b/autojs/src/main/java/com/stardust/autojs/AutoJs.java index 0c021c1d..87fc1a91 100644 --- a/autojs/src/main/java/com/stardust/autojs/AutoJs.java +++ b/autojs/src/main/java/com/stardust/autojs/AutoJs.java @@ -174,6 +174,8 @@ public abstract class AutoJs { } + public abstract void waitForAccessibilityServiceEnabled(); + protected AccessibilityConfig createAccessibilityConfig() { return new AccessibilityConfig(); } @@ -189,6 +191,11 @@ public abstract class AutoJs { AutoJs.this.ensureAccessibilityServiceEnabled(); } + @Override + public void waitForServiceEnabled() { + AutoJs.this.waitForAccessibilityServiceEnabled(); + } + @Nullable @Override public AccessibilityService getService() { 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 9e32c5d2..b563ef9f 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 @@ -29,6 +29,8 @@ public abstract class AccessibilityBridge { public abstract void ensureServiceEnabled(); + public abstract void waitForServiceEnabled(); + @Nullable public abstract AccessibilityService getService(); diff --git a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java index f08ea18b..a209e0a8 100644 --- a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java +++ b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java @@ -152,6 +152,12 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi return true; LOCK.lock(); try { + if (instance != null) + return true; + if (timeOut == -1) { + ENABLED.await(); + return true; + } return ENABLED.await(timeOut, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java b/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java index 314dbb65..7536b217 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java @@ -10,6 +10,7 @@ import com.stardust.auojs.inrt.R; import com.stardust.auojs.inrt.SettingsActivity; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.exception.ScriptException; +import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityServiceUtils; @@ -58,6 +59,31 @@ public class AutoJs extends com.stardust.autojs.AutoJs { } } + @Override + public void waitForAccessibilityServiceEnabled() { + if (AccessibilityService.getInstance() != null) { + return; + } + String errorMessage = null; + if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(getApplication(), AccessibilityService.class)) { + errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running); + } else { + if (Pref.shouldEnableAccessibilityServiceByRoot()) { + if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(getApplication(), 2000)) { + errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout); + } + } else { + errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission); + } + } + if (errorMessage != null) { + AccessibilityServiceTool.goToAccessibilitySetting(); + if (!AccessibilityService.waitForEnabled(-1)) { + throw new ScriptInterruptedException(); + } + } + } + @Override protected Application getApplication() { return App.getApp();