From aba3bba3cd00ff5e4a2b9127cc0cf4faaab85c72 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Mon, 17 Oct 2022 15:05:51 +0800 Subject: Add TimeMeasurer for Spa To measure the app list first loaded time. Bug: 235727273 Test: Manual with App List page Change-Id: I4edc54edd850e2d7d3026782aa317428b13c27aa --- .../spa/framework/compose/TimeMeasurer.kt | 56 ++++++++++++++++++++++ .../spaprivileged/template/app/AppList.kt | 3 ++ 2 files changed, 59 insertions(+) create mode 100644 packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/TimeMeasurer.kt diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/TimeMeasurer.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/TimeMeasurer.kt new file mode 100644 index 000000000000..b23f4e083a1e --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/TimeMeasurer.kt @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:OptIn(ExperimentalTime::class) + +package com.android.settingslib.spa.framework.compose + +import android.util.Log +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import kotlin.time.ExperimentalTime +import kotlin.time.TimeSource + +const val ENABLE_MEASURE_TIME = false + +interface TimeMeasurer { + fun log(msg: String) {} + fun logFirst(msg: String) {} + + companion object { + private object EmptyTimeMeasurer : TimeMeasurer + + @Composable + fun rememberTimeMeasurer(tag: String): TimeMeasurer = remember { + if (ENABLE_MEASURE_TIME) TimeMeasurerImpl(tag) else EmptyTimeMeasurer + } + } +} + +private class TimeMeasurerImpl(private val tag: String) : TimeMeasurer { + private val mark = TimeSource.Monotonic.markNow() + private val msgLogged = mutableSetOf() + + override fun log(msg: String) { + Log.d(tag, "Timer $msg: ${mark.elapsedNow()}") + } + + override fun logFirst(msg: String) { + if (msgLogged.add(msg)) { + Log.d(tag, "Timer $msg: ${mark.elapsedNow()}") + } + } +} diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt index 6318b4e9c186..c5ad1814a518 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel import com.android.settingslib.spa.framework.compose.LogCompositions +import com.android.settingslib.spa.framework.compose.TimeMeasurer.Companion.rememberTimeMeasurer import com.android.settingslib.spa.framework.compose.toState import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.widget.ui.PlaceholderTitle @@ -66,7 +67,9 @@ private fun AppListWidget( listModel: AppListModel, appItem: @Composable (itemState: AppListItemModel) -> Unit, ) { + val timeMeasurer = rememberTimeMeasurer(TAG) appListData.value?.let { (list, option) -> + timeMeasurer.logFirst("app list first loaded") if (list.isEmpty()) { PlaceholderTitle(stringResource(R.string.no_applications)) return -- cgit v1.2.3-59-g8ed1b