Add UiLayout function in SettingsPage
Bug: 244122804 Test: unit-test & local build gallery Change-Id: I084cb05b79726eb3bac09f40f4a4469beeb097fb
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
private fun getProvider(): SettingsPageProvider? {
|
||||
if (!SpaEnvironmentFactory.isReady()) return null
|
||||
val pageProviderRepository by SpaEnvironmentFactory.instance.pageProviderRepository
|
||||
return pageProviderRepository.getProviderOrNull(sppName)
|
||||
}
|
||||
|
||||
fun isEnabled(): Boolean {
|
||||
if (!SpaEnvironmentFactory.isReady()) return false
|
||||
val pageProviderRepository by SpaEnvironmentFactory.instance.pageProviderRepository
|
||||
return pageProviderRepository.getProviderOrNull(sppName)?.isEnabled(arguments) ?: false
|
||||
return getProvider()?.isEnabled(arguments) ?: false
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun UiLayout() {
|
||||
getProvider()?.Page(arguments)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user