Merge "Better support for argument pages."

This commit is contained in:
Zekan Qian
2022-09-14 11:45:10 +00:00
committed by Android (Google) Code Review
17 changed files with 178 additions and 284 deletions

View File

@@ -52,7 +52,7 @@ object SpaEnvironment {
),
rootPages = listOf(
SettingsPage.create(HomePageProvider.name)
) + ArgumentPageProvider.buildRootPages()
)
)
}

View File

@@ -25,6 +25,7 @@ import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
import com.android.settingslib.spa.gallery.page.ArgumentPageModel
import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
import com.android.settingslib.spa.gallery.page.FooterPageProvider
import com.android.settingslib.spa.gallery.page.IllustrationPageProvider
@@ -39,52 +40,28 @@ object HomePageProvider : SettingsPageProvider {
override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
val owner = SettingsPage.create(name)
val entryList = mutableListOf<SettingsEntry>()
entryList.add(
PreferenceMainPageProvider.buildInjectEntry()
.setLink(fromPage = owner).build()
return listOf(
PreferenceMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
ArgumentPageProvider.buildInjectEntry("foo")!!.setLink(fromPage = owner).build(),
SliderPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
SpinnerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
SettingsPagerPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
FooterPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
IllustrationPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
)
entryList.add(
SliderPageProvider.buildInjectEntry()
.setLink(fromPage = owner).build()
)
entryList.add(
SpinnerPageProvider.buildInjectEntry()
.setLink(fromPage = owner).build()
)
entryList.add(
SettingsPagerPageProvider.buildInjectEntry()
.setLink(fromPage = owner).build()
)
entryList.add(
FooterPageProvider.buildInjectEntry()
.setLink(fromPage = owner).build()
)
entryList.add(
IllustrationPageProvider.buildInjectEntry()
.setLink(fromPage = owner).build()
)
return entryList
}
@Composable
override fun Page(arguments: Bundle?) {
HomePage()
}
}
@Composable
private fun HomePage() {
HomeScaffold(title = stringResource(R.string.app_name)) {
PreferenceMainPageProvider.EntryItem()
ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = 0)
SliderPageProvider.EntryItem()
SpinnerPageProvider.EntryItem()
SettingsPagerPageProvider.EntryItem()
FooterPageProvider.EntryItem()
IllustrationPageProvider.EntryItem()
HomeScaffold(title = stringResource(R.string.app_name)) {
for (entry in buildEntry(arguments)) {
if (entry.name.startsWith(ArgumentPageModel.name)) {
entry.UiLayout(ArgumentPageModel.buildArgument(intParam = 0))
} else {
entry.UiLayout()
}
}
}
}
}
@@ -92,6 +69,6 @@ private fun HomePage() {
@Composable
private fun HomeScreenPreview() {
SettingsTheme {
HomePage()
HomePageProvider.Page(null)
}
}

View File

@@ -43,7 +43,7 @@ object ArgumentPageProvider : SettingsPageProvider {
.setIsAllowSearch(true)
.setUiLayoutFn {
// Set ui rendering
Preference(ArgumentPageModel.create(arguments).genStringParamPreferenceModel())
Preference(ArgumentPageModel.create(it).genStringParamPreferenceModel())
}.build()
)
@@ -53,54 +53,44 @@ object ArgumentPageProvider : SettingsPageProvider {
.setIsAllowSearch(true)
.setUiLayoutFn {
// Set ui rendering
Preference(ArgumentPageModel.create(arguments).genIntParamPreferenceModel())
Preference(ArgumentPageModel.create(it).genIntParamPreferenceModel())
}.build()
)
val entryFoo = buildInjectEntry(ArgumentPageModel.buildNextArgument("foo", arguments))
val entryBar = buildInjectEntry(ArgumentPageModel.buildNextArgument("bar", arguments))
if (entryFoo != null) entryList.add(entryFoo.setLink(fromPage = owner).build())
if (entryBar != null) entryList.add(entryBar.setLink(fromPage = owner).build())
entryList.add(buildInjectEntry("foo")!!.setLink(fromPage = owner).build())
entryList.add(buildInjectEntry("bar")!!.setLink(fromPage = owner).build())
return entryList
}
private fun buildInjectEntry(arguments: Bundle?): SettingsEntryBuilder? {
fun buildInjectEntry(stringParam: String): SettingsEntryBuilder? {
val arguments = ArgumentPageModel.buildArgument(stringParam)
if (!ArgumentPageModel.isValidArgument(arguments)) return null
return SettingsEntryBuilder.createInject(
entryName = ArgumentPageModel.getInjectEntryName(arguments),
entryName = "${name}_$stringParam",
owner = SettingsPage.create(name, parameter, arguments)
)
// Set attributes
.setIsAllowSearch(false)
.setUiLayoutFn {
// Set ui rendering
Preference(ArgumentPageModel.create(arguments).genInjectPreferenceModel())
Preference(ArgumentPageModel.create(it).genInjectPreferenceModel())
}
}
fun buildRootPages(): List<SettingsPage> {
return listOf(
SettingsPage.create(name, parameter, ArgumentPageModel.buildArgument("foo")),
SettingsPage.create(name, parameter, ArgumentPageModel.buildArgument("bar")),
)
}
@Composable
override fun Page(arguments: Bundle?) {
RegularScaffold(title = ArgumentPageModel.create(arguments).genPageTitle()) {
for (entry in buildEntry(arguments)) {
entry.uiLayout()
if (entry.name.startsWith(name)) {
entry.UiLayout(ArgumentPageModel.buildNextArgument(arguments))
} else {
entry.UiLayout()
}
}
}
}
@Composable
fun EntryItem(stringParam: String, intParam: Int) {
buildInjectEntry(ArgumentPageModel.buildArgument(stringParam, intParam))
?.build()?.uiLayout?.let { it() }
}
}
@Preview(showBackground = true)

View File

@@ -44,19 +44,17 @@ class ArgumentPageModel : PageModel() {
navArgument(INT_PARAM_NAME) { type = NavType.IntType },
)
fun buildArgument(stringParam: String, intParam: Int? = null): Bundle {
fun buildArgument(stringParam: String? = null, intParam: Int? = null): Bundle {
val args = Bundle()
args.putString(STRING_PARAM_NAME, stringParam)
if (stringParam != null) args.putString(STRING_PARAM_NAME, stringParam)
if (intParam != null) args.putInt(INT_PARAM_NAME, intParam)
return args
}
fun buildNextArgument(newStringParam: String, arguments: Bundle? = null): Bundle {
fun buildNextArgument(arguments: Bundle? = null): Bundle {
val intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
return if (intParam == null)
buildArgument(newStringParam)
else
buildArgument(newStringParam, intParam + 1)
val nextIntParam = if (intParam != null) intParam + 1 else null
return buildArgument(intParam = nextIntParam)
}
fun isValidArgument(arguments: Bundle?): Boolean {
@@ -64,10 +62,6 @@ class ArgumentPageModel : PageModel() {
return (stringParam != null && listOf("foo", "bar").contains(stringParam))
}
fun getInjectEntryName(arguments: Bundle?): String {
return "${name}_${parameter.getStringArg(STRING_PARAM_NAME, arguments)}"
}
@Composable
fun create(arguments: Bundle?): ArgumentPageModel {
val pageModel: ArgumentPageModel = viewModel(key = arguments.toString())

View File

@@ -69,22 +69,12 @@ object FooterPageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
FooterPage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun FooterPage() {
RegularScaffold(title = TITLE) {
for (entry in FooterPageProvider.buildEntry(arguments = null)) {
entry.uiLayout()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
Footer(footerText = "Footer text always at the end of page.")
}
Footer(footerText = "Footer text always at the end of page.")
}
}
@@ -92,6 +82,6 @@ private fun FooterPage() {
@Composable
private fun FooterPagePreview() {
SettingsTheme {
FooterPage()
FooterPageProvider.Page(null)
}
}

View File

@@ -84,20 +84,10 @@ object IllustrationPageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
IllustrationPage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun IllustrationPage() {
RegularScaffold(title = TITLE) {
for (entry in IllustrationPageProvider.buildEntry(arguments = null)) {
entry.uiLayout()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
}
}
}
@@ -106,6 +96,6 @@ private fun IllustrationPage() {
@Composable
private fun IllustrationPagePreview() {
SettingsTheme {
IllustrationPage()
IllustrationPageProvider.Page(null)
}
}

View File

@@ -48,20 +48,10 @@ object SettingsPagerPageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
SettingsPagerPage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun SettingsPagerPage() {
SettingsScaffold(title = TITLE) {
SettingsPager(listOf("Personal", "Work")) {
PlaceholderTitle("Page $it")
SettingsScaffold(title = TITLE) {
SettingsPager(listOf("Personal", "Work")) {
PlaceholderTitle("Page $it")
}
}
}
}
@@ -70,6 +60,6 @@ private fun SettingsPagerPage() {
@Composable
private fun SettingsPagerPagePreview() {
SettingsTheme {
SettingsPagerPage()
SettingsPagerPageProvider.Page(null)
}
}

View File

@@ -121,20 +121,10 @@ object SliderPageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
SliderPage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun SliderPage() {
RegularScaffold(title = TITLE) {
for (entry in SliderPageProvider.buildEntry(arguments = null)) {
entry.uiLayout()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
}
}
}
@@ -143,6 +133,6 @@ private fun SliderPage() {
@Composable
private fun SliderPagePreview() {
SettingsTheme {
SliderPage()
SliderPageProvider.Page(null)
}
}

View File

@@ -74,20 +74,10 @@ object MainSwitchPreferencePageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
MainSwitchPreferencePage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun MainSwitchPreferencePage() {
RegularScaffold(title = TITLE) {
for (entry in MainSwitchPreferencePageProvider.buildEntry(arguments = null)) {
entry.uiLayout()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
}
}
}
@@ -121,6 +111,6 @@ private fun SampleNotChangeableMainSwitchPreference() {
@Composable
private fun MainSwitchPreferencePagePreview() {
SettingsTheme {
MainSwitchPreferencePage()
MainSwitchPreferencePageProvider.Page(null)
}
}

View File

@@ -33,25 +33,16 @@ object PreferenceMainPageProvider : SettingsPageProvider {
override val name = "PreferenceMain"
override fun buildEntry(arguments: Bundle?): List<SettingsEntry> {
val entryList = mutableListOf<SettingsEntry>()
entryList.add(
return listOf(
PreferencePageProvider.buildInjectEntry()
.setLink(fromPage = SettingsPage.create(name)).build()
)
entryList.add(
.setLink(fromPage = SettingsPage.create(name)).build(),
SwitchPreferencePageProvider.buildInjectEntry()
.setLink(fromPage = SettingsPage.create(name)).build()
)
entryList.add(
.setLink(fromPage = SettingsPage.create(name)).build(),
MainSwitchPreferencePageProvider.buildInjectEntry()
.setLink(fromPage = SettingsPage.create(name)).build()
)
entryList.add(
.setLink(fromPage = SettingsPage.create(name)).build(),
TwoTargetSwitchPreferencePageProvider.buildInjectEntry()
.setLink(fromPage = SettingsPage.create(name)).build()
.setLink(fromPage = SettingsPage.create(name)).build(),
)
return entryList
}
fun buildInjectEntry(): SettingsEntryBuilder {
@@ -67,21 +58,10 @@ object PreferenceMainPageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
PreferenceMain()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun PreferenceMain() {
RegularScaffold(title = TITLE) {
PreferencePageProvider.EntryItem()
SwitchPreferencePageProvider.EntryItem()
MainSwitchPreferencePageProvider.EntryItem()
TwoTargetSwitchPreferencePageProvider.EntryItem()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
}
}
}

View File

@@ -143,20 +143,10 @@ object PreferencePageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
PreferencePage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun PreferencePage() {
RegularScaffold(title = TITLE) {
for (entry in PreferencePageProvider.buildEntry(arguments = null)) {
entry.uiLayout()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
}
}
}
@@ -165,6 +155,6 @@ private fun PreferencePage() {
@Composable
private fun PreferencePagePreview() {
SettingsTheme {
PreferencePage()
PreferencePageProvider.Page(null)
}
}

View File

@@ -90,20 +90,10 @@ object SwitchPreferencePageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
SwitchPreferencePage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun SwitchPreferencePage() {
RegularScaffold(title = TITLE) {
for (entry in SwitchPreferencePageProvider.buildEntry(arguments = null)) {
entry.uiLayout()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
}
}
}
@@ -168,6 +158,6 @@ private fun SampleNotChangeableSwitchPreference() {
@Composable
private fun SwitchPreferencePagePreview() {
SettingsTheme {
SwitchPreferencePage()
SwitchPreferencePageProvider.Page(null)
}
}

View File

@@ -90,20 +90,10 @@ object TwoTargetSwitchPreferencePageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
TwoTargetSwitchPreferencePage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun TwoTargetSwitchPreferencePage() {
RegularScaffold(title = TITLE) {
for (entry in TwoTargetSwitchPreferencePageProvider.buildEntry(arguments = null)) {
entry.uiLayout()
RegularScaffold(title = TITLE) {
for (entry in buildEntry(arguments)) {
entry.UiLayout()
}
}
}
}
@@ -168,6 +158,6 @@ private fun SampleNotChangeableTwoTargetSwitchPreference() {
@Composable
private fun TwoTargetSwitchPreferencePagePreview() {
SettingsTheme {
TwoTargetSwitchPreferencePage()
TwoTargetSwitchPreferencePageProvider.Page(null)
}
}

View File

@@ -51,28 +51,20 @@ object SpinnerPageProvider : SettingsPageProvider {
@Composable
override fun Page(arguments: Bundle?) {
SpinnerPage()
}
@Composable
fun EntryItem() {
buildInjectEntry().build().uiLayout.let { it() }
}
}
@Composable
private fun SpinnerPage() {
RegularScaffold(title = TITLE) {
val selectedIndex = rememberSaveable { mutableStateOf(0) }
Spinner(
options = (1..3).map { "Option $it" },
selectedIndex = selectedIndex.value,
setIndex = { selectedIndex.value = it },
)
Preference(object : PreferenceModel {
override val title = "Selected index"
override val summary = remember { derivedStateOf { selectedIndex.value.toString() } }
})
RegularScaffold(title = TITLE) {
val selectedIndex = rememberSaveable { mutableStateOf(0) }
Spinner(
options = (1..3).map { "Option $it" },
selectedIndex = selectedIndex.value,
setIndex = { selectedIndex.value = it },
)
Preference(object : PreferenceModel {
override val title = "Selected index"
override val summary = remember {
derivedStateOf { selectedIndex.value.toString() }
}
})
}
}
}
@@ -80,6 +72,6 @@ private fun SpinnerPage() {
@Composable
private fun SpinnerPagePreview() {
SettingsTheme {
SpinnerPage()
SpinnerPageProvider.Page(null)
}
}

View File

@@ -60,6 +60,17 @@ open class DebugActivity(
setTheme(R.style.Theme_SpaLib_DayNight)
super.onCreate(savedInstanceState)
val packageName = browseActivityClass.packageName
val className = browseActivityClass.toString().removePrefix("class $packageName")
for (pageWithEntry in entryRepository.getAllPageWithEntry()) {
if (pageWithEntry.page.hasRuntimeParam()) continue
val route = pageWithEntry.page.buildRoute()
Log.d(
"DEBUG ACTIVITY",
"adb shell am start -n $packageName/$className -e $KEY_DESTINATION $route"
)
}
setContent {
SettingsTheme {
MainContent()
@@ -136,6 +147,7 @@ open class DebugActivity(
Text(text = "Entry size: ${pageWithEntry.entries.size}")
Preference(model = object : PreferenceModel {
override val title = "open page"
override val enabled = (!pageWithEntry.page.hasRuntimeParam()).toState()
override val onClick = openPage(pageWithEntry.page)
})
EntryList(pageWithEntry.entries)
@@ -149,6 +161,7 @@ open class DebugActivity(
RegularScaffold(title = "Entry ${entry.displayName}") {
Preference(model = object : PreferenceModel {
override val title = "open entry"
override val enabled = (!entry.hasRuntimeParam()).toState()
override val onClick = openEntry(entry)
})
Text(text = entry.formatAll())
@@ -168,7 +181,8 @@ open class DebugActivity(
}
@Composable
private fun openPage(page: SettingsPage): () -> Unit {
private fun openPage(page: SettingsPage): (() -> Unit)? {
if (page.hasRuntimeParam()) return null
val route = page.buildRoute()
val context = LocalContext.current
val intent = Intent(context, browseActivityClass).apply {
@@ -181,7 +195,8 @@ open class DebugActivity(
}
@Composable
private fun openEntry(entry: SettingsEntry): () -> Unit {
private fun openEntry(entry: SettingsEntry): (() -> Unit)? {
if (entry.hasRuntimeParam()) return null
val route = entry.buildRoute()
val context = LocalContext.current
val intent = Intent(context, browseActivityClass).apply {

View File

@@ -19,9 +19,9 @@ package com.android.settingslib.spa.framework.common
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavType
import com.android.settingslib.spa.framework.BrowseActivity
import com.android.settingslib.spa.framework.util.navLink
import com.android.settingslib.spa.framework.util.normalize
const val INJECT_ENTRY_NAME = "INJECT"
const val ROOT_ENTRY_NAME = "ROOT"
@@ -85,6 +85,10 @@ data class SettingsPage(
"?${BrowseActivity.HIGHLIGHT_ENTRY_PARAM_NAME}=$highlightEntryName"
return name + parameter.navLink(arguments) + highlightParam
}
fun hasRuntimeParam(): Boolean {
return parameter.hasRuntimeParam(arguments)
}
}
/**
@@ -139,7 +143,7 @@ data class SettingsEntry(
* injected entry. In the long term, we may deprecate the @Composable Page() API in SPP, and
* use each entries' UI rendering function in the page instead.
*/
val uiLayout: (@Composable () -> Unit) = {},
val uiLayoutImpl: (@Composable (arguments: Bundle?) -> Unit) = {},
) {
fun formatAll(): String {
val content = listOf<String>(
@@ -150,10 +154,25 @@ data class SettingsEntry(
return content.joinToString("\n")
}
private fun getDisplayPage(): SettingsPage {
// Display the entry on its from-page, or on its owner page if the from-page is unset.
return fromPage ?: owner
}
fun buildRoute(): String {
// Open entry in its fromPage.
val page = fromPage ?: owner
return page.buildRoute(name)
return getDisplayPage().buildRoute(name)
}
fun hasRuntimeParam(): Boolean {
return getDisplayPage().hasRuntimeParam()
}
@Composable
fun UiLayout(runtimeArguments: Bundle? = null) {
val arguments = Bundle()
if (owner.arguments != null) arguments.putAll(owner.arguments)
if (runtimeArguments != null) arguments.putAll(runtimeArguments)
uiLayoutImpl(arguments)
}
}
@@ -196,7 +215,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings
private var isAllowSearch: Boolean? = null
private var searchDataFn: () -> SearchData? = { null }
private var uiLayoutFn: (@Composable () -> Unit) = {}
private var uiLayoutFn: (@Composable (arguments: Bundle?) -> Unit) = {}
fun build(): SettingsEntry {
return SettingsEntry(
@@ -214,7 +233,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings
// functions
searchData = searchDataFn,
uiLayout = uiLayoutFn,
uiLayoutImpl = uiLayoutFn,
)
}
@@ -237,7 +256,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings
return this
}
fun setUiLayoutFn(fn: @Composable () -> Unit): SettingsEntryBuilder {
fun setUiLayoutFn(fn: @Composable (arguments: Bundle?) -> Unit): SettingsEntryBuilder {
this.uiLayoutFn = fn
return this
}
@@ -272,3 +291,33 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings
private fun String.toUniqueId(): Int {
return this.hashCode()
}
private fun List<NamedNavArgument>.normalize(arguments: Bundle? = null): Bundle? {
if (this.isEmpty()) return null
val normArgs = Bundle()
for (navArg in this) {
when (navArg.argument.type) {
NavType.StringType -> {
val value = arguments?.getString(navArg.name)
if (value != null)
normArgs.putString(navArg.name, value)
else
normArgs.putString("unset_" + navArg.name, null)
}
NavType.IntType -> {
if (arguments != null && arguments.containsKey(navArg.name))
normArgs.putInt(navArg.name, arguments.getInt(navArg.name))
else
normArgs.putString("unset_" + navArg.name, null)
}
}
}
return normArgs
}
private fun List<NamedNavArgument>.hasRuntimeParam(arguments: Bundle? = null): Boolean {
for (navArg in this) {
if (arguments == null || !arguments.containsKey(navArg.name)) return true
}
return false
}

View File

@@ -40,29 +40,6 @@ fun List<NamedNavArgument>.navLink(arguments: Bundle? = null): String {
return argsArray.joinToString("") { arg -> "/$arg" }
}
fun List<NamedNavArgument>.normalize(arguments: Bundle? = null): Bundle? {
if (this.isEmpty()) return null
val normArgs = Bundle()
for (navArg in this) {
when (navArg.argument.type) {
NavType.StringType -> {
val value = arguments?.getString(navArg.name)
if (value != null)
normArgs.putString(navArg.name, value)
else
normArgs.putString("unset_" + navArg.name, null)
}
NavType.IntType -> {
if (arguments != null && arguments.containsKey(navArg.name))
normArgs.putInt(navArg.name, arguments.getInt(navArg.name))
else
normArgs.putString("unset_" + navArg.name, null)
}
}
}
return normArgs
}
fun List<NamedNavArgument>.getStringArg(name: String, arguments: Bundle? = null): String? {
if (this.containsStringArg(name) && arguments != null) {
return arguments.getString(name)