Merge changes I1abd0ec8,I084cb05b
* changes: Add more debug information. Add UiLayout function in SettingsPage
This commit is contained in:
@@ -175,6 +175,7 @@ class DebugActivity : ComponentActivity() {
|
||||
RegularScaffold(title = "Page - ${page.debugBrief()}") {
|
||||
Text(text = "id = ${page.id}")
|
||||
Text(text = page.debugArguments())
|
||||
Text(text = "enabled = ${page.isEnabled()}")
|
||||
Text(text = "Entry size: ${pageWithEntry.entries.size}")
|
||||
Preference(model = object : PreferenceModel {
|
||||
override val title = "open page"
|
||||
|
||||
@@ -66,6 +66,11 @@ fun SettingsEntry.debugContent(entryRepository: SettingsEntryRepository): String
|
||||
"linkFrom = ${fromPage?.debugBrief()} ${fromPage?.debugArguments()}",
|
||||
"linkTo = ${toPage?.debugBrief()} ${toPage?.debugArguments()}",
|
||||
"hierarchy_path = $entryPathWithName",
|
||||
"------ ATTRIBUTION ------",
|
||||
"allowSearch = $isAllowSearch",
|
||||
"isSearchDynamic = $isSearchDataDynamic",
|
||||
"isSearchMutable = $hasMutableStatus",
|
||||
"hasSlice = $hasSliceSupport",
|
||||
"------ SEARCH ------",
|
||||
"search_path = $entryPathWithTitle",
|
||||
searchData?.debugContent() ?: "no search data",
|
||||
|
||||
@@ -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