diff options
4 files changed, 63 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 23383a9c55c0..f9e4022f04a0 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -1395,7 +1395,9 @@ public final class PowerManagerService extends SystemService DisplayGroupPowerChangeListener displayGroupPowerChangeListener = new DisplayGroupPowerChangeListener(); mDisplayManagerInternal.registerDisplayGroupListener(displayGroupPowerChangeListener); - mDisplayManager.registerDisplayListener(new DisplayListener(), mHandler); + if (mFeatureFlags.isScreenTimeoutPolicyListenerApiEnabled()) { + mDisplayManager.registerDisplayListener(new DisplayListener(), mHandler); + } if(mDreamManager != null){ // This DreamManager method does not acquire a lock, so it should be safe to call. @@ -3852,6 +3854,10 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private void notifyScreenTimeoutPolicyChangesLocked() { + if (!mFeatureFlags.isScreenTimeoutPolicyListenerApiEnabled()) { + return; + } + for (int idx = 0; idx < mPowerGroups.size(); idx++) { final int powerGroupId = mPowerGroups.keyAt(idx); final PowerGroup powerGroup = mPowerGroups.valueAt(idx); @@ -6011,6 +6017,11 @@ public final class PowerManagerService extends SystemService @Override // Binder call public void addScreenTimeoutPolicyListener(int displayId, IScreenTimeoutPolicyListener listener) { + if (!mFeatureFlags.isScreenTimeoutPolicyListenerApiEnabled()) { + throw new IllegalStateException("Screen timeout policy listener API flag " + + "is not enabled"); + } + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); @@ -6042,6 +6053,11 @@ public final class PowerManagerService extends SystemService @Override // Binder call public void removeScreenTimeoutPolicyListener(int displayId, IScreenTimeoutPolicyListener listener) { + if (!mFeatureFlags.isScreenTimeoutPolicyListenerApiEnabled()) { + throw new IllegalStateException("Screen timeout policy listener API flag " + + "is not enabled"); + } + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); diff --git a/services/core/java/com/android/server/power/feature/PowerManagerFlags.java b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java index 5cd7dee35e5f..42b44013bea2 100644 --- a/services/core/java/com/android/server/power/feature/PowerManagerFlags.java +++ b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java @@ -37,6 +37,11 @@ public class PowerManagerFlags { Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR, Flags::enableEarlyScreenTimeoutDetector); + private final FlagState mEnableScreenTimeoutPolicyListenerApi = new FlagState( + Flags.FLAG_ENABLE_SCREEN_TIMEOUT_POLICY_LISTENER_API, + Flags::enableScreenTimeoutPolicyListenerApi + ); + private final FlagState mImproveWakelockLatency = new FlagState( Flags.FLAG_IMPROVE_WAKELOCK_LATENCY, Flags::improveWakelockLatency @@ -63,6 +68,11 @@ public class PowerManagerFlags { return mEarlyScreenTimeoutDetectorFlagState.isEnabled(); } + /** Returns whether screen timeout policy listener APIs are enabled on not. */ + public boolean isScreenTimeoutPolicyListenerApiEnabled() { + return mEnableScreenTimeoutPolicyListenerApi.isEnabled(); + } + /** * @return Whether to improve the wakelock acquire/release latency or not */ diff --git a/services/core/java/com/android/server/power/feature/power_flags.aconfig b/services/core/java/com/android/server/power/feature/power_flags.aconfig index a975da32f2fd..613daf820e34 100644 --- a/services/core/java/com/android/server/power/feature/power_flags.aconfig +++ b/services/core/java/com/android/server/power/feature/power_flags.aconfig @@ -12,6 +12,17 @@ flag { } flag { + name: "enable_screen_timeout_policy_listener_api" + namespace: "power" + description: "Enables APIs that allow to listen to screen timeout policy changes" + bug: "363174979" + is_fixed_read_only: true + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "improve_wakelock_latency" namespace: "power" description: "Feature flag for tracking the optimizations to improve the latency of acquiring and releasing a wakelock." diff --git a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java index 3cb27451bd57..d9256247b835 100644 --- a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java @@ -89,6 +89,7 @@ import android.os.PowerManagerInternal; import android.os.PowerSaveState; import android.os.UserHandle; import android.os.test.TestLooper; +import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.DeviceConfig; @@ -119,6 +120,7 @@ import com.android.server.power.PowerManagerService.WakeLock; import com.android.server.power.batterysaver.BatterySaverController; import com.android.server.power.batterysaver.BatterySaverPolicy; import com.android.server.power.batterysaver.BatterySaverStateMachine; +import com.android.server.power.feature.flags.Flags; import com.android.server.power.feature.PowerManagerFlags; import com.android.server.testutils.OffsettableClock; @@ -3456,6 +3458,25 @@ public class PowerManagerServiceTest { } @Test + @DisableFlags(Flags.FLAG_ENABLE_SCREEN_TIMEOUT_POLICY_LISTENER_API) + public void testAcquireWakelock_screenTimeoutListenersDisabled_noCrashes() { + IntArray displayGroupIds = IntArray.wrap(new int[]{Display.DEFAULT_DISPLAY_GROUP}); + when(mDisplayManagerInternalMock.getDisplayGroupIds()).thenReturn(displayGroupIds); + + final DisplayInfo displayInfo = new DisplayInfo(); + displayInfo.displayGroupId = Display.DEFAULT_DISPLAY_GROUP; + when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)) + .thenReturn(displayInfo); + + createService(); + startSystem(); + + acquireWakeLock("screenBright", PowerManager.SCREEN_BRIGHT_WAKE_LOCK, + Display.DEFAULT_DISPLAY); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_SCREEN_TIMEOUT_POLICY_LISTENER_API) public void testAddWakeLockKeepingScreenOn_addsToNotifierAndReportsTimeoutPolicyChange() { IntArray displayGroupIds = IntArray.wrap(new int[]{Display.DEFAULT_DISPLAY_GROUP}); when(mDisplayManagerInternalMock.getDisplayGroupIds()).thenReturn(displayGroupIds); @@ -3483,6 +3504,7 @@ public class PowerManagerServiceTest { } @Test + @EnableFlags(Flags.FLAG_ENABLE_SCREEN_TIMEOUT_POLICY_LISTENER_API) public void test_addAndRemoveScreenTimeoutListener_propagatesToNotifier() throws Exception { IntArray displayGroupIds = IntArray.wrap(new int[]{Display.DEFAULT_DISPLAY_GROUP}); @@ -3509,6 +3531,7 @@ public class PowerManagerServiceTest { } @Test + @EnableFlags(Flags.FLAG_ENABLE_SCREEN_TIMEOUT_POLICY_LISTENER_API) public void test_displayIsRemoved_clearsScreenTimeoutListeners() throws Exception { IntArray displayGroupIds = IntArray.wrap(new int[]{Display.DEFAULT_DISPLAY_GROUP}); @@ -3531,7 +3554,8 @@ public class PowerManagerServiceTest { } @Test - public void testScreenWakeLockListener_screenHasWakelocks_addsWithHeldTimeoutPolicyToNotifier() + @EnableFlags(Flags.FLAG_ENABLE_SCREEN_TIMEOUT_POLICY_LISTENER_API) + public void testScreenTimeoutListener_screenHasWakelocks_addsWithHeldTimeoutPolicyToNotifier() throws Exception { IntArray displayGroupIds = IntArray.wrap(new int[]{Display.DEFAULT_DISPLAY_GROUP}); when(mDisplayManagerInternalMock.getDisplayGroupIds()).thenReturn(displayGroupIds); |