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