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

Commit f508a234 authored by Yvonne Jiang's avatar Yvonne Jiang
Browse files

Update SupervisionService.createConfirmSupervisionCredentialsIntent to be multi-user aware.

Bug: 406877588
Test: atest SupervisionServiceTest
Flag: android.app.supervision.flags.supervision_manager_apis
Change-Id: If23e0ac0a2978165d7e0432f86fe526afcab06cd
parent b4fb9a61
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -23,7 +23,7 @@ import android.content.Intent;
 * {@hide}
 * {@hide}
 */
 */
interface ISupervisionManager {
interface ISupervisionManager {
    Intent createConfirmSupervisionCredentialsIntent();
    Intent createConfirmSupervisionCredentialsIntent(int userId);
    boolean isSupervisionEnabledForUser(int userId);
    boolean isSupervisionEnabledForUser(int userId);
    void setSupervisionEnabledForUser(int userId, boolean enabled);
    void setSupervisionEnabledForUser(int userId, boolean enabled);
    String getActiveSupervisionAppPackage(int userId);
    String getActiveSupervisionAppPackage(int userId);
+2 −1
Original line number Original line Diff line number Diff line
@@ -105,7 +105,8 @@ public class SupervisionManager {
    public Intent createConfirmSupervisionCredentialsIntent() {
    public Intent createConfirmSupervisionCredentialsIntent() {
        if (mService != null) {
        if (mService != null) {
            try {
            try {
                Intent result = mService.createConfirmSupervisionCredentialsIntent();
                Intent result =
                        mService.createConfirmSupervisionCredentialsIntent(mContext.getUserId());
                if (result != null) {
                if (result != null) {
                    result.prepareToEnterProcess(
                    result.prepareToEnterProcess(
                            Intent.LOCAL_FLAG_FROM_SYSTEM, mContext.getAttributionSource());
                            Intent.LOCAL_FLAG_FROM_SYSTEM, mContext.getAttributionSource());
+5 −2
Original line number Original line Diff line number Diff line
@@ -148,9 +148,12 @@ public class SupervisionService extends ISupervisionManager.Stub {
     */
     */
    @Override
    @Override
    @Nullable
    @Nullable
    public Intent createConfirmSupervisionCredentialsIntent() {
    public Intent createConfirmSupervisionCredentialsIntent(@UserIdInt int userId) {
        enforceAnyPermission(QUERY_USERS, MANAGE_USERS);
        enforceAnyPermission(QUERY_USERS, MANAGE_USERS);
        if (!isSupervisionEnabledForUser(UserHandle.getCallingUserId())) {
        if (UserHandle.getUserId(Binder.getCallingUid()) != userId) {
            enforcePermission(INTERACT_ACROSS_USERS);
        }
        if (!isSupervisionEnabledForUser(userId)) {
            return null;
            return null;
        }
        }
        // Verify the supervising user profile exists and has a secure credential set.
        // Verify the supervising user profile exists and has a secure credential set.
+20 −17
Original line number Original line Diff line number Diff line
@@ -70,8 +70,7 @@ class SupervisionServiceTest {


    @Mock private lateinit var mockDpmInternal: DevicePolicyManagerInternal
    @Mock private lateinit var mockDpmInternal: DevicePolicyManagerInternal


    @Mock
    @Mock private lateinit var mockKeyguardManager: KeyguardManager
    private lateinit var mockKeyguardManager: KeyguardManager
    @Mock private lateinit var mockPackageManager: PackageManager
    @Mock private lateinit var mockPackageManager: PackageManager
    @Mock private lateinit var mockUserManagerInternal: UserManagerInternal
    @Mock private lateinit var mockUserManagerInternal: UserManagerInternal


@@ -265,7 +264,8 @@ class SupervisionServiceTest {
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(SUPERVISING_USER_ID)
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(SUPERVISING_USER_ID)
        whenever(mockKeyguardManager.isDeviceSecure(SUPERVISING_USER_ID)).thenReturn(true)
        whenever(mockKeyguardManager.isDeviceSecure(SUPERVISING_USER_ID)).thenReturn(true)


        val intent = checkNotNull(service.createConfirmSupervisionCredentialsIntent())
        val intent =
            checkNotNull(service.createConfirmSupervisionCredentialsIntent(context.getUserId()))
        assertThat(intent.action).isEqualTo(ACTION_CONFIRM_SUPERVISION_CREDENTIALS)
        assertThat(intent.action).isEqualTo(ACTION_CONFIRM_SUPERVISION_CREDENTIALS)
        assertThat(intent.getPackage()).isEqualTo("com.android.settings")
        assertThat(intent.getPackage()).isEqualTo("com.android.settings")
    }
    }
@@ -276,7 +276,7 @@ class SupervisionServiceTest {
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(SUPERVISING_USER_ID)
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(SUPERVISING_USER_ID)
        whenever(mockKeyguardManager.isDeviceSecure(SUPERVISING_USER_ID)).thenReturn(true)
        whenever(mockKeyguardManager.isDeviceSecure(SUPERVISING_USER_ID)).thenReturn(true)


        assertThat(service.createConfirmSupervisionCredentialsIntent()).isNull()
        assertThat(service.createConfirmSupervisionCredentialsIntent(context.getUserId())).isNull()
    }
    }


    @Test
    @Test
@@ -284,7 +284,7 @@ class SupervisionServiceTest {
        service.mInternal.setSupervisionEnabledForUser(context.getUserId(), true)
        service.mInternal.setSupervisionEnabledForUser(context.getUserId(), true)
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(UserHandle.USER_NULL)
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(UserHandle.USER_NULL)


        assertThat(service.createConfirmSupervisionCredentialsIntent()).isNull()
        assertThat(service.createConfirmSupervisionCredentialsIntent(context.getUserId())).isNull()
    }
    }


    @Test
    @Test
@@ -293,7 +293,7 @@ class SupervisionServiceTest {
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(SUPERVISING_USER_ID)
        whenever(mockUserManagerInternal.getSupervisingProfileId()).thenReturn(SUPERVISING_USER_ID)
        whenever(mockKeyguardManager.isDeviceSecure(SUPERVISING_USER_ID)).thenReturn(false)
        whenever(mockKeyguardManager.isDeviceSecure(SUPERVISING_USER_ID)).thenReturn(false)


        assertThat(service.createConfirmSupervisionCredentialsIntent()).isNull()
        assertThat(service.createConfirmSupervisionCredentialsIntent(context.getUserId())).isNull()
    }
    }


    fun shouldAllowBypassingSupervisionRoleQualification_returnsTrue() {
    fun shouldAllowBypassingSupervisionRoleQualification_returnsTrue() {
@@ -348,14 +348,16 @@ class SupervisionServiceTest {
    }
    }


    private fun addDefaultAndTestUsers() {
    private fun addDefaultAndTestUsers() {
        val userInfos = userData.map { (userId, flags) ->
        val userInfos =
            userData.map { (userId, flags) ->
                UserInfo(userId, "user" + userId, USER_ICON, flags, USER_TYPE)
                UserInfo(userId, "user" + userId, USER_ICON, flags, USER_TYPE)
            }
            }
        whenever(mockUserManagerInternal.getUsers(any())).thenReturn(userInfos)
        whenever(mockUserManagerInternal.getUsers(any())).thenReturn(userInfos)
    }
    }


    private fun addDefaultAndFullUsers() {
    private fun addDefaultAndFullUsers() {
        val userInfos = userData.map { (userId, flags) ->
        val userInfos =
            userData.map { (userId, flags) ->
                UserInfo(userId, "user" + userId, USER_ICON, flags, USER_TYPE)
                UserInfo(userId, "user" + userId, USER_ICON, flags, USER_TYPE)
            } + UserInfo(USER_ID, "user" + USER_ID, USER_ICON, FLAG_FULL, USER_TYPE)
            } + UserInfo(USER_ID, "user" + USER_ID, USER_ICON, FLAG_FULL, USER_TYPE)
        whenever(mockUserManagerInternal.getUsers(any())).thenReturn(userInfos)
        whenever(mockUserManagerInternal.getUsers(any())).thenReturn(userInfos)
@@ -367,10 +369,11 @@ class SupervisionServiceTest {
        const val SUPERVISING_USER_ID = 10
        const val SUPERVISING_USER_ID = 10
        const val USER_ICON = "user_icon"
        const val USER_ICON = "user_icon"
        const val USER_TYPE = "fake_user_type"
        const val USER_TYPE = "fake_user_type"
        val userData: Map<Int, Int> = mapOf(
        val userData: Map<Int, Int> =
            mapOf(
                USER_SYSTEM to FLAG_SYSTEM,
                USER_SYSTEM to FLAG_SYSTEM,
                MIN_SECONDARY_USER_ID to FLAG_MAIN,
                MIN_SECONDARY_USER_ID to FLAG_MAIN,
            (MIN_SECONDARY_USER_ID + 1) to (FLAG_FULL or FLAG_FOR_TESTING)
                (MIN_SECONDARY_USER_ID + 1) to (FLAG_FULL or FLAG_FOR_TESTING),
            )
            )
    }
    }
}
}