Merge changes from topic "alwaysOnInController"
* changes: feat(#AlwaysOnMagnifier): Adjust FullScreenMagnificationGestureHandler to support always on feature feat(#AlwaysOnMagnifier)!: Support always on feature in FullScreenMagnificationController
This commit is contained in:
@@ -57,6 +57,7 @@ import com.android.internal.annotations.GuardedBy;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.function.pooled.PooledLambda;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.accessibility.AccessibilityManagerService;
|
||||
import com.android.server.accessibility.AccessibilityTraceManager;
|
||||
import com.android.server.wm.WindowManagerInternal;
|
||||
|
||||
@@ -99,7 +100,8 @@ public class FullScreenMagnificationController implements
|
||||
private final Rect mTempRect = new Rect();
|
||||
// Whether the following typing focus feature for magnification is enabled.
|
||||
private boolean mMagnificationFollowTypingEnabled = true;
|
||||
|
||||
// Whether the always on magnification feature is enabled.
|
||||
private boolean mAlwaysOnMagnificationEnabled = false;
|
||||
private final DisplayManagerInternal mDisplayManagerInternal;
|
||||
|
||||
/**
|
||||
@@ -291,18 +293,15 @@ public class FullScreenMagnificationController implements
|
||||
|
||||
@Override
|
||||
public void onDisplaySizeChanged() {
|
||||
// Treat as context change and reset
|
||||
final Message m = PooledLambda.obtainMessage(
|
||||
FullScreenMagnificationController::resetIfNeeded,
|
||||
FullScreenMagnificationController.this, mDisplayId, true);
|
||||
mControllerCtx.getHandler().sendMessage(m);
|
||||
// Treat as context change
|
||||
onUserContextChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUserContextChanged() {
|
||||
final Message m = PooledLambda.obtainMessage(
|
||||
FullScreenMagnificationController::resetIfNeeded,
|
||||
FullScreenMagnificationController.this, mDisplayId, true);
|
||||
FullScreenMagnificationController::onUserContextChanged,
|
||||
FullScreenMagnificationController.this, mDisplayId);
|
||||
mControllerCtx.getHandler().sendMessage(m);
|
||||
}
|
||||
|
||||
@@ -795,6 +794,33 @@ public class FullScreenMagnificationController implements
|
||||
return mMagnificationFollowTypingEnabled;
|
||||
}
|
||||
|
||||
void setAlwaysOnMagnificationEnabled(boolean enabled) {
|
||||
mAlwaysOnMagnificationEnabled = enabled;
|
||||
}
|
||||
|
||||
boolean isAlwaysOnMagnificationEnabled() {
|
||||
return mAlwaysOnMagnificationEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* if the magnifier with given displayId is activated:
|
||||
* 1. if {@link #isAlwaysOnMagnificationEnabled()}, zoom the magnifier to 100%,
|
||||
* 2. otherwise, reset the magnification.
|
||||
*
|
||||
* @param displayId The logical display id.
|
||||
*/
|
||||
void onUserContextChanged(int displayId) {
|
||||
synchronized (mLock) {
|
||||
if (isAlwaysOnMagnificationEnabled()) {
|
||||
setScaleAndCenter(displayId, 1.0f, Float.NaN, Float.NaN,
|
||||
true,
|
||||
AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
|
||||
} else {
|
||||
reset(displayId, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the display magnification with given id.
|
||||
*
|
||||
|
||||
@@ -445,12 +445,12 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
|
||||
*/
|
||||
final class ViewportDraggingState implements State {
|
||||
|
||||
/** Whether to disable zoom after dragging ends */
|
||||
@VisibleForTesting boolean mActivatedBeforeDrag;
|
||||
/** Whether to restore scale after dragging ends */
|
||||
private boolean mZoomedInTemporary;
|
||||
/** The cached scale for recovering after dragging ends */
|
||||
private float mScaleBeforeZoomedInTemporary;
|
||||
/**
|
||||
* The cached scale for recovering after dragging ends.
|
||||
* If the scale >= 1.0, the magnifier needs to recover to scale.
|
||||
* Otherwise, the magnifier should be disabled.
|
||||
*/
|
||||
@VisibleForTesting float mScaleToRecoverAfterDraggingEnd = Float.NaN;
|
||||
|
||||
private boolean mLastMoveOutsideMagnifiedRegion;
|
||||
|
||||
@@ -460,8 +460,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
|
||||
final int action = event.getActionMasked();
|
||||
switch (action) {
|
||||
case ACTION_POINTER_DOWN: {
|
||||
clear();
|
||||
transitionTo(mPanningScalingState);
|
||||
clearAndTransitToPanningScalingState();
|
||||
}
|
||||
break;
|
||||
case ACTION_MOVE: {
|
||||
@@ -484,14 +483,18 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
|
||||
|
||||
case ACTION_UP:
|
||||
case ACTION_CANCEL: {
|
||||
if (mActivatedBeforeDrag) {
|
||||
if (mZoomedInTemporary) {
|
||||
zoomToScale(mScaleBeforeZoomedInTemporary, event.getX(), event.getY());
|
||||
}
|
||||
// If mScaleToRecoverAfterDraggingEnd >= 1.0, the dragging state is triggered
|
||||
// by zoom in temporary, and the magnifier needs to recover to original scale
|
||||
// after exiting dragging state.
|
||||
// Otherwise, the magnifier should be disabled.
|
||||
if (mScaleToRecoverAfterDraggingEnd >= 1.0f) {
|
||||
zoomToScale(mScaleToRecoverAfterDraggingEnd, event.getX(),
|
||||
event.getY());
|
||||
} else {
|
||||
zoomOff();
|
||||
}
|
||||
clear();
|
||||
mScaleToRecoverAfterDraggingEnd = Float.NaN;
|
||||
transitionTo(mDetectingState);
|
||||
}
|
||||
break;
|
||||
@@ -504,27 +507,49 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
|
||||
}
|
||||
}
|
||||
|
||||
public void prepareForZoomInTemporary() {
|
||||
mViewportDraggingState.mActivatedBeforeDrag =
|
||||
mFullScreenMagnificationController.isActivated(mDisplayId);
|
||||
private boolean isAlwaysOnMagnificationEnabled() {
|
||||
return mFullScreenMagnificationController.isAlwaysOnMagnificationEnabled();
|
||||
}
|
||||
|
||||
mViewportDraggingState.mZoomedInTemporary = true;
|
||||
mViewportDraggingState.mScaleBeforeZoomedInTemporary =
|
||||
mFullScreenMagnificationController.getScale(mDisplayId);
|
||||
public void prepareForZoomInTemporary(boolean shortcutTriggered) {
|
||||
boolean shouldRecoverAfterDraggingEnd;
|
||||
if (mFullScreenMagnificationController.isActivated(mDisplayId)) {
|
||||
// For b/267210808, if always-on feature is not enabled, we keep the expected
|
||||
// behavior. If users tap shortcut and then tap-and-hold to zoom in temporary,
|
||||
// the magnifier should be disabled after release.
|
||||
// If always-on feature is enabled, in the same scenario the magnifier would
|
||||
// zoom to 1.0 and keep activated.
|
||||
if (shortcutTriggered) {
|
||||
shouldRecoverAfterDraggingEnd = isAlwaysOnMagnificationEnabled();
|
||||
} else {
|
||||
shouldRecoverAfterDraggingEnd = true;
|
||||
}
|
||||
} else {
|
||||
shouldRecoverAfterDraggingEnd = false;
|
||||
}
|
||||
|
||||
mScaleToRecoverAfterDraggingEnd = shouldRecoverAfterDraggingEnd
|
||||
? mFullScreenMagnificationController.getScale(mDisplayId) : Float.NaN;
|
||||
}
|
||||
|
||||
private void clearAndTransitToPanningScalingState() {
|
||||
final float scaleToRecovery = mScaleToRecoverAfterDraggingEnd;
|
||||
clear();
|
||||
mScaleToRecoverAfterDraggingEnd = scaleToRecovery;
|
||||
transitionTo(mPanningScalingState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
mLastMoveOutsideMagnifiedRegion = false;
|
||||
|
||||
mZoomedInTemporary = false;
|
||||
mScaleBeforeZoomedInTemporary = 1.0f;
|
||||
mScaleToRecoverAfterDraggingEnd = Float.NaN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ViewportDraggingState{"
|
||||
+ "mActivatedBeforeDrag=" + mActivatedBeforeDrag
|
||||
+ "mScaleToRecoverAfterDraggingEnd=" + mScaleToRecoverAfterDraggingEnd
|
||||
+ ", mLastMoveOutsideMagnifiedRegion=" + mLastMoveOutsideMagnifiedRegion
|
||||
+ '}';
|
||||
}
|
||||
@@ -921,13 +946,14 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
|
||||
void transitionToViewportDraggingStateAndClear(MotionEvent down) {
|
||||
|
||||
if (DEBUG_DETECTING) Slog.i(mLogTag, "onTripleTapAndHold()");
|
||||
final boolean shortcutTriggered = mShortcutTriggered;
|
||||
clear();
|
||||
|
||||
// Triple tap and hold also belongs to triple tap event.
|
||||
final boolean enabled = !isActivated();
|
||||
logMagnificationTripleTap(enabled);
|
||||
|
||||
mViewportDraggingState.prepareForZoomInTemporary();
|
||||
mViewportDraggingState.prepareForZoomInTemporary(shortcutTriggered);
|
||||
|
||||
zoomInTemporary(down.getX(), down.getY());
|
||||
|
||||
|
||||
@@ -1196,6 +1196,27 @@ public class FullScreenMagnificationControllerTest {
|
||||
persistedScale);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnContextChanged_alwaysOnFeatureDisabled_resetMagnification() {
|
||||
setScaleToMagnifying();
|
||||
|
||||
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(false);
|
||||
mFullScreenMagnificationController.onUserContextChanged(DISPLAY_0);
|
||||
|
||||
verify(mRequestObserver).onFullScreenMagnificationActivationState(eq(DISPLAY_0), eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnContextChanged_alwaysOnFeatureEnabled_setScaleTo1xAndStayActivated() {
|
||||
setScaleToMagnifying();
|
||||
|
||||
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(true);
|
||||
mFullScreenMagnificationController.onUserContextChanged(DISPLAY_0);
|
||||
|
||||
assertEquals(1.0f, mFullScreenMagnificationController.getScale(DISPLAY_0), 0);
|
||||
assertTrue(mFullScreenMagnificationController.isActivated(DISPLAY_0));
|
||||
}
|
||||
|
||||
private void setScaleToMagnifying() {
|
||||
register(DISPLAY_0);
|
||||
float scale = 2.0f;
|
||||
|
||||
@@ -81,23 +81,27 @@ import java.util.function.IntConsumer;
|
||||
* IDLE -> SHORTCUT_TRIGGERED [label="a11y\nbtn"]
|
||||
* IDLE -> DOUBLE_TAP [label="2tap"]
|
||||
* DOUBLE_TAP -> IDLE [label="timeout"]
|
||||
* DOUBLE_TAP -> ZOOMED [label="tap"]
|
||||
* DOUBLE_TAP -> ACTIVATED [label="tap"]
|
||||
* DOUBLE_TAP -> NON_ACTIVATED_ZOOMED_TMP [label="hold"]
|
||||
* NON_ACTIVATED_ZOOMED_TMP -> IDLE [label="release"]
|
||||
* SHORTCUT_TRIGGERED -> IDLE [label="a11y\nbtn"]
|
||||
* SHORTCUT_TRIGGERED -> ZOOMED[label="tap"]
|
||||
* SHORTCUT_TRIGGERED -> ACTIVATED_ZOOMED_TMP [label="hold"]
|
||||
* SHORTCUT_TRIGGERED -> ACTIVATED [label="tap"]
|
||||
* SHORTCUT_TRIGGERED -> SHORTCUT_TRIGGERED_ZOOMED_TMP [label="hold"]
|
||||
* SHORTCUT_TRIGGERED -> PANNING [label="2hold]
|
||||
* ZOOMED -> ZOOMED_DOUBLE_TAP [label="2tap"]
|
||||
* ZOOMED -> IDLE [label="a11y\nbtn"]
|
||||
* ZOOMED -> PANNING [label="2hold"]
|
||||
* ZOOMED_DOUBLE_TAP -> ZOOMED [label="timeout"]
|
||||
* ZOOMED_DOUBLE_TAP -> ACTIVATED_ZOOMED_TMP [label="hold"]
|
||||
* ZOOMED_DOUBLE_TAP -> IDLE [label="tap"]
|
||||
* ACTIVATED_ZOOMED_TMP -> ZOOMED [label="release"]
|
||||
* PANNING -> ZOOMED [label="release"]
|
||||
* if always-on enabled:
|
||||
* SHORTCUT_TRIGGERED_ZOOMED_TMP -> ACTIVATED [label="release"]
|
||||
* else:
|
||||
* SHORTCUT_TRIGGERED_ZOOMED_TMP -> IDLE [label="release"]
|
||||
* ACTIVATED -> ACTIVATED_DOUBLE_TAP [label="2tap"]
|
||||
* ACTIVATED -> IDLE [label="a11y\nbtn"]
|
||||
* ACTIVATED -> PANNING [label="2hold"]
|
||||
* ACTIVATED_DOUBLE_TAP -> ACTIVATED [label="timeout"]
|
||||
* ACTIVATED_DOUBLE_TAP -> ACTIVATED_ZOOMED_TMP [label="hold"]
|
||||
* ACTIVATED_DOUBLE_TAP -> IDLE [label="tap"]
|
||||
* ACTIVATED_ZOOMED_TMP -> ACTIVATED [label="release"]
|
||||
* PANNING -> ACTIVATED [label="release"]
|
||||
* PANNING -> PANNING_SCALING [label="pinch"]
|
||||
* PANNING_SCALING -> ZOOMED [label="release"]
|
||||
* PANNING_SCALING -> ACTIVATED [label="release"]
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
@@ -105,14 +109,15 @@ import java.util.function.IntConsumer;
|
||||
public class FullScreenMagnificationGestureHandlerTest {
|
||||
|
||||
public static final int STATE_IDLE = 1;
|
||||
public static final int STATE_ZOOMED = 2;
|
||||
public static final int STATE_ACTIVATED = 2;
|
||||
public static final int STATE_2TAPS = 3;
|
||||
public static final int STATE_ZOOMED_2TAPS = 4;
|
||||
public static final int STATE_ACTIVATED_2TAPS = 4;
|
||||
public static final int STATE_SHORTCUT_TRIGGERED = 5;
|
||||
public static final int STATE_NON_ACTIVATED_ZOOMED_TMP = 6;
|
||||
public static final int STATE_ACTIVATED_ZOOMED_TMP = 7;
|
||||
public static final int STATE_PANNING = 8;
|
||||
public static final int STATE_SCALING_AND_PANNING = 9;
|
||||
public static final int STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP = 8;
|
||||
public static final int STATE_PANNING = 9;
|
||||
public static final int STATE_SCALING_AND_PANNING = 10;
|
||||
|
||||
public static final int FIRST_STATE = STATE_IDLE;
|
||||
public static final int LAST_STATE = STATE_SCALING_AND_PANNING;
|
||||
@@ -167,6 +172,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
}
|
||||
};
|
||||
mFullScreenMagnificationController.register(DISPLAY_0);
|
||||
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(true);
|
||||
mClock = new OffsettableClock.Stopped();
|
||||
|
||||
boolean detectTripleTap = true;
|
||||
@@ -267,22 +273,22 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
assertTransition(STATE_SHORTCUT_TRIGGERED, () -> {
|
||||
send(downEvent());
|
||||
fastForward1sec();
|
||||
}, STATE_ACTIVATED_ZOOMED_TMP);
|
||||
}, STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
|
||||
|
||||
// A11y button followed by a tap turns zoom on
|
||||
assertTransition(STATE_SHORTCUT_TRIGGERED, () -> tap(), STATE_ZOOMED);
|
||||
// A11y button followed by a tap turns magnifier on
|
||||
assertTransition(STATE_SHORTCUT_TRIGGERED, () -> tap(), STATE_ACTIVATED);
|
||||
|
||||
// A11y button pressed second time negates the 1st press
|
||||
assertTransition(STATE_SHORTCUT_TRIGGERED, () -> triggerShortcut(), STATE_IDLE);
|
||||
|
||||
// A11y button turns zoom off
|
||||
assertTransition(STATE_ZOOMED, () -> triggerShortcut(), STATE_IDLE);
|
||||
// A11y button turns magnifier off
|
||||
assertTransition(STATE_ACTIVATED, () -> triggerShortcut(), STATE_IDLE);
|
||||
|
||||
// Double tap times out while zoomed
|
||||
assertTransition(STATE_ZOOMED_2TAPS, () -> {
|
||||
// Double tap times out while activated
|
||||
assertTransition(STATE_ACTIVATED_2TAPS, () -> {
|
||||
allowEventDelegation();
|
||||
fastForward1sec();
|
||||
}, STATE_ZOOMED);
|
||||
}, STATE_ACTIVATED);
|
||||
|
||||
// tap+tap+swipe doesn't get delegated
|
||||
assertTransition(STATE_2TAPS, () -> swipe(), STATE_IDLE);
|
||||
@@ -290,8 +296,29 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
// tap+tap+swipe&hold initiates temporary viewport dragging zoom in immediately
|
||||
assertTransition(STATE_2TAPS, () -> swipeAndHold(), STATE_NON_ACTIVATED_ZOOMED_TMP);
|
||||
|
||||
// release when activated temporary zoom in back to zoomed
|
||||
assertTransition(STATE_ACTIVATED_ZOOMED_TMP, () -> upEvent(), STATE_ZOOMED);
|
||||
// release when activated temporary zoom in back to activated
|
||||
assertTransition(STATE_ACTIVATED_ZOOMED_TMP, () -> send(upEvent()), STATE_ACTIVATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelease_shortcutTriggeredZoomedTmp_alwaysOnNotEnabled_shouldInIdle() {
|
||||
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(false);
|
||||
goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
|
||||
send(upEvent());
|
||||
|
||||
assertIn(STATE_IDLE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelease_shortcutTriggeredZoomedTmp_alwaysOnEnabled_shouldInActivated() {
|
||||
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(true);
|
||||
goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
|
||||
send(upEvent());
|
||||
|
||||
assertIn(STATE_ACTIVATED);
|
||||
assertTrue(!isZoomed());
|
||||
|
||||
returnToNormalFrom(STATE_ACTIVATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -310,7 +337,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
longTap();
|
||||
};
|
||||
assertStaysIn(STATE_IDLE, tapAndLongTap);
|
||||
assertStaysIn(STATE_ZOOMED, tapAndLongTap);
|
||||
assertStaysIn(STATE_ACTIVATED, tapAndLongTap);
|
||||
|
||||
// Triple tap with delays in between doesn't count
|
||||
Runnable slow3tap = () -> {
|
||||
@@ -321,7 +348,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
tap();
|
||||
};
|
||||
assertStaysIn(STATE_IDLE, slow3tap);
|
||||
assertStaysIn(STATE_ZOOMED, slow3tap);
|
||||
assertStaysIn(STATE_ACTIVATED, slow3tap);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -337,9 +364,9 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
@Test
|
||||
public void testTripleTapAndHold_zoomsImmediately() {
|
||||
assertZoomsImmediatelyOnSwipeFrom(STATE_2TAPS, STATE_NON_ACTIVATED_ZOOMED_TMP);
|
||||
assertZoomsImmediatelyOnSwipeFrom(STATE_SHORTCUT_TRIGGERED, STATE_ACTIVATED_ZOOMED_TMP);
|
||||
assertZoomsImmediatelyOnSwipeFrom(STATE_ZOOMED_2TAPS, STATE_ACTIVATED_ZOOMED_TMP);
|
||||
|
||||
assertZoomsImmediatelyOnSwipeFrom(STATE_SHORTCUT_TRIGGERED,
|
||||
STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
|
||||
assertZoomsImmediatelyOnSwipeFrom(STATE_ACTIVATED_2TAPS, STATE_ACTIVATED_ZOOMED_TMP);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -361,8 +388,8 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoFingersOneTap_zoomedState_dispatchMotionEvents() {
|
||||
goFromStateIdleTo(STATE_ZOOMED);
|
||||
public void testTwoFingersOneTap_activatedState_dispatchMotionEvents() {
|
||||
goFromStateIdleTo(STATE_ACTIVATED);
|
||||
final EventCaptor eventCaptor = new EventCaptor();
|
||||
mMgh.setNext(eventCaptor);
|
||||
|
||||
@@ -371,7 +398,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
send(pointerEvent(ACTION_POINTER_UP, DEFAULT_X * 2, DEFAULT_Y));
|
||||
send(upEvent());
|
||||
|
||||
assertIn(STATE_ZOOMED);
|
||||
assertIn(STATE_ACTIVATED);
|
||||
final List<Integer> expectedActions = new ArrayList();
|
||||
expectedActions.add(Integer.valueOf(ACTION_DOWN));
|
||||
expectedActions.add(Integer.valueOf(ACTION_POINTER_DOWN));
|
||||
@@ -379,12 +406,12 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
expectedActions.add(Integer.valueOf(ACTION_UP));
|
||||
assertActionsInOrder(eventCaptor.mEvents, expectedActions);
|
||||
|
||||
returnToNormalFrom(STATE_ZOOMED);
|
||||
returnToNormalFrom(STATE_ACTIVATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testThreeFingersOneTap_zoomedState_dispatchMotionEvents() {
|
||||
goFromStateIdleTo(STATE_ZOOMED);
|
||||
public void testThreeFingersOneTap_activatedState_dispatchMotionEvents() {
|
||||
goFromStateIdleTo(STATE_ACTIVATED);
|
||||
final EventCaptor eventCaptor = new EventCaptor();
|
||||
mMgh.setNext(eventCaptor);
|
||||
PointF pointer1 = DEFAULT_POINT;
|
||||
@@ -398,7 +425,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
send(pointerEvent(ACTION_POINTER_UP, new PointF[] {pointer1, pointer2, pointer3}, 2));
|
||||
send(upEvent());
|
||||
|
||||
assertIn(STATE_ZOOMED);
|
||||
assertIn(STATE_ACTIVATED);
|
||||
final List<Integer> expectedActions = new ArrayList();
|
||||
expectedActions.add(Integer.valueOf(ACTION_DOWN));
|
||||
expectedActions.add(Integer.valueOf(ACTION_POINTER_DOWN));
|
||||
@@ -408,12 +435,12 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
expectedActions.add(Integer.valueOf(ACTION_UP));
|
||||
assertActionsInOrder(eventCaptor.mEvents, expectedActions);
|
||||
|
||||
returnToNormalFrom(STATE_ZOOMED);
|
||||
returnToNormalFrom(STATE_ACTIVATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFirstFingerSwipe_twoPointerDownAndZoomedState_panningState() {
|
||||
goFromStateIdleTo(STATE_ZOOMED);
|
||||
public void testFirstFingerSwipe_twoPointerDownAndActivatedState_panningState() {
|
||||
goFromStateIdleTo(STATE_ACTIVATED);
|
||||
PointF pointer1 = DEFAULT_POINT;
|
||||
PointF pointer2 = new PointF(DEFAULT_X * 1.5f, DEFAULT_Y);
|
||||
|
||||
@@ -429,8 +456,8 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSecondFingerSwipe_twoPointerDownAndZoomedState_panningState() {
|
||||
goFromStateIdleTo(STATE_ZOOMED);
|
||||
public void testSecondFingerSwipe_twoPointerDownAndActivatedState_panningState() {
|
||||
goFromStateIdleTo(STATE_ACTIVATED);
|
||||
PointF pointer1 = DEFAULT_POINT;
|
||||
PointF pointer2 = new PointF(DEFAULT_X * 1.5f, DEFAULT_Y);
|
||||
|
||||
@@ -463,8 +490,8 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZoomedWithTripleTap_invokeShowWindowPromptAction() {
|
||||
goFromStateIdleTo(STATE_ZOOMED);
|
||||
public void testActivatedWithTripleTap_invokeShowWindowPromptAction() {
|
||||
goFromStateIdleTo(STATE_ACTIVATED);
|
||||
|
||||
verify(mWindowMagnificationPromptController).showNotificationIfNeeded();
|
||||
}
|
||||
@@ -541,9 +568,8 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
check(!isActivated(), state);
|
||||
check(!isZoomed(), state);
|
||||
} break;
|
||||
case STATE_ZOOMED: {
|
||||
case STATE_ACTIVATED: {
|
||||
check(isActivated(), state);
|
||||
check(isZoomed(), state);
|
||||
check(tapCount() < 2, state);
|
||||
} break;
|
||||
case STATE_2TAPS: {
|
||||
@@ -551,7 +577,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
check(!isZoomed(), state);
|
||||
check(tapCount() == 2, state);
|
||||
} break;
|
||||
case STATE_ZOOMED_2TAPS: {
|
||||
case STATE_ACTIVATED_2TAPS: {
|
||||
check(isActivated(), state);
|
||||
check(isZoomed(), state);
|
||||
check(tapCount() == 2, state);
|
||||
@@ -561,14 +587,29 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
check(isZoomed(), state);
|
||||
check(mMgh.mCurrentState == mMgh.mViewportDraggingState,
|
||||
state);
|
||||
check(!mMgh.mViewportDraggingState.mActivatedBeforeDrag, state);
|
||||
check(Float.isNaN(mMgh.mViewportDraggingState.mScaleToRecoverAfterDraggingEnd),
|
||||
state);
|
||||
} break;
|
||||
case STATE_ACTIVATED_ZOOMED_TMP: {
|
||||
check(isActivated(), state);
|
||||
check(isZoomed(), state);
|
||||
check(mMgh.mCurrentState == mMgh.mViewportDraggingState,
|
||||
state);
|
||||
check(mMgh.mViewportDraggingState.mActivatedBeforeDrag, state);
|
||||
check(mMgh.mViewportDraggingState.mScaleToRecoverAfterDraggingEnd >= 1.0f,
|
||||
state);
|
||||
} break;
|
||||
case STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP: {
|
||||
check(isActivated(), state);
|
||||
check(isZoomed(), state);
|
||||
check(mMgh.mCurrentState == mMgh.mViewportDraggingState,
|
||||
state);
|
||||
if (mFullScreenMagnificationController.isAlwaysOnMagnificationEnabled()) {
|
||||
check(mMgh.mViewportDraggingState.mScaleToRecoverAfterDraggingEnd >= 1.0f,
|
||||
state);
|
||||
} else {
|
||||
check(Float.isNaN(mMgh.mViewportDraggingState.mScaleToRecoverAfterDraggingEnd),
|
||||
state);
|
||||
}
|
||||
} break;
|
||||
case STATE_SHORTCUT_TRIGGERED: {
|
||||
check(mMgh.mDetectingState.mShortcutTriggered, state);
|
||||
@@ -605,7 +646,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
tap();
|
||||
tap();
|
||||
} break;
|
||||
case STATE_ZOOMED: {
|
||||
case STATE_ACTIVATED: {
|
||||
if (mMgh.mDetectTripleTap) {
|
||||
goFromStateIdleTo(STATE_2TAPS);
|
||||
tap();
|
||||
@@ -614,8 +655,8 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
tap();
|
||||
}
|
||||
} break;
|
||||
case STATE_ZOOMED_2TAPS: {
|
||||
goFromStateIdleTo(STATE_ZOOMED);
|
||||
case STATE_ACTIVATED_2TAPS: {
|
||||
goFromStateIdleTo(STATE_ACTIVATED);
|
||||
tap();
|
||||
tap();
|
||||
} break;
|
||||
@@ -625,7 +666,12 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
fastForward1sec();
|
||||
} break;
|
||||
case STATE_ACTIVATED_ZOOMED_TMP: {
|
||||
goFromStateIdleTo(STATE_ZOOMED_2TAPS);
|
||||
goFromStateIdleTo(STATE_ACTIVATED_2TAPS);
|
||||
send(downEvent());
|
||||
fastForward1sec();
|
||||
} break;
|
||||
case STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP: {
|
||||
goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED);
|
||||
send(downEvent());
|
||||
fastForward1sec();
|
||||
} break;
|
||||
@@ -634,7 +680,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
triggerShortcut();
|
||||
} break;
|
||||
case STATE_PANNING: {
|
||||
goFromStateIdleTo(STATE_ZOOMED);
|
||||
goFromStateIdleTo(STATE_ACTIVATED);
|
||||
send(downEvent());
|
||||
send(pointerEvent(ACTION_POINTER_DOWN, DEFAULT_X * 2, DEFAULT_Y));
|
||||
fastForward(ViewConfiguration.getTapTimeout());
|
||||
@@ -665,16 +711,16 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
allowEventDelegation();
|
||||
fastForward1sec();
|
||||
} break;
|
||||
case STATE_ZOOMED: {
|
||||
case STATE_ACTIVATED: {
|
||||
if (mMgh.mDetectTripleTap) {
|
||||
tap();
|
||||
tap();
|
||||
returnToNormalFrom(STATE_ZOOMED_2TAPS);
|
||||
returnToNormalFrom(STATE_ACTIVATED_2TAPS);
|
||||
} else {
|
||||
triggerShortcut();
|
||||
}
|
||||
} break;
|
||||
case STATE_ZOOMED_2TAPS: {
|
||||
case STATE_ACTIVATED_2TAPS: {
|
||||
tap();
|
||||
} break;
|
||||
case STATE_NON_ACTIVATED_ZOOMED_TMP: {
|
||||
@@ -682,7 +728,13 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
} break;
|
||||
case STATE_ACTIVATED_ZOOMED_TMP: {
|
||||
send(upEvent());
|
||||
returnToNormalFrom(STATE_ZOOMED);
|
||||
returnToNormalFrom(STATE_ACTIVATED);
|
||||
} break;
|
||||
case STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP: {
|
||||
send(upEvent());
|
||||
if (mFullScreenMagnificationController.isAlwaysOnMagnificationEnabled()) {
|
||||
returnToNormalFrom(STATE_ACTIVATED);
|
||||
}
|
||||
} break;
|
||||
case STATE_SHORTCUT_TRIGGERED: {
|
||||
triggerShortcut();
|
||||
@@ -690,7 +742,7 @@ public class FullScreenMagnificationGestureHandlerTest {
|
||||
case STATE_PANNING: {
|
||||
send(pointerEvent(ACTION_POINTER_UP, DEFAULT_X * 2, DEFAULT_Y));
|
||||
send(upEvent());
|
||||
returnToNormalFrom(STATE_ZOOMED);
|
||||
returnToNormalFrom(STATE_ACTIVATED);
|
||||
} break;
|
||||
case STATE_SCALING_AND_PANNING: {
|
||||
returnToNormalFrom(STATE_PANNING);
|
||||
|
||||
Reference in New Issue
Block a user