Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97550d06 authored by Roy Chou's avatar Roy Chou
Browse files

fix(#Magnification): magnification gesture handler might not be activated after config transition

If the magnification mode transition is triggered by magnification config, the AccessibilityManagerService would not be notified. It might cause some issues.
1. The AccessibilityUserState would stay in old/wrong mode not same as current mode
2. the AccessibilityInputFilter would not be notified, and thus it would not switch to the corresponding magnification gesture handler

Therefore, in MagnificationController#transitionMagnificationConfigMode, we adjust to notify the service the mode changed, and the service would notify the userState and inputFilter as its original behavior.

Bug: 278031878
Test: manually
      atest MagnificationControllerTest
Change-Id: I7d567873b35eefd7a5a515cb7692d48413a7dd9d
parent c01c5f88
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -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);
            }
+40 −3
Original line number Diff line number Diff line
@@ -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 {