From a946d5333f74cda8487ecb791eee52e9482eca6a Mon Sep 17 00:00:00 2001 From: Philip Junker Date: Tue, 28 Sep 2021 18:19:58 +0200 Subject: [PATCH 1/2] Pass PowerGroup instead of groupId where possible. Reduce nesting of updateWakefulnessLocked(). Test: atest FrameworksServicesTests:PowerManagerServiceTest Bug: 200653844 Change-Id: I3bb82fa99bbd57c73720eb0adccfbb047a07568a --- .../com/android/server/power/PowerGroup.java | 14 +- .../server/power/PowerManagerService.java | 353 ++++++++++-------- 2 files changed, 201 insertions(+), 166 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerGroup.java b/services/core/java/com/android/server/power/PowerGroup.java index 51bd7453e2de5..9127484e89773 100644 --- a/services/core/java/com/android/server/power/PowerGroup.java +++ b/services/core/java/com/android/server/power/PowerGroup.java @@ -19,6 +19,7 @@ package com.android.server.power; import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; +import android.view.Display; /** * Used to store power related requests to every display in a @@ -33,9 +34,10 @@ public class PowerGroup { private final DisplayPowerRequest mDisplayPowerRequest; private final boolean mSupportsSandman; + private final int mGroupId; - // True if DisplayManagerService has applied all the latest display states that were - // requested for this group + // True if DisplayManagerService has applied all the latest display states that were requested + // for this group private boolean mReady; // True if this group is in the process of powering on private boolean mPoweringOn; @@ -49,8 +51,9 @@ public class PowerGroup { private long mLastUserActivityTime; private long mLastUserActivityTimeNoChangeLights; - PowerGroup(DisplayPowerRequest displayPowerRequest, int wakefulness, boolean ready, + PowerGroup(int groupId, DisplayPowerRequest displayPowerRequest, int wakefulness, boolean ready, boolean supportsSandman) { + this.mGroupId = groupId; this.mDisplayPowerRequest = displayPowerRequest; this.mWakefulness = wakefulness; this.mReady = ready; @@ -58,6 +61,7 @@ public class PowerGroup { } PowerGroup() { + this.mGroupId = Display.DEFAULT_DISPLAY_GROUP; this.mDisplayPowerRequest = new DisplayPowerRequest(); this.mWakefulness = WAKEFULNESS_AWAKE; this.mReady = false; @@ -72,6 +76,10 @@ public class PowerGroup { return mWakefulness; } + int getGroupId() { + return mGroupId; + } + /** * Sets the {@code wakefulness} value for this {@link PowerGroup}. * diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 29166b30d2b8c..6756061fcaec8 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -117,7 +117,6 @@ import com.android.server.UiThread; import com.android.server.UserspaceRebootLogger; import com.android.server.Watchdog; import com.android.server.am.BatteryStatsService; -import com.android.server.display.DisplayGroup; import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; import com.android.server.policy.WindowManagerPolicy; @@ -665,13 +664,14 @@ public final class PowerManagerService extends SystemService // For now, only the default group supports sandman (dream/AOD). final boolean supportsSandman = groupId == Display.DEFAULT_DISPLAY_GROUP; final PowerGroup powerGroup = new PowerGroup( + groupId, new DisplayPowerRequest(), getGlobalWakefulnessLocked(), /* ready= */ false, supportsSandman); mPowerGroups.append(groupId, powerGroup); mDisplayGroupIds = ArrayUtils.appendInt(mDisplayGroupIds, groupId); - onDisplayGroupEventLocked(DISPLAY_GROUP_ADDED, groupId); + onPowerGroupEventLocked(DISPLAY_GROUP_ADDED, powerGroup); } } @@ -687,15 +687,18 @@ public final class PowerManagerService extends SystemService Slog.e(TAG, "Tried to remove non-existent group:" + groupId); return; } - mPowerGroups.delete(groupId); - onDisplayGroupEventLocked(DISPLAY_GROUP_REMOVED, groupId); + onPowerGroupEventLocked(DISPLAY_GROUP_REMOVED, mPowerGroups.get(groupId)); } } @Override public void onDisplayGroupChanged(int groupId) { synchronized (mLock) { - onDisplayGroupEventLocked(DISPLAY_GROUP_CHANGED, groupId); + if (!mPowerGroups.contains(groupId)) { + Slog.e(TAG, "Tried to change non-existent group: " + groupId); + return; + } + onPowerGroupEventLocked(DISPLAY_GROUP_CHANGED, mPowerGroups.get(groupId)); } } } @@ -1150,7 +1153,7 @@ public final class PowerManagerService extends SystemService updatePowerStateLocked(); if (sQuiescent) { - sleepDisplayGroupNoUpdateLocked(Display.DEFAULT_DISPLAY_GROUP, + sleepDisplayGroupNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), mClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_QUIESCENT, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID); @@ -1507,7 +1510,7 @@ public final class PowerManagerService extends SystemService opUid = wakeLock.mOwnerUid; } for (int id : mDisplayGroupIds) { - wakeDisplayGroupNoUpdateLocked(id, mClock.uptimeMillis(), + wakeDisplayGroupNoUpdateLocked(mPowerGroups.get(id), mClock.uptimeMillis(), PowerManager.WAKE_REASON_APPLICATION, wakeLock.mTag, opUid, opPackageName, opUid); } @@ -1745,7 +1748,8 @@ public final class PowerManagerService extends SystemService if (groupId == Display.INVALID_DISPLAY_GROUP) { return; } - if (userActivityNoUpdateLocked(groupId, eventTime, event, flags, uid)) { + if (userActivityNoUpdateLocked(mPowerGroups.get(groupId), eventTime, event, flags, + uid)) { updatePowerStateLocked(); } } @@ -1753,8 +1757,10 @@ public final class PowerManagerService extends SystemService private void onUserAttention() { synchronized (mLock) { - if (userActivityNoUpdateLocked(Display.DEFAULT_DISPLAY_GROUP, mClock.uptimeMillis(), - PowerManager.USER_ACTIVITY_EVENT_ATTENTION, 0 /* flags */, + if (userActivityNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), + mClock.uptimeMillis(), + PowerManager.USER_ACTIVITY_EVENT_ATTENTION, + 0 /* flags */, Process.SYSTEM_UID)) { updatePowerStateLocked(); } @@ -1765,7 +1771,7 @@ public final class PowerManagerService extends SystemService private boolean userActivityNoUpdateLocked(long eventTime, int event, int flags, int uid) { boolean updatePowerState = false; for (int id : mDisplayGroupIds) { - if (userActivityNoUpdateLocked(id, eventTime, event, flags, uid)) { + if (userActivityNoUpdateLocked(mPowerGroups.get(id), eventTime, event, flags, uid)) { updatePowerState = true; } } @@ -1774,10 +1780,10 @@ public final class PowerManagerService extends SystemService } @GuardedBy("mLock") - private boolean userActivityNoUpdateLocked(int groupId, long eventTime, int event, int flags, - int uid) { + private boolean userActivityNoUpdateLocked(final PowerGroup powerGroup, long eventTime, + int event, int flags, int uid) { if (DEBUG_SPEW) { - Slog.d(TAG, "userActivityNoUpdateLocked: groupId=" + groupId + Slog.d(TAG, "userActivityNoUpdateLocked: groupId=" + powerGroup.getGroupId() + ", eventTime=" + eventTime + ", event=" + event + ", flags=0x" + Integer.toHexString(flags) + ", uid=" + uid); } @@ -1801,7 +1807,7 @@ public final class PowerManagerService extends SystemService mOverriddenTimeout = -1; } - final int wakefulness = mPowerGroups.get(groupId).getWakefulnessLocked(); + final int wakefulness = powerGroup.getWakefulnessLocked(); if (wakefulness == WAKEFULNESS_ASLEEP || wakefulness == WAKEFULNESS_DOZING || (flags & PowerManager.USER_ACTIVITY_FLAG_INDIRECT) != 0) { @@ -1811,11 +1817,9 @@ public final class PowerManagerService extends SystemService maybeUpdateForegroundProfileLastActivityLocked(eventTime); if ((flags & PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) != 0) { - if (eventTime - > mPowerGroups.get(groupId).getLastUserActivityTimeNoChangeLightsLocked() - && eventTime > mPowerGroups.get(groupId).getLastUserActivityTimeLocked()) { - mPowerGroups.get(groupId).setLastUserActivityTimeNoChangeLightsLocked( - eventTime); + if (eventTime > powerGroup.getLastUserActivityTimeNoChangeLightsLocked() + && eventTime > powerGroup.getLastUserActivityTimeLocked()) { + powerGroup.setLastUserActivityTimeNoChangeLightsLocked(eventTime); mDirty |= DIRTY_USER_ACTIVITY; if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) { mDirty |= DIRTY_QUIESCENT; @@ -1824,8 +1828,8 @@ public final class PowerManagerService extends SystemService return true; } } else { - if (eventTime > mPowerGroups.get(groupId).getLastUserActivityTimeLocked()) { - mPowerGroups.get(groupId).setLastUserActivityTimeLocked(eventTime); + if (eventTime > powerGroup.getLastUserActivityTimeLocked()) { + powerGroup.setLastUserActivityTimeLocked(eventTime); mDirty |= DIRTY_USER_ACTIVITY; if (event == PowerManager.USER_ACTIVITY_EVENT_BUTTON) { mDirty |= DIRTY_QUIESCENT; @@ -1850,16 +1854,17 @@ public final class PowerManagerService extends SystemService private void wakeDisplayGroup(int groupId, long eventTime, @WakeReason int reason, String details, int uid, String opPackageName, int opUid) { synchronized (mLock) { - if (wakeDisplayGroupNoUpdateLocked(groupId, eventTime, reason, details, uid, - opPackageName, opUid)) { + if (wakeDisplayGroupNoUpdateLocked(mPowerGroups.get(groupId), eventTime, reason, + details, uid, opPackageName, opUid)) { updatePowerStateLocked(); } } } @GuardedBy("mLock") - private boolean wakeDisplayGroupNoUpdateLocked(int groupId, long eventTime, + private boolean wakeDisplayGroupNoUpdateLocked(final PowerGroup powerGroup, long eventTime, @WakeReason int reason, String details, int uid, String opPackageName, int opUid) { + final int groupId = powerGroup.getGroupId(); if (DEBUG_SPEW) { Slog.d(TAG, "wakeDisplayGroupNoUpdateLocked: eventTime=" + eventTime + ", groupId=" + groupId + ", uid=" + uid); @@ -1869,7 +1874,7 @@ public final class PowerManagerService extends SystemService return false; } - final int currentState = mPowerGroups.get(groupId).getWakefulnessLocked(); + final int currentState = powerGroup.getWakefulnessLocked(); if (currentState == WAKEFULNESS_AWAKE) { if (!mBootCompleted && sQuiescent) { mDirty |= DIRTY_QUIESCENT; @@ -1892,9 +1897,8 @@ public final class PowerManagerService extends SystemService LatencyTracker.getInstance(mContext) .onActionStart(ACTION_TURN_ON_SCREEN, String.valueOf(groupId)); - setWakefulnessLocked(groupId, WAKEFULNESS_AWAKE, eventTime, uid, reason, opUid, + setWakefulnessLocked(powerGroup, WAKEFULNESS_AWAKE, eventTime, uid, reason, opUid, opPackageName, details); - PowerGroup powerGroup = mPowerGroups.get(groupId); powerGroup.setLastPowerOnTimeLocked(eventTime); powerGroup.setIsPoweringOnLocked(true); } finally { @@ -1907,19 +1911,20 @@ public final class PowerManagerService extends SystemService private void sleepDisplayGroup(int groupId, long eventTime, int reason, int flags, int uid) { synchronized (mLock) { - if (sleepDisplayGroupNoUpdateLocked(groupId, eventTime, reason, flags, uid)) { + if (sleepDisplayGroupNoUpdateLocked(mPowerGroups.get(groupId), eventTime, reason, flags, + uid)) { updatePowerStateLocked(); } } } @GuardedBy("mLock") - private boolean sleepDisplayGroupNoUpdateLocked(int groupId, long eventTime, int reason, - int flags, int uid) { + private boolean sleepDisplayGroupNoUpdateLocked(final PowerGroup powerGroup, long eventTime, + int reason, int flags, int uid) { if (DEBUG_SPEW) { Slog.d(TAG, "sleepDisplayGroupNoUpdateLocked: eventTime=" + eventTime - + ", groupId=" + groupId + ", reason=" + reason + ", flags=" + flags - + ", uid=" + uid); + + ", groupId=" + powerGroup.getGroupId() + ", reason=" + reason + + ", flags=" + flags + ", uid=" + uid); } if (eventTime < mLastWakeTime @@ -1929,7 +1934,7 @@ public final class PowerManagerService extends SystemService return false; } - final int wakefulness = mPowerGroups.get(groupId).getWakefulnessLocked(); + final int wakefulness = powerGroup.getWakefulnessLocked(); if (!PowerManagerInternal.isInteractive(wakefulness)) { return false; } @@ -1939,14 +1944,14 @@ public final class PowerManagerService extends SystemService reason = Math.min(PowerManager.GO_TO_SLEEP_REASON_MAX, Math.max(reason, PowerManager.GO_TO_SLEEP_REASON_MIN)); Slog.i(TAG, "Powering off display group due to " - + PowerManager.sleepReasonToString(reason) + " (groupId= " + groupId - + ", uid= " + uid + ")..."); + + PowerManager.sleepReasonToString(reason) + + " (groupId= " + powerGroup.getGroupId() + ", uid= " + uid + ")..."); - mPowerGroups.get(groupId).setSandmanSummonedLocked(/* isSandmanSummoned= */ true); - setWakefulnessLocked(groupId, WAKEFULNESS_DOZING, eventTime, uid, reason, + powerGroup.setSandmanSummonedLocked(/* isSandmanSummoned= */ true); + setWakefulnessLocked(powerGroup, WAKEFULNESS_DOZING, eventTime, uid, reason, /* opUid= */ 0, /* opPackageName= */ null, /* details= */ null); if ((flags & PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE) != 0) { - reallySleepDisplayGroupNoUpdateLocked(groupId, eventTime, uid); + reallySleepDisplayGroupNoUpdateLocked(powerGroup, eventTime, uid); } } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); @@ -1956,14 +1961,15 @@ public final class PowerManagerService extends SystemService private void dreamDisplayGroup(int groupId, long eventTime, int uid) { synchronized (mLock) { - if (dreamDisplayGroupNoUpdateLocked(groupId, eventTime, uid)) { + if (dreamDisplayGroupNoUpdateLocked(mPowerGroups.get(groupId), eventTime, uid)) { updatePowerStateLocked(); } } } @GuardedBy("mLock") - private boolean dreamDisplayGroupNoUpdateLocked(int groupId, long eventTime, int uid) { + private boolean dreamDisplayGroupNoUpdateLocked(final PowerGroup powerGroup, long eventTime, + int uid) { if (DEBUG_SPEW) { Slog.d(TAG, "dreamDisplayGroupNoUpdateLocked: eventTime=" + eventTime + ", uid=" + uid); @@ -1976,11 +1982,12 @@ public final class PowerManagerService extends SystemService Trace.traceBegin(Trace.TRACE_TAG_POWER, "napDisplayGroup"); try { - Slog.i(TAG, "Napping display group (groupId=" + groupId + ", uid=" + uid + ")..."); + Slog.i(TAG, "Napping display group (groupId=" + powerGroup.getGroupId() + ", uid=" + uid + + ")..."); - mPowerGroups.get(groupId).setSandmanSummonedLocked(/* isSandmanSummoned= */ true); - setWakefulnessLocked(groupId, WAKEFULNESS_DREAMING, eventTime, uid, /* reason= */ - 0, /* opUid= */ 0, /* opPackageName= */ null, /* details= */ null); + powerGroup.setSandmanSummonedLocked(/* isSandmanSummoned= */ true); + setWakefulnessLocked(powerGroup, WAKEFULNESS_DREAMING, eventTime, uid, + /* reason= */0, /* opUid= */ 0, /* opPackageName= */ null, /* details= */ null); } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); @@ -1989,7 +1996,8 @@ public final class PowerManagerService extends SystemService } @GuardedBy("mLock") - private boolean reallySleepDisplayGroupNoUpdateLocked(int groupId, long eventTime, int uid) { + private boolean reallySleepDisplayGroupNoUpdateLocked(final PowerGroup powerGroup, + long eventTime, int uid) { if (DEBUG_SPEW) { Slog.d(TAG, "reallySleepDisplayGroupNoUpdateLocked: eventTime=" + eventTime + ", uid=" + uid); @@ -1997,16 +2005,18 @@ public final class PowerManagerService extends SystemService if (eventTime < mLastWakeTime || getWakefulnessLocked() == WAKEFULNESS_ASLEEP || !mBootCompleted || !mSystemReady - || mPowerGroups.get(groupId).getWakefulnessLocked() + || powerGroup.getWakefulnessLocked() == WAKEFULNESS_ASLEEP) { return false; } Trace.traceBegin(Trace.TRACE_TAG_POWER, "reallySleepDisplayGroup"); try { - Slog.i(TAG, "Sleeping display group (groupId=" + groupId + ", uid=" + uid + ")..."); + Slog.i(TAG, + "Sleeping display group (groupId=" + powerGroup.getGroupId() + ", uid=" + uid + + ")..."); - setWakefulnessLocked(groupId, WAKEFULNESS_ASLEEP, eventTime, uid, + setWakefulnessLocked(powerGroup, WAKEFULNESS_ASLEEP, eventTime, uid, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, /* opUid= */ 0, /* opPackageName= */ null, /* details= */ null); } finally { @@ -2019,14 +2029,21 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") void setWakefulnessLocked(int groupId, int wakefulness, long eventTime, int uid, int reason, int opUid, String opPackageName, String details) { - if (mPowerGroups.get(groupId).setWakefulnessLocked(wakefulness)) { + setWakefulnessLocked(mPowerGroups.get(groupId), wakefulness, eventTime, uid, reason, opUid, + opPackageName, details); + } + + @GuardedBy("mLock") + private void setWakefulnessLocked(final PowerGroup powerGroup, int wakefulness, long eventTime, + int uid, int reason, int opUid, String opPackageName, String details) { + if (powerGroup.setWakefulnessLocked(wakefulness)) { mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; setGlobalWakefulnessLocked(getGlobalWakefulnessLocked(), eventTime, reason, uid, opUid, opPackageName, details); if (wakefulness == WAKEFULNESS_AWAKE) { // Kick user activity to prevent newly awake group from timing out instantly. - userActivityNoUpdateLocked( - groupId, eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, uid); + userActivityNoUpdateLocked(powerGroup, eventTime, + PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, uid); } } } @@ -2138,9 +2155,9 @@ public final class PowerManagerService extends SystemService } /** - * Returns the amalgamated wakefulness of all {@link DisplayGroup DisplayGroups}. + * Returns the amalgamated wakefulness of all {@link PowerGroup PowerGroups}. * - *

This will be the highest wakeful state of all {@link DisplayGroup DisplayGroups}; ordered + *

This will be the highest wakeful state of all {@link PowerGroup PowerGroups}; ordered * from highest to lowest: *

    *
  1. {@link PowerManagerInternal#WAKEFULNESS_AWAKE} @@ -2171,14 +2188,18 @@ public final class PowerManagerService extends SystemService } @GuardedBy("mLock") - void onDisplayGroupEventLocked(int event, int groupId) { + void onPowerGroupEventLocked(int event, PowerGroup powerGroup) { + final int groupId = powerGroup.getGroupId(); + if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_REMOVED) { + mPowerGroups.remove(groupId); + } final int oldWakefulness = getWakefulnessLocked(); final int newWakefulness = getGlobalWakefulnessLocked(); if (event == DisplayGroupPowerChangeListener.DISPLAY_GROUP_ADDED && newWakefulness == WAKEFULNESS_AWAKE) { // Kick user activity to prevent newly added group from timing out instantly. - userActivityNoUpdateLocked(groupId, mClock.uptimeMillis(), + userActivityNoUpdateLocked(powerGroup, mClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_OTHER, /* flags= */ 0, Process.SYSTEM_UID); } @@ -2380,13 +2401,13 @@ public final class PowerManagerService extends SystemService final long now = mClock.uptimeMillis(); if (shouldWakeUpWhenPluggedOrUnpluggedLocked(wasPowered, oldPlugType, dockedOnWirelessCharger)) { - wakeDisplayGroupNoUpdateLocked(Display.DEFAULT_DISPLAY_GROUP, now, - PowerManager.WAKE_REASON_PLUGGED_IN, + wakeDisplayGroupNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), + now, PowerManager.WAKE_REASON_PLUGGED_IN, "android.server.power:PLUGGED:" + mIsPowered, Process.SYSTEM_UID, mContext.getOpPackageName(), Process.SYSTEM_UID); } - userActivityNoUpdateLocked(Display.DEFAULT_DISPLAY_GROUP, now, + userActivityNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); // only play charging sounds if boot is completed so charging sounds don't play @@ -2502,13 +2523,14 @@ public final class PowerManagerService extends SystemService continue; } + final PowerGroup powerGroup = mPowerGroups.get(groupId); final int wakeLockFlags = getWakeLockSummaryFlags(wakeLock); mWakeLockSummary |= wakeLockFlags; if (groupId != Display.INVALID_DISPLAY_GROUP) { - int wakeLockSummary = mPowerGroups.get(groupId).getWakeLockSummaryLocked(); + int wakeLockSummary = powerGroup.getWakeLockSummaryLocked(); wakeLockSummary |= wakeLockFlags; - mPowerGroups.get(groupId).setWakeLockSummaryLocked(wakeLockSummary); + powerGroup.setWakeLockSummaryLocked(wakeLockSummary); } else { invalidGroupWakeLockSummary |= wakeLockFlags; } @@ -2522,11 +2544,11 @@ public final class PowerManagerService extends SystemService } for (int groupId : mDisplayGroupIds) { + final PowerGroup powerGroup = mPowerGroups.get(groupId); final int wakeLockSummary = adjustWakeLockSummary( - mPowerGroups.get(groupId).getWakefulnessLocked(), - invalidGroupWakeLockSummary - | mPowerGroups.get(groupId).getWakeLockSummaryLocked()); - mPowerGroups.get(groupId).setWakeLockSummaryLocked(wakeLockSummary); + powerGroup.getWakefulnessLocked(), + invalidGroupWakeLockSummary | powerGroup.getWakeLockSummaryLocked()); + powerGroup.setWakeLockSummaryLocked(wakeLockSummary); } mWakeLockSummary = adjustWakeLockSummary(getWakefulnessLocked(), @@ -2687,11 +2709,11 @@ public final class PowerManagerService extends SystemService for (int groupId : mDisplayGroupIds) { int groupUserActivitySummary = 0; long groupNextTimeout = 0; - if (mPowerGroups.get(groupId).getWakefulnessLocked() != WAKEFULNESS_ASLEEP) { - final long lastUserActivityTime = - mPowerGroups.get(groupId).getLastUserActivityTimeLocked(); + final PowerGroup powerGroup = mPowerGroups.get(groupId); + if (powerGroup.getWakefulnessLocked() != WAKEFULNESS_ASLEEP) { + final long lastUserActivityTime = powerGroup.getLastUserActivityTimeLocked(); final long lastUserActivityTimeNoChangeLights = - mPowerGroups.get(groupId).getLastUserActivityTimeNoChangeLightsLocked(); + powerGroup.getLastUserActivityTimeNoChangeLightsLocked(); if (lastUserActivityTime >= mLastWakeTime) { groupNextTimeout = lastUserActivityTime + screenOffTimeout - screenDimDuration; if (now < groupNextTimeout) { @@ -2708,7 +2730,7 @@ public final class PowerManagerService extends SystemService groupNextTimeout = lastUserActivityTimeNoChangeLights + screenOffTimeout; if (now < groupNextTimeout) { final DisplayPowerRequest displayPowerRequest = - mPowerGroups.get(groupId).getDisplayPowerRequestLocked(); + powerGroup.getDisplayPowerRequestLocked(); if (displayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT || displayPowerRequest.policy == DisplayPowerRequest.POLICY_VR) { groupUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT; @@ -2749,7 +2771,7 @@ public final class PowerManagerService extends SystemService } if ((groupUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0 - && (mPowerGroups.get(groupId).getWakeLockSummaryLocked() + && (powerGroup.getWakeLockSummaryLocked() & WAKE_LOCK_STAY_AWAKE) == 0) { groupNextTimeout = mAttentionDetector.updateUserActivity(groupNextTimeout, screenDimDuration); @@ -2764,12 +2786,11 @@ public final class PowerManagerService extends SystemService } } - mPowerGroups.get(groupId).setUserActivitySummaryLocked(groupUserActivitySummary); + powerGroup.setUserActivitySummaryLocked(groupUserActivitySummary); if (DEBUG_SPEW) { Slog.d(TAG, "updateUserActivitySummaryLocked: groupId=" + groupId - + ", mWakefulness=" + wakefulnessToString( - mPowerGroups.get(groupId).getWakefulnessLocked()) + + ", mWakefulness=" + wakefulnessToString(powerGroup.getWakefulnessLocked()) + ", mUserActivitySummary=0x" + Integer.toHexString( groupUserActivitySummary) + ", nextTimeout=" + TimeUtils.formatUptime(groupNextTimeout)); @@ -2880,12 +2901,11 @@ public final class PowerManagerService extends SystemService } @GuardedBy("mLock") - private boolean isAttentiveTimeoutExpired(int groupId, long now) { + private boolean isAttentiveTimeoutExpired(final PowerGroup powerGroup, long now) { long attentiveTimeout = getAttentiveTimeoutLocked(); // Attentive state only applies to the default display group. - return groupId == Display.DEFAULT_DISPLAY_GROUP && attentiveTimeout >= 0 - && now >= mPowerGroups.get(groupId).getLastUserActivityTimeLocked() - + attentiveTimeout; + return powerGroup.getGroupId() == Display.DEFAULT_DISPLAY_GROUP && attentiveTimeout >= 0 + && now >= powerGroup.getLastUserActivityTimeLocked() + attentiveTimeout; } /** @@ -2990,28 +3010,31 @@ public final class PowerManagerService extends SystemService if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE | DIRTY_DOCK_STATE | DIRTY_ATTENTIVE | DIRTY_SETTINGS - | DIRTY_SCREEN_BRIGHTNESS_BOOST)) != 0) { - final long time = mClock.uptimeMillis(); - for (int id : mDisplayGroupIds) { - if (mPowerGroups.get(id).getWakefulnessLocked() == WAKEFULNESS_AWAKE - && isItBedTimeYetLocked(id)) { - if (DEBUG_SPEW) { - Slog.d(TAG, "updateWakefulnessLocked: Bed time for group " + id); - } - if (isAttentiveTimeoutExpired(id, time)) { - if (DEBUG) { - Slog.i(TAG, "Going to sleep now due to long user inactivity"); - } - changed = sleepDisplayGroupNoUpdateLocked(id, time, - PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE, - PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID); - } else if (shouldNapAtBedTimeLocked()) { - changed = dreamDisplayGroupNoUpdateLocked(id, time, Process.SYSTEM_UID); - } else { - changed = sleepDisplayGroupNoUpdateLocked(id, time, - PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0, Process.SYSTEM_UID); - } + | DIRTY_SCREEN_BRIGHTNESS_BOOST)) == 0) { + return changed; + } + final long time = mClock.uptimeMillis(); + for (int id : mDisplayGroupIds) { + final PowerGroup powerGroup = mPowerGroups.get(id); + if (!(powerGroup.getWakefulnessLocked() == WAKEFULNESS_AWAKE + && isItBedTimeYetLocked(powerGroup))) { + continue; + } + if (DEBUG_SPEW) { + Slog.d(TAG, "updateWakefulnessLocked: Bed time for group " + id); + } + if (isAttentiveTimeoutExpired(powerGroup, time)) { + if (DEBUG) { + Slog.i(TAG, "Going to sleep now due to long user inactivity"); } + changed = sleepDisplayGroupNoUpdateLocked(powerGroup, time, + PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE, + PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID); + } else if (shouldNapAtBedTimeLocked()) { + changed = dreamDisplayGroupNoUpdateLocked(powerGroup, time, Process.SYSTEM_UID); + } else { + changed = sleepDisplayGroupNoUpdateLocked(powerGroup, time, + PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, 0, Process.SYSTEM_UID); } } return changed; @@ -3029,39 +3052,38 @@ public final class PowerManagerService extends SystemService } /** - * Returns true if the DisplayGroup with the provided {@code groupId} should go to sleep now. + * Returns true if the provided {@link PowerGroup} should go to sleep now. * Also used when exiting a dream to determine whether we should go back to being fully awake or * else go to sleep for good. */ @GuardedBy("mLock") - private boolean isItBedTimeYetLocked(int groupId) { + private boolean isItBedTimeYetLocked(PowerGroup powerGroup) { if (!mBootCompleted) { return false; } long now = mClock.uptimeMillis(); - if (isAttentiveTimeoutExpired(groupId, now)) { + if (isAttentiveTimeoutExpired(powerGroup, now)) { return !isBeingKeptFromInattentiveSleepLocked(); } else { - return !isBeingKeptAwakeLocked(groupId); + return !isBeingKeptAwakeLocked(powerGroup); } } /** - * Returns true if the DisplayGroup with the provided {@code groupId} is being kept awake by a - * wake lock, user activity or the stay on while powered setting. We also keep the phone awake - * when the proximity sensor returns a positive result so that the device does not lock while in - * a phone call. This function only controls whether the device will go to sleep or dream which - * is independent of whether it will be allowed to suspend. + * Returns true if the provided {@link PowerGroup} is being kept awake by a wake lock, user + * activity or the stay on while powered setting. We also keep the phone awake when the + * proximity sensor returns a positive result so that the device does not lock while in a phone + * call. This function only controls whether the device will go to sleep or dream which is + * independent of whether it will be allowed to suspend. */ @GuardedBy("mLock") - private boolean isBeingKeptAwakeLocked(int groupId) { + private boolean isBeingKeptAwakeLocked(final PowerGroup powerGroup) { return mStayOn || mProximityPositive - || (mPowerGroups.get(groupId).getWakeLockSummaryLocked() & WAKE_LOCK_STAY_AWAKE) - != 0 - || (mPowerGroups.get(groupId).getUserActivitySummaryLocked() & ( - USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM)) != 0 + || (powerGroup.getWakeLockSummaryLocked() & WAKE_LOCK_STAY_AWAKE) != 0 + || (powerGroup.getUserActivitySummaryLocked() & ( + USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM)) != 0 || mScreenBrightnessBoostInProgress; } @@ -3130,12 +3152,12 @@ public final class PowerManagerService extends SystemService // Group has been removed. return; } - wakefulness = mPowerGroups.get(groupId).getWakefulnessLocked(); + final PowerGroup powerGroup = mPowerGroups.get(groupId); + wakefulness = powerGroup.getWakefulnessLocked(); if ((wakefulness == WAKEFULNESS_DREAMING || wakefulness == WAKEFULNESS_DOZING) && - mPowerGroups.get(groupId).isSandmanSummonedLocked() - && mPowerGroups.get(groupId).isReadyLocked()) { - startDreaming = canDreamLocked(groupId) || canDozeLocked(); - mPowerGroups.get(groupId).setSandmanSummonedLocked(/* isSandmanSummoned= */ false); + powerGroup.isSandmanSummonedLocked() && powerGroup.isReadyLocked()) { + startDreaming = canDreamLocked(powerGroup) || canDozeLocked(); + powerGroup.setSandmanSummonedLocked(/* isSandmanSummoned= */ false); } else { startDreaming = false; } @@ -3179,19 +3201,20 @@ public final class PowerManagerService extends SystemService // If preconditions changed, wait for the next iteration to determine // whether the dream should continue (or be restarted). - if (mPowerGroups.get(groupId).isSandmanSummonedLocked() - || mPowerGroups.get(groupId).getWakefulnessLocked() != wakefulness) { + final PowerGroup powerGroup = mPowerGroups.get(groupId); + if (powerGroup.isSandmanSummonedLocked() + || powerGroup.getWakefulnessLocked() != wakefulness) { return; // wait for next cycle } // Determine whether the dream should continue. long now = mClock.uptimeMillis(); if (wakefulness == WAKEFULNESS_DREAMING) { - if (isDreaming && canDreamLocked(groupId)) { + if (isDreaming && canDreamLocked(powerGroup)) { if (mDreamsBatteryLevelDrainCutoffConfig >= 0 && mBatteryLevel < mBatteryLevelWhenDreamStarted - mDreamsBatteryLevelDrainCutoffConfig - && !isBeingKeptAwakeLocked(groupId)) { + && !isBeingKeptAwakeLocked(powerGroup)) { // If the user activity timeout expired and the battery appears // to be draining faster than it is charging then stop dreaming // and go to sleep. @@ -3206,13 +3229,14 @@ public final class PowerManagerService extends SystemService } // Dream has ended or will be stopped. Update the power state. - if (isItBedTimeYetLocked(groupId)) { - final int flags = isAttentiveTimeoutExpired(groupId, now) + if (isItBedTimeYetLocked(powerGroup)) { + final int flags = isAttentiveTimeoutExpired(powerGroup, now) ? PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE : 0; - sleepDisplayGroupNoUpdateLocked(groupId, now, + sleepDisplayGroupNoUpdateLocked(powerGroup, now, PowerManager.GO_TO_SLEEP_REASON_TIMEOUT, flags, Process.SYSTEM_UID); } else { - wakeDisplayGroupNoUpdateLocked(groupId, now, PowerManager.WAKE_REASON_UNKNOWN, + wakeDisplayGroupNoUpdateLocked(powerGroup, now, + PowerManager.WAKE_REASON_UNKNOWN, "android.server.power:DREAM_FINISHED", Process.SYSTEM_UID, mContext.getOpPackageName(), Process.SYSTEM_UID); } @@ -3223,7 +3247,7 @@ public final class PowerManagerService extends SystemService } // Doze has ended or will be stopped. Update the power state. - reallySleepDisplayGroupNoUpdateLocked(groupId, now, Process.SYSTEM_UID); + reallySleepDisplayGroupNoUpdateLocked(powerGroup, now, Process.SYSTEM_UID); updatePowerStateLocked(); } } @@ -3238,21 +3262,19 @@ public final class PowerManagerService extends SystemService * Returns true if the {@code groupId} is allowed to dream in its current state. */ @GuardedBy("mLock") - private boolean canDreamLocked(int groupId) { - final DisplayPowerRequest displayPowerRequest = - mPowerGroups.get(groupId).getDisplayPowerRequestLocked(); + private boolean canDreamLocked(final PowerGroup powerGroup) { + final DisplayPowerRequest displayPowerRequest = powerGroup.getDisplayPowerRequestLocked(); if (!mBootCompleted || getWakefulnessLocked() != WAKEFULNESS_DREAMING || !mDreamsSupportedConfig || !mDreamsEnabledSetting || !displayPowerRequest.isBrightOrDim() || displayPowerRequest.isVr() - || (mPowerGroups.get(groupId).getUserActivitySummaryLocked() & ( - USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM - | USER_ACTIVITY_SCREEN_DREAM)) == 0) { + || (powerGroup.getUserActivitySummaryLocked() & (USER_ACTIVITY_SCREEN_BRIGHT + | USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0) { return false; } - if (!isBeingKeptAwakeLocked(groupId)) { + if (!isBeingKeptAwakeLocked(powerGroup)) { if (!mIsPowered && !mDreamsEnabledOnBatteryConfig) { return false; } @@ -3303,9 +3325,10 @@ public final class PowerManagerService extends SystemService } for (final int groupId : mDisplayGroupIds) { + final PowerGroup powerGroup = mPowerGroups.get(groupId); final DisplayPowerRequest displayPowerRequest = - mPowerGroups.get(groupId).getDisplayPowerRequestLocked(); - displayPowerRequest.policy = getDesiredScreenPolicyLocked(groupId); + powerGroup.getDisplayPowerRequestLocked(); + displayPowerRequest.policy = getDesiredScreenPolicyLocked(powerGroup); // Determine appropriate screen brightness and auto-brightness adjustments. final boolean autoBrightness; @@ -3334,7 +3357,7 @@ public final class PowerManagerService extends SystemService if (displayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) { displayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager; - if ((mPowerGroups.get(groupId).getWakeLockSummaryLocked() & WAKE_LOCK_DRAW) != 0 + if ((powerGroup.getWakeLockSummaryLocked() & WAKE_LOCK_DRAW) != 0 && !mDrawWakeLockOverrideFromSidekick) { if (displayPowerRequest.dozeScreenState == Display.STATE_DOZE_SUSPEND) { displayPowerRequest.dozeScreenState = Display.STATE_DOZE; @@ -3361,11 +3384,11 @@ public final class PowerManagerService extends SystemService + ", policy=" + policyToString(displayPowerRequest.policy) + ", mWakefulness=" + PowerManagerInternal.wakefulnessToString( - mPowerGroups.get(groupId).getWakefulnessLocked()) + powerGroup.getWakefulnessLocked()) + ", mWakeLockSummary=0x" + Integer.toHexString( - mPowerGroups.get(groupId).getWakeLockSummaryLocked()) + powerGroup.getWakeLockSummaryLocked()) + ", mUserActivitySummary=0x" + Integer.toHexString( - mPowerGroups.get(groupId).getUserActivitySummaryLocked()) + powerGroup.getUserActivitySummaryLocked()) + ", mBootCompleted=" + mBootCompleted + ", screenBrightnessOverride=" + displayPowerRequest.screenBrightnessOverride @@ -3376,16 +3399,15 @@ public final class PowerManagerService extends SystemService + ", sQuiescent=" + sQuiescent); } - final boolean displayReadyStateChanged = - mPowerGroups.get(groupId).setReadyLocked(ready); - final boolean poweringOn = mPowerGroups.get(groupId).isPoweringOnLocked(); + final boolean displayReadyStateChanged = powerGroup.setReadyLocked(ready); + final boolean poweringOn = powerGroup.isPoweringOnLocked(); if (ready && displayReadyStateChanged && poweringOn - && mPowerGroups.get(groupId).getWakefulnessLocked() == WAKEFULNESS_AWAKE) { - mPowerGroups.get(groupId).setIsPoweringOnLocked(false); + && powerGroup.getWakefulnessLocked() == WAKEFULNESS_AWAKE) { + powerGroup.setIsPoweringOnLocked(false); LatencyTracker.getInstance(mContext).onActionEnd(ACTION_TURN_ON_SCREEN); Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, groupId); final int latencyMs = (int) (mClock.uptimeMillis() - - mPowerGroups.get(groupId).getLastPowerOnTimeLocked()); + - powerGroup.getLastPowerOnTimeLocked()); if (latencyMs >= SCREEN_ON_LATENCY_WARNING_MS) { Slog.w(TAG, "Screen on took " + latencyMs + " ms"); } @@ -3431,8 +3453,12 @@ public final class PowerManagerService extends SystemService @VisibleForTesting @GuardedBy("mLock") int getDesiredScreenPolicyLocked(int groupId) { - final int wakefulness = mPowerGroups.get(groupId).getWakefulnessLocked(); - final int wakeLockSummary = mPowerGroups.get(groupId).getWakeLockSummaryLocked(); + return getDesiredScreenPolicyLocked(mPowerGroups.get(groupId)); + } + + int getDesiredScreenPolicyLocked(final PowerGroup powerGroup) { + final int wakefulness = powerGroup.getWakefulnessLocked(); + final int wakeLockSummary = powerGroup.getWakeLockSummaryLocked(); if (wakefulness == WAKEFULNESS_ASLEEP || sQuiescent) { return DisplayPowerRequest.POLICY_OFF; } else if (wakefulness == WAKEFULNESS_DOZING) { @@ -3455,8 +3481,7 @@ public final class PowerManagerService extends SystemService if ((wakeLockSummary & WAKE_LOCK_SCREEN_BRIGHT) != 0 || !mBootCompleted - || (mPowerGroups.get(groupId).getUserActivitySummaryLocked() - & USER_ACTIVITY_SCREEN_BRIGHT) != 0 + || (powerGroup.getUserActivitySummaryLocked() & USER_ACTIVITY_SCREEN_BRIGHT) != 0 || mScreenBrightnessBoostInProgress) { return DisplayPowerRequest.POLICY_BRIGHT; } @@ -3490,8 +3515,9 @@ public final class PowerManagerService extends SystemService mProximityPositive = false; mInterceptedPowerKeyForProximity = false; mDirty |= DIRTY_PROXIMITY_POSITIVE; - userActivityNoUpdateLocked(Display.DEFAULT_DISPLAY_GROUP, mClock.uptimeMillis(), - PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); + userActivityNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), + mClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_OTHER, + 0 /* flags */, Process.SYSTEM_UID); updatePowerStateLocked(); } } @@ -4077,7 +4103,7 @@ public final class PowerManagerService extends SystemService mScreenBrightnessBoostInProgress = true; mDirty |= DIRTY_SCREEN_BRIGHTNESS_BOOST; - userActivityNoUpdateLocked(Display.DEFAULT_DISPLAY_GROUP, eventTime, + userActivityNoUpdateLocked(mPowerGroups.get(Display.DEFAULT_DISPLAY_GROUP), eventTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, uid); updatePowerStateLocked(); } @@ -4202,8 +4228,8 @@ public final class PowerManagerService extends SystemService // Place the system in an non-interactive state boolean updatePowerState = false; for (int id : mDisplayGroupIds) { - updatePowerState |= sleepDisplayGroupNoUpdateLocked(id, mClock.uptimeMillis(), - PowerManager.GO_TO_SLEEP_REASON_FORCE_SUSPEND, + updatePowerState |= sleepDisplayGroupNoUpdateLocked(mPowerGroups.get(id), + mClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_FORCE_SUSPEND, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, uid); } if (updatePowerState) { @@ -4505,15 +4531,16 @@ public final class PowerManagerService extends SystemService pw.println("Display Group User Activity:"); for (int id : mDisplayGroupIds) { + final PowerGroup powerGroup = mPowerGroups.get(id); pw.println(" displayGroupId=" + id); pw.println(" userActivitySummary=0x" + Integer.toHexString( - mPowerGroups.get(id).getUserActivitySummaryLocked())); + powerGroup.getUserActivitySummaryLocked())); pw.println(" lastUserActivityTime=" + TimeUtils.formatUptime( - mPowerGroups.get(id).getLastUserActivityTimeLocked())); + powerGroup.getLastUserActivityTimeLocked())); pw.println(" lastUserActivityTimeNoChangeLights=" + TimeUtils.formatUptime( - mPowerGroups.get(id).getLastUserActivityTimeNoChangeLightsLocked())); + powerGroup.getLastUserActivityTimeNoChangeLightsLocked())); pw.println(" mWakeLockSummary=0x" + Integer.toHexString( - mPowerGroups.get(id).getWakeLockSummaryLocked())); + powerGroup.getWakeLockSummaryLocked())); } wcd = mWirelessChargerDetector; @@ -4602,11 +4629,11 @@ public final class PowerManagerService extends SystemService proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_NEXT_CHECK_MS, mNotifyLongNextCheck); for (int id : mDisplayGroupIds) { + final PowerGroup powerGroup = mPowerGroups.get(id); final long userActivityToken = proto.start( PowerManagerServiceDumpProto.USER_ACTIVITY); proto.write(PowerManagerServiceDumpProto.UserActivityProto.DISPLAY_GROUP_ID, id); - final long userActivitySummary = - mPowerGroups.get(id).getUserActivitySummaryLocked(); + final long userActivitySummary = powerGroup.getUserActivitySummaryLocked(); proto.write(PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_BRIGHT, (userActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0); proto.write(PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_DIM, @@ -4615,10 +4642,10 @@ public final class PowerManagerService extends SystemService (userActivitySummary & USER_ACTIVITY_SCREEN_DREAM) != 0); proto.write( PowerManagerServiceDumpProto.UserActivityProto.LAST_USER_ACTIVITY_TIME_MS, - mPowerGroups.get(id).getLastUserActivityTimeLocked()); + powerGroup.getLastUserActivityTimeLocked()); proto.write( PowerManagerServiceDumpProto.UserActivityProto.LAST_USER_ACTIVITY_TIME_NO_CHANGE_LIGHTS_MS, - mPowerGroups.get(id).getLastUserActivityTimeNoChangeLightsLocked()); + powerGroup.getLastUserActivityTimeNoChangeLightsLocked()); proto.end(userActivityToken); } From 5241ce01706d01e65c97b249cd62fdaae07aed77 Mon Sep 17 00:00:00 2001 From: Philip Junker Date: Tue, 28 Sep 2021 18:19:58 +0200 Subject: [PATCH 2/2] Remove mDisplayGroupIds by iterating through PowerGroups directly Test: atest FrameworksServicesTests:PowerManagerServiceTest Bug: 200653844 Change-Id: Icf5ac6f7f6520f63dbd1f11e693338af79304eef --- .../server/power/PowerManagerService.java | 85 +++++++++---------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 6756061fcaec8..1455326b12f89 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -104,7 +104,6 @@ import com.android.internal.app.IAppOpsService; import com.android.internal.app.IBatteryStats; import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.os.BackgroundThread; -import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.LatencyTracker; import com.android.internal.util.Preconditions; @@ -618,10 +617,6 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private final SparseArray mPowerGroups = new SparseArray<>(); - // A cached array of DisplayGroup Ids. - @GuardedBy("mLock") - private int[] mDisplayGroupIds; - // We are currently in the middle of a batch change of uids. private boolean mUidsChanging; @@ -670,7 +665,6 @@ public final class PowerManagerService extends SystemService /* ready= */ false, supportsSandman); mPowerGroups.append(groupId, powerGroup); - mDisplayGroupIds = ArrayUtils.appendInt(mDisplayGroupIds, groupId); onPowerGroupEventLocked(DISPLAY_GROUP_ADDED, powerGroup); } } @@ -682,7 +676,6 @@ public final class PowerManagerService extends SystemService Slog.wtf(TAG, "Tried to remove default display group: " + groupId); return; } - mDisplayGroupIds = ArrayUtils.removeInt(mDisplayGroupIds, groupId); if (!mPowerGroups.contains(groupId)) { Slog.e(TAG, "Tried to remove non-existent group:" + groupId); return; @@ -1172,7 +1165,6 @@ public final class PowerManagerService extends SystemService mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class); mAttentionDetector.systemReady(mContext); mPowerGroups.append(Display.DEFAULT_DISPLAY_GROUP, new PowerGroup()); - mDisplayGroupIds = new int[]{Display.DEFAULT_DISPLAY_GROUP}; mDisplayGroupPowerChangeListener = new DisplayGroupPowerChangeListener(); mDisplayManagerInternal.registerDisplayGroupListener(mDisplayGroupPowerChangeListener); @@ -1509,10 +1501,10 @@ public final class PowerManagerService extends SystemService opPackageName = wakeLock.mPackageName; opUid = wakeLock.mOwnerUid; } - for (int id : mDisplayGroupIds) { - wakeDisplayGroupNoUpdateLocked(mPowerGroups.get(id), mClock.uptimeMillis(), - PowerManager.WAKE_REASON_APPLICATION, wakeLock.mTag, - opUid, opPackageName, opUid); + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + wakeDisplayGroupNoUpdateLocked(mPowerGroups.valueAt(idx), mClock.uptimeMillis(), + PowerManager.WAKE_REASON_APPLICATION, wakeLock.mTag, opUid, opPackageName, + opUid); } } } @@ -1770,8 +1762,9 @@ public final class PowerManagerService extends SystemService @GuardedBy("mLock") private boolean userActivityNoUpdateLocked(long eventTime, int event, int flags, int uid) { boolean updatePowerState = false; - for (int id : mDisplayGroupIds) { - if (userActivityNoUpdateLocked(mPowerGroups.get(id), eventTime, event, flags, uid)) { + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + if (userActivityNoUpdateLocked(mPowerGroups.valueAt(idx), eventTime, event, flags, + uid)) { updatePowerState = true; } } @@ -2508,8 +2501,8 @@ public final class PowerManagerService extends SystemService mProfilePowerState.valueAt(i).mWakeLockSummary = 0; } - for (int groupId : mDisplayGroupIds) { - mPowerGroups.get(groupId).setWakeLockSummaryLocked(0); + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + mPowerGroups.valueAt(idx).setWakeLockSummaryLocked(0); } int invalidGroupWakeLockSummary = 0; @@ -2519,7 +2512,7 @@ public final class PowerManagerService extends SystemService final Integer groupId = wakeLock.getDisplayGroupId(); // a wakelock with an invalid group ID should affect all groups if (groupId == null || (groupId != Display.INVALID_DISPLAY_GROUP - && !ArrayUtils.contains(mDisplayGroupIds, groupId))) { + && !mPowerGroups.contains(groupId))) { continue; } @@ -2543,8 +2536,8 @@ public final class PowerManagerService extends SystemService } } - for (int groupId : mDisplayGroupIds) { - final PowerGroup powerGroup = mPowerGroups.get(groupId); + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + final PowerGroup powerGroup = mPowerGroups.valueAt(idx); final int wakeLockSummary = adjustWakeLockSummary( powerGroup.getWakefulnessLocked(), invalidGroupWakeLockSummary | powerGroup.getWakeLockSummaryLocked()); @@ -2706,10 +2699,10 @@ public final class PowerManagerService extends SystemService final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager; long nextTimeout = -1; boolean hasUserActivitySummary = false; - for (int groupId : mDisplayGroupIds) { + for (int idx = 0; idx < mPowerGroups.size(); idx++) { int groupUserActivitySummary = 0; long groupNextTimeout = 0; - final PowerGroup powerGroup = mPowerGroups.get(groupId); + final PowerGroup powerGroup = mPowerGroups.valueAt(idx); if (powerGroup.getWakefulnessLocked() != WAKEFULNESS_ASLEEP) { final long lastUserActivityTime = powerGroup.getLastUserActivityTimeLocked(); final long lastUserActivityTimeNoChangeLights = @@ -2789,7 +2782,7 @@ public final class PowerManagerService extends SystemService powerGroup.setUserActivitySummaryLocked(groupUserActivitySummary); if (DEBUG_SPEW) { - Slog.d(TAG, "updateUserActivitySummaryLocked: groupId=" + groupId + Slog.d(TAG, "updateUserActivitySummaryLocked: groupId=" + powerGroup.getGroupId() + ", mWakefulness=" + wakefulnessToString(powerGroup.getWakefulnessLocked()) + ", mUserActivitySummary=0x" + Integer.toHexString( groupUserActivitySummary) @@ -3014,14 +3007,15 @@ public final class PowerManagerService extends SystemService return changed; } final long time = mClock.uptimeMillis(); - for (int id : mDisplayGroupIds) { - final PowerGroup powerGroup = mPowerGroups.get(id); + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + final PowerGroup powerGroup = mPowerGroups.valueAt(idx); if (!(powerGroup.getWakefulnessLocked() == WAKEFULNESS_AWAKE && isItBedTimeYetLocked(powerGroup))) { continue; } if (DEBUG_SPEW) { - Slog.d(TAG, "updateWakefulnessLocked: Bed time for group " + id); + Slog.d(TAG, "updateWakefulnessLocked: Bed time for group " + + powerGroup.getGroupId()); } if (isAttentiveTimeoutExpired(powerGroup, time)) { if (DEBUG) { @@ -3124,10 +3118,11 @@ public final class PowerManagerService extends SystemService private void scheduleSandmanLocked() { if (!mSandmanScheduled) { mSandmanScheduled = true; - for (int id : mDisplayGroupIds) { - if (mPowerGroups.get(id).supportsSandmanLocked()) { + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + final PowerGroup powerGroup = mPowerGroups.valueAt(idx); + if (powerGroup.supportsSandmanLocked()) { Message msg = mHandler.obtainMessage(MSG_SANDMAN); - msg.arg1 = id; + msg.arg1 = powerGroup.getGroupId(); msg.setAsynchronous(true); mHandler.sendMessage(msg); } @@ -3148,7 +3143,7 @@ public final class PowerManagerService extends SystemService final int wakefulness; synchronized (mLock) { mSandmanScheduled = false; - if (!ArrayUtils.contains(mDisplayGroupIds, groupId)) { + if (!mPowerGroups.contains(groupId)) { // Group has been removed. return; } @@ -3184,7 +3179,7 @@ public final class PowerManagerService extends SystemService // Update dream state. synchronized (mLock) { - if (!ArrayUtils.contains(mDisplayGroupIds, groupId)) { + if (!mPowerGroups.contains(groupId)) { // Group has been removed. return; } @@ -3324,8 +3319,9 @@ public final class PowerManagerService extends SystemService } } - for (final int groupId : mDisplayGroupIds) { - final PowerGroup powerGroup = mPowerGroups.get(groupId); + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + final PowerGroup powerGroup = mPowerGroups.valueAt(idx); + final int groupId = powerGroup.getGroupId(); final DisplayPowerRequest displayPowerRequest = powerGroup.getDisplayPowerRequestLocked(); displayPowerRequest.policy = getDesiredScreenPolicyLocked(powerGroup); @@ -3577,8 +3573,8 @@ public final class PowerManagerService extends SystemService final boolean needDisplaySuspendBlocker = needDisplaySuspendBlockerLocked(); final boolean autoSuspend = !needDisplaySuspendBlocker; boolean interactive = false; - for (int id : mDisplayGroupIds) { - interactive |= mPowerGroups.get(id).getDisplayPowerRequestLocked().isBrightOrDim(); + for (int idx = 0; idx < mPowerGroups.size() && !interactive; idx++) { + interactive = mPowerGroups.valueAt(idx).getDisplayPowerRequestLocked().isBrightOrDim(); } // Disable auto-suspend if needed. @@ -3661,9 +3657,9 @@ public final class PowerManagerService extends SystemService return true; } - for (int id : mDisplayGroupIds) { + for (int idx = 0; idx < mPowerGroups.size(); idx++) { final DisplayPowerRequest displayPowerRequest = - mPowerGroups.get(id).getDisplayPowerRequestLocked(); + mPowerGroups.valueAt(idx).getDisplayPowerRequestLocked(); if (displayPowerRequest.isBrightOrDim()) { // If we asked for the screen to be on but it is off due to the proximity // sensor then we may suspend but only if the configuration allows it. @@ -4227,8 +4223,8 @@ public final class PowerManagerService extends SystemService mForceSuspendActive = true; // Place the system in an non-interactive state boolean updatePowerState = false; - for (int id : mDisplayGroupIds) { - updatePowerState |= sleepDisplayGroupNoUpdateLocked(mPowerGroups.get(id), + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + updatePowerState |= sleepDisplayGroupNoUpdateLocked(mPowerGroups.valueAt(idx), mClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_FORCE_SUSPEND, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, uid); } @@ -4530,9 +4526,9 @@ public final class PowerManagerService extends SystemService } pw.println("Display Group User Activity:"); - for (int id : mDisplayGroupIds) { - final PowerGroup powerGroup = mPowerGroups.get(id); - pw.println(" displayGroupId=" + id); + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + final PowerGroup powerGroup = mPowerGroups.valueAt(idx); + pw.println(" displayGroupId=" + powerGroup.getGroupId()); pw.println(" userActivitySummary=0x" + Integer.toHexString( powerGroup.getUserActivitySummaryLocked())); pw.println(" lastUserActivityTime=" + TimeUtils.formatUptime( @@ -4628,11 +4624,12 @@ public final class PowerManagerService extends SystemService proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_DISPATCHED_MS, mNotifyLongDispatched); proto.write(PowerManagerServiceDumpProto.NOTIFY_LONG_NEXT_CHECK_MS, mNotifyLongNextCheck); - for (int id : mDisplayGroupIds) { - final PowerGroup powerGroup = mPowerGroups.get(id); + for (int idx = 0; idx < mPowerGroups.size(); idx++) { + final PowerGroup powerGroup = mPowerGroups.valueAt(idx); final long userActivityToken = proto.start( PowerManagerServiceDumpProto.USER_ACTIVITY); - proto.write(PowerManagerServiceDumpProto.UserActivityProto.DISPLAY_GROUP_ID, id); + proto.write(PowerManagerServiceDumpProto.UserActivityProto.DISPLAY_GROUP_ID, + powerGroup.getGroupId()); final long userActivitySummary = powerGroup.getUserActivitySummaryLocked(); proto.write(PowerManagerServiceDumpProto.UserActivityProto.IS_SCREEN_BRIGHT, (userActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0);