Merge "Update process animating state with different reasons" into udc-qpr-dev
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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<Configuratio
|
||||
@Nullable
|
||||
private ArrayMap<ActivityRecord, int[]> 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<Configuratio
|
||||
}
|
||||
|
||||
void setRunningRecentsAnimation(boolean running) {
|
||||
if (mRunningRecentsAnimation == running) {
|
||||
return;
|
||||
if (running) {
|
||||
addAnimatingReason(ANIMATING_REASON_LEGACY_RECENT_ANIMATION);
|
||||
} else {
|
||||
removeAnimatingReason(ANIMATING_REASON_LEGACY_RECENT_ANIMATION);
|
||||
}
|
||||
mRunningRecentsAnimation = running;
|
||||
updateRunningRemoteOrRecentsAnimation();
|
||||
}
|
||||
|
||||
void setRunningRemoteAnimation(boolean running) {
|
||||
if (mRunningRemoteAnimation == running) {
|
||||
return;
|
||||
if (running) {
|
||||
addAnimatingReason(ANIMATING_REASON_REMOTE_ANIMATION);
|
||||
} else {
|
||||
removeAnimatingReason(ANIMATING_REASON_REMOTE_ANIMATION);
|
||||
}
|
||||
mRunningRemoteAnimation = running;
|
||||
updateRunningRemoteOrRecentsAnimation();
|
||||
}
|
||||
|
||||
void updateRunningRemoteOrRecentsAnimation() {
|
||||
void addAnimatingReason(@AnimatingReason int reason) {
|
||||
final int prevReasons = mAnimatingReasons;
|
||||
mAnimatingReasons |= reason;
|
||||
if (prevReasons == 0) {
|
||||
setAnimating(true);
|
||||
}
|
||||
}
|
||||
|
||||
void removeAnimatingReason(@AnimatingReason int reason) {
|
||||
final int prevReasons = mAnimatingReasons;
|
||||
mAnimatingReasons &= ~reason;
|
||||
if (prevReasons != 0 && mAnimatingReasons == 0) {
|
||||
setAnimating(false);
|
||||
}
|
||||
}
|
||||
|
||||
/** Applies the animating state to activity manager for updating process priority. */
|
||||
private void setAnimating(boolean animating) {
|
||||
// Posting on handler so WM lock isn't held when we call into AM.
|
||||
mAtm.mH.sendMessage(PooledLambda.obtainMessage(
|
||||
WindowProcessListener::setRunningRemoteAnimation, mListener,
|
||||
isRunningRemoteTransition()));
|
||||
mAtm.mH.post(() -> 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<Configuratio
|
||||
pw.println(prefix + " mLastReportedConfiguration=" + (mHasCachedConfiguration
|
||||
? ("(cached) " + mLastReportedConfiguration) : mLastReportedConfiguration));
|
||||
|
||||
final int animatingReasons = mAnimatingReasons;
|
||||
if (animatingReasons != 0) {
|
||||
pw.print(prefix + " mAnimatingReasons=");
|
||||
if ((animatingReasons & ANIMATING_REASON_REMOTE_ANIMATION) != 0) {
|
||||
pw.print("remote-animation|");
|
||||
}
|
||||
if ((animatingReasons & ANIMATING_REASON_WAKEFULNESS_CHANGE) != 0) {
|
||||
pw.print("wakefulness|");
|
||||
}
|
||||
if ((animatingReasons & ANIMATING_REASON_LEGACY_RECENT_ANIMATION) != 0) {
|
||||
pw.print("legacy-recents");
|
||||
}
|
||||
pw.println();
|
||||
}
|
||||
|
||||
final int stateFlags = mActivityStateFlags;
|
||||
if (stateFlags != ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER) {
|
||||
pw.print(prefix + " mActivityStateFlags=");
|
||||
|
||||
@@ -170,9 +170,13 @@ public class WindowProcessControllerTests extends WindowTestsBase {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetRunningRecentsAnimation() {
|
||||
mWpc.setRunningRecentsAnimation(true);
|
||||
mWpc.setRunningRecentsAnimation(false);
|
||||
public void testSetAnimatingReason() {
|
||||
mWpc.addAnimatingReason(WindowProcessController.ANIMATING_REASON_REMOTE_ANIMATION);
|
||||
assertTrue(mWpc.isRunningRemoteTransition());
|
||||
mWpc.addAnimatingReason(WindowProcessController.ANIMATING_REASON_WAKEFULNESS_CHANGE);
|
||||
mWpc.removeAnimatingReason(WindowProcessController.ANIMATING_REASON_REMOTE_ANIMATION);
|
||||
assertFalse(mWpc.isRunningRemoteTransition());
|
||||
mWpc.removeAnimatingReason(WindowProcessController.ANIMATING_REASON_WAKEFULNESS_CHANGE);
|
||||
waitHandlerIdle(mAtm.mH);
|
||||
|
||||
InOrder orderVerifier = Mockito.inOrder(mMockListener);
|
||||
@@ -201,7 +205,7 @@ public class WindowProcessControllerTests extends WindowTestsBase {
|
||||
waitHandlerIdle(mAtm.mH);
|
||||
|
||||
InOrder orderVerifier = Mockito.inOrder(mMockListener);
|
||||
orderVerifier.verify(mMockListener, times(3)).setRunningRemoteAnimation(eq(true));
|
||||
orderVerifier.verify(mMockListener, times(1)).setRunningRemoteAnimation(eq(true));
|
||||
orderVerifier.verify(mMockListener, times(1)).setRunningRemoteAnimation(eq(false));
|
||||
orderVerifier.verifyNoMoreInteractions();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user