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

Commit 0160bc81 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 11146061 from 370eb719 to 24Q1-release

Change-Id: I363bc90ba45463fc33da6c1f7e4d90c1827030b9
parents a41fcd37 370eb719
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -6,3 +6,10 @@ flag {
    description: "An Example Flag"
    bug: "308482106"
}

flag {
    name: "home_panel_dream"
    namespace: "systemui"
    description: "Enables the home controls dream feature"
    bug: "298025023"
}
+39 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.
 */

package com.android.app.tracing

/** Utilities to trace automatically computations happening for each element of a list. */
object ListenersTracing {

    /**
     * Like [forEach], but outputs a trace for each element.
     *
     * The ideal usage of this is to debug what's taking long in a list of Listeners. For example:
     * ```
     * listeners.forEach { it.dispatch(state) }
     * ```
     *
     * often it's tricky to udnerstand which listener is causing delays. This can be used instead to
     * log how much each listener is taking:
     * ```
     * listeners.forEachTraced(TAG) { it.dispatch(state) }
     * ```
     */
    inline fun <T : Any> List<T>.forEachTraced(tag: String = "", f: (T) -> Unit) {
        forEach { traceSection({ "$tag#${it::javaClass.get().name}" }) { f(it) } }
    }
}
+17 −0
Original line number Diff line number Diff line
@@ -51,6 +51,22 @@ inline fun <T> traceSection(tag: String, block: () -> T): T =
        block()
    }

/**
 * Same as [traceSection], but the tag is provided as a lambda to help avoiding creating expensive
 * strings when not needed.
 */
inline fun <T> traceSection(tag: () -> String, block: () -> T): T =
    if (Trace.isTagEnabled(Trace.TRACE_TAG_APP)) {
        Trace.traceBegin(Trace.TRACE_TAG_APP, tag())
        try {
            block()
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_APP)
        }
    } else {
        block()
    }

class TraceUtils {
    companion object {
        const val TAG = "TraceUtils"
@@ -69,6 +85,7 @@ class TraceUtils {
        inline fun namedRunnable(tag: String, crossinline block: () -> Unit): Runnable {
            return object : Runnable, TraceNameSupplier {
                override fun getTraceName(): String = tag

                override fun run() = block()
            }
        }