diff options
| author | 2022-10-19 07:36:30 +0000 | |
|---|---|---|
| committer | 2022-10-19 07:36:30 +0000 | |
| commit | 7c5159910c840a46f1909bca977e9067cadf55db (patch) | |
| tree | 39539cefbf64be50bd4890572dd2410a21f145f1 | |
| parent | f3d635674a8969341eba9eedfacd2065459d925b (diff) | |
| parent | 370a4a6f4135cc9c53a963c79c3b69937acf376d (diff) | |
Merge "Extract slider in SettingsSlider to a simple ui widget and rename the slider preference widget to SliderPreference."
| -rw-r--r-- | packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt | 12 | ||||
| -rw-r--r-- | packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SliderPreference.kt (renamed from packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/SettingsSlider.kt) | 96 | ||||
| -rw-r--r-- | packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/SettingsSlider.kt | 49 | ||||
| -rw-r--r-- | packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/SliderPreferenceTest.kt (renamed from packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/SettingsSliderTest.kt) | 8 |
4 files changed, 104 insertions, 61 deletions
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt index 0f95bf6f32c7..7567c6daf996 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/SliderPage.kt @@ -33,8 +33,8 @@ import com.android.settingslib.spa.framework.common.SettingsPage import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme -import com.android.settingslib.spa.widget.SettingsSlider -import com.android.settingslib.spa.widget.SettingsSliderModel +import com.android.settingslib.spa.widget.preference.SliderPreference +import com.android.settingslib.spa.widget.preference.SliderPreferenceModel import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold @@ -51,7 +51,7 @@ object SliderPageProvider : SettingsPageProvider { SettingsEntryBuilder.create("Simple Slider", owner) .setIsAllowSearch(true) .setUiLayoutFn { - SettingsSlider(object : SettingsSliderModel { + SliderPreference(object : SliderPreferenceModel { override val title = "Simple Slider" override val initValue = 40 }) @@ -61,7 +61,7 @@ object SliderPageProvider : SettingsPageProvider { SettingsEntryBuilder.create("Slider with icon", owner) .setIsAllowSearch(true) .setUiLayoutFn { - SettingsSlider(object : SettingsSliderModel { + SliderPreference(object : SliderPreferenceModel { override val title = "Slider with icon" override val initValue = 30 override val onValueChangeFinished = { @@ -78,7 +78,7 @@ object SliderPageProvider : SettingsPageProvider { val initValue = 0 var icon by remember { mutableStateOf(Icons.Outlined.MusicOff) } var sliderPosition by remember { mutableStateOf(initValue) } - SettingsSlider(object : SettingsSliderModel { + SliderPreference(object : SliderPreferenceModel { override val title = "Slider with changeable icon" override val initValue = initValue override val onValueChange = { it: Int -> @@ -96,7 +96,7 @@ object SliderPageProvider : SettingsPageProvider { SettingsEntryBuilder.create("Slider with steps", owner) .setIsAllowSearch(true) .setUiLayoutFn { - SettingsSlider(object : SettingsSliderModel { + SliderPreference(object : SliderPreferenceModel { override val title = "Slider with steps" override val initValue = 2 override val valueRange = 1..5 diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/SettingsSlider.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SliderPreference.kt index 822ccc680039..7bca38fdb48f 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/SettingsSlider.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/preference/SliderPreference.kt @@ -14,14 +14,13 @@ * limitations under the License. */ -package com.android.settingslib.spa.widget +package com.android.settingslib.spa.widget.preference import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.AccessAlarm import androidx.compose.material.icons.outlined.MusicNote import androidx.compose.material.icons.outlined.MusicOff import androidx.compose.material3.Icon -import androidx.compose.material3.Slider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -33,32 +32,31 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.framework.util.EntryHighlight -import com.android.settingslib.spa.widget.preference.BaseLayout -import kotlin.math.roundToInt +import com.android.settingslib.spa.widget.ui.SettingsSlider /** - * The widget model for [SettingsSlider] widget. + * The widget model for [SliderPreference] widget. */ -interface SettingsSliderModel { +interface SliderPreferenceModel { /** - * The title of this [SettingsSlider]. + * The title of this [SliderPreference]. */ val title: String /** - * The initial position of the [SettingsSlider]. + * The initial position of the [SliderPreference]. */ val initValue: Int /** - * The value range for this [SettingsSlider]. + * The value range for this [SliderPreference]. */ val valueRange: IntRange get() = 0..100 /** * The lambda to be invoked during the value change by dragging or a click. This callback is - * used to get the real time value of the [SettingsSlider]. + * used to get the real time value of the [SliderPreference]. */ val onValueChange: ((value: Int) -> Unit)? get() = null @@ -71,7 +69,7 @@ interface SettingsSliderModel { get() = null /** - * The icon image for [SettingsSlider]. If not specified, the slider hides the icon by default. + * The icon image for [SliderPreference]. If not specified, the slider hides the icon by default. */ val icon: ImageVector? get() = null @@ -90,23 +88,25 @@ interface SettingsSliderModel { /** * Settings slider widget. * - * Data is provided through [SettingsSliderModel]. + * Data is provided through [SliderPreferenceModel]. */ @Composable -fun SettingsSlider(model: SettingsSliderModel) { - SettingsSlider( - title = model.title, - initValue = model.initValue, - valueRange = model.valueRange, - onValueChange = model.onValueChange, - onValueChangeFinished = model.onValueChangeFinished, - icon = model.icon, - showSteps = model.showSteps, - ) +fun SliderPreference(model: SliderPreferenceModel) { + EntryHighlight { + SliderPreference( + title = model.title, + initValue = model.initValue, + valueRange = model.valueRange, + onValueChange = model.onValueChange, + onValueChangeFinished = model.onValueChangeFinished, + icon = model.icon, + showSteps = model.showSteps, + ) + } } @Composable -internal fun SettingsSlider( +internal fun SliderPreference( title: String, initValue: Int, modifier: Modifier = Modifier, @@ -116,37 +116,31 @@ internal fun SettingsSlider( icon: ImageVector? = null, showSteps: Boolean = false, ) { - var sliderPosition by rememberSaveable { mutableStateOf(initValue.toFloat()) } - EntryHighlight { - BaseLayout( - title = title, - subTitle = { - Slider( - value = sliderPosition, - onValueChange = { - sliderPosition = it - onValueChange?.invoke(sliderPosition.roundToInt()) - }, - modifier = modifier, - valueRange = valueRange.first.toFloat()..valueRange.last.toFloat(), - steps = if (showSteps) (valueRange.count() - 2) else 0, - onValueChangeFinished = onValueChangeFinished, - ) - }, - icon = if (icon != null) ({ - Icon(imageVector = icon, contentDescription = null) - }) else null, - ) - } + BaseLayout( + title = title, + subTitle = { + SettingsSlider( + initValue, + modifier, + valueRange, + onValueChange, + onValueChangeFinished, + showSteps + ) + }, + icon = if (icon != null) ({ + Icon(imageVector = icon, contentDescription = null) + }) else null, + ) } @Preview @Composable -private fun SettingsSliderPreview() { +private fun SliderPreferencePreview() { SettingsTheme { val initValue = 30 var sliderPosition by rememberSaveable { mutableStateOf(initValue) } - SettingsSlider( + SliderPreference( title = "Alarm Volume", initValue = 30, onValueChange = { sliderPosition = it }, @@ -160,10 +154,10 @@ private fun SettingsSliderPreview() { @Preview @Composable -private fun SettingsSliderIconChangePreview() { +private fun SliderPreferenceIconChangePreview() { SettingsTheme { var icon by remember { mutableStateOf(Icons.Outlined.MusicNote) } - SettingsSlider( + SliderPreference( title = "Media Volume", initValue = 40, onValueChange = { it: Int -> @@ -176,9 +170,9 @@ private fun SettingsSliderIconChangePreview() { @Preview @Composable -private fun SettingsSliderStepsPreview() { +private fun SliderPreferenceStepsPreview() { SettingsTheme { - SettingsSlider( + SliderPreference( title = "Display Text", initValue = 2, valueRange = 1..5, diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/SettingsSlider.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/SettingsSlider.kt new file mode 100644 index 000000000000..d8455e46ec4a --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/ui/SettingsSlider.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.widget.ui + +import androidx.compose.material3.Slider +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import kotlin.math.roundToInt + +@Composable +fun SettingsSlider( + initValue: Int, + modifier: Modifier = Modifier, + valueRange: IntRange = 0..100, + onValueChange: ((value: Int) -> Unit)? = null, + onValueChangeFinished: (() -> Unit)? = null, + showSteps: Boolean = false, +) { + var sliderPosition by rememberSaveable { mutableStateOf(initValue.toFloat()) } + Slider( + value = sliderPosition, + onValueChange = { + sliderPosition = it + onValueChange?.invoke(sliderPosition.roundToInt()) + }, + modifier = modifier, + valueRange = valueRange.first.toFloat()..valueRange.last.toFloat(), + steps = if (showSteps) (valueRange.count() - 2) else 0, + onValueChangeFinished = onValueChangeFinished, + ) +} diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/SettingsSliderTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/SliderPreferenceTest.kt index 1d95e3383b51..7ae11758a0ce 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/SettingsSliderTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/preference/SliderPreferenceTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settingslib.spa.widget +package com.android.settingslib.spa.widget.preference import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule @@ -25,14 +25,14 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class SettingsSliderTest { +class SliderPreferenceTest { @get:Rule val composeTestRule = createComposeRule() @Test fun title_displayed() { composeTestRule.setContent { - SettingsSlider(object : SettingsSliderModel { + SliderPreference(object : SliderPreferenceModel { override val title = "Slider" override val initValue = 40 }) @@ -41,5 +41,5 @@ class SettingsSliderTest { composeTestRule.onNodeWithText("Slider").assertIsDisplayed() } - // TODO: Add more unit tests for SettingsSlider widget. + // TODO: Add more unit tests for SliderPreference widget. } |