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

Commit 77091b1f authored by Roy Chou's avatar Roy Chou
Browse files

refactor(magnification): refactor window magnification onRectangleOnScreenRequested tests

Split the onRectangleOnScreenRequested tests into two parts. One is for
verifying the trackingFocusTypingEnabled state, another is for verifying
the window magnification behaviors when onRectangleOnScreenRequested
called.

Bug: 409661124
Flag: EXEMPT refactor tests
Test: atest MagnificationConnectionManagerTest

Change-Id: I607680a16d306417936e27a2eec0672f57f33ad0
parent d9806f11
Loading
Loading
Loading
Loading
+127 −121
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.server.accessibility.magnification;
import static com.android.server.accessibility.magnification.MockMagnificationConnection.TEST_DISPLAY;
import static com.android.server.accessibility.magnification.MockMagnificationConnection.TEST_DISPLAY_2;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
@@ -314,149 +316,160 @@ public class MagnificationConnectionManagerTest {
                MagnificationScaleProvider.MAX_SCALE);
    }

    @FlakyTest(bugId = 297879435)
    @Test
    public void logTrackingTypingFocus_processScroll_logDuration() {
        MagnificationConnectionManager spyMagnificationConnectionManager = spy(
                mMagnificationConnectionManager);
        spyMagnificationConnectionManager.enableWindowMagnification(
                TEST_DISPLAY, 3.0f, 50f, 50f);
        spyMagnificationConnectionManager.onImeWindowVisibilityChanged(
                TEST_DISPLAY, /* shown */ true);
    public void enableWindowMagnification_trackingTypingFocusEnabledByDefault() {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());

        spyMagnificationConnectionManager.processScroll(TEST_DISPLAY, 10f, 10f);
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);

        verify(spyMagnificationConnectionManager).logTrackingTypingFocus(anyLong());
        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isTrue();
    }

    @Test
    public void onRectangleOnScreenRequested_trackingDisabledByOnDrag_withoutMovingMagnifier()
            throws RemoteException {
    public void disableTrackingTypingFocus_wasEnabled_trackingDisabled() {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        final Region outRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
        final Rect requestedRect = outRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
        mMockConnection.getConnectionCallback().onMove(TEST_DISPLAY);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);

        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isFalse();
    }


    @Test
    public void onRectangleOnScreenRequested_trackingDisabledByScroll_withoutMovingMagnifier()
            throws RemoteException {
        final float distanceX = 10f;
        final float distanceY = 10f;
    public void imeBecomesVisible_trackingTypingFocusWasEnabled_trackingStaysEnabled() {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);

        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        final Region outRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
        final Rect requestedRect = outRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
        mMagnificationConnectionManager.processScroll(TEST_DISPLAY, distanceX, distanceY);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isTrue();
    }

        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
    @Test
    public void imeBecomesVisible_trackingTypingFocusWasDisabled_trackingEnabled() {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);

        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);

        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isTrue();
    }

    @Test
    public void onRectangleOnScreenRequested_requestRectangleInBound_withoutMovingMagnifier()
            throws RemoteException {
    public void imeBecomesInvisible_trackingTypingFocusWasEnabled_trackingStaysEnabled() {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        final Region outRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
        final Rect requestedRect = outRegion.getBounds();
        requestedRect.inset(-10, -10);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, false);

        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isTrue();
    }

    @Test
    public void onRectangleOnScreenRequested_imeVisibilityDefaultInvisible_withoutMovingMagnifier()
    public void restartWindowMagnification_trackingTypingFocusWasDisabled_trackingEnabled() {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);

        mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
        // Enabling a window magnifier again will turn on the tracking typing focus functionality.
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, NaN, NaN, NaN);

        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isTrue();
    }

    @Test
    public void onMoveWindowMagnification_trackingTypingFocusWasEnabled_trackingDisabled()
            throws RemoteException {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        final Region outRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
        final Rect requestedRect = outRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        mMockConnection.getConnectionCallback().onMove(TEST_DISPLAY);

        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isFalse();
    }

    @Test
    public void processScroll_trackingTypingFocusWasEnabled_trackingDisabled() {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);

        mMagnificationConnectionManager.processScroll(TEST_DISPLAY, 10f, 10f);

        assertThat(mMagnificationConnectionManager.isTrackingTypingFocusEnabled(TEST_DISPLAY))
                .isFalse();
    }

    @FlakyTest(bugId = 297879435)
    @Test
    public void processScroll_trackingTypingFocusWasEnabled_logTrackingTypingFocusWithDuration() {
        MagnificationConnectionManager spyMagnificationConnectionManager = spy(
                mMagnificationConnectionManager);
        spyMagnificationConnectionManager.enableWindowMagnification(
                TEST_DISPLAY, 3.0f, 50f, 50f);

        spyMagnificationConnectionManager.processScroll(TEST_DISPLAY, 10f, 10f);

        verify(spyMagnificationConnectionManager).logTrackingTypingFocus(anyLong());
    }

    @Test
    public void onRectangleOnScreenRequested_trackingEnabledByDefault_movingMagnifier()
    public void onRectangleOnScreenRequested_trackingDisabled_doNotMoveMagnifier()
            throws RemoteException {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        final Region outRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
        final Rect requestedRect = outRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
        mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        final Region curRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, curRegion);
        requestRectOnScreen(mMagnificationConnectionManager, TEST_DISPLAY, /* inBounds= */ false);

        verify(mMockConnection.getConnection()).moveWindowMagnifierToPosition(eq(TEST_DISPLAY),
                eq(requestedRect.exactCenterX()), eq(requestedRect.exactCenterY()),
                any(IRemoteMagnificationAnimationCallback.class));
        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
        // Also verify the source bounds not changed
        final Region newRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, newRegion);
        assertEquals(curRegion, newRegion);
    }

    @Test
    public void onRectangleOnScreenRequested_imeInvisible_withoutMovingMagnifier()
    public void onRectangleOnScreenRequested_imeInvisibleByDefault_doNotMoveMagnifier()
            throws RemoteException {
        // By default the IME visibility is false
        assertThat(mMagnificationConnectionManager.isImeVisible(TEST_DISPLAY)).isFalse();

        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        final Region outRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
        final Rect requestedRect = outRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, false);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        requestRectOnScreen(mMagnificationConnectionManager, TEST_DISPLAY, /* inBounds= */ false);

        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
    }

    @Test
    public void onRectangleOnScreenRequested_trackingEnabledByDragAndReset_movingMagnifier()
    public void onRectangleOnScreenRequested_imeBecomesVisible_moveMagnifier()
            throws RemoteException {
        // The essential factors to decide whether the magnifier need to move are:
        // 1. trackingTypingFocus is enabled
        // 2. IME is visible
        // 3. the requested rectangle is not in the current source bound
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        mMockConnection.getConnectionCallback().onMove(TEST_DISPLAY);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        final Region outRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
        final Rect requestedRect = outRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        Rect requestedRect = requestRectOnScreen(
                mMagnificationConnectionManager, TEST_DISPLAY, /* inBounds= */ false);

        verify(mMockConnection.getConnection()).moveWindowMagnifierToPosition(eq(TEST_DISPLAY),
                eq(requestedRect.exactCenterX()), eq(requestedRect.exactCenterY()),
@@ -464,64 +477,44 @@ public class MagnificationConnectionManagerTest {
    }

    @Test
    public void onRectangleOnScreenRequested_followTypingIsDisabled_withoutMovingMagnifier() {
    public void onRectangleOnScreenRequested_imeBecomesInvisible_doNotMoveMagnifier()
            throws RemoteException {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        final Region beforeRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
        final Rect requestedRect = beforeRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
        mMagnificationConnectionManager.setMagnificationFollowTypingEnabled(false);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, false);
        requestRectOnScreen(mMagnificationConnectionManager, TEST_DISPLAY, /* inBounds= */ false);

        final Region afterRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, afterRegion);
        assertEquals(afterRegion, beforeRegion);
        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
    }

    @Test
    public void onRectangleOnScreenRequested_trackingDisabled_withoutMovingMagnifier() {
    public void onRectangleOnScreenRequested_rectangleInBound_doNotMoveMagnifier()
            throws RemoteException {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);
        final Region beforeRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
        final Rect requestedRect = beforeRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        requestRectOnScreen(mMagnificationConnectionManager, TEST_DISPLAY, /* inBounds= */ true);

        final Region afterRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, afterRegion);
        assertEquals(afterRegion, beforeRegion);
        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
    }

    @Test
    public void onRectangleOnScreenRequested_trackingDisabledAndEnabledMagnifier_movingMagnifier()
    public void onRectangleOnScreenRequested_followTypingDisabled_doNotMoveMagnifier()
            throws RemoteException {
        mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
        mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
        mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);
        final Region beforeRegion = new Region();
        mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
        final Rect requestedRect = beforeRegion.getBounds();
        requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
        mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
        // Enabling a window magnifier again will turn on the tracking typing focus functionality.
        mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, NaN, NaN, NaN);
        mMagnificationConnectionManager.setMagnificationFollowTypingEnabled(false);

        mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        requestRectOnScreen(mMagnificationConnectionManager, TEST_DISPLAY, /* inBounds= */ false);

        verify(mMockConnection.getConnection()).moveWindowMagnifierToPosition(eq(TEST_DISPLAY),
                eq(requestedRect.exactCenterX()), eq(requestedRect.exactCenterY()),
                any(IRemoteMagnificationAnimationCallback.class));
        verify(mMockConnection.getConnection(), never())
                .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any());
    }

    @Test
@@ -869,5 +862,18 @@ public class MagnificationConnectionManagerTest {
                /* flags */ 0);
    }


    private Rect requestRectOnScreen(
            MagnificationConnectionManager manager, int displayId, boolean inBounds) {
        final Region curRegion = new Region();
        manager.getMagnificationSourceBounds(displayId, curRegion);
        final Rect requestedRect = curRegion.getBounds();
        if (inBounds) {
            requestedRect.inset(-10, -10);
        } else {
            requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
        }
        manager.onRectangleOnScreenRequested(displayId,
                requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
        return requestedRect;
    }
}