Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07167fa0 authored by mincheli's avatar mincheli Committed by Minche Li
Browse files

Requests window magnifoication connection if any...

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
parent 6dc43a11
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -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;
            }
+34 −4
Original line number Diff line number Diff line
@@ -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);
    }
}