Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +14 −35 Original line number Diff line number Diff line Loading @@ -119,8 +119,8 @@ import com.android.internal.util.IntPair; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.accessibility.magnification.FullScreenMagnificationController; import com.android.server.accessibility.magnification.MagnificationController; import com.android.server.accessibility.magnification.MagnificationGestureHandler; import com.android.server.accessibility.magnification.MagnificationTransitionController; import com.android.server.accessibility.magnification.WindowMagnificationManager; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerInternal; Loading Loading @@ -219,16 +219,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub // Lazily initialized - access through getSystemActionPerfomer() private SystemActionPerformer mSystemActionPerformer; private FullScreenMagnificationController mFullScreenMagnificationController; private InteractionBridge mInteractionBridge; private AlertDialog mEnableTouchExplorationDialog; private AccessibilityInputFilter mInputFilter; private WindowMagnificationManager mWindowMagnificationMgr; private boolean mHasInputFilter; private KeyEventDispatcher mKeyEventDispatcher; Loading Loading @@ -259,7 +255,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private Point mTempPoint = new Point(); private boolean mIsAccessibilityButtonShown; private MagnificationTransitionController mMagnificationTransitionController; private MagnificationController mMagnificationController; private AccessibilityUserState getCurrentUserStateLocked() { return getUserStateLocked(mCurrentUserId); Loading Loading @@ -292,7 +288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub SystemActionPerformer systemActionPerformer, AccessibilityWindowManager a11yWindowManager, AccessibilityDisplayListener a11yDisplayListener, WindowMagnificationManager windowMagnificationMgr) { MagnificationController magnificationController) { mContext = context; mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mWindowManagerService = LocalServices.getService(WindowManagerInternal.class); Loading @@ -303,8 +299,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mSystemActionPerformer = systemActionPerformer; mA11yWindowManager = a11yWindowManager; mA11yDisplayListener = a11yDisplayListener; mWindowMagnificationMgr = windowMagnificationMgr; mMagnificationTransitionController = new MagnificationTransitionController(this, mLock); mMagnificationController = magnificationController; init(); } Loading @@ -324,7 +319,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler, mWindowManagerService, this, mSecurityPolicy, this); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); mMagnificationTransitionController = new MagnificationTransitionController(this, mLock); mMagnificationController = new MagnificationController(this, mLock, mContext); init(); } Loading Loading @@ -1195,9 +1190,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub // The user changed. mCurrentUserId = userId; if (mWindowMagnificationMgr != null) { mWindowMagnificationMgr.setUserId(mCurrentUserId); } mMagnificationController.updateUserIdIfNeeded(mCurrentUserId); AccessibilityUserState userState = getCurrentUserStateLocked(); readConfigurationForUserStateLocked(userState); Loading Loading @@ -1554,7 +1547,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (fallBackMagnificationModeSettingsLocked(userState)) { return; } mMagnificationTransitionController.transitionMagnificationModeLocked( mMagnificationController.transitionMagnificationModeLocked( Display.DEFAULT_DISPLAY, userState.getMagnificationModeLocked(), this::onMagnificationTransitionEndedLocked); } Loading Loading @@ -2310,13 +2303,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return; } if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.setUserId(userState.mUserId); } if (mUiAutomationManager.suppressingAccessibilityServicesLocked() && mFullScreenMagnificationController != null) { mFullScreenMagnificationController.unregisterAll(); && mMagnificationController.isFullScreenMagnificationControllerInitialized()) { getFullScreenMagnificationController().unregisterAll(); return; } Loading @@ -2339,8 +2328,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final int displayId = display.getDisplayId(); if (userHasListeningMagnificationServicesLocked(userState, displayId)) { getFullScreenMagnificationController().register(displayId); } else if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.unregister(displayId); } else if (mMagnificationController.isFullScreenMagnificationControllerInitialized()) { getFullScreenMagnificationController().unregister(displayId); } } } Loading Loading @@ -2990,10 +2979,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub */ public WindowMagnificationManager getWindowMagnificationMgr() { synchronized (mLock) { if (mWindowMagnificationMgr == null) { mWindowMagnificationMgr = new WindowMagnificationManager(mContext, mCurrentUserId); } return mWindowMagnificationMgr; return mMagnificationController.getWindowMagnificationMgr(); } } Loading Loading @@ -3060,12 +3046,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub @Override public FullScreenMagnificationController getFullScreenMagnificationController() { synchronized (mLock) { if (mFullScreenMagnificationController == null) { mFullScreenMagnificationController = new FullScreenMagnificationController(mContext, this, mLock); mFullScreenMagnificationController.setUserId(mCurrentUserId); } return mFullScreenMagnificationController; return mMagnificationController.getFullScreenMagnificationController(); } } Loading Loading @@ -3307,9 +3288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } } if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.onDisplayRemoved(displayId); } mMagnificationController.onDisplayRemoved(displayId); mA11yWindowManager.stopTrackingWindows(displayId); } Loading services/accessibility/java/com/android/server/accessibility/magnification/MagnificationTransitionController.java→services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +100 −18 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.Region; Loading @@ -29,21 +30,26 @@ import android.util.Slog; import android.util.SparseArray; import android.view.accessibility.MagnificationAnimationCallback; import com.android.internal.annotations.VisibleForTesting; import com.android.server.accessibility.AccessibilityManagerService; /** * Handles magnification mode transition. * Handles all magnification controllers initialization, generic interactions * and magnification mode transition. */ public class MagnificationTransitionController { public class MagnificationController { private static final boolean DEBUG = false; private static final String TAG = "MagnificationController"; private final AccessibilityManagerService mAms; private final PointF mTempPoint = new PointF(); private final Object mLock; private final Context mContext; private final SparseArray<DisableMagnificationCallback> mMagnificationEndRunnableSparseArray = new SparseArray(); private FullScreenMagnificationController mFullScreenMagnificationController; private WindowMagnificationManager mWindowMagnificationMgr; /** * A callback to inform the magnification transition result. Loading @@ -56,9 +62,20 @@ public class MagnificationTransitionController { void onResult(boolean success); } public MagnificationTransitionController(AccessibilityManagerService ams, Object lock) { public MagnificationController(AccessibilityManagerService ams, Object lock, Context context) { mAms = ams; mLock = lock; mContext = context; } @VisibleForTesting public MagnificationController(AccessibilityManagerService ams, Object lock, Context context, FullScreenMagnificationController fullScreenMagnificationController, WindowMagnificationManager windowMagnificationManager) { this(ams, lock, context); mFullScreenMagnificationController = fullScreenMagnificationController; mWindowMagnificationMgr = windowMagnificationManager; } /** Loading Loading @@ -97,7 +114,7 @@ public class MagnificationTransitionController { } final FullScreenMagnificationController screenMagnificationController = getFullScreenMagnificationController(); final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationManager(); final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr(); final float scale = windowMagnificationMgr.getPersistedScale(); final DisableMagnificationCallback animationEndCallback = new DisableMagnificationCallback(transitionCallBack, displayId, targetMode, Loading @@ -111,6 +128,39 @@ public class MagnificationTransitionController { setDisableMagnificationCallbackLocked(displayId, animationEndCallback); } /** * Updates the active user ID of {@link FullScreenMagnificationController} and {@link * WindowMagnificationManager}. * * @param userId the currently active user ID */ public void updateUserIdIfNeeded(int userId) { synchronized (mLock) { if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.setUserId(userId); } if (mWindowMagnificationMgr != null) { mWindowMagnificationMgr.setUserId(userId); } } } /** * Removes the magnification instance with given id. * * @param displayId The logical display id. */ public void onDisplayRemoved(int displayId) { synchronized (mLock) { if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.onDisplayRemoved(displayId); } if (mWindowMagnificationMgr != null) { mWindowMagnificationMgr.onDisplayRemoved(displayId); } } } private DisableMagnificationCallback getDisableMagnificationEndRunnableLocked( int displayId) { return mMagnificationEndRunnableSparseArray.get(displayId); Loading @@ -125,31 +175,63 @@ public class MagnificationTransitionController { } } private FullScreenMagnificationController getFullScreenMagnificationController() { return mAms.getFullScreenMagnificationController(); /** * Getter of {@link FullScreenMagnificationController}. * * @return {@link FullScreenMagnificationController}. */ public FullScreenMagnificationController getFullScreenMagnificationController() { synchronized (mLock) { if (mFullScreenMagnificationController == null) { mFullScreenMagnificationController = new FullScreenMagnificationController(mContext, mAms, mLock); mFullScreenMagnificationController.setUserId(mAms.getCurrentUserIdLocked()); } } return mFullScreenMagnificationController; } /** * Is {@link #mFullScreenMagnificationController} is initialized. * @return {code true} if {@link #mFullScreenMagnificationController} is initialized. */ public boolean isFullScreenMagnificationControllerInitialized() { synchronized (mLock) { return mFullScreenMagnificationController != null; } } private WindowMagnificationManager getWindowMagnificationManager() { return mAms.getWindowMagnificationMgr(); /** * Getter of {@link WindowMagnificationManager}. * * @return {@link WindowMagnificationManager}. */ public WindowMagnificationManager getWindowMagnificationMgr() { synchronized (mLock) { if (mWindowMagnificationMgr == null) { mWindowMagnificationMgr = new WindowMagnificationManager(mContext, mAms.getCurrentUserIdLocked()); } return mWindowMagnificationMgr; } } private @Nullable PointF getCurrentMagnificationBoundsCenterLocked(int displayId, int targetMode) { if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) { final WindowMagnificationManager magnificationManager = getWindowMagnificationManager(); if (!magnificationManager.isWindowMagnifierEnabled(displayId)) { if (mWindowMagnificationMgr == null || !mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId)) { return null; } mTempPoint.set(magnificationManager.getCenterX(displayId), magnificationManager.getCenterY(displayId)); mTempPoint.set(mWindowMagnificationMgr.getCenterX(displayId), mWindowMagnificationMgr.getCenterY(displayId)); } else { final FullScreenMagnificationController screenMagnificationController = getFullScreenMagnificationController(); if (!screenMagnificationController.isMagnifying(displayId)) { if (mFullScreenMagnificationController == null || !mFullScreenMagnificationController.isMagnifying(displayId)) { return null; } mTempPoint.set(screenMagnificationController.getCenterX(displayId), screenMagnificationController.getCenterY(displayId)); mTempPoint.set(mFullScreenMagnificationController.getCenterX(displayId), mFullScreenMagnificationController.getCenterY(displayId)); } return mTempPoint; } Loading Loading @@ -228,7 +310,7 @@ public class MagnificationTransitionController { mCurrentCenter.y, true, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); } else { getWindowMagnificationManager().enableWindowMagnification(mDisplayId, getWindowMagnificationMgr().enableWindowMagnification(mDisplayId, mCurrentScale, mCurrentCenter.x, mCurrentCenter.y); } Loading services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -452,6 +452,15 @@ public class WindowMagnificationManager implements return magnifier; } /** * Removes the window magnifier with given id. * * @param displayId The logical display id. */ void onDisplayRemoved(int displayId) { disableWindowMagnification(displayId, true); } private class ConnectionCallback extends IWindowMagnificationConnectionCallback.Stub implements IBinder.DeathRecipient { private boolean mExpiredDeathRecipient = false; Loading services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import androidx.test.InstrumentationRegistry; import com.android.server.LocalServices; import com.android.server.accessibility.AccessibilityManagerService.AccessibilityDisplayListener; import com.android.server.accessibility.magnification.MagnificationController; import com.android.server.accessibility.magnification.WindowMagnificationManager; import com.android.server.accessibility.test.MessageCapturingHandler; import com.android.server.wm.ActivityTaskManagerInternal; Loading Loading @@ -94,6 +95,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { @Mock private IBinder mMockBinder; @Mock private IAccessibilityServiceClient mMockServiceClient; @Mock private WindowMagnificationManager mMockWindowMagnificationMgr; @Mock private MagnificationController mMockMagnificationController; private AccessibilityUserState mUserState; private MessageCapturingHandler mHandler = new MessageCapturingHandler(null); Loading @@ -110,6 +112,8 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { LocalServices.addService( ActivityTaskManagerInternal.class, mMockActivityTaskManagerInternal); when(mMockMagnificationController.getWindowMagnificationMgr()).thenReturn( mMockWindowMagnificationMgr); mA11yms = new AccessibilityManagerService( InstrumentationRegistry.getContext(), mMockPackageManager, Loading @@ -117,7 +121,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { mMockSystemActionPerformer, mMockA11yWindowManager, mMockA11yDisplayListener, mMockWindowMagnificationMgr); mMockMagnificationController); final AccessibilityUserState userState = new AccessibilityUserState( mA11yms.getCurrentUserIdLocked(), mMockContext, mA11yms); Loading services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationTransitionControllerTest.java→services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +32 −18 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ import org.mockito.MockitoAnnotations; * Tests for MagnificationController. */ @RunWith(AndroidJUnit4.class) public class MagnificationTransitionControllerTest { public class MagnificationControllerTest { private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY; private static final Region MAGNIFICATION_REGION = new Region(0, 0, 500, 600); Loading @@ -75,7 +75,7 @@ public class MagnificationTransitionControllerTest { Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; @Mock private AccessibilityManagerService mService; @Mock private MagnificationTransitionController.TransitionCallBack mTransitionCallBack; @Mock private MagnificationController.TransitionCallBack mTransitionCallBack; @Mock private Context mContext; @Mock private FullScreenMagnificationController mScreenMagnificationController; @Captor private ArgumentCaptor<MagnificationAnimationCallback> mCallbackArgumentCaptor; Loading @@ -83,7 +83,7 @@ public class MagnificationTransitionControllerTest { private MockWindowMagnificationConnection mMockConnection; private WindowMagnificationManager mWindowMagnificationManager; private MockContentResolver mMockResolver; private MagnificationTransitionController mMagnificationTransitionController; private MagnificationController mMagnificationController; @Before public void setUp() throws Exception { Loading @@ -95,14 +95,12 @@ public class MagnificationTransitionControllerTest { Settings.Secure.putFloatForUser(mMockResolver, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, DEFAULT_SCALE, CURRENT_USER_ID); mWindowMagnificationManager = new WindowMagnificationManager(mContext, CURRENT_USER_ID); when(mService.getFullScreenMagnificationController()).thenReturn( mScreenMagnificationController); when(mService.getWindowMagnificationMgr()).thenReturn(mWindowMagnificationManager); mWindowMagnificationManager = Mockito.spy( new WindowMagnificationManager(mContext, CURRENT_USER_ID)); mMockConnection = new MockWindowMagnificationConnection(true); mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mMagnificationTransitionController = new MagnificationTransitionController(mService, new Object()); mMagnificationController = new MagnificationController(mService, new Object(), mContext, mScreenMagnificationController, mWindowMagnificationManager); } @After Loading @@ -113,7 +111,7 @@ public class MagnificationTransitionControllerTest { @Test public void transitionToWindowMode_notMagnifying_doNothing() throws RemoteException { setMagnificationModeSettings(MODE_FULLSCREEN); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); Loading @@ -130,7 +128,7 @@ public class MagnificationTransitionControllerTest { throws RemoteException { setMagnificationEnabled(MODE_FULLSCREEN); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); Loading @@ -147,11 +145,11 @@ public class MagnificationTransitionControllerTest { public void transitionToWindowMode_disablingWindowMode_enablingWindowWithFormerCenter() throws RemoteException { setMagnificationEnabled(MODE_WINDOW); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); Loading @@ -166,7 +164,7 @@ public class MagnificationTransitionControllerTest { throws RemoteException { setMagnificationEnabled(MODE_WINDOW); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); mMockConnection.invokeCallbacks(); Loading @@ -186,7 +184,7 @@ public class MagnificationTransitionControllerTest { magnificationBounds.bottom + 100); setMagnificationEnabled(MODE_WINDOW, magnifiedCenter.x, magnifiedCenter.y); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); mMockConnection.invokeCallbacks(); Loading @@ -202,11 +200,11 @@ public class MagnificationTransitionControllerTest { public void transitionToFullScreenMode_disablingFullScreen_enableFullScreenWithFormerCenter() throws RemoteException { setMagnificationEnabled(MODE_FULLSCREEN); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); Loading @@ -221,7 +219,7 @@ public class MagnificationTransitionControllerTest { public void interruptDuringTransitionToFullScreenMode_windowMagnifying_notifyTransitionFailed() throws RemoteException { setMagnificationEnabled(MODE_WINDOW); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); Loading @@ -237,7 +235,23 @@ public class MagnificationTransitionControllerTest { verify(mTransitionCallBack).onResult(false); } @Test public void onDisplayRemoved_notifyAllModules() { mMagnificationController.onDisplayRemoved(TEST_DISPLAY); verify(mScreenMagnificationController).onDisplayRemoved(TEST_DISPLAY); verify(mWindowMagnificationManager).onDisplayRemoved(TEST_DISPLAY); } @Test public void updateUserIdIfNeeded_AllModulesAvailable_setUserId() { mMagnificationController.updateUserIdIfNeeded(CURRENT_USER_ID); verify(mScreenMagnificationController).setUserId(CURRENT_USER_ID); verify(mWindowMagnificationManager).setUserId(CURRENT_USER_ID); } private void setMagnificationEnabled(int mode) throws RemoteException { setMagnificationEnabled(mode, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y); } Loading Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +14 −35 Original line number Diff line number Diff line Loading @@ -119,8 +119,8 @@ import com.android.internal.util.IntPair; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.accessibility.magnification.FullScreenMagnificationController; import com.android.server.accessibility.magnification.MagnificationController; import com.android.server.accessibility.magnification.MagnificationGestureHandler; import com.android.server.accessibility.magnification.MagnificationTransitionController; import com.android.server.accessibility.magnification.WindowMagnificationManager; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerInternal; Loading Loading @@ -219,16 +219,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub // Lazily initialized - access through getSystemActionPerfomer() private SystemActionPerformer mSystemActionPerformer; private FullScreenMagnificationController mFullScreenMagnificationController; private InteractionBridge mInteractionBridge; private AlertDialog mEnableTouchExplorationDialog; private AccessibilityInputFilter mInputFilter; private WindowMagnificationManager mWindowMagnificationMgr; private boolean mHasInputFilter; private KeyEventDispatcher mKeyEventDispatcher; Loading Loading @@ -259,7 +255,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private Point mTempPoint = new Point(); private boolean mIsAccessibilityButtonShown; private MagnificationTransitionController mMagnificationTransitionController; private MagnificationController mMagnificationController; private AccessibilityUserState getCurrentUserStateLocked() { return getUserStateLocked(mCurrentUserId); Loading Loading @@ -292,7 +288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub SystemActionPerformer systemActionPerformer, AccessibilityWindowManager a11yWindowManager, AccessibilityDisplayListener a11yDisplayListener, WindowMagnificationManager windowMagnificationMgr) { MagnificationController magnificationController) { mContext = context; mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mWindowManagerService = LocalServices.getService(WindowManagerInternal.class); Loading @@ -303,8 +299,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mSystemActionPerformer = systemActionPerformer; mA11yWindowManager = a11yWindowManager; mA11yDisplayListener = a11yDisplayListener; mWindowMagnificationMgr = windowMagnificationMgr; mMagnificationTransitionController = new MagnificationTransitionController(this, mLock); mMagnificationController = magnificationController; init(); } Loading @@ -324,7 +319,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler, mWindowManagerService, this, mSecurityPolicy, this); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); mMagnificationTransitionController = new MagnificationTransitionController(this, mLock); mMagnificationController = new MagnificationController(this, mLock, mContext); init(); } Loading Loading @@ -1195,9 +1190,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub // The user changed. mCurrentUserId = userId; if (mWindowMagnificationMgr != null) { mWindowMagnificationMgr.setUserId(mCurrentUserId); } mMagnificationController.updateUserIdIfNeeded(mCurrentUserId); AccessibilityUserState userState = getCurrentUserStateLocked(); readConfigurationForUserStateLocked(userState); Loading Loading @@ -1554,7 +1547,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (fallBackMagnificationModeSettingsLocked(userState)) { return; } mMagnificationTransitionController.transitionMagnificationModeLocked( mMagnificationController.transitionMagnificationModeLocked( Display.DEFAULT_DISPLAY, userState.getMagnificationModeLocked(), this::onMagnificationTransitionEndedLocked); } Loading Loading @@ -2310,13 +2303,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return; } if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.setUserId(userState.mUserId); } if (mUiAutomationManager.suppressingAccessibilityServicesLocked() && mFullScreenMagnificationController != null) { mFullScreenMagnificationController.unregisterAll(); && mMagnificationController.isFullScreenMagnificationControllerInitialized()) { getFullScreenMagnificationController().unregisterAll(); return; } Loading @@ -2339,8 +2328,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final int displayId = display.getDisplayId(); if (userHasListeningMagnificationServicesLocked(userState, displayId)) { getFullScreenMagnificationController().register(displayId); } else if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.unregister(displayId); } else if (mMagnificationController.isFullScreenMagnificationControllerInitialized()) { getFullScreenMagnificationController().unregister(displayId); } } } Loading Loading @@ -2990,10 +2979,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub */ public WindowMagnificationManager getWindowMagnificationMgr() { synchronized (mLock) { if (mWindowMagnificationMgr == null) { mWindowMagnificationMgr = new WindowMagnificationManager(mContext, mCurrentUserId); } return mWindowMagnificationMgr; return mMagnificationController.getWindowMagnificationMgr(); } } Loading Loading @@ -3060,12 +3046,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub @Override public FullScreenMagnificationController getFullScreenMagnificationController() { synchronized (mLock) { if (mFullScreenMagnificationController == null) { mFullScreenMagnificationController = new FullScreenMagnificationController(mContext, this, mLock); mFullScreenMagnificationController.setUserId(mCurrentUserId); } return mFullScreenMagnificationController; return mMagnificationController.getFullScreenMagnificationController(); } } Loading Loading @@ -3307,9 +3288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } } if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.onDisplayRemoved(displayId); } mMagnificationController.onDisplayRemoved(displayId); mA11yWindowManager.stopTrackingWindows(displayId); } Loading
services/accessibility/java/com/android/server/accessibility/magnification/MagnificationTransitionController.java→services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +100 −18 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.Region; Loading @@ -29,21 +30,26 @@ import android.util.Slog; import android.util.SparseArray; import android.view.accessibility.MagnificationAnimationCallback; import com.android.internal.annotations.VisibleForTesting; import com.android.server.accessibility.AccessibilityManagerService; /** * Handles magnification mode transition. * Handles all magnification controllers initialization, generic interactions * and magnification mode transition. */ public class MagnificationTransitionController { public class MagnificationController { private static final boolean DEBUG = false; private static final String TAG = "MagnificationController"; private final AccessibilityManagerService mAms; private final PointF mTempPoint = new PointF(); private final Object mLock; private final Context mContext; private final SparseArray<DisableMagnificationCallback> mMagnificationEndRunnableSparseArray = new SparseArray(); private FullScreenMagnificationController mFullScreenMagnificationController; private WindowMagnificationManager mWindowMagnificationMgr; /** * A callback to inform the magnification transition result. Loading @@ -56,9 +62,20 @@ public class MagnificationTransitionController { void onResult(boolean success); } public MagnificationTransitionController(AccessibilityManagerService ams, Object lock) { public MagnificationController(AccessibilityManagerService ams, Object lock, Context context) { mAms = ams; mLock = lock; mContext = context; } @VisibleForTesting public MagnificationController(AccessibilityManagerService ams, Object lock, Context context, FullScreenMagnificationController fullScreenMagnificationController, WindowMagnificationManager windowMagnificationManager) { this(ams, lock, context); mFullScreenMagnificationController = fullScreenMagnificationController; mWindowMagnificationMgr = windowMagnificationManager; } /** Loading Loading @@ -97,7 +114,7 @@ public class MagnificationTransitionController { } final FullScreenMagnificationController screenMagnificationController = getFullScreenMagnificationController(); final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationManager(); final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr(); final float scale = windowMagnificationMgr.getPersistedScale(); final DisableMagnificationCallback animationEndCallback = new DisableMagnificationCallback(transitionCallBack, displayId, targetMode, Loading @@ -111,6 +128,39 @@ public class MagnificationTransitionController { setDisableMagnificationCallbackLocked(displayId, animationEndCallback); } /** * Updates the active user ID of {@link FullScreenMagnificationController} and {@link * WindowMagnificationManager}. * * @param userId the currently active user ID */ public void updateUserIdIfNeeded(int userId) { synchronized (mLock) { if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.setUserId(userId); } if (mWindowMagnificationMgr != null) { mWindowMagnificationMgr.setUserId(userId); } } } /** * Removes the magnification instance with given id. * * @param displayId The logical display id. */ public void onDisplayRemoved(int displayId) { synchronized (mLock) { if (mFullScreenMagnificationController != null) { mFullScreenMagnificationController.onDisplayRemoved(displayId); } if (mWindowMagnificationMgr != null) { mWindowMagnificationMgr.onDisplayRemoved(displayId); } } } private DisableMagnificationCallback getDisableMagnificationEndRunnableLocked( int displayId) { return mMagnificationEndRunnableSparseArray.get(displayId); Loading @@ -125,31 +175,63 @@ public class MagnificationTransitionController { } } private FullScreenMagnificationController getFullScreenMagnificationController() { return mAms.getFullScreenMagnificationController(); /** * Getter of {@link FullScreenMagnificationController}. * * @return {@link FullScreenMagnificationController}. */ public FullScreenMagnificationController getFullScreenMagnificationController() { synchronized (mLock) { if (mFullScreenMagnificationController == null) { mFullScreenMagnificationController = new FullScreenMagnificationController(mContext, mAms, mLock); mFullScreenMagnificationController.setUserId(mAms.getCurrentUserIdLocked()); } } return mFullScreenMagnificationController; } /** * Is {@link #mFullScreenMagnificationController} is initialized. * @return {code true} if {@link #mFullScreenMagnificationController} is initialized. */ public boolean isFullScreenMagnificationControllerInitialized() { synchronized (mLock) { return mFullScreenMagnificationController != null; } } private WindowMagnificationManager getWindowMagnificationManager() { return mAms.getWindowMagnificationMgr(); /** * Getter of {@link WindowMagnificationManager}. * * @return {@link WindowMagnificationManager}. */ public WindowMagnificationManager getWindowMagnificationMgr() { synchronized (mLock) { if (mWindowMagnificationMgr == null) { mWindowMagnificationMgr = new WindowMagnificationManager(mContext, mAms.getCurrentUserIdLocked()); } return mWindowMagnificationMgr; } } private @Nullable PointF getCurrentMagnificationBoundsCenterLocked(int displayId, int targetMode) { if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) { final WindowMagnificationManager magnificationManager = getWindowMagnificationManager(); if (!magnificationManager.isWindowMagnifierEnabled(displayId)) { if (mWindowMagnificationMgr == null || !mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId)) { return null; } mTempPoint.set(magnificationManager.getCenterX(displayId), magnificationManager.getCenterY(displayId)); mTempPoint.set(mWindowMagnificationMgr.getCenterX(displayId), mWindowMagnificationMgr.getCenterY(displayId)); } else { final FullScreenMagnificationController screenMagnificationController = getFullScreenMagnificationController(); if (!screenMagnificationController.isMagnifying(displayId)) { if (mFullScreenMagnificationController == null || !mFullScreenMagnificationController.isMagnifying(displayId)) { return null; } mTempPoint.set(screenMagnificationController.getCenterX(displayId), screenMagnificationController.getCenterY(displayId)); mTempPoint.set(mFullScreenMagnificationController.getCenterX(displayId), mFullScreenMagnificationController.getCenterY(displayId)); } return mTempPoint; } Loading Loading @@ -228,7 +310,7 @@ public class MagnificationTransitionController { mCurrentCenter.y, true, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); } else { getWindowMagnificationManager().enableWindowMagnification(mDisplayId, getWindowMagnificationMgr().enableWindowMagnification(mDisplayId, mCurrentScale, mCurrentCenter.x, mCurrentCenter.y); } Loading
services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -452,6 +452,15 @@ public class WindowMagnificationManager implements return magnifier; } /** * Removes the window magnifier with given id. * * @param displayId The logical display id. */ void onDisplayRemoved(int displayId) { disableWindowMagnification(displayId, true); } private class ConnectionCallback extends IWindowMagnificationConnectionCallback.Stub implements IBinder.DeathRecipient { private boolean mExpiredDeathRecipient = false; Loading
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import androidx.test.InstrumentationRegistry; import com.android.server.LocalServices; import com.android.server.accessibility.AccessibilityManagerService.AccessibilityDisplayListener; import com.android.server.accessibility.magnification.MagnificationController; import com.android.server.accessibility.magnification.WindowMagnificationManager; import com.android.server.accessibility.test.MessageCapturingHandler; import com.android.server.wm.ActivityTaskManagerInternal; Loading Loading @@ -94,6 +95,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { @Mock private IBinder mMockBinder; @Mock private IAccessibilityServiceClient mMockServiceClient; @Mock private WindowMagnificationManager mMockWindowMagnificationMgr; @Mock private MagnificationController mMockMagnificationController; private AccessibilityUserState mUserState; private MessageCapturingHandler mHandler = new MessageCapturingHandler(null); Loading @@ -110,6 +112,8 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { LocalServices.addService( ActivityTaskManagerInternal.class, mMockActivityTaskManagerInternal); when(mMockMagnificationController.getWindowMagnificationMgr()).thenReturn( mMockWindowMagnificationMgr); mA11yms = new AccessibilityManagerService( InstrumentationRegistry.getContext(), mMockPackageManager, Loading @@ -117,7 +121,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { mMockSystemActionPerformer, mMockA11yWindowManager, mMockA11yDisplayListener, mMockWindowMagnificationMgr); mMockMagnificationController); final AccessibilityUserState userState = new AccessibilityUserState( mA11yms.getCurrentUserIdLocked(), mMockContext, mA11yms); Loading
services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationTransitionControllerTest.java→services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +32 −18 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ import org.mockito.MockitoAnnotations; * Tests for MagnificationController. */ @RunWith(AndroidJUnit4.class) public class MagnificationTransitionControllerTest { public class MagnificationControllerTest { private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY; private static final Region MAGNIFICATION_REGION = new Region(0, 0, 500, 600); Loading @@ -75,7 +75,7 @@ public class MagnificationTransitionControllerTest { Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; @Mock private AccessibilityManagerService mService; @Mock private MagnificationTransitionController.TransitionCallBack mTransitionCallBack; @Mock private MagnificationController.TransitionCallBack mTransitionCallBack; @Mock private Context mContext; @Mock private FullScreenMagnificationController mScreenMagnificationController; @Captor private ArgumentCaptor<MagnificationAnimationCallback> mCallbackArgumentCaptor; Loading @@ -83,7 +83,7 @@ public class MagnificationTransitionControllerTest { private MockWindowMagnificationConnection mMockConnection; private WindowMagnificationManager mWindowMagnificationManager; private MockContentResolver mMockResolver; private MagnificationTransitionController mMagnificationTransitionController; private MagnificationController mMagnificationController; @Before public void setUp() throws Exception { Loading @@ -95,14 +95,12 @@ public class MagnificationTransitionControllerTest { Settings.Secure.putFloatForUser(mMockResolver, Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, DEFAULT_SCALE, CURRENT_USER_ID); mWindowMagnificationManager = new WindowMagnificationManager(mContext, CURRENT_USER_ID); when(mService.getFullScreenMagnificationController()).thenReturn( mScreenMagnificationController); when(mService.getWindowMagnificationMgr()).thenReturn(mWindowMagnificationManager); mWindowMagnificationManager = Mockito.spy( new WindowMagnificationManager(mContext, CURRENT_USER_ID)); mMockConnection = new MockWindowMagnificationConnection(true); mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mMagnificationTransitionController = new MagnificationTransitionController(mService, new Object()); mMagnificationController = new MagnificationController(mService, new Object(), mContext, mScreenMagnificationController, mWindowMagnificationManager); } @After Loading @@ -113,7 +111,7 @@ public class MagnificationTransitionControllerTest { @Test public void transitionToWindowMode_notMagnifying_doNothing() throws RemoteException { setMagnificationModeSettings(MODE_FULLSCREEN); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); Loading @@ -130,7 +128,7 @@ public class MagnificationTransitionControllerTest { throws RemoteException { setMagnificationEnabled(MODE_FULLSCREEN); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); Loading @@ -147,11 +145,11 @@ public class MagnificationTransitionControllerTest { public void transitionToWindowMode_disablingWindowMode_enablingWindowWithFormerCenter() throws RemoteException { setMagnificationEnabled(MODE_WINDOW); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); Loading @@ -166,7 +164,7 @@ public class MagnificationTransitionControllerTest { throws RemoteException { setMagnificationEnabled(MODE_WINDOW); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); mMockConnection.invokeCallbacks(); Loading @@ -186,7 +184,7 @@ public class MagnificationTransitionControllerTest { magnificationBounds.bottom + 100); setMagnificationEnabled(MODE_WINDOW, magnifiedCenter.x, magnifiedCenter.y); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); mMockConnection.invokeCallbacks(); Loading @@ -202,11 +200,11 @@ public class MagnificationTransitionControllerTest { public void transitionToFullScreenMode_disablingFullScreen_enableFullScreenWithFormerCenter() throws RemoteException { setMagnificationEnabled(MODE_FULLSCREEN); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_WINDOW, mTransitionCallBack); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); Loading @@ -221,7 +219,7 @@ public class MagnificationTransitionControllerTest { public void interruptDuringTransitionToFullScreenMode_windowMagnifying_notifyTransitionFailed() throws RemoteException { setMagnificationEnabled(MODE_WINDOW); mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY, mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY, MODE_FULLSCREEN, mTransitionCallBack); Loading @@ -237,7 +235,23 @@ public class MagnificationTransitionControllerTest { verify(mTransitionCallBack).onResult(false); } @Test public void onDisplayRemoved_notifyAllModules() { mMagnificationController.onDisplayRemoved(TEST_DISPLAY); verify(mScreenMagnificationController).onDisplayRemoved(TEST_DISPLAY); verify(mWindowMagnificationManager).onDisplayRemoved(TEST_DISPLAY); } @Test public void updateUserIdIfNeeded_AllModulesAvailable_setUserId() { mMagnificationController.updateUserIdIfNeeded(CURRENT_USER_ID); verify(mScreenMagnificationController).setUserId(CURRENT_USER_ID); verify(mWindowMagnificationManager).setUserId(CURRENT_USER_ID); } private void setMagnificationEnabled(int mode) throws RemoteException { setMagnificationEnabled(mode, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y); } Loading