1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.notifications.ui.composable 18 19 import androidx.compose.foundation.layout.Column 20 import androidx.compose.foundation.layout.fillMaxWidth 21 import androidx.compose.foundation.layout.padding 22 import androidx.compose.runtime.Composable 23 import androidx.compose.ui.Alignment 24 import androidx.compose.ui.Modifier 25 import androidx.compose.ui.unit.dp 26 import com.android.compose.animation.scene.SceneScope 27 import com.android.compose.animation.scene.UserAction 28 import com.android.compose.animation.scene.UserActionResult 29 import com.android.systemui.battery.BatteryMeterViewController 30 import com.android.systemui.dagger.SysUISingleton 31 import com.android.systemui.keyguard.ui.composable.LockscreenContent 32 import com.android.systemui.notifications.ui.viewmodel.NotificationsShadeSceneViewModel 33 import com.android.systemui.scene.session.ui.composable.SaveableSession 34 import com.android.systemui.scene.shared.model.Scenes 35 import com.android.systemui.scene.ui.composable.ComposableScene 36 import com.android.systemui.shade.shared.model.ShadeMode 37 import com.android.systemui.shade.ui.composable.ExpandedShadeHeader 38 import com.android.systemui.shade.ui.composable.OverlayShade 39 import com.android.systemui.shade.ui.viewmodel.OverlayShadeViewModel 40 import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel 41 import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView 42 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel 43 import com.android.systemui.statusbar.phone.ui.StatusBarIconController 44 import com.android.systemui.statusbar.phone.ui.TintedIconManager 45 import dagger.Lazy 46 import java.util.Optional 47 import javax.inject.Inject 48 import kotlinx.coroutines.flow.StateFlow 49 50 @SysUISingleton 51 class NotificationsShadeScene 52 @Inject 53 constructor( 54 sceneViewModel: NotificationsShadeSceneViewModel, 55 private val overlayShadeViewModel: OverlayShadeViewModel, 56 private val shadeHeaderViewModel: ShadeHeaderViewModel, 57 private val notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel, 58 private val tintedIconManagerFactory: TintedIconManager.Factory, 59 private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, 60 private val statusBarIconController: StatusBarIconController, 61 private val shadeSession: SaveableSession, 62 private val stackScrollView: Lazy<NotificationScrollView>, 63 private val lockscreenContent: Lazy<Optional<LockscreenContent>>, 64 ) : ComposableScene { 65 66 override val key = Scenes.NotificationsShade 67 68 override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> = 69 sceneViewModel.destinationScenes 70 71 @Composable Contentnull72 override fun SceneScope.Content( 73 modifier: Modifier, 74 ) { 75 OverlayShade( 76 modifier = modifier, 77 viewModel = overlayShadeViewModel, 78 panelAlignment = Alignment.TopEnd, 79 lockscreenContent = lockscreenContent, 80 ) { 81 Column { 82 ExpandedShadeHeader( 83 viewModel = shadeHeaderViewModel, 84 createTintedIconManager = tintedIconManagerFactory::create, 85 createBatteryMeterViewController = batteryMeterViewControllerFactory::create, 86 statusBarIconController = statusBarIconController, 87 modifier = Modifier.padding(horizontal = 16.dp), 88 ) 89 90 NotificationScrollingStack( 91 shadeSession = shadeSession, 92 stackScrollView = stackScrollView.get(), 93 viewModel = notificationsPlaceholderViewModel, 94 maxScrimTop = { 0f }, 95 shouldPunchHoleBehindScrim = false, 96 shouldFillMaxSize = false, 97 shouldReserveSpaceForNavBar = false, 98 shadeMode = ShadeMode.Dual, 99 modifier = Modifier.fillMaxWidth(), 100 ) 101 } 102 } 103 } 104 } 105