summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java19
1 files changed, 17 insertions, 2 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
index 2fbaee65864a..1d58e90bbb38 100644
--- a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
@@ -39,6 +39,7 @@ import android.content.IntentFilter;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.SystemClock;
import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
@@ -622,6 +623,8 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
private MotionEvent mLastUp;
private MotionEvent mPreLastUp;
+ private long mLastDetectingDownEventTime;
+
@VisibleForTesting boolean mShortcutTriggered;
@VisibleForTesting Handler mHandler = new Handler(Looper.getMainLooper(), this);
@@ -662,6 +665,7 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
+ mLastDetectingDownEventTime = event.getDownTime();
mHandler.removeMessages(MESSAGE_TRANSITION_TO_DELEGATING_STATE);
if (!mMagnificationController.magnificationRegionContains(
@@ -838,14 +842,25 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
}
private void sendDelayedMotionEvents() {
- while (mDelayedEventQueue != null) {
+ if (mDelayedEventQueue == null) {
+ return;
+ }
+
+ // Adjust down time to prevent subsequent modules being misleading, and also limit
+ // the maximum offset to mMultiTapMaxDelay to prevent the down time of 2nd tap is
+ // in the future when multi-tap happens.
+ final long offset = Math.min(
+ SystemClock.uptimeMillis() - mLastDetectingDownEventTime, mMultiTapMaxDelay);
+
+ do {
MotionEventInfo info = mDelayedEventQueue;
mDelayedEventQueue = info.mNext;
+ info.event.setDownTime(info.event.getDownTime() + offset);
handleEventWith(mDelegatingState, info.event, info.rawEvent, info.policyFlags);
info.recycle();
- }
+ } while (mDelayedEventQueue != null);
}
private void clearDelayedMotionEvents() {