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

Commit 0ec51676 authored by Wei Sheng Shih's avatar Wei Sheng Shih Committed by Android (Google) Code Review
Browse files

Merge "Adds a timeout to monitor where an UncertainTracker is never removed." into main

parents c1b875c2 89328f52
Loading
Loading
Loading
Loading
+30 −5
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.IBinder;
import android.os.Trace;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.SurfaceControl;
@@ -86,6 +87,7 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
    public static final String TAG = "ShellStartingWindow";

    private static final long TASK_BG_COLOR_RETAIN_TIME_MS = 5000;
    private static final long UNCERTAIN_TRANSITION_TIMEOUT_MS = 5000;

    private final StartingSurfaceDrawer mStartingSurfaceDrawer;
    private final StartingWindowTypeAlgorithm mStartingWindowTypeAlgorithm;
@@ -186,11 +188,12 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
                        && TransitionUtil.isOpeningMode(c.getMode())) {
                    // Uncertain condition, this is activity transition so we don't know which
                    // task the starting window belongs.
                    final UncertainTracker tracker = new UncertainTracker(
                    final UncertainTracker tracker = new UncertainTracker(info.getDebugId(),
                            () -> uncertainTrackComplete(transition));
                    mUncertainTrackers.put(transition, tracker);
                    startTransaction.addTransactionCommittedListener(mShellMainExecutor,
                            tracker);
                    mShellMainExecutor.executeDelayed(tracker, UNCERTAIN_TRANSITION_TIMEOUT_MS);
                    ProtoLog.v(ShellProtoLogGroup.WM_SHELL_REMOVE_STARTING_TRACKER,
                            "RSO:Create uncertain transition tracker=%s", tracker);
                    break;
@@ -281,8 +284,13 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
        }

        private void uncertainTrackComplete(IBinder transition) {
            final boolean hasRemove = mUncertainTrackers.remove(transition) != null;
            if (!hasRemove || !mUncertainTrackers.isEmpty()) {
            final UncertainTracker tracker = mUncertainTrackers.remove(transition);
            if (tracker == null) {
                return;
            }

            mShellMainExecutor.removeCallbacks(tracker);
            if (!mUncertainTrackers.isEmpty()) {
                return;
            }
            // check if anything task left due to uncertain transition.
@@ -292,9 +300,13 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
            }
        }

        static class UncertainTracker implements SurfaceControl.TransactionCommittedListener {
        static class UncertainTracker implements SurfaceControl.TransactionCommittedListener,
                Runnable {
            private final int mTransitionId;
            private final Runnable mCleanUp;
            UncertainTracker(Runnable cleanUp) {

            UncertainTracker(int transitionId, Runnable cleanUp) {
                mTransitionId = transitionId;
                mCleanUp = cleanUp;
            }

@@ -304,6 +316,19 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
                        "RSO:Uncertain transition tracker complete=%s", this);
                mCleanUp.run();
            }

            /** Runs on timeout. */
            @Override
            public void run() {
                Log.wtf(TAG, "RSO:Uncertain transition tracker timeout! " + this);
                mCleanUp.run();
            }

            @Override
            public String toString() {
                return "UncertainTracker@" + Integer.toHexString(System.identityHashCode(this))
                        + ", monitor transitionId= " + mTransitionId;
            }
        }

        private static class WindowRecord {