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