Loading libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java +22 −106 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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()) { Loading @@ -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); } } Loading @@ -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); } Loading Loading @@ -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); Loading @@ -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; } Loading @@ -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; Loading @@ -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); } } } Loading Loading @@ -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"); Loading Loading @@ -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) { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingWindowControllerTests.java +4 −12 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading @@ -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()); } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java +22 −106 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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()) { Loading @@ -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); } } Loading @@ -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); } Loading Loading @@ -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); Loading @@ -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; } Loading @@ -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; Loading @@ -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); } } } Loading Loading @@ -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"); Loading Loading @@ -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) { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingWindowControllerTests.java +4 −12 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading @@ -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()); } Loading