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
This commit is contained in:
mincheli
2021-08-19 16:25:44 +08:00
committed by Minche Li
parent 6dc43a11fa
commit 07167fa05f
2 changed files with 42 additions and 6 deletions

View File

@@ -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<Display> getValidDisplayList() {
/**
* Gets all currently valid logical displays.
*
* @return An array list containing all valid logical displays.
*/
public ArrayList<Display> getValidDisplayList() {
synchronized (mLock) {
return mDisplaysList;
}

View File

@@ -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);
}
}