Merge "Add traceAsync to TraceUtils" into udc-qpr-dev am: 227a03480b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23874534

Change-Id: I7c71612b734ce42d8a0a66722332d10f0066d8b0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2023-07-04 16:07:30 +00:00
committed by Automerger Merge Worker
2 changed files with 49 additions and 12 deletions

View File

@@ -18,10 +18,11 @@ package com.android.systemui.util
import android.os.Trace import android.os.Trace
import android.os.TraceNameSupplier import android.os.TraceNameSupplier
import java.util.concurrent.atomic.AtomicInteger
/** /**
* Run a block within a [Trace] section. * Run a block within a [Trace] section. Calls [Trace.beginSection] before and [Trace.endSection]
* Calls [Trace.beginSection] before and [Trace.endSection] after the passed block. * after the passed block.
*/ */
inline fun <T> traceSection(tag: String, block: () -> T): T = inline fun <T> traceSection(tag: String, block: () -> T): T =
if (Trace.isTagEnabled(Trace.TRACE_TAG_APP)) { if (Trace.isTagEnabled(Trace.TRACE_TAG_APP)) {
@@ -43,6 +44,7 @@ class TraceUtils {
/** /**
* Helper function for creating a Runnable object that implements TraceNameSupplier. * Helper function for creating a Runnable object that implements TraceNameSupplier.
*
* This is useful for posting Runnables to Handlers with meaningful names. * This is useful for posting Runnables to Handlers with meaningful names.
*/ */
inline fun namedRunnable(tag: String, crossinline block: () -> Unit): Runnable { inline fun namedRunnable(tag: String, crossinline block: () -> Unit): Runnable {
@@ -51,5 +53,37 @@ class TraceUtils {
override fun run() = block() override fun run() = block()
} }
} }
/**
* Cookie used for async traces. Shouldn't be public, but to use it inside inline methods
* there is no other way around.
*/
val lastCookie = AtomicInteger(0)
/**
* Creates an async slice in a track called "AsyncTraces".
*
* This can be used to trace coroutine code. Note that all usages of this method will appear
* under a single track.
*/
inline fun <T> traceAsync(method: String, block: () -> T): T =
traceAsync(method, "AsyncTraces", block)
/**
* Creates an async slice in a track with [trackName] while [block] runs.
*
* This can be used to trace coroutine code. [method] will be the name of the slice,
* [trackName] of the track. The track is one of the rows visible in a perfetto trace inside
* SystemUI process.
*/
inline fun <T> traceAsync(method: String, trackName: String, block: () -> T): T {
val cookie = lastCookie.incrementAndGet()
Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_APP, trackName, method, cookie)
try {
return block()
} finally {
Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, trackName, cookie)
}
}
} }
} }

View File

@@ -49,6 +49,7 @@ import com.android.systemui.settings.UserTracker
import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract
import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.TraceUtils.Companion.traceAsync
import dagger.Lazy import dagger.Lazy
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher
@@ -442,9 +443,11 @@ constructor(
} }
private suspend fun isFeatureDisabledByDevicePolicy(): Boolean = private suspend fun isFeatureDisabledByDevicePolicy(): Boolean =
traceAsync("isFeatureDisabledByDevicePolicy", TAG) {
withContext(backgroundDispatcher) { withContext(backgroundDispatcher) {
devicePolicyManager.areKeyguardShortcutsDisabled(userId = userTracker.userId) devicePolicyManager.areKeyguardShortcutsDisabled(userId = userTracker.userId)
} }
}
companion object { companion object {
private const val TAG = "KeyguardQuickAffordanceInteractor" private const val TAG = "KeyguardQuickAffordanceInteractor"