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

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

Support navigate with param to SpaActivity

NavHost only support start destination without params.
So do a navController navigate instead.

Also,
- Expose TogglePermissionAppList's route for Settings use.

Bug: 235727273
Test: Manual test with Gallery & Settings app
Change-Id: I6f6973371fe9e24958e5f2b733ce074bbb593460
parent cba89559
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
@@ -46,12 +48,11 @@ open class BrowseActivity(

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

        val navController = rememberNavController()
        CompositionLocalProvider(navController.localNavController()) {
            NavHost(navController, startDestination) {
            NavHost(navController, sppRepository.getDefaultStartPageName()) {
                for (page in sppRepository.getAllProviders()) {
                    composable(
                        route = page.route,
@@ -61,6 +62,16 @@ open class BrowseActivity(
                    }
                }
            }

            if (!destination.isNullOrEmpty()) {
                LaunchedEffect(Unit) {
                    navController.navigate(destination) {
                        popUpTo(navController.graph.findStartDestination().id) {
                            inclusive = true
                        }
                    }
                }
            }
        }
    }

@@ -68,6 +79,6 @@ open class BrowseActivity(
        get() = name + arguments.joinToString("") { argument -> "/{${argument.name}}" }

    companion object {
        const val KEY_START_DESTINATION = "spa:SpaActivity:startDestination"
        const val KEY_DESTINATION = "spa:SpaActivity:destination"
    }
}
+17 −6
Original line number Diff line number Diff line
@@ -16,25 +16,35 @@

package com.android.settingslib.spa.framework.compose

import androidx.activity.OnBackPressedDispatcher
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ProvidedValue
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.remember
import androidx.navigation.NavHostController

interface NavControllerWrapper {
    fun navigate(route: String)
    fun navigateUp()
    fun navigateBack()
}

@Composable
fun NavHostController.localNavController() =
    LocalNavController provides remember { NavControllerWrapperImpl(this) }
fun NavHostController.localNavController(): ProvidedValue<NavControllerWrapper> {
    val onBackPressedDispatcherOwner = LocalOnBackPressedDispatcherOwner.current
    return LocalNavController provides remember {
        NavControllerWrapperImpl(
            navController = this,
            onBackPressedDispatcher = onBackPressedDispatcherOwner?.onBackPressedDispatcher,
        )
    }
}

val LocalNavController = compositionLocalOf<NavControllerWrapper> {
    object : NavControllerWrapper {
        override fun navigate(route: String) {}

        override fun navigateUp() {}
        override fun navigateBack() {}
    }
}

@@ -46,12 +56,13 @@ fun navigator(route: String): () -> Unit {

internal class NavControllerWrapperImpl(
    private val navController: NavHostController,
    private val onBackPressedDispatcher: OnBackPressedDispatcher?,
) : NavControllerWrapper {
    override fun navigate(route: String) {
        navController.navigate(route)
    }

    override fun navigateUp() {
        navController.navigateUp()
    override fun navigateBack() {
        onBackPressedDispatcher?.onBackPressed()
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -26,13 +26,13 @@ import androidx.compose.ui.res.stringResource
import com.android.settingslib.spa.framework.compose.LocalNavController

@Composable
internal fun NavigateUp() {
internal fun NavigateBack() {
    val navController = LocalNavController.current
    val contentDescription = stringResource(
        id = androidx.appcompat.R.string.abc_action_bar_up_description,
    )
    BackAction(contentDescription) {
        navController.navigateUp()
        navController.navigateBack()
    }
}

+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ fun SettingsScaffold(
                        modifier = Modifier.padding(SettingsDimension.itemPaddingAround),
                    )
                },
                navigationIcon = { NavigateUp() },
                navigationIcon = { NavigateBack() },
                actions = actions,
                colors = settingsTopAppBarColors(),
            )
+8 −0
Original line number Diff line number Diff line
@@ -68,6 +68,14 @@ interface TogglePermissionAppListModelFactory {
            }
        )
    }

    /**
     * Gets the route to the toggle permission App List page.
     *
     * Expose route to enable enter from non-SPA pages.
     */
    fun getRoute(permissionType: String): String =
        TogglePermissionAppListPageProvider.getRoute(permissionType)
}

@Composable
Loading