From 07167fa05fe6516ad6860503ae3cccbeb91953a7 Mon Sep 17 00:00:00 2001 From: mincheli Date: Thu, 19 Aug 2021 16:25:44 +0800 Subject: [PATCH] Requests window magnifoication connection if any AccessibilityServiceConnection is able to control magnification It is preliminary change for AccessibilityService to control window magnifier. The window magnification connectation needs a little time to be established. To make the connection ready before AccessibilityService requests to control window magnifier, we request the connection earlier when any of AccessibilityServiceConnection is able to control magnification. Doc: go/a11yservice_control_magnification_in_t Bug: 197191895 Test: atest AccessibilityManagerServiceTest Change-Id: I90786aa1f94013a29b9713c69c76d2442b0cb866 --- .../AccessibilityManagerService.java | 10 ++++- .../AccessibilityManagerServiceTest.java | 38 +++++++++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index aff7eb2274e52..8205d3579b3b9 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2575,7 +2575,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final boolean connect = (userState.isShortcutMagnificationEnabledLocked() || userState.isDisplayMagnificationEnabledLocked()) && (userState.getMagnificationCapabilitiesLocked() - != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) + || userHasMagnificationServicesLocked(userState); getWindowMagnificationMgr().requestConnection(connect); } @@ -3564,7 +3565,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } - ArrayList getValidDisplayList() { + /** + * Gets all currently valid logical displays. + * + * @return An array list containing all valid logical displays. + */ + public ArrayList getValidDisplayList() { synchronized (mLock) { return mDisplaysList; } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java index 2a5bb18ae4288..b1da890a87517 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java @@ -16,7 +16,10 @@ package com.android.server.accessibility; +import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; + import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -38,7 +41,6 @@ import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.graphics.drawable.Icon; import android.os.IBinder; -import android.os.UserHandle; import android.provider.Settings; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; @@ -51,6 +53,7 @@ import com.android.server.accessibility.AccessibilityManagerService.Accessibilit 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.pm.UserManagerInternal; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerInternal; @@ -92,6 +95,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { @Mock private AccessibilityWindowManager mMockA11yWindowManager; @Mock private AccessibilityDisplayListener mMockA11yDisplayListener; @Mock private ActivityTaskManagerInternal mMockActivityTaskManagerInternal; + @Mock private UserManagerInternal mMockUserManagerInternal; @Mock private IBinder mMockBinder; @Mock private IAccessibilityServiceClient mMockServiceClient; @Mock private WindowMagnificationManager mMockWindowMagnificationMgr; @@ -109,16 +113,20 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { MockitoAnnotations.initMocks(this); LocalServices.removeServiceForTest(WindowManagerInternal.class); LocalServices.removeServiceForTest(ActivityTaskManagerInternal.class); + LocalServices.removeServiceForTest(UserManagerInternal.class); LocalServices.addService( WindowManagerInternal.class, mMockWindowManagerService); LocalServices.addService( ActivityTaskManagerInternal.class, mMockActivityTaskManagerInternal); + LocalServices.addService( + UserManagerInternal.class, mMockUserManagerInternal); when(mMockMagnificationController.getWindowMagnificationMgr()).thenReturn( mMockWindowMagnificationMgr); when(mMockWindowManagerService.getAccessibilityController()).thenReturn( mMockA11yController); when(mMockA11yController.isAccessibilityTracingEnabled()).thenReturn(false); + when(mMockUserManagerInternal.isUserUnlockingOrUnlocked(anyInt())).thenReturn(true); mA11yms = new AccessibilityManagerService( InstrumentationRegistry.getContext(), mMockPackageManager, @@ -131,16 +139,15 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { mMockResources = mock(Resources.class); when(mMockContext.getResources()).thenReturn(mMockResources); - final AccessibilityUserState userState = new AccessibilityUserState( + mUserState = new AccessibilityUserState( mA11yms.getCurrentUserIdLocked(), mMockContext, mA11yms); - mA11yms.mUserStates.put(mA11yms.getCurrentUserIdLocked(), userState); + mA11yms.mUserStates.put(mA11yms.getCurrentUserIdLocked(), mUserState); } private void setupAccessibilityServiceConnection() { when(mMockContext.getSystemService(Context.DISPLAY_SERVICE)).thenReturn( InstrumentationRegistry.getContext().getSystemService( Context.DISPLAY_SERVICE)); - mUserState = new AccessibilityUserState(UserHandle.USER_SYSTEM, mMockContext, mA11yms); when(mMockServiceInfo.getResolveInfo()).thenReturn(mMockResolveInfo); mMockResolveInfo.serviceInfo = mock(ServiceInfo.class); @@ -226,4 +233,27 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase { assertEquals(Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, userState.getMagnificationModeLocked()); } + + @SmallTest + public void testOnClientChange_magnificationEnabledAndCapabilityAll_requestConnection() { + mUserState.mAccessibilityShortcutKeyTargets.add(MAGNIFICATION_CONTROLLER_NAME); + mUserState.setMagnificationCapabilitiesLocked( + Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL); + + // Invokes client change to trigger onUserStateChanged. + mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false); + + verify(mMockWindowMagnificationMgr).requestConnection(true); + } + + @SmallTest + public void testOnClientChange_boundServiceCanControlMagnification_requestConnection() { + setupAccessibilityServiceConnection(); + when(mMockSecurityPolicy.canControlMagnification(any())).thenReturn(true); + + // Invokes client change to trigger onUserStateChanged. + mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false); + + verify(mMockWindowMagnificationMgr).requestConnection(true); + } }