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

Commit 86e7a10e authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes If52c45a9,I203862ae,I94523ba2,I21b8095f,I65abed1c into main

* changes:
  Create ShadeStateTraceLogger
  Group status bar related instant event under a track group
  Group scrim related instant event under a track group
  Group notification related instant event under a track group
  Group shade related instant event under a track group
parents e70a1664 b6c9a433
Loading
Loading
Loading
Loading
+1 −3
Original line number Original line Diff line number Diff line
@@ -24,7 +24,6 @@ import com.android.systemui.common.ui.view.ChoreographerUtils
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.scene.ui.view.WindowRootView
import com.android.systemui.scene.ui.view.WindowRootView
import com.android.systemui.shade.ShadeDisplayChangeLatencyTracker.Companion.TIMEOUT
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.util.kotlin.getOrNull
import com.android.systemui.util.kotlin.getOrNull
import java.util.Optional
import java.util.Optional
@@ -33,7 +32,6 @@ import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filter
@@ -135,7 +133,7 @@ constructor(


    private companion object {
    private companion object {
        const val TAG = "ShadeDisplayLatency"
        const val TAG = "ShadeDisplayLatency"
        val t = TrackTracer(trackName = TAG)
        val t = TrackTracer(trackName = TAG, trackGroup = "shade")
        val TIMEOUT = 3.seconds
        val TIMEOUT = 3.seconds
        const val SHADE_MOVE_ACTION = LatencyTracker.ACTION_SHADE_WINDOW_DISPLAY_CHANGE
        const val SHADE_MOVE_ACTION = LatencyTracker.ACTION_SHADE_WINDOW_DISPLAY_CHANGE
    }
    }
+9 −7
Original line number Original line Diff line number Diff line
@@ -18,13 +18,16 @@ package com.android.systemui.shade


import android.annotation.IntDef
import android.annotation.IntDef
import android.os.Trace
import android.os.Trace
import android.os.Trace.TRACE_TAG_APP as TRACE_TAG
import android.util.Log
import android.util.Log
import androidx.annotation.FloatRange
import androidx.annotation.FloatRange
import com.android.app.tracing.TraceStateLogger
import com.android.app.tracing.TrackGroupUtils.trackGroup
import com.android.app.tracing.coroutines.TrackTracer
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.util.Compile
import com.android.systemui.util.Compile
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.CopyOnWriteArrayList
import javax.inject.Inject
import javax.inject.Inject
import android.os.Trace.TRACE_TAG_APP as TRACE_TAG


/**
/**
 * A class responsible for managing the notification panel's current state.
 * A class responsible for managing the notification panel's current state.
@@ -38,6 +41,8 @@ class ShadeExpansionStateManager @Inject constructor() {
    private val expansionListeners = CopyOnWriteArrayList<ShadeExpansionListener>()
    private val expansionListeners = CopyOnWriteArrayList<ShadeExpansionListener>()
    private val stateListeners = CopyOnWriteArrayList<ShadeStateListener>()
    private val stateListeners = CopyOnWriteArrayList<ShadeStateListener>()


    private val stateLogger = TraceStateLogger(trackGroup("shade", TRACK_NAME))

    @PanelState private var state: Int = STATE_CLOSED
    @PanelState private var state: Int = STATE_CLOSED
    @FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f
    @FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f
    private var expanded: Boolean = false
    private var expanded: Boolean = false
@@ -75,7 +80,7 @@ class ShadeExpansionStateManager @Inject constructor() {
    fun onPanelExpansionChanged(
    fun onPanelExpansionChanged(
        @FloatRange(from = 0.0, to = 1.0) fraction: Float,
        @FloatRange(from = 0.0, to = 1.0) fraction: Float,
        expanded: Boolean,
        expanded: Boolean,
        tracking: Boolean
        tracking: Boolean,
    ) {
    ) {
        require(!fraction.isNaN()) { "fraction cannot be NaN" }
        require(!fraction.isNaN()) { "fraction cannot be NaN" }
        val oldState = state
        val oldState = state
@@ -113,11 +118,8 @@ class ShadeExpansionStateManager @Inject constructor() {
        )
        )


        if (Trace.isTagEnabled(TRACE_TAG)) {
        if (Trace.isTagEnabled(TRACE_TAG)) {
            Trace.traceCounter(TRACE_TAG, "panel_expansion", (fraction * 100).toInt())
            TrackTracer.instantForGroup("shade", "panel_expansion", fraction)
            if (state != oldState) {
            stateLogger.log(state.panelStateToString())
                Trace.asyncTraceForTrackEnd(TRACE_TAG, TRACK_NAME, 0)
                Trace.asyncTraceForTrackBegin(TRACE_TAG, TRACK_NAME, state.panelStateToString(), 0)
            }
        }
        }


        val expansionChangeEvent = ShadeExpansionChangeEvent(fraction, expanded, tracking)
        val expansionChangeEvent = ShadeExpansionChangeEvent(fraction, expanded, tracking)
+70 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2025 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.systemui.shade

import com.android.app.tracing.TraceStateLogger
import com.android.app.tracing.TrackGroupUtils.trackGroup
import com.android.app.tracing.coroutines.TrackTracer.Companion.instantForGroup
import com.android.app.tracing.coroutines.launchTraced
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

@SysUISingleton
class ShadeStateTraceLogger
@Inject
constructor(
    private val shadeInteractor: ShadeInteractor,
    private val shadeDisplaysRepository: ShadeDisplaysRepository,
    @Application private val scope: CoroutineScope,
) : CoreStartable {
    override fun start() {
        scope.launchTraced("ShadeStateTraceLogger") {
            launch {
                val stateLogger = createTraceStateLogger("isShadeLayoutWide")
                shadeInteractor.isShadeLayoutWide.collect { stateLogger.log(it.toString()) }
            }
            launch {
                val stateLogger = createTraceStateLogger("shadeMode")
                shadeInteractor.shadeMode.collect { stateLogger.log(it.toString()) }
            }
            launch {
                shadeInteractor.shadeExpansion.collect {
                    instantForGroup(TRACK_GROUP_NAME, "shadeExpansion", it)
                }
            }
            launch {
                shadeDisplaysRepository.displayId.collect {
                    instantForGroup(TRACK_GROUP_NAME, "displayId", it)
                }
            }
        }
    }

    private fun createTraceStateLogger(trackName: String): TraceStateLogger {
        return TraceStateLogger(trackGroup(TRACK_GROUP_NAME, trackName))
    }

    private companion object {
        const val TRACK_GROUP_NAME = "shade"
    }
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -27,7 +27,7 @@ import com.android.app.tracing.coroutines.TrackTracer
 * them across various threads' logs.
 * them across various threads' logs.
 */
 */
object ShadeTraceLogger {
object ShadeTraceLogger {
    private val t = TrackTracer(trackName = "ShadeTraceLogger")
    private val t = TrackTracer(trackName = "ShadeTraceLogger", trackGroup = "shade")


    @JvmStatic
    @JvmStatic
    fun logOnMovedToDisplay(displayId: Int, config: Configuration) {
    fun logOnMovedToDisplay(displayId: Int, config: Configuration) {
+5 −0
Original line number Original line Diff line number Diff line
@@ -40,4 +40,9 @@ internal abstract class StartShadeModule {
    @IntoMap
    @IntoMap
    @ClassKey(ShadeStartable::class)
    @ClassKey(ShadeStartable::class)
    abstract fun provideShadeStartable(startable: ShadeStartable): CoreStartable
    abstract fun provideShadeStartable(startable: ShadeStartable): CoreStartable

    @Binds
    @IntoMap
    @ClassKey(ShadeStateTraceLogger::class)
    abstract fun provideShadeStateTraceLogger(startable: ShadeStateTraceLogger): CoreStartable
}
}
Loading