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

Commit cfc401cf authored by Tyler Freeman's avatar Tyler Freeman
Browse files

fix(magnification fling): add stop fling test to controller test

Fix: 319175022
Flag: ACONFIG services.accessibility.fullscreen_fling_gesture DISABLED
Test: atest com.android.server.accessibility.magnification.FullScreenMagnificationControllerTest
Change-Id: I01ea9c445379c7f5ea476cc97ce8959e8d644185
parent 1969192d
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ public class FullScreenMagnificationController implements

    private final Object mLock;
    private final Supplier<Scroller> mScrollerSupplier;
    private final Supplier<TimeAnimator> mTimeAnimatorSupplier;

    private final ControllerContext mControllerCtx;

@@ -155,7 +156,12 @@ public class FullScreenMagnificationController implements
        DisplayMagnification(int displayId) {
            mDisplayId = displayId;
            mSpecAnimationBridge =
                    new SpecAnimationBridge(mControllerCtx, mLock, mDisplayId, mScrollerSupplier);
                    new SpecAnimationBridge(
                            mControllerCtx,
                            mLock,
                            mDisplayId,
                            mScrollerSupplier,
                            mTimeAnimatorSupplier);
        }

        /**
@@ -948,7 +954,8 @@ public class FullScreenMagnificationController implements
                scaleProvider,
                /* thumbnailSupplier= */ null,
                backgroundExecutor,
                () -> new Scroller(context));
                () -> new Scroller(context),
                TimeAnimator::new);
    }

    /** Constructor for tests */
@@ -960,10 +967,12 @@ public class FullScreenMagnificationController implements
            @NonNull MagnificationScaleProvider scaleProvider,
            Supplier<MagnificationThumbnail> thumbnailSupplier,
            @NonNull Executor backgroundExecutor,
            Supplier<Scroller> scrollerSupplier) {
            Supplier<Scroller> scrollerSupplier,
            Supplier<TimeAnimator> timeAnimatorSupplier) {
        mControllerCtx = ctx;
        mLock = lock;
        mScrollerSupplier = scrollerSupplier;
        mTimeAnimatorSupplier = timeAnimatorSupplier;
        mMainThreadId = mControllerCtx.getContext().getMainLooper().getThread().getId();
        mScreenStateObserver = new ScreenStateObserver(mControllerCtx.getContext(), this);
        addInfoChangedCallback(magnificationInfoChangedCallback);
@@ -1847,13 +1856,14 @@ public class FullScreenMagnificationController implements
        private boolean mEnabled = false;

        private final Scroller mScroller;
        private final TimeAnimator mScrollAnimator = new TimeAnimator();
        private final TimeAnimator mScrollAnimator;

        private SpecAnimationBridge(
                ControllerContext ctx,
                Object lock,
                int displayId,
                Supplier<Scroller> scrollerSupplier) {
                Supplier<Scroller> scrollerSupplier,
                Supplier<TimeAnimator> timeAnimatorSupplier) {
            mControllerCtx = ctx;
            mLock = lock;
            mDisplayId = displayId;
@@ -1867,6 +1877,7 @@ public class FullScreenMagnificationController implements

            if (Flags.fullscreenFlingGesture()) {
                mScroller = scrollerSupplier.get();
                mScrollAnimator = timeAnimatorSupplier.get();
                mScrollAnimator.addListener(this);
                mScrollAnimator.setTimeListener(
                        (animation, totalTime, deltaTime) -> {
@@ -1892,6 +1903,7 @@ public class FullScreenMagnificationController implements
                        });
            } else {
                mScroller = null;
                mScrollAnimator = null;
            }
        }

+95 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;

import android.accessibilityservice.MagnificationConfig;
import android.animation.TimeAnimator;
import android.animation.ValueAnimator;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -52,6 +53,9 @@ import android.graphics.Region;
import android.hardware.display.DisplayManagerInternal;
import android.os.Looper;
import android.os.UserHandle;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.Settings;
import android.test.mock.MockContentResolver;
import android.view.DisplayInfo;
@@ -66,6 +70,7 @@ import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.LocalServices;
import com.android.server.accessibility.AccessibilityTraceManager;
import com.android.server.accessibility.Flags;
import com.android.server.accessibility.test.MessageCapturingHandler;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowManagerInternal.MagnificationCallbacks;
@@ -75,6 +80,7 @@ import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -105,6 +111,9 @@ public class FullScreenMagnificationControllerTest {
    static final int INVALID_DISPLAY = 2;
    private static final int CURRENT_USER_ID = UserHandle.USER_SYSTEM;

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    final FullScreenMagnificationController.ControllerContext mMockControllerCtx =
            mock(FullScreenMagnificationController.ControllerContext.class);
    final Context mMockContext = mock(Context.class);
@@ -119,6 +128,7 @@ public class FullScreenMagnificationControllerTest {
    private MagnificationScaleProvider mScaleProvider;
    private MockContentResolver mResolver;
    private final MagnificationThumbnail mMockThumbnail = mock(MagnificationThumbnail.class);
    private final Scroller mMockScroller = mock(Scroller.class);

    private final ArgumentCaptor<MagnificationConfig> mConfigCaptor = ArgumentCaptor.forClass(
            MagnificationConfig.class);
@@ -127,6 +137,8 @@ public class FullScreenMagnificationControllerTest {
    ValueAnimator.AnimatorUpdateListener mTargetAnimationListener;
    ValueAnimator.AnimatorListener mStateListener;

    private final TimeAnimator mMockTimeAnimator = mock(TimeAnimator.class);

    FullScreenMagnificationController mFullScreenMagnificationController;

    public DisplayManagerInternal mDisplayManagerInternalMock = mock(DisplayManagerInternal.class);
@@ -171,7 +183,8 @@ public class FullScreenMagnificationControllerTest {
                        mScaleProvider,
                        () -> mMockThumbnail,
                        ConcurrentUtils.DIRECT_EXECUTOR,
                        () -> new Scroller(realContext));
                        () -> mMockScroller,
                        () -> mMockTimeAnimator);
    }

    @After
@@ -655,6 +668,85 @@ public class FullScreenMagnificationControllerTest {
        verifyNoMoreInteractions(mMockWindowManager);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_FULLSCREEN_FLING_GESTURE)
    public void testStartFling_whileMagnifying_flings() throws InterruptedException {
        for (int i = 0; i < DISPLAY_COUNT; i++) {
            startFling_whileMagnifying_flings(i);
            resetMockWindowManager();
        }
    }

    private void startFling_whileMagnifying_flings(int displayId) throws InterruptedException {
        register(displayId);
        PointF startCenter = INITIAL_MAGNIFICATION_BOUNDS_CENTER;
        float scale = 2.0f;
        // First zoom in
        assertTrue(mFullScreenMagnificationController
                .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, false,
                        SERVICE_ID_1));
        mMessageCapturingHandler.sendAllMessages();

        PointF newCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER;
        PointF newOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, newCenter, scale);
        mFullScreenMagnificationController.startFling(displayId,
                /* xPixelsPerSecond= */ 400f,
                /* yPixelsPerSecond= */ 100f,
                SERVICE_ID_1
        );
        mMessageCapturingHandler.sendAllMessages();

        verify(mMockTimeAnimator).start();
        verify(mMockScroller).fling(
                /* startX= */ eq((int) newOffsets.x / 2),
                /* startY= */ eq((int) newOffsets.y / 2),
                /* velocityX= */ eq(400),
                /* velocityY= */ eq(100),
                /* minX= */ anyInt(),
                /* minY= */ anyInt(),
                /* maxX= */ anyInt(),
                /* maxY= */ anyInt()
        );
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_FULLSCREEN_FLING_GESTURE)
    public void testStopFling_whileMagnifyingAndFlinging_stops() throws InterruptedException {
        for (int i = 0; i < DISPLAY_COUNT; i++) {
            stopFling_whileMagnifyingAndFlinging_stops(i);
            resetMockWindowManager();
        }
    }

    private void stopFling_whileMagnifyingAndFlinging_stops(int displayId)
            throws InterruptedException {
        register(displayId);
        PointF startCenter = INITIAL_MAGNIFICATION_BOUNDS_CENTER;
        float scale = 2.0f;
        PointF startOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, startCenter, scale);
        // First zoom in
        assertTrue(mFullScreenMagnificationController
                .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, false,
                        SERVICE_ID_1));
        mMessageCapturingHandler.sendAllMessages();

        mFullScreenMagnificationController.startFling(displayId,
                /* xPixelsPerSecond= */ 400f,
                /* yPixelsPerSecond= */ 100f,
                SERVICE_ID_1
        );
        mMessageCapturingHandler.sendAllMessages();

        when(mMockTimeAnimator.isRunning()).thenReturn(true);

        mFullScreenMagnificationController.cancelFling(displayId, SERVICE_ID_1);
        mMessageCapturingHandler.sendAllMessages();

        verify(mMockTimeAnimator).cancel();
        // Can't verify forceFinished() because it's final
//        verify(mMockScroller).forceFinished(eq(true));
    }

    @Test
    public void testGetIdOfLastServiceToChange_returnsCorrectValue() {
        for (int i = 0; i < DISPLAY_COUNT; i++) {
@@ -1382,6 +1474,8 @@ public class FullScreenMagnificationControllerTest {
    private void resetMockWindowManager() {
        Mockito.reset(mMockWindowManager);
        Mockito.reset(mMockThumbnail);
        Mockito.reset(mMockScroller);
        Mockito.reset(mMockTimeAnimator);
        initMockWindowManager();
    }

+3 −1
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import android.animation.TimeAnimator;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.content.pm.PackageManager;
@@ -234,7 +235,8 @@ public class FullScreenMagnificationGestureHandlerTest {
                        new MagnificationScaleProvider(mContext),
                        () -> null,
                        ConcurrentUtils.DIRECT_EXECUTOR,
                        () -> mMockScroller) {
                        () -> mMockScroller,
                        TimeAnimator::new) {
                    @Override
                    public boolean magnificationRegionContains(int displayId, float x, float y) {
                        return true;
+5 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.accessibilityservice.MagnificationConfig;
import android.animation.TimeAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -120,6 +121,8 @@ public class MagnificationControllerTest {
    @Mock
    private ValueAnimator mValueAnimator;
    @Mock
    private TimeAnimator mTimeAnimator;
    @Mock
    private MessageCapturingHandler mMessageCapturingHandler;

    private FullScreenMagnificationController mScreenMagnificationController;
@@ -205,7 +208,8 @@ public class MagnificationControllerTest {
                                mScaleProvider,
                                () -> null,
                                ConcurrentUtils.DIRECT_EXECUTOR,
                                () -> new Scroller(mContext)));
                                () -> new Scroller(mContext),
                                () -> mTimeAnimator));
        mScreenMagnificationController.register(TEST_DISPLAY);

        mMagnificationConnectionManager = spy(