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

Commit a2df5edd authored by Zekan Qian's avatar Zekan Qian
Browse files

Add UiLayout function in SettingsPage

Bug: 244122804
Test: unit-test & local build gallery
Change-Id: I084cb05b79726eb3bac09f40f4a4469beeb097fb
parent f0020111
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.unit.IntOffset
import androidx.core.view.WindowCompat
@@ -42,6 +43,7 @@ import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.AnimatedNavHost
import com.android.settingslib.spa.framework.compose.LocalNavController
import com.android.settingslib.spa.framework.compose.NavControllerWrapperImpl
@@ -136,7 +138,12 @@ private fun NavControllerWrapperImpl.NavContent(allProvider: Collection<Settings
                        AnimatedContentScope.SlideDirection.Right, animationSpec = slideEffect
                    ) + fadeOut(animationSpec = fadeEffect)
                },
            ) { navBackStackEntry -> spp.PageWithEvent(navBackStackEntry.arguments) }
            ) { navBackStackEntry ->
                val page = remember(navBackStackEntry.arguments) {
                    spp.createSettingsPage(navBackStackEntry.arguments)
                }
                page.PageWithEvent()
            }
        }
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings
            toPage = toPage,

            // attributes
            // TODO: set isEnabled & (isAllowSearch, hasSliceSupport) separately
            isAllowSearch = isEnabled && isAllowSearch,
            isSearchDataDynamic = isSearchDataDynamic,
            hasMutableStatus = hasMutableStatus,
+14 −5
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.settingslib.spa.framework.common

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.navigation.NamedNavArgument
import com.android.settingslib.spa.framework.util.isRuntimeParam
import com.android.settingslib.spa.framework.util.navLink
@@ -91,14 +92,22 @@ data class SettingsPage(
    }

    fun isBrowsable(): Boolean {
        return !isCreateBy(NULL_PAGE_NAME) &&
            !hasRuntimeParam()
        return !isCreateBy(NULL_PAGE_NAME) && !hasRuntimeParam()
    }

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

    fun isEnabled(): Boolean {
        return getProvider()?.isEnabled(arguments) ?: false
    }

    @Composable
    fun UiLayout() {
        getProvider()?.Page(arguments)
    }
}

+5 −1
Original line number Diff line number Diff line
@@ -71,11 +71,15 @@ abstract class SpaEnvironment(context: Context) {

    val sliceDataRepository = lazy { SettingsSliceDataRepository(entryRepository.value) }

    // In Robolectric test, applicationContext is not available. Use context as fallback.
    // The application context. Use local context as fallback when applicationContext is not
    // available (e.g. in Robolectric test).
    val appContext: Context = context.applicationContext ?: context

    // Set your SpaLogger implementation, for any SPA events logging.
    open val logger: SpaLogger = object : SpaLogger {}

    // Specify class name of browse activity and slice broadcast receiver, which is used to
    // generate the necessary intents.
    open val browseActivityClass: Class<out Activity>? = null
    open val sliceBroadcastReceiverClass: Class<out BroadcastReceiver>? = null

+5 −10
Original line number Diff line number Diff line
@@ -16,32 +16,27 @@

package com.android.settingslib.spa.framework.util

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.core.os.bundleOf
import com.android.settingslib.spa.framework.common.LOG_DATA_DISPLAY_NAME
import com.android.settingslib.spa.framework.common.LOG_DATA_SESSION_NAME
import com.android.settingslib.spa.framework.common.LogCategory
import com.android.settingslib.spa.framework.common.LogEvent
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.LifecycleEffect
import com.android.settingslib.spa.framework.compose.LocalNavController
import com.android.settingslib.spa.framework.compose.NavControllerWrapper

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

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