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