add docs and samples for events module

This commit is contained in:
hyb1996
2017-07-20 22:03:21 +08:00
parent 52cc5214f1
commit 85216477c4
15 changed files with 555 additions and 49 deletions

View File

@@ -35,5 +35,6 @@ require("__general__")(__runtime__, this);
}
})(__that__);
__importClass__(android.view.KeyEvent);
__importClass__(com.stardust.autojs.runtime.api.Shell);
__importClass__(com.stardust.autojs.runtime.api.InputEventSender);

View File

@@ -54,19 +54,13 @@ public class EventEmitter {
Iterator<ListenerWrapper> listenerIterator = mListenerWrappers.iterator();
while (listenerIterator.hasNext()) {
ListenerWrapper listenerWrapper = listenerIterator.next();
onEvent(listenerWrapper, args);
call(listenerWrapper.listener, args);
if (listenerWrapper.isOnce) {
listenerIterator.remove();
}
}
}
private void onEvent(ListenerWrapper listenerWrapper, Object[] args) {
if (mFunctionCaller != null) {
mFunctionCaller.call(listenerWrapper.listener, args);
}
}
int count() {
return mListenerWrappers.size();
}
@@ -98,7 +92,8 @@ public class EventEmitter {
}
private Map<String, Listeners> mListenersMap = new HashMap<>();
private int mMaxListeners = defaultMaxListeners();
public static int defaultMaxListeners = 10;
private int mMaxListeners = defaultMaxListeners;
private FunctionCaller mFunctionCaller;
public EventEmitter once(String eventName, Object listener) {
@@ -186,10 +181,17 @@ public class EventEmitter {
}
public static int defaultMaxListeners() {
return 0;
return defaultMaxListeners;
}
public void setFunctionCaller(FunctionCaller functionCaller) {
mFunctionCaller = functionCaller;
}
protected void call(Object func, Object[] args) {
if (mFunctionCaller != null) {
mFunctionCaller.call(func, args);
}
}
}

View File

@@ -1,14 +1,14 @@
package com.stardust.autojs.runtime.api;
import android.content.Context;
import android.graphics.Point;
import android.os.Handler;
import android.os.Looper;
import android.text.method.KeyListener;
import android.util.SparseArray;
import android.view.KeyEvent;
import com.stardust.autojs.runtime.AccessibilityBridge;
import com.stardust.autojs.runtime.ScriptStopException;
import com.stardust.autojs.runtime.record.inputevent.InputEventRecorder;
import com.stardust.autojs.runtime.record.inputevent.TouchObserver;
import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.view.accessibility.OnKeyListener;
@@ -23,15 +23,16 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
private static final String PREFIX_KEY_DOWN = "__key_down__#";
private static final String PREFIX_KEY_UP = "__key_up__#";
private static final Object[] NO_ARGUMENT = new Object[0];
private static ConcurrentHashMap<Thread, Looper> sLoopers = new ConcurrentHashMap<>();
private AccessibilityBridge mAccessibilityBridge;
private boolean mListeningKey = false;
private Handler mHandler;
private Context mContext;
private TouchObserver mTouchObserver;
private long mLastTouchEventMillis;
private long mTouchEventTimeout = 10;
private boolean mListeningKey = false;
public Events(Context context, AccessibilityBridge accessibilityBridge) {
mAccessibilityBridge = accessibilityBridge;
@@ -39,10 +40,19 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
}
public void observeKey() {
ensureListeningKey();
if (mListeningKey)
return;
mListeningKey = true;
prepareLoopIfNeeded();
mAccessibilityBridge.ensureServiceEnabled();
AccessibilityService service = mAccessibilityBridge.getService();
if (service == null)
throw new ScriptStopException();
service.getOnKeyObserver().addListener(this);
}
public void observeTouch() {
prepareLoopIfNeeded();
if (mTouchObserver != null)
return;
mTouchObserver = new TouchObserver(mContext);
@@ -50,16 +60,19 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
mTouchObserver.observe();
}
private void ensureListeningKey() {
if (mListeningKey) {
public void setTimeout(final Object listener, long t) {
prepareLoopIfNeeded();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
call(listener, NO_ARGUMENT);
}
}, t);
}
private void prepareLoopIfNeeded() {
if (Looper.myLooper() != null)
return;
}
mListeningKey = true;
mAccessibilityBridge.ensureServiceEnabled();
AccessibilityService service = mAccessibilityBridge.getService();
if (service == null)
throw new ScriptStopException();
service.getOnKeyObserver().addListener(this);
Looper.prepare();
sLoopers.put(Thread.currentThread(), Looper.myLooper());
mHandler = new Handler();
@@ -151,12 +164,17 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
}
@Override
public void onTouch(int x, int y) {
public void onTouch(final int x, final int y) {
if (System.currentTimeMillis() - mLastTouchEventMillis < mTouchEventTimeout) {
return;
}
mLastTouchEventMillis = System.currentTimeMillis();
emit("touch", x, y);
mHandler.post(new Runnable() {
@Override
public void run() {
emit("touch", new Point(x, y));
}
});
}
public static void removeThreadRecord(Thread thread) {
@@ -170,5 +188,4 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver
}
}
}

View File

@@ -46,7 +46,7 @@ public class TouchObserver {
private class TouchEventObserver extends InputEventConverter {
private int mLastTouchX, mLastTouchY;
private int mLastTouchX = -1, mLastTouchY = -1;
@Override
public void convertEvent(@NonNull Event event) {