Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e313ea01 authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Add SettingsPageProvider for SPA

Bug: 235727273
Test: Manual with Codelab app
Change-Id: I15b29c88bcbd2c55254348b43354e9db8316a328
parent ef6654ea
Loading
Loading
Loading
Loading
+3 −39
Original line number Diff line number Diff line
@@ -16,43 +16,7 @@

package com.android.settingslib.spa.codelab

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.android.settingslib.spa.framework.localNavController
import com.android.settingslib.spa.theme.SettingsTheme
import com.android.settingslib.spa.codelab.page.codelabPageRepository
import com.android.settingslib.spa.framework.SpaActivity

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MainContent()
        }
    }
}

object Destinations {
    const val Home = "Home"
    const val Preference = "Preference"
}

@Composable
private fun MainContent() {
    SettingsTheme {
        val navController = rememberNavController()
        CompositionLocalProvider(navController.localNavController()) {
            NavHost(
                navController = navController,
                startDestination = Destinations.Home,
            ) {
                composable(Destinations.Home) { HomeScreen() }
                composable(Destinations.Preference) { PreferenceCodelab() }
            }
        }
    }
}
class MainActivity : SpaActivity(codelabPageRepository)
+87 −0
Original line number Diff line number Diff line
/*
 * 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.codelab.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
import androidx.navigation.navArgument
import com.android.settingslib.spa.api.SettingsPageProvider
import com.android.settingslib.spa.framework.navigator
import com.android.settingslib.spa.framework.toState
import com.android.settingslib.spa.theme.SettingsTheme
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel

private const val STRING_PARAM_NAME = "stringParam"
private const val INT_PARAM_NAME = "intParam"

object ArgumentPageProvider : SettingsPageProvider {
    override val name = Destinations.Argument

    override val arguments = listOf(
        navArgument(STRING_PARAM_NAME) { type = NavType.StringType },
        navArgument(INT_PARAM_NAME) { type = NavType.IntType },
    )

    @Composable
    override fun Page(arguments: Bundle?) {
        ArgumentPage(
            stringParam = arguments!!.getString(STRING_PARAM_NAME, "default"),
            intParam = arguments.getInt(INT_PARAM_NAME),
        )
    }

    @Composable
    fun EntryItem(stringParam: String, intParam: Int) {
        Preference(object : PreferenceModel {
            override val title = "Sample page with arguments"
            override val summary =
                "$STRING_PARAM_NAME=$stringParam, $INT_PARAM_NAME=$intParam".toState()
            override val onClick = navigator("${Destinations.Argument}/$stringParam/$intParam")
        })
    }
}

@Composable
fun ArgumentPage(stringParam: String, intParam: Int) {
    Column {
        Preference(object : PreferenceModel {
            override val title = "String param value"
            override val summary = stringParam.toState()
        })

        Preference(object : PreferenceModel {
            override val title = "Int param value"
            override val summary = intParam.toString().toState()
        })

        ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = intParam + 1)

        ArgumentPageProvider.EntryItem(stringParam = "bar", intParam = intParam + 1)
    }
}

@Preview(showBackground = true)
@Composable
private fun ArgumentPagePreview() {
    SettingsTheme {
        ArgumentPage(stringParam = "foo", intParam = 0)
    }
}
+18 −10
Original line number Diff line number Diff line
@@ -14,8 +14,9 @@
 * limitations under the License.
 */

package com.android.settingslib.spa.codelab
package com.android.settingslib.spa.codelab.page

import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
@@ -24,14 +25,22 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.onClickNavigateTo
import com.android.settingslib.spa.api.SettingsPageProvider
import com.android.settingslib.spa.codelab.R
import com.android.settingslib.spa.theme.SettingsDimension
import com.android.settingslib.spa.theme.SettingsTheme
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel

object HomePageProvider : SettingsPageProvider {
    override val name = Destinations.Home

    @Composable
    override fun Page(arguments: Bundle?) {
        HomePage()
    }
}

@Composable
fun HomeScreen() {
private fun HomePage() {
    Column {
        Text(
            text = stringResource(R.string.app_name),
@@ -40,10 +49,9 @@ fun HomeScreen() {
            style = MaterialTheme.typography.headlineMedium,
        )

        Preference(object : PreferenceModel {
            override val title = "Preference"
            override val onClick: (() -> Unit) = onClickNavigateTo(Destinations.Preference)
        })
        PreferencePageProvider.EntryItem()

        ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = 0)
    }
}

@@ -51,6 +59,6 @@ fun HomeScreen() {
@Composable
private fun HomeScreenPreview() {
    SettingsTheme {
        HomeScreen()
        HomePage()
    }
}
+30 −0
Original line number Diff line number Diff line
/*
 * 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.codelab.page

import com.android.settingslib.spa.api.SettingsPageRepository

object Destinations {
    const val Home = "Home"
    const val Preference = "Preference"
    const val Argument = "Argument"
}

val codelabPageRepository = SettingsPageRepository(
    allPages = listOf(HomePageProvider, PreferencePageProvider, ArgumentPageProvider),
    startDestination = Destinations.Home,
)
+24 −4
Original line number Diff line number Diff line
@@ -14,8 +14,9 @@
 * limitations under the License.
 */

package com.android.settingslib.spa.codelab
package com.android.settingslib.spa.codelab.page

import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
@@ -29,14 +30,33 @@ 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.api.SettingsPageProvider
import com.android.settingslib.spa.framework.navigator
import com.android.settingslib.spa.framework.toState
import com.android.settingslib.spa.theme.SettingsTheme
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import kotlinx.coroutines.delay

object PreferencePageProvider : SettingsPageProvider {
    override val name = Destinations.Preference

    @Composable
    override fun Page(arguments: Bundle?) {
        PreferencePage()
    }

    @Composable
    fun EntryItem() {
        Preference(object : PreferenceModel {
            override val title = "Sample Preference"
            override val onClick = navigator(Destinations.Preference)
        })
    }
}

@Composable
fun PreferenceCodelab() {
private fun PreferencePage() {
    Column(Modifier.verticalScroll(rememberScrollState())) {
        Preference(object : PreferenceModel {
            override val title = "Preference"
@@ -82,8 +102,8 @@ fun PreferenceCodelab() {

@Preview(showBackground = true)
@Composable
private fun PreferenceCodelabPreview() {
private fun PreferencePagePreview() {
    SettingsTheme {
        PreferenceCodelab()
        PreferencePage()
    }
}
Loading