Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26b2f663 authored by Chandru S's avatar Chandru S
Browse files

Change the background color of the bouncer based on whether blur is supported or not

Bug: 388068805
Test: unit test
Test: verified manually with battery saver enabled/disabled
Flag: com.android.systemui.scene_container
Change-Id: I8ce8fbfc8bcd913611aa88071380369f17b41cb4
parent 59f35e58
Loading
Loading
Loading
Loading
+1 −19
Original line number Diff line number Diff line
@@ -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
@@ -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"
    }
@@ -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() } }

+15 −0
Original line number Diff line number Diff line
@@ -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
@@ -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)
    }
+20 −2
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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()

@@ -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()
+2 −0
Original line number Diff line number Diff line
@@ -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() }
@@ -63,6 +64,7 @@ val Kosmos.bouncerOverlayContentViewModel by Fixture {
        bouncerActionButtonInteractor = bouncerActionButtonInteractor,
        keyguardDismissActionInteractor = keyguardDismissActionInteractor,
        sceneInteractor = sceneInteractor,
        windowRootViewBlurInteractor = windowRootViewBlurInteractor,
    )
}