From 1ec55c29a8bae6d1a2aaf3f521c5011d2b23db21 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 24 Jun 2022 23:29:01 +0800 Subject: [PATCH] Respect bar transition delay of remote animation So the light bar animation can fit at proper timing with app launch animation. It also avoids CPU contention such as the bar animation won't overlap with app creation at the initial ~280ms. Bug: 235323163 Bug: 223397410 Test: adb shell setprop persist.wm.debug.shell_transit 1; reboot Set wallpaper to pure white (status bar text color is black). Launch Clock (black background) from launcher. The status bar text color will change to white until the animation is close to the end. Change-Id: Ic090abdccaa583d66a04354d7b21ad8f3f38f9a0 --- .../java/com/android/server/wm/ActivityRecord.java | 2 ++ .../core/java/com/android/server/wm/Transition.java | 5 ++++- .../com/android/server/wm/TransitionController.java | 11 +++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index b3b392c149a15..c0646ed7b6e95 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -4727,6 +4727,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mPendingRemoteAnimation != null) { mDisplayContent.mAppTransition.overridePendingAppTransitionRemote( mPendingRemoteAnimation); + mTransitionController.setStatusBarTransitionDelay( + mPendingRemoteAnimation.getStatusBarTransitionDelay()); } else { if (mPendingOptions == null || mPendingOptions.getAnimationType() == ANIM_SCENE_TRANSITION) { diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 3c0cac0079e84..c58d81e0f5ba4 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -202,6 +202,9 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe private boolean mNavBarAttachedToApp = false; private int mRecentsDisplayId = INVALID_DISPLAY; + /** The delay for light bar appearance animation. */ + long mStatusBarTransitionDelay; + /** @see #setCanPipOnFinish */ private boolean mCanPipOnFinish = true; @@ -870,7 +873,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe } buildFinishTransaction(mFinishTransaction, info.getRootLeash()); if (mController.getTransitionPlayer() != null) { - mController.dispatchLegacyAppTransitionStarting(info); + mController.dispatchLegacyAppTransitionStarting(info, mStatusBarTransitionDelay); try { ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Calling onTransitionReady: %s", info); diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 6d31e937984ef..dbc2c5fb0ce30 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -462,6 +462,12 @@ class TransitionController { }, true /* traverseTopToBottom */); } + /** @see Transition#mStatusBarTransitionDelay */ + void setStatusBarTransitionDelay(long delay) { + if (mCollectingTransition == null) return; + mCollectingTransition.mStatusBarTransitionDelay = delay; + } + /** @see Transition#setOverrideAnimation */ void setOverrideAnimation(TransitionInfo.AnimationOptions options, @Nullable IRemoteCallback startCallback, @Nullable IRemoteCallback finishCallback) { @@ -600,13 +606,14 @@ class TransitionController { } } - void dispatchLegacyAppTransitionStarting(TransitionInfo info) { + void dispatchLegacyAppTransitionStarting(TransitionInfo info, long statusBarTransitionDelay) { final boolean keyguardGoingAway = info.isKeyguardGoingAway(); for (int i = 0; i < mLegacyListeners.size(); ++i) { // TODO(shell-transitions): handle (un)occlude transition. mLegacyListeners.get(i).onAppTransitionStartingLocked(keyguardGoingAway, false /* keyguardOcclude */, 0 /* durationHint */, - SystemClock.uptimeMillis(), AnimationAdapter.STATUS_BAR_TRANSITION_DURATION); + SystemClock.uptimeMillis() + statusBarTransitionDelay, + AnimationAdapter.STATUS_BAR_TRANSITION_DURATION); } }