From a2b2d7391d5e73bd02bb8bc3504fc785b3f71606 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 11 Aug 2023 12:26:20 +0000 Subject: [PATCH] Update process animating state with different reasons Since shell transition is enabled, it is more often to invoke setRunningRemoteAnimation for SystemUI. So there may a race race that SystemUI has been boosted for entering AOD, but the state is canceled by a finished transition. So now with individual animating reasons, the transition will only remove its corresponding reason. If other reasons still exist, the process can keep the animating state for a higher priority. Bug: 295116622 Test: atest WindowProcessControllerTests#testSetAnimatingReason Change-Id: Id326518a0e2b2b9375015e55b5ce3983a9e801e7 --- .../server/wm/ActivityTaskManagerService.java | 23 +++-- .../server/wm/WindowProcessController.java | 87 +++++++++++++++---- .../wm/WindowProcessControllerTests.java | 12 ++- 3 files changed, 95 insertions(+), 27 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 78da5def43d41..fcf65872e0af1 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3019,9 +3019,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // Set to activity manager directly to make sure the state can be seen by the subsequent // update of scheduling group. proc.setRunningAnimationUnsafe(); - mH.removeMessages(H.UPDATE_PROCESS_ANIMATING_STATE, proc); - mH.sendMessageDelayed(mH.obtainMessage(H.UPDATE_PROCESS_ANIMATING_STATE, proc), + mH.sendMessage(mH.obtainMessage(H.ADD_WAKEFULNESS_ANIMATING_REASON, proc)); + mH.removeMessages(H.REMOVE_WAKEFULNESS_ANIMATING_REASON, proc); + mH.sendMessageDelayed(mH.obtainMessage(H.REMOVE_WAKEFULNESS_ANIMATING_REASON, proc), DOZE_ANIMATING_STATE_RETAIN_TIME_MS); + Trace.instant(TRACE_TAG_WINDOW_MANAGER, "requestWakefulnessAnimating"); } @Override @@ -5646,9 +5648,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final class H extends Handler { static final int REPORT_TIME_TRACKER_MSG = 1; - static final int UPDATE_PROCESS_ANIMATING_STATE = 2; static final int END_POWER_MODE_UNKNOWN_VISIBILITY_MSG = 3; static final int RESUME_FG_APP_SWITCH_MSG = 4; + static final int ADD_WAKEFULNESS_ANIMATING_REASON = 5; + static final int REMOVE_WAKEFULNESS_ANIMATING_REASON = 6; static final int FIRST_ACTIVITY_TASK_MSG = 100; static final int FIRST_SUPERVISOR_TASK_MSG = 200; @@ -5665,13 +5668,23 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { tracker.deliverResult(mContext); } break; - case UPDATE_PROCESS_ANIMATING_STATE: { + case ADD_WAKEFULNESS_ANIMATING_REASON: { final WindowProcessController proc = (WindowProcessController) msg.obj; synchronized (mGlobalLock) { - proc.updateRunningRemoteOrRecentsAnimation(); + proc.addAnimatingReason( + WindowProcessController.ANIMATING_REASON_WAKEFULNESS_CHANGE); } } break; + case REMOVE_WAKEFULNESS_ANIMATING_REASON: { + final WindowProcessController proc = (WindowProcessController) msg.obj; + synchronized (mGlobalLock) { + proc.removeAnimatingReason( + WindowProcessController.ANIMATING_REASON_WAKEFULNESS_CHANGE); + } + Trace.instant(TRACE_TAG_WINDOW_MANAGER, "finishWakefulnessAnimating"); + } + break; case END_POWER_MODE_UNKNOWN_VISIBILITY_MSG: { synchronized (mGlobalLock) { mRetainPowerModeAndTopProcessState = false; diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index d7d2b4e9dde2a..caec45c555ab8 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -48,6 +48,7 @@ import static com.android.server.wm.WindowManagerService.MY_PID; import static java.util.Objects.requireNonNull; import android.Manifest; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -75,7 +76,6 @@ import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; -import android.view.IRemoteAnimationRunner; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -87,6 +87,8 @@ import com.android.server.wm.ActivityTaskManagerService.HotPath; import java.io.IOException; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; @@ -249,11 +251,30 @@ public class WindowProcessController extends ConfigurationContainer mRemoteActivities; - /** Whether our process is currently running a {@link RecentsAnimation} */ - private boolean mRunningRecentsAnimation; + /** + * It can be set for a running transition player ({@link android.window.ITransitionPlayer}) or + * remote animators (running {@link android.window.IRemoteTransition}). + */ + static final int ANIMATING_REASON_REMOTE_ANIMATION = 1; + /** It is set for wakefulness transition. */ + static final int ANIMATING_REASON_WAKEFULNESS_CHANGE = 1 << 1; + /** Whether the legacy {@link RecentsAnimation} is running. */ + static final int ANIMATING_REASON_LEGACY_RECENT_ANIMATION = 1 << 2; - /** Whether our process is currently running a {@link IRemoteAnimationRunner} */ - private boolean mRunningRemoteAnimation; + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + ANIMATING_REASON_REMOTE_ANIMATION, + ANIMATING_REASON_WAKEFULNESS_CHANGE, + ANIMATING_REASON_LEGACY_RECENT_ANIMATION, + }) + @interface AnimatingReason {} + + /** + * Non-zero if this process is currently running an important animation. This should be never + * set for system server. + */ + @AnimatingReason + private int mAnimatingReasons; // The bits used for mActivityStateFlags. private static final int ACTIVITY_STATE_FLAG_IS_VISIBLE = 1 << 16; @@ -1847,30 +1868,45 @@ public class WindowProcessController extends ConfigurationContainer mListener.setRunningRemoteAnimation(animating)); } boolean isRunningRemoteTransition() { - return mRunningRecentsAnimation || mRunningRemoteAnimation; + return (mAnimatingReasons & ANIMATING_REASON_REMOTE_ANIMATION) != 0; } /** Adjusts scheduling group for animation. This method MUST NOT be called inside WM lock. */ @@ -1924,6 +1960,21 @@ public class WindowProcessController extends ConfigurationContainer