From 3e8abc7702446428357966149a435a35d7206386 Mon Sep 17 00:00:00 2001 From: Paul Hobbs Date: Thu, 19 Jan 2023 00:41:57 +0000 Subject: [PATCH] Revert "[hbm] Separate HBM times for multi-display devices." This reverts commit 5ad9ca6318ded92a7b60152f5a444d63273f2c88. Reason for revert: Likely culprit of b/264418864 Change-Id: Ibf1dba56577561bf3b1455e8a52a630949f0a3cf --- .../server/display/DisplayManagerService.java | 64 +--------- .../display/DisplayPowerController.java | 14 +-- .../display/DisplayPowerController2.java | 15 +-- .../DisplayPowerControllerInterface.java | 8 +- .../com/android/server/display/HbmEvent.java | 46 -------- .../display/HighBrightnessModeController.java | 111 ++++++++++-------- .../display/HighBrightnessModeMetadata.java | 58 --------- .../display/DisplayPowerController2Test.java | 4 +- .../display/DisplayPowerControllerTest.java | 4 +- .../android/server/display/HbmEventTest.java | 57 --------- .../HighBrightnessModeControllerTest.java | 13 +- .../HighBrightnessModeMetadataTest.java | 59 ---------- 12 files changed, 82 insertions(+), 371 deletions(-) delete mode 100644 services/core/java/com/android/server/display/HbmEvent.java delete mode 100644 services/core/java/com/android/server/display/HighBrightnessModeMetadata.java delete mode 100644 services/tests/servicestests/src/com/android/server/display/HbmEventTest.java delete mode 100644 services/tests/servicestests/src/com/android/server/display/HighBrightnessModeMetadataTest.java diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index d44e1dc121c90..110eb1ec214e8 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -108,7 +108,6 @@ import android.os.UserManager; import android.provider.DeviceConfig; import android.provider.Settings; import android.text.TextUtils; -import android.util.ArrayMap; import android.util.ArraySet; import android.util.EventLog; import android.util.IntArray; @@ -260,13 +259,6 @@ public final class DisplayManagerService extends SystemService { final SparseArray> mDisplayWindowPolicyControllers = new SparseArray<>(); - /** - * Map of every internal primary display device {@link HighBrightnessModeMetadata}s indexed by - * {@link DisplayDevice#mUniqueId}. - */ - public final ArrayMap mHighBrightnessModeMetadataMap = - new ArrayMap<>(); - // List of all currently registered display adapters. private final ArrayList mDisplayAdapters = new ArrayList(); @@ -1642,16 +1634,7 @@ public final class DisplayManagerService extends SystemService { DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId); if (dpc != null) { - final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); - if (device == null) { - Slog.wtf(TAG, "Display Device is null in DisplayManagerService for display: " - + display.getDisplayIdLocked()); - return; - } - - final String uniqueId = device.getUniqueId(); - HighBrightnessModeMetadata hbmMetadata = mHighBrightnessModeMetadataMap.get(uniqueId); - dpc.onDisplayChanged(hbmMetadata); + dpc.onDisplayChanged(); } } @@ -1709,15 +1692,7 @@ public final class DisplayManagerService extends SystemService { final int displayId = display.getDisplayIdLocked(); final DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId); if (dpc != null) { - final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); - if (device == null) { - Slog.wtf(TAG, "Display Device is null in DisplayManagerService for display: " - + display.getDisplayIdLocked()); - return; - } - final String uniqueId = device.getUniqueId(); - HighBrightnessModeMetadata hbmMetadata = mHighBrightnessModeMetadataMap.get(uniqueId); - dpc.onDisplayChanged(hbmMetadata); + dpc.onDisplayChanged(); } } @@ -2670,31 +2645,6 @@ public final class DisplayManagerService extends SystemService { mLogicalDisplayMapper.forEachLocked(this::addDisplayPowerControllerLocked); } - private HighBrightnessModeMetadata getHighBrightnessModeMetadata(LogicalDisplay display) { - final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); - if (device == null) { - Slog.wtf(TAG, "Display Device is null in DisplayPowerController for display: " - + display.getDisplayIdLocked()); - return null; - } - - // HBM brightness mode is only applicable to internal physical displays. - if (display.getDisplayInfoLocked().type != Display.TYPE_INTERNAL) { - return null; - } - - final String uniqueId = device.getUniqueId(); - - if (mHighBrightnessModeMetadataMap.containsKey(uniqueId)) { - return mHighBrightnessModeMetadataMap.get(uniqueId); - } - - // HBM Time info not present. Create a new one for this physical display. - HighBrightnessModeMetadata hbmInfo = new HighBrightnessModeMetadata(); - mHighBrightnessModeMetadataMap.put(uniqueId, hbmInfo); - return hbmInfo; - } - @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG) private void addDisplayPowerControllerLocked(LogicalDisplay display) { if (mPowerHandler == null) { @@ -2710,23 +2660,17 @@ public final class DisplayManagerService extends SystemService { display, mSyncRoot); final DisplayPowerControllerInterface displayPowerController; - // If display is internal and has a HighBrightnessModeMetadata mapping, use that. - // Or create a new one and use that. - // We also need to pass a mapping of the HighBrightnessModeTimeInfoMap to - // displayPowerController, so the hbm info can be correctly associated - // with the corresponding displaydevice. - HighBrightnessModeMetadata hbmMetadata = getHighBrightnessModeMetadata(display); if (DeviceConfig.getBoolean("display_manager", "use_newly_structured_display_power_controller", true)) { displayPowerController = new DisplayPowerController2( mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler, mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting, - () -> handleBrightnessChange(display), hbmMetadata); + () -> handleBrightnessChange(display)); } else { displayPowerController = new DisplayPowerController( mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler, mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting, - () -> handleBrightnessChange(display), hbmMetadata); + () -> handleBrightnessChange(display)); } mDisplayPowerControllers.append(display.getDisplayIdLocked(), displayPowerController); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 58a1430bcd4f3..1b8f6e368d26d 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -388,7 +388,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private float[] mNitsRange; private final HighBrightnessModeController mHbmController; - private final HighBrightnessModeMetadata mHighBrightnessModeMetadata; private final BrightnessThrottler mBrightnessThrottler; @@ -506,14 +505,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call DisplayPowerCallbacks callbacks, Handler handler, SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay, BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting, - Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata) { + Runnable onBrightnessChangeRunnable) { mInjector = injector != null ? injector : new Injector(); mClock = mInjector.getClock(); mLogicalDisplay = logicalDisplay; mDisplayId = mLogicalDisplay.getDisplayIdLocked(); mTag = "DisplayPowerController[" + mDisplayId + "]"; - mHighBrightnessModeMetadata = hbmMetadata; mSuspendBlockerIdUnfinishedBusiness = getSuspendBlockerUnfinishedBusinessId(mDisplayId); mSuspendBlockerIdOnStateChanged = getSuspendBlockerOnStateChangedId(mDisplayId); mSuspendBlockerIdProxPositive = getSuspendBlockerProxPositiveId(mDisplayId); @@ -792,7 +790,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call * Make sure DisplayManagerService.mSyncRoot is held when this is called */ @Override - public void onDisplayChanged(HighBrightnessModeMetadata hbmMetadata) { + public void onDisplayChanged() { final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); if (device == null) { Slog.wtf(mTag, "Display Device is null in DisplayPowerController for display: " @@ -814,7 +812,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mUniqueDisplayId = uniqueId; mDisplayStatsId = mUniqueDisplayId.hashCode(); mDisplayDeviceConfig = config; - loadFromDisplayDeviceConfig(token, info, hbmMetadata); + loadFromDisplayDeviceConfig(token, info); // Since the underlying display-device changed, we really don't know the // last command that was sent to change it's state. Lets assume it is off and we @@ -866,8 +864,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } - private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info, - HighBrightnessModeMetadata hbmMetadata) { + private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) { // All properties that depend on the associated DisplayDevice and the DDC must be // updated here. loadBrightnessRampRates(); @@ -880,7 +877,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessRampIncreaseMaxTimeMillis, mBrightnessRampDecreaseMaxTimeMillis); } - mHbmController.setHighBrightnessModeMetadata(hbmMetadata); mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId, mDisplayDeviceConfig.getHighBrightnessModeData(), new HighBrightnessModeController.HdrBrightnessDeviceConfig() { @@ -1965,7 +1961,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.update(); } - }, mHighBrightnessModeMetadata, mContext); + }, mContext); } private BrightnessThrottler createBrightnessThrottlerLocked() { diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index ab2fbba71b3c7..bb8132f33fc58 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -328,7 +328,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal private float[] mNitsRange; private final HighBrightnessModeController mHbmController; - private final HighBrightnessModeMetadata mHighBrightnessModeMetadata; private final BrightnessThrottler mBrightnessThrottler; @@ -433,7 +432,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal DisplayPowerCallbacks callbacks, Handler handler, SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay, BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting, - Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata) { + Runnable onBrightnessChangeRunnable) { mInjector = injector != null ? injector : new Injector(); mClock = mInjector.getClock(); @@ -449,7 +448,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mDisplayPowerProximityStateController = mInjector.getDisplayPowerProximityStateController( mWakelockController, mDisplayDeviceConfig, mHandler.getLooper(), () -> updatePowerState(), mDisplayId, mSensorManager); - mHighBrightnessModeMetadata = hbmMetadata; mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController); mTag = "DisplayPowerController2[" + mDisplayId + "]"; @@ -709,7 +707,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal * Make sure DisplayManagerService.mSyncRoot lock is held when this is called */ @Override - public void onDisplayChanged(HighBrightnessModeMetadata hbmMetadata) { + public void onDisplayChanged() { final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); if (device == null) { Slog.wtf(mTag, "Display Device is null in DisplayPowerController2 for display: " @@ -723,7 +721,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); final boolean isEnabled = mLogicalDisplay.isEnabledLocked(); final boolean isInTransition = mLogicalDisplay.isInTransitionLocked(); - mHandler.post(() -> { boolean changed = false; if (mDisplayDevice != device) { @@ -732,7 +729,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mUniqueDisplayId = uniqueId; mDisplayStatsId = mUniqueDisplayId.hashCode(); mDisplayDeviceConfig = config; - loadFromDisplayDeviceConfig(token, info, hbmMetadata); + loadFromDisplayDeviceConfig(token, info); mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config); // Since the underlying display-device changed, we really don't know the @@ -781,8 +778,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } } - private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info, - HighBrightnessModeMetadata hbmMetadata) { + private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) { // All properties that depend on the associated DisplayDevice and the DDC must be // updated here. loadBrightnessRampRates(); @@ -794,7 +790,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mBrightnessRampIncreaseMaxTimeMillis, mBrightnessRampDecreaseMaxTimeMillis); } - mHbmController.setHighBrightnessModeMetadata(hbmMetadata); mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId, mDisplayDeviceConfig.getHighBrightnessModeData(), new HighBrightnessModeController.HdrBrightnessDeviceConfig() { @@ -1745,7 +1740,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.update(); } - }, mHighBrightnessModeMetadata, mContext); + }, mContext); } private BrightnessThrottler createBrightnessThrottlerLocked() { diff --git a/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java b/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java index 7b0198465e685..e750ee2814134 100644 --- a/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java +++ b/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java @@ -31,14 +31,10 @@ import java.io.PrintWriter; public interface DisplayPowerControllerInterface { /** - * Notified when the display is changed. - * We use this to apply any changes that might be needed + * Notified when the display is changed. We use this to apply any changes that might be needed * when displays get swapped on foldable devices. - * We also pass the High brightness mode metadata like - * remaining time and hbm events for the corresponding - * physical display, to update the values correctly. */ - void onDisplayChanged(HighBrightnessModeMetadata hbmInfo); + void onDisplayChanged(); /** * Unregisters all listeners and interrupts all running threads; halting future work. diff --git a/services/core/java/com/android/server/display/HbmEvent.java b/services/core/java/com/android/server/display/HbmEvent.java deleted file mode 100644 index 5675e2f69230b..0000000000000 --- a/services/core/java/com/android/server/display/HbmEvent.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.display; - - -/** - * Represents an event in which High Brightness Mode was enabled. - */ -class HbmEvent { - private long mStartTimeMillis; - private long mEndTimeMillis; - - HbmEvent(long startTimeMillis, long endTimeMillis) { - this.mStartTimeMillis = startTimeMillis; - this.mEndTimeMillis = endTimeMillis; - } - - public long getStartTimeMillis() { - return mStartTimeMillis; - } - - public long getEndTimeMillis() { - return mEndTimeMillis; - } - - @Override - public String toString() { - return "HbmEvent: {startTimeMillis:" + mStartTimeMillis + ", endTimeMillis: " - + mEndTimeMillis + "}, total: " - + ((mEndTimeMillis - mStartTimeMillis) / 1000) + "]"; - } -} diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java index 2c843a4222dd5..f98c7dff97e34 100644 --- a/services/core/java/com/android/server/display/HighBrightnessModeController.java +++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java @@ -105,23 +105,30 @@ class HighBrightnessModeController { private int mHbmStatsState = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF; /** - * If HBM is currently running, this is the start time and set of all events, - * for the current HBM session. + * If HBM is currently running, this is the start time for the current HBM session. */ - private HighBrightnessModeMetadata mHighBrightnessModeMetadata = null; + private long mRunningStartTimeMillis = -1; + + /** + * Queue of previous HBM-events ordered from most recent to least recent. + * Meant to store only the events that fall into the most recent + * {@link HighBrightnessModeData#timeWindowMillis mHbmData.timeWindowMillis}. + */ + private final ArrayDeque mEvents = new ArrayDeque<>(); + HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg, - Runnable hbmChangeCallback, HighBrightnessModeMetadata hbmMetadata, Context context) { + Runnable hbmChangeCallback, Context context) { this(new Injector(), handler, width, height, displayToken, displayUniqueId, brightnessMin, - brightnessMax, hbmData, hdrBrightnessCfg, hbmChangeCallback, hbmMetadata, context); + brightnessMax, hbmData, hdrBrightnessCfg, hbmChangeCallback, context); } @VisibleForTesting HighBrightnessModeController(Injector injector, Handler handler, int width, int height, IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg, - Runnable hbmChangeCallback, HighBrightnessModeMetadata hbmMetadata, Context context) { + Runnable hbmChangeCallback, Context context) { mInjector = injector; mContext = context; mClock = injector.getClock(); @@ -130,7 +137,6 @@ class HighBrightnessModeController { mBrightnessMin = brightnessMin; mBrightnessMax = brightnessMax; mHbmChangeCallback = hbmChangeCallback; - mHighBrightnessModeMetadata = hbmMetadata; mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler); mSettingsObserver = new SettingsObserver(mHandler); mRecalcRunnable = this::recalculateTimeAllowance; @@ -216,22 +222,19 @@ class HighBrightnessModeController { // If we are starting or ending a high brightness mode session, store the current // session in mRunningStartTimeMillis, or the old one in mEvents. - final long runningStartTime = mHighBrightnessModeMetadata.getRunningStartTimeMillis(); - final boolean wasHbmDrainingAvailableTime = runningStartTime != -1; + final boolean wasHbmDrainingAvailableTime = mRunningStartTimeMillis != -1; final boolean shouldHbmDrainAvailableTime = mBrightness > mHbmData.transitionPoint && !mIsHdrLayerPresent; if (wasHbmDrainingAvailableTime != shouldHbmDrainAvailableTime) { final long currentTime = mClock.uptimeMillis(); if (shouldHbmDrainAvailableTime) { - mHighBrightnessModeMetadata.setRunningStartTimeMillis(currentTime); + mRunningStartTimeMillis = currentTime; } else { - final HbmEvent hbmEvent = new HbmEvent(runningStartTime, currentTime); - mHighBrightnessModeMetadata.addHbmEvent(hbmEvent); - mHighBrightnessModeMetadata.setRunningStartTimeMillis(-1); + mEvents.addFirst(new HbmEvent(mRunningStartTimeMillis, currentTime)); + mRunningStartTimeMillis = -1; if (DEBUG) { - Slog.d(TAG, "New HBM event: " - + mHighBrightnessModeMetadata.getHbmEventQueue().peekFirst()); + Slog.d(TAG, "New HBM event: " + mEvents.peekFirst()); } } } @@ -257,10 +260,6 @@ class HighBrightnessModeController { mSettingsObserver.stopObserving(); } - void setHighBrightnessModeMetadata(HighBrightnessModeMetadata hbmInfo) { - mHighBrightnessModeMetadata = hbmInfo; - } - void resetHbmData(int width, int height, IBinder displayToken, String displayUniqueId, HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg) { mWidth = width; @@ -317,22 +316,20 @@ class HighBrightnessModeController { pw.println(" mBrightnessMax=" + mBrightnessMax); pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis())); pw.println(" mIsTimeAvailable= " + mIsTimeAvailable); - pw.println(" mRunningStartTimeMillis=" - + TimeUtils.formatUptime(mHighBrightnessModeMetadata.getRunningStartTimeMillis())); + pw.println(" mRunningStartTimeMillis=" + TimeUtils.formatUptime(mRunningStartTimeMillis)); pw.println(" mIsThermalStatusWithinLimit=" + mIsThermalStatusWithinLimit); pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode); pw.println(" width*height=" + mWidth + "*" + mHeight); pw.println(" mEvents="); final long currentTime = mClock.uptimeMillis(); long lastStartTime = currentTime; - long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis(); - if (runningStartTimeMillis != -1) { - lastStartTime = dumpHbmEvent(pw, new HbmEvent(runningStartTimeMillis, currentTime)); + if (mRunningStartTimeMillis != -1) { + lastStartTime = dumpHbmEvent(pw, new HbmEvent(mRunningStartTimeMillis, currentTime)); } - for (HbmEvent event : mHighBrightnessModeMetadata.getHbmEventQueue()) { - if (lastStartTime > event.getEndTimeMillis()) { + for (HbmEvent event : mEvents) { + if (lastStartTime > event.endTimeMillis) { pw.println(" event: [normal brightness]: " - + TimeUtils.formatDuration(lastStartTime - event.getEndTimeMillis())); + + TimeUtils.formatDuration(lastStartTime - event.endTimeMillis)); } lastStartTime = dumpHbmEvent(pw, event); } @@ -341,12 +338,12 @@ class HighBrightnessModeController { } private long dumpHbmEvent(PrintWriter pw, HbmEvent event) { - final long duration = event.getEndTimeMillis() - event.getStartTimeMillis(); + final long duration = event.endTimeMillis - event.startTimeMillis; pw.println(" event: [" - + TimeUtils.formatUptime(event.getStartTimeMillis()) + ", " - + TimeUtils.formatUptime(event.getEndTimeMillis()) + "] (" + + TimeUtils.formatUptime(event.startTimeMillis) + ", " + + TimeUtils.formatUptime(event.endTimeMillis) + "] (" + TimeUtils.formatDuration(duration) + ")"); - return event.getStartTimeMillis(); + return event.startTimeMillis; } private boolean isCurrentlyAllowed() { @@ -375,15 +372,13 @@ class HighBrightnessModeController { // First, lets see how much time we've taken for any currently running // session of HBM. - long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis(); - if (runningStartTimeMillis > 0) { - if (runningStartTimeMillis > currentTime) { + if (mRunningStartTimeMillis > 0) { + if (mRunningStartTimeMillis > currentTime) { Slog.e(TAG, "Start time set to the future. curr: " + currentTime - + ", start: " + runningStartTimeMillis); - mHighBrightnessModeMetadata.setRunningStartTimeMillis(currentTime); - runningStartTimeMillis = currentTime; + + ", start: " + mRunningStartTimeMillis); + mRunningStartTimeMillis = currentTime; } - timeAlreadyUsed = currentTime - runningStartTimeMillis; + timeAlreadyUsed = currentTime - mRunningStartTimeMillis; } if (DEBUG) { @@ -392,19 +387,18 @@ class HighBrightnessModeController { // Next, lets iterate through the history of previous sessions and add those times. final long windowstartTimeMillis = currentTime - mHbmData.timeWindowMillis; - Iterator it = mHighBrightnessModeMetadata.getHbmEventQueue().iterator(); + Iterator it = mEvents.iterator(); while (it.hasNext()) { final HbmEvent event = it.next(); // If this event ended before the current Timing window, discard forever and ever. - if (event.getEndTimeMillis() < windowstartTimeMillis) { + if (event.endTimeMillis < windowstartTimeMillis) { it.remove(); continue; } - final long startTimeMillis = Math.max(event.getStartTimeMillis(), - windowstartTimeMillis); - timeAlreadyUsed += event.getEndTimeMillis() - startTimeMillis; + final long startTimeMillis = Math.max(event.startTimeMillis, windowstartTimeMillis); + timeAlreadyUsed += event.endTimeMillis - startTimeMillis; } if (DEBUG) { @@ -431,18 +425,17 @@ class HighBrightnessModeController { // Calculate the time at which we want to recalculate mIsTimeAvailable in case a lux or // brightness change doesn't happen before then. long nextTimeout = -1; - final ArrayDeque hbmEvents = mHighBrightnessModeMetadata.getHbmEventQueue(); if (mBrightness > mHbmData.transitionPoint) { // if we're in high-lux now, timeout when we run out of allowed time. nextTimeout = currentTime + remainingTime; - } else if (!mIsTimeAvailable && hbmEvents.size() > 0) { + } else if (!mIsTimeAvailable && mEvents.size() > 0) { // If we are not allowed...timeout when the oldest event moved outside of the timing // window by at least minTime. Basically, we're calculating the soonest time we can // get {@code timeMinMillis} back to us. final long windowstartTimeMillis = currentTime - mHbmData.timeWindowMillis; - final HbmEvent lastEvent = hbmEvents.peekLast(); + final HbmEvent lastEvent = mEvents.peekLast(); final long startTimePlusMinMillis = - Math.max(windowstartTimeMillis, lastEvent.getStartTimeMillis()) + Math.max(windowstartTimeMillis, lastEvent.startTimeMillis) + mHbmData.timeMinMillis; final long timeWhenMinIsGainedBack = currentTime + (startTimePlusMinMillis - windowstartTimeMillis) - remainingTime; @@ -466,10 +459,9 @@ class HighBrightnessModeController { + ", mUnthrottledBrightness: " + mUnthrottledBrightness + ", mThrottlingReason: " + BrightnessInfo.briMaxReasonToString(mThrottlingReason) - + ", RunningStartTimeMillis: " - + mHighBrightnessModeMetadata.getRunningStartTimeMillis() + + ", RunningStartTimeMillis: " + mRunningStartTimeMillis + ", nextTimeout: " + (nextTimeout != -1 ? (nextTimeout - currentTime) : -1) - + ", events: " + hbmEvents); + + ", events: " + mEvents); } if (nextTimeout != -1) { @@ -596,6 +588,25 @@ class HighBrightnessModeController { } } + /** + * Represents an event in which High Brightness Mode was enabled. + */ + private static class HbmEvent { + public long startTimeMillis; + public long endTimeMillis; + + HbmEvent(long startTimeMillis, long endTimeMillis) { + this.startTimeMillis = startTimeMillis; + this.endTimeMillis = endTimeMillis; + } + + @Override + public String toString() { + return "[Event: {" + startTimeMillis + ", " + endTimeMillis + "}, total: " + + ((endTimeMillis - startTimeMillis) / 1000) + "]"; + } + } + @VisibleForTesting class HdrListener extends SurfaceControlHdrLayerInfoListener { @Override diff --git a/services/core/java/com/android/server/display/HighBrightnessModeMetadata.java b/services/core/java/com/android/server/display/HighBrightnessModeMetadata.java deleted file mode 100644 index 37234ff0bf192..0000000000000 --- a/services/core/java/com/android/server/display/HighBrightnessModeMetadata.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.display; - -import java.util.ArrayDeque; - - -/** - * Represents High Brightness Mode metadata associated - * with a specific internal physical display. - * Required for separately storing data like time information, - * and related events when display was in HBM mode per - * physical internal display. - */ -class HighBrightnessModeMetadata { - /** - * Queue of previous HBM-events ordered from most recent to least recent. - * Meant to store only the events that fall into the most recent - * {@link HighBrightnessModeData#timeWindowMillis mHbmData.timeWindowMillis}. - */ - private final ArrayDeque mEvents = new ArrayDeque<>(); - - /** - * If HBM is currently running, this is the start time for the current HBM session. - */ - private long mRunningStartTimeMillis = -1; - - public long getRunningStartTimeMillis() { - return mRunningStartTimeMillis; - } - - public void setRunningStartTimeMillis(long setTime) { - mRunningStartTimeMillis = setTime; - } - - public ArrayDeque getHbmEventQueue() { - return mEvents; - } - - public void addHbmEvent(HbmEvent hbmEvent) { - mEvents.addFirst(hbmEvent); - } -} - diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index 2a790a1c8e57b..f2cba40685e41 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -80,8 +80,6 @@ public final class DisplayPowerController2Test { @Mock private DisplayBlanker mDisplayBlankerMock; @Mock - private HighBrightnessModeMetadata mHighBrightnessModeMetadataMock; - @Mock private LogicalDisplay mLogicalDisplayMock; @Mock private DisplayDevice mDisplayDeviceMock; @@ -171,7 +169,7 @@ public final class DisplayPowerController2Test { mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler, mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock, mBrightnessTrackerMock, mBrightnessSettingMock, () -> { - }, mHighBrightnessModeMetadataMock); + }); when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON); // send a display power request diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index d99ed7877ca8a..4f8cb8876b3f5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -84,8 +84,6 @@ public final class DisplayPowerControllerTest { @Mock private DisplayDevice mDisplayDeviceMock; @Mock - private HighBrightnessModeMetadata mHighBrightnessModeMetadataMock; - @Mock private BrightnessTracker mBrightnessTrackerMock; @Mock private BrightnessSetting mBrightnessSettingMock; @@ -153,7 +151,7 @@ public final class DisplayPowerControllerTest { mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler, mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock, mBrightnessTrackerMock, mBrightnessSettingMock, () -> { - }, mHighBrightnessModeMetadataMock); + }); when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON); // send a display power request diff --git a/services/tests/servicestests/src/com/android/server/display/HbmEventTest.java b/services/tests/servicestests/src/com/android/server/display/HbmEventTest.java deleted file mode 100644 index 24fc34849829d..0000000000000 --- a/services/tests/servicestests/src/com/android/server/display/HbmEventTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.display; - -import static org.junit.Assert.assertEquals; - - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@SmallTest -@RunWith(AndroidJUnit4.class) -public final class HbmEventTest { - private long mStartTimeMillis; - private long mEndTimeMillis; - private HbmEvent mHbmEvent; - - @Before - public void setUp() { - mStartTimeMillis = 10; - mEndTimeMillis = 20; - mHbmEvent = new HbmEvent(mStartTimeMillis, mEndTimeMillis); - } - - @Test - public void getCorrectValues() { - assertEquals(mHbmEvent.getStartTimeMillis(), mStartTimeMillis); - assertEquals(mHbmEvent.getEndTimeMillis(), mEndTimeMillis); - } - - @Test - public void toStringGeneratesExpectedString() { - String actualString = mHbmEvent.toString(); - String expectedString = "HbmEvent: {startTimeMillis:" + mStartTimeMillis - + ", endTimeMillis: " + mEndTimeMillis + "}, total: " - + ((mEndTimeMillis - mStartTimeMillis) / 1000) + "]"; - assertEquals(actualString, expectedString); - } -} diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java index 2655c3f058099..a1e5ce74014b5 100644 --- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java @@ -96,7 +96,6 @@ public class HighBrightnessModeControllerTest { private Binder mDisplayToken; private String mDisplayUniqueId; private Context mContextSpy; - private HighBrightnessModeMetadata mHighBrightnessModeMetadata; @Rule public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule(); @@ -119,7 +118,6 @@ public class HighBrightnessModeControllerTest { mTestLooper = new TestLooper(mClock::now); mDisplayToken = null; mDisplayUniqueId = "unique_id"; - mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContextSpy); when(mContextSpy.getContentResolver()).thenReturn(resolver); @@ -136,8 +134,7 @@ public class HighBrightnessModeControllerTest { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, - mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {}, - null, mContextSpy); + mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {}, mContextSpy); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); assertEquals(hbmc.getTransitionPoint(), HBM_TRANSITION_POINT_INVALID, 0.0f); } @@ -147,8 +144,7 @@ public class HighBrightnessModeControllerTest { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, - mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {}, - null, mContextSpy); + mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {}, mContextSpy); hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED); hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); @@ -703,12 +699,9 @@ public class HighBrightnessModeControllerTest { // Creates instance with standard initialization values. private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) { initHandler(clock); - if (mHighBrightnessModeMetadata == null) { - mHighBrightnessModeMetadata = new HighBrightnessModeMetadata(); - } return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, - DEFAULT_HBM_DATA, null, () -> {}, mHighBrightnessModeMetadata, mContextSpy); + DEFAULT_HBM_DATA, null, () -> {}, mContextSpy); } private void initHandler(OffsettableClock clock) { diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeMetadataTest.java b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeMetadataTest.java deleted file mode 100644 index ede54e096ad0e..0000000000000 --- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeMetadataTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.display; - -import static org.junit.Assert.assertEquals; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - - -@SmallTest -@RunWith(AndroidJUnit4.class) -public final class HighBrightnessModeMetadataTest { - private HighBrightnessModeMetadata mHighBrightnessModeMetadata; - - private long mRunningStartTimeMillis = -1; - - @Before - public void setUp() { - mHighBrightnessModeMetadata = new HighBrightnessModeMetadata(); - } - - @Test - public void checkDefaultValues() { - assertEquals(mHighBrightnessModeMetadata.getRunningStartTimeMillis(), - mRunningStartTimeMillis); - assertEquals(mHighBrightnessModeMetadata.getHbmEventQueue().size(), 0); - } - - @Test - public void checkSetValues() { - mRunningStartTimeMillis = 10; - mHighBrightnessModeMetadata.setRunningStartTimeMillis(mRunningStartTimeMillis); - assertEquals(mHighBrightnessModeMetadata.getRunningStartTimeMillis(), - mRunningStartTimeMillis); - HbmEvent expectedHbmEvent = new HbmEvent(10, 20); - mHighBrightnessModeMetadata.addHbmEvent(expectedHbmEvent); - HbmEvent actualHbmEvent = mHighBrightnessModeMetadata.getHbmEventQueue().peekFirst(); - assertEquals(expectedHbmEvent.toString(), actualHbmEvent.toString()); - } -}