Loading packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +3 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.settingslib.spa.gallery import com.android.settingslib.spa.framework.common.LocalLogger import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository import com.android.settingslib.spa.framework.common.SpaEnvironment import com.android.settingslib.spa.framework.common.createSettingsPage Loading Loading @@ -75,4 +76,6 @@ object GallerySpaEnvironment : SpaEnvironment() { override val browseActivityClass = GalleryMainActivity::class.java override val entryProviderAuthorities = "com.android.spa.gallery.provider" override val logger = LocalLogger() } packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt +6 −6 Original line number Diff line number Diff line Loading @@ -17,13 +17,13 @@ package com.android.settingslib.spa.gallery.page import android.os.Bundle import android.util.Log import androidx.compose.runtime.Composable import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavType import androidx.navigation.navArgument import com.android.settingslib.spa.framework.common.EntrySearchData import com.android.settingslib.spa.framework.common.PageModel import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.framework.util.getIntArg Loading @@ -32,6 +32,8 @@ import com.android.settingslib.spa.framework.util.navLink import com.android.settingslib.spa.gallery.SettingsPageProviderEnum import com.android.settingslib.spa.widget.preference.PreferenceModel private const val TAG = "ArgumentPageModel" // Defines all the resources for this page. // In real Settings App, resources data is defined in xml, rather than SPP. private const val PAGE_TITLE = "Sample page with arguments" Loading Loading @@ -93,7 +95,9 @@ class ArgumentPageModel : PageModel() { private var intParam: Int? = null override fun initialize(arguments: Bundle?) { logMsg("init with args " + arguments.toString()) SpaEnvironmentFactory.instance.logger.message( TAG, "Initialize with args " + arguments.toString() ) this.arguments = arguments stringParam = parameter.getStringArg(STRING_PARAM_NAME, arguments) intParam = parameter.getIntArg(INT_PARAM_NAME, arguments) Loading Loading @@ -135,7 +139,3 @@ class ArgumentPageModel : PageModel() { } } } private fun logMsg(message: String) { Log.d("ArgumentPageModel", message) } packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt +8 −5 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import com.android.settingslib.spa.framework.common.EntrySearchData import com.android.settingslib.spa.framework.common.SettingsEntry import com.android.settingslib.spa.framework.common.SettingsEntryBuilder 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.toState import com.android.settingslib.spa.framework.theme.SettingsTheme Loading @@ -44,13 +45,14 @@ import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Compan import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_KEYWORDS import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_SUMMARY import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_TITLE import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.logMsg import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.preference.SimplePreferenceMacro import com.android.settingslib.spa.widget.scaffold.RegularScaffold import com.android.settingslib.spa.widget.ui.SettingsIcon private const val TAG = "PreferencePage" object PreferencePageProvider : SettingsPageProvider { // Defines all entry name in this page. // Note that entry name would be used in log. DO NOT change it once it is set. Loading @@ -67,6 +69,7 @@ object PreferencePageProvider : SettingsPageProvider { override val name = SettingsPageProviderEnum.PREFERENCE.name override val displayName = SettingsPageProviderEnum.PREFERENCE.displayName private val spaLogger = SpaEnvironmentFactory.instance.logger private val owner = createSettingsPage() private fun createEntry(entry: EntryEnum): SettingsEntryBuilder { Loading @@ -79,7 +82,7 @@ object PreferencePageProvider : SettingsPageProvider { createEntry(EntryEnum.SIMPLE_PREFERENCE) .setIsAllowSearch(true) .setMacro { logMsg("create macro for ${EntryEnum.SIMPLE_PREFERENCE}") spaLogger.message(TAG, "create macro for ${EntryEnum.SIMPLE_PREFERENCE}") SimplePreferenceMacro(title = SIMPLE_PREFERENCE_TITLE) } .build() Loading @@ -88,7 +91,7 @@ object PreferencePageProvider : SettingsPageProvider { createEntry(EntryEnum.SUMMARY_PREFERENCE) .setIsAllowSearch(true) .setMacro { logMsg("create macro for ${EntryEnum.SUMMARY_PREFERENCE}") spaLogger.message(TAG, "create macro for ${EntryEnum.SUMMARY_PREFERENCE}") SimplePreferenceMacro( title = SIMPLE_PREFERENCE_TITLE, summary = SIMPLE_PREFERENCE_SUMMARY, Loading @@ -102,7 +105,7 @@ object PreferencePageProvider : SettingsPageProvider { createEntry(EntryEnum.DISABLED_PREFERENCE) .setIsAllowSearch(true) .setMacro { logMsg("create macro for ${EntryEnum.DISABLED_PREFERENCE}") spaLogger.message(TAG, "create macro for ${EntryEnum.DISABLED_PREFERENCE}") SimplePreferenceMacro( title = DISABLE_PREFERENCE_TITLE, summary = DISABLE_PREFERENCE_SUMMARY, Loading Loading @@ -188,7 +191,7 @@ object PreferencePageProvider : SettingsPageProvider { return SettingsEntryBuilder.createInject(owner = owner) .setIsAllowSearch(true) .setMacro { logMsg("create macro for INJECT entry") spaLogger.message(TAG, "create macro for INJECT entry") SimplePreferenceMacro( title = PAGE_TITLE, clickRoute = SettingsPageProviderEnum.PREFERENCE.name Loading packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageModel.kt +13 −14 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.settingslib.spa.gallery.preference import android.os.Bundle import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf Loading @@ -27,11 +26,14 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import com.android.settingslib.spa.framework.common.PageModel import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch private const val TAG = "PreferencePageModel" class PreferencePageModel : PageModel() { companion object { // Defines all the resources for this page. Loading @@ -53,12 +55,10 @@ class PreferencePageModel : PageModel() { pageModel.initOnce() return pageModel } fun logMsg(message: String) { Log.d("PreferencePageModel", message) } } private val spaLogger = SpaEnvironmentFactory.instance.logger private val asyncSummary = mutableStateOf(" ") private val manualUpdater = mutableStateOf(0) Loading @@ -67,26 +67,25 @@ class PreferencePageModel : PageModel() { private var tick = 0 private var updateJob: Job? = null override fun onActive() { logMsg("autoUpdater.active") spaLogger.message(TAG, "autoUpdater.active") updateJob = viewModelScope.launch(Dispatchers.IO) { while (true) { delay(1000L) tick++ logMsg("autoUpdater.value $tick") spaLogger.message(TAG, "autoUpdater.value $tick") postValue(tick.toString()) } } } override fun onInactive() { logMsg("autoUpdater.inactive") spaLogger.message(TAG, "autoUpdater.inactive") updateJob?.cancel() } } override fun initialize(arguments: Bundle?) { logMsg("init with args " + arguments.toString()) spaLogger.message(TAG, "initialize with args " + arguments.toString()) viewModelScope.launch(Dispatchers.IO) { delay(2000L) asyncSummary.value = ASYNC_PREFERENCE_SUMMARY Loading @@ -94,22 +93,22 @@ class PreferencePageModel : PageModel() { } fun getAsyncSummary(): State<String> { logMsg("getAsyncSummary") spaLogger.message(TAG, "getAsyncSummary") return asyncSummary } fun getManualUpdaterSummary(): State<String> { logMsg("getManualUpdaterSummary") spaLogger.message(TAG, "getManualUpdaterSummary") return derivedStateOf { manualUpdater.value.toString() } } fun manualUpdaterOnClick() { logMsg("manualUpdaterOnClick") spaLogger.message(TAG, "manualUpdaterOnClick") manualUpdater.value = manualUpdater.value + 1 } fun getAutoUpdaterSummary(): LiveData<String> { logMsg("getAutoUpdaterSummary") spaLogger.message(TAG, "getAutoUpdaterSummary") return autoUpdater } } packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt +43 −6 Original line number Diff line number Diff line Loading @@ -17,20 +17,25 @@ package com.android.settingslib.spa.framework import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.android.settingslib.spa.R import com.android.settingslib.spa.framework.common.LogCategory import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.LocalNavController import com.android.settingslib.spa.framework.compose.NavControllerWrapperImpl import com.android.settingslib.spa.framework.compose.localNavController Loading Loading @@ -62,7 +67,7 @@ open class BrowseActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.Theme_SpaLib_DayNight) super.onCreate(savedInstanceState) Log.d(TAG, "onCreate") spaEnvironment.logger.message(TAG, "onCreate", category = LogCategory.FRAMEWORK) setContent { SettingsTheme { Loading @@ -78,11 +83,43 @@ open class BrowseActivity : ComponentActivity() { CompositionLocalProvider(navController.localNavController()) { NavHost(navController, NULL_PAGE_NAME) { composable(NULL_PAGE_NAME) {} for (page in sppRepository.getAllProviders()) { for (spp in sppRepository.getAllProviders()) { composable( route = page.name + page.parameter.navRoute(), arguments = page.parameter, ) { navBackStackEntry -> page.Page(navBackStackEntry.arguments) } route = spp.name + spp.parameter.navRoute(), arguments = spp.parameter, ) { navBackStackEntry -> val lifecycleOwner = LocalLifecycleOwner.current val spaLogger = spaEnvironment.logger val sp = spp.createSettingsPage(arguments = navBackStackEntry.arguments) DisposableEffect(lifecycleOwner) { val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_START) { spaLogger.event( sp.id, "enter page ${sp.formatDisplayTitle()}", category = LogCategory.FRAMEWORK ) } else if (event == Lifecycle.Event.ON_STOP) { spaLogger.event( sp.id, "leave page ${sp.formatDisplayTitle()}", category = LogCategory.FRAMEWORK ) } } // Add the observer to the lifecycle lifecycleOwner.lifecycle.addObserver(observer) // When the effect leaves the Composition, remove the observer onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } } spp.Page(navBackStackEntry.arguments) } } } InitialDestinationNavigator() Loading Loading
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +3 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.settingslib.spa.gallery import com.android.settingslib.spa.framework.common.LocalLogger import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository import com.android.settingslib.spa.framework.common.SpaEnvironment import com.android.settingslib.spa.framework.common.createSettingsPage Loading Loading @@ -75,4 +76,6 @@ object GallerySpaEnvironment : SpaEnvironment() { override val browseActivityClass = GalleryMainActivity::class.java override val entryProviderAuthorities = "com.android.spa.gallery.provider" override val logger = LocalLogger() }
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/page/ArgumentPageModel.kt +6 −6 Original line number Diff line number Diff line Loading @@ -17,13 +17,13 @@ package com.android.settingslib.spa.gallery.page import android.os.Bundle import android.util.Log import androidx.compose.runtime.Composable import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavType import androidx.navigation.navArgument import com.android.settingslib.spa.framework.common.EntrySearchData import com.android.settingslib.spa.framework.common.PageModel import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.framework.util.getIntArg Loading @@ -32,6 +32,8 @@ import com.android.settingslib.spa.framework.util.navLink import com.android.settingslib.spa.gallery.SettingsPageProviderEnum import com.android.settingslib.spa.widget.preference.PreferenceModel private const val TAG = "ArgumentPageModel" // Defines all the resources for this page. // In real Settings App, resources data is defined in xml, rather than SPP. private const val PAGE_TITLE = "Sample page with arguments" Loading Loading @@ -93,7 +95,9 @@ class ArgumentPageModel : PageModel() { private var intParam: Int? = null override fun initialize(arguments: Bundle?) { logMsg("init with args " + arguments.toString()) SpaEnvironmentFactory.instance.logger.message( TAG, "Initialize with args " + arguments.toString() ) this.arguments = arguments stringParam = parameter.getStringArg(STRING_PARAM_NAME, arguments) intParam = parameter.getIntArg(INT_PARAM_NAME, arguments) Loading Loading @@ -135,7 +139,3 @@ class ArgumentPageModel : PageModel() { } } } private fun logMsg(message: String) { Log.d("ArgumentPageModel", message) }
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePage.kt +8 −5 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import com.android.settingslib.spa.framework.common.EntrySearchData import com.android.settingslib.spa.framework.common.SettingsEntry import com.android.settingslib.spa.framework.common.SettingsEntryBuilder 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.toState import com.android.settingslib.spa.framework.theme.SettingsTheme Loading @@ -44,13 +45,14 @@ import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Compan import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_KEYWORDS import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_SUMMARY import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_TITLE import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.logMsg import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.preference.SimplePreferenceMacro import com.android.settingslib.spa.widget.scaffold.RegularScaffold import com.android.settingslib.spa.widget.ui.SettingsIcon private const val TAG = "PreferencePage" object PreferencePageProvider : SettingsPageProvider { // Defines all entry name in this page. // Note that entry name would be used in log. DO NOT change it once it is set. Loading @@ -67,6 +69,7 @@ object PreferencePageProvider : SettingsPageProvider { override val name = SettingsPageProviderEnum.PREFERENCE.name override val displayName = SettingsPageProviderEnum.PREFERENCE.displayName private val spaLogger = SpaEnvironmentFactory.instance.logger private val owner = createSettingsPage() private fun createEntry(entry: EntryEnum): SettingsEntryBuilder { Loading @@ -79,7 +82,7 @@ object PreferencePageProvider : SettingsPageProvider { createEntry(EntryEnum.SIMPLE_PREFERENCE) .setIsAllowSearch(true) .setMacro { logMsg("create macro for ${EntryEnum.SIMPLE_PREFERENCE}") spaLogger.message(TAG, "create macro for ${EntryEnum.SIMPLE_PREFERENCE}") SimplePreferenceMacro(title = SIMPLE_PREFERENCE_TITLE) } .build() Loading @@ -88,7 +91,7 @@ object PreferencePageProvider : SettingsPageProvider { createEntry(EntryEnum.SUMMARY_PREFERENCE) .setIsAllowSearch(true) .setMacro { logMsg("create macro for ${EntryEnum.SUMMARY_PREFERENCE}") spaLogger.message(TAG, "create macro for ${EntryEnum.SUMMARY_PREFERENCE}") SimplePreferenceMacro( title = SIMPLE_PREFERENCE_TITLE, summary = SIMPLE_PREFERENCE_SUMMARY, Loading @@ -102,7 +105,7 @@ object PreferencePageProvider : SettingsPageProvider { createEntry(EntryEnum.DISABLED_PREFERENCE) .setIsAllowSearch(true) .setMacro { logMsg("create macro for ${EntryEnum.DISABLED_PREFERENCE}") spaLogger.message(TAG, "create macro for ${EntryEnum.DISABLED_PREFERENCE}") SimplePreferenceMacro( title = DISABLE_PREFERENCE_TITLE, summary = DISABLE_PREFERENCE_SUMMARY, Loading Loading @@ -188,7 +191,7 @@ object PreferencePageProvider : SettingsPageProvider { return SettingsEntryBuilder.createInject(owner = owner) .setIsAllowSearch(true) .setMacro { logMsg("create macro for INJECT entry") spaLogger.message(TAG, "create macro for INJECT entry") SimplePreferenceMacro( title = PAGE_TITLE, clickRoute = SettingsPageProviderEnum.PREFERENCE.name Loading
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageModel.kt +13 −14 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.settingslib.spa.gallery.preference import android.os.Bundle import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf Loading @@ -27,11 +26,14 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import com.android.settingslib.spa.framework.common.PageModel import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch private const val TAG = "PreferencePageModel" class PreferencePageModel : PageModel() { companion object { // Defines all the resources for this page. Loading @@ -53,12 +55,10 @@ class PreferencePageModel : PageModel() { pageModel.initOnce() return pageModel } fun logMsg(message: String) { Log.d("PreferencePageModel", message) } } private val spaLogger = SpaEnvironmentFactory.instance.logger private val asyncSummary = mutableStateOf(" ") private val manualUpdater = mutableStateOf(0) Loading @@ -67,26 +67,25 @@ class PreferencePageModel : PageModel() { private var tick = 0 private var updateJob: Job? = null override fun onActive() { logMsg("autoUpdater.active") spaLogger.message(TAG, "autoUpdater.active") updateJob = viewModelScope.launch(Dispatchers.IO) { while (true) { delay(1000L) tick++ logMsg("autoUpdater.value $tick") spaLogger.message(TAG, "autoUpdater.value $tick") postValue(tick.toString()) } } } override fun onInactive() { logMsg("autoUpdater.inactive") spaLogger.message(TAG, "autoUpdater.inactive") updateJob?.cancel() } } override fun initialize(arguments: Bundle?) { logMsg("init with args " + arguments.toString()) spaLogger.message(TAG, "initialize with args " + arguments.toString()) viewModelScope.launch(Dispatchers.IO) { delay(2000L) asyncSummary.value = ASYNC_PREFERENCE_SUMMARY Loading @@ -94,22 +93,22 @@ class PreferencePageModel : PageModel() { } fun getAsyncSummary(): State<String> { logMsg("getAsyncSummary") spaLogger.message(TAG, "getAsyncSummary") return asyncSummary } fun getManualUpdaterSummary(): State<String> { logMsg("getManualUpdaterSummary") spaLogger.message(TAG, "getManualUpdaterSummary") return derivedStateOf { manualUpdater.value.toString() } } fun manualUpdaterOnClick() { logMsg("manualUpdaterOnClick") spaLogger.message(TAG, "manualUpdaterOnClick") manualUpdater.value = manualUpdater.value + 1 } fun getAutoUpdaterSummary(): LiveData<String> { logMsg("getAutoUpdaterSummary") spaLogger.message(TAG, "getAutoUpdaterSummary") return autoUpdater } }
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/BrowseActivity.kt +43 −6 Original line number Diff line number Diff line Loading @@ -17,20 +17,25 @@ package com.android.settingslib.spa.framework import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.android.settingslib.spa.R import com.android.settingslib.spa.framework.common.LogCategory import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.LocalNavController import com.android.settingslib.spa.framework.compose.NavControllerWrapperImpl import com.android.settingslib.spa.framework.compose.localNavController Loading Loading @@ -62,7 +67,7 @@ open class BrowseActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.Theme_SpaLib_DayNight) super.onCreate(savedInstanceState) Log.d(TAG, "onCreate") spaEnvironment.logger.message(TAG, "onCreate", category = LogCategory.FRAMEWORK) setContent { SettingsTheme { Loading @@ -78,11 +83,43 @@ open class BrowseActivity : ComponentActivity() { CompositionLocalProvider(navController.localNavController()) { NavHost(navController, NULL_PAGE_NAME) { composable(NULL_PAGE_NAME) {} for (page in sppRepository.getAllProviders()) { for (spp in sppRepository.getAllProviders()) { composable( route = page.name + page.parameter.navRoute(), arguments = page.parameter, ) { navBackStackEntry -> page.Page(navBackStackEntry.arguments) } route = spp.name + spp.parameter.navRoute(), arguments = spp.parameter, ) { navBackStackEntry -> val lifecycleOwner = LocalLifecycleOwner.current val spaLogger = spaEnvironment.logger val sp = spp.createSettingsPage(arguments = navBackStackEntry.arguments) DisposableEffect(lifecycleOwner) { val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_START) { spaLogger.event( sp.id, "enter page ${sp.formatDisplayTitle()}", category = LogCategory.FRAMEWORK ) } else if (event == Lifecycle.Event.ON_STOP) { spaLogger.event( sp.id, "leave page ${sp.formatDisplayTitle()}", category = LogCategory.FRAMEWORK ) } } // Add the observer to the lifecycle lifecycleOwner.lifecycle.addObserver(observer) // When the effect leaves the Composition, remove the observer onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } } spp.Page(navBackStackEntry.arguments) } } } InitialDestinationNavigator() Loading