From ff6c329f61ea4f00d9cbbe55387adbc2050f4679 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Fri, 19 Oct 2012 01:49:01 -0700 Subject: [PATCH] Cannot pan in browser if magnification is enabled. 1. We cache some events to see if the user wants to trigger magnification. If no magnification is triggered we inject these events with adjusted time and down time to prevent subsequent transformations being confused by stale events. After the cached events, which always have a down, are injected we need to also update the down time of all subsequent non cached events. bug:7379388 Change-Id: I41d8b831cc1016a0ee8f9c5ef5f42eb60a6f64d9 --- .../server/accessibility/ScreenMagnifier.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/services/java/com/android/server/accessibility/ScreenMagnifier.java b/services/java/com/android/server/accessibility/ScreenMagnifier.java index 0f04b44990bc7..482bff5aa7e42 100644 --- a/services/java/com/android/server/accessibility/ScreenMagnifier.java +++ b/services/java/com/android/server/accessibility/ScreenMagnifier.java @@ -176,6 +176,8 @@ public final class ScreenMagnifier implements EventStreamTransformation { private PointerCoords[] mTempPointerCoords; private PointerProperties[] mTempPointerProperties; + private long mDelegatingStateDownTime; + public ScreenMagnifier(Context context) { mContext = context; mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); @@ -265,10 +267,15 @@ public final class ScreenMagnifier implements EventStreamTransformation { private void handleMotionEventStateDelegating(MotionEvent event, MotionEvent rawEvent, int policyFlags) { - if (event.getActionMasked() == MotionEvent.ACTION_UP) { - if (mDetectingStateHandler.mDelayedEventQueue == null) { - transitionToState(STATE_DETECTING); - } + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: { + mDelegatingStateDownTime = event.getDownTime(); + } break; + case MotionEvent.ACTION_UP: { + if (mDetectingStateHandler.mDelayedEventQueue == null) { + transitionToState(STATE_DETECTING); + } + } break; } if (mNext != null) { // If the event is within the magnified portion of the screen we have @@ -295,6 +302,13 @@ public final class ScreenMagnifier implements EventStreamTransformation { coords, 0, 0, 1.0f, 1.0f, event.getDeviceId(), 0, event.getSource(), event.getFlags()); } + // We cache some events to see if the user wants to trigger magnification. + // If no magnification is triggered we inject these events with adjusted + // time and down time to prevent subsequent transformations being confused + // by stale events. After the cached events, which always have a down, are + // injected we need to also update the down time of all subsequent non cached + // events. All delegated events cached and non-cached are delivered here. + event.setDownTime(mDelegatingStateDownTime); mNext.onMotionEvent(event, rawEvent, policyFlags); } }