diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index ae7d94cbad797..425e797a9e0e9 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -27,9 +27,9 @@ import android.os.WorkSource; interface IPowerManager { void acquireWakeLock(IBinder lock, int flags, String tag, String packageName, in WorkSource ws, - String historyTag); + String historyTag, int displayId); void acquireWakeLockWithUid(IBinder lock, int flags, String tag, String packageName, - int uidtoblame); + int uidtoblame, int displayId); @UnsupportedAppUsage void releaseWakeLock(IBinder lock, int flags); void updateWakeLockUids(IBinder lock, in int[] uids); diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 2c4d130788cc5..9d1fd50a41125 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -36,6 +36,7 @@ import android.sysprop.InitProperties; import android.util.ArrayMap; import android.util.Log; import android.util.proto.ProtoOutputStream; +import android.view.Display; import com.android.internal.util.Preconditions; @@ -1143,8 +1144,7 @@ public final class PowerManager { * wake lock, and {@link WakeLock#release release()} when you are done. *

* {@samplecode - * PowerManager pm = (PowerManager)mContext.getSystemService( - * Context.POWER_SERVICE); + * PowerManager pm = mContext.getSystemService(PowerManager.class); * PowerManager.WakeLock wl = pm.newWakeLock( * PowerManager.SCREEN_DIM_WAKE_LOCK * | PowerManager.ON_AFTER_RELEASE, @@ -1162,6 +1162,8 @@ public final class PowerManager { * {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead. * This window flag will be correctly managed by the platform * as the user moves between applications and doesn't require a special permission. + * Additionally using the flag will keep only the appropriate screen on in a + * multi-display scenario while using a wake lock will keep every screen powered on. *

* *

@@ -1179,7 +1181,7 @@ public final class PowerManager { * can be transformed by java optimizer and obfuscator tools. *

  • avoid wrapping the tag or a prefix to avoid collision with wake lock * tags from the platform (e.g. *alarm*). - *
  • never include personnally identifiable information for privacy + *
  • never include personally identifiable information for privacy * reasons. * *

    @@ -1200,7 +1202,27 @@ public final class PowerManager { */ public WakeLock newWakeLock(int levelAndFlags, String tag) { validateWakeLockParameters(levelAndFlags, tag); - return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName()); + return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName(), + Display.INVALID_DISPLAY); + } + + /** + * Creates a new wake lock with the specified level and flags. + *

    + * The wakelock will only apply to the {@link com.android.server.display.DisplayGroup} of the + * provided {@code displayId}. If {@code displayId} is {@link Display#INVALID_DISPLAY} then it + * will apply to all {@link com.android.server.display.DisplayGroup DisplayGroups}. + * + * @param levelAndFlags Combination of wake lock level and flag values defining + * the requested behavior of the WakeLock. + * @param tag Your class name (or other tag) for debugging purposes. + * @param displayId The display id to which this wake lock is tied. + * + * @hide + */ + public WakeLock newWakeLock(int levelAndFlags, String tag, int displayId) { + validateWakeLockParameters(levelAndFlags, tag); + return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName(), displayId); } /** @hide */ @@ -2603,19 +2625,17 @@ public final class PowerManager { private WorkSource mWorkSource; private String mHistoryTag; private final String mTraceName; + private final int mDisplayId; - private final Runnable mReleaser = new Runnable() { - public void run() { - release(RELEASE_FLAG_TIMEOUT); - } - }; + private final Runnable mReleaser = () -> release(RELEASE_FLAG_TIMEOUT); - WakeLock(int flags, String tag, String packageName) { + WakeLock(int flags, String tag, String packageName, int displayId) { mFlags = flags; mTag = tag; mPackageName = packageName; mToken = new Binder(); mTraceName = "WakeLock (" + mTag + ")"; + mDisplayId = displayId; } @Override @@ -2696,7 +2716,7 @@ public final class PowerManager { Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, mTraceName, 0); try { mService.acquireWakeLock(mToken, mFlags, mTag, mPackageName, mWorkSource, - mHistoryTag); + mHistoryTag, mDisplayId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/power/DisplayGroupPowerStateMapper.java b/services/core/java/com/android/server/power/DisplayGroupPowerStateMapper.java index 9732eba33c220..ea933246e3b2f 100644 --- a/services/core/java/com/android/server/power/DisplayGroupPowerStateMapper.java +++ b/services/core/java/com/android/server/power/DisplayGroupPowerStateMapper.java @@ -125,6 +125,10 @@ public class DisplayGroupPowerStateMapper { return mDisplayGroupIds; } + int getDisplayGroupCountLocked() { + return mDisplayGroupIds.length; + } + int getWakefulnessLocked(int groupId) { return mDisplayGroupInfos.get(groupId).wakefulness; } @@ -272,6 +276,14 @@ public class DisplayGroupPowerStateMapper { mDisplayGroupInfos.get(groupId).userActivitySummary = summary; } + int getWakeLockSummaryLocked(int groupId) { + return mDisplayGroupInfos.get(groupId).wakeLockSummary; + } + + void setWakeLockSummaryLocked(int groupId, int summary) { + mDisplayGroupInfos.get(groupId).wakeLockSummary = summary; + } + /** * Interface through which an interested party may be informed of {@link DisplayGroup} events. */ @@ -292,6 +304,7 @@ public class DisplayGroupPowerStateMapper { public long lastUserActivityTime; public long lastUserActivityTimeNoChangeLights; public int userActivitySummary; + public int wakeLockSummary; /** {@code true} if this DisplayGroup supports dreaming; otherwise {@code false}. */ public boolean supportsSandman; diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 54d5b7a8b67eb..8052522602090 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -1348,9 +1348,20 @@ public final class PowerManagerService extends SystemService updatePowerStateLocked(); } - private void acquireWakeLockInternal(IBinder lock, int flags, String tag, String packageName, - WorkSource ws, String historyTag, int uid, int pid) { + private void acquireWakeLockInternal(IBinder lock, int displayId, int flags, String tag, + String packageName, WorkSource ws, String historyTag, int uid, int pid) { synchronized (mLock) { + if (displayId != Display.INVALID_DISPLAY) { + final DisplayInfo displayInfo = + mSystemReady ? mDisplayManagerInternal.getDisplayInfo(displayId) : null; + if (displayInfo == null) { + Slog.wtf(TAG, "Tried to acquire wake lock for invalid display: " + displayId); + return; + } else if (!displayInfo.hasAccess(uid)) { + throw new SecurityException("Caller does not have access to display"); + } + } + if (DEBUG_SPEW) { Slog.d(TAG, "acquireWakeLockInternal: lock=" + Objects.hashCode(lock) + ", flags=0x" + Integer.toHexString(flags) @@ -1377,8 +1388,8 @@ public final class PowerManagerService extends SystemService mUidState.put(uid, state); } state.mNumWakeLocks++; - wakeLock = new WakeLock(lock, flags, tag, packageName, ws, historyTag, uid, pid, - state); + wakeLock = new WakeLock(lock, displayId, flags, tag, packageName, ws, historyTag, + uid, pid, state); try { lock.linkToDeath(wakeLock, 0); } catch (RemoteException ex) { @@ -2047,6 +2058,11 @@ public final class PowerManagerService extends SystemService return mWakefulnessRaw; } + @VisibleForTesting + int getWakefulnessLocked(int groupId) { + return mDisplayGroupPowerStateMapper.getWakefulnessLocked(groupId); + } + /** * Logs the time the device would have spent awake before user activity timeout, * had the system not been told the user was inactive. @@ -2293,7 +2309,9 @@ public final class PowerManagerService extends SystemService */ @SuppressWarnings("deprecation") private void updateWakeLockSummaryLocked(int dirty) { - if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS)) != 0) { + if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_WAKEFULNESS | DIRTY_DISPLAY_GROUP_WAKEFULNESS)) + != 0) { + mWakeLockSummary = 0; final int numProfiles = mProfilePowerState.size(); @@ -2301,11 +2319,28 @@ public final class PowerManagerService extends SystemService mProfilePowerState.valueAt(i).mWakeLockSummary = 0; } + for (int groupId : mDisplayGroupPowerStateMapper.getDisplayGroupIdsLocked()) { + mDisplayGroupPowerStateMapper.setWakeLockSummaryLocked(groupId, 0); + } + + int invalidGroupWakeLockSummary = 0; final int numWakeLocks = mWakeLocks.size(); for (int i = 0; i < numWakeLocks; i++) { final WakeLock wakeLock = mWakeLocks.get(i); final int wakeLockFlags = getWakeLockSummaryFlags(wakeLock); mWakeLockSummary |= wakeLockFlags; + + final int groupId = wakeLock.getDisplayGroupId(); + if (groupId != Display.INVALID_DISPLAY_GROUP) { + int wakeLockSummary = mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked( + groupId); + wakeLockSummary |= wakeLockFlags; + mDisplayGroupPowerStateMapper.setWakeLockSummaryLocked(groupId, + wakeLockSummary); + } else { + invalidGroupWakeLockSummary |= wakeLockFlags; + } + for (int j = 0; j < numProfiles; j++) { final ProfilePowerState profile = mProfilePowerState.valueAt(j); if (wakeLockAffectsUser(wakeLock, profile.mUserId)) { @@ -2314,10 +2349,21 @@ public final class PowerManagerService extends SystemService } } - mWakeLockSummary = adjustWakeLockSummaryLocked(mWakeLockSummary); + for (int groupId : mDisplayGroupPowerStateMapper.getDisplayGroupIdsLocked()) { + final int wakeLockSummary = adjustWakeLockSummaryLocked( + mDisplayGroupPowerStateMapper.getWakefulnessLocked(groupId), + invalidGroupWakeLockSummary + | mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId)); + mDisplayGroupPowerStateMapper.setWakeLockSummaryLocked(groupId, wakeLockSummary); + } + + mWakeLockSummary = adjustWakeLockSummaryLocked(getWakefulnessLocked(), + mWakeLockSummary); + for (int i = 0; i < numProfiles; i++) { final ProfilePowerState profile = mProfilePowerState.valueAt(i); - profile.mWakeLockSummary = adjustWakeLockSummaryLocked(profile.mWakeLockSummary); + profile.mWakeLockSummary = adjustWakeLockSummaryLocked(getWakefulnessLocked(), + profile.mWakeLockSummary); } if (DEBUG_SPEW) { @@ -2328,25 +2374,25 @@ public final class PowerManagerService extends SystemService } } - private int adjustWakeLockSummaryLocked(int wakeLockSummary) { + private static int adjustWakeLockSummaryLocked(int wakefulness, int wakeLockSummary) { // Cancel wake locks that make no sense based on the current state. - if (getWakefulnessLocked() != WAKEFULNESS_DOZING) { + if (wakefulness != WAKEFULNESS_DOZING) { wakeLockSummary &= ~(WAKE_LOCK_DOZE | WAKE_LOCK_DRAW); } - if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP + if (wakefulness == WAKEFULNESS_ASLEEP || (wakeLockSummary & WAKE_LOCK_DOZE) != 0) { wakeLockSummary &= ~(WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM | WAKE_LOCK_BUTTON_BRIGHT); - if (getWakefulnessLocked() == WAKEFULNESS_ASLEEP) { + if (wakefulness == WAKEFULNESS_ASLEEP) { wakeLockSummary &= ~WAKE_LOCK_PROXIMITY_SCREEN_OFF; } } // Infer implied wake locks where necessary based on the current state. if ((wakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM)) != 0) { - if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) { + if (wakefulness == WAKEFULNESS_AWAKE) { wakeLockSummary |= WAKE_LOCK_CPU | WAKE_LOCK_STAY_AWAKE; - } else if (getWakefulnessLocked() == WAKEFULNESS_DREAMING) { + } else if (wakefulness == WAKEFULNESS_DREAMING) { wakeLockSummary |= WAKE_LOCK_CPU; } } @@ -2531,7 +2577,8 @@ public final class PowerManagerService extends SystemService } if ((groupUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0 - && (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) == 0) { + && (mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId) + & WAKE_LOCK_STAY_AWAKE) == 0) { groupNextTimeout = mAttentionDetector.updateUserActivity(groupNextTimeout, screenDimDuration); } @@ -2831,7 +2878,8 @@ public final class PowerManagerService extends SystemService private boolean isBeingKeptAwakeLocked(int groupId) { return mStayOn || mProximityPositive - || (mWakeLockSummary & WAKE_LOCK_STAY_AWAKE) != 0 + || (mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId) + & WAKE_LOCK_STAY_AWAKE) != 0 || (mDisplayGroupPowerStateMapper.getUserActivitySummaryLocked(groupId) & ( USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM)) != 0 || mScreenBrightnessBoostInProgress; @@ -3101,8 +3149,8 @@ public final class PowerManagerService extends SystemService if (displayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) { displayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager; - if ((mWakeLockSummary & WAKE_LOCK_DRAW) != 0 - && !mDrawWakeLockOverrideFromSidekick) { + if ((mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId) + & WAKE_LOCK_DRAW) != 0 && !mDrawWakeLockOverrideFromSidekick) { if (displayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) { displayPowerRequest.dozeScreenState = Display.STATE_DOZE; } @@ -3128,7 +3176,8 @@ public final class PowerManagerService extends SystemService + ", mWakefulness=" + PowerManagerInternal.wakefulnessToString( mDisplayGroupPowerStateMapper.getWakefulnessLocked(groupId)) - + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary) + + ", mWakeLockSummary=0x" + Integer.toHexString( + mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId)) + ", mUserActivitySummary=0x" + Integer.toHexString( mDisplayGroupPowerStateMapper.getUserActivitySummaryLocked(groupId)) + ", mBootCompleted=" + mBootCompleted @@ -3193,10 +3242,11 @@ public final class PowerManagerService extends SystemService @VisibleForTesting int getDesiredScreenPolicyLocked(int groupId) { final int wakefulness = mDisplayGroupPowerStateMapper.getWakefulnessLocked(groupId); + final int wakeLockSummary = mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId); if (wakefulness == WAKEFULNESS_ASLEEP || sQuiescent) { return DisplayPowerRequest.POLICY_OFF; } else if (wakefulness == WAKEFULNESS_DOZING) { - if ((mWakeLockSummary & WAKE_LOCK_DOZE) != 0) { + if ((wakeLockSummary & WAKE_LOCK_DOZE) != 0) { return DisplayPowerRequest.POLICY_DOZE; } if (mDozeAfterScreenOff) { @@ -3213,7 +3263,7 @@ public final class PowerManagerService extends SystemService return DisplayPowerRequest.POLICY_VR; } - if ((mWakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0 + if ((wakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0 || !mBootCompleted || (mDisplayGroupPowerStateMapper.getUserActivitySummaryLocked(groupId) & USER_ACTIVITY_SCREEN_BRIGHT) != 0 @@ -3292,7 +3342,9 @@ public final class PowerManagerService extends SystemService }; private boolean shouldUseProximitySensorLocked() { - return !mIsVrModeEnabled && (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0; + // Use default display group for proximity sensor. + return !mIsVrModeEnabled && (mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked( + Display.DEFAULT_DISPLAY_GROUP) & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0; } /** @@ -4248,6 +4300,8 @@ public final class PowerManagerService extends SystemService pw.println(" lastUserActivityTimeNoChangeLights=" + TimeUtils.formatUptime( mDisplayGroupPowerStateMapper.getLastUserActivityTimeNoChangeLightsLocked( id))); + pw.println(" mWakeLockSummary=0x" + Integer.toHexString( + mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(id))); } wcd = mWirelessChargerDetector; @@ -4738,6 +4792,7 @@ public final class PowerManagerService extends SystemService */ /* package */ final class WakeLock implements IBinder.DeathRecipient { public final IBinder mLock; + public final int mDisplayId; public int mFlags; public String mTag; public final String mPackageName; @@ -4751,10 +4806,11 @@ public final class PowerManagerService extends SystemService public boolean mNotifiedLong; public boolean mDisabled; - public WakeLock(IBinder lock, int flags, String tag, String packageName, + public WakeLock(IBinder lock, int displayId, int flags, String tag, String packageName, WorkSource workSource, String historyTag, int ownerUid, int ownerPid, UidState uidState) { mLock = lock; + mDisplayId = displayId; mFlags = flags; mTag = tag; mPackageName = packageName; @@ -4807,6 +4863,15 @@ public final class PowerManagerService extends SystemService mWorkSource = copyWorkSource(workSource); } + public int getDisplayGroupId() { + if (!mSystemReady || mDisplayId == Display.INVALID_DISPLAY) { + return Display.INVALID_DISPLAY_GROUP; + } + + final DisplayInfo displayInfo = mDisplayManagerInternal.getDisplayInfo(mDisplayId); + return displayInfo == null ? Display.INVALID_DISPLAY_GROUP : displayInfo.displayGroupId; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -4996,11 +5061,11 @@ public final class PowerManagerService extends SystemService @Override // Binder call public void acquireWakeLockWithUid(IBinder lock, int flags, String tag, - String packageName, int uid) { + String packageName, int uid, int displayId) { if (uid < 0) { uid = Binder.getCallingUid(); } - acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid), null); + acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid), null, displayId); } @Override // Binder call @@ -5035,7 +5100,7 @@ public final class PowerManagerService extends SystemService @Override // Binder call public void acquireWakeLock(IBinder lock, int flags, String tag, String packageName, - WorkSource ws, String historyTag) { + WorkSource ws, String historyTag, int displayId) { if (lock == null) { throw new IllegalArgumentException("lock must not be null"); } @@ -5060,7 +5125,8 @@ public final class PowerManagerService extends SystemService final int pid = Binder.getCallingPid(); final long ident = Binder.clearCallingIdentity(); try { - acquireWakeLockInternal(lock, flags, tag, packageName, ws, historyTag, uid, pid); + acquireWakeLockInternal(lock, displayId, flags, tag, packageName, ws, historyTag, + uid, pid); } finally { Binder.restoreCallingIdentity(ident); } @@ -5069,7 +5135,7 @@ public final class PowerManagerService extends SystemService @Override // Binder call public void acquireWakeLockAsync(IBinder lock, int flags, String tag, String packageName, WorkSource ws, String historyTag) { - acquireWakeLock(lock, flags, tag, packageName, ws, historyTag); + acquireWakeLock(lock, flags, tag, packageName, ws, historyTag, Display.INVALID_DISPLAY); } @Override // Binder call 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 2df6c5ab80e8e..874f8dc538aae 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -467,21 +467,21 @@ public class PowerManagerServiceTest { // First, ensure that a normal full wake lock does not cause a wakeup int flags = PowerManager.FULL_WAKE_LOCK; mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, - null /* workSource */, null /* historyTag */); + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY); assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); // Ensure that the flag does *NOT* work with a partial wake lock. flags = PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP; mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, - null /* workSource */, null /* historyTag */); + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY); assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); // Verify that flag forces a wakeup when paired to a FULL_WAKE_LOCK flags = PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP; mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, - null /* workSource */, null /* historyTag */); + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY); assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */); } @@ -669,7 +669,7 @@ public class PowerManagerServiceTest { // Create a wakelock mService.getBinderServiceInstance().acquireWakeLock(new Binder(), flags, tag, pkg, - null /* workSource */, null /* historyTag */); + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY); assertThat(wakelockMap.get(tag)).isEqualTo(flags); // Verify wakelock is active. // Confirm that the wakelocks have been disabled when the forceSuspend is in flight. @@ -727,7 +727,7 @@ public class PowerManagerServiceTest { // Take a nap and verify we no longer hold the blocker int flags = PowerManager.DOZE_WAKE_LOCK; mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, - null /* workSource */, null /* historyTag */); + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY); when(mDreamManagerInternalMock.isDreaming()).thenReturn(true); mService.getBinderServiceInstance().goToSleep(mClock.now(), PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0); @@ -835,12 +835,93 @@ public class PowerManagerServiceTest { mService.getBinderServiceInstance().acquireWakeLock(token, PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag, pkg, - null /* workSource */, null /* historyTag */); + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY); + assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); advanceTime(60); assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); } + @Test + public void testWakeLock_affectsProperDisplayGroup() throws Exception { + final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; + final AtomicReference listener = + new AtomicReference<>(); + doAnswer((Answer) invocation -> { + listener.set(invocation.getArgument(0)); + return null; + }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); + final DisplayInfo info = new DisplayInfo(); + info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP; + when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info); + + final String pkg = mContextSpy.getOpPackageName(); + final Binder token = new Binder(); + final String tag = "testWakeLock_affectsProperDisplayGroup"; + + setMinimumScreenOffTimeoutConfig(5); + createService(); + startSystem(); + listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); + + mService.getBinderServiceInstance().acquireWakeLock(token, + PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag, pkg, + null /* workSource */, null /* historyTag */, Display.DEFAULT_DISPLAY); + + assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_AWAKE); + + advanceTime(15000); + assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_DOZING); + } + + @Test + public void testInvalidDisplayGroupWakeLock_affectsAllDisplayGroups() throws Exception { + final int nonDefaultDisplayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1; + final AtomicReference listener = + new AtomicReference<>(); + doAnswer((Answer) invocation -> { + listener.set(invocation.getArgument(0)); + return null; + }).when(mDisplayManagerInternalMock).registerDisplayGroupListener(any()); + final DisplayInfo info = new DisplayInfo(); + info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP; + when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info); + + final String pkg = mContextSpy.getOpPackageName(); + final Binder token = new Binder(); + final String tag = "testInvalidDisplayGroupWakeLock_affectsAllDisplayGroups"; + + setMinimumScreenOffTimeoutConfig(5); + createService(); + startSystem(); + listener.get().onDisplayGroupAdded(nonDefaultDisplayGroupId); + + mService.getBinderServiceInstance().acquireWakeLock(token, + PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag, pkg, + null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY); + + assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_AWAKE); + + advanceTime(15000); + assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP)).isEqualTo( + WAKEFULNESS_AWAKE); + assertThat(mService.getWakefulnessLocked(nonDefaultDisplayGroupId)).isEqualTo( + WAKEFULNESS_AWAKE); + } + @Test public void testBoot_ShouldBeAwake() throws Exception { createService();