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 Original line Diff line number Diff line
@@ -22,17 +22,12 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.overscroll
import androidx.compose.foundation.overscroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.Modifier
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 androidx.compose.ui.platform.testTag
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
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.BouncerDialogFactory
import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel
import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel
import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel
import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel
@@ -51,19 +46,6 @@ object Bouncer {
        val Content = ElementKey("BouncerContent")
        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 {
    object TestTags {
        const val Root = "bouncer_root"
        const val Root = "bouncer_root"
    }
    }
@@ -107,7 +89,7 @@ private fun ContentScope.BouncerOverlay(
    dialogFactory: BouncerDialogFactory,
    dialogFactory: BouncerDialogFactory,
    modifier: Modifier = Modifier,
    modifier: Modifier = Modifier,
) {
) {
    val backgroundColor = Bouncer.Colors.Background
    val backgroundColor = viewModel.backgroundColor


    DisposableEffect(Unit) { onDispose { viewModel.onUiDestroyed() } }
    DisposableEffect(Unit) { onDispose { viewModel.onUiDestroyed() } }


+15 −0
Original line number Original line 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.domain.startable.sceneContainerStartable
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.testKosmos
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.assertThat
import com.google.common.truth.Truth.assertWithMessage
import com.google.common.truth.Truth.assertWithMessage
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.emptyFlow
@@ -253,6 +254,20 @@ class BouncerOverlayContentViewModelTest : SysuiTestCase() {
            assertThat(currentOverlays).doesNotContain(Overlays.Bouncer)
            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> {
    private fun authMethodsToTest(): List<AuthenticationMethodModel> {
        return listOf(None, Pin, Password, Pattern, Sim)
        return listOf(None, Pin, Password, Pattern, Sim)
    }
    }
+20 −2
Original line number Original line Diff line number Diff line
@@ -20,6 +20,8 @@ import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyResources
import android.app.admin.DevicePolicyResources
import android.content.Context
import android.content.Context
import android.graphics.Bitmap
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.KeyEvent
import androidx.compose.ui.input.key.type
import androidx.compose.ui.input.key.type
import androidx.core.graphics.drawable.toBitmap
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.BouncerActionButtonInteractor
import com.android.systemui.bouncer.domain.interactor.BouncerInteractor
import com.android.systemui.bouncer.domain.interactor.BouncerInteractor
import com.android.systemui.bouncer.shared.model.BouncerActionButtonModel
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.bouncer.ui.helper.BouncerHapticPlayer
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
import com.android.systemui.common.shared.model.Text
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardMediaKeyInteractor
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.res.R
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel
import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedInject
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.awaitCancellation
@@ -74,7 +78,8 @@ constructor(
    private val bouncerActionButtonInteractor: BouncerActionButtonInteractor,
    private val bouncerActionButtonInteractor: BouncerActionButtonInteractor,
    private val keyguardDismissActionInteractor: KeyguardDismissActionInteractor,
    private val keyguardDismissActionInteractor: KeyguardDismissActionInteractor,
    private val sceneInteractor: SceneInteractor,
    private val sceneInteractor: SceneInteractor,
) : ExclusiveActivatable() {
    private val windowRootViewBlurInteractor: WindowRootViewBlurInteractor,
) : HydratedActivatable() {
    private val _selectedUserImage = MutableStateFlow<Bitmap?>(null)
    private val _selectedUserImage = MutableStateFlow<Bitmap?>(null)
    val selectedUserImage: StateFlow<Bitmap?> = _selectedUserImage.asStateFlow()
    val selectedUserImage: StateFlow<Bitmap?> = _selectedUserImage.asStateFlow()


@@ -157,6 +162,19 @@ constructor(
    /** How much the bouncer UI should be scaled. */
    /** How much the bouncer UI should be scaled. */
    val scale: StateFlow<Float> = bouncerInteractor.scale
    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 =
    private val _isInputEnabled =
        MutableStateFlow(authenticationInteractor.lockoutEndTimestamp == null)
        MutableStateFlow(authenticationInteractor.lockoutEndTimestamp == null)
    private val isInputEnabled: StateFlow<Boolean> = _isInputEnabled.asStateFlow()
    private val isInputEnabled: StateFlow<Boolean> = _isInputEnabled.asStateFlow()
+2 −0
Original line number Original line 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.scene.domain.interactor.sceneInteractor
import com.android.systemui.user.domain.interactor.selectedUserInteractor
import com.android.systemui.user.domain.interactor.selectedUserInteractor
import com.android.systemui.user.ui.viewmodel.userSwitcherViewModel
import com.android.systemui.user.ui.viewmodel.userSwitcherViewModel
import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.StateFlow


val Kosmos.bouncerUserActionsViewModel by Fixture { BouncerUserActionsViewModel() }
val Kosmos.bouncerUserActionsViewModel by Fixture { BouncerUserActionsViewModel() }
@@ -63,6 +64,7 @@ val Kosmos.bouncerOverlayContentViewModel by Fixture {
        bouncerActionButtonInteractor = bouncerActionButtonInteractor,
        bouncerActionButtonInteractor = bouncerActionButtonInteractor,
        keyguardDismissActionInteractor = keyguardDismissActionInteractor,
        keyguardDismissActionInteractor = keyguardDismissActionInteractor,
        sceneInteractor = sceneInteractor,
        sceneInteractor = sceneInteractor,
        windowRootViewBlurInteractor = windowRootViewBlurInteractor,
    )
    )
}
}