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

Commit 8da0bd0a authored by Chun-Ku Lin's avatar Chun-Ku Lin
Browse files

Use correct user context to get the EnhancedConfirmationManager

Bug: 357768060
Bug: 363074042
Test: Download Accessibility Scanner from play store, verified I can
turn on the a11y service as a second user
Test: atest AccessibilityManagerServiceTest
Flag: EXEMPT low risk bugfix

Change-Id: I6e01179ae4af791070a359ebf3a4d9e7b80f6575
parent 6c8fbe78
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -4962,9 +4962,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                if (android.permission.flags.Flags.enhancedConfirmationModeApisEnabled()
                        && android.security.Flags.extendEcmToAllSettings()) {
                    try {
                        return !mContext.getSystemService(EnhancedConfirmationManager.class)
                                .isRestricted(packageName,
                        final EnhancedConfirmationManager userContextEcm =
                                mContext.createContextAsUser(UserHandle.of(userId), /* flags = */ 0)
                                        .getSystemService(EnhancedConfirmationManager.class);
                        if (userContextEcm != null) {
                            return !userContextEcm.isRestricted(packageName,
                                    AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE);
                        }
                        return false;
                    } catch (PackageManager.NameNotFoundException e) {
                        Log.e(LOG_TAG, "Exception when retrieving package:" + packageName, e);
                        return false;
+37 −0
Original line number Diff line number Diff line
@@ -63,8 +63,11 @@ import static org.mockito.Mockito.when;
import android.Manifest;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.annotation.NonNull;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.app.admin.DevicePolicyManager;
import android.app.ecm.EnhancedConfirmationManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -212,6 +215,7 @@ public class AccessibilityManagerServiceTest {
    @Mock private FullScreenMagnificationController mMockFullScreenMagnificationController;
    @Mock private ProxyManager mProxyManager;
    @Mock private StatusBarManagerInternal mStatusBarManagerInternal;
    @Mock private DevicePolicyManager mDevicePolicyManager;
    @Spy private IUserInitializationCompleteCallback mUserInitializationCompleteCallback;
    @Captor private ArgumentCaptor<Intent> mIntentArgumentCaptor;
    private IAccessibilityManager mA11yManagerServiceOnDevice;
@@ -241,6 +245,7 @@ public class AccessibilityManagerServiceTest {
                UserManagerInternal.class, mMockUserManagerInternal);
        LocalServices.addService(StatusBarManagerInternal.class, mStatusBarManagerInternal);
        mInputFilter = mock(FakeInputFilter.class);
        mTestableContext.addMockSystemService(DevicePolicyManager.class, mDevicePolicyManager);

        when(mMockMagnificationController.getMagnificationConnectionManager()).thenReturn(
                mMockMagnificationConnectionManager);
@@ -2160,6 +2165,24 @@ public class AccessibilityManagerServiceTest {
                .isEqualTo(SOFTWARE);
    }

    @Test
    @EnableFlags({android.permission.flags.Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED,
            android.security.Flags.FLAG_EXTEND_ECM_TO_ALL_SETTINGS})
    public void isAccessibilityTargetAllowed_nonSystemUserId_useEcmWithNonSystemUserId() {
        String fakePackageName = "FAKE_PACKAGE_NAME";
        int uid = 0; // uid is not used in the actual implementation when flags are on
        int userId = mTestableContext.getUserId() + 1234;
        when(mDevicePolicyManager.getPermittedAccessibilityServices(userId)).thenReturn(
                List.of(fakePackageName));
        Context mockUserContext = mock(Context.class);
        mTestableContext.addMockUserContext(userId, mockUserContext);

        mA11yms.isAccessibilityTargetAllowed(fakePackageName, uid, userId);

        verify(mockUserContext).getSystemService(EnhancedConfirmationManager.class);
    }


    private Set<String> readStringsFromSetting(String setting) {
        final Set<String> result = new ArraySet<>();
        mA11yms.readColonDelimitedSettingToSet(
@@ -2280,6 +2303,7 @@ public class AccessibilityManagerServiceTest {

        private final Context mMockContext;
        private final Map<String, List<BroadcastReceiver>> mBroadcastReceivers = new ArrayMap<>();
        private ArrayMap<Integer, Context> mMockUserContexts = new ArrayMap<>();

        A11yTestableContext(Context base) {
            super(base);
@@ -2317,6 +2341,19 @@ public class AccessibilityManagerServiceTest {
            return mMockContext;
        }

        public void addMockUserContext(int userId, Context context) {
            mMockUserContexts.put(userId, context);
        }

        @Override
        @NonNull
        public Context createContextAsUser(UserHandle user, int flags) {
            if (mMockUserContexts.containsKey(user.getIdentifier())) {
                return mMockUserContexts.get(user.getIdentifier());
            }
            return super.createContextAsUser(user, flags);
        }

        Map<String, List<BroadcastReceiver>> getBroadcastReceivers() {
            return mBroadcastReceivers;
        }