Loading packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerOverlay.kt +1 −19 Original line number Diff line number Diff line Loading @@ -22,17 +22,12 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.overscroll import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.testTag import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.internal.R import com.android.systemui.bouncer.ui.BouncerDialogFactory import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel Loading @@ -51,19 +46,6 @@ object Bouncer { val Content = ElementKey("BouncerContent") } object Colors { val Background: Color @Composable @ReadOnlyComposable get() = Color( LocalResources.current.getColor( R.color.surface_effect_0, LocalContext.current.theme, ) ) } object TestTags { const val Root = "bouncer_root" } Loading Loading @@ -107,7 +89,7 @@ private fun ContentScope.BouncerOverlay( dialogFactory: BouncerDialogFactory, modifier: Modifier = Modifier, ) { val backgroundColor = Bouncer.Colors.Background val backgroundColor = viewModel.backgroundColor DisposableEffect(Unit) { onDispose { viewModel.onUiDestroyed() } } Loading packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerOverlayContentViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.testKosmos import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertWithMessage import kotlinx.coroutines.flow.emptyFlow Loading Loading @@ -253,6 +254,20 @@ class BouncerOverlayContentViewModelTest : SysuiTestCase() { assertThat(currentOverlays).doesNotContain(Overlays.Bouncer) } @Test fun backgroundColor_changesBasedOnWhetherBlurIsSupported() = kosmos.runTest { kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = false runCurrent() assertThat(underTest.backgroundColor.alpha).isEqualTo(1.0f) kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = true runCurrent() assertThat(underTest.backgroundColor.alpha).isLessThan(1.0f) } private fun authMethodsToTest(): List<AuthenticationMethodModel> { return listOf(None, Pin, Password, Pattern, Sim) } Loading packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerOverlayContentViewModel.kt +20 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyResources import android.content.Context import android.graphics.Bitmap import androidx.compose.runtime.getValue import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.key.KeyEvent import androidx.compose.ui.input.key.type import androidx.core.graphics.drawable.toBitmap Loading @@ -33,17 +35,19 @@ import com.android.systemui.authentication.shared.model.BouncerInputSide import com.android.systemui.bouncer.domain.interactor.BouncerActionButtonInteractor import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.shared.model.BouncerActionButtonModel import com.android.systemui.bouncer.ui.BouncerColors.surfaceColor import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.Text import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardMediaKeyInteractor import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.lifecycle.HydratedActivatable import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.awaitCancellation Loading Loading @@ -74,7 +78,8 @@ constructor( private val bouncerActionButtonInteractor: BouncerActionButtonInteractor, private val keyguardDismissActionInteractor: KeyguardDismissActionInteractor, private val sceneInteractor: SceneInteractor, ) : ExclusiveActivatable() { private val windowRootViewBlurInteractor: WindowRootViewBlurInteractor, ) : HydratedActivatable() { private val _selectedUserImage = MutableStateFlow<Bitmap?>(null) val selectedUserImage: StateFlow<Bitmap?> = _selectedUserImage.asStateFlow() Loading Loading @@ -157,6 +162,19 @@ constructor( /** How much the bouncer UI should be scaled. */ val scale: StateFlow<Float> = bouncerInteractor.scale /** Bouncer background color */ val backgroundColor by windowRootViewBlurInteractor.isBlurCurrentlySupported .map { Color(applicationContext.surfaceColor(it)) } .hydratedStateOf( "backgroundColor", Color( applicationContext.surfaceColor( windowRootViewBlurInteractor.isBlurCurrentlySupported.value ) ), ) private val _isInputEnabled = MutableStateFlow(authenticationInteractor.lockoutEndTimestamp == null) private val isInputEnabled: StateFlow<Boolean> = _isInputEnabled.asStateFlow() Loading packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.user.domain.interactor.selectedUserInteractor import com.android.systemui.user.ui.viewmodel.userSwitcherViewModel import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor import kotlinx.coroutines.flow.StateFlow val Kosmos.bouncerUserActionsViewModel by Fixture { BouncerUserActionsViewModel() } Loading Loading @@ -63,6 +64,7 @@ val Kosmos.bouncerOverlayContentViewModel by Fixture { bouncerActionButtonInteractor = bouncerActionButtonInteractor, keyguardDismissActionInteractor = keyguardDismissActionInteractor, sceneInteractor = sceneInteractor, windowRootViewBlurInteractor = windowRootViewBlurInteractor, ) } Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerOverlay.kt +1 −19 Original line number Diff line number Diff line Loading @@ -22,17 +22,12 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.overscroll import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.testTag import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.internal.R import com.android.systemui.bouncer.ui.BouncerDialogFactory import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel Loading @@ -51,19 +46,6 @@ object Bouncer { val Content = ElementKey("BouncerContent") } object Colors { val Background: Color @Composable @ReadOnlyComposable get() = Color( LocalResources.current.getColor( R.color.surface_effect_0, LocalContext.current.theme, ) ) } object TestTags { const val Root = "bouncer_root" } Loading Loading @@ -107,7 +89,7 @@ private fun ContentScope.BouncerOverlay( dialogFactory: BouncerDialogFactory, modifier: Modifier = Modifier, ) { val backgroundColor = Bouncer.Colors.Background val backgroundColor = viewModel.backgroundColor DisposableEffect(Unit) { onDispose { viewModel.onUiDestroyed() } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerOverlayContentViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.testKosmos import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertWithMessage import kotlinx.coroutines.flow.emptyFlow Loading Loading @@ -253,6 +254,20 @@ class BouncerOverlayContentViewModelTest : SysuiTestCase() { assertThat(currentOverlays).doesNotContain(Overlays.Bouncer) } @Test fun backgroundColor_changesBasedOnWhetherBlurIsSupported() = kosmos.runTest { kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = false runCurrent() assertThat(underTest.backgroundColor.alpha).isEqualTo(1.0f) kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = true runCurrent() assertThat(underTest.backgroundColor.alpha).isLessThan(1.0f) } private fun authMethodsToTest(): List<AuthenticationMethodModel> { return listOf(None, Pin, Password, Pattern, Sim) } Loading
packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerOverlayContentViewModel.kt +20 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyResources import android.content.Context import android.graphics.Bitmap import androidx.compose.runtime.getValue import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.key.KeyEvent import androidx.compose.ui.input.key.type import androidx.core.graphics.drawable.toBitmap Loading @@ -33,17 +35,19 @@ import com.android.systemui.authentication.shared.model.BouncerInputSide import com.android.systemui.bouncer.domain.interactor.BouncerActionButtonInteractor import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.bouncer.shared.model.BouncerActionButtonModel import com.android.systemui.bouncer.ui.BouncerColors.surfaceColor import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.Text import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardMediaKeyInteractor import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.lifecycle.HydratedActivatable import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Overlays import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.awaitCancellation Loading Loading @@ -74,7 +78,8 @@ constructor( private val bouncerActionButtonInteractor: BouncerActionButtonInteractor, private val keyguardDismissActionInteractor: KeyguardDismissActionInteractor, private val sceneInteractor: SceneInteractor, ) : ExclusiveActivatable() { private val windowRootViewBlurInteractor: WindowRootViewBlurInteractor, ) : HydratedActivatable() { private val _selectedUserImage = MutableStateFlow<Bitmap?>(null) val selectedUserImage: StateFlow<Bitmap?> = _selectedUserImage.asStateFlow() Loading Loading @@ -157,6 +162,19 @@ constructor( /** How much the bouncer UI should be scaled. */ val scale: StateFlow<Float> = bouncerInteractor.scale /** Bouncer background color */ val backgroundColor by windowRootViewBlurInteractor.isBlurCurrentlySupported .map { Color(applicationContext.surfaceColor(it)) } .hydratedStateOf( "backgroundColor", Color( applicationContext.surfaceColor( windowRootViewBlurInteractor.isBlurCurrentlySupported.value ) ), ) private val _isInputEnabled = MutableStateFlow(authenticationInteractor.lockoutEndTimestamp == null) private val isInputEnabled: StateFlow<Boolean> = _isInputEnabled.asStateFlow() Loading
packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.user.domain.interactor.selectedUserInteractor import com.android.systemui.user.ui.viewmodel.userSwitcherViewModel import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor import kotlinx.coroutines.flow.StateFlow val Kosmos.bouncerUserActionsViewModel by Fixture { BouncerUserActionsViewModel() } Loading Loading @@ -63,6 +64,7 @@ val Kosmos.bouncerOverlayContentViewModel by Fixture { bouncerActionButtonInteractor = bouncerActionButtonInteractor, keyguardDismissActionInteractor = keyguardDismissActionInteractor, sceneInteractor = sceneInteractor, windowRootViewBlurInteractor = windowRootViewBlurInteractor, ) } Loading