diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 57f13829b557e..7d725109f8fef 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -292,6 +292,7 @@ public final class PowerManagerService extends SystemService private final Clock mClock; private final Injector mInjector; + private AppOpsManager mAppOpsManager; private LightsManager mLightsManager; private BatteryManagerInternal mBatteryManagerInternal; private DisplayManagerInternal mDisplayManagerInternal; @@ -987,6 +988,10 @@ public final class PowerManagerService extends SystemService LowPowerStandbyController createLowPowerStandbyController(Context context, Looper looper) { return new LowPowerStandbyController(context, looper, SystemClock::elapsedRealtime); } + + AppOpsManager createAppOpsManager(Context context) { + return context.getSystemService(AppOpsManager.class); + } } final Constants mConstants; @@ -1041,6 +1046,8 @@ public final class PowerManagerService extends SystemService mInattentiveSleepWarningOverlayController = mInjector.createInattentiveSleepWarningController(); + mAppOpsManager = injector.createAppOpsManager(mContext); + mPowerGroupWakefulnessChangeListener = new PowerGroupWakefulnessChangeListener(); // Save brightness values: @@ -1564,8 +1571,7 @@ public final class PowerManagerService extends SystemService } return true; } - if (mContext.getSystemService(AppOpsManager.class).checkOpNoThrow( - AppOpsManager.OP_TURN_SCREEN_ON, opUid, opPackageName) + if (mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_TURN_SCREEN_ON, opUid, opPackageName) == AppOpsManager.MODE_ALLOWED) { if (DEBUG_SPEW) { Slog.d(TAG, "Allowing device wake-up for app with special access " + opPackageName); 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 9f5e79db84c89..9e89042d935bd 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -18,6 +18,8 @@ package com.android.server.power; import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP; import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE; +import static android.app.AppOpsManager.MODE_ALLOWED; +import static android.app.AppOpsManager.MODE_ERRORED; import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; import static android.os.PowerManagerInternal.WAKEFULNESS_DOZING; @@ -46,6 +48,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManagerInternal; +import android.app.AppOpsManager; import android.attention.AttentionManagerInternal; import android.content.Context; import android.content.ContextWrapper; @@ -140,6 +143,7 @@ public class PowerManagerServiceTest { @Mock private WirelessChargerDetector mWirelessChargerDetectorMock; @Mock private AmbientDisplayConfiguration mAmbientDisplayConfigurationMock; @Mock private SystemPropertiesWrapper mSystemPropertiesMock; + @Mock private AppOpsManager mAppOpsManagerMock; @Mock private InattentiveSleepWarningController mInattentiveSleepWarningControllerMock; @@ -297,6 +301,11 @@ public class PowerManagerServiceTest { return new LowPowerStandbyController(context, mTestLooper.getLooper(), SystemClock::elapsedRealtime); } + + @Override + AppOpsManager createAppOpsManager(Context context) { + return mAppOpsManagerMock; + } }); return mService; } @@ -479,7 +488,7 @@ public class PowerManagerServiceTest { } @Test - public void testWakefulnessAwake_AcquireCausesWakeup() { + public void testWakefulnessAwake_AcquireCausesWakeup_turnScreenOnAllowed() { createService(); startSystem(); forceSleep(); @@ -487,6 +496,8 @@ public class PowerManagerServiceTest { IBinder token = new Binder(); String tag = "acq_causes_wakeup"; String packageName = "pkg.name"; + when(mAppOpsManagerMock.checkOpNoThrow(AppOpsManager.OP_TURN_SCREEN_ON, + Binder.getCallingUid(), packageName)).thenReturn(MODE_ALLOWED); // First, ensure that a normal full wake lock does not cause a wakeup int flags = PowerManager.FULL_WAKE_LOCK; @@ -510,6 +521,27 @@ public class PowerManagerServiceTest { mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); } + @Test + public void testWakefulnessAwake_AcquireCausesWakeup_turnScreenOnDenied() { + createService(); + startSystem(); + forceSleep(); + + IBinder token = new Binder(); + String tag = "acq_causes_wakeup"; + String packageName = "pkg.name"; + when(mAppOpsManagerMock.checkOpNoThrow(AppOpsManager.OP_TURN_SCREEN_ON, + Binder.getCallingUid(), packageName)).thenReturn(MODE_ERRORED); + + + // Verify that flag has no effect when OP_TURN_SCREEN_ON is not allowed + int flags = PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP; + mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY, null); + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); + mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); + } + @Test public void testWakefulnessAwake_IPowerManagerWakeUp() { createService();