Loading core/java/android/window/ITransitionPlayer.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.window; import android.view.SurfaceControl; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.StartingWindowRemovalInfo; /** * Implemented by WMShell to initiate and play transition animations. Loading Loading @@ -63,4 +64,10 @@ oneway interface ITransitionPlayer { * @param request Information about this particular request. */ void requestStartTransition(in IBinder transitionToken, in TransitionRequestInfo request); /** * Allows us to send a remove starting windo request to the transition binder, ensuring this * request is invoked after onTransitionReady. */ void removeStartingWindow(in StartingWindowRemovalInfo removalInfo); } libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +10 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.view.SurfaceControl; import android.view.WindowManager; import android.window.ITransitionPlayer; import android.window.RemoteTransition; import android.window.StartingWindowRemovalInfo; import android.window.TaskFragmentOrganizer; import android.window.TransitionFilter; import android.window.TransitionInfo; Loading Loading @@ -1284,6 +1285,10 @@ public class Transitions implements RemoteCallable<Transitions>, mPendingTransitions.add(0, active); } void removeStartingWindow(StartingWindowRemovalInfo removalInfo) { mOrganizer.removeStartingWindow(removalInfo); } /** * Start a new transition directly. * @param handler if null, the transition will be dispatched to the registered set of transition Loading Loading @@ -1652,6 +1657,11 @@ public class Transitions implements RemoteCallable<Transitions>, TransitionRequestInfo request) throws RemoteException { mMainExecutor.execute(() -> Transitions.this.requestStartTransition(iBinder, request)); } @Override public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) { mMainExecutor.execute(() -> Transitions.this.removeStartingWindow(removalInfo)); } } /** Loading services/core/java/com/android/server/wm/ActivityRecord.java +25 −4 Original line number Diff line number Diff line Loading @@ -329,6 +329,7 @@ import android.window.SizeConfigurationBuckets; import android.window.SplashScreen; import android.window.SplashScreenView; import android.window.SplashScreenView.SplashScreenViewParcelable; import android.window.StartingWindowRemovalInfo; import android.window.TaskSnapshot; import android.window.TaskSnapshotManager; import android.window.TransitionInfo.AnimationOptions; Loading Loading @@ -2774,6 +2775,10 @@ final class ActivityRecord extends WindowToken { mStartingData.mPrepareRemoveAnimation = prepareAnimation; return; } } else if (mSyncState != SYNC_STATE_NONE) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_REMOVE_DIRECTLY; mStartingData.mPrepareRemoveAnimation = prepareAnimation; return; } animate = prepareAnimation && mStartingData.needRevealAnimation() && mStartingWindow.isVisibleByPolicy(); Loading @@ -2782,10 +2787,7 @@ final class ActivityRecord extends WindowToken { + " animate=%b Callers=%s", this, mStartingWindow, animate, Debug.getCallers(5)); surface = mStartingSurface; mStartingData = null; mStartingSurface = null; mStartingWindow = null; mTransitionChangeFlags &= ~FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT; cleanUpStartingInfo(); if (surface == null) { ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "startingWindow was set but " + "startingSurface==null, couldn't remove"); Loading @@ -2800,6 +2802,25 @@ final class ActivityRecord extends WindowToken { surface.remove(animate, hasImeSurface); } StartingWindowRemovalInfo getStartingWindowInfo() { if (mStartingData == null || mStartingWindow == null) { return null; } final boolean animate = mStartingData.mPrepareRemoveAnimation && mStartingData.needRevealAnimation() && mStartingWindow.isVisibleByPolicy(); final boolean hasImeSurface = mStartingData.hasImeSurface(); return mAtmService.mTaskOrganizerController.getStartingWindowRemovalInfo( task, animate, hasImeSurface); } void cleanUpStartingInfo() { mStartingData = null; mStartingSurface = null; mStartingWindow = null; mTransitionChangeFlags &= ~FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT; } /** * Reparents this activity into {@param newTaskFrag} at the provided {@param position}. The * caller should ensure that the {@param newTaskFrag} is not already the parent of this Loading services/core/java/com/android/server/wm/TaskOrganizerController.java +15 −8 Original line number Diff line number Diff line Loading @@ -654,16 +654,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { return true; } void removeStartingWindow(Task task, ITaskOrganizer taskOrganizer, boolean prepareAnimation, boolean hasImeSurface) { StartingWindowRemovalInfo getStartingWindowRemovalInfo(Task task, boolean prepareAnimation, boolean hasImeSurface) { final Task rootTask = task.getRootTask(); if (rootTask == null) { return; } final ITaskOrganizer lastOrganizer = taskOrganizer != null ? taskOrganizer : getTaskOrganizer(); if (lastOrganizer == null) { return; return null; } final StartingWindowRemovalInfo removalInfo = new StartingWindowRemovalInfo(); removalInfo.taskId = task.mTaskId; Loading Loading @@ -700,6 +695,18 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { mainWindow.mSurfacePosition.y); } } return removalInfo; } void removeStartingWindow(Task task, ITaskOrganizer taskOrganizer, boolean prepareAnimation, boolean hasImeSurface) { final ITaskOrganizer lastOrganizer = taskOrganizer != null ? taskOrganizer : getTaskOrganizer(); if (lastOrganizer == null) { return; } final StartingWindowRemovalInfo removalInfo = getStartingWindowRemovalInfo(task, prepareAnimation, hasImeSurface); try { lastOrganizer.removeStartingWindow(removalInfo); } catch (RemoteException e) { Loading services/core/java/com/android/server/wm/Transition.java +28 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_S import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_TIMEOUT; import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_REMOVE_DIRECTLY; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; Loading Loading @@ -109,6 +110,7 @@ import android.view.Display; import android.view.SurfaceControl; import android.view.WindowManager; import android.window.ScreenCapture; import android.window.StartingWindowRemovalInfo; import android.window.TaskFragmentAnimationParams; import android.window.TransitionInfo; import android.window.WindowContainerTransaction; Loading Loading @@ -2103,6 +2105,32 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { mLogger.logOnSendAsync(mController.mLoggerHandler); mController.mTransitionTracer.logSentTransition(this, mTargets); } removeStartingWindowIfAny(); } private void removeStartingWindowIfAny() { if (!Flags.removeStartingInTransition()) { return; } for (int i = mParticipants.size() - 1; i >= 0; --i) { final ActivityRecord ar = mParticipants.valueAt(i).asActivityRecord(); if (ar == null || ar.mStartingData == null || ar.mStartingSurface == null || ar.mStartingData.mRemoveAfterTransaction != AFTER_TRANSACTION_REMOVE_DIRECTLY) { continue; } final StartingWindowRemovalInfo removalInfo = ar.getStartingWindowInfo(); if (removalInfo != null) { try { ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Remove Starting Window after transition: %s", ar); mController.getTransitionPlayer().removeStartingWindow(removalInfo); } catch (RemoteException e) { Slog.e(TAG, "Unable to remove starting window after transition"); } ar.cleanUpStartingInfo(); } } } void ensureParticipantSurfaceVisibility() { Loading Loading
core/java/android/window/ITransitionPlayer.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.window; import android.view.SurfaceControl; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.StartingWindowRemovalInfo; /** * Implemented by WMShell to initiate and play transition animations. Loading Loading @@ -63,4 +64,10 @@ oneway interface ITransitionPlayer { * @param request Information about this particular request. */ void requestStartTransition(in IBinder transitionToken, in TransitionRequestInfo request); /** * Allows us to send a remove starting windo request to the transition binder, ensuring this * request is invoked after onTransitionReady. */ void removeStartingWindow(in StartingWindowRemovalInfo removalInfo); }
libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +10 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.view.SurfaceControl; import android.view.WindowManager; import android.window.ITransitionPlayer; import android.window.RemoteTransition; import android.window.StartingWindowRemovalInfo; import android.window.TaskFragmentOrganizer; import android.window.TransitionFilter; import android.window.TransitionInfo; Loading Loading @@ -1284,6 +1285,10 @@ public class Transitions implements RemoteCallable<Transitions>, mPendingTransitions.add(0, active); } void removeStartingWindow(StartingWindowRemovalInfo removalInfo) { mOrganizer.removeStartingWindow(removalInfo); } /** * Start a new transition directly. * @param handler if null, the transition will be dispatched to the registered set of transition Loading Loading @@ -1652,6 +1657,11 @@ public class Transitions implements RemoteCallable<Transitions>, TransitionRequestInfo request) throws RemoteException { mMainExecutor.execute(() -> Transitions.this.requestStartTransition(iBinder, request)); } @Override public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) { mMainExecutor.execute(() -> Transitions.this.removeStartingWindow(removalInfo)); } } /** Loading
services/core/java/com/android/server/wm/ActivityRecord.java +25 −4 Original line number Diff line number Diff line Loading @@ -329,6 +329,7 @@ import android.window.SizeConfigurationBuckets; import android.window.SplashScreen; import android.window.SplashScreenView; import android.window.SplashScreenView.SplashScreenViewParcelable; import android.window.StartingWindowRemovalInfo; import android.window.TaskSnapshot; import android.window.TaskSnapshotManager; import android.window.TransitionInfo.AnimationOptions; Loading Loading @@ -2774,6 +2775,10 @@ final class ActivityRecord extends WindowToken { mStartingData.mPrepareRemoveAnimation = prepareAnimation; return; } } else if (mSyncState != SYNC_STATE_NONE) { mStartingData.mRemoveAfterTransaction = AFTER_TRANSACTION_REMOVE_DIRECTLY; mStartingData.mPrepareRemoveAnimation = prepareAnimation; return; } animate = prepareAnimation && mStartingData.needRevealAnimation() && mStartingWindow.isVisibleByPolicy(); Loading @@ -2782,10 +2787,7 @@ final class ActivityRecord extends WindowToken { + " animate=%b Callers=%s", this, mStartingWindow, animate, Debug.getCallers(5)); surface = mStartingSurface; mStartingData = null; mStartingSurface = null; mStartingWindow = null; mTransitionChangeFlags &= ~FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT; cleanUpStartingInfo(); if (surface == null) { ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "startingWindow was set but " + "startingSurface==null, couldn't remove"); Loading @@ -2800,6 +2802,25 @@ final class ActivityRecord extends WindowToken { surface.remove(animate, hasImeSurface); } StartingWindowRemovalInfo getStartingWindowInfo() { if (mStartingData == null || mStartingWindow == null) { return null; } final boolean animate = mStartingData.mPrepareRemoveAnimation && mStartingData.needRevealAnimation() && mStartingWindow.isVisibleByPolicy(); final boolean hasImeSurface = mStartingData.hasImeSurface(); return mAtmService.mTaskOrganizerController.getStartingWindowRemovalInfo( task, animate, hasImeSurface); } void cleanUpStartingInfo() { mStartingData = null; mStartingSurface = null; mStartingWindow = null; mTransitionChangeFlags &= ~FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT; } /** * Reparents this activity into {@param newTaskFrag} at the provided {@param position}. The * caller should ensure that the {@param newTaskFrag} is not already the parent of this Loading
services/core/java/com/android/server/wm/TaskOrganizerController.java +15 −8 Original line number Diff line number Diff line Loading @@ -654,16 +654,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { return true; } void removeStartingWindow(Task task, ITaskOrganizer taskOrganizer, boolean prepareAnimation, boolean hasImeSurface) { StartingWindowRemovalInfo getStartingWindowRemovalInfo(Task task, boolean prepareAnimation, boolean hasImeSurface) { final Task rootTask = task.getRootTask(); if (rootTask == null) { return; } final ITaskOrganizer lastOrganizer = taskOrganizer != null ? taskOrganizer : getTaskOrganizer(); if (lastOrganizer == null) { return; return null; } final StartingWindowRemovalInfo removalInfo = new StartingWindowRemovalInfo(); removalInfo.taskId = task.mTaskId; Loading Loading @@ -700,6 +695,18 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { mainWindow.mSurfacePosition.y); } } return removalInfo; } void removeStartingWindow(Task task, ITaskOrganizer taskOrganizer, boolean prepareAnimation, boolean hasImeSurface) { final ITaskOrganizer lastOrganizer = taskOrganizer != null ? taskOrganizer : getTaskOrganizer(); if (lastOrganizer == null) { return; } final StartingWindowRemovalInfo removalInfo = getStartingWindowRemovalInfo(task, prepareAnimation, hasImeSurface); try { lastOrganizer.removeStartingWindow(removalInfo); } catch (RemoteException e) { Loading
services/core/java/com/android/server/wm/Transition.java +28 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_S import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_TIMEOUT; import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_IDLE; import static com.android.server.wm.StartingData.AFTER_TRANSACTION_REMOVE_DIRECTLY; import static com.android.server.wm.StartingData.AFTER_TRANSITION_FINISH; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; Loading Loading @@ -109,6 +110,7 @@ import android.view.Display; import android.view.SurfaceControl; import android.view.WindowManager; import android.window.ScreenCapture; import android.window.StartingWindowRemovalInfo; import android.window.TaskFragmentAnimationParams; import android.window.TransitionInfo; import android.window.WindowContainerTransaction; Loading Loading @@ -2103,6 +2105,32 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { mLogger.logOnSendAsync(mController.mLoggerHandler); mController.mTransitionTracer.logSentTransition(this, mTargets); } removeStartingWindowIfAny(); } private void removeStartingWindowIfAny() { if (!Flags.removeStartingInTransition()) { return; } for (int i = mParticipants.size() - 1; i >= 0; --i) { final ActivityRecord ar = mParticipants.valueAt(i).asActivityRecord(); if (ar == null || ar.mStartingData == null || ar.mStartingSurface == null || ar.mStartingData.mRemoveAfterTransaction != AFTER_TRANSACTION_REMOVE_DIRECTLY) { continue; } final StartingWindowRemovalInfo removalInfo = ar.getStartingWindowInfo(); if (removalInfo != null) { try { ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS, "Remove Starting Window after transition: %s", ar); mController.getTransitionPlayer().removeStartingWindow(removalInfo); } catch (RemoteException e) { Slog.e(TAG, "Unable to remove starting window after transition"); } ar.cleanUpStartingInfo(); } } } void ensureParticipantSurfaceVisibility() { Loading