diff options
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(); |