1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.app.tracing
17 
18 import kotlinx.coroutines.flow.Flow
19 import kotlinx.coroutines.flow.onEach
20 
21 /** Utilities to trace Flows */
22 object FlowTracing {
23 
24     /** Logs each flow element to a trace. */
traceEachnull25     inline fun <T> Flow<T>.traceEach(
26         flowName: String,
27         logcat: Boolean = false,
28         traceEmissionCount: Boolean = false,
29         crossinline valueToString: (T) -> String = { it.toString() }
30     ): Flow<T> {
31         val stateLogger = TraceStateLogger(flowName, logcat = logcat)
32         val baseFlow = if (traceEmissionCount) traceEmissionCount(flowName) else this
<lambda>null33         return baseFlow.onEach { stateLogger.log(valueToString(it)) }
34     }
35 
traceEmissionCountnull36     fun <T> Flow<T>.traceEmissionCount(flowName: String): Flow<T> {
37         val trackName = "$flowName#emissionCount"
38         var count = 0
39         return onEach {
40             count += 1
41             traceCounter(trackName, count)
42         }
43     }
44 }
45