Loading services/core/java/com/android/server/power/PowerManagerService.java +14 −1 Original line number Diff line number Diff line Loading @@ -1864,11 +1864,23 @@ public final class PowerManagerService extends SystemService if (index < 0) { return; } removeWakeLockDeathLocked(wakeLock, index); } } private void removeWakelockFrozenStateReferences(WakeLock wakelock) { if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { wakelock.mLock.removeFrozenStateChangeCallback(wakelock); } catch (UnsupportedOperationException e) { if (DEBUG_SPEW) { Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + wakelock.mTag + " " + e.getLocalizedMessage()); } } } } @GuardedBy("mLock") private void removeWakeLockNoUpdateLocked(WakeLock wakeLock, int index) { removeWakeLockNoUpdateLocked(wakeLock, index, Loading Loading @@ -1898,6 +1910,7 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private void removeWakeLockDeathLocked(WakeLock wakeLock, int index) { removeWakelockFrozenStateReferences(wakeLock); removeWakeLockNoUpdateLocked(wakeLock, index, RELEASE_REASON_WAKE_LOCK_DEATH); updatePowerStateLocked(); } Loading services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java +25 −11 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading @@ -64,7 +65,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.app.ActivityManagerInternal; import android.attention.AttentionManagerInternal; import android.compat.testing.PlatformCompatChangeRule; Loading Loading @@ -96,6 +96,7 @@ import android.os.Looper; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.PowerSaveState; import android.os.RemoteException; import android.os.UserHandle; import android.os.WorkSource; import android.os.test.TestLooper; Loading Loading @@ -3197,36 +3198,49 @@ public class PowerManagerServiceTest { @Test @RequiresFlagsEnabled({Flags.FLAG_DISABLE_FROZEN_PROCESS_WAKELOCKS}) public void testDisableWakelocks_whenFrozen() { public void testDisableWakelocks_whenFrozen() throws RemoteException { createService(); startSystem(); class RemoteBinder extends Binder { @Override public void addFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback) { IBinder mockBinder = mock(IBinder.class); doNothing().when(mockBinder).addFrozenStateChangeCallback(any()); when(mockBinder.removeFrozenStateChangeCallback(any())).thenReturn(true); } } RemoteBinder token = new RemoteBinder(); WakeLock wakeLock = acquireWakeLock("frozenTestWakeLock", PowerManager.PARTIAL_WAKE_LOCK, token, Display.INVALID_DISPLAY); PowerManager.PARTIAL_WAKE_LOCK, mockBinder, Display.INVALID_DISPLAY); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); advanceTime(1000); // The process gets frozen, which disables the wakelock wakeLock.onFrozenStateChanged(token, 0); wakeLock.onFrozenStateChanged(mockBinder, 0); advanceTime(1000); assertThat(wakeLock.mDisabled).isTrue(); assertThat(wakeLock.isFrozenLocked()).isTrue(); // The process gets unfrozen, which enables the wakelock wakeLock.onFrozenStateChanged(token, 1); wakeLock.onFrozenStateChanged(mockBinder, 1); advanceTime(1000); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); } @Test @RequiresFlagsEnabled({Flags.FLAG_DISABLE_FROZEN_PROCESS_WAKELOCKS}) public void testDisableWakelocks_whenBinderDies() { createService(); startSystem(); IBinder mockBinder = mock(IBinder.class); when(mockBinder.removeFrozenStateChangeCallback(any())).thenReturn(true); WakeLock wakeLock = acquireWakeLock("frozenTestWakeLock", PowerManager.PARTIAL_WAKE_LOCK, mockBinder, Display.INVALID_DISPLAY); wakeLock.binderDied(); verify(mockBinder).removeFrozenStateChangeCallback(wakeLock); } @Test public void testDisableWakelocksInLightDeviceIdle_FlagDisabled_FgApp() { mSetFlagsRule.disableFlags(FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE); Loading Loading
services/core/java/com/android/server/power/PowerManagerService.java +14 −1 Original line number Diff line number Diff line Loading @@ -1864,11 +1864,23 @@ public final class PowerManagerService extends SystemService if (index < 0) { return; } removeWakeLockDeathLocked(wakeLock, index); } } private void removeWakelockFrozenStateReferences(WakeLock wakelock) { if (mFeatureFlags.isDisableFrozenProcessWakelocksEnabled()) { try { wakelock.mLock.removeFrozenStateChangeCallback(wakelock); } catch (UnsupportedOperationException e) { if (DEBUG_SPEW) { Slog.v(TAG, "FrozenStateChangeCallback not supported for this wakelock " + wakelock.mTag + " " + e.getLocalizedMessage()); } } } } @GuardedBy("mLock") private void removeWakeLockNoUpdateLocked(WakeLock wakeLock, int index) { removeWakeLockNoUpdateLocked(wakeLock, index, Loading Loading @@ -1898,6 +1910,7 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private void removeWakeLockDeathLocked(WakeLock wakeLock, int index) { removeWakelockFrozenStateReferences(wakeLock); removeWakeLockNoUpdateLocked(wakeLock, index, RELEASE_REASON_WAKE_LOCK_DEATH); updatePowerStateLocked(); } Loading
services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java +25 −11 Original line number Diff line number Diff line Loading @@ -56,6 +56,7 @@ import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; Loading @@ -64,7 +65,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.app.ActivityManagerInternal; import android.attention.AttentionManagerInternal; import android.compat.testing.PlatformCompatChangeRule; Loading Loading @@ -96,6 +96,7 @@ import android.os.Looper; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.PowerSaveState; import android.os.RemoteException; import android.os.UserHandle; import android.os.WorkSource; import android.os.test.TestLooper; Loading Loading @@ -3197,36 +3198,49 @@ public class PowerManagerServiceTest { @Test @RequiresFlagsEnabled({Flags.FLAG_DISABLE_FROZEN_PROCESS_WAKELOCKS}) public void testDisableWakelocks_whenFrozen() { public void testDisableWakelocks_whenFrozen() throws RemoteException { createService(); startSystem(); class RemoteBinder extends Binder { @Override public void addFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback) { IBinder mockBinder = mock(IBinder.class); doNothing().when(mockBinder).addFrozenStateChangeCallback(any()); when(mockBinder.removeFrozenStateChangeCallback(any())).thenReturn(true); } } RemoteBinder token = new RemoteBinder(); WakeLock wakeLock = acquireWakeLock("frozenTestWakeLock", PowerManager.PARTIAL_WAKE_LOCK, token, Display.INVALID_DISPLAY); PowerManager.PARTIAL_WAKE_LOCK, mockBinder, Display.INVALID_DISPLAY); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); advanceTime(1000); // The process gets frozen, which disables the wakelock wakeLock.onFrozenStateChanged(token, 0); wakeLock.onFrozenStateChanged(mockBinder, 0); advanceTime(1000); assertThat(wakeLock.mDisabled).isTrue(); assertThat(wakeLock.isFrozenLocked()).isTrue(); // The process gets unfrozen, which enables the wakelock wakeLock.onFrozenStateChanged(token, 1); wakeLock.onFrozenStateChanged(mockBinder, 1); advanceTime(1000); assertThat(wakeLock.mDisabled).isFalse(); assertThat(wakeLock.isFrozenLocked()).isFalse(); } @Test @RequiresFlagsEnabled({Flags.FLAG_DISABLE_FROZEN_PROCESS_WAKELOCKS}) public void testDisableWakelocks_whenBinderDies() { createService(); startSystem(); IBinder mockBinder = mock(IBinder.class); when(mockBinder.removeFrozenStateChangeCallback(any())).thenReturn(true); WakeLock wakeLock = acquireWakeLock("frozenTestWakeLock", PowerManager.PARTIAL_WAKE_LOCK, mockBinder, Display.INVALID_DISPLAY); wakeLock.binderDied(); verify(mockBinder).removeFrozenStateChangeCallback(wakeLock); } @Test public void testDisableWakelocksInLightDeviceIdle_FlagDisabled_FgApp() { mSetFlagsRule.disableFlags(FLAG_DISABLE_WAKELOCKS_IN_LIGHT_IDLE); Loading