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

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

Merge "Revert "Update the starting window removal state based on transition events"" into main

parents 5eb68cee a7c62fd8
Loading
Loading
Loading
Loading
+22 −106
Original line number Diff line number Diff line
@@ -85,7 +85,6 @@ import java.util.ArrayList;
 */
public class StartingWindowController implements RemoteCallable<StartingWindowController> {
    public static final String TAG = "ShellStartingWindow";
    private static final String TRACE_NAME_STARTING_SHOWING = "starting_window_showing";

    private static final long TASK_BG_COLOR_RETAIN_TIME_MS = 5000;

@@ -167,9 +166,19 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
            }
            final ArrayList<WindowRecord> records = findRecords(transition);
            if (records != null) {
                startTransaction.addTransactionCommittedListener(mShellMainExecutor, () -> {
                    for (int i = records.size() - 1; i >= 0; --i) {
                    records.get(i).mStartTransaction = startTransaction;
                        final int taskId = records.get(i).mTaskId;
                        final WindowRecord wr = mWindowRecords.get(taskId);
                        if (wr == null) {
                            return;
                        }
                        ProtoLog.v(ShellProtoLogGroup.WM_SHELL_REMOVE_STARTING_TRACKER,
                                "RSO:Transaction applied for task=%d", taskId);
                        wr.mTransactionApplied = true;
                        executeRemovalIfPossible(wr);
                    }
                });
                return;
            }

@@ -180,8 +189,8 @@ 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(transition,
                            () -> uncertainTrackComplete(transition, "Transaction"));
                    final UncertainTracker tracker = new UncertainTracker(
                            () -> uncertainTrackComplete(transition));
                    mUncertainTrackers.put(transition, tracker);
                    startTransaction.addTransactionCommittedListener(mShellMainExecutor,
                            tracker);
@@ -192,70 +201,6 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
            }
        }

        @Override
        public void onTransitionStarting(@NonNull IBinder transition) {
            if (!hasPendingRemoval()) {
                return;
            }
            final ArrayList<WindowRecord> records = findRecords(transition);
            if (records != null) {
                for (int i = records.size() - 1; i >= 0; --i) {
                    final WindowRecord r = records.get(i);
                    r.mTransitionPlayed = true;
                    executeRemovalIfPossible(r);
                }
            } else {
                uncertainTrackComplete(transition, "onTransitionStarting");
            }
        }

        @Override
        public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) {
            if (!hasPendingRemoval()) {
                return;
            }
            final ArrayList<WindowRecord> mergedRecords = findRecords(merged);
            // The starting window is created in a continuing transition.
            if (mergedRecords != null) {
                for (int i = mergedRecords.size() - 1; i >= 0; --i) {
                    final WindowRecord r = mergedRecords.get(i);
                    final int taskId = r.mTaskId;
                    final SurfaceControl.Transaction st = r.mStartTransaction;
                    if (st != null) {
                        // Listen for the transaction to commit so that the window has a chance to
                        // be removed earlier, before onFinished.
                        st.addTransactionCommittedListener(mShellMainExecutor, () -> {
                            final WindowRecord wr = mWindowRecords.get(taskId);
                            if (wr == null) {
                                return;
                            }
                            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_REMOVE_STARTING_TRACKER,
                                    "RSO:Transaction applied for task=%d", taskId);
                            wr.mTransitionPlayed = true;
                            executeRemovalIfPossible(wr);
                        });
                    } else {
                        // Switch merged to playing because they won't receive onTransitionFinished.
                        r.mTransition = playing;
                    }
                }
                return;
            }
            // Merge uncertainTrackers to initial playing transition.
            final ArrayList<WindowRecord> records = findRecords(playing);
            if (records == null) {
                return;
            }
            final UncertainTracker uncertainTracker = mUncertainTrackers.get(merged);
            if (uncertainTracker == null) {
                return;
            }
            for (int i = records.size() - 1; i >= 0; --i) {
                final WindowRecord r = records.get(i);
                r.updateUncertainTrackers(uncertainTracker);
            }
        }

        @Override
        public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) {
            if (!hasPendingRemoval()) {
@@ -266,17 +211,11 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
            if (records != null) {
                for (int i = records.size() - 1; i >= 0; --i) {
                    final WindowRecord r = records.get(i);
                    r.mTransitionPlayed = true;
                    if (r.mMergedUncertainTrackers != null) {
                        for (int j = r.mMergedUncertainTrackers.size() - 1; j >= 0; --j) {
                            final UncertainTracker u = r.mMergedUncertainTrackers.remove(j);
                            mUncertainTrackers.remove(u.mTransition);
                        }
                    }
                    r.mTransactionApplied = true;
                    executeRemovalIfPossible(r);
                }
            } else {
                uncertainTrackComplete(transition, "onTransitionFinished");
                uncertainTrackComplete(transition);
            }
        }

@@ -301,9 +240,6 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
            }
            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_REMOVE_STARTING_TRACKER,
                    "RSO:Window wasn't created, removal record task=%d", taskId);
            if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_WINDOW_MANAGER, TAG, taskId);
            }
            mWindowRecords.remove(taskId);
        }

@@ -341,19 +277,17 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
                return;
            }
            if (record.mTransition == null
                    || (record.mTransitionPlayed && mUncertainTrackers.isEmpty())) {
                    || (record.mTransactionApplied && mUncertainTrackers.isEmpty())) {
                mWindowRecords.remove(record.mTaskId);
                removeStartingWindowInner(record.mStartingWindowRemovalInfo);
            }
        }

        private void uncertainTrackComplete(IBinder transition, String reason) {
        private void uncertainTrackComplete(IBinder transition) {
            final boolean hasRemove = mUncertainTrackers.remove(transition) != null;
            if (!hasRemove || !mUncertainTrackers.isEmpty()) {
                return;
            }
            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_REMOVE_STARTING_TRACKER,
                    "RSO:uncertainTrackComplete=%s", reason);
            // check if anything task left due to uncertain transition.
            for (int i = mWindowRecords.size() - 1; i >= 0; --i) {
                final WindowRecord record = mWindowRecords.valueAt(i);
@@ -362,10 +296,8 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
        }

        static class UncertainTracker implements SurfaceControl.TransactionCommittedListener {
            private final IBinder mTransition;
            private final Runnable mCleanUp;
            UncertainTracker(IBinder transition, Runnable cleanUp) {
                mTransition = transition;
            UncertainTracker(Runnable cleanUp) {
                mCleanUp = cleanUp;
            }

@@ -379,13 +311,11 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo

        private static class WindowRecord {
            final int mTaskId;
            IBinder mTransition;
            boolean mTransitionPlayed;
            final IBinder mTransition;
            boolean mTransactionApplied;
            StartingWindowRemovalInfo mStartingWindowRemovalInfo;

            final ArraySet<IBinder> mAppTokens = new ArraySet<>();
            ArrayList<UncertainTracker> mMergedUncertainTrackers;
            SurfaceControl.Transaction mStartTransaction;

            WindowRecord(int taskId, IBinder transition, IBinder appToken) {
                mTaskId = taskId;
@@ -401,13 +331,6 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
                mAppTokens.remove(token);
                return mAppTokens.isEmpty();
            }

            void updateUncertainTrackers(UncertainTracker uncertainTracker) {
                if (mMergedUncertainTrackers == null) {
                    mMergedUncertainTrackers = new ArrayList<>();
                }
                mMergedUncertainTrackers.add(uncertainTracker);
            }
        }
    }

@@ -444,10 +367,6 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
            mShellMainExecutor.execute(() -> mRemoveStartingObserver.onAddingWindow(
                    windowInfo.taskInfo.taskId, windowInfo.transitionToken, windowInfo.appToken));
        }
        if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
            Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_WINDOW_MANAGER, TAG,
                    TRACE_NAME_STARTING_SHOWING, windowInfo.taskInfo.taskId);
        }
        mSplashScreenExecutor.execute(() -> {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "addStartingWindow");

@@ -528,9 +447,6 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
    }

    void removeStartingWindowInner(StartingWindowRemovalInfo removalInfo) {
        if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
            Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_WINDOW_MANAGER, TAG, removalInfo.taskId);
        }
        mSplashScreenExecutor.execute(() -> mStartingSurfaceDrawer.removeStartingWindow(
                removalInfo));
        if (!removalInfo.windowlessSurface) {
+4 −12
Original line number Diff line number Diff line
@@ -149,7 +149,6 @@ public class StartingWindowControllerTests extends ShellTestCase {

        observer.onAddingWindow(taskId, token, appToken);
        observer.onTransitionReady(token, info, st, st);
        observer.onTransitionStarting(token);
        notifyTransactionCommitted(st);
        assertTrue(observer.hasPendingRemoval());
        observer.requestRemoval(taskId, removalInfo);
@@ -160,7 +159,7 @@ public class StartingWindowControllerTests extends ShellTestCase {
        observer.requestRemoval(taskId, removalInfo);
        observer.onTransitionReady(token, info, st, st);
        assertTrue(observer.hasPendingRemoval());
        observer.onTransitionStarting(token);
        notifyTransactionCommitted(st);
        assertFalse(observer.hasPendingRemoval());

        // Received second transition with FLAG_IS_BEHIND_STARTING_WINDOW
@@ -171,28 +170,21 @@ public class StartingWindowControllerTests extends ShellTestCase {
                .addChange(TRANSIT_OPEN, FLAG_IS_BEHIND_STARTING_WINDOW).build();
        observer.onAddingWindow(taskId, token, appToken);
        observer.onTransitionReady(token, info, st, st);
        observer.onTransitionStarting(token);
        notifyTransactionCommitted(st);
        observer.onTransitionReady(secondToken, secondInfo, st, st);
        observer.onTransitionMerged(secondToken, token);
        notifyTransactionCommitted(st);
        assertTrue(observer.hasPendingRemoval());
        // received removalInfo before transaction committed
        observer.requestRemoval(taskId, removalInfo);
        assertTrue(observer.hasPendingRemoval());
        notifyTransactionCommitted(st);
        assertFalse(observer.hasPendingRemoval());

        st.clear();
        observer.onAddingWindow(taskId, token, appToken);
        observer.onTransitionReady(token, info, st, st);
        observer.onTransitionStarting(token);
        notifyTransactionCommitted(st);
        observer.onTransitionReady(secondToken, secondInfo, st, st);
        observer.onTransitionMerged(secondToken, token);
        // received transaction committed before removalInfo
        notifyTransactionCommitted(st);
        assertTrue(observer.hasPendingRemoval());
        observer.requestRemoval(taskId, removalInfo);
        assertTrue(observer.hasPendingRemoval());
        notifyTransactionCommitted(st);
        assertFalse(observer.hasPendingRemoval());
    }