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,
@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 DisableMagnificationCallback animationCallback =
getDisableMagnificationEndRunnableLocked(displayId);
@@ -322,13 +328,16 @@ public class MagnificationController implements WindowMagnificationManager.Callb
: config.getScale();
try {
setTransitionState(displayId, targetMode);
final MagnificationAnimationCallback magnificationAnimationCallback = animate
? success -> mAms.changeMagnificationMode(displayId, targetMode)
: null;
// Activate or deactivate target mode depending on config activated value
if (targetMode == MAGNIFICATION_MODE_WINDOW) {
screenMagnificationController.reset(displayId, false);
if (targetActivated) {
windowMagnificationMgr.enableWindowMagnification(displayId,
targetScale, magnificationCenter.x, magnificationCenter.y,
animate ? STUB_ANIMATION_CALLBACK : null, id);
magnificationAnimationCallback, id);
} else {
windowMagnificationMgr.disableWindowMagnification(displayId, false);
}
@@ -339,8 +348,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
screenMagnificationController.register(displayId);
}
screenMagnificationController.setScaleAndCenter(displayId, targetScale,
magnificationCenter.x, magnificationCenter.y, animate,
id);
magnificationCenter.x, magnificationCenter.y,
magnificationAnimationCallback, id);
} else {
if (screenMagnificationController.isRegistered(displayId)) {
screenMagnificationController.reset(displayId, false);
@@ -348,6 +357,9 @@ public class MagnificationController implements WindowMagnificationManager.Callb
}
}
} finally {
if (!animate) {
mAms.changeMagnificationMode(displayId, targetMode);
}
// Reset transition state after enabling target mode.
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.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -435,9 +436,9 @@ public class MagnificationControllerTest {
mMockConnection.invokeCallbacks();
assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
verify(mScreenMagnificationController).setScaleAndCenter(TEST_DISPLAY,
DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y,
animate, TEST_SERVICE_ID);
verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY),
eq(DEFAULT_SCALE), eq(MAGNIFIED_CENTER_X), eq(MAGNIFIED_CENTER_Y),
any(MagnificationAnimationCallback.class), eq(TEST_SERVICE_ID));
}
@Test
@@ -503,6 +504,42 @@ public class MagnificationControllerTest {
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
public void interruptDuringTransitionToWindow_disablingFullScreen_discardPreviousTransition()
throws RemoteException {