summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/java/com/android/server/accessibility/ScreenMagnifier.java22
1 files 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 0f04b44..482bff5 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);
}
}