summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt155
-rw-r--r--packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt15
2 files changed, 158 insertions, 12 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt
index bafa8cf05a7f..da5622a2a8da 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/user/data/repository/UserRepositoryImplTest.kt
@@ -17,8 +17,10 @@
package com.android.systemui.user.data.repository
+import android.app.admin.DevicePolicyManager
import android.app.admin.devicePolicyManager
import android.content.Intent
+import android.content.applicationContext
import android.content.pm.UserInfo
import android.internal.statusbar.fakeStatusBarService
import android.os.UserHandle
@@ -77,10 +79,7 @@ class UserRepositoryImplTest : SysuiTestCase() {
fun setUp() {
MockitoAnnotations.initMocks(this)
tracker = FakeUserTracker()
- context.orCreateTestableResources.addOverride(
- R.bool.config_userSwitchingMustGoThroughLoginScreen,
- false,
- )
+ setUserSwitchingMustGoThroughLoginScreen(false)
}
@Test
@@ -308,6 +307,117 @@ class UserRepositoryImplTest : SysuiTestCase() {
job.cancel()
}
+ @Test
+ fun isSecondaryUserLogoutEnabled_secondaryLogoutDisabled_alwaysFalse() =
+ testScope.runTest {
+ underTest = create(testScope.backgroundScope)
+ mockLogoutUser(LogoutUserResult.NON_SYSTEM_CURRENT)
+ setSecondaryUserLogoutEnabled(false)
+ setUpUsers(count = 2, selectedIndex = 0)
+ tracker.onProfileChanged()
+
+ val secondaryUserLogoutEnabled by
+ collectLastValue(underTest.isSecondaryUserLogoutEnabled)
+
+ assertThat(secondaryUserLogoutEnabled).isFalse()
+
+ setUpUsers(count = 2, selectedIndex = 1)
+ tracker.onProfileChanged()
+ assertThat(secondaryUserLogoutEnabled).isFalse()
+ }
+
+ @Test
+ fun isSecondaryUserLogoutEnabled_secondaryLogoutEnabled_NullLogoutUser_alwaysFalse() =
+ testScope.runTest {
+ underTest = create(testScope.backgroundScope)
+ mockLogoutUser(LogoutUserResult.NONE)
+ setSecondaryUserLogoutEnabled(true)
+ setUpUsers(count = 2, selectedIndex = 0)
+ tracker.onProfileChanged()
+
+ val secondaryUserLogoutEnabled by
+ collectLastValue(underTest.isSecondaryUserLogoutEnabled)
+
+ assertThat(secondaryUserLogoutEnabled).isFalse()
+
+ setUpUsers(count = 2, selectedIndex = 1)
+ tracker.onProfileChanged()
+ assertThat(secondaryUserLogoutEnabled).isFalse()
+ }
+
+ @Test
+ fun isSecondaryUserLogoutEnabled_secondaryLogoutEnabled_NonSystemLogoutUser_trueWhenNonSystem() =
+ testScope.runTest {
+ underTest = create(testScope.backgroundScope)
+ mockLogoutUser(LogoutUserResult.NON_SYSTEM_CURRENT)
+ setSecondaryUserLogoutEnabled(true)
+ setUpUsers(count = 2, selectedIndex = 0)
+ tracker.onProfileChanged()
+
+ val secondaryUserLogoutEnabled by
+ collectLastValue(underTest.isSecondaryUserLogoutEnabled)
+
+ assertThat(secondaryUserLogoutEnabled).isFalse()
+
+ setUpUsers(count = 2, selectedIndex = 1)
+ tracker.onProfileChanged()
+ assertThat(secondaryUserLogoutEnabled).isTrue()
+ }
+
+ @Test
+ fun isLogoutToSystemUserEnabled_logoutThroughLoginScreenDisabled_alwaysFalse() =
+ testScope.runTest {
+ underTest = create(testScope.backgroundScope)
+ mockLogoutUser(LogoutUserResult.NON_SYSTEM_CURRENT)
+ setUserSwitchingMustGoThroughLoginScreen(false)
+ setUpUsers(count = 2, selectedIndex = 0)
+ tracker.onProfileChanged()
+
+ val logoutToSystemUserEnabled by collectLastValue(underTest.isLogoutToSystemUserEnabled)
+
+ assertThat(logoutToSystemUserEnabled).isFalse()
+
+ setUpUsers(count = 2, selectedIndex = 1)
+ tracker.onProfileChanged()
+ assertThat(logoutToSystemUserEnabled).isFalse()
+ }
+
+ @Test
+ fun isLogoutToSystemUserEnabled_logoutThroughLoginScreenEnabled_NullLogoutUser_alwaysFalse() =
+ testScope.runTest {
+ underTest = create(testScope.backgroundScope)
+ mockLogoutUser(LogoutUserResult.NONE)
+ setUserSwitchingMustGoThroughLoginScreen(true)
+ setUpUsers(count = 2, selectedIndex = 0)
+ tracker.onProfileChanged()
+
+ val logoutToSystemUserEnabled by collectLastValue(underTest.isLogoutToSystemUserEnabled)
+
+ assertThat(logoutToSystemUserEnabled).isFalse()
+
+ setUpUsers(count = 2, selectedIndex = 1)
+ tracker.onProfileChanged()
+ assertThat(logoutToSystemUserEnabled).isFalse()
+ }
+
+ @Test
+ fun isLogoutToSystemUserEnabled_logoutThroughLoginScreenEnabled_NonSystemLogoutUser_trueWhenNonSystem() =
+ testScope.runTest {
+ underTest = create(testScope.backgroundScope)
+ mockLogoutUser(LogoutUserResult.NON_SYSTEM_CURRENT)
+ setUserSwitchingMustGoThroughLoginScreen(true)
+ setUpUsers(count = 2, selectedIndex = 0)
+ tracker.onProfileChanged()
+
+ val logoutToSystemUserEnabled by collectLastValue(underTest.isLogoutToSystemUserEnabled)
+
+ assertThat(logoutToSystemUserEnabled).isFalse()
+
+ setUpUsers(count = 2, selectedIndex = 1)
+ tracker.onProfileChanged()
+ assertThat(logoutToSystemUserEnabled).isTrue()
+ }
+
private fun createUserInfo(id: Int, isGuest: Boolean): UserInfo {
val flags = 0
return UserInfo(
@@ -354,6 +464,38 @@ class UserRepositoryImplTest : SysuiTestCase() {
assertThat(model.isUserSwitcherEnabled).isEqualTo(expectedUserSwitcherEnabled)
}
+ private fun setSecondaryUserLogoutEnabled(enabled: Boolean) {
+ whenever(devicePolicyManager.isLogoutEnabled).thenReturn(enabled)
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ kosmos.applicationContext,
+ Intent(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
+ )
+ }
+
+ private fun setUserSwitchingMustGoThroughLoginScreen(enabled: Boolean) {
+ context.orCreateTestableResources.addOverride(
+ R.bool.config_userSwitchingMustGoThroughLoginScreen,
+ enabled,
+ )
+ }
+
+ private fun mockLogoutUser(result: LogoutUserResult) {
+ when (result) {
+ LogoutUserResult.NONE -> {
+ whenever(devicePolicyManager.logoutUser).thenReturn(null)
+ }
+ LogoutUserResult.NON_SYSTEM_CURRENT -> {
+ whenever(devicePolicyManager.logoutUser).thenAnswer {
+ if (tracker.userHandle != UserHandle.SYSTEM) {
+ tracker.userHandle
+ } else {
+ null
+ }
+ }
+ }
+ }
+ }
+
private fun create(scope: CoroutineScope): UserRepositoryImpl {
return UserRepositoryImpl(
appContext = context,
@@ -373,4 +515,9 @@ class UserRepositoryImplTest : SysuiTestCase() {
companion object {
@JvmStatic private val IMMEDIATE = Dispatchers.Main.immediate
}
+
+ private enum class LogoutUserResult {
+ NONE,
+ NON_SYSTEM_CURRENT,
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt
index 05b2e0d1423e..b33eafcdfa84 100644
--- a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt
@@ -414,16 +414,15 @@ constructor(
}
}
+ private suspend fun SelectedUserModel.isEligibleForLogout(): Boolean {
+ return withContext(backgroundDispatcher) {
+ selectionStatus == SelectionStatus.SELECTION_COMPLETE &&
+ devicePolicyManager.logoutUser != null
+ }
+ }
+
companion object {
private const val TAG = "UserRepository"
@VisibleForTesting const val SETTING_SIMPLE_USER_SWITCHER = "lockscreenSimpleUserSwitcher"
}
}
-
-fun SelectedUserModel.isEligibleForLogout(): Boolean {
- // TODO(b/206032495): should call mDevicePolicyManager.getLogoutUserId() instead of
- // hardcode it to USER_SYSTEM so it properly supports headless system user mode
- // (and then call mDevicePolicyManager.clearLogoutUser() after switched)
- return selectionStatus == SelectionStatus.SELECTION_COMPLETE &&
- userInfo.id != android.os.UserHandle.USER_SYSTEM
-}