Merge "DisplayPowerController uses max desired SDR/HDR ratio" into udc-dev

This commit is contained in:
Alec Mouri
2023-03-12 18:53:46 +00:00
committed by Android (Google) Code Review
8 changed files with 151 additions and 38 deletions

View File

@@ -42,10 +42,13 @@ public abstract class SurfaceControlHdrLayerInfoListener {
* @param maxH The height of the HDR layer with the largest area * @param maxH The height of the HDR layer with the largest area
* @param flags Additional metadata flags, currently always 0 * @param flags Additional metadata flags, currently always 0
* TODO(b/182312559): Add some flags * TODO(b/182312559): Add some flags
* @param maxDesiredHdrSdrRatio The max desired HDR/SDR ratio. Unbounded if the ratio is
* positive infinity.
* *
* @hide */ * @hide
*/
public abstract void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers, public abstract void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
int maxW, int maxH, int flags); int maxW, int maxH, int flags, float maxDesiredHdrSdrRatio);
/** /**
* Registers this as an HDR info listener on the provided display * Registers this as an HDR info listener on the provided display

View File

@@ -42,12 +42,12 @@ struct SurfaceControlHdrLayerInfoListener : public gui::BnHdrLayerInfoListener {
LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&mVm) != JNI_OK, "Failed to GetJavaVm"); LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&mVm) != JNI_OK, "Failed to GetJavaVm");
} }
binder::Status onHdrLayerInfoChanged(int numberOfHdrLayers, int maxW, int maxH, binder::Status onHdrLayerInfoChanged(int numberOfHdrLayers, int maxW, int maxH, int flags,
int flags) override { float maxDesiredHdrSdrRatio) override {
JNIEnv* env = requireEnv(); JNIEnv* env = requireEnv();
env->CallVoidMethod(mListener, gListenerClassInfo.mOnHdrInfoChanged, mDisplayToken, env->CallVoidMethod(mListener, gListenerClassInfo.mOnHdrInfoChanged, mDisplayToken,
numberOfHdrLayers, maxW, maxH, flags); numberOfHdrLayers, maxW, maxH, flags, maxDesiredHdrSdrRatio);
if (env->ExceptionCheck()) { if (env->ExceptionCheck()) {
ALOGE("SurfaceControlHdrLayerInfoListener.onHdrInfoChanged() failed."); ALOGE("SurfaceControlHdrLayerInfoListener.onHdrInfoChanged() failed.");
@@ -129,7 +129,7 @@ int register_android_view_SurfaceControlHdrLayerInfoListener(JNIEnv* env) {
jclass clazz = env->FindClass("android/view/SurfaceControlHdrLayerInfoListener"); jclass clazz = env->FindClass("android/view/SurfaceControlHdrLayerInfoListener");
gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz); gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz);
gListenerClassInfo.mOnHdrInfoChanged = gListenerClassInfo.mOnHdrInfoChanged =
env->GetMethodID(clazz, "onHdrInfoChanged", "(Landroid/os/IBinder;IIII)V"); env->GetMethodID(clazz, "onHdrInfoChanged", "(Landroid/os/IBinder;IIIIF)V");
return 0; return 0;
} }

View File

@@ -889,11 +889,12 @@ public class DisplayDeviceConfig {
} }
/** /**
* Calculate the HDR brightness for the specified SDR brightenss. * Calculate the HDR brightness for the specified SDR brightenss, restricted by the
* maxDesiredHdrSdrRatio (the ratio between the HDR luminance and SDR luminance)
* *
* @return the HDR brightness or BRIGHTNESS_INVALID when no mapping exists. * @return the HDR brightness or BRIGHTNESS_INVALID when no mapping exists.
*/ */
public float getHdrBrightnessFromSdr(float brightness) { public float getHdrBrightnessFromSdr(float brightness, float maxDesiredHdrSdrRatio) {
if (mSdrToHdrRatioSpline == null) { if (mSdrToHdrRatioSpline == null) {
return PowerManager.BRIGHTNESS_INVALID; return PowerManager.BRIGHTNESS_INVALID;
} }
@@ -904,7 +905,7 @@ public class DisplayDeviceConfig {
return PowerManager.BRIGHTNESS_INVALID; return PowerManager.BRIGHTNESS_INVALID;
} }
float ratio = mSdrToHdrRatioSpline.interpolate(nits); float ratio = Math.min(mSdrToHdrRatioSpline.interpolate(nits), maxDesiredHdrSdrRatio);
float hdrNits = nits * ratio; float hdrNits = nits * ratio;
if (mNitsToBacklightSpline == null) { if (mNitsToBacklightSpline == null) {
return PowerManager.BRIGHTNESS_INVALID; return PowerManager.BRIGHTNESS_INVALID;

View File

@@ -975,8 +975,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mDisplayDeviceConfig.getHighBrightnessModeData(), mDisplayDeviceConfig.getHighBrightnessModeData(),
new HighBrightnessModeController.HdrBrightnessDeviceConfig() { new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
@Override @Override
public float getHdrBrightnessFromSdr(float sdrBrightness) { public float getHdrBrightnessFromSdr(
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); float sdrBrightness, float maxDesiredHdrSdrRatio) {
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
sdrBrightness, maxDesiredHdrSdrRatio);
} }
}); });
mBrightnessThrottler.resetThrottlingData( mBrightnessThrottler.resetThrottlingData(
@@ -2088,8 +2090,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData, displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData,
new HighBrightnessModeController.HdrBrightnessDeviceConfig() { new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
@Override @Override
public float getHdrBrightnessFromSdr(float sdrBrightness) { public float getHdrBrightnessFromSdr(
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); float sdrBrightness, float maxDesiredHdrSdrRatio) {
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
sdrBrightness, maxDesiredHdrSdrRatio);
} }
}, },
() -> { () -> {

View File

@@ -809,8 +809,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
mDisplayDeviceConfig.getHighBrightnessModeData(), mDisplayDeviceConfig.getHighBrightnessModeData(),
new HighBrightnessModeController.HdrBrightnessDeviceConfig() { new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
@Override @Override
public float getHdrBrightnessFromSdr(float sdrBrightness) { public float getHdrBrightnessFromSdr(
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); float sdrBrightness, float maxDesiredHdrSdrRatio) {
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
sdrBrightness, maxDesiredHdrSdrRatio);
} }
}); });
mBrightnessThrottler.resetThrottlingData( mBrightnessThrottler.resetThrottlingData(
@@ -1796,8 +1798,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData, displayUniqueId, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData,
new HighBrightnessModeController.HdrBrightnessDeviceConfig() { new HighBrightnessModeController.HdrBrightnessDeviceConfig() {
@Override @Override
public float getHdrBrightnessFromSdr(float sdrBrightness) { public float getHdrBrightnessFromSdr(
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(sdrBrightness); float sdrBrightness, float maxDesiredHdrSdrRatio) {
return mDisplayDeviceConfig.getHdrBrightnessFromSdr(
sdrBrightness, maxDesiredHdrSdrRatio);
} }
}, },
() -> { () -> {

View File

@@ -61,8 +61,12 @@ class HighBrightnessModeController {
@VisibleForTesting @VisibleForTesting
static final float HBM_TRANSITION_POINT_INVALID = Float.POSITIVE_INFINITY; static final float HBM_TRANSITION_POINT_INVALID = Float.POSITIVE_INFINITY;
private static final float DEFAULT_MAX_DESIRED_HDR_SDR_RATIO = 1.0f;
public interface HdrBrightnessDeviceConfig { public interface HdrBrightnessDeviceConfig {
float getHdrBrightnessFromSdr(float sdrBrightness); // maxDesiredHdrSdrRatio will restrict the HDR brightness if the ratio is less than
// Float.POSITIVE_INFINITY
float getHdrBrightnessFromSdr(float sdrBrightness, float maxDesiredHdrSdrRatio);
} }
private final float mBrightnessMin; private final float mBrightnessMin;
@@ -96,6 +100,9 @@ class HighBrightnessModeController {
private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF; private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
private boolean mIsHdrLayerPresent = false; private boolean mIsHdrLayerPresent = false;
// mMaxDesiredHdrSdrRatio should only be applied when there is a valid backlight->nits mapping
private float mMaxDesiredHdrSdrRatio = DEFAULT_MAX_DESIRED_HDR_SDR_RATIO;
private boolean mIsThermalStatusWithinLimit = true; private boolean mIsThermalStatusWithinLimit = true;
private boolean mIsBlockedByLowPowerMode = false; private boolean mIsBlockedByLowPowerMode = false;
private int mWidth; private int mWidth;
@@ -177,7 +184,8 @@ class HighBrightnessModeController {
float getHdrBrightnessValue() { float getHdrBrightnessValue() {
if (mHdrBrightnessCfg != null) { if (mHdrBrightnessCfg != null) {
float hdrBrightness = mHdrBrightnessCfg.getHdrBrightnessFromSdr(mBrightness); float hdrBrightness = mHdrBrightnessCfg.getHdrBrightnessFromSdr(
mBrightness, mMaxDesiredHdrSdrRatio);
if (hdrBrightness != PowerManager.BRIGHTNESS_INVALID) { if (hdrBrightness != PowerManager.BRIGHTNESS_INVALID) {
return hdrBrightness; return hdrBrightness;
} }
@@ -457,6 +465,7 @@ class HighBrightnessModeController {
+ ", isLuxHigh: " + mIsInAllowedAmbientRange + ", isLuxHigh: " + mIsInAllowedAmbientRange
+ ", isHBMCurrentlyAllowed: " + isCurrentlyAllowed() + ", isHBMCurrentlyAllowed: " + isCurrentlyAllowed()
+ ", isHdrLayerPresent: " + mIsHdrLayerPresent + ", isHdrLayerPresent: " + mIsHdrLayerPresent
+ ", mMaxDesiredHdrSdrRatio: " + mMaxDesiredHdrSdrRatio
+ ", isAutoBrightnessEnabled: " + mIsAutoBrightnessEnabled + ", isAutoBrightnessEnabled: " + mIsAutoBrightnessEnabled
+ ", mIsTimeAvailable: " + mIsTimeAvailable + ", mIsTimeAvailable: " + mIsTimeAvailable
+ ", mIsInAllowedAmbientRange: " + mIsInAllowedAmbientRange + ", mIsInAllowedAmbientRange: " + mIsInAllowedAmbientRange
@@ -600,11 +609,25 @@ class HighBrightnessModeController {
class HdrListener extends SurfaceControlHdrLayerInfoListener { class HdrListener extends SurfaceControlHdrLayerInfoListener {
@Override @Override
public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers, public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers,
int maxW, int maxH, int flags) { int maxW, int maxH, int flags, float maxDesiredHdrSdrRatio) {
mHandler.post(() -> { mHandler.post(() -> {
mIsHdrLayerPresent = numberOfHdrLayers > 0 mIsHdrLayerPresent = numberOfHdrLayers > 0
&& (float) (maxW * maxH) >= ((float) (mWidth * mHeight) && (float) (maxW * maxH) >= ((float) (mWidth * mHeight)
* mHbmData.minimumHdrPercentOfScreen); * mHbmData.minimumHdrPercentOfScreen);
final float candidateDesiredHdrSdrRatio =
mIsHdrLayerPresent && mHdrBrightnessCfg != null
? maxDesiredHdrSdrRatio
: DEFAULT_MAX_DESIRED_HDR_SDR_RATIO;
if (candidateDesiredHdrSdrRatio >= 1.0f) {
mMaxDesiredHdrSdrRatio = candidateDesiredHdrSdrRatio;
} else {
Slog.w(TAG, "Ignoring invalid desired HDR/SDR Ratio: "
+ candidateDesiredHdrSdrRatio);
mMaxDesiredHdrSdrRatio = DEFAULT_MAX_DESIRED_HDR_SDR_RATIO;
}
// Calling the brightness update so that we can recalculate // Calling the brightness update so that we can recalculate
// brightness with HDR in mind. // brightness with HDR in mind.
onBrightnessChanged(mBrightness, mUnthrottledBrightness, mThrottlingReason); onBrightnessChanged(mBrightness, mUnthrottledBrightness, mThrottlingReason);

View File

@@ -235,6 +235,18 @@ public final class DisplayDeviceConfigTest {
assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMajorVersion(), 2); assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMajorVersion(), 2);
assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMinorVersion(), 0); assertEquals(mDisplayDeviceConfig.getHostUsiVersion().getMinorVersion(), 0);
// Max desired Hdr/SDR ratio upper-bounds the HDR brightness.
assertEquals(1.0f,
mDisplayDeviceConfig.getHdrBrightnessFromSdr(0.62f, Float.POSITIVE_INFINITY),
ZERO_DELTA);
assertEquals(0.62f,
mDisplayDeviceConfig.getHdrBrightnessFromSdr(0.62f, 1.0f),
ZERO_DELTA);
assertEquals(0.77787f,
mDisplayDeviceConfig.getHdrBrightnessFromSdr(0.62f, 1.25f),
SMALL_DELTA);
// Todo: Add asserts for BrightnessThrottlingData, DensityMapping, // Todo: Add asserts for BrightnessThrottlingData, DensityMapping,
// HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor. // HighBrightnessModeData AmbientLightSensor, RefreshRateLimitations and ProximitySensor.
} }
@@ -417,6 +429,16 @@ public final class DisplayDeviceConfigTest {
+ "</refreshRate>\n" + "</refreshRate>\n"
+ "<thermalStatusLimit>light</thermalStatusLimit>\n" + "<thermalStatusLimit>light</thermalStatusLimit>\n"
+ "<allowInLowPowerMode>false</allowInLowPowerMode>\n" + "<allowInLowPowerMode>false</allowInLowPowerMode>\n"
+ "<sdrHdrRatioMap>\n"
+ "<point>\n"
+ "<sdrNits>2.000</sdrNits>\n"
+ "<hdrRatio>4.000</hdrRatio>\n"
+ "</point>\n"
+ "<point>\n"
+ "<sdrNits>500.0</sdrNits>\n"
+ "<hdrRatio>1.6</hdrRatio>\n"
+ "</point>\n"
+ "</sdrHdrRatioMap>\n"
+ "</highBrightnessMode>\n" + "</highBrightnessMode>\n"
+ "<screenOffBrightnessSensor>\n" + "<screenOffBrightnessSensor>\n"
+ "<type>sensor_12345</type>\n" + "<type>sensor_12345</type>\n"

View File

@@ -29,6 +29,7 @@ import static com.android.server.display.DisplayDeviceConfig.HDR_PERCENT_OF_SCRE
import static com.android.server.display.HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID; import static com.android.server.display.HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.anyFloat;
import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
@@ -103,6 +104,7 @@ public class HighBrightnessModeControllerTest {
@Mock IThermalService mThermalServiceMock; @Mock IThermalService mThermalServiceMock;
@Mock Injector mInjectorMock; @Mock Injector mInjectorMock;
@Mock HighBrightnessModeController.HdrBrightnessDeviceConfig mHdrBrightnessDeviceConfigMock;
@Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor; @Captor ArgumentCaptor<IThermalEventListener> mThermalEventListenerCaptor;
@@ -376,17 +378,48 @@ public class HighBrightnessModeControllerTest {
// ensure hdr doesn't turn on if layer is too small // ensure hdr doesn't turn on if layer is too small
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
layerWidth, smallLayerHeight, 0 /*flags*/); layerWidth, smallLayerHeight, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
// Now check with layer larger than 50% // Now check with layer larger than 50%
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
layerWidth, largeLayerHeight, 0 /*flags*/); layerWidth, largeLayerHeight, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
} }
@Test
public void testHdrRespectsMaxDesiredHdrSdrRatio() {
final HighBrightnessModeController hbmc = new TestHbmBuilder()
.setClock(new OffsettableClock())
.setHdrBrightnessConfig(mHdrBrightnessDeviceConfigMock)
.build();
// Passthrough return the max desired hdr/sdr ratio
when(mHdrBrightnessDeviceConfigMock.getHdrBrightnessFromSdr(anyFloat(), anyFloat()))
.thenAnswer(i -> i.getArgument(1));
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 2.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0);
assertEquals(2.0f, hbmc.getHdrBrightnessValue(), EPSILON);
// The hdr ratio cannot be less than 1.
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 0.5f /*maxDesiredHdrSdrRatio*/);
advanceTime(0);
assertEquals(1.0f, hbmc.getHdrBrightnessValue(), EPSILON);
// The hdr ratio can be as much as positive infinity
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/,
Float.POSITIVE_INFINITY /*maxDesiredHdrSdrRatio*/);
advanceTime(0);
assertEquals(Float.POSITIVE_INFINITY, hbmc.getHdrBrightnessValue(), 0.0);
}
@Test @Test
public void testHdrTrumpsSunlight() { public void testHdrTrumpsSunlight() {
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock()); final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
@@ -400,7 +433,7 @@ public class HighBrightnessModeControllerTest {
// turn on hdr // turn on hdr
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON); assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
@@ -412,14 +445,14 @@ public class HighBrightnessModeControllerTest {
// Check limit when HBM is off // Check limit when HBM is off
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON); assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
// Check limit with HBM is set to HDR // Check limit with HBM is set to HDR
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_OFF, hbmc.getHighBrightnessMode());
assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON); assertEquals(TRANSITION_POINT, hbmc.getCurrentBrightnessMax(), EPSILON);
@@ -430,7 +463,7 @@ public class HighBrightnessModeControllerTest {
final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock()); final HighBrightnessModeController hbmc = createDefaultHbm(new OffsettableClock());
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
@@ -473,7 +506,7 @@ public class HighBrightnessModeControllerTest {
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED); hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
hbmcOnBrightnessChanged(hbmc, TRANSITION_POINT); hbmcOnBrightnessChanged(hbmc, TRANSITION_POINT);
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
@@ -483,7 +516,7 @@ public class HighBrightnessModeControllerTest {
eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN));
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 0 /*numberOfHdrLayers*/,
0, 0, 0 /*flags*/); 0, 0, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
// Verify Stats HBM_OFF // Verify Stats HBM_OFF
@@ -517,7 +550,7 @@ public class HighBrightnessModeControllerTest {
hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED); hbmc.setAutoBrightnessEnabled(AUTO_BRIGHTNESS_ENABLED);
hbmcOnBrightnessChanged(hbmc, DEFAULT_MIN); hbmcOnBrightnessChanged(hbmc, DEFAULT_MIN);
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode()); assertEquals(HIGH_BRIGHTNESS_MODE_HDR, hbmc.getHighBrightnessMode());
@@ -657,7 +690,7 @@ public class HighBrightnessModeControllerTest {
eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN)); eq(FrameworkStatsLog.DISPLAY_HBM_STATE_CHANGED__REASON__HBM_TRANSITION_REASON_UNKNOWN));
hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/, hbmc.getHdrListener().onHdrInfoChanged(null /*displayToken*/, 1 /*numberOfHdrLayers*/,
DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/); DISPLAY_WIDTH, DISPLAY_HEIGHT, 0 /*flags*/, 1.0f /*maxDesiredHdrSdrRatio*/);
advanceTime(0); advanceTime(0);
verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId), verify(mInjectorMock).reportHbmStateChange(eq(displayStatsId),
@@ -696,19 +729,42 @@ public class HighBrightnessModeControllerTest {
assertEquals(hbmMode, hbmc.getHighBrightnessMode()); assertEquals(hbmMode, hbmc.getHighBrightnessMode());
} }
private class TestHbmBuilder {
OffsettableClock mClock;
HighBrightnessModeController.HdrBrightnessDeviceConfig mHdrBrightnessCfg;
TestHbmBuilder setClock(OffsettableClock clock) {
mClock = clock;
return this;
}
TestHbmBuilder setHdrBrightnessConfig(
HighBrightnessModeController.HdrBrightnessDeviceConfig hdrBrightnessCfg
) {
mHdrBrightnessCfg = hdrBrightnessCfg;
return this;
}
HighBrightnessModeController build() {
initHandler(mClock);
if (mHighBrightnessModeMetadata == null) {
mHighBrightnessModeMetadata = new HighBrightnessModeMetadata();
}
return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH,
DISPLAY_HEIGHT, mDisplayToken, mDisplayUniqueId, DEFAULT_MIN, DEFAULT_MAX,
DEFAULT_HBM_DATA, mHdrBrightnessCfg, () -> {}, mHighBrightnessModeMetadata,
mContextSpy);
}
}
private HighBrightnessModeController createDefaultHbm() { private HighBrightnessModeController createDefaultHbm() {
return createDefaultHbm(null); return new TestHbmBuilder().build();
} }
// Creates instance with standard initialization values. // Creates instance with standard initialization values.
private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) { private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) {
initHandler(clock); return new TestHbmBuilder().setClock(clock).build();
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);
} }
private void initHandler(OffsettableClock clock) { private void initHandler(OffsettableClock clock) {