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

Commit 231baae5 authored by Andre Le's avatar Andre Le Committed by Android (Google) Code Review
Browse files

Merge "Flexiglass: Reposition keyguard ambient indicator element based on usfps" into main

parents 6bf4d14d b9e60c1b
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -136,7 +136,11 @@ constructor(
                    },
                )

            LockscreenSceneLayout(elementFactory = elementFactory, elementContext = elementContext)
            LockscreenSceneLayout(
                viewModel = viewModel,
                elementFactory = elementFactory,
                elementContext = elementContext,
            )
        }
    }
}
+20 −37
Original line number Diff line number Diff line
@@ -17,9 +17,7 @@
package com.android.systemui.keyguard.ui.composable.elements

import android.content.Context
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
@@ -28,9 +26,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import androidx.compose.ui.res.dimensionResource
import com.android.compose.animation.scene.ContentScope
import com.android.compose.modifiers.padding
import com.android.systemui.keyguard.ui.viewmodel.LockscreenLowerRegionViewModel
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.log.LogBuffer
@@ -41,10 +38,10 @@ import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenEl
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementFactory
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementFactory.Companion.lockscreenElement
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementKeys
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementKeys.AmbientIndicationArea
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementKeys.IndicationArea
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementKeys.Shortcuts
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementProvider
import com.android.systemui.res.R
import com.android.systemui.shade.ShadeDisplayAware
import javax.inject.Inject
import kotlin.collections.List
@@ -72,40 +69,27 @@ constructor(
            ) {
                val viewModel =
                    rememberViewModel("LockscreenLowerRegion") { viewModelFactory.create() }
                Column(
                    horizontalAlignment = Alignment.CenterHorizontally,
                    verticalArrangement = Arrangement.spacedBy(8.dp),
                    modifier =
                        Modifier.navigationBarsPadding().fillMaxWidth().padding(horizontal = 16.dp),
                ) {
                    if (viewModel.isAmbientIndicationVisible) {
                        factory.lockscreenElement(
                            AmbientIndicationArea,
                            context,
                            Modifier.fillMaxWidth(),
                        )
                    }

                Row(
                    verticalAlignment = Alignment.CenterVertically,
                        modifier = Modifier.fillMaxWidth(),
                    modifier =
                        Modifier.navigationBarsPadding()
                            .fillMaxWidth()
                            .padding(
                                horizontal =
                                    dimensionResource(R.dimen.keyguard_affordance_horizontal_offset)
                            ),
                ) {
                    Box(
                            Modifier.graphicsLayer {
                                translationX = viewModel.unfoldTranslations.start
                            }
                        Modifier.graphicsLayer { translationX = viewModel.unfoldTranslations.start }
                    ) {
                        factory.lockscreenElement(Shortcuts.Start, context)
                    }

                        Box(Modifier.weight(1f)) {
                            factory.lockscreenElement(IndicationArea, context)
                        }
                    Box(Modifier.weight(1f)) { factory.lockscreenElement(IndicationArea, context) }

                    Box(
                            Modifier.graphicsLayer {
                                translationX = viewModel.unfoldTranslations.end
                            }
                        Modifier.graphicsLayer { translationX = viewModel.unfoldTranslations.end }
                    ) {
                        factory.lockscreenElement(Shortcuts.End, context)
                    }
@@ -113,4 +97,3 @@ constructor(
            }
        }
}
}
+44 −15
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.systemui.keyguard.ui.composable.layout
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.HorizontalAlignmentLine
import androidx.compose.ui.layout.Layout
@@ -30,6 +29,7 @@ import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.dp
import com.android.compose.animation.scene.ContentScope
import com.android.compose.modifiers.thenIf
import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementContext
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementFactory
import com.android.systemui.plugins.keyguard.ui.composable.elements.LockscreenElementFactory.Companion.lockscreenElement
@@ -114,31 +114,36 @@ object LockIconAlignmentLines {
 */
@Composable
fun ContentScope.LockscreenSceneLayout(
    viewModel: LockscreenContentViewModel,
    elementFactory: LockscreenElementFactory,
    elementContext: LockscreenElementContext,
    modifier: Modifier = Modifier,
) {
    val density = LocalDensity.current
    val spacingAboveLockIconPx = with(density) { 64.dp.roundToPx() }
    val spacingBetweenColumnsPx = with(density) { 32.dp.roundToPx() }

    Layout(
        content = {
            elementFactory.lockscreenElement(LockscreenElementKeys.StatusBar, elementContext)
            elementFactory.lockscreenElement(LockscreenElementKeys.Region.Upper, elementContext)
            elementFactory.lockscreenElement(LockscreenElementKeys.Region.Lower, elementContext)
            elementFactory.lockscreenElement(LockscreenElementKeys.LockIcon, elementContext)
            elementFactory.lockscreenElement(
                LockscreenElementKeys.AmbientIndicationArea,
                elementContext,
            )
            elementFactory.lockscreenElement(LockscreenElementKeys.Region.Lower, elementContext)
            elementFactory.lockscreenElement(LockscreenElementKeys.SettingsMenu, elementContext)
        },
        // Hide the lock screen elements when an overlay is shown above.
        modifier = modifier.thenIf(isIdleWithOverlay()) { Modifier.graphicsLayer { alpha = 0f } },
    ) { measurables, constraints ->
        check(measurables.size == 5)
        check(measurables.size == 6)
        val statusBarMeasurable = measurables[0]
        val contentMeasurable = measurables[1]
        val bottomAreaMeasurable = measurables[2]
        val lockIconMeasurable = measurables[3]
        val settingsMenuMeasurable = measurables[4]
        val upperRegionMeasurable = measurables[1]
        val lockIconMeasurable = measurables[2]
        val ambientIndicationMeasurable = measurables[3]
        val lowerRegionMeasurable = measurables[4]
        val settingsMenuMeasurable = measurables[5]

        val statusBarPlaceable =
            statusBarMeasurable.measure(constraints = Constraints.fixedWidth(constraints.maxWidth))
@@ -156,11 +161,20 @@ fun ContentScope.LockscreenSceneLayout(
                bottom = lockIconPlaceable[LockIconAlignmentLines.Bottom],
            )

        val lockIconConstrainedMaxHeight =
        val ambientIndicationPlaceable =
            ambientIndicationMeasurable.measure(
                constraints = Constraints.fixedWidth(constraints.maxWidth)
            )

        var lockIconConstrainedMaxHeight =
            lockIconBounds.top - spacingAboveLockIconPx - statusBarPlaceable.measuredHeight

        val contentPlaceable =
            contentMeasurable.measure(
        if (!viewModel.isUdfpsSupported) {
            lockIconConstrainedMaxHeight -= ambientIndicationPlaceable.measuredHeight
        }

        val upperRegionPlaceable =
            upperRegionMeasurable.measure(
                Constraints(
                    minWidth = 0,
                    maxWidth = constraints.maxWidth.coerceAtLeast(0),
@@ -169,16 +183,31 @@ fun ContentScope.LockscreenSceneLayout(
                )
            )

        val bottomAreaPlaceable =
            bottomAreaMeasurable.measure(constraints = Constraints.fixedWidth(constraints.maxWidth))
        val lowerRegionPlaceable =
            lowerRegionMeasurable.measure(
                constraints = Constraints.fixedWidth(constraints.maxWidth)
            )

        val settingsMenuPleaceable = settingsMenuMeasurable.measure(constraints)

        layout(constraints.maxWidth, constraints.maxHeight) {
            statusBarPlaceable.place(0, 0)
            contentPlaceable.placeRelative(0, statusBarPlaceable.measuredHeight)
            bottomAreaPlaceable.place(0, constraints.maxHeight - bottomAreaPlaceable.measuredHeight)
            upperRegionPlaceable.placeRelative(0, statusBarPlaceable.measuredHeight)
            lockIconPlaceable.place(x = lockIconBounds.left, y = lockIconBounds.top)
            if (viewModel.isUdfpsSupported) {
                ambientIndicationPlaceable.place(x = 0, y = lockIconBounds.bottom)
            } else {
                ambientIndicationPlaceable.place(
                    x = 0,
                    y = lockIconBounds.top - ambientIndicationPlaceable.measuredHeight,
                )
            }

            lowerRegionPlaceable.place(
                0,
                constraints.maxHeight - lowerRegionPlaceable.measuredHeight,
            )

            settingsMenuPleaceable.placeRelative(
                x = (constraints.maxWidth - settingsMenuPleaceable.measuredWidth) / 2,
                y = constraints.maxHeight - settingsMenuPleaceable.measuredHeight,
+22 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.systemui.keyguard.ui.viewmodel
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
import com.android.systemui.flags.andSceneContainer
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
@@ -26,6 +28,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.transition.fakeKeyguardTransitionAnimationCallback
import com.android.systemui.keyguard.shared.transition.keyguardTransitionAnimationCallbackDelegator
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
@@ -149,4 +152,23 @@ class LockscreenContentViewModelTest(flags: FlagsParameterization) : SysuiTestCa

            assertThat(underTest.isContentVisible).isTrue()
        }

    fun isUdfpsSupported_withoutUdfps_false() =
        kosmos.runTest {
            val isUdfpsSupported by collectLastValue(deviceEntryUdfpsInteractor.isUdfpsSupported)

            fingerprintPropertyRepository.supportsRearFps()
            assertThat(isUdfpsSupported).isFalse()
            assertThat(underTest.isUdfpsSupported).isFalse()
        }

    @Test
    fun isUdfpsSupported_withUdfps_true() =
        kosmos.runTest {
            val isUdfpsSupported by collectLastValue(deviceEntryUdfpsInteractor.isUdfpsSupported)

            fingerprintPropertyRepository.supportsUdfps()
            assertThat(isUdfpsSupported).isTrue()
            assertThat(underTest.isUdfpsSupported).isTrue()
        }
}
+0 −16
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.systemui.keyguard.ui.viewmodel
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.authController
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.flags.andSceneContainer
import com.android.systemui.kosmos.Kosmos
@@ -31,7 +30,6 @@ import com.android.systemui.res.R
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.testKosmos
import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import java.util.Locale
import kotlinx.coroutines.Job
@@ -71,20 +69,6 @@ class LockscreenLowerRegionViewModelTest(flags: FlagsParameterization) : SysuiTe
        }
    }

    @Test
    fun isAmbientIndicationVisible_withUdfps_false() =
        kosmos.runTest {
            whenever(authController.isUdfpsSupported).thenReturn(true)
            assertThat(underTest.isAmbientIndicationVisible).isFalse()
        }

    @Test
    fun isAmbientIndicationVisible_withoutUdfps_true() =
        kosmos.runTest {
            whenever(authController.isUdfpsSupported).thenReturn(false)
            assertThat(underTest.isAmbientIndicationVisible).isTrue()
        }

    @Test
    fun unfoldTranslations() =
        kosmos.runTest {
Loading