From b32c85cc87241472d92d47b56d375fd3d0a4e91c Mon Sep 17 00:00:00 2001 From: Roy Chou Date: Wed, 8 Mar 2023 06:48:02 +0000 Subject: [PATCH] fix(#AlwaysOnMagnification): mis-activate fullscreen magnifier when display size changed If the AlwaysOn feature is enabled, when onDisplaySizeChanged() is triggered (such as screen rotation), the magnifier would set scale to 1.0x even when not activated, and thus the magnifier becomes activated. Therefore, we add state check at the beginning to prevent the issue. Bug: 271438152 Test: manually atest FullScreenMagnificationControllerTest Change-Id: Ic489904812a3207a48d7fdb93421e300ccd1b81f --- .../FullScreenMagnificationController.java | 4 + ...FullScreenMagnificationControllerTest.java | 83 ++++++++++++++----- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java index 9c1169414b078..ed8a35f45176e 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java @@ -901,6 +901,10 @@ public class FullScreenMagnificationController implements */ void onUserContextChanged(int displayId) { synchronized (mLock) { + if (!isActivated(displayId)) { + return; + } + if (isAlwaysOnMagnificationEnabled()) { setScaleAndCenter(displayId, 1.0f, Float.NaN, Float.NaN, true, diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java index 88f0c930f5135..f1ad577fde885 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java @@ -238,7 +238,7 @@ public class FullScreenMagnificationControllerTest { } private void notRegistered_publicMethodsShouldBeBenign(int displayId) { - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, displayId); + checkActivatedAndMagnifying(/* activated= */ false, /* magnifying= */ false, displayId); assertFalse( mFullScreenMagnificationController.magnificationRegionContains(displayId, 100, @@ -673,9 +673,9 @@ public class FullScreenMagnificationControllerTest { .setScale(displayId, 1.5f, startCenter.x, startCenter.y, false, SERVICE_ID_2); assertFalse(mFullScreenMagnificationController.resetIfNeeded(displayId, SERVICE_ID_1)); - checkActivatedAndMagnifyingState(/* activated= */true, /* magnifying= */true, displayId); + checkActivatedAndMagnifying(/* activated= */ true, /* magnifying= */ true, displayId); assertTrue(mFullScreenMagnificationController.resetIfNeeded(displayId, SERVICE_ID_2)); - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, displayId); + checkActivatedAndMagnifying(/* activated= */ false, /* magnifying= */ false, displayId); } @Test @@ -694,7 +694,7 @@ public class FullScreenMagnificationControllerTest { assertTrue(mFullScreenMagnificationController.resetIfNeeded(displayId, false)); verify(mRequestObserver).onFullScreenMagnificationChanged(eq(displayId), eq(INITIAL_MAGNIFICATION_REGION), any(MagnificationConfig.class)); - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, displayId); + checkActivatedAndMagnifying(/* activated= */ false, /* magnifying= */ false, displayId); assertFalse(mFullScreenMagnificationController.resetIfNeeded(displayId, false)); } @@ -758,7 +758,7 @@ public class FullScreenMagnificationControllerTest { mTargetAnimationListener.onAnimationUpdate(mMockValueAnimator); mStateListener.onAnimationEnd(mMockValueAnimator); - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, displayId); + checkActivatedAndMagnifying(/* activated= */ false, /* magnifying= */ false, displayId); verify(lastAnimationCallback).onResult(true); } @@ -776,26 +776,72 @@ public class FullScreenMagnificationControllerTest { mMessageCapturingHandler.sendAllMessages(); br.onReceive(mMockContext, null); mMessageCapturingHandler.sendAllMessages(); - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, DISPLAY_0); - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, DISPLAY_1); + checkActivatedAndMagnifying(/* activated= */ false, /* magnifying= */ false, DISPLAY_0); + checkActivatedAndMagnifying(/* activated= */ false, /* magnifying= */ false, DISPLAY_1); } @Test - public void testUserContextChange_resetsMagnification() { + public void testUserContextChange_magnifierActivated_resetMagnification() { for (int i = 0; i < DISPLAY_COUNT; i++) { - contextChange_resetsMagnification(i); + contextChange_expectedValues( + /* displayId= */ i, + /* isMagnifierActivated= */ true, + /* isAlwaysOnEnabled= */ false, + /* expectedActivated= */ false); resetMockWindowManager(); } } - private void contextChange_resetsMagnification(int displayId) { + @Test + public void testUserContextChange_magnifierActivatedAndAlwaysOnEnabled_stayActivated() { + for (int i = 0; i < DISPLAY_COUNT; i++) { + contextChange_expectedValues( + /* displayId= */ i, + /* isMagnifierActivated= */ true, + /* isAlwaysOnEnabled= */ true, + /* expectedActivated= */ true); + resetMockWindowManager(); + } + } + + @Test + public void testUserContextChange_magnifierDeactivated_stayDeactivated() { + for (int i = 0; i < DISPLAY_COUNT; i++) { + contextChange_expectedValues( + /* displayId= */ i, + /* isMagnifierActivated= */ false, + /* isAlwaysOnEnabled= */ false, + /* expectedActivated= */ false); + resetMockWindowManager(); + } + } + + @Test + public void testUserContextChange_magnifierDeactivatedAndAlwaysOnEnabled_stayDeactivated() { + for (int i = 0; i < DISPLAY_COUNT; i++) { + contextChange_expectedValues( + /* displayId= */ i, + /* isMagnifierActivated= */ false, + /* isAlwaysOnEnabled= */ true, + /* expectedActivated= */ false); + resetMockWindowManager(); + } + } + + private void contextChange_expectedValues( + int displayId, boolean isMagnifierActivated, boolean isAlwaysOnEnabled, + boolean expectedActivated) { + mFullScreenMagnificationController.setAlwaysOnMagnificationEnabled(isAlwaysOnEnabled); register(displayId); MagnificationCallbacks callbacks = getMagnificationCallbacks(displayId); - zoomIn2xToMiddle(displayId); - mMessageCapturingHandler.sendAllMessages(); + if (isMagnifierActivated) { + zoomIn2xToMiddle(displayId); + mMessageCapturingHandler.sendAllMessages(); + } callbacks.onUserContextChanged(); mMessageCapturingHandler.sendAllMessages(); - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, displayId); + checkActivatedAndMagnifying( + /* activated= */ expectedActivated, /* magnifying= */ false, displayId); } @Test @@ -811,10 +857,10 @@ public class FullScreenMagnificationControllerTest { MagnificationCallbacks callbacks = getMagnificationCallbacks(displayId); zoomIn2xToMiddle(displayId); mMessageCapturingHandler.sendAllMessages(); - checkActivatedAndMagnifyingState(/* activated= */true, /* magnifying= */true, displayId); + checkActivatedAndMagnifying(/* activated= */ true, /* magnifying= */ true, displayId); callbacks.onDisplaySizeChanged(); mMessageCapturingHandler.sendAllMessages(); - checkActivatedAndMagnifyingState(/* activated= */false, /* magnifying= */false, DISPLAY_0); + checkActivatedAndMagnifying(/* activated= */ false, /* magnifying= */ false, DISPLAY_0); } @Test @@ -1169,7 +1215,7 @@ public class FullScreenMagnificationControllerTest { mFullScreenMagnificationController.setScaleAndCenter( DISPLAY_0, scale, Float.NaN, Float.NaN, true, SERVICE_ID_1); - checkActivatedAndMagnifyingState(/* activated= */true, /* magnifying= */false, DISPLAY_0); + checkActivatedAndMagnifying(/* activated= */ true, /* magnifying= */ false, DISPLAY_0); verify(mMockWindowManager).setForceShowMagnifiableBounds(DISPLAY_0, true); } @@ -1280,11 +1326,10 @@ public class FullScreenMagnificationControllerTest { float scale = 2.0f; mFullScreenMagnificationController.setScale(displayId, scale, startCenter.x, startCenter.y, false, SERVICE_ID_1); - checkActivatedAndMagnifyingState(/* activated= */true, /* magnifying= */true, displayId); + checkActivatedAndMagnifying(/* activated= */ true, /* magnifying= */ true, displayId); } - private void checkActivatedAndMagnifyingState( - boolean activated, boolean magnifying, int displayId) { + private void checkActivatedAndMagnifying(boolean activated, boolean magnifying, int displayId) { final boolean isActivated = mFullScreenMagnificationController.isActivated(displayId); final boolean isMagnifying = mFullScreenMagnificationController.getScale(displayId) > 1.0f; assertTrue(isActivated == activated);