Make DisplayModeDirector aware of whether HBM is active
Currently DisplayModeDirector casts Vote.PRIORITY_HIGH_BRIGHTNESS_MODE
based on whether High Brightness Mode (HBM) is allowed, rather than
based on whether HBM is actually active. This can lead to cases where
the HBM refresh rate vote is cast when HBM is allowed but not actually
used.
This change corrects this behavior, and makes DisplayModeDirector check
that HBM is both allowed (enabled) and actually in use (active).
Bug: 200851199
Test: atest DisplayModeDirectorTest
BrightnessLevelPreferenceControllerTest
HighBrightnessModeControllerTest
Change-Id: I8cb8f023a6bca11de976866259032143f43d9a4f
This commit is contained in:
@@ -69,6 +69,9 @@ public final class BrightnessInfo implements Parcelable {
|
||||
/** Current maximum supported brightness. */
|
||||
public final float brightnessMaximum;
|
||||
|
||||
/** Brightness values greater than this point are only used in High Brightness Mode. */
|
||||
public final float highBrightnessTransitionPoint;
|
||||
|
||||
/**
|
||||
* Current state of high brightness mode.
|
||||
* Can be any of HIGH_BRIGHTNESS_MODE_* values.
|
||||
@@ -76,17 +79,20 @@ public final class BrightnessInfo implements Parcelable {
|
||||
public final int highBrightnessMode;
|
||||
|
||||
public BrightnessInfo(float brightness, float brightnessMinimum, float brightnessMaximum,
|
||||
@HighBrightnessMode int highBrightnessMode) {
|
||||
this(brightness, brightness, brightnessMinimum, brightnessMaximum, highBrightnessMode);
|
||||
@HighBrightnessMode int highBrightnessMode, float highBrightnessTransitionPoint) {
|
||||
this(brightness, brightness, brightnessMinimum, brightnessMaximum, highBrightnessMode,
|
||||
highBrightnessTransitionPoint);
|
||||
}
|
||||
|
||||
public BrightnessInfo(float brightness, float adjustedBrightness, float brightnessMinimum,
|
||||
float brightnessMaximum, @HighBrightnessMode int highBrightnessMode) {
|
||||
float brightnessMaximum, @HighBrightnessMode int highBrightnessMode,
|
||||
float highBrightnessTransitionPoint) {
|
||||
this.brightness = brightness;
|
||||
this.adjustedBrightness = adjustedBrightness;
|
||||
this.brightnessMinimum = brightnessMinimum;
|
||||
this.brightnessMaximum = brightnessMaximum;
|
||||
this.highBrightnessMode = highBrightnessMode;
|
||||
this.highBrightnessTransitionPoint = highBrightnessTransitionPoint;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -116,6 +122,7 @@ public final class BrightnessInfo implements Parcelable {
|
||||
dest.writeFloat(brightnessMinimum);
|
||||
dest.writeFloat(brightnessMaximum);
|
||||
dest.writeInt(highBrightnessMode);
|
||||
dest.writeFloat(highBrightnessTransitionPoint);
|
||||
}
|
||||
|
||||
public static final @android.annotation.NonNull Creator<BrightnessInfo> CREATOR =
|
||||
@@ -137,6 +144,7 @@ public final class BrightnessInfo implements Parcelable {
|
||||
brightnessMinimum = source.readFloat();
|
||||
brightnessMaximum = source.readFloat();
|
||||
highBrightnessMode = source.readInt();
|
||||
highBrightnessTransitionPoint = source.readFloat();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2293,6 +2293,7 @@ public class DisplayModeDirector {
|
||||
private final BallotBox mBallotBox;
|
||||
private final Handler mHandler;
|
||||
private final SparseIntArray mHbmMode = new SparseIntArray();
|
||||
private final SparseBooleanArray mHbmActive = new SparseBooleanArray();
|
||||
private final Injector mInjector;
|
||||
private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings;
|
||||
private int mRefreshRateInHbmSunlight;
|
||||
@@ -2361,6 +2362,7 @@ public class DisplayModeDirector {
|
||||
public void onDisplayRemoved(int displayId) {
|
||||
mBallotBox.vote(displayId, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE, null);
|
||||
mHbmMode.delete(displayId);
|
||||
mHbmActive.delete(displayId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2370,12 +2372,17 @@ public class DisplayModeDirector {
|
||||
// Display no longer there. Assume we'll get an onDisplayRemoved very soon.
|
||||
return;
|
||||
}
|
||||
|
||||
final int hbmMode = info.highBrightnessMode;
|
||||
if (hbmMode == mHbmMode.get(displayId)) {
|
||||
final boolean isHbmActive = hbmMode != BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF &&
|
||||
info.adjustedBrightness > info.highBrightnessTransitionPoint;
|
||||
if (hbmMode == mHbmMode.get(displayId) &&
|
||||
isHbmActive == mHbmActive.get(displayId)) {
|
||||
// no change, ignore.
|
||||
return;
|
||||
}
|
||||
mHbmMode.put(displayId, hbmMode);
|
||||
mHbmActive.put(displayId, isHbmActive);
|
||||
recalculateVotesForDisplay(displayId);
|
||||
}
|
||||
|
||||
@@ -2389,28 +2396,36 @@ public class DisplayModeDirector {
|
||||
}
|
||||
|
||||
private void recalculateVotesForDisplay(int displayId) {
|
||||
final int hbmMode = mHbmMode.get(displayId, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF);
|
||||
Vote vote = null;
|
||||
if (hbmMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT) {
|
||||
// Device resource properties take priority over DisplayDeviceConfig
|
||||
if (mRefreshRateInHbmSunlight > 0) {
|
||||
vote = Vote.forRefreshRates(mRefreshRateInHbmSunlight,
|
||||
mRefreshRateInHbmSunlight);
|
||||
} else {
|
||||
final List<RefreshRateLimitation> limits =
|
||||
mDisplayManagerInternal.getRefreshRateLimitations(displayId);
|
||||
for (int i = 0; limits != null && i < limits.size(); i++) {
|
||||
final RefreshRateLimitation limitation = limits.get(i);
|
||||
if (limitation.type == REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE) {
|
||||
vote = Vote.forRefreshRates(limitation.range.min, limitation.range.max);
|
||||
break;
|
||||
if (mHbmActive.get(displayId, false)) {
|
||||
final int hbmMode =
|
||||
mHbmMode.get(displayId, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF);
|
||||
if (hbmMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT) {
|
||||
// Device resource properties take priority over DisplayDeviceConfig
|
||||
if (mRefreshRateInHbmSunlight > 0) {
|
||||
vote = Vote.forRefreshRates(mRefreshRateInHbmSunlight,
|
||||
mRefreshRateInHbmSunlight);
|
||||
} else {
|
||||
final List<RefreshRateLimitation> limits =
|
||||
mDisplayManagerInternal.getRefreshRateLimitations(displayId);
|
||||
for (int i = 0; limits != null && i < limits.size(); i++) {
|
||||
final RefreshRateLimitation limitation = limits.get(i);
|
||||
if (limitation.type == REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE) {
|
||||
vote = Vote.forRefreshRates(limitation.range.min,
|
||||
limitation.range.max);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (hbmMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR &&
|
||||
mRefreshRateInHbmHdr > 0) {
|
||||
// HBM for HDR vote isn't supported through DisplayDeviceConfig yet, so look for
|
||||
// a vote from Device properties
|
||||
vote = Vote.forRefreshRates(mRefreshRateInHbmHdr, mRefreshRateInHbmHdr);
|
||||
} else {
|
||||
Slog.w(TAG, "Unexpected HBM mode " + hbmMode + " for display ID " + displayId);
|
||||
}
|
||||
}
|
||||
if (hbmMode == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR
|
||||
&& mRefreshRateInHbmHdr > 0) {
|
||||
vote = Vote.forRefreshRates(mRefreshRateInHbmHdr, mRefreshRateInHbmHdr);
|
||||
|
||||
}
|
||||
mBallotBox.vote(displayId, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE, vote);
|
||||
}
|
||||
@@ -2418,6 +2433,7 @@ public class DisplayModeDirector {
|
||||
void dumpLocked(PrintWriter pw) {
|
||||
pw.println(" HbmObserver");
|
||||
pw.println(" mHbmMode: " + mHbmMode);
|
||||
pw.println(" mHbmActive: " + mHbmActive);
|
||||
pw.println(" mRefreshRateInHbmSunlight: " + mRefreshRateInHbmSunlight);
|
||||
pw.println(" mRefreshRateInHbmHdr: " + mRefreshRateInHbmHdr);
|
||||
}
|
||||
|
||||
@@ -1513,7 +1513,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
||||
mCachedBrightnessInfo.adjustedBrightness,
|
||||
mCachedBrightnessInfo.brightnessMin,
|
||||
mCachedBrightnessInfo.brightnessMax,
|
||||
mCachedBrightnessInfo.hbmMode);
|
||||
mCachedBrightnessInfo.hbmMode,
|
||||
mCachedBrightnessInfo.highBrightnessTransitionPoint);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1528,6 +1529,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
||||
mCachedBrightnessInfo.brightnessMin = mHbmController.getCurrentBrightnessMin();
|
||||
mCachedBrightnessInfo.brightnessMax = mHbmController.getCurrentBrightnessMax();
|
||||
mCachedBrightnessInfo.hbmMode = mHbmController.getHighBrightnessMode();
|
||||
mCachedBrightnessInfo.highBrightnessTransitionPoint =
|
||||
mHbmController.getTransitionPoint();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2211,6 +2214,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
||||
pw.println(" mCachedBrightnessInfo.brightnessMax=" +
|
||||
mCachedBrightnessInfo.brightnessMax);
|
||||
pw.println(" mCachedBrightnessInfo.hbmMode=" + mCachedBrightnessInfo.hbmMode);
|
||||
pw.println(" mCachedBrightnessInfo.highBrightnessTransitionPoint=" +
|
||||
mCachedBrightnessInfo.highBrightnessTransitionPoint);
|
||||
}
|
||||
pw.println(" mDisplayBlanksAfterDozeConfig=" + mDisplayBlanksAfterDozeConfig);
|
||||
pw.println(" mBrightnessBucketsInDozeConfig=" + mBrightnessBucketsInDozeConfig);
|
||||
@@ -2627,5 +2632,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
||||
public float brightnessMin;
|
||||
public float brightnessMax;
|
||||
public int hbmMode;
|
||||
public float highBrightnessTransitionPoint;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,6 +59,9 @@ class HighBrightnessModeController {
|
||||
|
||||
private static final float HDR_PERCENT_OF_SCREEN_REQUIRED = 0.50f;
|
||||
|
||||
@VisibleForTesting
|
||||
static final float HBM_TRANSITION_POINT_INVALID = Float.POSITIVE_INFINITY;
|
||||
|
||||
private final float mBrightnessMin;
|
||||
private final float mBrightnessMax;
|
||||
private final Handler mHandler;
|
||||
@@ -214,6 +217,14 @@ class HighBrightnessModeController {
|
||||
return mHbmMode;
|
||||
}
|
||||
|
||||
float getTransitionPoint() {
|
||||
if (deviceSupportsHbm()) {
|
||||
return mHbmData.transitionPoint;
|
||||
} else {
|
||||
return HBM_TRANSITION_POINT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
void stop() {
|
||||
registerHdrListener(null /*displayToken*/);
|
||||
mSkinThermalStatusObserver.stopObserving();
|
||||
|
||||
@@ -26,6 +26,7 @@ import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_R
|
||||
import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE;
|
||||
|
||||
import static com.android.server.display.DisplayModeDirector.Vote.INVALID_SIZE;
|
||||
import static com.android.server.display.HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
@@ -111,6 +112,7 @@ public class DisplayModeDirectorTest {
|
||||
private static final boolean DEBUG = false;
|
||||
private static final float FLOAT_TOLERANCE = 0.01f;
|
||||
private static final int DISPLAY_ID = 0;
|
||||
private static final float TRANSITION_POINT = 0.763f;
|
||||
|
||||
private Context mContext;
|
||||
private FakesInjector mInjector;
|
||||
@@ -1456,16 +1458,58 @@ public class DisplayModeDirectorTest {
|
||||
Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn on HBM
|
||||
// Turn on HBM, with brightness in the HBM range
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(0.45f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR));
|
||||
new BrightnessInfo(TRANSITION_POINT + FLOAT_TOLERANCE, 0.0f, 1.0f,
|
||||
BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR, TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertVoteForRefreshRate(vote, hbmRefreshRate);
|
||||
|
||||
// Turn on HBM, with brightness below the HBM range
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(TRANSITION_POINT - FLOAT_TOLERANCE, 0.0f, 1.0f,
|
||||
BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR, TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(0.45f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn on HBM, with brightness in the HBM range
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(TRANSITION_POINT + FLOAT_TOLERANCE, 0.0f, 1.0f,
|
||||
BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR, TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertVoteForRefreshRate(vote, hbmRefreshRate);
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(0.45f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF));
|
||||
new BrightnessInfo(0.45f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn on HBM, with brightness below the HBM range
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(TRANSITION_POINT - FLOAT_TOLERANCE, 0.0f, 1.0f,
|
||||
BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR, TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(0.45f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
@@ -1535,7 +1579,8 @@ public class DisplayModeDirectorTest {
|
||||
|
||||
// Turn on HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT));
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertVoteForRefreshRate(vote, initialRefreshRate);
|
||||
@@ -1552,14 +1597,16 @@ public class DisplayModeDirectorTest {
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(0.43f, 0.1f, 0.8f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF));
|
||||
new BrightnessInfo(0.43f, 0.1f, 0.8f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn HBM on again and ensure the updated vote value stuck
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT));
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertVoteForRefreshRate(vote, updatedRefreshRate);
|
||||
@@ -1574,7 +1621,8 @@ public class DisplayModeDirectorTest {
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(0.43f, 0.1f, 0.8f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF));
|
||||
new BrightnessInfo(0.43f, 0.1f, 0.8f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
@@ -1605,14 +1653,82 @@ public class DisplayModeDirectorTest {
|
||||
|
||||
// Turn on HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT));
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(0.43f, 0.1f, 0.8f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF));
|
||||
new BrightnessInfo(0.43f, 0.1f, 0.8f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHbmVoting_HbmUnsupported() {
|
||||
DisplayModeDirector director =
|
||||
createDirectorFromRefreshRateArray(new float[] {60.0f, 90.0f}, 0);
|
||||
director.start(createMockSensorManager());
|
||||
|
||||
ArgumentCaptor<DisplayListener> captor =
|
||||
ArgumentCaptor.forClass(DisplayListener.class);
|
||||
verify(mInjector).registerDisplayListener(captor.capture(), any(Handler.class),
|
||||
eq(DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS
|
||||
| DisplayManager.EVENT_FLAG_DISPLAY_REMOVED));
|
||||
DisplayListener listener = captor.getValue();
|
||||
|
||||
// Specify Limitation
|
||||
when(mDisplayManagerInternalMock.getRefreshRateLimitations(DISPLAY_ID)).thenReturn(
|
||||
List.of(new RefreshRateLimitation(
|
||||
DisplayManagerInternal.REFRESH_RATE_LIMIT_HIGH_BRIGHTNESS_MODE,
|
||||
60.0f, 60.0f)));
|
||||
|
||||
// Verify that there is no HBM vote initially
|
||||
Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn on HBM when HBM is supported; expect a valid transition point and a vote.
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertVoteForRefreshRate(vote, 60.0f);
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn on Sunlight HBM when HBM is unsupported; expect an invalid transition point and
|
||||
// no vote.
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT,
|
||||
HBM_TRANSITION_POINT_INVALID));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn on HDR HBM when HBM is unsupported; expect an invalid transition point and
|
||||
// no vote.
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR,
|
||||
HBM_TRANSITION_POINT_INVALID));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
|
||||
// Turn off HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertNull(vote);
|
||||
@@ -1621,7 +1737,7 @@ public class DisplayModeDirectorTest {
|
||||
private void setHbmAndAssertRefreshRate(
|
||||
DisplayModeDirector director, DisplayListener listener, int mode, float rr) {
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID))
|
||||
.thenReturn(new BrightnessInfo(1.0f, 0.0f, 1.0f, mode));
|
||||
.thenReturn(new BrightnessInfo(1.0f, 0.0f, 1.0f, mode, TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
|
||||
final Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
@@ -1700,7 +1816,8 @@ public class DisplayModeDirectorTest {
|
||||
|
||||
// Turn on HBM
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT));
|
||||
new BrightnessInfo(1.0f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT,
|
||||
TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_HIGH_BRIGHTNESS_MODE);
|
||||
assertVoteForRefreshRate(vote, 60.f);
|
||||
@@ -1861,7 +1978,7 @@ public class DisplayModeDirectorTest {
|
||||
|
||||
when(mInjector.getBrightnessInfo(DISPLAY_ID)).thenReturn(
|
||||
new BrightnessInfo(floatBri, floatAdjBri, 0.0f, 1.0f,
|
||||
BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF));
|
||||
BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF, TRANSITION_POINT));
|
||||
listener.onDisplayChanged(DISPLAY_ID);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR;
|
||||
import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF;
|
||||
import static android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT;
|
||||
|
||||
import static com.android.server.display.HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.spy;
|
||||
@@ -124,6 +126,7 @@ public class HighBrightnessModeControllerTest {
|
||||
mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN,
|
||||
DEFAULT_MAX, null, () -> {}, mContextSpy);
|
||||
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
|
||||
assertEquals(hbmc.getTransitionPoint(), HBM_TRANSITION_POINT_INVALID, 0.0f);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -135,6 +138,7 @@ public class HighBrightnessModeControllerTest {
|
||||
hbmc.setAutoBrightnessEnabled(true);
|
||||
hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range
|
||||
assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF);
|
||||
assertEquals(hbmc.getTransitionPoint(), HBM_TRANSITION_POINT_INVALID, 0.0f);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user