Loading core/java/android/view/RemoteAnimationTarget.java +23 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static android.view.RemoteAnimationTargetProto.START_BOUNDS; import static android.view.RemoteAnimationTargetProto.START_LEASH; import static android.view.RemoteAnimationTargetProto.TASK_ID; import static android.view.RemoteAnimationTargetProto.WINDOW_CONFIGURATION; import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; import android.annotation.IntDef; import android.app.PictureInPictureParams; Loading Loading @@ -195,12 +196,30 @@ public class RemoteAnimationTarget implements Parcelable { */ public PictureInPictureParams pictureInPictureParams; /** * The {@link android.view.WindowManager.LayoutParams.WindowType} of this window. It's only used * for non-app window. */ public final @WindowManager.LayoutParams.WindowType int windowType; public RemoteAnimationTarget(int taskId, int mode, SurfaceControl leash, boolean isTranslucent, Rect clipRect, Rect contentInsets, int prefixOrderIndex, Point position, Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, SurfaceControl startLeash, Rect startBounds, PictureInPictureParams pictureInPictureParams) { this(taskId, mode, leash, isTranslucent, clipRect, contentInsets, prefixOrderIndex, position, localBounds, screenSpaceBounds, windowConfig, isNotInRecents, startLeash, startBounds, pictureInPictureParams, INVALID_WINDOW_TYPE); } public RemoteAnimationTarget(int taskId, int mode, SurfaceControl leash, boolean isTranslucent, Rect clipRect, Rect contentInsets, int prefixOrderIndex, Point position, Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, SurfaceControl startLeash, Rect startBounds, PictureInPictureParams pictureInPictureParams, @WindowManager.LayoutParams.WindowType int windowType) { this.mode = mode; this.taskId = taskId; this.leash = leash; Loading @@ -217,6 +236,7 @@ public class RemoteAnimationTarget implements Parcelable { this.startLeash = startLeash; this.startBounds = startBounds == null ? null : new Rect(startBounds); this.pictureInPictureParams = pictureInPictureParams; this.windowType = windowType; } public RemoteAnimationTarget(Parcel in) { Loading @@ -236,6 +256,7 @@ public class RemoteAnimationTarget implements Parcelable { startLeash = in.readTypedObject(SurfaceControl.CREATOR); startBounds = in.readTypedObject(Rect.CREATOR); pictureInPictureParams = in.readTypedObject(PictureInPictureParams.CREATOR); windowType = in.readInt(); } @Override Loading @@ -261,6 +282,7 @@ public class RemoteAnimationTarget implements Parcelable { dest.writeTypedObject(startLeash, 0 /* flags */); dest.writeTypedObject(startBounds, 0 /* flags */); dest.writeTypedObject(pictureInPictureParams, 0 /* flags */); dest.writeInt(windowType); } public void dump(PrintWriter pw, String prefix) { Loading @@ -278,6 +300,7 @@ public class RemoteAnimationTarget implements Parcelable { pw.print(prefix); pw.print("windowConfiguration="); pw.println(windowConfiguration); pw.print(prefix); pw.print("leash="); pw.println(leash); pw.print(prefix); pw.print("pictureInPictureParams="); pw.println(pictureInPictureParams); pw.print(prefix); pw.print("windowType="); pw.print(windowType); } public void dumpDebug(ProtoOutputStream proto, long fieldId) { Loading data/etc/services.core.protolog.json +12 −0 Original line number Diff line number Diff line Loading @@ -3439,6 +3439,12 @@ "group": "WM_DEBUG_IME", "at": "com\/android\/server\/wm\/ImeInsetsSourceProvider.java" }, "1931178855": { "message": "\tnonApp=%s", "level": "DEBUG", "group": "WM_DEBUG_REMOTE_ANIMATIONS", "at": "com\/android\/server\/wm\/RemoteAnimationController.java" }, "1947239194": { "message": "Deferring rotation, still finishing previous rotation", "level": "VERBOSE", Loading Loading @@ -3487,6 +3493,12 @@ "group": "WM_DEBUG_CONFIGURATION", "at": "com\/android\/server\/wm\/ActivityRecord.java" }, "1999594750": { "message": "startAnimation", "level": "DEBUG", "group": "WM_DEBUG_REMOTE_ANIMATIONS", "at": "com\/android\/server\/wm\/NonAppWindowAnimationAdapter.java" }, "2018454757": { "message": "WS.removeImmediately: %s Already removed...", "level": "VERBOSE", Loading services/core/java/com/android/server/wm/AppTransition.java +1 −1 Original line number Diff line number Diff line Loading @@ -1305,7 +1305,7 @@ public class AppTransition implements Dump { if (isTransitionSet()) { clear(); mNextAppTransitionType = NEXT_TRANSIT_TYPE_REMOTE; mRemoteAnimationController = new RemoteAnimationController(mService, mRemoteAnimationController = new RemoteAnimationController(mService, mDisplayContent, remoteAnimationAdapter, mHandler); } } Loading services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java +88 −13 Original line number Diff line number Diff line Loading @@ -16,6 +16,12 @@ package com.android.server.wm; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER; import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN; import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_FRONT; import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_REMOTE_ANIMATIONS; import static com.android.server.wm.AnimationAdapterProto.REMOTE; import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET; Loading @@ -26,6 +32,7 @@ import android.os.SystemClock; import android.util.proto.ProtoOutputStream; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.WindowManager; import com.android.internal.protolog.common.ProtoLog; import com.android.server.policy.WindowManagerPolicy; Loading @@ -35,9 +42,11 @@ import java.util.ArrayList; class NonAppWindowAnimationAdapter implements AnimationAdapter { private final WindowState mWindow; private final WindowContainer mWindowContainer; private RemoteAnimationTarget mTarget; private SurfaceControl mCapturedLeash; private SurfaceAnimator.OnAnimationFinishedCallback mCapturedLeashFinishCallback; private @SurfaceAnimator.AnimationType int mLastAnimationType; private long mDurationHint; private long mStatusBarTransitionDelay; Loading @@ -47,21 +56,46 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { return false; } NonAppWindowAnimationAdapter(WindowState w, long durationHint, long statusBarTransitionDelay) { mWindow = w; NonAppWindowAnimationAdapter(WindowContainer w, long durationHint, long statusBarTransitionDelay) { mWindowContainer = w; mDurationHint = durationHint; mStatusBarTransitionDelay = statusBarTransitionDelay; } static RemoteAnimationTarget[] startNonAppWindowAnimations(WindowManagerService service, DisplayContent displayContent, @WindowManager.TransitionOldType int transit, long durationHint, long statusBarTransitionDelay, ArrayList<NonAppWindowAnimationAdapter> adaptersOut) { final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>(); if (transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY || transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER) { startNonAppWindowAnimationsForKeyguardExit( service, durationHint, statusBarTransitionDelay, targets, adaptersOut); } else if (transit == TRANSIT_OLD_TASK_OPEN || transit == TRANSIT_OLD_TASK_TO_FRONT || transit == TRANSIT_OLD_WALLPAPER_CLOSE) { final boolean shouldAttachNavBarToApp = displayContent.getDisplayPolicy().shouldAttachNavBarToAppDuringTransition() && service.getRecentsAnimationController() == null && displayContent.getFixedRotationAnimationController() == null; if (shouldAttachNavBarToApp) { startNavigationBarWindowAnimation( displayContent, durationHint, statusBarTransitionDelay, targets, adaptersOut); } } return targets.toArray(new RemoteAnimationTarget[targets.size()]); } /** * Creates and starts remote animations for all the visible non app windows. * * @return RemoteAnimationTarget[] targets for all the visible non app windows */ public static RemoteAnimationTarget[] startNonAppWindowAnimationsForKeyguardExit( WindowManagerService service, long durationHint, long statusBarTransitionDelay) { final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>(); private static void startNonAppWindowAnimationsForKeyguardExit(WindowManagerService service, long durationHint, long statusBarTransitionDelay, ArrayList<RemoteAnimationTarget> targets, ArrayList<NonAppWindowAnimationAdapter> adaptersOut) { final WindowManagerPolicy policy = service.mPolicy; service.mRoot.forAllWindows(nonAppWindow -> { Loading @@ -69,12 +103,30 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { && nonAppWindow.wouldBeVisibleIfPolicyIgnored() && !nonAppWindow.isVisible()) { final NonAppWindowAnimationAdapter nonAppAdapter = new NonAppWindowAnimationAdapter( nonAppWindow, durationHint, statusBarTransitionDelay); adaptersOut.add(nonAppAdapter); nonAppWindow.startAnimation(nonAppWindow.getPendingTransaction(), nonAppAdapter, false /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION); targets.add(nonAppAdapter.createRemoteAnimationTarget()); } }, true /* traverseTopToBottom */); return targets.toArray(new RemoteAnimationTarget[targets.size()]); } /** * Creates and starts remote animation for the navigation bar windows. * * @return RemoteAnimationTarget[] targets for all the visible non app windows */ private static void startNavigationBarWindowAnimation(DisplayContent displayContent, long durationHint, long statusBarTransitionDelay, ArrayList<RemoteAnimationTarget> targets, ArrayList<NonAppWindowAnimationAdapter> adaptersOut) { final WindowState navWindow = displayContent.getDisplayPolicy().getNavigationBar(); final NonAppWindowAnimationAdapter nonAppAdapter = new NonAppWindowAnimationAdapter( navWindow.mToken, durationHint, statusBarTransitionDelay); adaptersOut.add(nonAppAdapter); navWindow.mToken.startAnimation(navWindow.mToken.getPendingTransaction(), nonAppAdapter, false /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION); targets.add(nonAppAdapter.createRemoteAnimationTarget()); } /** Loading @@ -82,16 +134,39 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { */ RemoteAnimationTarget createRemoteAnimationTarget() { mTarget = new RemoteAnimationTarget(-1, -1, getLeash(), false, new Rect(), null, mWindow.getPrefixOrderIndex(), mWindow.getLastSurfacePosition(), mWindow.getBounds(), null, mWindow.getWindowConfiguration(), true, null, null, null); new Rect(), null, mWindowContainer.getPrefixOrderIndex(), mWindowContainer.getLastSurfacePosition(), mWindowContainer.getBounds(), null, mWindowContainer.getWindowConfiguration(), true, null, null, null, mWindowContainer.getWindowType()); return mTarget; } @Override public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t, int type, SurfaceAnimator.OnAnimationFinishedCallback finishCallback) { ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation"); mCapturedLeash = animationLeash; mCapturedLeashFinishCallback = finishCallback; mLastAnimationType = type; } /** * @return the callback to call to clean up when the animation has finished. */ SurfaceAnimator.OnAnimationFinishedCallback getLeashFinishedCallback() { return mCapturedLeashFinishCallback; } /** * @return the type of animation. */ @SurfaceAnimator.AnimationType int getLastAnimationType() { return mLastAnimationType; } WindowContainer getWindowContainer() { return mWindowContainer; } @Override Loading Loading @@ -120,8 +195,8 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { @Override public void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("token="); pw.println(mWindow.mToken); pw.print("windowContainer="); pw.println(mWindowContainer); if (mTarget != null) { pw.print(prefix); pw.println("Target:"); Loading services/core/java/com/android/server/wm/RemoteAnimationController.java +21 −10 Original line number Diff line number Diff line Loading @@ -16,9 +16,6 @@ package com.android.server.wm; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_REMOTE_ANIMATIONS; import static com.android.server.wm.AnimationAdapterProto.REMOTE; import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET; Loading @@ -41,6 +38,7 @@ import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLogImpl; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.FastPrintWriter; Loading @@ -60,10 +58,13 @@ class RemoteAnimationController implements DeathRecipient { private static final long TIMEOUT_MS = 2000; private final WindowManagerService mService; private final DisplayContent mDisplayContent; private final RemoteAnimationAdapter mRemoteAnimationAdapter; private final ArrayList<RemoteAnimationRecord> mPendingAnimations = new ArrayList<>(); private final ArrayList<WallpaperAnimationAdapter> mPendingWallpaperAnimations = new ArrayList<>(); @VisibleForTesting final ArrayList<NonAppWindowAnimationAdapter> mPendingNonAppAnimations = new ArrayList<>(); private final Rect mTmpRect = new Rect(); private final Handler mHandler; private final Runnable mTimeoutRunnable = () -> cancelAnimation("timeoutRunnable"); Loading @@ -72,9 +73,10 @@ class RemoteAnimationController implements DeathRecipient { private boolean mCanceled; private boolean mLinkedToDeathOfRunner; RemoteAnimationController(WindowManagerService service, RemoteAnimationController(WindowManagerService service, DisplayContent displayContent, RemoteAnimationAdapter remoteAnimationAdapter, Handler handler) { mService = service; mDisplayContent = displayContent; mRemoteAnimationAdapter = remoteAnimationAdapter; mHandler = handler; } Loading Loading @@ -224,12 +226,12 @@ class RemoteAnimationController implements DeathRecipient { private RemoteAnimationTarget[] createNonAppWindowAnimations( @WindowManager.TransitionOldType int transit) { ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createNonAppWindowAnimations()"); return (transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY || transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER) ? NonAppWindowAnimationAdapter.startNonAppWindowAnimationsForKeyguardExit(mService, return NonAppWindowAnimationAdapter.startNonAppWindowAnimations(mService, mDisplayContent, transit, mRemoteAnimationAdapter.getDuration(), mRemoteAnimationAdapter.getStatusBarTransitionDelay()) : new RemoteAnimationTarget[0]; mRemoteAnimationAdapter.getStatusBarTransitionDelay(), mPendingNonAppAnimations); } private void onAnimationFinished() { Loading Loading @@ -267,6 +269,15 @@ class RemoteAnimationController implements DeathRecipient { mPendingWallpaperAnimations.remove(i); ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\twallpaper=%s", adapter.getToken()); } for (int i = mPendingNonAppAnimations.size() - 1; i >= 0; i--) { final NonAppWindowAnimationAdapter adapter = mPendingNonAppAnimations.get(i); adapter.getLeashFinishedCallback().onAnimationFinished( adapter.getLastAnimationType(), adapter); mPendingNonAppAnimations.remove(i); ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tnonApp=%s", adapter.getWindowContainer()); } } catch (Exception e) { Slog.e(TAG, "Failed to finish remote animation", e); throw e; Loading Loading
core/java/android/view/RemoteAnimationTarget.java +23 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static android.view.RemoteAnimationTargetProto.START_BOUNDS; import static android.view.RemoteAnimationTargetProto.START_LEASH; import static android.view.RemoteAnimationTargetProto.TASK_ID; import static android.view.RemoteAnimationTargetProto.WINDOW_CONFIGURATION; import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; import android.annotation.IntDef; import android.app.PictureInPictureParams; Loading Loading @@ -195,12 +196,30 @@ public class RemoteAnimationTarget implements Parcelable { */ public PictureInPictureParams pictureInPictureParams; /** * The {@link android.view.WindowManager.LayoutParams.WindowType} of this window. It's only used * for non-app window. */ public final @WindowManager.LayoutParams.WindowType int windowType; public RemoteAnimationTarget(int taskId, int mode, SurfaceControl leash, boolean isTranslucent, Rect clipRect, Rect contentInsets, int prefixOrderIndex, Point position, Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, SurfaceControl startLeash, Rect startBounds, PictureInPictureParams pictureInPictureParams) { this(taskId, mode, leash, isTranslucent, clipRect, contentInsets, prefixOrderIndex, position, localBounds, screenSpaceBounds, windowConfig, isNotInRecents, startLeash, startBounds, pictureInPictureParams, INVALID_WINDOW_TYPE); } public RemoteAnimationTarget(int taskId, int mode, SurfaceControl leash, boolean isTranslucent, Rect clipRect, Rect contentInsets, int prefixOrderIndex, Point position, Rect localBounds, Rect screenSpaceBounds, WindowConfiguration windowConfig, boolean isNotInRecents, SurfaceControl startLeash, Rect startBounds, PictureInPictureParams pictureInPictureParams, @WindowManager.LayoutParams.WindowType int windowType) { this.mode = mode; this.taskId = taskId; this.leash = leash; Loading @@ -217,6 +236,7 @@ public class RemoteAnimationTarget implements Parcelable { this.startLeash = startLeash; this.startBounds = startBounds == null ? null : new Rect(startBounds); this.pictureInPictureParams = pictureInPictureParams; this.windowType = windowType; } public RemoteAnimationTarget(Parcel in) { Loading @@ -236,6 +256,7 @@ public class RemoteAnimationTarget implements Parcelable { startLeash = in.readTypedObject(SurfaceControl.CREATOR); startBounds = in.readTypedObject(Rect.CREATOR); pictureInPictureParams = in.readTypedObject(PictureInPictureParams.CREATOR); windowType = in.readInt(); } @Override Loading @@ -261,6 +282,7 @@ public class RemoteAnimationTarget implements Parcelable { dest.writeTypedObject(startLeash, 0 /* flags */); dest.writeTypedObject(startBounds, 0 /* flags */); dest.writeTypedObject(pictureInPictureParams, 0 /* flags */); dest.writeInt(windowType); } public void dump(PrintWriter pw, String prefix) { Loading @@ -278,6 +300,7 @@ public class RemoteAnimationTarget implements Parcelable { pw.print(prefix); pw.print("windowConfiguration="); pw.println(windowConfiguration); pw.print(prefix); pw.print("leash="); pw.println(leash); pw.print(prefix); pw.print("pictureInPictureParams="); pw.println(pictureInPictureParams); pw.print(prefix); pw.print("windowType="); pw.print(windowType); } public void dumpDebug(ProtoOutputStream proto, long fieldId) { Loading
data/etc/services.core.protolog.json +12 −0 Original line number Diff line number Diff line Loading @@ -3439,6 +3439,12 @@ "group": "WM_DEBUG_IME", "at": "com\/android\/server\/wm\/ImeInsetsSourceProvider.java" }, "1931178855": { "message": "\tnonApp=%s", "level": "DEBUG", "group": "WM_DEBUG_REMOTE_ANIMATIONS", "at": "com\/android\/server\/wm\/RemoteAnimationController.java" }, "1947239194": { "message": "Deferring rotation, still finishing previous rotation", "level": "VERBOSE", Loading Loading @@ -3487,6 +3493,12 @@ "group": "WM_DEBUG_CONFIGURATION", "at": "com\/android\/server\/wm\/ActivityRecord.java" }, "1999594750": { "message": "startAnimation", "level": "DEBUG", "group": "WM_DEBUG_REMOTE_ANIMATIONS", "at": "com\/android\/server\/wm\/NonAppWindowAnimationAdapter.java" }, "2018454757": { "message": "WS.removeImmediately: %s Already removed...", "level": "VERBOSE", Loading
services/core/java/com/android/server/wm/AppTransition.java +1 −1 Original line number Diff line number Diff line Loading @@ -1305,7 +1305,7 @@ public class AppTransition implements Dump { if (isTransitionSet()) { clear(); mNextAppTransitionType = NEXT_TRANSIT_TYPE_REMOTE; mRemoteAnimationController = new RemoteAnimationController(mService, mRemoteAnimationController = new RemoteAnimationController(mService, mDisplayContent, remoteAnimationAdapter, mHandler); } } Loading
services/core/java/com/android/server/wm/NonAppWindowAnimationAdapter.java +88 −13 Original line number Diff line number Diff line Loading @@ -16,6 +16,12 @@ package com.android.server.wm; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER; import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN; import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_FRONT; import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_REMOTE_ANIMATIONS; import static com.android.server.wm.AnimationAdapterProto.REMOTE; import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET; Loading @@ -26,6 +32,7 @@ import android.os.SystemClock; import android.util.proto.ProtoOutputStream; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.WindowManager; import com.android.internal.protolog.common.ProtoLog; import com.android.server.policy.WindowManagerPolicy; Loading @@ -35,9 +42,11 @@ import java.util.ArrayList; class NonAppWindowAnimationAdapter implements AnimationAdapter { private final WindowState mWindow; private final WindowContainer mWindowContainer; private RemoteAnimationTarget mTarget; private SurfaceControl mCapturedLeash; private SurfaceAnimator.OnAnimationFinishedCallback mCapturedLeashFinishCallback; private @SurfaceAnimator.AnimationType int mLastAnimationType; private long mDurationHint; private long mStatusBarTransitionDelay; Loading @@ -47,21 +56,46 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { return false; } NonAppWindowAnimationAdapter(WindowState w, long durationHint, long statusBarTransitionDelay) { mWindow = w; NonAppWindowAnimationAdapter(WindowContainer w, long durationHint, long statusBarTransitionDelay) { mWindowContainer = w; mDurationHint = durationHint; mStatusBarTransitionDelay = statusBarTransitionDelay; } static RemoteAnimationTarget[] startNonAppWindowAnimations(WindowManagerService service, DisplayContent displayContent, @WindowManager.TransitionOldType int transit, long durationHint, long statusBarTransitionDelay, ArrayList<NonAppWindowAnimationAdapter> adaptersOut) { final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>(); if (transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY || transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER) { startNonAppWindowAnimationsForKeyguardExit( service, durationHint, statusBarTransitionDelay, targets, adaptersOut); } else if (transit == TRANSIT_OLD_TASK_OPEN || transit == TRANSIT_OLD_TASK_TO_FRONT || transit == TRANSIT_OLD_WALLPAPER_CLOSE) { final boolean shouldAttachNavBarToApp = displayContent.getDisplayPolicy().shouldAttachNavBarToAppDuringTransition() && service.getRecentsAnimationController() == null && displayContent.getFixedRotationAnimationController() == null; if (shouldAttachNavBarToApp) { startNavigationBarWindowAnimation( displayContent, durationHint, statusBarTransitionDelay, targets, adaptersOut); } } return targets.toArray(new RemoteAnimationTarget[targets.size()]); } /** * Creates and starts remote animations for all the visible non app windows. * * @return RemoteAnimationTarget[] targets for all the visible non app windows */ public static RemoteAnimationTarget[] startNonAppWindowAnimationsForKeyguardExit( WindowManagerService service, long durationHint, long statusBarTransitionDelay) { final ArrayList<RemoteAnimationTarget> targets = new ArrayList<>(); private static void startNonAppWindowAnimationsForKeyguardExit(WindowManagerService service, long durationHint, long statusBarTransitionDelay, ArrayList<RemoteAnimationTarget> targets, ArrayList<NonAppWindowAnimationAdapter> adaptersOut) { final WindowManagerPolicy policy = service.mPolicy; service.mRoot.forAllWindows(nonAppWindow -> { Loading @@ -69,12 +103,30 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { && nonAppWindow.wouldBeVisibleIfPolicyIgnored() && !nonAppWindow.isVisible()) { final NonAppWindowAnimationAdapter nonAppAdapter = new NonAppWindowAnimationAdapter( nonAppWindow, durationHint, statusBarTransitionDelay); adaptersOut.add(nonAppAdapter); nonAppWindow.startAnimation(nonAppWindow.getPendingTransaction(), nonAppAdapter, false /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION); targets.add(nonAppAdapter.createRemoteAnimationTarget()); } }, true /* traverseTopToBottom */); return targets.toArray(new RemoteAnimationTarget[targets.size()]); } /** * Creates and starts remote animation for the navigation bar windows. * * @return RemoteAnimationTarget[] targets for all the visible non app windows */ private static void startNavigationBarWindowAnimation(DisplayContent displayContent, long durationHint, long statusBarTransitionDelay, ArrayList<RemoteAnimationTarget> targets, ArrayList<NonAppWindowAnimationAdapter> adaptersOut) { final WindowState navWindow = displayContent.getDisplayPolicy().getNavigationBar(); final NonAppWindowAnimationAdapter nonAppAdapter = new NonAppWindowAnimationAdapter( navWindow.mToken, durationHint, statusBarTransitionDelay); adaptersOut.add(nonAppAdapter); navWindow.mToken.startAnimation(navWindow.mToken.getPendingTransaction(), nonAppAdapter, false /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION); targets.add(nonAppAdapter.createRemoteAnimationTarget()); } /** Loading @@ -82,16 +134,39 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { */ RemoteAnimationTarget createRemoteAnimationTarget() { mTarget = new RemoteAnimationTarget(-1, -1, getLeash(), false, new Rect(), null, mWindow.getPrefixOrderIndex(), mWindow.getLastSurfacePosition(), mWindow.getBounds(), null, mWindow.getWindowConfiguration(), true, null, null, null); new Rect(), null, mWindowContainer.getPrefixOrderIndex(), mWindowContainer.getLastSurfacePosition(), mWindowContainer.getBounds(), null, mWindowContainer.getWindowConfiguration(), true, null, null, null, mWindowContainer.getWindowType()); return mTarget; } @Override public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t, int type, SurfaceAnimator.OnAnimationFinishedCallback finishCallback) { ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "startAnimation"); mCapturedLeash = animationLeash; mCapturedLeashFinishCallback = finishCallback; mLastAnimationType = type; } /** * @return the callback to call to clean up when the animation has finished. */ SurfaceAnimator.OnAnimationFinishedCallback getLeashFinishedCallback() { return mCapturedLeashFinishCallback; } /** * @return the type of animation. */ @SurfaceAnimator.AnimationType int getLastAnimationType() { return mLastAnimationType; } WindowContainer getWindowContainer() { return mWindowContainer; } @Override Loading Loading @@ -120,8 +195,8 @@ class NonAppWindowAnimationAdapter implements AnimationAdapter { @Override public void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("token="); pw.println(mWindow.mToken); pw.print("windowContainer="); pw.println(mWindowContainer); if (mTarget != null) { pw.print(prefix); pw.println("Target:"); Loading
services/core/java/com/android/server/wm/RemoteAnimationController.java +21 −10 Original line number Diff line number Diff line Loading @@ -16,9 +16,6 @@ package com.android.server.wm; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_REMOTE_ANIMATIONS; import static com.android.server.wm.AnimationAdapterProto.REMOTE; import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET; Loading @@ -41,6 +38,7 @@ import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLogImpl; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.FastPrintWriter; Loading @@ -60,10 +58,13 @@ class RemoteAnimationController implements DeathRecipient { private static final long TIMEOUT_MS = 2000; private final WindowManagerService mService; private final DisplayContent mDisplayContent; private final RemoteAnimationAdapter mRemoteAnimationAdapter; private final ArrayList<RemoteAnimationRecord> mPendingAnimations = new ArrayList<>(); private final ArrayList<WallpaperAnimationAdapter> mPendingWallpaperAnimations = new ArrayList<>(); @VisibleForTesting final ArrayList<NonAppWindowAnimationAdapter> mPendingNonAppAnimations = new ArrayList<>(); private final Rect mTmpRect = new Rect(); private final Handler mHandler; private final Runnable mTimeoutRunnable = () -> cancelAnimation("timeoutRunnable"); Loading @@ -72,9 +73,10 @@ class RemoteAnimationController implements DeathRecipient { private boolean mCanceled; private boolean mLinkedToDeathOfRunner; RemoteAnimationController(WindowManagerService service, RemoteAnimationController(WindowManagerService service, DisplayContent displayContent, RemoteAnimationAdapter remoteAnimationAdapter, Handler handler) { mService = service; mDisplayContent = displayContent; mRemoteAnimationAdapter = remoteAnimationAdapter; mHandler = handler; } Loading Loading @@ -224,12 +226,12 @@ class RemoteAnimationController implements DeathRecipient { private RemoteAnimationTarget[] createNonAppWindowAnimations( @WindowManager.TransitionOldType int transit) { ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "createNonAppWindowAnimations()"); return (transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY || transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER) ? NonAppWindowAnimationAdapter.startNonAppWindowAnimationsForKeyguardExit(mService, return NonAppWindowAnimationAdapter.startNonAppWindowAnimations(mService, mDisplayContent, transit, mRemoteAnimationAdapter.getDuration(), mRemoteAnimationAdapter.getStatusBarTransitionDelay()) : new RemoteAnimationTarget[0]; mRemoteAnimationAdapter.getStatusBarTransitionDelay(), mPendingNonAppAnimations); } private void onAnimationFinished() { Loading Loading @@ -267,6 +269,15 @@ class RemoteAnimationController implements DeathRecipient { mPendingWallpaperAnimations.remove(i); ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\twallpaper=%s", adapter.getToken()); } for (int i = mPendingNonAppAnimations.size() - 1; i >= 0; i--) { final NonAppWindowAnimationAdapter adapter = mPendingNonAppAnimations.get(i); adapter.getLeashFinishedCallback().onAnimationFinished( adapter.getLastAnimationType(), adapter); mPendingNonAppAnimations.remove(i); ProtoLog.d(WM_DEBUG_REMOTE_ANIMATIONS, "\tnonApp=%s", adapter.getWindowContainer()); } } catch (Exception e) { Slog.e(TAG, "Failed to finish remote animation", e); throw e; Loading