1 /*
<lambda>null2  * 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.AccessAlarm
22 import androidx.compose.material.icons.outlined.MusicNote
23 import androidx.compose.material.icons.outlined.MusicOff
24 import androidx.compose.runtime.Composable
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.SettingsEntry
31 import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
32 import com.android.settingslib.spa.framework.common.SettingsPageProvider
33 import com.android.settingslib.spa.framework.common.createSettingsPage
34 import com.android.settingslib.spa.framework.compose.navigator
35 import com.android.settingslib.spa.framework.theme.SettingsTheme
36 import com.android.settingslib.spa.widget.preference.Preference
37 import com.android.settingslib.spa.widget.preference.PreferenceModel
38 import com.android.settingslib.spa.widget.preference.SliderPreference
39 import com.android.settingslib.spa.widget.preference.SliderPreferenceModel
40 
41 private const val TITLE = "Sample Slider"
42 
43 object SliderPageProvider : SettingsPageProvider {
44     override val name = "Slider"
45     private val owner = createSettingsPage()
46 
47     override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
48         val entryList = mutableListOf<SettingsEntry>()
49         entryList.add(
50             SettingsEntryBuilder.create("Simple Slider", owner)
51                 .setUiLayoutFn {
52                     SliderPreference(
53                         object : SliderPreferenceModel {
54                             override val title = "Simple Slider"
55                             override val initValue = 40
56                         }
57                     )
58                 }
59                 .build()
60         )
61         entryList.add(
62             SettingsEntryBuilder.create("Slider with icon", owner)
63                 .setUiLayoutFn {
64                     SliderPreference(
65                         object : SliderPreferenceModel {
66                             override val title = "Slider with icon"
67                             override val initValue = 30
68                             override val onValueChangeFinished = {
69                                 println("onValueChangeFinished")
70                             }
71                             override val iconStart = Icons.Outlined.AccessAlarm
72                         }
73                     )
74                 }
75                 .build()
76         )
77         entryList.add(
78             SettingsEntryBuilder.create("Slider with changeable icon", owner)
79                 .setUiLayoutFn {
80                     val initValue = 0
81                     var icon by remember { mutableStateOf(Icons.Outlined.MusicOff) }
82                     var sliderPosition by remember { mutableStateOf(initValue) }
83                     SliderPreference(
84                         object : SliderPreferenceModel {
85                             override val title = "Slider with changeable icon"
86                             override val initValue = initValue
87                             override val onValueChange = { it: Int ->
88                                 sliderPosition = it
89                                 icon =
90                                     if (it > 0) Icons.Outlined.MusicNote
91                                     else Icons.Outlined.MusicOff
92                             }
93                             override val onValueChangeFinished = {
94                                 println("onValueChangeFinished: the value is $sliderPosition")
95                             }
96                             override val iconEnd = icon
97                         }
98                     )
99                 }
100                 .build()
101         )
102         entryList.add(
103             SettingsEntryBuilder.create("Slider with steps", owner)
104                 .setUiLayoutFn {
105                     SliderPreference(
106                         object : SliderPreferenceModel {
107                             override val title = "Slider with steps"
108                             override val initValue = 2
109                             override val valueRange = 1..5
110                             override val showSteps = true
111                         }
112                     )
113                 }
114                 .build()
115         )
116 
117         return entryList
118     }
119 
120     @Composable
121     fun Entry() {
122         Preference(
123             object : PreferenceModel {
124                 override val title = TITLE
125                 override val onClick = navigator(name)
126             }
127         )
128     }
129 
130     override fun getTitle(arguments: Bundle?): String {
131         return TITLE
132     }
133 }
134 
135 @Preview(showBackground = true)
136 @Composable
SliderPagePreviewnull137 private fun SliderPagePreview() {
138     SettingsTheme { SliderPageProvider.Page(null) }
139 }
140