• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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.compose.animation.scene.demo
18 
19 import androidx.compose.foundation.background
20 import androidx.compose.foundation.layout.Box
21 import androidx.compose.foundation.layout.Column
22 import androidx.compose.foundation.layout.Row
23 import androidx.compose.foundation.layout.Spacer
24 import androidx.compose.foundation.layout.fillMaxSize
25 import androidx.compose.foundation.layout.fillMaxWidth
26 import androidx.compose.foundation.layout.padding
27 import androidx.compose.foundation.pager.rememberPagerState
28 import androidx.compose.foundation.shape.RoundedCornerShape
29 import androidx.compose.material3.LocalContentColor
30 import androidx.compose.runtime.Composable
31 import androidx.compose.runtime.CompositionLocalProvider
32 import androidx.compose.ui.Modifier
33 import androidx.compose.ui.draw.clip
34 import androidx.compose.ui.graphics.Color
35 import androidx.compose.ui.unit.dp
36 import com.android.compose.animation.scene.Back
37 import com.android.compose.animation.scene.ContentScope
38 import com.android.compose.animation.scene.ElementKey
39 import com.android.compose.animation.scene.SceneKey
40 import com.android.compose.animation.scene.Swipe
41 import com.android.compose.animation.scene.UserAction
42 import com.android.compose.animation.scene.UserActionResult
43 
44 object SplitShade {
userActionsnull45     fun userActions(
46         isLockscreenDismissed: Boolean,
47         lockscreenScene: SceneKey,
48     ): Map<UserAction, UserActionResult> {
49         val previousScreen =
50             if (isLockscreenDismissed) {
51                 Scenes.Launcher
52             } else {
53                 lockscreenScene
54             }
55 
56         return mapOf(Back to previousScreen, Swipe.Up to previousScreen)
57     }
58 
59     object Elements {
60         val Background = ElementKey("SplitShadeBackground")
61     }
62 
63     object Shapes {
64         val Scrim = RoundedCornerShape(Shade.Dimensions.ScrimCornerSize)
65     }
66 }
67 
68 @Composable
SplitShadenull69 fun ContentScope.SplitShade(
70     notificationList: @Composable ContentScope.() -> Unit,
71     mediaPlayer: @Composable (ContentScope.() -> Unit)?,
72     quickSettingsTiles: List<QuickSettingsTileViewModel>,
73     nQuickSettingsRows: Int,
74     nQuickSettingsColumns: Int,
75     onSettingsButtonClicked: () -> Unit,
76     onPowerButtonClicked: () -> Unit,
77     modifier: Modifier = Modifier,
78 ) {
79     Box(modifier) {
80         Box(modifier.element(SplitShade.Elements.Background).fillMaxSize().background(Color.Black))
81 
82         CompositionLocalProvider(LocalContentColor provides Color.White) {
83             Column(
84                 Modifier.fillMaxSize()
85                     .padding(top = 16.dp, bottom = 32.dp, start = 16.dp, end = 16.dp)
86             ) {
87                 Row(Modifier.fillMaxWidth()) {
88                     ShadeTime(scale = 1f)
89                     ShadeDate(Modifier.padding(start = 16.dp).element(Shade.Elements.Date))
90                     Spacer(Modifier.weight(1f))
91                     Operator()
92                     BatteryPercentage(Modifier.padding(start = 16.dp))
93                 }
94 
95                 Row(Modifier.fillMaxWidth().padding(top = 16.dp)) {
96                     Column(Modifier.weight(1f).padding(top = QuickSettings.Dimensions.Padding)) {
97                         val horizontalPaddingModifier = QuickSettings.Modifiers.HorizontalPadding
98 
99                         BrightnessSlider(horizontalPaddingModifier)
100 
101                         val nPages =
102                             nQuickSettingsPages(
103                                 nTiles = quickSettingsTiles.size,
104                                 nRows = nQuickSettingsRows,
105                                 nColumns = nQuickSettingsColumns,
106                             )
107 
108                         QuickSettingsPager(
109                             pagerState = rememberPagerState { nPages },
110                             tiles = quickSettingsTiles,
111                             nRows = nQuickSettingsRows,
112                             nColumns = nQuickSettingsColumns,
113                             Modifier.padding(top = QuickSettings.Dimensions.Padding),
114                         )
115 
116                         if (mediaPlayer != null) {
117                             Box(horizontalPaddingModifier.padding()) { mediaPlayer() }
118                         }
119 
120                         Spacer(Modifier.weight(1f))
121                         FooterActions(
122                             onSettingsButtonClicked,
123                             onPowerButtonClicked,
124                             horizontalPaddingModifier.element(QuickSettings.Elements.FooterActions),
125                         )
126                     }
127 
128                     Box(Modifier.weight(1f).padding(start = 16.dp).clip(SplitShade.Shapes.Scrim)) {
129                         Box(
130                             Modifier.element(Shade.Elements.ScrimBackground)
131                                 .fillMaxSize()
132                                 .background(Shade.Colors.Scrim)
133                         )
134 
135                         notificationList()
136                     }
137                 }
138             }
139         }
140     }
141 }
142