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

Commit 8e9c494d authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Use correct user context to get the EnhancedConfirmationManager" into main

parents 0bbf1dde 8da0bd0a
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;
        }