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

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

Merge "Remove RoleManagerWrapper" into main

parents 2da86f31 11ed681c
Loading
Loading
Loading
Loading
+21 −28
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import static android.provider.Settings.Secure.SEARCH_CONTENT_FILTERS_ENABLED;


import static com.android.internal.util.Preconditions.checkCallAuthorization;
import static com.android.internal.util.Preconditions.checkCallAuthorization;


import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.SuppressLint;
@@ -34,6 +35,7 @@ import android.annotation.UserIdInt;
import android.app.KeyguardManager;
import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
import android.app.role.RoleManager;
import android.app.supervision.ISupervisionListener;
import android.app.supervision.ISupervisionListener;
import android.app.supervision.ISupervisionManager;
import android.app.supervision.ISupervisionManager;
@@ -81,6 +83,8 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;


/** Service for handling system supervision. */
/** Service for handling system supervision. */
public class SupervisionService extends ISupervisionManager.Stub {
public class SupervisionService extends ISupervisionManager.Stub {
@@ -456,15 +460,12 @@ public class SupervisionService extends ISupervisionManager.Stub {


        enforcePermission(MANAGE_ROLE_HOLDERS);
        enforcePermission(MANAGE_ROLE_HOLDERS);
        List<String> supervisionPackages = new ArrayList<>();
        List<String> supervisionPackages = new ArrayList<>();
        RoleManagerWrapper roleManager = mInjector.getRoleManagerWrapper();
        if (roleManager != null) {
        supervisionPackages.addAll(
        supervisionPackages.addAll(
                    roleManager.getRoleHoldersAsUser(
                mInjector.getRoleHoldersAsUser(
                        RoleManager.ROLE_SUPERVISION, UserHandle.of(userId)));
                        RoleManager.ROLE_SUPERVISION, UserHandle.of(userId)));
        supervisionPackages.addAll(
        supervisionPackages.addAll(
                    roleManager.getRoleHoldersAsUser(
                mInjector.getRoleHoldersAsUser(
                        RoleManager.ROLE_SYSTEM_SUPERVISION, UserHandle.of(userId)));
                        RoleManager.ROLE_SYSTEM_SUPERVISION, UserHandle.of(userId)));
        }


        for (String supervisionPackage : supervisionPackages) {
        for (String supervisionPackage : supervisionPackages) {
            clearDevicePoliciesAndSuspendedPackagesFor(userId, supervisionPackage);
            clearDevicePoliciesAndSuspendedPackagesFor(userId, supervisionPackage);
@@ -623,10 +624,11 @@ public class SupervisionService extends ISupervisionManager.Stub {
        private PackageManager mPackageManager;
        private PackageManager mPackageManager;
        private PackageManagerInternal mPackageManagerInternal;
        private PackageManagerInternal mPackageManagerInternal;
        private UserManagerInternal mUserManagerInternal;
        private UserManagerInternal mUserManagerInternal;
        private RoleManagerWrapper mRoleManagerWrapper;
        private RoleManager mRoleManager;


        Injector(Context context) {
        Injector(Context context) {
            this.context = context;
            this.context = context;
            mRoleManager = Objects.requireNonNull(context.getSystemService(RoleManager.class));
        }
        }


        @Nullable
        @Nullable
@@ -673,26 +675,17 @@ public class SupervisionService extends ISupervisionManager.Stub {
            return mPackageManagerInternal;
            return mPackageManagerInternal;
        }
        }


        RoleManagerWrapper getRoleManagerWrapper() {
        void addOnRoleHoldersChangedListenerAsUser(
            if (mRoleManagerWrapper == null) {
                @CallbackExecutor @NonNull Executor executor,
                final Object roleManager = context.getSystemService(RoleManager.class);
                @NonNull OnRoleHoldersChangedListener listener,
                if (roleManager instanceof RoleManager) {
                @NonNull UserHandle user) {
                    mRoleManagerWrapper = new RoleManagerWrapper() {
            mRoleManager.addOnRoleHoldersChangedListenerAsUser(executor, listener, user);
                        @Override
                        public List<String> getRoleHoldersAsUser(String roleName, UserHandle user) {
                            return ((RoleManager) roleManager).getRoleHoldersAsUser(roleName, user);
                        }
                    };
                } else {
                    mRoleManagerWrapper = (RoleManagerWrapper) roleManager;
                }
            }
            return mRoleManagerWrapper;
        }
        }
        }


    public interface RoleManagerWrapper {
        @NonNull
        List<String> getRoleHoldersAsUser(String roleName, UserHandle user);
        List<String> getRoleHoldersAsUser(String roleName, UserHandle user) {
            return mRoleManager.getRoleHoldersAsUser(roleName, user);
        }
    }
    }


    /** Publishes local and binder services and allows the service to act during initialization. */
    /** Publishes local and binder services and allows the service to act during initialization. */
+27 −15
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.app.Activity
import android.app.KeyguardManager
import android.app.KeyguardManager
import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyManagerInternal
import android.app.admin.DevicePolicyManagerInternal
import android.app.role.OnRoleHoldersChangedListener
import android.app.role.RoleManager
import android.app.role.RoleManager
import android.app.supervision.ISupervisionListener
import android.app.supervision.ISupervisionListener
import android.app.supervision.SupervisionRecoveryInfo
import android.app.supervision.SupervisionRecoveryInfo
@@ -61,9 +62,9 @@ import com.android.server.LocalServices
import com.android.server.SystemService.TargetUser
import com.android.server.SystemService.TargetUser
import com.android.server.pm.UserManagerInternal
import com.android.server.pm.UserManagerInternal
import com.android.server.supervision.SupervisionService.ACTION_CONFIRM_SUPERVISION_CREDENTIALS
import com.android.server.supervision.SupervisionService.ACTION_CONFIRM_SUPERVISION_CREDENTIALS
import com.android.server.supervision.SupervisionService.RoleManagerWrapper
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import java.nio.file.Files
import java.nio.file.Files
import java.util.concurrent.Executor
import kotlin.test.assertFailsWith
import kotlin.test.assertFailsWith
import org.junit.Before
import org.junit.Before
import org.junit.Ignore
import org.junit.Ignore
@@ -97,9 +98,9 @@ class SupervisionServiceTest {
    @Mock private lateinit var mockPackageManager: PackageManager
    @Mock private lateinit var mockPackageManager: PackageManager
    @Mock private lateinit var mockPackageManagerInternal: PackageManagerInternal
    @Mock private lateinit var mockPackageManagerInternal: PackageManagerInternal
    @Mock private lateinit var mockUserManagerInternal: UserManagerInternal
    @Mock private lateinit var mockUserManagerInternal: UserManagerInternal
    @Mock private lateinit var mockRoleManager: SupervisionService.RoleManagerWrapper


    private lateinit var context: SupervisionContextWrapper
    private lateinit var context: SupervisionContextWrapper
    private lateinit var injector: TestInjector
    private lateinit var lifecycle: SupervisionService.Lifecycle
    private lateinit var lifecycle: SupervisionService.Lifecycle
    private lateinit var service: SupervisionService
    private lateinit var service: SupervisionService


@@ -108,8 +109,7 @@ class SupervisionServiceTest {
        context = SupervisionContextWrapper(
        context = SupervisionContextWrapper(
            InstrumentationRegistry.getInstrumentation().context,
            InstrumentationRegistry.getInstrumentation().context,
            mockKeyguardManager,
            mockKeyguardManager,
            mockPackageManager,
            mockPackageManager)
            mockRoleManager)


        LocalServices.removeServiceForTest(DevicePolicyManagerInternal::class.java)
        LocalServices.removeServiceForTest(DevicePolicyManagerInternal::class.java)
        LocalServices.addService(DevicePolicyManagerInternal::class.java, mockDpmInternal)
        LocalServices.addService(DevicePolicyManagerInternal::class.java, mockDpmInternal)
@@ -129,7 +129,8 @@ class SupervisionServiceTest {
        // supervision CTS tests use to enable supervision.
        // supervision CTS tests use to enable supervision.
        context.permissions[BYPASS_ROLE_QUALIFICATION] = PERMISSION_GRANTED
        context.permissions[BYPASS_ROLE_QUALIFICATION] = PERMISSION_GRANTED


        service = SupervisionService(context)
        injector = TestInjector(context)
        service = SupervisionService(injector)
        lifecycle = SupervisionService.Lifecycle(context, service)
        lifecycle = SupervisionService.Lifecycle(context, service)
        lifecycle.registerProfileOwnerListener()
        lifecycle.registerProfileOwnerListener()


@@ -302,8 +303,7 @@ class SupervisionServiceTest {
    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_REMOVE_POLICIES_ON_SUPERVISION_DISABLE)
    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_REMOVE_POLICIES_ON_SUPERVISION_DISABLE)
    fun setSupervisionEnabledForUser_removesPoliciesWhenDisabling() {
    fun setSupervisionEnabledForUser_removesPoliciesWhenDisabling() {
        for ((role, packageName) in supervisionRoleHolders) {
        for ((role, packageName) in supervisionRoleHolders) {
            whenever(mockRoleManager.getRoleHoldersAsUser(eq(role), any()))
            injector.setRoleHoldersAsUser(role, UserHandle.of(USER_ID), listOf(packageName))
                .thenReturn(listOf(packageName))
        }
        }


        service.setSupervisionEnabledForUser(USER_ID, false)
        service.setSupervisionEnabledForUser(USER_ID, false)
@@ -551,8 +551,7 @@ class SupervisionServiceTest {
    fun clearPackageSuspensions_unsuspendsSupervisionPackages() {
    fun clearPackageSuspensions_unsuspendsSupervisionPackages() {
        assertThat(service.isSupervisionEnabledForUser(USER_ID)).isFalse()
        assertThat(service.isSupervisionEnabledForUser(USER_ID)).isFalse()
        for ((role, packageName) in supervisionRoleHolders) {
        for ((role, packageName) in supervisionRoleHolders) {
            whenever(mockRoleManager.getRoleHoldersAsUser(eq(role), any()))
            injector.setRoleHoldersAsUser(role, UserHandle.of(USER_ID), listOf(packageName))
                .thenReturn(listOf(packageName))
        }
        }


        service.setSupervisionEnabledForUser(USER_ID, false)
        service.setSupervisionEnabledForUser(USER_ID, false)
@@ -567,10 +566,6 @@ class SupervisionServiceTest {
    @Test
    @Test
    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_REMOVE_POLICIES_ON_SUPERVISION_DISABLE)
    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_REMOVE_POLICIES_ON_SUPERVISION_DISABLE)
    fun clearPackageSuspensions_noSupervisionPackages_doesNothing() {
    fun clearPackageSuspensions_noSupervisionPackages_doesNothing() {
        whenever(mockRoleManager.getRoleHoldersAsUser(
            any(),
            any()
        )).thenReturn(listOf())
        service.setSupervisionEnabledForUser(USER_ID, false)
        service.setSupervisionEnabledForUser(USER_ID, false)


        verify(
        verify(
@@ -643,6 +638,25 @@ class SupervisionServiceTest {
    }
    }
}
}


private class TestInjector(val context: Context) : SupervisionService.Injector(context) {
    private val roleHolders = mutableMapOf<Pair<String, UserHandle>, List<String>>()

    override fun addOnRoleHoldersChangedListenerAsUser(
        executor: Executor,
        listener: OnRoleHoldersChangedListener,
        user: UserHandle
    ) {
    }

    override fun getRoleHoldersAsUser(roleName: String, user: UserHandle): List<String> {
        return roleHolders[Pair(roleName, user)] ?: emptyList()
    }

    fun setRoleHoldersAsUser(roleName: String, user: UserHandle, packages: List<String>) {
        roleHolders[Pair(roleName, user)] = packages
    }
}

/**
/**
 * A context wrapper that allows broadcast intents to immediately invoke the receivers without
 * A context wrapper that allows broadcast intents to immediately invoke the receivers without
 * performing checks on the sending user.
 * performing checks on the sending user.
@@ -651,7 +665,6 @@ private class SupervisionContextWrapper(
    val context: Context,
    val context: Context,
    val keyguardManager: KeyguardManager,
    val keyguardManager: KeyguardManager,
    val pkgManager: PackageManager,
    val pkgManager: PackageManager,
    val roleManagerWrapper: RoleManagerWrapper,
) : ContextWrapper(context) {
) : ContextWrapper(context) {
    val interceptors = mutableListOf<Pair<BroadcastReceiver, IntentFilter>>()
    val interceptors = mutableListOf<Pair<BroadcastReceiver, IntentFilter>>()
    val permissions = mutableMapOf<String, Int>()
    val permissions = mutableMapOf<String, Int>()
@@ -659,7 +672,6 @@ private class SupervisionContextWrapper(
    override fun getSystemService(name: String): Any? {
    override fun getSystemService(name: String): Any? {
        var ret = when (name) {
        var ret = when (name) {
            Context.KEYGUARD_SERVICE -> keyguardManager
            Context.KEYGUARD_SERVICE -> keyguardManager
            Context.ROLE_SERVICE -> roleManagerWrapper
            else -> super.getSystemService(name)
            else -> super.getSystemService(name)
        }
        }
        return ret
        return ret