Loading packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/element/StatusBarElement.kt +2 −5 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView Loading @@ -39,7 +38,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.modifiers.height import com.android.compose.theme.PlatformTheme import com.android.keyguard.dagger.KeyguardStatusBarViewComponent Loading Loading @@ -127,10 +125,9 @@ constructor( @Composable private fun SignOutButton() { val context = LocalContext.current val isVisible by viewModel.isSignOutButtonVisible.collectAsStateWithLifecycle() if (isVisible) { if (viewModel.isSignOutButtonVisible) { Button( onClick = viewModel.onSignOut, onClick = viewModel::onSignOut, contentPadding = PaddingValues(start = 4.dp, end = 8.dp), modifier = Modifier.padding(end = 8.dp), ) { Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt +6 −4 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepos import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn import com.android.systemui.scene.data.repository.sceneContainerRepository import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.Overlays Loading Loading @@ -99,6 +100,7 @@ class KeyguardStatusBarViewModelTest(flags: FlagsParameterization) : SysuiTestCa userLogoutInteractor, batteryController, ) underTest.activateIn(testScope) } @Test Loading Loading @@ -250,12 +252,12 @@ class KeyguardStatusBarViewModelTest(flags: FlagsParameterization) : SysuiTestCa fun signOutButton_isVisible_whenUserManagerLogoutIsEnabled() { testScope.runTest { kosmos.fakeKeyguardRepository.setIsSignOutButtonOnStatusBarEnabledInConfig(true) val isSignOutButtonVisible by collectLastValue(underTest.isSignOutButtonVisible) val logoutToSystemUserCount = userRepository.logOutWithUserManagerCallCount userRepository.setUserManagerLogoutEnabled(true) userRepository.setPolicyManagerLogoutEnabled(false) runCurrent() assertThat(underTest.isSignOutButtonEnabled).isTrue() assertThat(isSignOutButtonVisible).isTrue() assertThat(underTest.isSignOutButtonVisible).isTrue() underTest.onSignOut() runCurrent() assertThat(userRepository.logOutWithUserManagerCallCount) Loading @@ -268,11 +270,11 @@ class KeyguardStatusBarViewModelTest(flags: FlagsParameterization) : SysuiTestCa fun signOutButton_isNotVisible_whenUserManagerLogoutIsDisabled() { testScope.runTest { kosmos.fakeKeyguardRepository.setIsSignOutButtonOnStatusBarEnabledInConfig(true) val isSignOutButtonVisible by collectLastValue(underTest.isSignOutButtonVisible) userRepository.setUserManagerLogoutEnabled(false) userRepository.setPolicyManagerLogoutEnabled(true) runCurrent() assertThat(underTest.isSignOutButtonEnabled).isTrue() assertThat(isSignOutButtonVisible).isFalse() assertThat(underTest.isSignOutButtonVisible).isFalse() } } Loading packages/SystemUI/src/com/android/systemui/statusbar/ui/binder/KeyguardStatusBarViewBinder.kt +13 −5 Original line number Diff line number Diff line Loading @@ -19,19 +19,18 @@ package com.android.systemui.statusbar.ui.binder import android.view.View import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.lifecycle.WindowLifecycleState import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.lifecycle.viewModel import com.android.systemui.statusbar.phone.KeyguardStatusBarView import com.android.systemui.statusbar.ui.viewmodel.KeyguardStatusBarViewModel import kotlinx.coroutines.flow.distinctUntilChanged import com.android.app.tracing.coroutines.launchTraced as launch /** Binds [KeyguardStatusBarViewModel] to [KeyguardStatusBarView]. */ object KeyguardStatusBarViewBinder { @JvmStatic fun bind( view: KeyguardStatusBarView, viewModel: KeyguardStatusBarViewModel, ) { fun bind(view: KeyguardStatusBarView, viewModel: KeyguardStatusBarViewModel) { view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.STARTED) { launch { Loading @@ -49,5 +48,14 @@ object KeyguardStatusBarViewBinder { } } } view.repeatWhenAttached { view.viewModel( traceName = "KeyguardStatusBarViewBinderViewModel", minWindowLifecycleState = WindowLifecycleState.ATTACHED, factory = { viewModel }, ) { // no-op - currently used to activate viewModel } } } } packages/SystemUI/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModel.kt +8 −5 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.systemui.Flags import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.lifecycle.HydratedActivatable import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Overlays Loading Loading @@ -59,9 +60,9 @@ constructor( sceneInteractor: SceneInteractor, private val keyguardInteractor: KeyguardInteractor, keyguardStatusBarInteractor: KeyguardStatusBarInteractor, userLogoutInteractor: UserLogoutInteractor, private val userLogoutInteractor: UserLogoutInteractor, batteryController: BatteryController, ) { ) : HydratedActivatable(enableEnqueuedActivations = true) { private val showingHeadsUpStatusBar: Flow<Boolean> = if (SceneContainerFlag.isEnabled && !StatusBarNoHunBehavior.isEnabled) { Loading Loading @@ -114,8 +115,10 @@ constructor( Flags.signOutButtonOnKeyguardStatusBar() && keyguardInteractor.isSignOutButtonOnStatusBarEnabled val isSignOutButtonVisible: StateFlow<Boolean> = userLogoutInteractor.isLogoutToSystemUserEnabled val isSignOutButtonVisible: Boolean by userLogoutInteractor.isLogoutToSystemUserEnabled.hydratedStateOf() val onSignOut: () -> Unit = { userLogoutInteractor.logOutToSystemUser() } fun onSignOut() { enqueueOnActivatedScope { userLogoutInteractor.logOutToSystemUser() } } } packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserLogoutInteractor.kt +3 −5 Original line number Diff line number Diff line Loading @@ -47,13 +47,11 @@ constructor( val isLogoutToSystemUserEnabled: StateFlow<Boolean> = userRepository.isUserManagerLogoutEnabled fun logOutToSystemUser() { applicationScope.launch { suspend fun logOutToSystemUser() { if (isLogoutToSystemUserEnabled.value) { userRepository.logOutWithUserManager() } } } fun logOut() { applicationScope.launch { Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/element/StatusBarElement.kt +2 −5 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView Loading @@ -39,7 +38,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.modifiers.height import com.android.compose.theme.PlatformTheme import com.android.keyguard.dagger.KeyguardStatusBarViewComponent Loading Loading @@ -127,10 +125,9 @@ constructor( @Composable private fun SignOutButton() { val context = LocalContext.current val isVisible by viewModel.isSignOutButtonVisible.collectAsStateWithLifecycle() if (isVisible) { if (viewModel.isSignOutButtonVisible) { Button( onClick = viewModel.onSignOut, onClick = viewModel::onSignOut, contentPadding = PaddingValues(start = 4.dp, end = 8.dp), modifier = Modifier.padding(end = 8.dp), ) { Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt +6 −4 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepos import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn import com.android.systemui.scene.data.repository.sceneContainerRepository import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.shared.model.Overlays Loading Loading @@ -99,6 +100,7 @@ class KeyguardStatusBarViewModelTest(flags: FlagsParameterization) : SysuiTestCa userLogoutInteractor, batteryController, ) underTest.activateIn(testScope) } @Test Loading Loading @@ -250,12 +252,12 @@ class KeyguardStatusBarViewModelTest(flags: FlagsParameterization) : SysuiTestCa fun signOutButton_isVisible_whenUserManagerLogoutIsEnabled() { testScope.runTest { kosmos.fakeKeyguardRepository.setIsSignOutButtonOnStatusBarEnabledInConfig(true) val isSignOutButtonVisible by collectLastValue(underTest.isSignOutButtonVisible) val logoutToSystemUserCount = userRepository.logOutWithUserManagerCallCount userRepository.setUserManagerLogoutEnabled(true) userRepository.setPolicyManagerLogoutEnabled(false) runCurrent() assertThat(underTest.isSignOutButtonEnabled).isTrue() assertThat(isSignOutButtonVisible).isTrue() assertThat(underTest.isSignOutButtonVisible).isTrue() underTest.onSignOut() runCurrent() assertThat(userRepository.logOutWithUserManagerCallCount) Loading @@ -268,11 +270,11 @@ class KeyguardStatusBarViewModelTest(flags: FlagsParameterization) : SysuiTestCa fun signOutButton_isNotVisible_whenUserManagerLogoutIsDisabled() { testScope.runTest { kosmos.fakeKeyguardRepository.setIsSignOutButtonOnStatusBarEnabledInConfig(true) val isSignOutButtonVisible by collectLastValue(underTest.isSignOutButtonVisible) userRepository.setUserManagerLogoutEnabled(false) userRepository.setPolicyManagerLogoutEnabled(true) runCurrent() assertThat(underTest.isSignOutButtonEnabled).isTrue() assertThat(isSignOutButtonVisible).isFalse() assertThat(underTest.isSignOutButtonVisible).isFalse() } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/ui/binder/KeyguardStatusBarViewBinder.kt +13 −5 Original line number Diff line number Diff line Loading @@ -19,19 +19,18 @@ package com.android.systemui.statusbar.ui.binder import android.view.View import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.lifecycle.WindowLifecycleState import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.lifecycle.viewModel import com.android.systemui.statusbar.phone.KeyguardStatusBarView import com.android.systemui.statusbar.ui.viewmodel.KeyguardStatusBarViewModel import kotlinx.coroutines.flow.distinctUntilChanged import com.android.app.tracing.coroutines.launchTraced as launch /** Binds [KeyguardStatusBarViewModel] to [KeyguardStatusBarView]. */ object KeyguardStatusBarViewBinder { @JvmStatic fun bind( view: KeyguardStatusBarView, viewModel: KeyguardStatusBarViewModel, ) { fun bind(view: KeyguardStatusBarView, viewModel: KeyguardStatusBarViewModel) { view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.STARTED) { launch { Loading @@ -49,5 +48,14 @@ object KeyguardStatusBarViewBinder { } } } view.repeatWhenAttached { view.viewModel( traceName = "KeyguardStatusBarViewBinderViewModel", minWindowLifecycleState = WindowLifecycleState.ATTACHED, factory = { viewModel }, ) { // no-op - currently used to activate viewModel } } } }
packages/SystemUI/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModel.kt +8 −5 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.systemui.Flags import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.lifecycle.HydratedActivatable import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Overlays Loading Loading @@ -59,9 +60,9 @@ constructor( sceneInteractor: SceneInteractor, private val keyguardInteractor: KeyguardInteractor, keyguardStatusBarInteractor: KeyguardStatusBarInteractor, userLogoutInteractor: UserLogoutInteractor, private val userLogoutInteractor: UserLogoutInteractor, batteryController: BatteryController, ) { ) : HydratedActivatable(enableEnqueuedActivations = true) { private val showingHeadsUpStatusBar: Flow<Boolean> = if (SceneContainerFlag.isEnabled && !StatusBarNoHunBehavior.isEnabled) { Loading Loading @@ -114,8 +115,10 @@ constructor( Flags.signOutButtonOnKeyguardStatusBar() && keyguardInteractor.isSignOutButtonOnStatusBarEnabled val isSignOutButtonVisible: StateFlow<Boolean> = userLogoutInteractor.isLogoutToSystemUserEnabled val isSignOutButtonVisible: Boolean by userLogoutInteractor.isLogoutToSystemUserEnabled.hydratedStateOf() val onSignOut: () -> Unit = { userLogoutInteractor.logOutToSystemUser() } fun onSignOut() { enqueueOnActivatedScope { userLogoutInteractor.logOutToSystemUser() } } }
packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserLogoutInteractor.kt +3 −5 Original line number Diff line number Diff line Loading @@ -47,13 +47,11 @@ constructor( val isLogoutToSystemUserEnabled: StateFlow<Boolean> = userRepository.isUserManagerLogoutEnabled fun logOutToSystemUser() { applicationScope.launch { suspend fun logOutToSystemUser() { if (isLogoutToSystemUserEnabled.value) { userRepository.logOutWithUserManager() } } } fun logOut() { applicationScope.launch { Loading