新增 手势监听功能(效果不佳不启用)

This commit is contained in:
hyb1996
2018-12-01 17:46:57 +08:00
parent 708cde848c
commit 4bf237a499
23 changed files with 168 additions and 115 deletions

View File

@@ -58,15 +58,6 @@ module = (typeof module === 'undefined') ? {} : module;
Module._load = function _load(file, parent, core, main) {
return NativeRequire.require(file);
var module = new Module(file, parent, core);
var body = readFile(module.filename, module.core);
var dir = new File(module.filename).getParent();
var func = new Function('exports', 'module', 'require', '__filename', '__dirname', body);
func.apply(module,
[module.exports, module, module.require, module.filename, dir]);
module.loaded = true;
module.main = main;
return module.exports;
};
Module.runMain = function runMain(main) {

View File

@@ -0,0 +1,28 @@
package com.stardust.autojs.core.accessibility
import android.accessibilityservice.AccessibilityServiceInfo
import android.os.Build
import com.stardust.autojs.core.pref.Pref
import com.stardust.view.accessibility.AccessibilityService
class AccessibilityService : AccessibilityService() {
override fun onServiceConnected() {
val serviceInfo = serviceInfo
if (Pref.isStableModeEnabled) {
serviceInfo.flags = serviceInfo.flags and AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS.inv()
} else {
serviceInfo.flags = serviceInfo.flags or AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (Pref.isGestureObservingEnabled) {
serviceInfo.flags = serviceInfo.flags or AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE
} else {
serviceInfo.flags = serviceInfo.flags and AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE.inv()
}
}
setServiceInfo(serviceInfo)
super.onServiceConnected()
}
}

View File

@@ -0,0 +1,18 @@
package com.stardust.autojs.core.pref
import android.preference.PreferenceManager
import com.stardust.app.GlobalAppContext
object Pref {
private val preferences = PreferenceManager.getDefaultSharedPreferences(GlobalAppContext.get())
val isStableModeEnabled: Boolean
get() {
return preferences.getBoolean("key_stable_mode", false)
}
val isGestureObservingEnabled: Boolean
get() {
return preferences.getBoolean("key_gesture_observing", false)
}
}

View File

@@ -126,7 +126,7 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine {
Collections.singletonList(new File("/").toURI()));
new RequireBuilder()
.setModuleScriptProvider(new SoftCachingModuleScriptProvider(provider))
.setSandboxed(false)
.setSandboxed(true)
.createRequire(context, scope)
.install(scope);

View File

@@ -7,7 +7,9 @@ import android.graphics.Point;
import android.os.Build;
import android.os.Handler;
import android.provider.Settings;
import androidx.annotation.RequiresApi;
import android.view.KeyEvent;
import com.stardust.autojs.R;
@@ -23,6 +25,7 @@ import com.stardust.notification.NotificationListenerService;
import com.stardust.autojs.runtime.exception.ScriptException;
import com.stardust.autojs.core.inputevent.InputEventObserver;
import com.stardust.autojs.core.inputevent.TouchObserver;
import com.stardust.util.MapBuilder;
import com.stardust.view.accessibility.AccessibilityNotificationObserver;
import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.view.accessibility.KeyInterceptor;
@@ -30,16 +33,35 @@ import com.stardust.view.accessibility.NotificationListener;
import com.stardust.view.accessibility.OnKeyListener;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Created by Stardust on 2017/7/18.
*/
public class Events extends EventEmitter implements OnKeyListener, TouchObserver.OnTouchEventListener, NotificationListener, AccessibilityNotificationObserver.ToastListener {
public class Events extends EventEmitter implements OnKeyListener, TouchObserver.OnTouchEventListener, NotificationListener, AccessibilityNotificationObserver.ToastListener, AccessibilityService.GestureListener {
private static final String PREFIX_KEY_DOWN = "__key_down__#";
private static final String PREFIX_KEY_UP = "__key_up__#";
private static final Map<Integer, String> GESTURES = new MapBuilder<Integer, String>()
.put(AccessibilityService.GESTURE_SWIPE_UP, "up")
.put(AccessibilityService.GESTURE_SWIPE_DOWN, "down")
.put(AccessibilityService.GESTURE_SWIPE_LEFT, "left")
.put(AccessibilityService.GESTURE_SWIPE_RIGHT, "right")
.put(AccessibilityService.GESTURE_SWIPE_LEFT_AND_RIGHT, "left_right")
.put(AccessibilityService.GESTURE_SWIPE_RIGHT_AND_LEFT, "right_left")
.put(AccessibilityService.GESTURE_SWIPE_UP_AND_DOWN, "up_down")
.put(AccessibilityService.GESTURE_SWIPE_DOWN_AND_UP, "down_up")
.put(AccessibilityService.GESTURE_SWIPE_LEFT_AND_UP, "left_up")
.put(AccessibilityService.GESTURE_SWIPE_LEFT_AND_DOWN, "left_down")
.put(AccessibilityService.GESTURE_SWIPE_RIGHT_AND_UP, "right_up")
.put(AccessibilityService.GESTURE_SWIPE_RIGHT_AND_DOWN, "right_down")
.put(AccessibilityService.GESTURE_SWIPE_UP_AND_LEFT, "up_left")
.put(AccessibilityService.GESTURE_SWIPE_UP_AND_RIGHT, "up_right")
.put(AccessibilityService.GESTURE_SWIPE_DOWN_AND_LEFT, "down_left")
.put(AccessibilityService.GESTURE_SWIPE_DOWN_AND_RIGHT, "down_right")
.build();
private AccessibilityBridge mAccessibilityBridge;
private Context mContext;
@@ -50,6 +72,7 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
private Loopers mLoopers;
private Handler mHandler;
private boolean mListeningNotification = false;
private boolean mListeningGesture = false;
private boolean mListeningToast = false;
private ScriptRuntime mScriptRuntime;
private volatile boolean mInterceptsAllKey = false;
@@ -222,6 +245,21 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
mAccessibilityBridge.getNotificationObserver().addToastListener(this);
}
public void observeGesture() {
ScriptRuntime.requiresApi(Build.VERSION_CODES.O);
if (mListeningGesture) {
return;
}
AccessibilityService service = getAccessibilityService();
if ((service.getServiceInfo().flags & AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) == 0) {
throw new ScriptException(mContext.getString(R.string.text_should_enable_gesture_observing));
}
service.getGestureEventDispatcher().addListener(this);
ensureHandler();
mLoopers.waitWhenIdle(true);
mListeningGesture = true;
}
public Events onNotification(Object listener) {
on("notification", listener);
return this;
@@ -260,6 +298,12 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
}
mKeyInterceptor = null;
}
if (mListeningGesture) {
AccessibilityService service = mAccessibilityBridge.getService();
if (service != null) {
service.getGestureEventDispatcher().removeListener(this);
}
}
}
@Override
@@ -297,4 +341,13 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
mHandler.post(() -> emit("toast", toast));
}
@Override
public void onGesture(int gestureId) {
mHandler.post(() -> {
String gesture = GESTURES.get(gestureId);
if (gesture != null) {
emit("gesture", gesture);
}
});
}
}

View File

@@ -15,6 +15,7 @@
<string name="text_accessibility_service_description">使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。</string>
<string name="_app_name">AutoJs</string>
<string name="text_should_enable_key_observing">按键监听未启用,请在软件设置中开启</string>
<string name="text_should_enable_gesture_observing">手势监听未启用,请在软件设置中开启</string>
<string name="no_write_settings_permissin">沒有修改系統设置权限</string>
<string name="exception_notification_service_disabled">通知服务未运行,请重新启用通知权限</string>
<string name="text_requires_app_version_to_run_the_script" formatted="true">本脚本需要Auto.js版本号%d以上才能运行</string>

View File

@@ -6,6 +6,7 @@
android:canPerformGestures="true"
android:canRequestEnhancedWebAccessibility="true"
android:canRequestFilterKeyEvents="true"
android:canRequestTouchExplorationMode="true"
android:canRetrieveWindowContent="true"
android:description="@string/text_accessibility_service_description"
android:notificationTimeout="0"/>