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

Commit 492d107b authored by Shawn Lee's avatar Shawn Lee Committed by Android (Google) Code Review
Browse files

Merge "[flexiglass] Hook up notification scrim to Shade's empty click handling" into main

parents 244eacae 9f305dce
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.util.Log
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.Animatable
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.scrollBy
import androidx.compose.foundation.gestures.scrollBy
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.Spacer
@@ -233,6 +234,8 @@ fun SceneScope.NotificationScrollingStack(
    // The height of the scrim visible on screen when it is in its resting (collapsed) state.
    // The height of the scrim visible on screen when it is in its resting (collapsed) state.
    val minVisibleScrimHeight: () -> Float = { screenHeight - maxScrimTop() }
    val minVisibleScrimHeight: () -> Float = { screenHeight - maxScrimTop() }


    val isClickable by viewModel.isClickable.collectAsStateWithLifecycle()

    // we are not scrolled to the top unless the scrim is at its maximum offset.
    // we are not scrolled to the top unless the scrim is at its maximum offset.
    LaunchedEffect(viewModel, scrimOffset) {
    LaunchedEffect(viewModel, scrimOffset) {
        snapshotFlow { scrimOffset.value >= 0f }
        snapshotFlow { scrimOffset.value >= 0f }
@@ -328,6 +331,9 @@ fun SceneScope.NotificationScrollingStack(
                        )
                        )
                    )
                    )
                }
                }
                .thenIf(isClickable) {
                    Modifier.clickable(onClick = { viewModel.onEmptySpaceClicked() })
                }
    ) {
    ) {
        // Creates a cutout in the background scrim in the shape of the notifications scrim.
        // Creates a cutout in the background scrim in the shape of the notifications scrim.
        // Only visible when notif scrim alpha < 1, during shade expansion.
        // Only visible when notif scrim alpha < 1, during shade expansion.
+16 −6
Original line number Original line Diff line number Diff line
@@ -96,6 +96,7 @@ import com.android.systemui.scene.ui.composable.ComposableScene
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel
import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.phone.ui.TintedIconManager
@@ -137,6 +138,7 @@ constructor(
    private val shadeSession: SaveableSession,
    private val shadeSession: SaveableSession,
    private val notificationStackScrollView: Lazy<NotificationScrollView>,
    private val notificationStackScrollView: Lazy<NotificationScrollView>,
    private val viewModel: ShadeSceneViewModel,
    private val viewModel: ShadeSceneViewModel,
    private val notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel,
    private val tintedIconManagerFactory: TintedIconManager.Factory,
    private val tintedIconManagerFactory: TintedIconManager.Factory,
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    private val statusBarIconController: StatusBarIconController,
    private val statusBarIconController: StatusBarIconController,
@@ -156,6 +158,7 @@ constructor(
        ShadeScene(
        ShadeScene(
            notificationStackScrollView.get(),
            notificationStackScrollView.get(),
            viewModel = viewModel,
            viewModel = viewModel,
            notificationsPlaceholderViewModel = notificationsPlaceholderViewModel,
            createTintedIconManager = tintedIconManagerFactory::create,
            createTintedIconManager = tintedIconManagerFactory::create,
            createBatteryMeterViewController = batteryMeterViewControllerFactory::create,
            createBatteryMeterViewController = batteryMeterViewControllerFactory::create,
            statusBarIconController = statusBarIconController,
            statusBarIconController = statusBarIconController,
@@ -176,6 +179,7 @@ constructor(
private fun SceneScope.ShadeScene(
private fun SceneScope.ShadeScene(
    notificationStackScrollView: NotificationScrollView,
    notificationStackScrollView: NotificationScrollView,
    viewModel: ShadeSceneViewModel,
    viewModel: ShadeSceneViewModel,
    notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
    createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
    statusBarIconController: StatusBarIconController,
    statusBarIconController: StatusBarIconController,
@@ -190,6 +194,7 @@ private fun SceneScope.ShadeScene(
            SingleShade(
            SingleShade(
                notificationStackScrollView = notificationStackScrollView,
                notificationStackScrollView = notificationStackScrollView,
                viewModel = viewModel,
                viewModel = viewModel,
                notificationsPlaceholderViewModel = notificationsPlaceholderViewModel,
                createTintedIconManager = createTintedIconManager,
                createTintedIconManager = createTintedIconManager,
                createBatteryMeterViewController = createBatteryMeterViewController,
                createBatteryMeterViewController = createBatteryMeterViewController,
                statusBarIconController = statusBarIconController,
                statusBarIconController = statusBarIconController,
@@ -202,6 +207,7 @@ private fun SceneScope.ShadeScene(
            SplitShade(
            SplitShade(
                notificationStackScrollView = notificationStackScrollView,
                notificationStackScrollView = notificationStackScrollView,
                viewModel = viewModel,
                viewModel = viewModel,
                notificationsPlaceholderViewModel = notificationsPlaceholderViewModel,
                createTintedIconManager = createTintedIconManager,
                createTintedIconManager = createTintedIconManager,
                createBatteryMeterViewController = createBatteryMeterViewController,
                createBatteryMeterViewController = createBatteryMeterViewController,
                statusBarIconController = statusBarIconController,
                statusBarIconController = statusBarIconController,
@@ -218,6 +224,7 @@ private fun SceneScope.ShadeScene(
private fun SceneScope.SingleShade(
private fun SceneScope.SingleShade(
    notificationStackScrollView: NotificationScrollView,
    notificationStackScrollView: NotificationScrollView,
    viewModel: ShadeSceneViewModel,
    viewModel: ShadeSceneViewModel,
    notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
    createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
    statusBarIconController: StatusBarIconController,
    statusBarIconController: StatusBarIconController,
@@ -329,7 +336,7 @@ private fun SceneScope.SingleShade(
                        NotificationScrollingStack(
                        NotificationScrollingStack(
                            shadeSession = shadeSession,
                            shadeSession = shadeSession,
                            stackScrollView = notificationStackScrollView,
                            stackScrollView = notificationStackScrollView,
                            viewModel = viewModel.notifications,
                            viewModel = notificationsPlaceholderViewModel,
                            maxScrimTop = { maxNotifScrimTop.value },
                            maxScrimTop = { maxNotifScrimTop.value },
                            shadeMode = ShadeMode.Single,
                            shadeMode = ShadeMode.Single,
                            shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim,
                            shouldPunchHoleBehindScrim = shouldPunchHoleBehindScrim,
@@ -353,7 +360,7 @@ private fun SceneScope.SingleShade(
        }
        }
        NotificationStackCutoffGuideline(
        NotificationStackCutoffGuideline(
            stackScrollView = notificationStackScrollView,
            stackScrollView = notificationStackScrollView,
            viewModel = viewModel.notifications,
            viewModel = notificationsPlaceholderViewModel,
            modifier = Modifier.align(Alignment.BottomCenter).navigationBarsPadding()
            modifier = Modifier.align(Alignment.BottomCenter).navigationBarsPadding()
        )
        )
    }
    }
@@ -363,6 +370,7 @@ private fun SceneScope.SingleShade(
private fun SceneScope.SplitShade(
private fun SceneScope.SplitShade(
    notificationStackScrollView: NotificationScrollView,
    notificationStackScrollView: NotificationScrollView,
    viewModel: ShadeSceneViewModel,
    viewModel: ShadeSceneViewModel,
    notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
    createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
    statusBarIconController: StatusBarIconController,
    statusBarIconController: StatusBarIconController,
@@ -430,8 +438,10 @@ private fun SceneScope.SplitShade(
            label = "alphaAnimationBrightnessMirrorContentHiding",
            label = "alphaAnimationBrightnessMirrorContentHiding",
        )
        )


    viewModel.notifications.setAlphaForBrightnessMirror(contentAlpha)
    notificationsPlaceholderViewModel.setAlphaForBrightnessMirror(contentAlpha)
    DisposableEffect(Unit) { onDispose { viewModel.notifications.setAlphaForBrightnessMirror(1f) } }
    DisposableEffect(Unit) {
        onDispose { notificationsPlaceholderViewModel.setAlphaForBrightnessMirror(1f) }
    }


    val isMediaVisible by viewModel.isMediaVisible.collectAsStateWithLifecycle()
    val isMediaVisible by viewModel.isMediaVisible.collectAsStateWithLifecycle()


@@ -532,7 +542,7 @@ private fun SceneScope.SplitShade(
                NotificationScrollingStack(
                NotificationScrollingStack(
                    shadeSession = shadeSession,
                    shadeSession = shadeSession,
                    stackScrollView = notificationStackScrollView,
                    stackScrollView = notificationStackScrollView,
                    viewModel = viewModel.notifications,
                    viewModel = notificationsPlaceholderViewModel,
                    maxScrimTop = { 0f },
                    maxScrimTop = { 0f },
                    shouldPunchHoleBehindScrim = false,
                    shouldPunchHoleBehindScrim = false,
                    shouldReserveSpaceForNavBar = false,
                    shouldReserveSpaceForNavBar = false,
@@ -547,7 +557,7 @@ private fun SceneScope.SplitShade(
        }
        }
        NotificationStackCutoffGuideline(
        NotificationStackCutoffGuideline(
            stackScrollView = notificationStackScrollView,
            stackScrollView = notificationStackScrollView,
            viewModel = viewModel.notifications,
            viewModel = notificationsPlaceholderViewModel,
            modifier = Modifier.align(Alignment.BottomCenter).navigationBarsPadding()
            modifier = Modifier.align(Alignment.BottomCenter).navigationBarsPadding()
        )
        )
    }
    }
+2 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@
package com.android.systemui.keyguard.ui.viewmodel
package com.android.systemui.keyguard.ui.viewmodel


import android.platform.test.annotations.EnableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper.RunWithLooper
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.Edge
import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.SceneKey
@@ -61,6 +62,7 @@ import platform.test.runner.parameterized.Parameters


@SmallTest
@SmallTest
@RunWith(ParameterizedAndroidJunit4::class)
@RunWith(ParameterizedAndroidJunit4::class)
@RunWithLooper
@EnableSceneContainer
@EnableSceneContainer
class LockscreenSceneViewModelTest : SysuiTestCase() {
class LockscreenSceneViewModelTest : SysuiTestCase() {


+2 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.qs.ui.viewmodel
package com.android.systemui.qs.ui.viewmodel


import android.testing.TestableLooper.RunWithLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.Back
import com.android.compose.animation.scene.Back
@@ -65,6 +66,7 @@ import org.mockito.Mockito.verify


@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
@RunWithLooper
@EnableSceneContainer
@EnableSceneContainer
class QuickSettingsSceneViewModelTest : SysuiTestCase() {
class QuickSettingsSceneViewModelTest : SysuiTestCase() {


+4 −22
Original line number Original line Diff line number Diff line
@@ -51,13 +51,10 @@ import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.qs.footerActionsController
import com.android.systemui.qs.ui.adapter.fakeQSSceneAdapter
import com.android.systemui.qs.footerActionsViewModelFactory
import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver
import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver
import com.android.systemui.scene.domain.startable.sceneContainerStartable
import com.android.systemui.scene.domain.startable.sceneContainerStartable
@@ -65,16 +62,14 @@ import com.android.systemui.scene.shared.model.SceneFamilies
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.fakeSceneDataSource
import com.android.systemui.scene.shared.model.fakeSceneDataSource
import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
import com.android.systemui.settings.brightness.ui.viewmodel.brightnessMirrorViewModel
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel
import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel
import com.android.systemui.shade.ui.viewmodel.shadeHeaderViewModel
import com.android.systemui.shade.ui.viewmodel.shadeSceneViewModel
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository
import com.android.systemui.telephony.data.repository.fakeTelephonyRepository
import com.android.systemui.telephony.data.repository.fakeTelephonyRepository
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.mockito.whenever
@@ -167,7 +162,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {


    private var bouncerSceneJob: Job? = null
    private var bouncerSceneJob: Job? = null


    private val qsFlexiglassAdapter = FakeQSSceneAdapter(inflateDelegate = { mock() })
    private val qsFlexiglassAdapter = kosmos.fakeQSSceneAdapter


    private lateinit var emergencyAffordanceManager: EmergencyAffordanceManager
    private lateinit var emergencyAffordanceManager: EmergencyAffordanceManager
    private lateinit var telecomManager: TelecomManager
    private lateinit var telecomManager: TelecomManager
@@ -200,20 +195,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
        bouncerActionButtonInteractor = kosmos.bouncerActionButtonInteractor
        bouncerActionButtonInteractor = kosmos.bouncerActionButtonInteractor
        bouncerViewModel = kosmos.bouncerViewModel
        bouncerViewModel = kosmos.bouncerViewModel


        shadeSceneViewModel =
        shadeSceneViewModel = kosmos.shadeSceneViewModel
            ShadeSceneViewModel(
                applicationScope = testScope.backgroundScope,
                shadeHeaderViewModel = kosmos.shadeHeaderViewModel,
                qsSceneAdapter = qsFlexiglassAdapter,
                notifications = kosmos.notificationsPlaceholderViewModel,
                brightnessMirrorViewModel = kosmos.brightnessMirrorViewModel,
                mediaCarouselInteractor = kosmos.mediaCarouselInteractor,
                shadeInteractor = kosmos.shadeInteractor,
                footerActionsController = kosmos.footerActionsController,
                footerActionsViewModelFactory = kosmos.footerActionsViewModelFactory,
                sceneInteractor = sceneInteractor,
                unfoldTransitionInteractor = kosmos.unfoldTransitionInteractor,
            )


        val startable = kosmos.sceneContainerStartable
        val startable = kosmos.sceneContainerStartable
        startable.start()
        startable.start()
Loading