Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9badf3d8 authored by Zekan Qian's avatar Zekan Qian
Browse files

Add SpaLogger.

Define SpaLogger interface.
Add SpaLogger in SpaEnvironment.
Add Page enter / leave event in BrowseActivity
Use SpaLogger in Gallery Pages for logging.

Bug: 244122804
Test: manual - build Gallery
Change-Id: Id1df1760a0ddbf13f6a10ef3ef42b28fd398542f
parent 337c1a8c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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
@@ -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()
}
+6 −6
Original line number Diff line number Diff line
@@ -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
@@ -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"
@@ -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)
@@ -135,7 +139,3 @@ class ArgumentPageModel : PageModel() {
        }
    }
}

private fun logMsg(message: String) {
    Log.d("ArgumentPageModel", message)
}
+8 −5
Original line number Diff line number Diff line
@@ -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
@@ -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.
@@ -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 {
@@ -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()
@@ -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,
@@ -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,
@@ -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
+13 −14
Original line number Diff line number Diff line
@@ -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
@@ -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.
@@ -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)
@@ -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
@@ -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
    }
}
+43 −6
Original line number Diff line number Diff line
@@ -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
@@ -56,7 +61,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 {
@@ -72,11 +77,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