Loading services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java +14 −9 Original line number Diff line number Diff line Loading @@ -229,7 +229,7 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation { } void clearAndTransitionToStateDetecting() { mCurrentState = mDelegatingState; mCurrentState = mDetectingState; mDetectingState.clear(); mViewportDraggingState.clear(); mPanningScalingState.clear(); Loading Loading @@ -649,16 +649,21 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation { break; case ACTION_MOVE: { if (isFingerDown() && distance(mLastDown, /* move */ event) > mSwipeMinDistance // For convenience, viewport dragging on 3tap&hold takes precedence && distance(mLastDown, /* move */ event) > mSwipeMinDistance) { // Swipe detected - transition immediately // For convenience, viewport dragging takes precedence // over insta-delegating on 3tap&swipe // (which is a rare combo to be used aside from magnification) && !isMultiTapTriggered(2 /* taps */)) { // Swipe detected - delegate skipping timeout if (isMultiTapTriggered(2 /* taps */)) { transitionTo(mViewportDraggingState); clear(); } else { transitionToDelegatingStateAndClear(); } } } break; case ACTION_UP: { Loading services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java +29 −23 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static org.mockito.Mockito.verify; import android.annotation.NonNull; import android.content.Context; import android.os.Message; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.util.DebugUtils; Loading Loading @@ -76,6 +77,8 @@ public class MagnificationGestureHandlerTest { private MagnificationGestureHandler mMgh; private TestHandler mHandler; private long mLastDownTime = Integer.MIN_VALUE; @Before public void setUp() { mContext = InstrumentationRegistry.getContext(); Loading Loading @@ -104,7 +107,13 @@ public class MagnificationGestureHandlerTest { MagnificationGestureHandler h = new MagnificationGestureHandler( mContext, mMagnificationController, detectTripleTap, detectShortcutTrigger); mHandler = new TestHandler(h.mDetectingState, mClock); mHandler = new TestHandler(h.mDetectingState, mClock) { @Override protected String messageToString(Message m) { return DebugUtils.valueToString( MagnificationGestureHandler.DetectingState.class, "MESSAGE_", m.what); } }; h.mDetectingState.mHandler = mHandler; h.setNext(strictMock(EventStreamTransformation.class)); return h; Loading Loading @@ -184,11 +193,11 @@ public class MagnificationGestureHandlerTest { fastForward1sec(); }, STATE_ZOOMED); // tap+tap+swipe gets delegated assertTransition(STATE_2TAPS, () -> { allowEventDelegation(); swipe(); }, STATE_IDLE); // tap+tap+swipe doesn't get delegated assertTransition(STATE_2TAPS, () -> swipe(), STATE_IDLE); // tap+tap+swipe initiates viewport dragging immediately assertTransition(STATE_2TAPS, () -> swipeAndHold(), STATE_DRAGGING_TMP); } @Test Loading Loading @@ -439,23 +448,24 @@ public class MagnificationGestureHandlerTest { } private void tap() { MotionEvent downEvent = downEvent(); send(downEvent); send(upEvent(downEvent.getDownTime())); send(downEvent()); send(upEvent()); } private void swipe() { MotionEvent downEvent = downEvent(); send(downEvent); swipeAndHold(); send(upEvent()); } private void swipeAndHold() { send(downEvent()); send(moveEvent(DEFAULT_X * 2, DEFAULT_Y * 2)); send(upEvent(downEvent.getDownTime())); } private void longTap() { MotionEvent downEvent = downEvent(); send(downEvent); send(downEvent()); fastForward(2000); send(upEvent(downEvent.getDownTime())); send(upEvent()); } private void triggerShortcut() { Loading @@ -473,16 +483,17 @@ public class MagnificationGestureHandlerTest { } private MotionEvent moveEvent(float x, float y) { return MotionEvent.obtain(defaultDownTime(), mClock.now(), ACTION_MOVE, x, y, 0); return MotionEvent.obtain(mLastDownTime, mClock.now(), ACTION_MOVE, x, y, 0); } private MotionEvent downEvent() { return MotionEvent.obtain(mClock.now(), mClock.now(), mLastDownTime = mClock.now(); return MotionEvent.obtain(mLastDownTime, mLastDownTime, ACTION_DOWN, DEFAULT_X, DEFAULT_Y, 0); } private MotionEvent upEvent() { return upEvent(defaultDownTime()); return upEvent(mLastDownTime); } private MotionEvent upEvent(long downTime) { Loading @@ -490,11 +501,6 @@ public class MagnificationGestureHandlerTest { MotionEvent.ACTION_UP, DEFAULT_X, DEFAULT_Y, 0); } private long defaultDownTime() { MotionEvent lastDown = mMgh.mDetectingState.mLastDown; return lastDown == null ? mClock.now() - 1 : lastDown.getDownTime(); } private MotionEvent pointerEvent(int action, float x, float y) { MotionEvent.PointerProperties defPointerProperties = new MotionEvent.PointerProperties(); defPointerProperties.id = 0; Loading services/tests/servicestests/src/com/android/server/testutils/TestHandler.java +10 −1 Original line number Diff line number Diff line Loading @@ -104,6 +104,15 @@ public class TestHandler extends Handler { return new PriorityQueue<>(mMessages); } /** * Optionally-overridable to allow deciphering message types * * @see android.util.DebugUtils#valueToString - a handy utility to use when overriding this */ protected String messageToString(Message message) { return message.toString(); } private void dispatch(MsgInfo msg) { int msgId = msg.message.what; Loading Loading @@ -148,7 +157,7 @@ public class TestHandler extends Handler { @Override public String toString() { return "MsgInfo{" + "message=" + message + "message=" + messageToString(message) + ", sendTime=" + sendTime + '}'; } Loading Loading
services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java +14 −9 Original line number Diff line number Diff line Loading @@ -229,7 +229,7 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation { } void clearAndTransitionToStateDetecting() { mCurrentState = mDelegatingState; mCurrentState = mDetectingState; mDetectingState.clear(); mViewportDraggingState.clear(); mPanningScalingState.clear(); Loading Loading @@ -649,16 +649,21 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation { break; case ACTION_MOVE: { if (isFingerDown() && distance(mLastDown, /* move */ event) > mSwipeMinDistance // For convenience, viewport dragging on 3tap&hold takes precedence && distance(mLastDown, /* move */ event) > mSwipeMinDistance) { // Swipe detected - transition immediately // For convenience, viewport dragging takes precedence // over insta-delegating on 3tap&swipe // (which is a rare combo to be used aside from magnification) && !isMultiTapTriggered(2 /* taps */)) { // Swipe detected - delegate skipping timeout if (isMultiTapTriggered(2 /* taps */)) { transitionTo(mViewportDraggingState); clear(); } else { transitionToDelegatingStateAndClear(); } } } break; case ACTION_UP: { Loading
services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java +29 −23 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static org.mockito.Mockito.verify; import android.annotation.NonNull; import android.content.Context; import android.os.Message; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.util.DebugUtils; Loading Loading @@ -76,6 +77,8 @@ public class MagnificationGestureHandlerTest { private MagnificationGestureHandler mMgh; private TestHandler mHandler; private long mLastDownTime = Integer.MIN_VALUE; @Before public void setUp() { mContext = InstrumentationRegistry.getContext(); Loading Loading @@ -104,7 +107,13 @@ public class MagnificationGestureHandlerTest { MagnificationGestureHandler h = new MagnificationGestureHandler( mContext, mMagnificationController, detectTripleTap, detectShortcutTrigger); mHandler = new TestHandler(h.mDetectingState, mClock); mHandler = new TestHandler(h.mDetectingState, mClock) { @Override protected String messageToString(Message m) { return DebugUtils.valueToString( MagnificationGestureHandler.DetectingState.class, "MESSAGE_", m.what); } }; h.mDetectingState.mHandler = mHandler; h.setNext(strictMock(EventStreamTransformation.class)); return h; Loading Loading @@ -184,11 +193,11 @@ public class MagnificationGestureHandlerTest { fastForward1sec(); }, STATE_ZOOMED); // tap+tap+swipe gets delegated assertTransition(STATE_2TAPS, () -> { allowEventDelegation(); swipe(); }, STATE_IDLE); // tap+tap+swipe doesn't get delegated assertTransition(STATE_2TAPS, () -> swipe(), STATE_IDLE); // tap+tap+swipe initiates viewport dragging immediately assertTransition(STATE_2TAPS, () -> swipeAndHold(), STATE_DRAGGING_TMP); } @Test Loading Loading @@ -439,23 +448,24 @@ public class MagnificationGestureHandlerTest { } private void tap() { MotionEvent downEvent = downEvent(); send(downEvent); send(upEvent(downEvent.getDownTime())); send(downEvent()); send(upEvent()); } private void swipe() { MotionEvent downEvent = downEvent(); send(downEvent); swipeAndHold(); send(upEvent()); } private void swipeAndHold() { send(downEvent()); send(moveEvent(DEFAULT_X * 2, DEFAULT_Y * 2)); send(upEvent(downEvent.getDownTime())); } private void longTap() { MotionEvent downEvent = downEvent(); send(downEvent); send(downEvent()); fastForward(2000); send(upEvent(downEvent.getDownTime())); send(upEvent()); } private void triggerShortcut() { Loading @@ -473,16 +483,17 @@ public class MagnificationGestureHandlerTest { } private MotionEvent moveEvent(float x, float y) { return MotionEvent.obtain(defaultDownTime(), mClock.now(), ACTION_MOVE, x, y, 0); return MotionEvent.obtain(mLastDownTime, mClock.now(), ACTION_MOVE, x, y, 0); } private MotionEvent downEvent() { return MotionEvent.obtain(mClock.now(), mClock.now(), mLastDownTime = mClock.now(); return MotionEvent.obtain(mLastDownTime, mLastDownTime, ACTION_DOWN, DEFAULT_X, DEFAULT_Y, 0); } private MotionEvent upEvent() { return upEvent(defaultDownTime()); return upEvent(mLastDownTime); } private MotionEvent upEvent(long downTime) { Loading @@ -490,11 +501,6 @@ public class MagnificationGestureHandlerTest { MotionEvent.ACTION_UP, DEFAULT_X, DEFAULT_Y, 0); } private long defaultDownTime() { MotionEvent lastDown = mMgh.mDetectingState.mLastDown; return lastDown == null ? mClock.now() - 1 : lastDown.getDownTime(); } private MotionEvent pointerEvent(int action, float x, float y) { MotionEvent.PointerProperties defPointerProperties = new MotionEvent.PointerProperties(); defPointerProperties.id = 0; Loading
services/tests/servicestests/src/com/android/server/testutils/TestHandler.java +10 −1 Original line number Diff line number Diff line Loading @@ -104,6 +104,15 @@ public class TestHandler extends Handler { return new PriorityQueue<>(mMessages); } /** * Optionally-overridable to allow deciphering message types * * @see android.util.DebugUtils#valueToString - a handy utility to use when overriding this */ protected String messageToString(Message message) { return message.toString(); } private void dispatch(MsgInfo msg) { int msgId = msg.message.what; Loading Loading @@ -148,7 +157,7 @@ public class TestHandler extends Handler { @Override public String toString() { return "MsgInfo{" + "message=" + message + "message=" + messageToString(message) + ", sendTime=" + sendTime + '}'; } Loading