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

Commit 839e10f8 authored by Zekan Qian's avatar Zekan Qian
Browse files

Add isEnabled API in SPP.

API isEnabled is used to specify whether the page is enabled during
migration. Once it is disabled, all its functionalities, such as
browsing / search / slice provider are disabled.

Bug: 244122804
Test: unit-test & local build gallery
Change-Id: I4f3f83e314b624fd2f6f83e0d1f64f426efb0350
parent db87c407
Loading
Loading
Loading
Loading
+6 −13
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ import com.android.settingslib.spa.framework.compose.composable
import com.android.settingslib.spa.framework.compose.localNavController
import com.android.settingslib.spa.framework.compose.rememberAnimatedNavController
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.framework.util.PageEvent
import com.android.settingslib.spa.framework.util.PageWithEvent
import com.android.settingslib.spa.framework.util.getDestination
import com.android.settingslib.spa.framework.util.getEntryId
import com.android.settingslib.spa.framework.util.getSessionName
@@ -118,32 +118,25 @@ private fun NavControllerWrapperImpl.NavContent(allProvider: Collection<Settings
                arguments = spp.parameter,
                enterTransition = {
                    slideIntoContainer(
                        AnimatedContentScope.SlideDirection.Left,
                        animationSpec = slideEffect
                        AnimatedContentScope.SlideDirection.Left, animationSpec = slideEffect
                    ) + fadeIn(animationSpec = fadeEffect)
                },
                exitTransition = {
                    slideOutOfContainer(
                        AnimatedContentScope.SlideDirection.Left,
                        animationSpec = slideEffect
                        AnimatedContentScope.SlideDirection.Left, animationSpec = slideEffect
                    ) + fadeOut(animationSpec = fadeEffect)
                },
                popEnterTransition = {
                    slideIntoContainer(
                        AnimatedContentScope.SlideDirection.Right,
                        animationSpec = slideEffect
                        AnimatedContentScope.SlideDirection.Right, animationSpec = slideEffect
                    ) + fadeIn(animationSpec = fadeEffect)
                },
                popExitTransition = {
                    slideOutOfContainer(
                        AnimatedContentScope.SlideDirection.Right,
                        animationSpec = slideEffect
                        AnimatedContentScope.SlideDirection.Right, animationSpec = slideEffect
                    ) + fadeOut(animationSpec = fadeEffect)
                },
            ) { navBackStackEntry ->
                spp.PageEvent(navBackStackEntry.arguments)
                spp.Page(navBackStackEntry.arguments)
            }
            ) { navBackStackEntry -> spp.PageWithEvent(navBackStackEntry.arguments) }
        }
    }
}
+4 −2
Original line number Diff line number Diff line
@@ -185,6 +185,8 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings
    private var sliceDataFn: SliceDataGetter = { _: Uri, _: Bundle? -> null }

    fun build(): SettingsEntry {
        val page = fromPage ?: owner
        val isEnabled = page.isEnabled()
        return SettingsEntry(
            id = id(),
            name = name,
@@ -196,10 +198,10 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings
            toPage = toPage,

            // attributes
            isAllowSearch = isAllowSearch,
            isAllowSearch = isEnabled && isAllowSearch,
            isSearchDataDynamic = isSearchDataDynamic,
            hasMutableStatus = hasMutableStatus,
            hasSliceSupport = hasSliceSupport,
            hasSliceSupport = isEnabled && hasSliceSupport,

            // functions
            statusDataImpl = statusDataFn,
+6 −0
Original line number Diff line number Diff line
@@ -94,6 +94,12 @@ data class SettingsPage(
        return !isCreateBy(NULL_PAGE_NAME) &&
            !hasRuntimeParam()
    }

    fun isEnabled(): Boolean {
        if (!SpaEnvironmentFactory.isReady()) return false
        val pageProviderRepository by SpaEnvironmentFactory.instance.pageProviderRepository
        return pageProviderRepository.getProviderOrNull(sppName)?.isEnabled(arguments) ?: false
    }
}

fun SettingsPageProvider.createSettingsPage(arguments: Bundle? = null): SettingsPage {
+8 −0
Original line number Diff line number Diff line
@@ -37,6 +37,14 @@ interface SettingsPageProvider {
    val parameter: List<NamedNavArgument>
        get() = emptyList()

    /**
     * The API to indicate whether the page is enabled or not.
     * During SPA page migration, one can use it to enable certain pages in one release.
     * When the page is disabled, all its related functionalities, such as browsing, search,
     * slice provider, are disabled as well.
     */
    fun isEnabled(arguments: Bundle?): Boolean = true

    fun getTitle(arguments: Bundle?): String = displayName

    fun buildEntry(arguments: Bundle?): List<SettingsEntry> = emptyList()
+3 −1
Original line number Diff line number Diff line
@@ -33,13 +33,15 @@ import com.android.settingslib.spa.framework.compose.LocalNavController
import com.android.settingslib.spa.framework.compose.NavControllerWrapper

@Composable
internal fun SettingsPageProvider.PageEvent(arguments: Bundle? = null) {
internal fun SettingsPageProvider.PageWithEvent(arguments: Bundle? = null) {
    if (!isEnabled(arguments)) return
    val page = remember(arguments) { createSettingsPage(arguments) }
    val navController = LocalNavController.current
    LifecycleEffect(
        onStart = { page.logPageEvent(LogEvent.PAGE_ENTER, navController) },
        onStop = { page.logPageEvent(LogEvent.PAGE_LEAVE, navController) },
    )
    Page(arguments)
}

private fun SettingsPage.logPageEvent(event: LogEvent, navController: NavControllerWrapper) {
Loading