Merge changes I0a48e146,I244903a3 into main

* changes:
  chore(#Magnification): use persisted scale if zoom-in-temporary when magnifier is zoomed out by service
  fix(#WindowMagnification): adjust Settings getter def to true for key ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING
This commit is contained in:
Roy Chou
2023-07-24 16:33:12 +00:00
committed by Android (Google) Code Review
8 changed files with 279 additions and 111 deletions

View File

@@ -262,6 +262,9 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
mResources.getInteger(R.integer.magnification_default_scale),
UserHandle.USER_CURRENT);
mAllowDiagonalScrolling = secureSettings.getIntForUser(
Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING, 1,
UserHandle.USER_CURRENT) == 1;
setupMagnificationSizeScaleOptions();
@@ -1225,6 +1228,12 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
return isActivated() ? mMagnificationFrame.exactCenterY() : Float.NaN;
}
@VisibleForTesting
boolean isDiagonalScrollingEnabled() {
return mAllowDiagonalScrolling;
}
private CharSequence formatStateDescription(float scale) {
// Cache the locale-appropriate NumberFormat. Configuration locale is guaranteed
// non-null, so the first time this is called we will always get the appropriate

View File

@@ -101,7 +101,9 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest
private Button mEditButton;
private ImageButton mFullScreenButton;
private int mLastSelectedButtonIndex = MagnificationSize.NONE;
private boolean mAllowDiagonalScrolling = false;
/**
* Amount by which magnification scale changes compared to seekbar in settings.
* magnitude = 10 means, for every 1 scale increase, 10 progress increase in seekbar.
@@ -141,7 +143,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest
mSecureSettings = secureSettings;
mAllowDiagonalScrolling = mSecureSettings.getIntForUser(
Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING, 0,
Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING, 1,
UserHandle.USER_CURRENT) == 1;
mParams = createLayoutParams(context);
@@ -420,6 +422,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest
UserHandle.USER_CURRENT);
}
@VisibleForTesting
boolean isDiagonalScrollingEnabled() {
return mAllowDiagonalScrolling;
}
/**
* Only called from outside to notify the controlling magnifier scale changed
*
@@ -632,7 +639,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest
private void toggleDiagonalScrolling() {
boolean enabled = mSecureSettings.getIntForUser(
Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING, 0,
Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING, 1,
UserHandle.USER_CURRENT) == 1;
setDiagonalScrolling(!enabled);
}

View File

@@ -66,6 +66,7 @@ import android.graphics.RegionIterator;
import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableResources;
@@ -223,6 +224,14 @@ public class WindowMagnificationControllerTest extends SysuiTestCase {
mValueAnimator.cancel();
}
@Test
public void initWindowMagnificationController_checkAllowDiagonalScrollingWithSecureSettings() {
verify(mSecureSettings).getIntForUser(
eq(Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING),
/* def */ eq(1), /* userHandle= */ anyInt());
assertTrue(mWindowMagnificationController.isDiagonalScrollingEnabled());
}
@Test
public void enableWindowMagnification_showControlAndNotifyBoundsChanged() {
mInstrumentation.runOnMainSync(() -> {

View File

@@ -26,10 +26,12 @@ import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static org.mockito.AdditionalAnswers.returnsSecondArg;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -109,6 +111,11 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase {
mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager);
mContext.addMockSystemService(Context.ACCESSIBILITY_SERVICE, mAccessibilityManager);
when(mSecureSettings.getIntForUser(anyString(), anyInt(), anyInt())).then(
returnsSecondArg());
when(mSecureSettings.getFloatForUser(anyString(), anyFloat(), anyInt())).then(
returnsSecondArg());
mWindowMagnificationSettings = new WindowMagnificationSettings(mContext,
mWindowMagnificationSettingsCallback, mSfVsyncFrameProvider,
mSecureSettings);
@@ -127,6 +134,14 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase {
mWindowMagnificationSettings.hideSettingPanel();
}
@Test
public void initSettingPanel_checkAllowDiagonalScrollingWithSecureSettings() {
verify(mSecureSettings).getIntForUser(
eq(Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING),
/* def */ eq(1), /* userHandle= */ anyInt());
assertThat(mWindowMagnificationSettings.isDiagonalScrollingEnabled()).isTrue();
}
@Test
public void showSettingPanel_hasAccessibilityWindowTitle() {
setupMagnificationCapabilityAndMode(
@@ -273,7 +288,12 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase {
// Perform click
diagonalScrollingSwitch.performClick();
verify(mWindowMagnificationSettingsCallback).onSetDiagonalScrolling(!currentCheckedState);
final boolean isAllowed = !currentCheckedState;
verify(mSecureSettings).putIntForUser(
eq(Settings.Secure.ACCESSIBILITY_ALLOW_DIAGONAL_SCROLLING),
/* value= */ eq(isAllowed ? 1 : 0),
/* userHandle= */ anyInt());
verify(mWindowMagnificationSettingsCallback).onSetDiagonalScrolling(isAllowed);
}
@Test

View File

@@ -142,6 +142,8 @@ public class FullScreenMagnificationController implements
private int mIdOfLastServiceToMagnify = INVALID_SERVICE_ID;
private boolean mMagnificationActivated = false;
private boolean mZoomedOutFromService = false;
@GuardedBy("mLock") @Nullable private MagnificationThumbnail mMagnificationThumbnail;
DisplayMagnification(int displayId) {
@@ -545,6 +547,24 @@ public class FullScreenMagnificationController implements
return changed;
}
/**
* Directly Zooms out the scale to 1f with animating the transition. This method is
* triggered only by service automatically, such as when user context changed.
*/
void zoomOutFromService() {
setScaleAndCenter(1.0f, Float.NaN, Float.NaN,
transformToStubCallback(true),
AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
mZoomedOutFromService = true;
}
/**
* Whether the zooming out is triggered by {@link #zoomOutFromService}.
*/
boolean isZoomedOutFromService() {
return mZoomedOutFromService;
}
@GuardedBy("mLock")
boolean reset(boolean animate) {
return reset(transformToStubCallback(animate));
@@ -619,6 +639,8 @@ public class FullScreenMagnificationController implements
mIdOfLastServiceToMagnify);
});
}
// the zoom scale would be changed so we reset the flag
mZoomedOutFromService = false;
return changed;
}
@@ -944,9 +966,7 @@ public class FullScreenMagnificationController implements
}
if (isAlwaysOnMagnificationEnabled()) {
setScaleAndCenter(displayId, 1.0f, Float.NaN, Float.NaN,
true,
AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
zoomOutFromService(displayId);
} else {
reset(displayId, true);
}
@@ -1427,6 +1447,37 @@ public class FullScreenMagnificationController implements
MagnificationScaleProvider.MAX_SCALE);
}
/**
* Directly Zooms out the scale to 1f with animating the transition. This method is
* triggered only by service automatically, such as when user context changed.
*
* @param displayId The logical display id.
*/
private void zoomOutFromService(int displayId) {
synchronized (mLock) {
final DisplayMagnification display = mDisplays.get(displayId);
if (display == null || !display.isActivated()) {
return;
}
display.zoomOutFromService();
}
}
/**
* Whether the magnification is zoomed out by {@link #zoomOutFromService(int)}.
*
* @param displayId The logical display id.
*/
public boolean isZoomedOutFromService(int displayId) {
synchronized (mLock) {
final DisplayMagnification display = mDisplays.get(displayId);
if (display == null || !display.isActivated()) {
return false;
}
return display.isZoomedOutFromService();
}
}
/**
* Resets all displays' magnification if last magnifying service is disabled.
*

View File

@@ -1093,7 +1093,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
mViewportDraggingState.prepareForZoomInTemporary(shortcutTriggered);
zoomInTemporary(down.getX(), down.getY());
zoomInTemporary(down.getX(), down.getY(), shortcutTriggered);
transitionTo(mViewportDraggingState);
}
@@ -1150,14 +1150,20 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
}
}
private void zoomInTemporary(float centerX, float centerY) {
private void zoomInTemporary(float centerX, float centerY, boolean shortcutTriggered) {
final float currentScale = mFullScreenMagnificationController.getScale(mDisplayId);
final float persistedScale = MathUtils.constrain(
mFullScreenMagnificationController.getPersistedScale(mDisplayId),
MIN_SCALE, MAX_SCALE);
final boolean isActivated = mFullScreenMagnificationController.isActivated(mDisplayId);
final float scale = isActivated ? (currentScale + 1.0f) : persistedScale;
final boolean isShortcutTriggered = shortcutTriggered;
final boolean isZoomedOutFromService =
mFullScreenMagnificationController.isZoomedOutFromService(mDisplayId);
boolean zoomInWithPersistedScale =
!isActivated || isShortcutTriggered || isZoomedOutFromService;
final float scale = zoomInWithPersistedScale ? persistedScale : (currentScale + 1.0f);
zoomToScale(scale, centerX, centerY);
}

View File

@@ -130,6 +130,8 @@ public class FullScreenMagnificationControllerTest {
public DisplayManagerInternal mDisplayManagerInternalMock = mock(DisplayManagerInternal.class);
private float mOriginalMagnificationPersistedScale;
@Before
public void setUp() {
Looper looper = InstrumentationRegistry.getContext().getMainLooper();
@@ -143,6 +145,9 @@ public class FullScreenMagnificationControllerTest {
mResolver = new MockContentResolver();
mResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
when(mMockContext.getContentResolver()).thenReturn(mResolver);
mOriginalMagnificationPersistedScale = Settings.Secure.getFloatForUser(mResolver,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 2.0f,
CURRENT_USER_ID);
Settings.Secure.putFloatForUser(mResolver,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 2.0f,
CURRENT_USER_ID);
@@ -169,6 +174,10 @@ public class FullScreenMagnificationControllerTest {
@After
public void tearDown() {
mMessageCapturingHandler.removeAllMessages();
Settings.Secure.putFloatForUser(mResolver,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
mOriginalMagnificationPersistedScale,
CURRENT_USER_ID);
}
@@ -1311,7 +1320,10 @@ public class FullScreenMagnificationControllerTest {
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(false);
mFullScreenMagnificationController.onUserContextChanged(DISPLAY_0);
// the magnifier should be deactivated.
verify(mRequestObserver).onFullScreenMagnificationActivationState(eq(DISPLAY_0), eq(false));
assertFalse(mFullScreenMagnificationController.isZoomedOutFromService(DISPLAY_0));
verify(mMockThumbnail).setThumbnailBounds(
/* currentBounds= */ any(),
/* scale= */ anyFloat(),
@@ -1330,8 +1342,11 @@ public class FullScreenMagnificationControllerTest {
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(true);
mFullScreenMagnificationController.onUserContextChanged(DISPLAY_0);
// the magnifier should be zoomed out and keep activated by service action.
assertEquals(1.0f, mFullScreenMagnificationController.getScale(DISPLAY_0), 0);
assertTrue(mFullScreenMagnificationController.isActivated(DISPLAY_0));
assertTrue(mFullScreenMagnificationController.isZoomedOutFromService(DISPLAY_0));
verify(mMockThumbnail).setThumbnailBounds(
/* currentBounds= */ any(),
/* scale= */ anyFloat(),

View File

@@ -96,19 +96,29 @@ import java.util.function.IntConsumer;
* NON_ACTIVATED_ZOOMED_TMP -> IDLE [label="release"]
* SHORTCUT_TRIGGERED -> IDLE [label="a11y\nbtn"]
* SHORTCUT_TRIGGERED -> ACTIVATED [label="tap"]
* SHORTCUT_TRIGGERED -> SHORTCUT_TRIGGERED_ZOOMED_TMP [label="hold"]
* SHORTCUT_TRIGGERED -> PANNING [label="2hold]
* SHORTCUT_TRIGGERED -> ZOOMED_WITH_PERSISTED_SCALE_TMP [label="hold"]
* SHORTCUT_TRIGGERED -> PANNING [label="2hold"]
* ZOOMED_OUT_FROM_SERVICE -> IDLE [label="a11y\nbtn"]
* ZOOMED_OUT_FROM_SERVICE -> ZOOMED_OUT_FROM_SERVICE_DOUBLE_TAP [label="2tap"]
* ZOOMED_OUT_FROM_SERVICE -> PANNING [label="2hold"]
* ZOOMED_OUT_FROM_SERVICE_DOUBLE_TAP -> IDLE [label="tap"]
* ZOOMED_OUT_FROM_SERVICE_DOUBLE_TAP -> ZOOMED_OUT_FROM_SERVICE [label="timeout"]
* ZOOMED_OUT_FROM_SERVICE_DOUBLE_TAP -> ZOOMED_WITH_PERSISTED_SCALE_TMP [label="hold"]
* if always-on enabled:
* SHORTCUT_TRIGGERED_ZOOMED_TMP -> ACTIVATED [label="release"]
* ZOOMED_WITH_PERSISTED_SCALE_TMP -> ACTIVATED [label="release"]
* else:
* SHORTCUT_TRIGGERED_ZOOMED_TMP -> IDLE [label="release"]
* ZOOMED_WITH_PERSISTED_SCALE_TMP -> IDLE [label="release"]
* ACTIVATED -> ACTIVATED_DOUBLE_TAP [label="2tap"]
* ACTIVATED -> IDLE [label="a11y\nbtn"]
* ACTIVATED -> PANNING [label="2hold"]
* if always-on enabled:
* ACTIVATED -> ZOOMED_OUT_FROM_SERVICE [label="contextChanged"]
* else:
* ACTIVATED -> IDLE [label="contextChanged"]
* ACTIVATED_DOUBLE_TAP -> ACTIVATED [label="timeout"]
* ACTIVATED_DOUBLE_TAP -> ACTIVATED_ZOOMED_TMP [label="hold"]
* ACTIVATED_DOUBLE_TAP -> ZOOMED_FURTHER_TMP [label="hold"]
* ACTIVATED_DOUBLE_TAP -> IDLE [label="tap"]
* ACTIVATED_ZOOMED_TMP -> ACTIVATED [label="release"]
* ZOOMED_FURTHER_TMP -> ACTIVATED [label="release"]
* PANNING -> ACTIVATED [label="release"]
* PANNING -> PANNING_SCALING [label="pinch"]
* PANNING_SCALING -> ACTIVATED [label="release"]
@@ -120,15 +130,20 @@ public class FullScreenMagnificationGestureHandlerTest {
public static final int STATE_IDLE = 1;
public static final int STATE_ACTIVATED = 2;
public static final int STATE_2TAPS = 3;
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_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 STATE_SINGLE_PANNING = 11;
public static final int STATE_SHORTCUT_TRIGGERED = 3;
public static final int STATE_ZOOMED_OUT_FROM_SERVICE = 4;
public static final int STATE_2TAPS = 5;
public static final int STATE_ACTIVATED_2TAPS = 6;
public static final int STATE_ZOOMED_OUT_FROM_SERVICE_2TAPS = 7;
public static final int STATE_NON_ACTIVATED_ZOOMED_TMP = 8;
public static final int STATE_ZOOMED_FURTHER_TMP = 9;
public static final int STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP = 10;
public static final int STATE_PANNING = 11;
public static final int STATE_SCALING_AND_PANNING = 12;
public static final int STATE_SINGLE_PANNING = 13;
public static final int FIRST_STATE = STATE_IDLE;
public static final int LAST_STATE = STATE_SINGLE_PANNING;
@@ -313,7 +328,7 @@ public class FullScreenMagnificationGestureHandlerTest {
assertTransition(STATE_SHORTCUT_TRIGGERED, () -> {
send(downEvent());
fastForward1sec();
}, STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
}, STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP);
// A11y button followed by a tap turns magnifier on
assertTransition(STATE_SHORTCUT_TRIGGERED, () -> tap(), STATE_ACTIVATED);
@@ -337,22 +352,22 @@ public class FullScreenMagnificationGestureHandlerTest {
assertTransition(STATE_2TAPS, () -> swipeAndHold(), STATE_NON_ACTIVATED_ZOOMED_TMP);
// release when activated temporary zoom in back to activated
assertTransition(STATE_ACTIVATED_ZOOMED_TMP, () -> send(upEvent()), STATE_ACTIVATED);
assertTransition(STATE_ZOOMED_FURTHER_TMP, () -> send(upEvent()), STATE_ACTIVATED);
}
@Test
public void testRelease_shortcutTriggeredZoomedTmp_alwaysOnNotEnabled_shouldInIdle() {
public void testRelease_zoomedWithPersistedScaleTmpAndAlwaysOnNotEnabled_shouldInIdle() {
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(false);
goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
goFromStateIdleTo(STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP);
send(upEvent());
assertIn(STATE_IDLE);
}
@Test
public void testRelease_shortcutTriggeredZoomedTmp_alwaysOnEnabled_shouldInActivated() {
public void testRelease_zoomedWithPersistedScaleTmpAndAlwaysOnEnabled_shouldInActivated() {
mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(true);
goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
goFromStateIdleTo(STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP);
send(upEvent());
assertIn(STATE_ACTIVATED);
@@ -404,9 +419,11 @@ public class FullScreenMagnificationGestureHandlerTest {
@Test
public void testTripleTapAndHold_zoomsImmediately() {
assertZoomsImmediatelyOnSwipeFrom(STATE_2TAPS, STATE_NON_ACTIVATED_ZOOMED_TMP);
assertZoomsImmediatelyOnSwipeFrom(STATE_ACTIVATED_2TAPS, STATE_ZOOMED_FURTHER_TMP);
assertZoomsImmediatelyOnSwipeFrom(STATE_SHORTCUT_TRIGGERED,
STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP);
assertZoomsImmediatelyOnSwipeFrom(STATE_ACTIVATED_2TAPS, STATE_ACTIVATED_ZOOMED_TMP);
STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP);
assertZoomsImmediatelyOnSwipeFrom(STATE_ZOOMED_OUT_FROM_SERVICE_2TAPS,
STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP);
}
@Test
@@ -755,6 +772,10 @@ public class FullScreenMagnificationGestureHandlerTest {
mHandler.timeAdvance();
}
private void triggerContextChanged() {
mFullScreenMagnificationController.onUserContextChanged(DISPLAY_0);
}
/**
* Asserts that {@link #mMgh the handler} is in the given {@code state}
*/
@@ -763,43 +784,63 @@ public class FullScreenMagnificationGestureHandlerTest {
// Asserts on separate lines for accurate stack traces
case STATE_IDLE: {
case STATE_IDLE:
check(tapCount() < 2, state);
check(!mMgh.mDetectingState.mShortcutTriggered, state);
check(!isActivated(), state);
check(!isZoomed(), state);
} break;
case STATE_ACTIVATED: {
break;
case STATE_ACTIVATED:
check(isActivated(), state);
check(tapCount() < 2, state);
} break;
case STATE_2TAPS: {
break;
case STATE_SHORTCUT_TRIGGERED:
check(mMgh.mDetectingState.mShortcutTriggered, state);
check(isActivated(), state);
check(!isZoomed(), state);
break;
case STATE_ZOOMED_OUT_FROM_SERVICE:
// the always-on feature must be enabled then this state is reachable.
assertTrue(mFullScreenMagnificationController.isAlwaysOnMagnificationEnabled());
check(isActivated(), state);
check(!isZoomed(), state);
check(mMgh.mFullScreenMagnificationController.isZoomedOutFromService(DISPLAY_0),
state);
break;
case STATE_2TAPS:
check(!isActivated(), state);
check(!isZoomed(), state);
check(tapCount() == 2, state);
} break;
case STATE_ACTIVATED_2TAPS: {
break;
case STATE_ACTIVATED_2TAPS:
check(isActivated(), state);
check(isZoomed(), state);
check(tapCount() == 2, state);
} break;
case STATE_NON_ACTIVATED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_OUT_FROM_SERVICE_2TAPS:
check(isActivated(), state);
check(!isZoomed(), state);
check(mMgh.mFullScreenMagnificationController.isZoomedOutFromService(DISPLAY_0),
state);
check(tapCount() == 2, state);
break;
case STATE_NON_ACTIVATED_ZOOMED_TMP:
check(isActivated(), state);
check(isZoomed(), state);
check(mMgh.mCurrentState == mMgh.mViewportDraggingState,
state);
check(Float.isNaN(mMgh.mViewportDraggingState.mScaleToRecoverAfterDraggingEnd),
state);
} break;
case STATE_ACTIVATED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_FURTHER_TMP:
check(isActivated(), state);
check(isZoomed(), state);
check(mMgh.mCurrentState == mMgh.mViewportDraggingState,
state);
check(mMgh.mViewportDraggingState.mScaleToRecoverAfterDraggingEnd >= 1.0f,
state);
} break;
case STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP:
check(isActivated(), state);
check(isZoomed(), state);
check(mMgh.mCurrentState == mMgh.mViewportDraggingState,
@@ -811,29 +852,25 @@ public class FullScreenMagnificationGestureHandlerTest {
check(Float.isNaN(mMgh.mViewportDraggingState.mScaleToRecoverAfterDraggingEnd),
state);
}
} break;
case STATE_SHORTCUT_TRIGGERED: {
check(mMgh.mDetectingState.mShortcutTriggered, state);
check(isActivated(), state);
check(!isZoomed(), state);
} break;
case STATE_PANNING: {
break;
case STATE_PANNING:
check(isActivated(), state);
check(mMgh.mCurrentState == mMgh.mPanningScalingState,
state);
check(!mMgh.mPanningScalingState.mScaling, state);
} break;
case STATE_SCALING_AND_PANNING: {
break;
case STATE_SCALING_AND_PANNING:
check(isActivated(), state);
check(mMgh.mCurrentState == mMgh.mPanningScalingState,
state);
check(mMgh.mPanningScalingState.mScaling, state);
} break;
case STATE_SINGLE_PANNING: {
break;
case STATE_SINGLE_PANNING:
check(isZoomed(), state);
check(mMgh.mCurrentState == mMgh.mSinglePanningState, state);
} break;
default: throw new IllegalArgumentException("Illegal state: " + state);
break;
default:
throw new IllegalArgumentException("Illegal state: " + state);
}
}
@@ -843,15 +880,10 @@ public class FullScreenMagnificationGestureHandlerTest {
private void goFromStateIdleTo(int state) {
try {
switch (state) {
case STATE_IDLE: {
case STATE_IDLE:
mMgh.clearAndTransitionToStateDetecting();
} break;
case STATE_2TAPS: {
goFromStateIdleTo(STATE_IDLE);
tap();
tap();
} break;
case STATE_ACTIVATED: {
break;
case STATE_ACTIVATED:
if (mMgh.mDetectTripleTap) {
goFromStateIdleTo(STATE_2TAPS);
tap();
@@ -859,47 +891,63 @@ public class FullScreenMagnificationGestureHandlerTest {
goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED);
tap();
}
} break;
case STATE_ACTIVATED_2TAPS: {
break;
case STATE_SHORTCUT_TRIGGERED:
goFromStateIdleTo(STATE_IDLE);
triggerShortcut();
break;
case STATE_ZOOMED_OUT_FROM_SERVICE:
// the always-on feature must be enabled then this state is reachable.
assertTrue(mFullScreenMagnificationController.isAlwaysOnMagnificationEnabled());
goFromStateIdleTo(STATE_ACTIVATED);
triggerContextChanged();
break;
case STATE_2TAPS:
goFromStateIdleTo(STATE_IDLE);
tap();
tap();
break;
case STATE_ACTIVATED_2TAPS:
goFromStateIdleTo(STATE_ACTIVATED);
tap();
tap();
} break;
case STATE_NON_ACTIVATED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_OUT_FROM_SERVICE_2TAPS:
goFromStateIdleTo(STATE_ZOOMED_OUT_FROM_SERVICE);
tap();
tap();
break;
case STATE_NON_ACTIVATED_ZOOMED_TMP:
goFromStateIdleTo(STATE_2TAPS);
send(downEvent());
fastForward1sec();
} break;
case STATE_ACTIVATED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_FURTHER_TMP:
goFromStateIdleTo(STATE_ACTIVATED_2TAPS);
send(downEvent());
fastForward1sec();
} break;
case STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP:
goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED);
send(downEvent());
fastForward1sec();
} break;
case STATE_SHORTCUT_TRIGGERED: {
goFromStateIdleTo(STATE_IDLE);
triggerShortcut();
} break;
case STATE_PANNING: {
break;
case STATE_PANNING:
goFromStateIdleTo(STATE_ACTIVATED);
send(downEvent());
send(pointerEvent(ACTION_POINTER_DOWN, DEFAULT_X * 2, DEFAULT_Y));
fastForward(ViewConfiguration.getTapTimeout());
} break;
case STATE_SCALING_AND_PANNING: {
break;
case STATE_SCALING_AND_PANNING:
goFromStateIdleTo(STATE_PANNING);
send(pointerEvent(ACTION_MOVE, DEFAULT_X * 2, DEFAULT_Y * 3));
send(pointerEvent(ACTION_MOVE, DEFAULT_X * 2, DEFAULT_Y * 4));
send(pointerEvent(ACTION_MOVE, DEFAULT_X * 2, DEFAULT_Y * 5));
} break;
case STATE_SINGLE_PANNING: {
break;
case STATE_SINGLE_PANNING:
goFromStateIdleTo(STATE_ACTIVATED);
swipeAndHold();
} break;
break;
default:
throw new IllegalArgumentException("Illegal state: " + state);
}
@@ -913,14 +961,11 @@ public class FullScreenMagnificationGestureHandlerTest {
*/
private void returnToNormalFrom(int state) {
switch (state) {
case STATE_IDLE: {
case STATE_IDLE:
// no op
} break;
case STATE_2TAPS: {
allowEventDelegation();
fastForward1sec();
} break;
case STATE_ACTIVATED: {
break;
case STATE_ACTIVATED:
case STATE_ZOOMED_OUT_FROM_SERVICE:
if (mMgh.mDetectTripleTap) {
tap();
tap();
@@ -928,39 +973,45 @@ public class FullScreenMagnificationGestureHandlerTest {
} else {
triggerShortcut();
}
} break;
case STATE_ACTIVATED_2TAPS: {
break;
case STATE_SHORTCUT_TRIGGERED:
triggerShortcut();
break;
case STATE_2TAPS:
allowEventDelegation();
fastForward1sec();
break;
case STATE_ACTIVATED_2TAPS:
case STATE_ZOOMED_OUT_FROM_SERVICE_2TAPS:
tap();
} break;
case STATE_NON_ACTIVATED_ZOOMED_TMP: {
break;
case STATE_NON_ACTIVATED_ZOOMED_TMP:
send(upEvent());
} break;
case STATE_ACTIVATED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_FURTHER_TMP:
send(upEvent());
returnToNormalFrom(STATE_ACTIVATED);
} break;
case STATE_SHORTCUT_TRIGGERED_ZOOMED_TMP: {
break;
case STATE_ZOOMED_WITH_PERSISTED_SCALE_TMP:
send(upEvent());
if (mFullScreenMagnificationController.isAlwaysOnMagnificationEnabled()) {
returnToNormalFrom(STATE_ACTIVATED);
}
} break;
case STATE_SHORTCUT_TRIGGERED: {
triggerShortcut();
} break;
case STATE_PANNING: {
break;
case STATE_PANNING:
send(pointerEvent(ACTION_POINTER_UP, DEFAULT_X * 2, DEFAULT_Y));
send(upEvent());
returnToNormalFrom(STATE_ACTIVATED);
} break;
case STATE_SCALING_AND_PANNING: {
break;
case STATE_SCALING_AND_PANNING:
returnToNormalFrom(STATE_PANNING);
} break;
case STATE_SINGLE_PANNING: {
break;
case STATE_SINGLE_PANNING:
send(upEvent());
returnToNormalFrom(STATE_ACTIVATED);
} break;
default: throw new IllegalArgumentException("Illegal state: " + state);
break;
default:
throw new IllegalArgumentException("Illegal state: " + state);
}
}