1 /*
2  * Copyright (C) 2022 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.page
18 
19 import android.os.Bundle
20 import androidx.compose.material.icons.Icons
21 import androidx.compose.material.icons.outlined.Delete
22 import androidx.compose.material.icons.outlined.SystemUpdate
23 import androidx.compose.runtime.Composable
24 import androidx.compose.runtime.LaunchedEffect
25 import androidx.compose.runtime.getValue
26 import androidx.compose.runtime.mutableStateOf
27 import androidx.compose.runtime.remember
28 import androidx.compose.runtime.setValue
29 import androidx.compose.ui.tooling.preview.Preview
30 import com.android.settingslib.spa.framework.common.SettingsPageProvider
31 import com.android.settingslib.spa.framework.compose.navigator
32 import com.android.settingslib.spa.framework.theme.SettingsTheme
33 import com.android.settingslib.spa.widget.preference.Preference
34 import com.android.settingslib.spa.widget.preference.PreferenceModel
35 import com.android.settingslib.spa.widget.preference.ProgressBarPreference
36 import com.android.settingslib.spa.widget.preference.ProgressBarPreferenceModel
37 import com.android.settingslib.spa.widget.preference.ProgressBarWithDataPreference
38 import com.android.settingslib.spa.widget.scaffold.RegularScaffold
39 import com.android.settingslib.spa.widget.ui.CircularProgressBar
40 import kotlinx.coroutines.delay
41 
42 private const val TITLE = "Sample ProgressBar"
43 
44 object ProgressBarPageProvider : SettingsPageProvider {
45     override val name = "ProgressBar"
46 
47     @Composable
Entrynull48     fun Entry() {
49         Preference(object : PreferenceModel {
50             override val title = TITLE
51             override val onClick = navigator(name)
52         })
53     }
54 
getTitlenull55     override fun getTitle(arguments: Bundle?): String {
56         return TITLE
57     }
58 
59     @Composable
Pagenull60     override fun Page(arguments: Bundle?) {
61         RegularScaffold(title = getTitle(arguments)) {
62             // Auto update the progress and finally jump tp 0.4f.
63             var progress by remember { mutableStateOf(0f) }
64             LaunchedEffect(Unit) {
65                 while (progress < 1f) {
66                     delay(100)
67                     progress += 0.01f
68                 }
69                 delay(500)
70                 progress = 0.4f
71             }
72 
73             LargeProgressBar(progress)
74             SimpleProgressBar()
75             ProgressBarWithData()
76             CircularProgressBar(progress = progress, radius = 160f)
77         }
78     }
79 }
80 
81 @Composable
LargeProgressBarnull82 private fun LargeProgressBar(progress: Float) {
83     ProgressBarPreference(object : ProgressBarPreferenceModel {
84         override val title = "Large Progress Bar"
85         override val progress = progress
86         override val height = 20f
87     })
88 }
89 
90 @Composable
SimpleProgressBarnull91 private fun SimpleProgressBar() {
92     ProgressBarPreference(object : ProgressBarPreferenceModel {
93         override val title = "Simple Progress Bar"
94         override val progress = 0.2f
95         override val icon = Icons.Outlined.SystemUpdate
96     })
97 }
98 
99 @Composable
ProgressBarWithDatanull100 private fun ProgressBarWithData() {
101     ProgressBarWithDataPreference(model = object : ProgressBarPreferenceModel {
102         override val title = "Progress Bar with Data"
103         override val progress = 0.2f
104         override val icon = Icons.Outlined.Delete
105     }, data = "25G")
106 }
107 
108 @Preview(showBackground = true)
109 @Composable
ProgressBarPagePreviewnull110 private fun ProgressBarPagePreview() {
111     SettingsTheme {
112         ProgressBarPageProvider.Page(null)
113     }
114 }
115