Loading packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt +20 −13 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.plugins.ActivityStarter import com.android.systemui.qs.user.UserSwitchDialogController 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.source.UserRecord import com.android.systemui.user.domain.model.ShowDialogRequestModel Loading @@ -61,6 +62,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach Loading Loading @@ -108,12 +110,16 @@ constructor( private val callbackMutex = Mutex() 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. */ val users: Flow<List<UserModel>> get() = combine( repository.userInfos, userInfos, repository.selectedUserInfo, repository.userSwitcherSettings, ) { userInfos, selectedUserInfo, settings -> Loading Loading @@ -147,22 +153,13 @@ constructor( get() = combine( repository.selectedUserInfo, repository.userInfos, userInfos, repository.userSwitcherSettings, keyguardInteractor.isKeyguardShowing, ) { _, userInfos, settings, isDeviceLocked -> buildList { val hasGuestUser = userInfos.any { it.isGuest } if ( !hasGuestUser && (guestUserInteractor.isGuestUserAutoCreated || UserActionsUtil.canCreateGuest( manager, repository, settings.isUserSwitcherEnabled, settings.isAddUsersFromLockscreen, )) ) { if (!hasGuestUser && canCreateGuestUser(settings)) { add(UserActionModel.ENTER_GUEST_MODE) } Loading Loading @@ -211,7 +208,7 @@ constructor( val userRecords: StateFlow<ArrayList<UserRecord>> = combine( repository.userInfos, userInfos, repository.selectedUserInfo, actions, repository.userSwitcherSettings, Loading Loading @@ -687,6 +684,16 @@ constructor( ) } private fun canCreateGuestUser(settings: UserSwitcherSettingsModel): Boolean { return guestUserInteractor.isGuestUserAutoCreated || UserActionsUtil.canCreateGuest( manager, repository, settings.isUserSwitcherEnabled, settings.isAddUsersFromLockscreen, ) } companion object { private const val TAG = "UserInteractor" } Loading packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt +43 −0 Original line number Diff line number Diff line Loading @@ -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( models: List<UserModel>?, count: Int, Loading Loading
packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt +20 −13 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.plugins.ActivityStarter import com.android.systemui.qs.user.UserSwitchDialogController 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.source.UserRecord import com.android.systemui.user.domain.model.ShowDialogRequestModel Loading @@ -61,6 +62,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach Loading Loading @@ -108,12 +110,16 @@ constructor( private val callbackMutex = Mutex() 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. */ val users: Flow<List<UserModel>> get() = combine( repository.userInfos, userInfos, repository.selectedUserInfo, repository.userSwitcherSettings, ) { userInfos, selectedUserInfo, settings -> Loading Loading @@ -147,22 +153,13 @@ constructor( get() = combine( repository.selectedUserInfo, repository.userInfos, userInfos, repository.userSwitcherSettings, keyguardInteractor.isKeyguardShowing, ) { _, userInfos, settings, isDeviceLocked -> buildList { val hasGuestUser = userInfos.any { it.isGuest } if ( !hasGuestUser && (guestUserInteractor.isGuestUserAutoCreated || UserActionsUtil.canCreateGuest( manager, repository, settings.isUserSwitcherEnabled, settings.isAddUsersFromLockscreen, )) ) { if (!hasGuestUser && canCreateGuestUser(settings)) { add(UserActionModel.ENTER_GUEST_MODE) } Loading Loading @@ -211,7 +208,7 @@ constructor( val userRecords: StateFlow<ArrayList<UserRecord>> = combine( repository.userInfos, userInfos, repository.selectedUserInfo, actions, repository.userSwitcherSettings, Loading Loading @@ -687,6 +684,16 @@ constructor( ) } private fun canCreateGuestUser(settings: UserSwitcherSettingsModel): Boolean { return guestUserInteractor.isGuestUserAutoCreated || UserActionsUtil.canCreateGuest( manager, repository, settings.isUserSwitcherEnabled, settings.isAddUsersFromLockscreen, ) } companion object { private const val TAG = "UserInteractor" } Loading
packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt +43 −0 Original line number Diff line number Diff line Loading @@ -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( models: List<UserModel>?, count: Int, Loading