diff options
| author | 2023-03-08 06:48:02 +0000 | |
|---|---|---|
| committer | 2023-03-12 06:52:54 +0000 | |
| commit | b32c85cc87241472d92d47b56d375fd3d0a4e91c (patch) | |
| tree | 246824668d323d58f3d85d280c511b74da84b45d | |
| parent | 3b65691e8b1c57a810facde943a80b808a64577c (diff) | |
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
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 9c1169414b07..ed8a35f45176 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 88f0c930f513..f1ad577fde88 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); |