summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java5
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java38
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java8
3 files changed, 46 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index aef402ac3213..e1f862383e87 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1572,8 +1572,9 @@ public class OomAdjuster {
state.setSystemNoUi(false);
}
if (!state.isSystemNoUi()) {
- if (mService.mWakefulness.get() == PowerManagerInternal.WAKEFULNESS_AWAKE) {
- // screen on, promote UI
+ if (mService.mWakefulness.get() == PowerManagerInternal.WAKEFULNESS_AWAKE
+ || state.isRunningRemoteAnimation()) {
+ // screen on or animating, promote UI
state.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI);
state.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
} else {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 569c11be01e7..5c727342c632 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -302,6 +302,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
// started or finished.
static final long ACTIVITY_BG_START_GRACE_PERIOD_MS = 10 * 1000;
+ /**
+ * The duration to keep a process in animating state (top scheduling group) when the
+ * wakefulness is changing from awake to doze or sleep.
+ */
+ private static final long DOZE_ANIMATING_STATE_RETAIN_TIME_MS = 2000;
+
/** Used to indicate that an app transition should be animated. */
static final boolean ANIMATE = true;
@@ -2757,12 +2763,35 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
});
}
+ // The caller MUST NOT hold the global lock.
public void onScreenAwakeChanged(boolean isAwake) {
mH.post(() -> {
for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
mScreenObservers.get(i).onAwakeStateChanged(isAwake);
}
});
+
+ if (isAwake) {
+ return;
+ }
+ // If the device is going to sleep, keep a higher priority temporarily for potential
+ // animation of system UI. Even if AOD is not enabled, it should be no harm.
+ final WindowProcessController proc;
+ synchronized (mGlobalLockWithoutBoost) {
+ final WindowState notificationShade = mRootWindowContainer.getDefaultDisplay()
+ .getDisplayPolicy().getNotificationShade();
+ proc = notificationShade != null
+ ? mProcessMap.getProcess(notificationShade.mSession.mPid) : null;
+ }
+ if (proc == null) {
+ return;
+ }
+ // 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),
+ DOZE_ANIMATING_STATE_RETAIN_TIME_MS);
}
@Override
@@ -5027,7 +5056,7 @@ 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 FIRST_ACTIVITY_TASK_MSG = 100;
static final int FIRST_SUPERVISOR_TASK_MSG = 200;
@@ -5044,6 +5073,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
tracker.deliverResult(mContext);
}
break;
+ case UPDATE_PROCESS_ANIMATING_STATE: {
+ final WindowProcessController proc = (WindowProcessController) msg.obj;
+ synchronized (mGlobalLock) {
+ proc.updateRunningRemoteOrRecentsAnimation();
+ }
+ }
+ break;
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index 26cfbdf80681..1c57aef8a5af 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -1594,14 +1594,18 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
updateRunningRemoteOrRecentsAnimation();
}
- private void updateRunningRemoteOrRecentsAnimation() {
-
+ void updateRunningRemoteOrRecentsAnimation() {
// Posting on handler so WM lock isn't held when we call into AM.
mAtm.mH.sendMessage(PooledLambda.obtainMessage(
WindowProcessListener::setRunningRemoteAnimation, mListener,
mRunningRecentsAnimation || mRunningRemoteAnimation));
}
+ /** Adjusts scheduling group for animation. This method MUST NOT be called inside WM lock. */
+ void setRunningAnimationUnsafe() {
+ mListener.setRunningRemoteAnimation(true);
+ }
+
@Override
public String toString() {
return mOwner != null ? mOwner.toString() : null;