summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java18
-rw-r--r--services/core/java/com/android/server/power/feature/PowerManagerFlags.java10
-rw-r--r--services/core/java/com/android/server/power/feature/power_flags.aconfig11
-rw-r--r--services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java26
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);