summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/OomAdjuster.java2
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java20
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java20
5 files changed, 48 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index ddccce5963b3..b30334632b55 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1829,7 +1829,7 @@ public class OomAdjuster {
// screen on or animating, promote UI
state.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI);
state.setCurrentSchedulingGroup(SCHED_GROUP_TOP_APP);
- } else {
+ } else if (!app.getWindowProcessController().isShowingUiWhileDozing()) {
// screen off, restrict UI scheduling
state.setCurProcState(PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
state.setCurrentSchedulingGroup(SCHED_GROUP_RESTRICTED);
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 3c56a4e5eb04..3ec58f05ac96 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -414,6 +414,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
boolean mHasCompanionDeviceSetupFeature;
/** The process of the top most activity. */
volatile WindowProcessController mTopApp;
+ /** The process showing UI while the device is dozing. */
+ volatile WindowProcessController mVisibleDozeUiProcess;
/**
* This is the process holding the activity the user last visited that is in a different process
* from the one they are currently in.
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index b34f912e1c78..708ee7f59726 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -99,6 +99,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.os.SystemProperties;
+import android.os.Trace;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.PrintWriterPrinter;
@@ -781,6 +782,12 @@ public class DisplayPolicy {
if (!mDisplayContent.isDefaultDisplay) {
return;
}
+ if (awake) {
+ mService.mAtmService.mVisibleDozeUiProcess = null;
+ } else if (mScreenOnFully && mNotificationShade != null) {
+ // Screen is still on, so it may be showing an always-on UI.
+ mService.mAtmService.mVisibleDozeUiProcess = mNotificationShade.getProcess();
+ }
mService.mAtmService.mKeyguardController.updateDeferTransitionForAod(
mAwake /* waiting */);
}
@@ -826,12 +833,24 @@ public class DisplayPolicy {
}
public void screenTurnedOn(ScreenOnListener screenOnListener) {
+ WindowProcessController visibleDozeUiProcess = null;
synchronized (mLock) {
mScreenOnEarly = true;
mScreenOnFully = false;
mKeyguardDrawComplete = false;
mWindowManagerDrawComplete = false;
mScreenOnListener = screenOnListener;
+ if (!mAwake && mNotificationShade != null) {
+ // The screen is turned on without awake state. It is usually triggered by an
+ // adding notification, so make the UI process have a higher priority.
+ visibleDozeUiProcess = mNotificationShade.getProcess();
+ mService.mAtmService.mVisibleDozeUiProcess = visibleDozeUiProcess;
+ }
+ }
+ // The method calls AM directly, so invoke it outside the lock.
+ if (visibleDozeUiProcess != null) {
+ Trace.instant(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurnedOnWhileDozing");
+ mService.mAtmService.setProcessAnimatingWhileDozing(visibleDozeUiProcess);
}
}
@@ -842,6 +861,7 @@ public class DisplayPolicy {
mKeyguardDrawComplete = false;
mWindowManagerDrawComplete = false;
mScreenOnListener = null;
+ mService.mAtmService.mVisibleDozeUiProcess = null;
}
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index a74a707d5ef9..e9d803888e9a 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -1864,6 +1864,11 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
}
@HotPath(caller = HotPath.OOM_ADJUSTMENT)
+ public boolean isShowingUiWhileDozing() {
+ return this == mAtm.mVisibleDozeUiProcess;
+ }
+
+ @HotPath(caller = HotPath.OOM_ADJUSTMENT)
public boolean isPreviousProcess() {
return this == mAtm.mPreviousProcess;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
index c782d3e90e96..be96e60917a3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java
@@ -274,6 +274,26 @@ public class DisplayPolicyTests extends WindowTestsBase {
assertEquals(mAppWindow, policy.getTopFullscreenOpaqueWindow());
}
+ @SetupWindows(addWindows = W_NOTIFICATION_SHADE)
+ @Test
+ public void testVisibleProcessWhileDozing() {
+ final WindowProcessController wpc = mNotificationShadeWindow.getProcess();
+ final DisplayPolicy policy = mDisplayContent.getDisplayPolicy();
+ policy.addWindowLw(mNotificationShadeWindow, mNotificationShadeWindow.mAttrs);
+
+ policy.screenTurnedOff();
+ policy.setAwake(false);
+ policy.screenTurnedOn(null /* screenOnListener */);
+ assertTrue(wpc.isShowingUiWhileDozing());
+ policy.screenTurnedOff();
+ assertFalse(wpc.isShowingUiWhileDozing());
+
+ policy.screenTurnedOn(null /* screenOnListener */);
+ assertTrue(wpc.isShowingUiWhileDozing());
+ policy.setAwake(true);
+ assertFalse(wpc.isShowingUiWhileDozing());
+ }
+
@Test(expected = IllegalArgumentException.class)
public void testMainAppWindowDisallowFitSystemWindowTypes() {
final DisplayPolicy policy = mDisplayContent.getDisplayPolicy();