Merge changes I1abd0ec8,I084cb05b

* changes:
  Add more debug information.
  Add UiLayout function in SettingsPage
This commit is contained in:
Zekan Qian
2023-01-31 06:45:49 +00:00
committed by Android (Google) Code Review
7 changed files with 39 additions and 17 deletions

View File

@@ -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"

View File

@@ -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",

View File

@@ -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()
}
}
}
}

View File

@@ -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,

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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) {