Revert "Revert "Revert "Revert "[hbm] Separate HBM times for multi-display devices.""""
This reverts commit 205b2c7bb0.
Reason for revert: Fixing original issue in this same CL.
Change-Id: Idf45b87782a56bcbc09fc37c69fcc13531edf76f
This commit is contained in:
committed by
Paul Hobbs
parent
205b2c7bb0
commit
d3bc4913e0
@@ -108,6 +108,7 @@ import android.os.UserManager;
|
|||||||
import android.provider.DeviceConfig;
|
import android.provider.DeviceConfig;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.EventLog;
|
import android.util.EventLog;
|
||||||
import android.util.IntArray;
|
import android.util.IntArray;
|
||||||
@@ -259,6 +260,13 @@ public final class DisplayManagerService extends SystemService {
|
|||||||
final SparseArray<Pair<IVirtualDevice, DisplayWindowPolicyController>>
|
final SparseArray<Pair<IVirtualDevice, DisplayWindowPolicyController>>
|
||||||
mDisplayWindowPolicyControllers = new SparseArray<>();
|
mDisplayWindowPolicyControllers = new SparseArray<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of every internal primary display device {@link HighBrightnessModeMetadata}s indexed by
|
||||||
|
* {@link DisplayDevice#mUniqueId}.
|
||||||
|
*/
|
||||||
|
public final ArrayMap<String, HighBrightnessModeMetadata> mHighBrightnessModeMetadataMap =
|
||||||
|
new ArrayMap<>();
|
||||||
|
|
||||||
// List of all currently registered display adapters.
|
// List of all currently registered display adapters.
|
||||||
private final ArrayList<DisplayAdapter> mDisplayAdapters = new ArrayList<DisplayAdapter>();
|
private final ArrayList<DisplayAdapter> mDisplayAdapters = new ArrayList<DisplayAdapter>();
|
||||||
|
|
||||||
@@ -1634,7 +1642,16 @@ public final class DisplayManagerService extends SystemService {
|
|||||||
|
|
||||||
DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
|
DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
|
||||||
if (dpc != null) {
|
if (dpc != null) {
|
||||||
dpc.onDisplayChanged();
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1692,7 +1709,15 @@ public final class DisplayManagerService extends SystemService {
|
|||||||
final int displayId = display.getDisplayIdLocked();
|
final int displayId = display.getDisplayIdLocked();
|
||||||
final DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
|
final DisplayPowerControllerInterface dpc = mDisplayPowerControllers.get(displayId);
|
||||||
if (dpc != null) {
|
if (dpc != null) {
|
||||||
dpc.onDisplayChanged();
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2645,6 +2670,26 @@ public final class DisplayManagerService extends SystemService {
|
|||||||
mLogicalDisplayMapper.forEachLocked(this::addDisplayPowerControllerLocked);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
@RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
|
||||||
private void addDisplayPowerControllerLocked(LogicalDisplay display) {
|
private void addDisplayPowerControllerLocked(LogicalDisplay display) {
|
||||||
if (mPowerHandler == null) {
|
if (mPowerHandler == null) {
|
||||||
@@ -2660,17 +2705,23 @@ public final class DisplayManagerService extends SystemService {
|
|||||||
display, mSyncRoot);
|
display, mSyncRoot);
|
||||||
final DisplayPowerControllerInterface displayPowerController;
|
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",
|
if (DeviceConfig.getBoolean("display_manager",
|
||||||
"use_newly_structured_display_power_controller", true)) {
|
"use_newly_structured_display_power_controller", true)) {
|
||||||
displayPowerController = new DisplayPowerController2(
|
displayPowerController = new DisplayPowerController2(
|
||||||
mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
|
mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
|
||||||
mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
|
mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
|
||||||
() -> handleBrightnessChange(display));
|
() -> handleBrightnessChange(display), hbmMetadata);
|
||||||
} else {
|
} else {
|
||||||
displayPowerController = new DisplayPowerController(
|
displayPowerController = new DisplayPowerController(
|
||||||
mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
|
mContext, /* injector= */ null, mDisplayPowerCallbacks, mPowerHandler,
|
||||||
mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
|
mSensorManager, mDisplayBlanker, display, mBrightnessTracker, brightnessSetting,
|
||||||
() -> handleBrightnessChange(display));
|
() -> handleBrightnessChange(display), hbmMetadata);
|
||||||
}
|
}
|
||||||
mDisplayPowerControllers.append(display.getDisplayIdLocked(), displayPowerController);
|
mDisplayPowerControllers.append(display.getDisplayIdLocked(), displayPowerController);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -388,6 +388,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
private float[] mNitsRange;
|
private float[] mNitsRange;
|
||||||
|
|
||||||
private final HighBrightnessModeController mHbmController;
|
private final HighBrightnessModeController mHbmController;
|
||||||
|
private final HighBrightnessModeMetadata mHighBrightnessModeMetadata;
|
||||||
|
|
||||||
private final BrightnessThrottler mBrightnessThrottler;
|
private final BrightnessThrottler mBrightnessThrottler;
|
||||||
|
|
||||||
@@ -505,13 +506,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
DisplayPowerCallbacks callbacks, Handler handler,
|
DisplayPowerCallbacks callbacks, Handler handler,
|
||||||
SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
|
SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
|
||||||
BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
|
BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
|
||||||
Runnable onBrightnessChangeRunnable) {
|
Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata) {
|
||||||
|
|
||||||
mInjector = injector != null ? injector : new Injector();
|
mInjector = injector != null ? injector : new Injector();
|
||||||
mClock = mInjector.getClock();
|
mClock = mInjector.getClock();
|
||||||
mLogicalDisplay = logicalDisplay;
|
mLogicalDisplay = logicalDisplay;
|
||||||
mDisplayId = mLogicalDisplay.getDisplayIdLocked();
|
mDisplayId = mLogicalDisplay.getDisplayIdLocked();
|
||||||
mTag = "DisplayPowerController[" + mDisplayId + "]";
|
mTag = "DisplayPowerController[" + mDisplayId + "]";
|
||||||
|
mHighBrightnessModeMetadata = hbmMetadata;
|
||||||
mSuspendBlockerIdUnfinishedBusiness = getSuspendBlockerUnfinishedBusinessId(mDisplayId);
|
mSuspendBlockerIdUnfinishedBusiness = getSuspendBlockerUnfinishedBusinessId(mDisplayId);
|
||||||
mSuspendBlockerIdOnStateChanged = getSuspendBlockerOnStateChangedId(mDisplayId);
|
mSuspendBlockerIdOnStateChanged = getSuspendBlockerOnStateChangedId(mDisplayId);
|
||||||
mSuspendBlockerIdProxPositive = getSuspendBlockerProxPositiveId(mDisplayId);
|
mSuspendBlockerIdProxPositive = getSuspendBlockerProxPositiveId(mDisplayId);
|
||||||
@@ -790,7 +792,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
* Make sure DisplayManagerService.mSyncRoot is held when this is called
|
* Make sure DisplayManagerService.mSyncRoot is held when this is called
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onDisplayChanged() {
|
public void onDisplayChanged(HighBrightnessModeMetadata hbmMetadata) {
|
||||||
final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
|
final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
Slog.wtf(mTag, "Display Device is null in DisplayPowerController for display: "
|
Slog.wtf(mTag, "Display Device is null in DisplayPowerController for display: "
|
||||||
@@ -812,7 +814,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
mUniqueDisplayId = uniqueId;
|
mUniqueDisplayId = uniqueId;
|
||||||
mDisplayStatsId = mUniqueDisplayId.hashCode();
|
mDisplayStatsId = mUniqueDisplayId.hashCode();
|
||||||
mDisplayDeviceConfig = config;
|
mDisplayDeviceConfig = config;
|
||||||
loadFromDisplayDeviceConfig(token, info);
|
loadFromDisplayDeviceConfig(token, info, hbmMetadata);
|
||||||
|
|
||||||
// Since the underlying display-device changed, we really don't know the
|
// 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
|
// last command that was sent to change it's state. Lets assume it is off and we
|
||||||
@@ -864,7 +866,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
|
private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info,
|
||||||
|
HighBrightnessModeMetadata hbmMetadata) {
|
||||||
// All properties that depend on the associated DisplayDevice and the DDC must be
|
// All properties that depend on the associated DisplayDevice and the DDC must be
|
||||||
// updated here.
|
// updated here.
|
||||||
loadBrightnessRampRates();
|
loadBrightnessRampRates();
|
||||||
@@ -877,6 +880,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
mBrightnessRampIncreaseMaxTimeMillis,
|
mBrightnessRampIncreaseMaxTimeMillis,
|
||||||
mBrightnessRampDecreaseMaxTimeMillis);
|
mBrightnessRampDecreaseMaxTimeMillis);
|
||||||
}
|
}
|
||||||
|
mHbmController.setHighBrightnessModeMetadata(hbmMetadata);
|
||||||
mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
|
mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
|
||||||
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
||||||
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
||||||
@@ -1961,7 +1965,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
|||||||
if (mAutomaticBrightnessController != null) {
|
if (mAutomaticBrightnessController != null) {
|
||||||
mAutomaticBrightnessController.update();
|
mAutomaticBrightnessController.update();
|
||||||
}
|
}
|
||||||
}, mContext);
|
}, mHighBrightnessModeMetadata, mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BrightnessThrottler createBrightnessThrottlerLocked() {
|
private BrightnessThrottler createBrightnessThrottlerLocked() {
|
||||||
|
|||||||
@@ -328,6 +328,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
private float[] mNitsRange;
|
private float[] mNitsRange;
|
||||||
|
|
||||||
private final HighBrightnessModeController mHbmController;
|
private final HighBrightnessModeController mHbmController;
|
||||||
|
private final HighBrightnessModeMetadata mHighBrightnessModeMetadata;
|
||||||
|
|
||||||
private final BrightnessThrottler mBrightnessThrottler;
|
private final BrightnessThrottler mBrightnessThrottler;
|
||||||
|
|
||||||
@@ -432,7 +433,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
DisplayPowerCallbacks callbacks, Handler handler,
|
DisplayPowerCallbacks callbacks, Handler handler,
|
||||||
SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
|
SensorManager sensorManager, DisplayBlanker blanker, LogicalDisplay logicalDisplay,
|
||||||
BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
|
BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting,
|
||||||
Runnable onBrightnessChangeRunnable) {
|
Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata) {
|
||||||
|
|
||||||
mInjector = injector != null ? injector : new Injector();
|
mInjector = injector != null ? injector : new Injector();
|
||||||
mClock = mInjector.getClock();
|
mClock = mInjector.getClock();
|
||||||
@@ -448,6 +449,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
mDisplayPowerProximityStateController = mInjector.getDisplayPowerProximityStateController(
|
mDisplayPowerProximityStateController = mInjector.getDisplayPowerProximityStateController(
|
||||||
mWakelockController, mDisplayDeviceConfig, mHandler.getLooper(),
|
mWakelockController, mDisplayDeviceConfig, mHandler.getLooper(),
|
||||||
() -> updatePowerState(), mDisplayId, mSensorManager);
|
() -> updatePowerState(), mDisplayId, mSensorManager);
|
||||||
|
mHighBrightnessModeMetadata = hbmMetadata;
|
||||||
mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController);
|
mDisplayStateController = new DisplayStateController(mDisplayPowerProximityStateController);
|
||||||
mTag = "DisplayPowerController2[" + mDisplayId + "]";
|
mTag = "DisplayPowerController2[" + mDisplayId + "]";
|
||||||
|
|
||||||
@@ -707,7 +709,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
* Make sure DisplayManagerService.mSyncRoot lock is held when this is called
|
* Make sure DisplayManagerService.mSyncRoot lock is held when this is called
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onDisplayChanged() {
|
public void onDisplayChanged(HighBrightnessModeMetadata hbmMetadata) {
|
||||||
final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
|
final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked();
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
Slog.wtf(mTag, "Display Device is null in DisplayPowerController2 for display: "
|
Slog.wtf(mTag, "Display Device is null in DisplayPowerController2 for display: "
|
||||||
@@ -721,6 +723,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
|
final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
|
||||||
final boolean isEnabled = mLogicalDisplay.isEnabledLocked();
|
final boolean isEnabled = mLogicalDisplay.isEnabledLocked();
|
||||||
final boolean isInTransition = mLogicalDisplay.isInTransitionLocked();
|
final boolean isInTransition = mLogicalDisplay.isInTransitionLocked();
|
||||||
|
|
||||||
mHandler.post(() -> {
|
mHandler.post(() -> {
|
||||||
boolean changed = false;
|
boolean changed = false;
|
||||||
if (mDisplayDevice != device) {
|
if (mDisplayDevice != device) {
|
||||||
@@ -729,7 +732,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
mUniqueDisplayId = uniqueId;
|
mUniqueDisplayId = uniqueId;
|
||||||
mDisplayStatsId = mUniqueDisplayId.hashCode();
|
mDisplayStatsId = mUniqueDisplayId.hashCode();
|
||||||
mDisplayDeviceConfig = config;
|
mDisplayDeviceConfig = config;
|
||||||
loadFromDisplayDeviceConfig(token, info);
|
loadFromDisplayDeviceConfig(token, info, hbmMetadata);
|
||||||
mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config);
|
mDisplayPowerProximityStateController.notifyDisplayDeviceChanged(config);
|
||||||
|
|
||||||
// Since the underlying display-device changed, we really don't know the
|
// Since the underlying display-device changed, we really don't know the
|
||||||
@@ -778,7 +781,8 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
|
private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info,
|
||||||
|
HighBrightnessModeMetadata hbmMetadata) {
|
||||||
// All properties that depend on the associated DisplayDevice and the DDC must be
|
// All properties that depend on the associated DisplayDevice and the DDC must be
|
||||||
// updated here.
|
// updated here.
|
||||||
loadBrightnessRampRates();
|
loadBrightnessRampRates();
|
||||||
@@ -790,6 +794,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
mBrightnessRampIncreaseMaxTimeMillis,
|
mBrightnessRampIncreaseMaxTimeMillis,
|
||||||
mBrightnessRampDecreaseMaxTimeMillis);
|
mBrightnessRampDecreaseMaxTimeMillis);
|
||||||
}
|
}
|
||||||
|
mHbmController.setHighBrightnessModeMetadata(hbmMetadata);
|
||||||
mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
|
mHbmController.resetHbmData(info.width, info.height, token, info.uniqueId,
|
||||||
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
mDisplayDeviceConfig.getHighBrightnessModeData(),
|
||||||
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
|
||||||
@@ -1740,7 +1745,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
|
|||||||
if (mAutomaticBrightnessController != null) {
|
if (mAutomaticBrightnessController != null) {
|
||||||
mAutomaticBrightnessController.update();
|
mAutomaticBrightnessController.update();
|
||||||
}
|
}
|
||||||
}, mContext);
|
}, mHighBrightnessModeMetadata, mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BrightnessThrottler createBrightnessThrottlerLocked() {
|
private BrightnessThrottler createBrightnessThrottlerLocked() {
|
||||||
|
|||||||
@@ -31,10 +31,14 @@ import java.io.PrintWriter;
|
|||||||
public interface DisplayPowerControllerInterface {
|
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.
|
* 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();
|
void onDisplayChanged(HighBrightnessModeMetadata hbmInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregisters all listeners and interrupts all running threads; halting future work.
|
* Unregisters all listeners and interrupts all running threads; halting future work.
|
||||||
|
|||||||
46
services/core/java/com/android/server/display/HbmEvent.java
Normal file
46
services/core/java/com/android/server/display/HbmEvent.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* 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) + "]";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -105,30 +105,23 @@ class HighBrightnessModeController {
|
|||||||
private int mHbmStatsState = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF;
|
private int mHbmStatsState = FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__STATE__HBM_OFF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If HBM is currently running, this is the start time for the current HBM session.
|
* If HBM is currently running, this is the start time and set of all events,
|
||||||
|
* for the current HBM session.
|
||||||
*/
|
*/
|
||||||
private long mRunningStartTimeMillis = -1;
|
private HighBrightnessModeMetadata mHighBrightnessModeMetadata = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* 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<HbmEvent> mEvents = new ArrayDeque<>();
|
|
||||||
|
|
||||||
HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken,
|
HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken,
|
||||||
String displayUniqueId, float brightnessMin, float brightnessMax,
|
String displayUniqueId, float brightnessMin, float brightnessMax,
|
||||||
HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg,
|
HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg,
|
||||||
Runnable hbmChangeCallback, Context context) {
|
Runnable hbmChangeCallback, HighBrightnessModeMetadata hbmMetadata, Context context) {
|
||||||
this(new Injector(), handler, width, height, displayToken, displayUniqueId, brightnessMin,
|
this(new Injector(), handler, width, height, displayToken, displayUniqueId, brightnessMin,
|
||||||
brightnessMax, hbmData, hdrBrightnessCfg, hbmChangeCallback, context);
|
brightnessMax, hbmData, hdrBrightnessCfg, hbmChangeCallback, hbmMetadata, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
HighBrightnessModeController(Injector injector, Handler handler, int width, int height,
|
HighBrightnessModeController(Injector injector, Handler handler, int width, int height,
|
||||||
IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax,
|
IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax,
|
||||||
HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg,
|
HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg,
|
||||||
Runnable hbmChangeCallback, Context context) {
|
Runnable hbmChangeCallback, HighBrightnessModeMetadata hbmMetadata, Context context) {
|
||||||
mInjector = injector;
|
mInjector = injector;
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mClock = injector.getClock();
|
mClock = injector.getClock();
|
||||||
@@ -137,6 +130,7 @@ class HighBrightnessModeController {
|
|||||||
mBrightnessMin = brightnessMin;
|
mBrightnessMin = brightnessMin;
|
||||||
mBrightnessMax = brightnessMax;
|
mBrightnessMax = brightnessMax;
|
||||||
mHbmChangeCallback = hbmChangeCallback;
|
mHbmChangeCallback = hbmChangeCallback;
|
||||||
|
mHighBrightnessModeMetadata = hbmMetadata;
|
||||||
mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler);
|
mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler);
|
||||||
mSettingsObserver = new SettingsObserver(mHandler);
|
mSettingsObserver = new SettingsObserver(mHandler);
|
||||||
mRecalcRunnable = this::recalculateTimeAllowance;
|
mRecalcRunnable = this::recalculateTimeAllowance;
|
||||||
@@ -222,19 +216,22 @@ class HighBrightnessModeController {
|
|||||||
|
|
||||||
// If we are starting or ending a high brightness mode session, store the current
|
// If we are starting or ending a high brightness mode session, store the current
|
||||||
// session in mRunningStartTimeMillis, or the old one in mEvents.
|
// session in mRunningStartTimeMillis, or the old one in mEvents.
|
||||||
final boolean wasHbmDrainingAvailableTime = mRunningStartTimeMillis != -1;
|
final long runningStartTime = mHighBrightnessModeMetadata.getRunningStartTimeMillis();
|
||||||
|
final boolean wasHbmDrainingAvailableTime = runningStartTime != -1;
|
||||||
final boolean shouldHbmDrainAvailableTime = mBrightness > mHbmData.transitionPoint
|
final boolean shouldHbmDrainAvailableTime = mBrightness > mHbmData.transitionPoint
|
||||||
&& !mIsHdrLayerPresent;
|
&& !mIsHdrLayerPresent;
|
||||||
if (wasHbmDrainingAvailableTime != shouldHbmDrainAvailableTime) {
|
if (wasHbmDrainingAvailableTime != shouldHbmDrainAvailableTime) {
|
||||||
final long currentTime = mClock.uptimeMillis();
|
final long currentTime = mClock.uptimeMillis();
|
||||||
if (shouldHbmDrainAvailableTime) {
|
if (shouldHbmDrainAvailableTime) {
|
||||||
mRunningStartTimeMillis = currentTime;
|
mHighBrightnessModeMetadata.setRunningStartTimeMillis(currentTime);
|
||||||
} else {
|
} else {
|
||||||
mEvents.addFirst(new HbmEvent(mRunningStartTimeMillis, currentTime));
|
final HbmEvent hbmEvent = new HbmEvent(runningStartTime, currentTime);
|
||||||
mRunningStartTimeMillis = -1;
|
mHighBrightnessModeMetadata.addHbmEvent(hbmEvent);
|
||||||
|
mHighBrightnessModeMetadata.setRunningStartTimeMillis(-1);
|
||||||
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Slog.d(TAG, "New HBM event: " + mEvents.peekFirst());
|
Slog.d(TAG, "New HBM event: "
|
||||||
|
+ mHighBrightnessModeMetadata.getHbmEventQueue().peekFirst());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,6 +257,10 @@ class HighBrightnessModeController {
|
|||||||
mSettingsObserver.stopObserving();
|
mSettingsObserver.stopObserving();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setHighBrightnessModeMetadata(HighBrightnessModeMetadata hbmInfo) {
|
||||||
|
mHighBrightnessModeMetadata = hbmInfo;
|
||||||
|
}
|
||||||
|
|
||||||
void resetHbmData(int width, int height, IBinder displayToken, String displayUniqueId,
|
void resetHbmData(int width, int height, IBinder displayToken, String displayUniqueId,
|
||||||
HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg) {
|
HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg) {
|
||||||
mWidth = width;
|
mWidth = width;
|
||||||
@@ -316,20 +317,22 @@ class HighBrightnessModeController {
|
|||||||
pw.println(" mBrightnessMax=" + mBrightnessMax);
|
pw.println(" mBrightnessMax=" + mBrightnessMax);
|
||||||
pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis()));
|
pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis()));
|
||||||
pw.println(" mIsTimeAvailable= " + mIsTimeAvailable);
|
pw.println(" mIsTimeAvailable= " + mIsTimeAvailable);
|
||||||
pw.println(" mRunningStartTimeMillis=" + TimeUtils.formatUptime(mRunningStartTimeMillis));
|
pw.println(" mRunningStartTimeMillis="
|
||||||
|
+ TimeUtils.formatUptime(mHighBrightnessModeMetadata.getRunningStartTimeMillis()));
|
||||||
pw.println(" mIsThermalStatusWithinLimit=" + mIsThermalStatusWithinLimit);
|
pw.println(" mIsThermalStatusWithinLimit=" + mIsThermalStatusWithinLimit);
|
||||||
pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode);
|
pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode);
|
||||||
pw.println(" width*height=" + mWidth + "*" + mHeight);
|
pw.println(" width*height=" + mWidth + "*" + mHeight);
|
||||||
pw.println(" mEvents=");
|
pw.println(" mEvents=");
|
||||||
final long currentTime = mClock.uptimeMillis();
|
final long currentTime = mClock.uptimeMillis();
|
||||||
long lastStartTime = currentTime;
|
long lastStartTime = currentTime;
|
||||||
if (mRunningStartTimeMillis != -1) {
|
long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis();
|
||||||
lastStartTime = dumpHbmEvent(pw, new HbmEvent(mRunningStartTimeMillis, currentTime));
|
if (runningStartTimeMillis != -1) {
|
||||||
|
lastStartTime = dumpHbmEvent(pw, new HbmEvent(runningStartTimeMillis, currentTime));
|
||||||
}
|
}
|
||||||
for (HbmEvent event : mEvents) {
|
for (HbmEvent event : mHighBrightnessModeMetadata.getHbmEventQueue()) {
|
||||||
if (lastStartTime > event.endTimeMillis) {
|
if (lastStartTime > event.getEndTimeMillis()) {
|
||||||
pw.println(" event: [normal brightness]: "
|
pw.println(" event: [normal brightness]: "
|
||||||
+ TimeUtils.formatDuration(lastStartTime - event.endTimeMillis));
|
+ TimeUtils.formatDuration(lastStartTime - event.getEndTimeMillis()));
|
||||||
}
|
}
|
||||||
lastStartTime = dumpHbmEvent(pw, event);
|
lastStartTime = dumpHbmEvent(pw, event);
|
||||||
}
|
}
|
||||||
@@ -338,12 +341,12 @@ class HighBrightnessModeController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private long dumpHbmEvent(PrintWriter pw, HbmEvent event) {
|
private long dumpHbmEvent(PrintWriter pw, HbmEvent event) {
|
||||||
final long duration = event.endTimeMillis - event.startTimeMillis;
|
final long duration = event.getEndTimeMillis() - event.getStartTimeMillis();
|
||||||
pw.println(" event: ["
|
pw.println(" event: ["
|
||||||
+ TimeUtils.formatUptime(event.startTimeMillis) + ", "
|
+ TimeUtils.formatUptime(event.getStartTimeMillis()) + ", "
|
||||||
+ TimeUtils.formatUptime(event.endTimeMillis) + "] ("
|
+ TimeUtils.formatUptime(event.getEndTimeMillis()) + "] ("
|
||||||
+ TimeUtils.formatDuration(duration) + ")");
|
+ TimeUtils.formatDuration(duration) + ")");
|
||||||
return event.startTimeMillis;
|
return event.getStartTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isCurrentlyAllowed() {
|
private boolean isCurrentlyAllowed() {
|
||||||
@@ -372,13 +375,15 @@ class HighBrightnessModeController {
|
|||||||
|
|
||||||
// First, lets see how much time we've taken for any currently running
|
// First, lets see how much time we've taken for any currently running
|
||||||
// session of HBM.
|
// session of HBM.
|
||||||
if (mRunningStartTimeMillis > 0) {
|
long runningStartTimeMillis = mHighBrightnessModeMetadata.getRunningStartTimeMillis();
|
||||||
if (mRunningStartTimeMillis > currentTime) {
|
if (runningStartTimeMillis > 0) {
|
||||||
|
if (runningStartTimeMillis > currentTime) {
|
||||||
Slog.e(TAG, "Start time set to the future. curr: " + currentTime
|
Slog.e(TAG, "Start time set to the future. curr: " + currentTime
|
||||||
+ ", start: " + mRunningStartTimeMillis);
|
+ ", start: " + runningStartTimeMillis);
|
||||||
mRunningStartTimeMillis = currentTime;
|
mHighBrightnessModeMetadata.setRunningStartTimeMillis(currentTime);
|
||||||
|
runningStartTimeMillis = currentTime;
|
||||||
}
|
}
|
||||||
timeAlreadyUsed = currentTime - mRunningStartTimeMillis;
|
timeAlreadyUsed = currentTime - runningStartTimeMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
@@ -387,18 +392,19 @@ class HighBrightnessModeController {
|
|||||||
|
|
||||||
// Next, lets iterate through the history of previous sessions and add those times.
|
// Next, lets iterate through the history of previous sessions and add those times.
|
||||||
final long windowstartTimeMillis = currentTime - mHbmData.timeWindowMillis;
|
final long windowstartTimeMillis = currentTime - mHbmData.timeWindowMillis;
|
||||||
Iterator<HbmEvent> it = mEvents.iterator();
|
Iterator<HbmEvent> it = mHighBrightnessModeMetadata.getHbmEventQueue().iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
final HbmEvent event = it.next();
|
final HbmEvent event = it.next();
|
||||||
|
|
||||||
// If this event ended before the current Timing window, discard forever and ever.
|
// If this event ended before the current Timing window, discard forever and ever.
|
||||||
if (event.endTimeMillis < windowstartTimeMillis) {
|
if (event.getEndTimeMillis() < windowstartTimeMillis) {
|
||||||
it.remove();
|
it.remove();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final long startTimeMillis = Math.max(event.startTimeMillis, windowstartTimeMillis);
|
final long startTimeMillis = Math.max(event.getStartTimeMillis(),
|
||||||
timeAlreadyUsed += event.endTimeMillis - startTimeMillis;
|
windowstartTimeMillis);
|
||||||
|
timeAlreadyUsed += event.getEndTimeMillis() - startTimeMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
@@ -425,17 +431,18 @@ class HighBrightnessModeController {
|
|||||||
// Calculate the time at which we want to recalculate mIsTimeAvailable in case a lux or
|
// Calculate the time at which we want to recalculate mIsTimeAvailable in case a lux or
|
||||||
// brightness change doesn't happen before then.
|
// brightness change doesn't happen before then.
|
||||||
long nextTimeout = -1;
|
long nextTimeout = -1;
|
||||||
|
final ArrayDeque<HbmEvent> hbmEvents = mHighBrightnessModeMetadata.getHbmEventQueue();
|
||||||
if (mBrightness > mHbmData.transitionPoint) {
|
if (mBrightness > mHbmData.transitionPoint) {
|
||||||
// if we're in high-lux now, timeout when we run out of allowed time.
|
// if we're in high-lux now, timeout when we run out of allowed time.
|
||||||
nextTimeout = currentTime + remainingTime;
|
nextTimeout = currentTime + remainingTime;
|
||||||
} else if (!mIsTimeAvailable && mEvents.size() > 0) {
|
} else if (!mIsTimeAvailable && hbmEvents.size() > 0) {
|
||||||
// If we are not allowed...timeout when the oldest event moved outside of the timing
|
// 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
|
// window by at least minTime. Basically, we're calculating the soonest time we can
|
||||||
// get {@code timeMinMillis} back to us.
|
// get {@code timeMinMillis} back to us.
|
||||||
final long windowstartTimeMillis = currentTime - mHbmData.timeWindowMillis;
|
final long windowstartTimeMillis = currentTime - mHbmData.timeWindowMillis;
|
||||||
final HbmEvent lastEvent = mEvents.peekLast();
|
final HbmEvent lastEvent = hbmEvents.peekLast();
|
||||||
final long startTimePlusMinMillis =
|
final long startTimePlusMinMillis =
|
||||||
Math.max(windowstartTimeMillis, lastEvent.startTimeMillis)
|
Math.max(windowstartTimeMillis, lastEvent.getStartTimeMillis())
|
||||||
+ mHbmData.timeMinMillis;
|
+ mHbmData.timeMinMillis;
|
||||||
final long timeWhenMinIsGainedBack =
|
final long timeWhenMinIsGainedBack =
|
||||||
currentTime + (startTimePlusMinMillis - windowstartTimeMillis) - remainingTime;
|
currentTime + (startTimePlusMinMillis - windowstartTimeMillis) - remainingTime;
|
||||||
@@ -459,9 +466,10 @@ class HighBrightnessModeController {
|
|||||||
+ ", mUnthrottledBrightness: " + mUnthrottledBrightness
|
+ ", mUnthrottledBrightness: " + mUnthrottledBrightness
|
||||||
+ ", mThrottlingReason: "
|
+ ", mThrottlingReason: "
|
||||||
+ BrightnessInfo.briMaxReasonToString(mThrottlingReason)
|
+ BrightnessInfo.briMaxReasonToString(mThrottlingReason)
|
||||||
+ ", RunningStartTimeMillis: " + mRunningStartTimeMillis
|
+ ", RunningStartTimeMillis: "
|
||||||
|
+ mHighBrightnessModeMetadata.getRunningStartTimeMillis()
|
||||||
+ ", nextTimeout: " + (nextTimeout != -1 ? (nextTimeout - currentTime) : -1)
|
+ ", nextTimeout: " + (nextTimeout != -1 ? (nextTimeout - currentTime) : -1)
|
||||||
+ ", events: " + mEvents);
|
+ ", events: " + hbmEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nextTimeout != -1) {
|
if (nextTimeout != -1) {
|
||||||
@@ -588,25 +596,6 @@ 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
|
@VisibleForTesting
|
||||||
class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
class HdrListener extends SurfaceControlHdrLayerInfoListener {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* 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<HbmEvent> 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<HbmEvent> getHbmEventQueue() {
|
||||||
|
return mEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addHbmEvent(HbmEvent hbmEvent) {
|
||||||
|
mEvents.addFirst(hbmEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -80,6 +80,8 @@ public final class DisplayPowerController2Test {
|
|||||||
@Mock
|
@Mock
|
||||||
private DisplayBlanker mDisplayBlankerMock;
|
private DisplayBlanker mDisplayBlankerMock;
|
||||||
@Mock
|
@Mock
|
||||||
|
private HighBrightnessModeMetadata mHighBrightnessModeMetadataMock;
|
||||||
|
@Mock
|
||||||
private LogicalDisplay mLogicalDisplayMock;
|
private LogicalDisplay mLogicalDisplayMock;
|
||||||
@Mock
|
@Mock
|
||||||
private DisplayDevice mDisplayDeviceMock;
|
private DisplayDevice mDisplayDeviceMock;
|
||||||
@@ -169,7 +171,7 @@ public final class DisplayPowerController2Test {
|
|||||||
mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler,
|
mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler,
|
||||||
mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock,
|
mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock,
|
||||||
mBrightnessTrackerMock, mBrightnessSettingMock, () -> {
|
mBrightnessTrackerMock, mBrightnessSettingMock, () -> {
|
||||||
});
|
}, mHighBrightnessModeMetadataMock);
|
||||||
|
|
||||||
when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON);
|
when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON);
|
||||||
// send a display power request
|
// send a display power request
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ public final class DisplayPowerControllerTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private DisplayDevice mDisplayDeviceMock;
|
private DisplayDevice mDisplayDeviceMock;
|
||||||
@Mock
|
@Mock
|
||||||
|
private HighBrightnessModeMetadata mHighBrightnessModeMetadataMock;
|
||||||
|
@Mock
|
||||||
private BrightnessTracker mBrightnessTrackerMock;
|
private BrightnessTracker mBrightnessTrackerMock;
|
||||||
@Mock
|
@Mock
|
||||||
private BrightnessSetting mBrightnessSettingMock;
|
private BrightnessSetting mBrightnessSettingMock;
|
||||||
@@ -151,7 +153,7 @@ public final class DisplayPowerControllerTest {
|
|||||||
mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler,
|
mContextSpy, mInjector, mDisplayPowerCallbacksMock, mHandler,
|
||||||
mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock,
|
mSensorManagerMock, mDisplayBlankerMock, mLogicalDisplayMock,
|
||||||
mBrightnessTrackerMock, mBrightnessSettingMock, () -> {
|
mBrightnessTrackerMock, mBrightnessSettingMock, () -> {
|
||||||
});
|
}, mHighBrightnessModeMetadataMock);
|
||||||
|
|
||||||
when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON);
|
when(mDisplayPowerStateMock.getScreenState()).thenReturn(Display.STATE_ON);
|
||||||
// send a display power request
|
// send a display power request
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -96,6 +96,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
private Binder mDisplayToken;
|
private Binder mDisplayToken;
|
||||||
private String mDisplayUniqueId;
|
private String mDisplayUniqueId;
|
||||||
private Context mContextSpy;
|
private Context mContextSpy;
|
||||||
|
private HighBrightnessModeMetadata mHighBrightnessModeMetadata;
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
|
public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
|
||||||
@@ -118,6 +119,7 @@ public class HighBrightnessModeControllerTest {
|
|||||||
mTestLooper = new TestLooper(mClock::now);
|
mTestLooper = new TestLooper(mClock::now);
|
||||||
mDisplayToken = null;
|
mDisplayToken = null;
|
||||||
mDisplayUniqueId = "unique_id";
|
mDisplayUniqueId = "unique_id";
|
||||||
|
|
||||||
mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
|
mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext()));
|
||||||
final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
|
final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
|
||||||
when(mContextSpy.getContentResolver()).thenReturn(resolver);
|
when(mContextSpy.getContentResolver()).thenReturn(resolver);
|
||||||
@@ -134,7 +136,8 @@ public class HighBrightnessModeControllerTest {
|
|||||||
initHandler(null);
|
initHandler(null);
|
||||||
final HighBrightnessModeController hbmc = new HighBrightnessModeController(
|
final HighBrightnessModeController hbmc = new HighBrightnessModeController(
|
||||||
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken,
|
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken,
|
||||||
mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {}, mContextSpy);
|
mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {},
|
||||||
|
null, mContextSpy);
|
||||||
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
|
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
|
||||||
assertEquals(hbmc.getTransitionPoint(), HBM_TRANSITION_POINT_INVALID, 0.0f);
|
assertEquals(hbmc.getTransitionPoint(), HBM_TRANSITION_POINT_INVALID, 0.0f);
|
||||||
}
|
}
|
||||||
@@ -144,7 +147,8 @@ public class HighBrightnessModeControllerTest {
|
|||||||
initHandler(null);
|
initHandler(null);
|
||||||
final HighBrightnessModeController hbmc = new HighBrightnessModeController(
|
final HighBrightnessModeController hbmc = new HighBrightnessModeController(
|
||||||
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken,
|
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken,
|
||||||
mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {}, mContextSpy);
|
mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX, null, null, () -> {},
|
||||||
|
null, mContextSpy);
|
||||||
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
|
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
|
||||||
hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
|
hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
|
||||||
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
|
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
|
||||||
@@ -699,9 +703,12 @@ public class HighBrightnessModeControllerTest {
|
|||||||
// Creates instance with standard initialization values.
|
// Creates instance with standard initialization values.
|
||||||
private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) {
|
private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) {
|
||||||
initHandler(clock);
|
initHandler(clock);
|
||||||
|
if (mHighBrightnessModeMetadata == null) {
|
||||||
|
mHighBrightnessModeMetadata = new HighBrightnessModeMetadata();
|
||||||
|
}
|
||||||
return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH,
|
return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH,
|
||||||
DISPLAY_HEIGHT, mDisplayToken, mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX,
|
DISPLAY_HEIGHT, mDisplayToken, mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX,
|
||||||
DEFAULT_HBM_DATA, null, () -> {}, mContextSpy);
|
DEFAULT_HBM_DATA, null, () -> {}, mHighBrightnessModeMetadata, mContextSpy);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initHandler(OffsettableClock clock) {
|
private void initHandler(OffsettableClock clock) {
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user