Merge "Add RegularScaffold for SpaLib"
This commit is contained in:
committed by
Android (Google) Code Review
commit
ea31999b88
@@ -17,7 +17,6 @@
|
||||
package com.android.settingslib.spa.gallery.page
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.navigation.NavType
|
||||
@@ -28,12 +27,14 @@ import com.android.settingslib.spa.framework.compose.toState
|
||||
import com.android.settingslib.spa.framework.theme.SettingsTheme
|
||||
import com.android.settingslib.spa.widget.preference.Preference
|
||||
import com.android.settingslib.spa.widget.preference.PreferenceModel
|
||||
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
|
||||
|
||||
private const val TITLE = "Sample page with arguments"
|
||||
private const val STRING_PARAM_NAME = "stringParam"
|
||||
private const val INT_PARAM_NAME = "intParam"
|
||||
|
||||
object ArgumentPageProvider : SettingsPageProvider {
|
||||
override val name = Destinations.Argument
|
||||
override val name = "Argument"
|
||||
|
||||
override val arguments = listOf(
|
||||
navArgument(STRING_PARAM_NAME) { type = NavType.StringType },
|
||||
@@ -51,17 +52,17 @@ object ArgumentPageProvider : SettingsPageProvider {
|
||||
@Composable
|
||||
fun EntryItem(stringParam: String, intParam: Int) {
|
||||
Preference(object : PreferenceModel {
|
||||
override val title = "Sample page with arguments"
|
||||
override val title = TITLE
|
||||
override val summary =
|
||||
"$STRING_PARAM_NAME=$stringParam, $INT_PARAM_NAME=$intParam".toState()
|
||||
override val onClick = navigator("${Destinations.Argument}/$stringParam/$intParam")
|
||||
override val onClick = navigator("$name/$stringParam/$intParam")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ArgumentPage(stringParam: String, intParam: Int) {
|
||||
Column {
|
||||
RegularScaffold(title = TITLE) {
|
||||
Preference(object : PreferenceModel {
|
||||
override val title = "String param value"
|
||||
override val summary = stringParam.toState()
|
||||
|
||||
@@ -17,12 +17,8 @@
|
||||
package com.android.settingslib.spa.gallery.page
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.android.settingslib.spa.framework.api.SettingsPageProvider
|
||||
import com.android.settingslib.spa.framework.compose.navigator
|
||||
@@ -30,8 +26,11 @@ import com.android.settingslib.spa.framework.compose.stateOf
|
||||
import com.android.settingslib.spa.framework.theme.SettingsTheme
|
||||
import com.android.settingslib.spa.widget.preference.Preference
|
||||
import com.android.settingslib.spa.widget.preference.PreferenceModel
|
||||
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
|
||||
import com.android.settingslib.spa.widget.ui.Footer
|
||||
|
||||
private const val TITLE = "Sample Footer"
|
||||
|
||||
object FooterPageProvider : SettingsPageProvider {
|
||||
override val name = "Footer"
|
||||
|
||||
@@ -43,7 +42,7 @@ object FooterPageProvider : SettingsPageProvider {
|
||||
@Composable
|
||||
fun EntryItem() {
|
||||
Preference(object : PreferenceModel {
|
||||
override val title = "Sample Footer"
|
||||
override val title = TITLE
|
||||
override val onClick = navigator(name)
|
||||
})
|
||||
}
|
||||
@@ -51,7 +50,7 @@ object FooterPageProvider : SettingsPageProvider {
|
||||
|
||||
@Composable
|
||||
private fun FooterPage() {
|
||||
Column(Modifier.verticalScroll(rememberScrollState())) {
|
||||
RegularScaffold(title = TITLE) {
|
||||
Preference(remember {
|
||||
object : PreferenceModel {
|
||||
override val title = "Some Preference"
|
||||
|
||||
@@ -31,7 +31,7 @@ import com.android.settingslib.spa.framework.theme.SettingsTheme
|
||||
import com.android.settingslib.spa.gallery.R
|
||||
|
||||
object HomePageProvider : SettingsPageProvider {
|
||||
override val name = Destinations.Home
|
||||
override val name = "Home"
|
||||
|
||||
@Composable
|
||||
override fun Page(arguments: Bundle?) {
|
||||
|
||||
@@ -18,14 +18,6 @@ package com.android.settingslib.spa.gallery.page
|
||||
|
||||
import com.android.settingslib.spa.framework.api.SettingsPageRepository
|
||||
|
||||
object Destinations {
|
||||
const val Home = "Home"
|
||||
const val Preference = "Preference"
|
||||
const val SwitchPreference = "SwitchPreference"
|
||||
const val Argument = "Argument"
|
||||
const val Slider = "Slider"
|
||||
}
|
||||
|
||||
val galleryPageRepository = SettingsPageRepository(
|
||||
allPages = listOf(
|
||||
HomePageProvider,
|
||||
@@ -36,5 +28,5 @@ val galleryPageRepository = SettingsPageRepository(
|
||||
SettingsPagerPageProvider,
|
||||
FooterPageProvider,
|
||||
),
|
||||
startDestination = Destinations.Home,
|
||||
startDestination = HomePageProvider.name,
|
||||
)
|
||||
|
||||
@@ -17,9 +17,6 @@
|
||||
package com.android.settingslib.spa.gallery.page
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.outlined.DisabledByDefault
|
||||
import androidx.compose.material.icons.outlined.TouchApp
|
||||
@@ -31,7 +28,6 @@ import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.produceState
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.android.settingslib.spa.framework.api.SettingsPageProvider
|
||||
import com.android.settingslib.spa.framework.compose.navigator
|
||||
@@ -39,11 +35,14 @@ import com.android.settingslib.spa.framework.compose.toState
|
||||
import com.android.settingslib.spa.framework.theme.SettingsTheme
|
||||
import com.android.settingslib.spa.widget.preference.Preference
|
||||
import com.android.settingslib.spa.widget.preference.PreferenceModel
|
||||
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
|
||||
import com.android.settingslib.spa.widget.ui.SettingsIcon
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
private const val TITLE = "Sample Preference"
|
||||
|
||||
object PreferencePageProvider : SettingsPageProvider {
|
||||
override val name = Destinations.Preference
|
||||
override val name = "Preference"
|
||||
|
||||
@Composable
|
||||
override fun Page(arguments: Bundle?) {
|
||||
@@ -53,15 +52,15 @@ object PreferencePageProvider : SettingsPageProvider {
|
||||
@Composable
|
||||
fun EntryItem() {
|
||||
Preference(object : PreferenceModel {
|
||||
override val title = "Sample Preference"
|
||||
override val onClick = navigator(Destinations.Preference)
|
||||
override val title = TITLE
|
||||
override val onClick = navigator(name)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun PreferencePage() {
|
||||
Column(Modifier.verticalScroll(rememberScrollState())) {
|
||||
RegularScaffold(title = TITLE) {
|
||||
Preference(object : PreferenceModel {
|
||||
override val title = "Preference"
|
||||
})
|
||||
|
||||
@@ -17,9 +17,6 @@
|
||||
package com.android.settingslib.spa.gallery.page
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.outlined.AccessAlarm
|
||||
import androidx.compose.material.icons.outlined.MusicNote
|
||||
@@ -29,18 +26,20 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.android.settingslib.spa.framework.api.SettingsPageProvider
|
||||
import com.android.settingslib.spa.framework.compose.navigator
|
||||
import com.android.settingslib.spa.framework.theme.SettingsTheme
|
||||
import com.android.settingslib.spa.widget.preference.Preference
|
||||
import com.android.settingslib.spa.widget.preference.PreferenceModel
|
||||
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
|
||||
import com.android.settingslib.spa.widget.ui.SettingsSlider
|
||||
import com.android.settingslib.spa.widget.ui.SettingsSliderModel
|
||||
|
||||
private const val TITLE = "Sample Slider"
|
||||
|
||||
object SliderPageProvider : SettingsPageProvider {
|
||||
override val name = Destinations.Slider
|
||||
override val name = "Slider"
|
||||
|
||||
@Composable
|
||||
override fun Page(arguments: Bundle?) {
|
||||
@@ -50,15 +49,15 @@ object SliderPageProvider : SettingsPageProvider {
|
||||
@Composable
|
||||
fun EntryItem() {
|
||||
Preference(object : PreferenceModel {
|
||||
override val title = "Sample Slider"
|
||||
override val onClick = navigator(Destinations.Slider)
|
||||
override val title = TITLE
|
||||
override val onClick = navigator(name)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun SliderPage() {
|
||||
Column(Modifier.verticalScroll(rememberScrollState())) {
|
||||
RegularScaffold(title = TITLE) {
|
||||
SettingsSlider(object : SettingsSliderModel {
|
||||
override val title = "Slider"
|
||||
override val initValue = 40
|
||||
|
||||
@@ -17,15 +17,11 @@
|
||||
package com.android.settingslib.spa.gallery.page
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.produceState
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.android.settingslib.spa.framework.api.SettingsPageProvider
|
||||
import com.android.settingslib.spa.framework.compose.navigator
|
||||
@@ -35,10 +31,13 @@ import com.android.settingslib.spa.widget.preference.Preference
|
||||
import com.android.settingslib.spa.widget.preference.PreferenceModel
|
||||
import com.android.settingslib.spa.widget.preference.SwitchPreference
|
||||
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
|
||||
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
private const val TITLE = "Sample SwitchPreference"
|
||||
|
||||
object SwitchPreferencePageProvider : SettingsPageProvider {
|
||||
override val name = Destinations.SwitchPreference
|
||||
override val name = "SwitchPreference"
|
||||
|
||||
@Composable
|
||||
override fun Page(arguments: Bundle?) {
|
||||
@@ -48,15 +47,15 @@ object SwitchPreferencePageProvider : SettingsPageProvider {
|
||||
@Composable
|
||||
fun EntryItem() {
|
||||
Preference(object : PreferenceModel {
|
||||
override val title = "Sample SwitchPreference"
|
||||
override val onClick = navigator(Destinations.SwitchPreference)
|
||||
override val title = TITLE
|
||||
override val onClick = navigator(name)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun SwitchPreferencePage() {
|
||||
Column(Modifier.verticalScroll(rememberScrollState())) {
|
||||
RegularScaffold(title = TITLE) {
|
||||
SampleSwitchPreference()
|
||||
SampleSwitchPreferenceWithSummary()
|
||||
SampleSwitchPreferenceWithAsyncSummary()
|
||||
|
||||
@@ -31,4 +31,5 @@ object SettingsDimension {
|
||||
end = itemPaddingEnd,
|
||||
bottom = itemPaddingVertical,
|
||||
)
|
||||
val itemPaddingAround = 8.dp
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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.scaffold
|
||||
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.outlined.ArrowBack
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import com.android.settingslib.spa.framework.compose.LocalNavController
|
||||
|
||||
@Composable
|
||||
internal fun NavigateUp() {
|
||||
val navController = LocalNavController.current
|
||||
val contentDescription = stringResource(
|
||||
id = androidx.appcompat.R.string.abc_action_bar_up_description,
|
||||
)
|
||||
BackAction(contentDescription) {
|
||||
navController.navigateUp()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun BackAction(contentDescription: String, onClick: () -> Unit) {
|
||||
IconButton(onClick) {
|
||||
Icon(
|
||||
imageVector = Icons.Outlined.ArrowBack,
|
||||
contentDescription = contentDescription,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* 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.scaffold
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.SmallTopAppBar
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.android.settingslib.spa.framework.theme.SettingsDimension
|
||||
import com.android.settingslib.spa.framework.theme.SettingsTheme
|
||||
|
||||
/**
|
||||
* A [Scaffold] which content is scrollable and wrapped in a [Column].
|
||||
*
|
||||
* For example, this is for the pages with some preferences and is scrollable when the items out of
|
||||
* the screen.
|
||||
*/
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun RegularScaffold(
|
||||
title: String,
|
||||
actions: @Composable RowScope.() -> Unit = {},
|
||||
content: @Composable () -> Unit,
|
||||
) {
|
||||
Scaffold(
|
||||
topBar = {
|
||||
SmallTopAppBar(
|
||||
title = {
|
||||
Text(
|
||||
text = title,
|
||||
modifier = Modifier.padding(SettingsDimension.itemPaddingAround),
|
||||
)
|
||||
},
|
||||
navigationIcon = { NavigateUp() },
|
||||
actions = actions,
|
||||
colors = settingsTopAppBarColors(),
|
||||
)
|
||||
},
|
||||
) { paddingValues ->
|
||||
Column(Modifier.verticalScroll(rememberScrollState())) {
|
||||
Spacer(Modifier.padding(paddingValues))
|
||||
content()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
internal fun settingsTopAppBarColors() = TopAppBarDefaults.largeTopAppBarColors(
|
||||
containerColor = SettingsTheme.colorScheme.surfaceHeader,
|
||||
scrolledContainerColor = SettingsTheme.colorScheme.surfaceHeader,
|
||||
)
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun RegularScaffoldPreview() {
|
||||
SettingsTheme {
|
||||
RegularScaffold(title = "Display") {}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user