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

Commit 0eb802fd authored by Zekan Qian's avatar Zekan Qian Committed by Android (Google) Code Review
Browse files

Merge "Support page open in DebugActivity"

parents 3cac9f47 541ee4e8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18,4 +18,4 @@ package com.android.settingslib.spa.gallery

import com.android.settingslib.spa.framework.DebugActivity

class GalleryDebugActivity : DebugActivity(SpaEnvironment.EntryRepository)
class GalleryDebugActivity : DebugActivity(SpaEnvironment.EntryRepository, MainActivity::class.java)
+4 −1
Original line number Diff line number Diff line
@@ -68,7 +68,10 @@ object ArgumentPageProvider : SettingsPageProvider {
    private fun buildInjectEntry(arguments: Bundle?): SettingsEntryBuilder? {
        if (!ArgumentPageModel.isValidArgument(arguments)) return null

        return SettingsEntryBuilder.createInject(SettingsPage.create(name, parameter, arguments))
        return SettingsEntryBuilder.createInject(
            entryName = ArgumentPageModel.getInjectEntryName(arguments),
            owner = SettingsPage.create(name, parameter, arguments)
        )
            // Set attributes
            .setIsAllowSearch(false)
            .setUiLayoutFn {
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.BrowseActivity
import com.android.settingslib.spa.framework.common.PageModel
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.stateOf
@@ -63,6 +64,10 @@ 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())
@@ -75,12 +80,14 @@ class ArgumentPageModel : PageModel() {
    private var arguments: Bundle? = null
    private var stringParam: String? = null
    private var intParam: Int? = null
    private var highlightName: String? = null

    override fun initialize(arguments: Bundle?) {
        logMsg("init with args " + arguments.toString())
        this.arguments = arguments
        stringParam = parameter.getStringArg(STRING_PARAM_NAME, arguments)
        intParam = parameter.getIntArg(INT_PARAM_NAME, arguments)
        highlightName = arguments?.getString(BrowseActivity.HIGHLIGHT_ENTRY_PARAM_NAME)
    }

    @Composable
+14 −5
Original line number Diff line number Diff line
@@ -26,7 +26,9 @@ import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.common.ROOT_PAGE_NAME
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
import com.android.settingslib.spa.framework.compose.localNavController
import com.android.settingslib.spa.framework.theme.SettingsTheme
@@ -48,22 +50,28 @@ open class BrowseActivity(

    @Composable
    private fun MainContent() {
        val destination = intent?.getStringExtra(KEY_DESTINATION)
        val destination =
            intent?.getStringExtra(KEY_DESTINATION) ?: sppRepository.getDefaultStartPageName()

        val navController = rememberNavController()
        CompositionLocalProvider(navController.localNavController()) {
            NavHost(navController, sppRepository.getDefaultStartPageName()) {
            NavHost(navController, ROOT_PAGE_NAME) {
                composable(ROOT_PAGE_NAME) {}
                for (page in sppRepository.getAllProviders()) {
                    composable(
                        route = page.name + page.parameter.navRoute(),
                        arguments = page.parameter,
                        route = page.name + page.parameter.navRoute() +
                            "?$HIGHLIGHT_ENTRY_PARAM_NAME={$HIGHLIGHT_ENTRY_PARAM_NAME}",
                        arguments = page.parameter + listOf(
                            // add optional parameters
                            navArgument(HIGHLIGHT_ENTRY_PARAM_NAME) { defaultValue = "null" }
                        ),
                    ) { navBackStackEntry ->
                        page.Page(navBackStackEntry.arguments)
                    }
                }
            }

            if (!destination.isNullOrEmpty()) {
            if (destination.isNotEmpty()) {
                LaunchedEffect(Unit) {
                    navController.navigate(destination) {
                        popUpTo(navController.graph.findStartDestination().id) {
@@ -77,5 +85,6 @@ open class BrowseActivity(

    companion object {
        const val KEY_DESTINATION = "spa:SpaActivity:destination"
        const val HIGHLIGHT_ENTRY_PARAM_NAME = "highlightEntry"
    }
}
+43 −3
Original line number Diff line number Diff line
@@ -16,20 +16,25 @@

package com.android.settingslib.spa.framework

import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.BrowseActivity.Companion.KEY_DESTINATION
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryRepository
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.compose.localNavController
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.toState
@@ -48,7 +53,8 @@ private const val PARAM_NAME_PAGE_ID = "pid"
private const val PARAM_NAME_ENTRY_ID = "eid"

open class DebugActivity(
    private val entryRepository: SettingsEntryRepository
    private val entryRepository: SettingsEntryRepository,
    private val browseActivityClass: Class<*>,
) : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.Theme_SpaLib_DayNight)
@@ -87,7 +93,7 @@ open class DebugActivity(

    @Composable
    fun RootPage() {
        HomeScaffold(title = "Entry Debug") {
        HomeScaffold(title = "Settings Debug") {
            Preference(object : PreferenceModel {
                override val title = "List All Pages"
                override val onClick = navigator(route = ROUTE_All_PAGES)
@@ -128,6 +134,10 @@ open class DebugActivity(
        RegularScaffold(title = "Page ${pageWithEntry.page.displayName}") {
            Text(text = pageWithEntry.page.formatArguments())
            Text(text = "Entry size: ${pageWithEntry.entries.size}")
            Preference(model = object : PreferenceModel {
                override val title = "open page"
                override val onClick = openPage(pageWithEntry.page)
            })
            EntryList(pageWithEntry.entries)
        }
    }
@@ -137,6 +147,10 @@ open class DebugActivity(
        val id = arguments!!.getInt(PARAM_NAME_ENTRY_ID)
        val entry = entryRepository.getEntry(id)!!
        RegularScaffold(title = "Entry ${entry.displayName}") {
            Preference(model = object : PreferenceModel {
                override val title = "open entry"
                override val onClick = openEntry(entry)
            })
            Text(text = entry.formatAll())
        }
    }
@@ -152,4 +166,30 @@ open class DebugActivity(
            })
        }
    }

    @Composable
    private fun openPage(page: SettingsPage): () -> Unit {
        val route = page.buildRoute()
        val context = LocalContext.current
        val intent = Intent(context, browseActivityClass).apply {
            putExtra(KEY_DESTINATION, route)
        }
        return {
            Log.d("DEBUG ACTIVITY", "Open page: $route")
            context.startActivity(intent)
        }
    }

    @Composable
    private fun openEntry(entry: SettingsEntry): () -> Unit {
        val route = entry.buildRoute()
        val context = LocalContext.current
        val intent = Intent(context, browseActivityClass).apply {
            putExtra(KEY_DESTINATION, route)
        }
        return {
            Log.d("DEBUG ACTIVITY", "Open entry: $route")
            context.startActivity(intent)
        }
    }
}
Loading