summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt95
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt13
2 files changed, 64 insertions, 44 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
index 0e4f2244217a..66724695578a 100644
--- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt
@@ -66,7 +66,6 @@ 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
@@ -138,18 +137,12 @@ constructor(
/** The currently-selected user. */
val selectedUser: Flow<UserModel>
get() =
- combine(
- repository.selectedUserInfo,
- repository.userSwitcherSettings,
- ) { selectedUserInfo, settings ->
+ repository.selectedUserInfo.map { selectedUserInfo ->
val selectedUserId = selectedUserInfo.id
- checkNotNull(
- toUserModel(
- userInfo = selectedUserInfo,
- selectedUserId = selectedUserId,
- canSwitchUsers = canSwitchUsers(selectedUserId),
- isUserSwitcherEnabled = settings.isUserSwitcherEnabled,
- )
+ toUserModel(
+ userInfo = selectedUserInfo,
+ selectedUserId = selectedUserId,
+ canSwitchUsers = canSwitchUsers(selectedUserId)
)
}
@@ -629,7 +622,7 @@ constructor(
// The guest user should go in the last position.
.sortedBy { it.isGuest }
.mapNotNull { userInfo ->
- toUserModel(
+ filterAndMapToUserModel(
userInfo = userInfo,
selectedUserId = selectedUserId,
canSwitchUsers = canSwitchUsers,
@@ -638,51 +631,65 @@ constructor(
}
}
- private suspend fun toUserModel(
+ /**
+ * Maps UserInfo to UserModel based on some parameters and return null under certain conditions
+ * to be filtered out.
+ */
+ private suspend fun filterAndMapToUserModel(
userInfo: UserInfo,
selectedUserId: Int,
canSwitchUsers: Boolean,
isUserSwitcherEnabled: Boolean,
): UserModel? {
- val userId = userInfo.id
- val isSelected = userId == selectedUserId
-
return when {
// When the user switcher is not enabled in settings, we only show the primary user.
!isUserSwitcherEnabled && !userInfo.isPrimary -> null
-
// We avoid showing disabled users.
!userInfo.isEnabled -> null
- userInfo.isGuest ->
- UserModel(
- id = userId,
- name = Text.Loaded(userInfo.name),
- image =
- getUserImage(
- isGuest = true,
- userId = userId,
- ),
- isSelected = isSelected,
- isSelectable = canSwitchUsers,
- isGuest = true,
- )
- userInfo.supportsSwitchToByUser() ->
- UserModel(
- id = userId,
- name = Text.Loaded(userInfo.name),
- image =
- getUserImage(
- isGuest = false,
- userId = userId,
- ),
- isSelected = isSelected,
- isSelectable = canSwitchUsers || isSelected,
- isGuest = false,
- )
+ // We meet the conditions to return the UserModel.
+ userInfo.isGuest || userInfo.supportsSwitchToByUser() ->
+ toUserModel(userInfo, selectedUserId, canSwitchUsers)
else -> null
}
}
+ /** Maps UserInfo to UserModel based on some parameters. */
+ private suspend fun toUserModel(
+ userInfo: UserInfo,
+ selectedUserId: Int,
+ canSwitchUsers: Boolean
+ ): UserModel {
+ val userId = userInfo.id
+ val isSelected = userId == selectedUserId
+ return if (userInfo.isGuest) {
+ UserModel(
+ id = userId,
+ name = Text.Loaded(userInfo.name),
+ image =
+ getUserImage(
+ isGuest = true,
+ userId = userId,
+ ),
+ isSelected = isSelected,
+ isSelectable = canSwitchUsers,
+ isGuest = true,
+ )
+ } else {
+ UserModel(
+ id = userId,
+ name = Text.Loaded(userInfo.name),
+ image =
+ getUserImage(
+ isGuest = false,
+ userId = userId,
+ ),
+ isSelected = isSelected,
+ isSelectable = canSwitchUsers || isSelected,
+ isGuest = false,
+ )
+ }
+ }
+
private suspend fun canSwitchUsers(selectedUserId: Int): Boolean {
return withContext(backgroundDispatcher) {
manager.getUserSwitchability(UserHandle.of(selectedUserId))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
index d87720991036..47efcd90cb0d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt
@@ -793,6 +793,19 @@ class UserInteractorTest : SysuiTestCase() {
job.cancel()
}
+ @Test
+ fun `current user is not primary and user switcher is disabled`() =
+ runBlocking(IMMEDIATE) {
+ val userInfos = createUserInfos(count = 2, includeGuest = false)
+ userRepository.setUserInfos(userInfos)
+ userRepository.setSelectedUserInfo(userInfos[1])
+ userRepository.setSettings(UserSwitcherSettingsModel(isUserSwitcherEnabled = false))
+ var selectedUser: UserModel? = null
+ val job = underTest.selectedUser.onEach { selectedUser = it }.launchIn(this)
+ assertThat(selectedUser).isNotNull()
+ job.cancel()
+ }
+
private fun assertUsers(
models: List<UserModel>?,
count: Int,