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.settingslib.spa.gallery.banner
18 
19 import android.os.Bundle
20 import androidx.compose.foundation.clickable
21 import androidx.compose.foundation.layout.Box
22 import androidx.compose.foundation.layout.fillMaxWidth
23 import androidx.compose.foundation.layout.padding
24 import androidx.compose.material.icons.Icons
25 import androidx.compose.material.icons.outlined.Error
26 import androidx.compose.material.icons.outlined.PowerOff
27 import androidx.compose.material.icons.outlined.Shield
28 import androidx.compose.material.icons.outlined.WarningAmber
29 import androidx.compose.material3.MaterialTheme
30 import androidx.compose.material3.Text
31 import androidx.compose.runtime.Composable
32 import androidx.compose.runtime.getValue
33 import androidx.compose.runtime.mutableStateListOf
34 import androidx.compose.runtime.mutableStateOf
35 import androidx.compose.runtime.remember
36 import androidx.compose.runtime.saveable.rememberSaveable
37 import androidx.compose.runtime.setValue
38 import androidx.compose.ui.Modifier
39 import androidx.compose.ui.platform.LocalContext
40 import androidx.compose.ui.res.stringResource
41 import androidx.compose.ui.tooling.preview.Preview
42 import com.android.settingslib.spa.framework.common.SettingsPageProvider
43 import com.android.settingslib.spa.framework.compose.navigator
44 import com.android.settingslib.spa.framework.theme.SettingsDimension
45 import com.android.settingslib.spa.framework.theme.SettingsTheme
46 import com.android.settingslib.spa.gallery.R
47 import com.android.settingslib.spa.widget.banner.BannerButton
48 import com.android.settingslib.spa.widget.banner.BannerModel
49 import com.android.settingslib.spa.widget.banner.SettingsBanner
50 import com.android.settingslib.spa.widget.banner.SettingsBannerContent
51 import com.android.settingslib.spa.widget.banner.SettingsCollapsibleBanner
52 import com.android.settingslib.spa.widget.preference.Preference
53 import com.android.settingslib.spa.widget.preference.PreferenceModel
54 import com.android.settingslib.spa.widget.scaffold.RegularScaffold
55 
56 object BannerPageProvider : SettingsPageProvider {
57     override val name = "Banner"
58 
getTitlenull59     override fun getTitle(arguments: Bundle?) = TITLE
60 
61     @Composable
62     override fun Page(arguments: Bundle?) {
63         RegularScaffold(title = TITLE) {
64             SettingsBannerWithIcon()
65             SettingsBannerWithoutIcon()
66             SampleSettingsCollapsibleBanner()
67             SampleSettingsBannerContent()
68         }
69     }
70 
71     @Composable
SettingsBannerWithIconnull72     private fun SettingsBannerWithIcon() {
73         SettingsBanner(
74             BannerModel(
75                 title = stringResource(R.string.sample_title),
76                 text = stringResource(R.string.sample_text),
77                 imageVector = Icons.Outlined.WarningAmber,
78                 buttons = listOf(
79                     BannerButton(text = "Action") {},
80                 ),
81                 tintColor = MaterialTheme.colorScheme.error,
82                 containerColor = MaterialTheme.colorScheme.errorContainer,
83             )
84         )
85     }
86 
87     @Composable
SettingsBannerWithoutIconnull88     private fun SettingsBannerWithoutIcon() {
89         val sampleTitle = stringResource(R.string.sample_title)
90         var title by remember { mutableStateOf(sampleTitle) }
91         SettingsBanner(
92             BannerModel(
93                 title = title,
94                 text = stringResource(R.string.sample_text),
95             ) { title = "Clicked" }
96         )
97     }
98 
99     @Composable
SampleSettingsCollapsibleBannernull100     fun SampleSettingsCollapsibleBanner() {
101         val context = LocalContext.current
102         var isVisible0 by rememberSaveable { mutableStateOf(true) }
103         var isVisible1 by rememberSaveable { mutableStateOf(true) }
104         val banners = remember {
105             mutableStateListOf(
106                 BannerModel(
107                     title = context.getString(R.string.sample_title),
108                     text = context.getString(R.string.sample_text),
109                     imageVector = Icons.Outlined.PowerOff,
110                     isVisible = { isVisible0 },
111                     onDismiss = { isVisible0 = false },
112                     buttons = listOf(
113                         BannerButton(text = "Override") {},
114                         BannerButton(text = "Learn more") {},
115                     ),
116                 ),
117                 BannerModel(
118                     title = context.getString(R.string.sample_title),
119                     text = context.getString(R.string.sample_text),
120                     imageVector = Icons.Outlined.Shield,
121                     isVisible = { isVisible1 },
122                     onDismiss = { isVisible1 = false },
123                     buttons = listOf(
124                         BannerButton(text = "Action") {},
125                     ),
126                 )
127             )
128         }
129         SettingsCollapsibleBanner(
130             title = "More alerts",
131             imageVector = Icons.Outlined.Error,
132             models = banners.toList()
133         )
134     }
135 
136     @Composable
SampleSettingsBannerContentnull137     fun SampleSettingsBannerContent() {
138         SettingsBanner {
139             SettingsBannerContent {
140                 Box(
141                     Modifier
142                         .fillMaxWidth()
143                         .clickable { }
144                         .padding(SettingsDimension.dialogItemPadding),
145                 ) {
146                     Text(text = "Abc")
147                 }
148             }
149             SettingsBannerContent {
150                 Box(
151                     Modifier
152                         .fillMaxWidth()
153                         .clickable { }
154                         .padding(SettingsDimension.dialogItemPadding),
155                 ) {
156                     Text(text = "123")
157                 }
158             }
159         }
160     }
161 
162     @Composable
Entrynull163     fun Entry() {
164         Preference(object : PreferenceModel {
165             override val title = TITLE
166             override val onClick = navigator(name)
167         })
168     }
169 
170     private const val TITLE = "Sample Banner"
171 }
172 
173 @Preview
174 @Composable
BannerPagePreviewnull175 private fun BannerPagePreview() {
176     SettingsTheme {
177         BannerPageProvider.Page(null)
178     }
179 }
180