From d2005e4f720b0a9687eb07ddb398686469eea3bb Mon Sep 17 00:00:00 2001 From: CeRRiLLo89 <56557070+CeRRiLLo89@users.noreply.github.com> Date: Fri, 31 Jul 2026 20:49:20 +0200 Subject: [PATCH 1/5] PhoneWindowManager: recheck screen-on reclaim setting Screen-on reclaim is scheduled from a cached setting and executes after a 1250 ms delay. Re-read SCREEN_ON_MEMORY_RECLAIM before running the delayed reclaim so the disabled state is honored even if the cached value is stale or the setting changes after scheduling. Mark the cached flag volatile because it is updated by the settings observer and read from the power notifier path. --- .../server/policy/PhoneWindowManager.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index d0b82773f15e7..4bdbbb9c75ad5 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -859,7 +859,7 @@ public void onDrawn() { private ThreeFingersSwipeListener mThreeFingersSwipe; private boolean mThreeFingersSwipeHasAction; - private boolean mScreenOnReclaim; + private volatile boolean mScreenOnReclaim; private PocketManager mPocketManager; private PocketLock mPocketLock; @@ -3706,8 +3706,7 @@ void updateSettings(Handler handler) { Settings.System.LOCKSCREEN_ENABLE_POWER_MENU, 1, UserHandle.USER_CURRENT) != 0; - mScreenOnReclaim = Settings.System.getIntForUser(resolver, - Settings.System.SCREEN_ON_MEMORY_RECLAIM, 1, UserHandle.USER_CURRENT) == 1; + mScreenOnReclaim = isScreenOnMemoryReclaimEnabled(); kidsModeEnabled = Settings.Secure.getIntForUser(resolver, Settings.Secure.NAV_BAR_KIDS_MODE, 0, UserHandle.USER_CURRENT) == 1; @@ -6549,10 +6548,12 @@ public void finishedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) { private final Runnable mMemoryOpt = new Runnable() { @Override public void run() { - releaseMemoryAtScreenOn(); + if (isScreenOnMemoryReclaimEnabled()) { + releaseMemoryAtScreenOn(); + } } }; - + private final Runnable mSystemServerGcOpt = new Runnable() { @Override public void run() { @@ -8256,6 +8257,13 @@ private void toggleRingerModes() { } } + private boolean isScreenOnMemoryReclaimEnabled() { + return Settings.System.getIntForUser( + mContext.getContentResolver(), + Settings.System.SCREEN_ON_MEMORY_RECLAIM, + 1, UserHandle.USER_CURRENT) == 1; + } + private void releaseMemoryAtScreenOn() { long currentTime = System.currentTimeMillis(); if (lastMemoryReleaseTime == 0L || currentTime - lastMemoryReleaseTime > MEMORY_RELEASE_INTERVAL_MS) { From 4e9ad06d7fc90e224d78af17a33096642483345f Mon Sep 17 00:00:00 2001 From: CeRRiLLo89 <56557070+CeRRiLLo89@users.noreply.github.com> Date: Fri, 31 Jul 2026 20:56:58 +0200 Subject: [PATCH 2/5] PhoneWindowManager: remove trailing whitespace Remove whitespace from the blank line after mMemoryOpt. From fe2c40329ac60cf470e791c253feb4bbe19ef006 Mon Sep 17 00:00:00 2001 From: CeRRiLLo89 <56557070+CeRRiLLo89@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:01:58 +0200 Subject: [PATCH 3/5] PhoneWindowManager: remove trailing whitespace --- .../core/java/com/android/server/policy/PhoneWindowManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 4bdbbb9c75ad5..bbf2720449733 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6553,7 +6553,7 @@ public void run() { } } }; - + private final Runnable mSystemServerGcOpt = new Runnable() { @Override public void run() { From 2abb4bcaa7710e42e2eaf35b7e3117c3e28a9813 Mon Sep 17 00:00:00 2001 From: CeRRiLLo89 <56557070+CeRRiLLo89@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:10:54 +0200 Subject: [PATCH 4/5] Update PhoneWindowManager.java --- .../java/com/android/server/policy/PhoneWindowManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index bbf2720449733..60263391c6727 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6545,7 +6545,8 @@ public void finishedWakingUp(int displayGroupId, @WakeReason int pmWakeReason) { } } - private final Runnable mMemoryOpt = new Runnable() { + @VisibleForTesting + final Runnable mMemoryOpt = new Runnable() { @Override public void run() { if (isScreenOnMemoryReclaimEnabled()) { @@ -8263,7 +8264,7 @@ private boolean isScreenOnMemoryReclaimEnabled() { Settings.System.SCREEN_ON_MEMORY_RECLAIM, 1, UserHandle.USER_CURRENT) == 1; } - + private void releaseMemoryAtScreenOn() { long currentTime = System.currentTimeMillis(); if (lastMemoryReleaseTime == 0L || currentTime - lastMemoryReleaseTime > MEMORY_RELEASE_INTERVAL_MS) { From 45cc36ff6a3fead44fedf6a08bec9d421f99a6d6 Mon Sep 17 00:00:00 2001 From: CeRRiLLo89 <56557070+CeRRiLLo89@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:13:53 +0200 Subject: [PATCH 5/5] PhoneWindowManagerTests: cover screen-on reclaim setting Verify that the delayed screen-on reclaim callback rechecks the current SCREEN_ON_MEMORY_RECLAIM setting before releasing memory. Cover both the disabled and enabled paths while stubbing the ActivityManager call to avoid running a real reclaim during the test. --- .../policy/PhoneWindowManagerTests.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java index 8ff9630fe2ad3..72a2acff6f816 100644 --- a/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/PhoneWindowManagerTests.java @@ -352,6 +352,50 @@ public void testScreenTurnedOn_forAdjacentDisplayGroup() { verify(mKeyguardServiceDelegate).onFinishedWakingUp(); } + @Test + public void screenOnMemoryReclaimDisabledAtExecution_doesNotReleaseMemory() + throws Exception { + initPhoneWindowManager(); + final int originalValue = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_ON_MEMORY_RECLAIM, 1); + try { + doNothing().when(ActivityManager.getService()).releaseMemory( + anyInt(), anyInt(), anyBoolean(), anyBoolean()); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.SCREEN_ON_MEMORY_RECLAIM, 0); + + mPhoneWindowManager.mMemoryOpt.run(); + + verify(ActivityManager.getService(), never()) + .releaseMemory(900, 25, false, false); + } finally { + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.SCREEN_ON_MEMORY_RECLAIM, originalValue); + } + } + + @Test + public void screenOnMemoryReclaimEnabledAtExecution_releasesMemory() + throws Exception { + initPhoneWindowManager(); + final int originalValue = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_ON_MEMORY_RECLAIM, 1); + try { + doNothing().when(ActivityManager.getService()).releaseMemory( + anyInt(), anyInt(), anyBoolean(), anyBoolean()); + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.SCREEN_ON_MEMORY_RECLAIM, 1); + + mPhoneWindowManager.mMemoryOpt.run(); + + verify(ActivityManager.getService()) + .releaseMemory(900, 25, false, false); + } finally { + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.SCREEN_ON_MEMORY_RECLAIM, originalValue); + } + } + @Test public void testCheckAddPermission_withoutAccessibilityOverlay_noAccessibilityAppOpLogged() { mSetFlagsRule.enableFlags(android.view.contentprotection.flags.Flags.FLAG_CREATE_ACCESSIBILITY_OVERLAY_APP_OP_ENABLED);