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

Commit 00114b1b authored by Aaron Liu's avatar Aaron Liu
Browse files

[User Switcher] remove add guest user...

for secondary user. This only applies to the newly refactored User
Switcher.

Fixes: 254913348
Test: Added unit tests for user interactor.
Test: Add secondary user and guest as system user. Switch to secondary user. Look at bouncer user
switcher and fullscreen user switcher and observe no guest option.
Test: Set add user from lockscreen to on. Switch to secondary user.
Look at bouncer user switcher and fullscreen user switcher and observe
that there is an add guest option along with add user option.

Change-Id: I4cf3121c9a8aefbb78d62f0347511470940abff4
parent c0db1ff3
Loading
Loading
Loading
Loading
+20 −13
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.qs.user.UserSwitchDialogController
import com.android.systemui.qs.user.UserSwitchDialogController
import com.android.systemui.telephony.domain.interactor.TelephonyInteractor
import com.android.systemui.telephony.domain.interactor.TelephonyInteractor
import com.android.systemui.user.data.model.UserSwitcherSettingsModel
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.user.data.source.UserRecord
import com.android.systemui.user.data.source.UserRecord
import com.android.systemui.user.domain.model.ShowDialogRequestModel
import com.android.systemui.user.domain.model.ShowDialogRequestModel
@@ -61,6 +62,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onEach
@@ -108,12 +110,16 @@ constructor(


    private val callbackMutex = Mutex()
    private val callbackMutex = Mutex()
    private val callbacks = mutableSetOf<UserCallback>()
    private val callbacks = mutableSetOf<UserCallback>()
    private val userInfos =
        combine(repository.userSwitcherSettings, repository.userInfos) { settings, userInfos ->
            userInfos.filter { !it.isGuest || canCreateGuestUser(settings) }
        }


    /** List of current on-device users to select from. */
    /** List of current on-device users to select from. */
    val users: Flow<List<UserModel>>
    val users: Flow<List<UserModel>>
        get() =
        get() =
            combine(
            combine(
                repository.userInfos,
                userInfos,
                repository.selectedUserInfo,
                repository.selectedUserInfo,
                repository.userSwitcherSettings,
                repository.userSwitcherSettings,
            ) { userInfos, selectedUserInfo, settings ->
            ) { userInfos, selectedUserInfo, settings ->
@@ -147,22 +153,13 @@ constructor(
        get() =
        get() =
            combine(
            combine(
                repository.selectedUserInfo,
                repository.selectedUserInfo,
                repository.userInfos,
                userInfos,
                repository.userSwitcherSettings,
                repository.userSwitcherSettings,
                keyguardInteractor.isKeyguardShowing,
                keyguardInteractor.isKeyguardShowing,
            ) { _, userInfos, settings, isDeviceLocked ->
            ) { _, userInfos, settings, isDeviceLocked ->
                buildList {
                buildList {
                    val hasGuestUser = userInfos.any { it.isGuest }
                    val hasGuestUser = userInfos.any { it.isGuest }
                    if (
                    if (!hasGuestUser && canCreateGuestUser(settings)) {
                        !hasGuestUser &&
                            (guestUserInteractor.isGuestUserAutoCreated ||
                                UserActionsUtil.canCreateGuest(
                                    manager,
                                    repository,
                                    settings.isUserSwitcherEnabled,
                                    settings.isAddUsersFromLockscreen,
                                ))
                    ) {
                        add(UserActionModel.ENTER_GUEST_MODE)
                        add(UserActionModel.ENTER_GUEST_MODE)
                    }
                    }


@@ -211,7 +208,7 @@ constructor(


    val userRecords: StateFlow<ArrayList<UserRecord>> =
    val userRecords: StateFlow<ArrayList<UserRecord>> =
        combine(
        combine(
                repository.userInfos,
                userInfos,
                repository.selectedUserInfo,
                repository.selectedUserInfo,
                actions,
                actions,
                repository.userSwitcherSettings,
                repository.userSwitcherSettings,
@@ -687,6 +684,16 @@ constructor(
        )
        )
    }
    }


    private fun canCreateGuestUser(settings: UserSwitcherSettingsModel): Boolean {
        return guestUserInteractor.isGuestUserAutoCreated ||
            UserActionsUtil.canCreateGuest(
                manager,
                repository,
                settings.isUserSwitcherEnabled,
                settings.isAddUsersFromLockscreen,
            )
    }

    companion object {
    companion object {
        private const val TAG = "UserInteractor"
        private const val TAG = "UserInteractor"
    }
    }
+43 −0
Original line number Original line Diff line number Diff line
@@ -672,6 +672,49 @@ class UserInteractorTest : SysuiTestCase() {
            )
            )
        }
        }


    @Test
    fun `users - secondary user - no guest user`() =
        runBlocking(IMMEDIATE) {
            val userInfos = createUserInfos(count = 3, includeGuest = true)
            userRepository.setUserInfos(userInfos)
            userRepository.setSelectedUserInfo(userInfos[1])
            userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = true))

            var res: List<UserModel>? = null
            val job = underTest.users.onEach { res = it }.launchIn(this)
            assertThat(res?.size == 2).isTrue()
            assertThat(res?.find { it.isGuest }).isNull()
            job.cancel()
        }

    @Test
    fun `users - secondary user - no guest action`() =
        runBlocking(IMMEDIATE) {
            val userInfos = createUserInfos(count = 3, includeGuest = true)
            userRepository.setUserInfos(userInfos)
            userRepository.setSelectedUserInfo(userInfos[1])
            userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = true))

            var res: List<UserActionModel>? = null
            val job = underTest.actions.onEach { res = it }.launchIn(this)
            assertThat(res?.find { it == UserActionModel.ENTER_GUEST_MODE }).isNull()
            job.cancel()
        }

    @Test
    fun `users - secondary user - no guest user record`() =
        runBlocking(IMMEDIATE) {
            val userInfos = createUserInfos(count = 3, includeGuest = true)
            userRepository.setUserInfos(userInfos)
            userRepository.setSelectedUserInfo(userInfos[1])
            userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = true))

            var res: List<UserRecord>? = null
            val job = underTest.userRecords.onEach { res = it }.launchIn(this)
            assertThat(res?.find { it.isGuest }).isNull()
            job.cancel()
        }

    private fun assertUsers(
    private fun assertUsers(
        models: List<UserModel>?,
        models: List<UserModel>?,
        count: Int,
        count: Int,