Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt +8 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() } } } } Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt +14 −5 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } } Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/PageLogger.kt +5 −10 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt +8 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() } } } } Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt +14 −5 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } } Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/PageLogger.kt +5 −10 Original line number Diff line number Diff line Loading @@ -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) { Loading