diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index 187fd590c080e..f171441bb7874 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -94,6 +94,8 @@ interface IPowerManager boolean isAmbientDisplaySuppressedForToken(String token); // returns whether ambient display is suppressed by any app with any token. boolean isAmbientDisplaySuppressed(); + // returns whether ambient display is suppressed by the given app with the given token. + boolean isAmbientDisplaySuppressedForTokenByApp(String token, int appUid); // Forces the system to suspend even if there are held wakelocks. boolean forceSuspend(); diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index be2de0edda2d8..e3a0d18a23cd8 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -2126,6 +2126,27 @@ public final class PowerManager { } } + /** + * Returns true if ambient display is suppressed by the given {@code appUid} with the given + * {@code token}. + * + *

This method will return false if {@link #isAmbientDisplayAvailable()} is false. + * + * @param token The identifier of the ambient display suppression. + * @param appUid The uid of the app that suppressed ambient display. + * @hide + */ + @RequiresPermission(allOf = { + android.Manifest.permission.READ_DREAM_STATE, + android.Manifest.permission.READ_DREAM_SUPPRESSION }) + public boolean isAmbientDisplaySuppressedForTokenByApp(@NonNull String token, int appUid) { + try { + return mService.isAmbientDisplaySuppressedForTokenByApp(token, appUid); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Returns the reason the phone was last shutdown. Calling app must have the * {@link android.Manifest.permission#DEVICE_POWER} permission to request this information. diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index bb134f11319bb..162fa70dd16af 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4295,6 +4295,10 @@ + + + + diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index d244e687c8b8f..d7897dbb6133c 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -77,6 +77,7 @@ import com.android.server.SystemService; import com.android.server.lights.LightsManager; import com.android.server.policy.WindowManagerPolicy; import com.android.server.power.PowerManagerService.BatteryReceiver; +import com.android.server.power.PowerManagerService.BinderService; import com.android.server.power.PowerManagerService.Injector; import com.android.server.power.PowerManagerService.NativeWrapper; import com.android.server.power.PowerManagerService.UserSwitchedReceiver; @@ -173,6 +174,7 @@ public class PowerManagerServiceTest { when(mInattentiveSleepWarningControllerMock.isShown()).thenReturn(false); when(mDisplayManagerInternalMock.requestPowerState(any(), anyBoolean())).thenReturn(true); when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), anyString())).thenReturn(""); + when(mAmbientDisplayConfigurationMock.ambientDisplayAvailable()).thenReturn(true); mDisplayPowerRequest = new DisplayPowerRequest(); addLocalServiceMock(LightsManager.class, mLightsManagerMock); @@ -967,4 +969,72 @@ public class PowerManagerServiceTest { assertThat(mService.getBinderServiceInstance().isAmbientDisplaySuppressedForToken("test2")) .isFalse(); } + + @Test + public void testIsAmbientDisplaySuppressedForTokenByApp_ambientDisplayUnavailable() + throws Exception { + createService(); + when(mAmbientDisplayConfigurationMock.ambientDisplayAvailable()).thenReturn(false); + + BinderService service = mService.getBinderServiceInstance(); + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test", Binder.getCallingUid())) + .isFalse(); + } + + @Test + public void testIsAmbientDisplaySuppressedForTokenByApp_default() + throws Exception { + createService(); + + BinderService service = mService.getBinderServiceInstance(); + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test", Binder.getCallingUid())) + .isFalse(); + } + + @Test + public void testIsAmbientDisplaySuppressedForTokenByApp_suppressedByCallingApp() + throws Exception { + createService(); + BinderService service = mService.getBinderServiceInstance(); + service.suppressAmbientDisplay("test", true); + + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test", Binder.getCallingUid())) + .isTrue(); + // Check that isAmbientDisplaySuppressedForTokenByApp doesn't return true for another app. + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test", /* appUid= */ 123)) + .isFalse(); + } + + @Test + public void testIsAmbientDisplaySuppressedForTokenByApp_notSuppressedByCallingApp() + throws Exception { + createService(); + BinderService service = mService.getBinderServiceInstance(); + service.suppressAmbientDisplay("test", false); + + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test", Binder.getCallingUid())) + .isFalse(); + // Check that isAmbientDisplaySuppressedForTokenByApp doesn't return true for another app. + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test", /* appUid= */ 123)) + .isFalse(); + } + + @Test + public void testIsAmbientDisplaySuppressedForTokenByApp_multipleTokensSuppressedByCallingApp() + throws Exception { + createService(); + BinderService service = mService.getBinderServiceInstance(); + service.suppressAmbientDisplay("test1", true); + service.suppressAmbientDisplay("test2", true); + + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test1", Binder.getCallingUid())) + .isTrue(); + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test2", Binder.getCallingUid())) + .isTrue(); + // Check that isAmbientDisplaySuppressedForTokenByApp doesn't return true for another app. + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test1", /* appUid= */ 123)) + .isFalse(); + assertThat(service.isAmbientDisplaySuppressedForTokenByApp("test2", /* appUid= */ 123)) + .isFalse(); + } }