Merge "fix(#Magnification): magnification gesture handler might not be activated after config transition" into udc-dev
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user