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

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

Merge "Add perf traces for Transitions calls to handlers and observers." into main

parents 150b5c8a 2f8edea0
Loading
Loading
Loading
Loading
+61 −7
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.wm.shell.transition;

import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM;
@@ -58,6 +59,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.Trace;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.Log;
@@ -800,8 +802,17 @@ public class Transitions implements RemoteCallable<Transitions>,
        track.mReadyTransitions.add(active);

        for (int i = 0; i < mObservers.size(); ++i) {
            final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER);
            if (useTrace) {
                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
                        mObservers.get(i).getClass().getSimpleName() + "#onTransitionReady: "
                                + transitTypeToString(info.getType()));
            }
            mObservers.get(i).onTransitionReady(
                    active.mToken, info, active.mStartT, active.mFinishT);
            if (useTrace) {
                Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
            }
        }

        /*
@@ -931,7 +942,7 @@ public class Transitions implements RemoteCallable<Transitions>,
                onFinish(ready.mToken, null);
                return;
            }
            playTransition(ready);
            playTransitionWithTracing(ready);
            // Attempt to merge any more queued-up transitions.
            processReadyQueue(track);
            return;
@@ -1003,6 +1014,18 @@ public class Transitions implements RemoteCallable<Transitions>,
        processReadyQueue(track);
    }

    private void playTransitionWithTracing(@NonNull ActiveTransition active) {
        final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER);
        if (useTrace) {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
                    "playTransition: " + transitTypeToString(active.mInfo.getType()));
        }
        playTransition(active);
        if (useTrace) {
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }
    }

    private void playTransition(@NonNull ActiveTransition active) {
        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Playing animation for %s", active);
        final var token = active.mToken;
@@ -1022,6 +1045,12 @@ public class Transitions implements RemoteCallable<Transitions>,
            if (consumed) {
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by firstHandler");
                mTransitionTracer.logDispatched(active.mInfo.getDebugId(), active.mHandler);
                if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                    Trace.instant(TRACE_TAG_WINDOW_MANAGER,
                            active.mHandler.getClass().getSimpleName()
                                    + "#startAnimation animated "
                                    + transitTypeToString(active.mInfo.getType()));
                }
                return;
            }
        }
@@ -1052,6 +1081,12 @@ public class Transitions implements RemoteCallable<Transitions>,
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by %s",
                        mHandlers.get(i));
                mTransitionTracer.logDispatched(info.getDebugId(), mHandlers.get(i));
                if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                    Trace.instant(TRACE_TAG_WINDOW_MANAGER,
                            mHandlers.get(i).getClass().getSimpleName()
                                    + "#startAnimation animated "
                                    + transitTypeToString(info.getType()));
                }
                return mHandlers.get(i);
            }
        }
@@ -1059,6 +1094,26 @@ public class Transitions implements RemoteCallable<Transitions>,
                "This shouldn't happen, maybe the default handler is broken.");
    }

    private Pair<TransitionHandler, WindowContainerTransaction> dispatchRequestWithTracing(
            @NonNull IBinder transition, @NonNull TransitionRequestInfo request,
            @Nullable TransitionHandler skip) {
        final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER);
        if (useTrace) {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
                    "dispatchRequest: " + transitTypeToString(request.getType()));
        }
        Pair<TransitionHandler, WindowContainerTransaction> result =
                dispatchRequest(transition, request, skip);
        if (useTrace) {
            if (result != null) {
                Trace.instant(TRACE_TAG_WINDOW_MANAGER, result.first.getClass().getSimpleName()
                        + "#handleRequest handled " + transitTypeToString(request.getType()));
            }
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }
        return result;
    }

    /**
     * Gives every handler (in order) a chance to handle request until one consumes the transition.
     * @return the WindowContainerTransaction given by the handler which consumed the transition.
@@ -1197,12 +1252,11 @@ public class Transitions implements RemoteCallable<Transitions>,
            mSleepHandler.handleRequest(transitionToken, request);
            active.mHandler = mSleepHandler;
        } else {
            for (int i = mHandlers.size() - 1; i >= 0; --i) {
                wct = mHandlers.get(i).handleRequest(transitionToken, request);
                if (wct != null) {
                    active.mHandler = mHandlers.get(i);
                    break;
                }
            Pair<TransitionHandler, WindowContainerTransaction> requestResult =
                    dispatchRequestWithTracing(transitionToken, request, /* skip= */ null);
            if (requestResult != null) {
                active.mHandler = requestResult.first;
                wct = requestResult.second;
            }
            if (request.getDisplayChange() != null) {
                TransitionRequestInfo.DisplayChange change = request.getDisplayChange();