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

Commit 851f3657 authored by Alina Zaidi's avatar Alina Zaidi Committed by Android (Google) Code Review
Browse files

Merge "[logging] Move session id tracking to DesktopModeLogger" into main

parents fa932cf1 0a291023
Loading
Loading
Loading
Loading
+103 −30
Original line number Diff line number Diff line
@@ -21,17 +21,39 @@ import com.android.internal.protolog.ProtoLog
import com.android.internal.util.FrameworkStatsLog
import com.android.window.flags.Flags
import com.android.wm.shell.EventLogTags
import com.android.wm.shell.protolog.ShellProtoLogGroup
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import java.security.SecureRandom
import java.util.Random
import java.util.concurrent.atomic.AtomicInteger


/** Event logger for logging desktop mode session events */
class DesktopModeEventLogger {
    private val random: Random = SecureRandom()

    /** The session id for the current desktop mode session */
    @VisibleForTesting
    val currentSessionId: AtomicInteger = AtomicInteger(NO_SESSION_ID)

    private fun generateSessionId() = 1 + random.nextInt(1 shl 20)

    /**
     * Logs the enter of desktop mode having session id [sessionId] and the reason [enterReason] for
     * entering desktop mode
     * Logs enter into desktop mode with [enterReason]
     */
    fun logSessionEnter(sessionId: Int, enterReason: EnterReason) {
    fun logSessionEnter(enterReason: EnterReason) {
        val sessionId = generateSessionId()
        val previousSessionId = currentSessionId.getAndSet(sessionId)
        if (previousSessionId != NO_SESSION_ID) {
            ProtoLog.w(
                WM_SHELL_DESKTOP_MODE,
                "DesktopModeLogger: Existing desktop mode session id: %s found on desktop "
                    + "mode enter",
                previousSessionId
            )
        }

        ProtoLog.v(
            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
            WM_SHELL_DESKTOP_MODE,
            "DesktopModeLogger: Logging session enter, session: %s reason: %s",
            sessionId,
            enterReason.name
@@ -47,12 +69,20 @@ class DesktopModeEventLogger {
    }

    /**
     * Logs the exit of desktop mode having session id [sessionId] and the reason [exitReason] for
     * exiting desktop mode
     * Logs exit from desktop mode session with [exitReason]
     */
    fun logSessionExit(sessionId: Int, exitReason: ExitReason) {
    fun logSessionExit(exitReason: ExitReason) {
        val sessionId = currentSessionId.getAndSet(NO_SESSION_ID)
        if (sessionId == NO_SESSION_ID) {
            ProtoLog.w(
                WM_SHELL_DESKTOP_MODE,
                "DesktopModeLogger: No session id found for logging exit from desktop mode"
            )
            return
        }

        ProtoLog.v(
            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
            WM_SHELL_DESKTOP_MODE,
            "DesktopModeLogger: Logging session exit, session: %s reason: %s",
            sessionId,
            exitReason.name
@@ -68,12 +98,20 @@ class DesktopModeEventLogger {
    }

    /**
     * Logs that the task with update [taskUpdate] was added in the desktop mode session having
     * session id [sessionId]
     * Logs that a task with [taskUpdate] was added in a desktop mode session
     */
    fun logTaskAdded(sessionId: Int, taskUpdate: TaskUpdate) {
    fun logTaskAdded(taskUpdate: TaskUpdate) {
        val sessionId = currentSessionId.get()
        if (sessionId == NO_SESSION_ID) {
            ProtoLog.w(
                WM_SHELL_DESKTOP_MODE,
                "DesktopModeLogger: No session id found for logging task added"
            )
            return
        }

        ProtoLog.v(
            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
            WM_SHELL_DESKTOP_MODE,
            "DesktopModeLogger: Logging task added, session: %s taskId: %s",
            sessionId,
            taskUpdate.instanceId
@@ -85,12 +123,20 @@ class DesktopModeEventLogger {
    }

    /**
     * Logs that the task with update [taskUpdate] was removed in the desktop mode session having
     * session id [sessionId]
     * Logs that a task with [taskUpdate] was removed from a desktop mode session
     */
    fun logTaskRemoved(sessionId: Int, taskUpdate: TaskUpdate) {
    fun logTaskRemoved(taskUpdate: TaskUpdate) {
        val sessionId = currentSessionId.get()
        if (sessionId == NO_SESSION_ID) {
            ProtoLog.w(
                WM_SHELL_DESKTOP_MODE,
                "DesktopModeLogger: No session id found for logging task removed"
            )
            return
        }

        ProtoLog.v(
            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
            WM_SHELL_DESKTOP_MODE,
            "DesktopModeLogger: Logging task remove, session: %s taskId: %s",
            sessionId,
            taskUpdate.instanceId
@@ -102,12 +148,20 @@ class DesktopModeEventLogger {
    }

    /**
     * Logs that the task with update [taskUpdate] had it's info changed in the desktop mode session
     * having session id [sessionId]
     * Logs that a task with [taskUpdate] had it's info changed in a desktop mode session
     */
    fun logTaskInfoChanged(sessionId: Int, taskUpdate: TaskUpdate) {
    fun logTaskInfoChanged(taskUpdate: TaskUpdate) {
        val sessionId = currentSessionId.get()
        if (sessionId == NO_SESSION_ID) {
            ProtoLog.w(
                WM_SHELL_DESKTOP_MODE,
                "DesktopModeLogger: No session id found for logging task info changed"
            )
            return
        }

        ProtoLog.v(
            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
            WM_SHELL_DESKTOP_MODE,
            "DesktopModeLogger: Logging task info changed, session: %s taskId: %s",
            sessionId,
            taskUpdate.instanceId
@@ -119,14 +173,23 @@ class DesktopModeEventLogger {
    }

    /**
     * Logs that a task resize event is starting with [taskSizeUpdate] within a
     * Desktop mode [sessionId].
     * Logs that a task resize event is starting with [taskSizeUpdate] within a Desktop mode
     * session.
     */
    fun logTaskResizingStarted(sessionId: Int, taskSizeUpdate: TaskSizeUpdate) {
    fun logTaskResizingStarted(taskSizeUpdate: TaskSizeUpdate) {
        if (!Flags.enableResizingMetrics()) return

        val sessionId = currentSessionId.get()
        if (sessionId == NO_SESSION_ID) {
            ProtoLog.w(
                WM_SHELL_DESKTOP_MODE,
                "DesktopModeLogger: No session id found for logging start of task resizing"
            )
            return
        }

        ProtoLog.v(
            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
            WM_SHELL_DESKTOP_MODE,
            "DesktopModeLogger: Logging task resize is starting, session: %s taskId: %s",
            sessionId,
            taskSizeUpdate.instanceId
@@ -138,14 +201,22 @@ class DesktopModeEventLogger {
    }

    /**
     * Logs that a task resize event is ending with [taskSizeUpdate] within a
     * Desktop mode [sessionId].
     * Logs that a task resize event is ending with [taskSizeUpdate] within a Desktop mode session.
     */
    fun logTaskResizingEnded(sessionId: Int, taskSizeUpdate: TaskSizeUpdate) {
    fun logTaskResizingEnded(taskSizeUpdate: TaskSizeUpdate) {
        if (!Flags.enableResizingMetrics()) return

        val sessionId = currentSessionId.get()
        if (sessionId == NO_SESSION_ID) {
            ProtoLog.w(
                WM_SHELL_DESKTOP_MODE,
                "DesktopModeLogger: No session id found for logging end of task resizing"
            )
            return
        }

        ProtoLog.v(
            ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
            WM_SHELL_DESKTOP_MODE,
            "DesktopModeLogger: Logging task resize is ending, session: %s taskId: %s",
            sessionId,
            taskSizeUpdate.instanceId
@@ -248,6 +319,7 @@ class DesktopModeEventLogger {
    }

    companion object {

        /**
         * Describes a task position and dimensions.
         *
@@ -465,5 +537,6 @@ class DesktopModeEventLogger {
            FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE
        private const val DESKTOP_MODE_TASK_SIZE_UPDATED_ATOM_ID =
            FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED
        @VisibleForTesting const val NO_SESSION_ID = 0
    }
}
 No newline at end of file
+7 −33
Original line number Diff line number Diff line
@@ -35,8 +35,6 @@ import androidx.core.util.isEmpty
import androidx.core.util.isNotEmpty
import androidx.core.util.plus
import androidx.core.util.putAll
import com.android.internal.logging.InstanceId
import com.android.internal.logging.InstanceIdSequence
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason
@@ -48,8 +46,8 @@ import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_KEYBOARD_SHORTCUT
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_EXIT_DESKTOP_MODE_TASK_DRAG
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.TransitionUtil
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.Transitions

@@ -65,8 +63,6 @@ class DesktopModeLoggerTransitionObserver(
    private val desktopModeEventLogger: DesktopModeEventLogger
) : Transitions.TransitionObserver {

    private val idSequence: InstanceIdSequence by lazy { InstanceIdSequence(Int.MAX_VALUE) }

    init {
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
            shellInit.addInitCallback(this::onInit, this)
@@ -87,15 +83,7 @@ class DesktopModeLoggerTransitionObserver(
    // following enter reason could be Screen On
    private var wasPreviousTransitionExitByScreenOff: Boolean = false

    // The instanceId for the current logging session
    private var loggerInstanceId: InstanceId? = null

    private val isSessionActive: Boolean
        get() = loggerInstanceId != null

    private fun setSessionInactive() {
        loggerInstanceId = null
    }
    @VisibleForTesting var isSessionActive: Boolean = false

    fun onInit() {
        transitions.registerObserver(this)
@@ -247,38 +235,32 @@ class DesktopModeLoggerTransitionObserver(
        ) {
            // Sessions is finishing, log task updates followed by an exit event
            identifyAndLogTaskUpdates(
                loggerInstanceId!!.id,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks
            )

            desktopModeEventLogger.logSessionExit(
                loggerInstanceId!!.id,
                getExitReason(transitionInfo)
            )

            setSessionInactive()
            isSessionActive = false
        } else if (
            postTransitionVisibleFreeformTasks.isNotEmpty() &&
                preTransitionVisibleFreeformTasks.isEmpty() &&
                !isSessionActive
        ) {
            // Session is starting, log enter event followed by task updates
            loggerInstanceId = idSequence.newInstanceId()
            isSessionActive = true
            desktopModeEventLogger.logSessionEnter(
                loggerInstanceId!!.id,
                getEnterReason(transitionInfo)
            )

            identifyAndLogTaskUpdates(
                loggerInstanceId!!.id,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks
            )
        } else if (isSessionActive) {
            // Session is neither starting, nor finishing, log task updates if there are any
            identifyAndLogTaskUpdates(
                loggerInstanceId!!.id,
                preTransitionVisibleFreeformTasks,
                postTransitionVisibleFreeformTasks
            )
@@ -291,7 +273,6 @@ class DesktopModeLoggerTransitionObserver(

    /** Compare the old and new state of taskInfos and identify and log the changes */
    private fun identifyAndLogTaskUpdates(
        sessionId: Int,
        preTransitionVisibleFreeformTasks: SparseArray<TaskInfo>,
        postTransitionVisibleFreeformTasks: SparseArray<TaskInfo>
    ) {
@@ -302,7 +283,7 @@ class DesktopModeLoggerTransitionObserver(
            when {
                // new tasks added
                previousTaskInfo == null -> {
                    desktopModeEventLogger.logTaskAdded(sessionId, currentTaskUpdate)
                    desktopModeEventLogger.logTaskAdded(currentTaskUpdate)
                    Trace.setCounter(
                        Trace.TRACE_TAG_WINDOW_MANAGER,
                        VISIBLE_TASKS_COUNTER_NAME,
@@ -315,14 +296,14 @@ class DesktopModeLoggerTransitionObserver(
                // TODO(b/347935387): Log changes only once they are stable.
                buildTaskUpdateForTask(previousTaskInfo, postTransitionVisibleFreeformTasks.size())
                        != currentTaskUpdate ->
                            desktopModeEventLogger.logTaskInfoChanged(sessionId, currentTaskUpdate)
                            desktopModeEventLogger.logTaskInfoChanged(currentTaskUpdate)
            }
        }

        // find old tasks that were removed
        preTransitionVisibleFreeformTasks.forEach { taskId, taskInfo ->
            if (!postTransitionVisibleFreeformTasks.containsKey(taskId)) {
                desktopModeEventLogger.logTaskRemoved(sessionId,
                desktopModeEventLogger.logTaskRemoved(
                    buildTaskUpdateForTask(taskInfo, postTransitionVisibleFreeformTasks.size()))
                Trace.setCounter(
                    Trace.TRACE_TAG_WINDOW_MANAGER,
@@ -417,13 +398,6 @@ class DesktopModeLoggerTransitionObserver(
        visibleFreeformTaskInfos.set(taskInfo.taskId, taskInfo)
    }

    @VisibleForTesting fun getLoggerSessionId(): Int? = loggerInstanceId?.id

    @VisibleForTesting
    fun setLoggerSessionId(id: Int) {
        loggerInstanceId = InstanceId.fakeInstanceId(id)
    }

    private fun TransitionInfo.Change.requireTaskInfo(): RunningTaskInfo {
        return this.taskInfo ?: throw IllegalStateException("Expected TaskInfo in the Change")
    }
+247 −100

File changed.

Preview size limit exceeded, changes collapsed.

+70 −86

File changed.

Preview size limit exceeded, changes collapsed.