Merge "fix(#Magnification): magnification gesture handler might not be activated after config transition" into udc-dev

This commit is contained in:
Roy Chou
2023-04-17 05:26:29 +00:00
committed by Android (Google) Code Review
2 changed files with 55 additions and 6 deletions

View File

@@ -231,6 +231,12 @@ public class MagnificationController implements WindowMagnificationManager.Callb
*/ */
public void transitionMagnificationModeLocked(int displayId, int targetMode, public void transitionMagnificationModeLocked(int displayId, int targetMode,
@NonNull TransitionCallBack transitionCallBack) { @NonNull TransitionCallBack transitionCallBack) {
// check if target mode is already activated
if (isActivated(displayId, targetMode)) {
transitionCallBack.onResult(displayId, true);
return;
}
final PointF currentCenter = getCurrentMagnificationCenterLocked(displayId, targetMode); final PointF currentCenter = getCurrentMagnificationCenterLocked(displayId, targetMode);
final DisableMagnificationCallback animationCallback = final DisableMagnificationCallback animationCallback =
getDisableMagnificationEndRunnableLocked(displayId); getDisableMagnificationEndRunnableLocked(displayId);
@@ -322,13 +328,16 @@ public class MagnificationController implements WindowMagnificationManager.Callb
: config.getScale(); : config.getScale();
try { try {
setTransitionState(displayId, targetMode); setTransitionState(displayId, targetMode);
final MagnificationAnimationCallback magnificationAnimationCallback = animate
? success -> mAms.changeMagnificationMode(displayId, targetMode)
: null;
// Activate or deactivate target mode depending on config activated value // Activate or deactivate target mode depending on config activated value
if (targetMode == MAGNIFICATION_MODE_WINDOW) { if (targetMode == MAGNIFICATION_MODE_WINDOW) {
screenMagnificationController.reset(displayId, false); screenMagnificationController.reset(displayId, false);
if (targetActivated) { if (targetActivated) {
windowMagnificationMgr.enableWindowMagnification(displayId, windowMagnificationMgr.enableWindowMagnification(displayId,
targetScale, magnificationCenter.x, magnificationCenter.y, targetScale, magnificationCenter.x, magnificationCenter.y,
animate ? STUB_ANIMATION_CALLBACK : null, id); magnificationAnimationCallback, id);
} else { } else {
windowMagnificationMgr.disableWindowMagnification(displayId, false); windowMagnificationMgr.disableWindowMagnification(displayId, false);
} }
@@ -339,8 +348,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
screenMagnificationController.register(displayId); screenMagnificationController.register(displayId);
} }
screenMagnificationController.setScaleAndCenter(displayId, targetScale, screenMagnificationController.setScaleAndCenter(displayId, targetScale,
magnificationCenter.x, magnificationCenter.y, animate, magnificationCenter.x, magnificationCenter.y,
id); magnificationAnimationCallback, id);
} else { } else {
if (screenMagnificationController.isRegistered(displayId)) { if (screenMagnificationController.isRegistered(displayId)) {
screenMagnificationController.reset(displayId, false); screenMagnificationController.reset(displayId, false);
@@ -348,6 +357,9 @@ public class MagnificationController implements WindowMagnificationManager.Callb
} }
} }
} finally { } finally {
if (!animate) {
mAms.changeMagnificationMode(displayId, targetMode);
}
// Reset transition state after enabling target mode. // Reset transition state after enabling target mode.
setTransitionState(displayId, null); setTransitionState(displayId, null);
} }

View File

@@ -35,6 +35,7 @@ import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -435,9 +436,9 @@ public class MagnificationControllerTest {
mMockConnection.invokeCallbacks(); mMockConnection.invokeCallbacks();
assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY)); assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
verify(mScreenMagnificationController).setScaleAndCenter(TEST_DISPLAY, verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY),
DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, eq(DEFAULT_SCALE), eq(MAGNIFIED_CENTER_X), eq(MAGNIFIED_CENTER_Y),
animate, TEST_SERVICE_ID); any(MagnificationAnimationCallback.class), eq(TEST_SERVICE_ID));
} }
@Test @Test
@@ -503,6 +504,42 @@ public class MagnificationControllerTest {
0); 0);
} }
@Test
public void configTransitionToFullScreenWithAnimation_windowMagnifying_notifyService()
throws RemoteException {
final boolean animate = true;
activateMagnifier(MODE_WINDOW, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y);
reset(mService);
MagnificationConfig config = (new MagnificationConfig.Builder())
.setMode(MODE_FULLSCREEN).build();
mMagnificationController.transitionMagnificationConfigMode(TEST_DISPLAY,
config, animate, TEST_SERVICE_ID);
verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY),
/* scale= */ anyFloat(), /* centerX= */ anyFloat(), /* centerY= */ anyFloat(),
mCallbackArgumentCaptor.capture(), /* id= */ anyInt());
mCallbackArgumentCaptor.getValue().onResult(true);
mMockConnection.invokeCallbacks();
verify(mService).changeMagnificationMode(TEST_DISPLAY, MODE_FULLSCREEN);
}
@Test
public void configTransitionToFullScreenWithoutAnimation_windowMagnifying_notifyService()
throws RemoteException {
final boolean animate = false;
activateMagnifier(MODE_WINDOW, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y);
reset(mService);
MagnificationConfig config = (new MagnificationConfig.Builder())
.setMode(MODE_FULLSCREEN).build();
mMagnificationController.transitionMagnificationConfigMode(TEST_DISPLAY,
config, animate, TEST_SERVICE_ID);
mMockConnection.invokeCallbacks();
verify(mService).changeMagnificationMode(TEST_DISPLAY, MODE_FULLSCREEN);
}
@Test @Test
public void interruptDuringTransitionToWindow_disablingFullScreen_discardPreviousTransition() public void interruptDuringTransitionToWindow_disablingFullScreen_discardPreviousTransition()
throws RemoteException { throws RemoteException {