diff options
| author | 2023-01-31 10:17:20 +0800 | |
|---|---|---|
| committer | 2023-01-31 11:58:27 +0800 | |
| commit | a2df5eddefe4790c0bd9f6c166f4cec82f7304d0 (patch) | |
| tree | 3ba1cabc77ead9bfef8610b6d2283d07e5666fc7 | |
| parent | f00201114c57fb11fd9f2d3948e5521e09d59993 (diff) | |
Add UiLayout function in SettingsPage
Bug: 244122804
Test: unit-test & local build gallery
Change-Id: I084cb05b79726eb3bac09f40f4a4469beeb097fb
5 files changed, 33 insertions, 17 deletions
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt index 4d8b89bf12aa..a8432d60065a 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt @@ -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() + } } } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt index 2175e55cd49e..44714ab19ee2 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt @@ -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, diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt index a362877fe88c..8bbeb628b3de 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt @@ -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) } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt index f672ee01d070..02962a5815a2 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt @@ -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 diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/PageLogger.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/PageLogger.kt index 22a4563748d5..dde4e0464597 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/PageLogger.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/PageLogger.kt @@ -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) { |