Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +14 −0 Original line number Diff line number Diff line Loading @@ -4623,6 +4623,20 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub android.Manifest.permission.STATUS_BAR_SERVICE); getMagnificationConnectionManager().setConnection(connection); if (com.android.window.flags.Flags.alwaysDrawMagnificationFullscreenBorder() && connection == null && mMagnificationController.isFullScreenMagnificationControllerInitialized()) { // Since the connection does not exist, the system ui cannot provide the border // implementation for fullscreen magnification. So we call reset to deactivate the // fullscreen magnification to prevent the magnified but no border situation. final ArrayList<Display> displays = getValidDisplayList(); for (int i = 0; i < displays.size(); i++) { final Display display = displays.get(i); getMagnificationController().getFullScreenMagnificationController() .reset(display.getDisplayId(), false); } } } /** Loading services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java +14 −3 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ public class FullScreenMagnificationController implements private final MagnificationThumbnailFeatureFlag mMagnificationThumbnailFeatureFlag; @NonNull private final Supplier<MagnificationThumbnail> mThumbnailSupplier; @NonNull private final Supplier<Boolean> mMagnificationConnectionStateSupplier; /** * This class implements {@link WindowManagerInternal.MagnificationCallbacks} and holds Loading Loading @@ -682,6 +683,12 @@ public class FullScreenMagnificationController implements if (!mRegistered) { return false; } // If the border implementation is on system ui side but the connection is not // established, the fullscreen magnification should not work. if (com.android.window.flags.Flags.alwaysDrawMagnificationFullscreenBorder() && !mMagnificationConnectionStateSupplier.get()) { return false; } if (DEBUG) { Slog.i(LOG_TAG, "setScaleAndCenterLocked(scale = " + scale + ", centerX = " + centerX Loading Loading @@ -941,7 +948,8 @@ public class FullScreenMagnificationController implements @NonNull AccessibilityTraceManager traceManager, @NonNull Object lock, @NonNull MagnificationInfoChangedCallback magnificationInfoChangedCallback, @NonNull MagnificationScaleProvider scaleProvider, @NonNull Executor backgroundExecutor) { @NonNull Executor backgroundExecutor, @NonNull Supplier<Boolean> magnificationConnectionStateSupplier) { this( new ControllerContext( context, Loading @@ -955,7 +963,8 @@ public class FullScreenMagnificationController implements /* thumbnailSupplier= */ null, backgroundExecutor, () -> new Scroller(context), TimeAnimator::new); TimeAnimator::new, magnificationConnectionStateSupplier); } /** Constructor for tests */ Loading @@ -968,11 +977,13 @@ public class FullScreenMagnificationController implements Supplier<MagnificationThumbnail> thumbnailSupplier, @NonNull Executor backgroundExecutor, Supplier<Scroller> scrollerSupplier, Supplier<TimeAnimator> timeAnimatorSupplier) { Supplier<TimeAnimator> timeAnimatorSupplier, @NonNull Supplier<Boolean> magnificationConnectionStateSupplier) { mControllerCtx = ctx; mLock = lock; mScrollerSupplier = scrollerSupplier; mTimeAnimatorSupplier = timeAnimatorSupplier; mMagnificationConnectionStateSupplier = magnificationConnectionStateSupplier; mMainThreadId = mControllerCtx.getContext().getMainLooper().getThread().getId(); mScreenStateObserver = new ScreenStateObserver(mControllerCtx.getContext(), this); addInfoChangedCallback(magnificationInfoChangedCallback); Loading services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +9 −1 Original line number Diff line number Diff line Loading @@ -798,7 +798,9 @@ public class MagnificationController implements MagnificationConnectionManager.C mLock, this, mScaleProvider, mBackgroundExecutor mBackgroundExecutor, () -> (isMagnificationConnectionManagerInitialized() && getMagnificationConnectionManager().isConnected()) ); } } Loading Loading @@ -831,6 +833,12 @@ public class MagnificationController implements MagnificationConnectionManager.C } } private boolean isMagnificationConnectionManagerInitialized() { synchronized (mLock) { return mMagnificationConnectionManager != null; } } private @Nullable PointF getCurrentMagnificationCenterLocked(int displayId, int targetMode) { if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) { if (mMagnificationConnectionManager == null Loading services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +14 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.accessibility.Flags.FLAG_SKIP_ACCESSIBILITY_WARNING_D import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.server.accessibility.AccessibilityManagerService.ACTION_LAUNCH_HEARING_DEVICES_DIALOG; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -68,6 +69,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.LocaleList; import android.os.RemoteException; import android.os.UserHandle; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; Loading Loading @@ -223,6 +225,8 @@ public class AccessibilityManagerServiceTest { mMockMagnificationConnectionManager); when(mMockMagnificationController.getFullScreenMagnificationController()).thenReturn( mMockFullScreenMagnificationController); when(mMockMagnificationController.isFullScreenMagnificationControllerInitialized()) .thenReturn(true); when(mMockMagnificationController.supportWindowMagnification()).thenReturn(true); when(mMockWindowManagerService.getAccessibilityController()).thenReturn( mMockA11yController); Loading Loading @@ -569,6 +573,16 @@ public class AccessibilityManagerServiceTest { verify(mMockMagnificationController).setAlwaysOnMagnificationEnabled(eq(true)); } @Test @EnableFlags(FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER) public void testSetConnectionNull_borderFlagEnabled_unregisterFullScreenMagnification() throws RemoteException { mA11yms.setMagnificationConnection(null); verify(mMockFullScreenMagnificationController, atLeastOnce()).reset( /* displayId= */ anyInt(), /* animate= */ anyBoolean()); } @SmallTest @Test public void testOnClientChange_magnificationEnabledAndCapabilityAll_requestConnection() { Loading services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java +22 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.accessibilityservice.MagnificationConfig.MAGNIFICATION_MOD import static com.android.server.accessibility.magnification.FullScreenMagnificationController.MagnificationInfoChangedCallback; import static com.android.server.accessibility.magnification.MockMagnificationConnection.TEST_DISPLAY; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; Loading Loading @@ -139,6 +140,8 @@ public class FullScreenMagnificationControllerTest { private final TimeAnimator mMockTimeAnimator = mock(TimeAnimator.class); private boolean mMockMagnificationConnectionState; FullScreenMagnificationController mFullScreenMagnificationController; public DisplayManagerInternal mDisplayManagerInternalMock = mock(DisplayManagerInternal.class); Loading Loading @@ -175,6 +178,8 @@ public class FullScreenMagnificationControllerTest { mScaleProvider = new MagnificationScaleProvider(mMockContext); // Assume the connection is established by default mMockMagnificationConnectionState = true; mFullScreenMagnificationController = new FullScreenMagnificationController( mMockControllerCtx, Loading @@ -184,7 +189,8 @@ public class FullScreenMagnificationControllerTest { () -> mMockThumbnail, ConcurrentUtils.DIRECT_EXECUTOR, () -> mMockScroller, () -> mMockTimeAnimator); () -> mMockTimeAnimator, () -> mMockMagnificationConnectionState); } @After Loading @@ -196,7 +202,6 @@ public class FullScreenMagnificationControllerTest { CURRENT_USER_ID); } @Test public void testRegister_WindowManagerAndContextRegisterListeners() { register(DISPLAY_0); Loading Loading @@ -290,6 +295,21 @@ public class FullScreenMagnificationControllerTest { mFullScreenMagnificationController.unregister(displayId); } @Test @RequiresFlagsEnabled(FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER) public void testSetScale_noConnection_doNothing() { register(TEST_DISPLAY); // Assume that the connection does not exist. mMockMagnificationConnectionState = false; final float scale = 2.0f; final PointF center = INITIAL_MAGNIFICATION_BOUNDS_CENTER; assertFalse(mFullScreenMagnificationController .setScale(TEST_DISPLAY, scale, center.x, center.y, false, SERVICE_ID_1)); assertFalse(mFullScreenMagnificationController.isActivated(TEST_DISPLAY)); } @Test public void testSetScale_noAnimation_shouldGoStraightToWindowManagerAndUpdateState() { for (int i = 0; i < DISPLAY_COUNT; i++) { Loading Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +14 −0 Original line number Diff line number Diff line Loading @@ -4623,6 +4623,20 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub android.Manifest.permission.STATUS_BAR_SERVICE); getMagnificationConnectionManager().setConnection(connection); if (com.android.window.flags.Flags.alwaysDrawMagnificationFullscreenBorder() && connection == null && mMagnificationController.isFullScreenMagnificationControllerInitialized()) { // Since the connection does not exist, the system ui cannot provide the border // implementation for fullscreen magnification. So we call reset to deactivate the // fullscreen magnification to prevent the magnified but no border situation. final ArrayList<Display> displays = getValidDisplayList(); for (int i = 0; i < displays.size(); i++) { final Display display = displays.get(i); getMagnificationController().getFullScreenMagnificationController() .reset(display.getDisplayId(), false); } } } /** Loading
services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java +14 −3 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ public class FullScreenMagnificationController implements private final MagnificationThumbnailFeatureFlag mMagnificationThumbnailFeatureFlag; @NonNull private final Supplier<MagnificationThumbnail> mThumbnailSupplier; @NonNull private final Supplier<Boolean> mMagnificationConnectionStateSupplier; /** * This class implements {@link WindowManagerInternal.MagnificationCallbacks} and holds Loading Loading @@ -682,6 +683,12 @@ public class FullScreenMagnificationController implements if (!mRegistered) { return false; } // If the border implementation is on system ui side but the connection is not // established, the fullscreen magnification should not work. if (com.android.window.flags.Flags.alwaysDrawMagnificationFullscreenBorder() && !mMagnificationConnectionStateSupplier.get()) { return false; } if (DEBUG) { Slog.i(LOG_TAG, "setScaleAndCenterLocked(scale = " + scale + ", centerX = " + centerX Loading Loading @@ -941,7 +948,8 @@ public class FullScreenMagnificationController implements @NonNull AccessibilityTraceManager traceManager, @NonNull Object lock, @NonNull MagnificationInfoChangedCallback magnificationInfoChangedCallback, @NonNull MagnificationScaleProvider scaleProvider, @NonNull Executor backgroundExecutor) { @NonNull Executor backgroundExecutor, @NonNull Supplier<Boolean> magnificationConnectionStateSupplier) { this( new ControllerContext( context, Loading @@ -955,7 +963,8 @@ public class FullScreenMagnificationController implements /* thumbnailSupplier= */ null, backgroundExecutor, () -> new Scroller(context), TimeAnimator::new); TimeAnimator::new, magnificationConnectionStateSupplier); } /** Constructor for tests */ Loading @@ -968,11 +977,13 @@ public class FullScreenMagnificationController implements Supplier<MagnificationThumbnail> thumbnailSupplier, @NonNull Executor backgroundExecutor, Supplier<Scroller> scrollerSupplier, Supplier<TimeAnimator> timeAnimatorSupplier) { Supplier<TimeAnimator> timeAnimatorSupplier, @NonNull Supplier<Boolean> magnificationConnectionStateSupplier) { mControllerCtx = ctx; mLock = lock; mScrollerSupplier = scrollerSupplier; mTimeAnimatorSupplier = timeAnimatorSupplier; mMagnificationConnectionStateSupplier = magnificationConnectionStateSupplier; mMainThreadId = mControllerCtx.getContext().getMainLooper().getThread().getId(); mScreenStateObserver = new ScreenStateObserver(mControllerCtx.getContext(), this); addInfoChangedCallback(magnificationInfoChangedCallback); Loading
services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +9 −1 Original line number Diff line number Diff line Loading @@ -798,7 +798,9 @@ public class MagnificationController implements MagnificationConnectionManager.C mLock, this, mScaleProvider, mBackgroundExecutor mBackgroundExecutor, () -> (isMagnificationConnectionManagerInitialized() && getMagnificationConnectionManager().isConnected()) ); } } Loading Loading @@ -831,6 +833,12 @@ public class MagnificationController implements MagnificationConnectionManager.C } } private boolean isMagnificationConnectionManagerInitialized() { synchronized (mLock) { return mMagnificationConnectionManager != null; } } private @Nullable PointF getCurrentMagnificationCenterLocked(int displayId, int targetMode) { if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) { if (mMagnificationConnectionManager == null Loading
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +14 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.accessibility.Flags.FLAG_SKIP_ACCESSIBILITY_WARNING_D import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.server.accessibility.AccessibilityManagerService.ACTION_LAUNCH_HEARING_DEVICES_DIALOG; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -68,6 +69,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.LocaleList; import android.os.RemoteException; import android.os.UserHandle; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; Loading Loading @@ -223,6 +225,8 @@ public class AccessibilityManagerServiceTest { mMockMagnificationConnectionManager); when(mMockMagnificationController.getFullScreenMagnificationController()).thenReturn( mMockFullScreenMagnificationController); when(mMockMagnificationController.isFullScreenMagnificationControllerInitialized()) .thenReturn(true); when(mMockMagnificationController.supportWindowMagnification()).thenReturn(true); when(mMockWindowManagerService.getAccessibilityController()).thenReturn( mMockA11yController); Loading Loading @@ -569,6 +573,16 @@ public class AccessibilityManagerServiceTest { verify(mMockMagnificationController).setAlwaysOnMagnificationEnabled(eq(true)); } @Test @EnableFlags(FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER) public void testSetConnectionNull_borderFlagEnabled_unregisterFullScreenMagnification() throws RemoteException { mA11yms.setMagnificationConnection(null); verify(mMockFullScreenMagnificationController, atLeastOnce()).reset( /* displayId= */ anyInt(), /* animate= */ anyBoolean()); } @SmallTest @Test public void testOnClientChange_magnificationEnabledAndCapabilityAll_requestConnection() { Loading
services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java +22 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.accessibilityservice.MagnificationConfig.MAGNIFICATION_MOD import static com.android.server.accessibility.magnification.FullScreenMagnificationController.MagnificationInfoChangedCallback; import static com.android.server.accessibility.magnification.MockMagnificationConnection.TEST_DISPLAY; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; Loading Loading @@ -139,6 +140,8 @@ public class FullScreenMagnificationControllerTest { private final TimeAnimator mMockTimeAnimator = mock(TimeAnimator.class); private boolean mMockMagnificationConnectionState; FullScreenMagnificationController mFullScreenMagnificationController; public DisplayManagerInternal mDisplayManagerInternalMock = mock(DisplayManagerInternal.class); Loading Loading @@ -175,6 +178,8 @@ public class FullScreenMagnificationControllerTest { mScaleProvider = new MagnificationScaleProvider(mMockContext); // Assume the connection is established by default mMockMagnificationConnectionState = true; mFullScreenMagnificationController = new FullScreenMagnificationController( mMockControllerCtx, Loading @@ -184,7 +189,8 @@ public class FullScreenMagnificationControllerTest { () -> mMockThumbnail, ConcurrentUtils.DIRECT_EXECUTOR, () -> mMockScroller, () -> mMockTimeAnimator); () -> mMockTimeAnimator, () -> mMockMagnificationConnectionState); } @After Loading @@ -196,7 +202,6 @@ public class FullScreenMagnificationControllerTest { CURRENT_USER_ID); } @Test public void testRegister_WindowManagerAndContextRegisterListeners() { register(DISPLAY_0); Loading Loading @@ -290,6 +295,21 @@ public class FullScreenMagnificationControllerTest { mFullScreenMagnificationController.unregister(displayId); } @Test @RequiresFlagsEnabled(FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER) public void testSetScale_noConnection_doNothing() { register(TEST_DISPLAY); // Assume that the connection does not exist. mMockMagnificationConnectionState = false; final float scale = 2.0f; final PointF center = INITIAL_MAGNIFICATION_BOUNDS_CENTER; assertFalse(mFullScreenMagnificationController .setScale(TEST_DISPLAY, scale, center.x, center.y, false, SERVICE_ID_1)); assertFalse(mFullScreenMagnificationController.isActivated(TEST_DISPLAY)); } @Test public void testSetScale_noAnimation_shouldGoStraightToWindowManagerAndUpdateState() { for (int i = 0; i < DISPLAY_COUNT; i++) { Loading