diff options
8 files changed, 125 insertions, 199 deletions
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 0eb4caaf7a0f..7434cb02cc7c 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -175,12 +175,6 @@ "group": "WM_ERROR", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, - "-1941440781": { - "message": "Creating Pending Move-to-back: %s", - "level": "VERBOSE", - "group": "WM_DEBUG_WINDOW_TRANSITIONS", - "at": "com\/android\/server\/wm\/Task.java" - }, "-1939861963": { "message": "Create root task displayId=%d winMode=%d", "level": "VERBOSE", @@ -631,12 +625,6 @@ "group": "WM_DEBUG_CONFIGURATION", "at": "com\/android\/server\/wm\/ActivityStarter.java" }, - "-1484988952": { - "message": "Creating Pending Multiwindow Fullscreen Request: %s", - "level": "VERBOSE", - "group": "WM_DEBUG_WINDOW_TRANSITIONS", - "at": "com\/android\/server\/wm\/ActivityClientController.java" - }, "-1483435730": { "message": "InsetsSource setWin %s for type %s", "level": "DEBUG", @@ -2605,12 +2593,6 @@ "group": "WM_DEBUG_ANIM", "at": "com\/android\/server\/wm\/WindowState.java" }, - "286170861": { - "message": "Creating Pending Transition for TaskFragment: %s", - "level": "VERBOSE", - "group": "WM_DEBUG_WINDOW_TRANSITIONS", - "at": "com\/android\/server\/wm\/WindowOrganizerController.java" - }, "288485303": { "message": "Attempted to set remove mode to a display that does not exist: %d", "level": "WARN", @@ -3193,12 +3175,6 @@ "group": "WM_DEBUG_APP_TRANSITIONS", "at": "com\/android\/server\/wm\/AppTransitionController.java" }, - "800698875": { - "message": "SyncGroup %d: Started when there is other active SyncGroup", - "level": "WARN", - "group": "WM_DEBUG_SYNC_ENGINE", - "at": "com\/android\/server\/wm\/BLASTSyncEngine.java" - }, "801521566": { "message": "Content Recording: Attempting to mirror %d from %d but no DisplayContent associated. Changing to mirror default display.", "level": "WARN", @@ -3259,12 +3235,6 @@ "group": "WM_DEBUG_STATES", "at": "com\/android\/server\/wm\/RootWindowContainer.java" }, - "898260097": { - "message": "Creating Pending Pip-Enter: %s", - "level": "VERBOSE", - "group": "WM_DEBUG_WINDOW_TRANSITIONS", - "at": "com\/android\/server\/wm\/ActivityTaskManagerService.java" - }, "898863925": { "message": "Attempted to add QS dialog window with unknown token %s. Aborting.", "level": "WARN", @@ -4009,12 +3979,6 @@ "group": "WM_DEBUG_CONTENT_RECORDING", "at": "com\/android\/server\/wm\/ContentRecorder.java" }, - "1667162379": { - "message": "Creating Pending Transition: %s", - "level": "VERBOSE", - "group": "WM_DEBUG_WINDOW_TRANSITIONS", - "at": "com\/android\/server\/wm\/WindowOrganizerController.java" - }, "1670933628": { "message": " Setting allReady override", "level": "VERBOSE", @@ -4075,6 +4039,12 @@ "group": "WM_DEBUG_SYNC_ENGINE", "at": "com\/android\/server\/wm\/BLASTSyncEngine.java" }, + "1735199721": { + "message": "Queueing transition: %s", + "level": "VERBOSE", + "group": "WM_DEBUG_WINDOW_TRANSITIONS_MIN", + "at": "com\/android\/server\/wm\/TransitionController.java" + }, "1739298851": { "message": "removeWindowToken: Attempted to remove token: %s for non-exiting displayId=%d", "level": "WARN", diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index 7718dd88b772..8bbcd2787931 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -97,7 +97,6 @@ import android.window.TransitionInfo; import com.android.internal.app.AssistUtils; import com.android.internal.policy.IKeyguardDismissCallback; -import com.android.internal.protolog.ProtoLogGroup; import com.android.internal.protolog.common.ProtoLog; import com.android.server.LocalServices; import com.android.server.Watchdog; @@ -1142,18 +1141,11 @@ class ActivityClientController extends IActivityClientController.Stub { // Initiate the transition. final Transition transition = new Transition(TRANSIT_CHANGE, 0 /* flags */, controller, mService.mWindowManager.mSyncEngine); - if (mService.mWindowManager.mSyncEngine.hasActiveSync()) { - ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, - "Creating Pending Multiwindow Fullscreen Request: %s", transition); - r.mTransitionController.queueCollecting(transition, - () -> { - executeFullscreenRequestTransition(fullscreenRequest, callback, r, - transition, true /* queued */); - }); - } else { - executeFullscreenRequestTransition(fullscreenRequest, callback, r, transition, - false /* queued */); - } + r.mTransitionController.startCollectOrQueue(transition, + (deferred) -> { + executeFullscreenRequestTransition(fullscreenRequest, callback, r, + transition, deferred); + }); } private void executeFullscreenRequestTransition(int fullscreenRequest, IRemoteCallback callback, diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 0b98495c8e99..c1552abefc56 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -9806,7 +9806,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mTransitionController.isShellTransitionsEnabled()) { final Transition transition = new Transition(TRANSIT_RELAUNCH, 0 /* flags */, mTransitionController, mWmService.mSyncEngine); - final Runnable executeRestart = () -> { + mTransitionController.startCollectOrQueue(transition, (deferred) -> { if (mState != RESTARTING_PROCESS || !attachedToProcess()) { transition.abort(); return; @@ -9818,13 +9818,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mTransitionController.requestStartTransition(transition, task, null /* remoteTransition */, null /* displayChange */); scheduleStopForRestartProcess(); - }; - if (mWmService.mSyncEngine.hasActiveSync()) { - mTransitionController.queueCollecting(transition, executeRestart); - } else { - mTransitionController.moveToCollecting(transition); - executeRestart.run(); - } + }); } else { startFreezingScreen(); scheduleStopForRestartProcess(); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index e780716dd06c..064af0f3165e 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -250,7 +250,6 @@ import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.os.TransferPipe; import com.android.internal.policy.AttributeCache; import com.android.internal.policy.KeyguardDismissCallback; -import com.android.internal.protolog.ProtoLogGroup; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastPrintWriter; @@ -2873,28 +2872,19 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final Transition transition = new Transition(TRANSIT_CHANGE, 0 /* flags */, getTransitionController(), mWindowManager.mSyncEngine); - if (mWindowManager.mSyncEngine.hasActiveSync()) { - getTransitionController().queueCollecting(transition, - () -> { - if (!task.getWindowConfiguration().canResizeTask()) { - Slog.w(TAG, "resizeTask not allowed on task=" + task); - transition.abort(); - return; - } - getTransitionController().requestStartTransition(transition, task, - null /* remoteTransition */, null /* displayChange */); - getTransitionController().collect(task); - task.resize(bounds, resizeMode, preserveWindow); - transition.setReady(task, true); - }); - } else { - getTransitionController().moveToCollecting(transition); - getTransitionController().requestStartTransition(transition, task, - null /* remoteTransition */, null /* displayChange */); - getTransitionController().collect(task); - task.resize(bounds, resizeMode, preserveWindow); - transition.setReady(task, true); - } + getTransitionController().startCollectOrQueue(transition, + (deferred) -> { + if (deferred && !task.getWindowConfiguration().canResizeTask()) { + Slog.w(TAG, "resizeTask not allowed on task=" + task); + transition.abort(); + return; + } + getTransitionController().requestStartTransition(transition, task, + null /* remoteTransition */, null /* displayChange */); + getTransitionController().collect(task); + task.resize(bounds, resizeMode, preserveWindow); + transition.setReady(task, true); + }); } } finally { Binder.restoreCallingIdentity(ident); @@ -3625,30 +3615,25 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mActivityClientController.dismissKeyguard(r.token, new KeyguardDismissCallback() { @Override public void onDismissSucceeded() { - if (transition != null && mWindowManager.mSyncEngine.hasActiveSync()) { - ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, - "Creating Pending Pip-Enter: %s", transition); - getTransitionController().queueCollecting(transition, enterPipRunnable); - } else { - // Move to collecting immediately to "claim" the sync-engine for this - // transition. - if (transition != null) { - getTransitionController().moveToCollecting(transition); - } + if (transition == null) { mH.post(enterPipRunnable); + return; } + getTransitionController().startCollectOrQueue(transition, (deferred) -> { + if (deferred) { + enterPipRunnable.run(); + } else { + mH.post(enterPipRunnable); + } + }); } }, null /* message */); } else { // Enter picture in picture immediately otherwise - if (transition != null && mWindowManager.mSyncEngine.hasActiveSync()) { - ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, - "Creating Pending Pip-Enter: %s", transition); - getTransitionController().queueCollecting(transition, enterPipRunnable); + if (transition != null) { + getTransitionController().startCollectOrQueue(transition, + (deferred) -> enterPipRunnable.run()); } else { - if (transition != null) { - getTransitionController().moveToCollecting(transition); - } enterPipRunnable.run(); } } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index ad934541267e..cd4b3c565a41 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2328,17 +2328,23 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // this as a signal to the transition-player. final Transition transition = new Transition(TRANSIT_SLEEP, 0 /* flags */, display.mTransitionController, mWmService.mSyncEngine); - final Runnable sendSleepTransition = () -> { + final TransitionController.OnStartCollect sendSleepTransition = (deferred) -> { display.mTransitionController.requestStartTransition(transition, null /* trigger */, null /* remote */, null /* display */); // Force playing immediately so that unrelated ops can't be collected. transition.playNow(); }; - if (display.mTransitionController.isCollecting()) { - display.mTransitionController.queueCollecting(transition, sendSleepTransition); - } else { + if (!display.mTransitionController.isCollecting()) { + // Since this bypasses sync, submit directly ignoring whether sync-engine + // is active. + if (mWindowManager.mSyncEngine.hasActiveSync()) { + Slog.w(TAG, "Ongoing sync outside of a transition."); + } display.mTransitionController.moveToCollecting(transition); - sendSleepTransition.run(); + sendSleepTransition.onCollectStarted(false /* deferred */); + } else { + display.mTransitionController.startCollectOrQueue(transition, + sendSleepTransition); } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 89f975387667..5f9ba3f5202f 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -188,7 +188,6 @@ import android.window.WindowContainerToken; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IVoiceInteractor; -import com.android.internal.protolog.ProtoLogGroup; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.XmlUtils; import com.android.internal.util.function.pooled.PooledLambda; @@ -5632,29 +5631,20 @@ class Task extends TaskFragment { final Transition transition = new Transition(TRANSIT_TO_BACK, 0 /* flags */, mTransitionController, mWmService.mSyncEngine); // Guarantee that this gets its own transition by queueing on SyncEngine - if (mWmService.mSyncEngine.hasActiveSync()) { - ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, - "Creating Pending Move-to-back: %s", transition); - mTransitionController.queueCollecting(transition, - () -> { - // Need to check again since this happens later and the system might - // be in a different state. - if (!canMoveTaskToBack(tr)) { - Slog.e(TAG, "Failed to move task to back after saying we could: " - + tr.mTaskId); - transition.abort(); - return; - } - mTransitionController.requestStartTransition(transition, tr, - null /* remoteTransition */, null /* displayChange */); - moveTaskToBackInner(tr); - }); - } else { - mTransitionController.moveToCollecting(transition); - mTransitionController.requestStartTransition(transition, tr, - null /* remoteTransition */, null /* displayChange */); - moveTaskToBackInner(tr); - } + mTransitionController.startCollectOrQueue(transition, + (deferred) -> { + // Need to check again if deferred since the system might + // be in a different state. + if (deferred && !canMoveTaskToBack(tr)) { + Slog.e(TAG, "Failed to move task to back after saying we could: " + + tr.mTaskId); + transition.abort(); + return; + } + mTransitionController.requestStartTransition(transition, tr, + null /* remoteTransition */, null /* displayChange */); + moveTaskToBackInner(tr); + }); } else { // Skip the transition for pinned task. if (!inPinnedWindowingMode()) { diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 4c1c2ff1ac10..cbb4fe2eaa21 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -884,13 +884,30 @@ class TransitionController { proto.end(token); } - void queueCollecting(Transition transit, Runnable onCollectStart) { - mAtm.mWindowManager.mSyncEngine.queueSyncSet( - // Make sure to collect immediately to prevent another transition - // from sneaking in before it. Note: moveToCollecting internally - // calls startSyncSet. - () -> moveToCollecting(transit), - onCollectStart); + /** Returns {@code true} if it started collecting, {@code false} if it was queued. */ + boolean startCollectOrQueue(Transition transit, OnStartCollect onStartCollect) { + if (mAtm.mWindowManager.mSyncEngine.hasActiveSync()) { + if (!isCollecting()) { + Slog.w(TAG, "Ongoing Sync outside of transition."); + } + ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS_MIN, + "Queueing transition: %s", transit); + mAtm.mWindowManager.mSyncEngine.queueSyncSet( + // Make sure to collect immediately to prevent another transition + // from sneaking in before it. Note: moveToCollecting internally + // calls startSyncSet. + () -> moveToCollecting(transit), + () -> onStartCollect.onCollectStarted(true /* deferred */)); + return false; + } else { + moveToCollecting(transit); + onStartCollect.onCollectStarted(false /* deferred */); + return true; + } + } + + interface OnStartCollect { + void onCollectStarted(boolean deferred); } /** diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index f63470f2bea4..ee86b97e9404 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -280,41 +280,31 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub applyTransaction(t, -1 /* syncId */, null, caller); return null; } - // In cases where transition is already provided, the "readiness lifecycle" of the - // transition is determined outside of this transaction. However, if this is a - // direct call from shell, the entire transition lifecycle is contained in the - // provided transaction and thus we can setReady immediately after apply. - final boolean needsSetReady = transition == null && t != null; final WindowContainerTransaction wct = t != null ? t : new WindowContainerTransaction(); if (transition == null) { if (type < 0) { throw new IllegalArgumentException("Can't create transition with no type"); } - transition = new Transition(type, 0 /* flags */, mTransitionController, - mService.mWindowManager.mSyncEngine); - // If there is already a collecting transition, queue up a new transition and - // return that. The actual start and apply will then be deferred until that - // transition starts collecting. This should almost never happen except during - // tests. - if (mService.mWindowManager.mSyncEngine.hasActiveSync()) { - Slog.w(TAG, "startTransition() while one is already collecting."); - final Transition nextTransition = transition; - ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, - "Creating Pending Transition: %s", nextTransition); - mTransitionController.queueCollecting(nextTransition, - () -> { - nextTransition.start(); - nextTransition.mLogger.mStartWCT = wct; - applyTransaction(wct, -1 /*syncId*/, nextTransition, caller); - if (needsSetReady) { - nextTransition.setAllReady(); - } - }); - return nextTransition.getToken(); - } - mTransitionController.moveToCollecting(transition); + // This is a direct call from shell, so the entire transition lifecycle is + // contained in the provided transaction if provided. Thus, we can setReady + // immediately after apply. + final boolean needsSetReady = t != null; + final Transition nextTransition = new Transition(type, 0 /* flags */, + mTransitionController, mService.mWindowManager.mSyncEngine); + mTransitionController.startCollectOrQueue(nextTransition, + (deferred) -> { + nextTransition.start(); + nextTransition.mLogger.mStartWCT = wct; + applyTransaction(wct, -1 /*syncId*/, nextTransition, caller); + if (needsSetReady) { + nextTransition.setAllReady(); + } + }); + return nextTransition.getToken(); } + // The transition already started collecting before sending a request to shell, + // so just start here. if (!transition.isCollecting() && !transition.isForcePlaying()) { Slog.e(TAG, "Trying to start a transition that isn't collecting. This probably" + " means Shell took too long to respond to a request. WM State may be" @@ -325,9 +315,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub transition.start(); transition.mLogger.mStartWCT = wct; applyTransaction(wct, -1 /*syncId*/, transition, caller); - if (needsSetReady) { - transition.setAllReady(); - } + // Since the transition is already provided, it means WMCore is determining the + // "readiness lifecycle" outside the provided transaction, so don't set ready here. return transition.getToken(); } } finally { @@ -432,23 +421,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub return; } - if (!mService.mWindowManager.mSyncEngine.hasActiveSync()) { - // Sync is for either transition or applySyncTransaction(). We don't support - // multiple sync at the same time because it may cause conflict. - // Create a new transition when there is no active sync to collect the changes. - final Transition transition = mTransitionController.createTransition(type); - if (applyTransaction(wct, -1 /* syncId */, transition, caller) - == TRANSACT_EFFECTS_NONE && transition.mParticipants.isEmpty()) { - transition.abort(); - return; - } - mTransitionController.requestStartTransition(transition, null /* startTask */, - null /* remoteTransition */, null /* displayChange */); - transition.setAllReady(); - return; - } - - if (!shouldApplyIndependently) { + if (mService.mWindowManager.mSyncEngine.hasActiveSync() + && !shouldApplyIndependently) { // Although there is an active sync, we want to apply the transaction now. // TODO(b/232042367) Redesign the organizer update on activity callback so that we // we will know about the transition explicitly. @@ -467,25 +441,23 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub return; } - // It is ok to queue the WCT until the sync engine is free. - final Transition nextTransition = new Transition(type, 0 /* flags */, + final Transition transition = new Transition(type, 0 /* flags */, mTransitionController, mService.mWindowManager.mSyncEngine); - ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, - "Creating Pending Transition for TaskFragment: %s", nextTransition); - mTransitionController.queueCollecting(nextTransition, - () -> { - if (mTaskFragmentOrganizerController.isValidTransaction(wct) - && (applyTransaction(wct, -1 /* syncId */, nextTransition, caller) - != TRANSACT_EFFECTS_NONE - || !nextTransition.mParticipants.isEmpty())) { - mTransitionController.requestStartTransition(nextTransition, - null /* startTask */, null /* remoteTransition */, - null /* displayChange */); - nextTransition.setAllReady(); - return; - } - nextTransition.abort(); - }); + TransitionController.OnStartCollect doApply = (deferred) -> { + if (deferred && !mTaskFragmentOrganizerController.isValidTransaction(wct)) { + transition.abort(); + return; + } + if (applyTransaction(wct, -1 /* syncId */, transition, caller) + == TRANSACT_EFFECTS_NONE && transition.mParticipants.isEmpty()) { + transition.abort(); + return; + } + mTransitionController.requestStartTransition(transition, null /* startTask */, + null /* remoteTransition */, null /* displayChange */); + transition.setAllReady(); + }; + mTransitionController.startCollectOrQueue(transition, doApply); } finally { Binder.restoreCallingIdentity(ident); } |