Translate the float scale value to a nit value when transferring the short-term model

Note: if the device does not support nits, the short-term model will not be transferred.

Bug: 270715892
Test: Manual with extra logs
Change-Id: I15c0da84c87f73c0eba2748c1da107384867023d
This commit is contained in:
Piotr Wilczyński
2023-03-02 10:52:50 +00:00
parent 8e9d00cddb
commit 73dee75148
4 changed files with 149 additions and 12 deletions

View File

@@ -1056,10 +1056,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
float userLux = BrightnessMappingStrategy.NO_USER_LUX;
float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS;
float userNits = -1;
if (mInteractiveModeBrightnessMapper != null) {
userLux = mInteractiveModeBrightnessMapper.getUserLux();
userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness();
float userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness();
userNits = mInteractiveModeBrightnessMapper.convertToNits(userBrightness);
}
final boolean isIdleScreenBrightnessEnabled = resources.getBoolean(
@@ -1179,6 +1180,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (mAutomaticBrightnessController != null) {
mAutomaticBrightnessController.stop();
}
float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS;
if (userNits >= 0) {
userBrightness = mInteractiveModeBrightnessMapper.convertToFloatScale(userNits);
if (userBrightness == PowerManager.BRIGHTNESS_INVALID_FLOAT) {
userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS;
}
}
mAutomaticBrightnessController = mInjector.getAutomaticBrightnessController(
this, handler.getLooper(), mSensorManager, mLightSensor,
mInteractiveModeBrightnessMapper, lightSensorWarmUpTimeConfig,

View File

@@ -893,10 +893,11 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
}
float userLux = BrightnessMappingStrategy.NO_USER_LUX;
float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS;
float userNits = -1;
if (mInteractiveModeBrightnessMapper != null) {
userLux = mInteractiveModeBrightnessMapper.getUserLux();
userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness();
float userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness();
userNits = mInteractiveModeBrightnessMapper.convertToNits(userBrightness);
}
final boolean isIdleScreenBrightnessEnabled = resources.getBoolean(
@@ -1016,6 +1017,13 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
if (mAutomaticBrightnessController != null) {
mAutomaticBrightnessController.stop();
}
float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS;
if (userNits >= 0) {
userBrightness = mInteractiveModeBrightnessMapper.convertToFloatScale(userNits);
if (userBrightness == PowerManager.BRIGHTNESS_INVALID_FLOAT) {
userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS;
}
}
mAutomaticBrightnessController = mInjector.getAutomaticBrightnessController(
this, handler.getLooper(), mSensorManager, mLightSensor,
mInteractiveModeBrightnessMapper, lightSensorWarmUpTimeConfig,

View File

@@ -21,11 +21,14 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
@@ -672,6 +675,7 @@ public final class DisplayPowerController2Test {
@Test
public void testStopScreenOffBrightnessSensorControllerWhenDisplayDeviceChanges() {
// New display device
setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
mock(DisplayDeviceConfig.class), /* isEnabled= */ true);
@@ -711,6 +715,56 @@ public final class DisplayPowerController2Test {
verify(mHolder.animator, times(2)).animateTo(eq(newBrightness), anyFloat(), anyFloat());
}
@Test
public void testShortTermModelPersistsWhenDisplayDeviceChanges() {
float lux = 2000;
float brightness = 0.4f;
float nits = 500;
when(mHolder.brightnessMappingStrategy.getUserLux()).thenReturn(lux);
when(mHolder.brightnessMappingStrategy.getUserBrightness()).thenReturn(brightness);
when(mHolder.brightnessMappingStrategy.convertToNits(brightness)).thenReturn(nits);
when(mHolder.brightnessMappingStrategy.convertToFloatScale(nits)).thenReturn(brightness);
DisplayPowerRequest dpr = new DisplayPowerRequest();
mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
advanceTime(1);
clearInvocations(mHolder.injector);
// New display device
setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
mock(DisplayDeviceConfig.class), /* isEnabled= */ true);
mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY);
advanceTime(1);
verify(mHolder.injector).getAutomaticBrightnessController(
any(AutomaticBrightnessController.Callbacks.class),
any(Looper.class),
eq(mSensorManagerMock),
any(),
eq(mHolder.brightnessMappingStrategy),
anyInt(),
anyFloat(),
anyFloat(),
anyFloat(),
anyInt(),
anyInt(),
anyLong(),
anyLong(),
anyBoolean(),
any(HysteresisLevels.class),
any(HysteresisLevels.class),
any(HysteresisLevels.class),
any(HysteresisLevels.class),
eq(mContextSpy),
any(HighBrightnessModeController.class),
any(BrightnessThrottler.class),
isNull(),
anyInt(),
anyInt(),
eq(lux),
eq(brightness)
);
}
/**
* Creates a mock and registers it to {@link LocalServices}.
*/
@@ -796,9 +850,9 @@ public final class DisplayPowerController2Test {
final ScreenOffBrightnessSensorController screenOffBrightnessSensorController =
mock(ScreenOffBrightnessSensorController.class);
TestInjector injector = new TestInjector(displayPowerState, animator,
TestInjector injector = spy(new TestInjector(displayPowerState, animator,
automaticBrightnessController, wakelockController, brightnessMappingStrategy,
hysteresisLevels, screenOffBrightnessSensorController);
hysteresisLevels, screenOffBrightnessSensorController));
final LogicalDisplay display = mock(LogicalDisplay.class);
final DisplayDevice device = mock(DisplayDevice.class);
@@ -816,7 +870,8 @@ public final class DisplayPowerController2Test {
return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting,
animator, automaticBrightnessController, wakelockController,
screenOffBrightnessSensorController, hbmMetadata);
screenOffBrightnessSensorController, hbmMetadata, brightnessMappingStrategy,
injector);
}
/**
@@ -833,6 +888,8 @@ public final class DisplayPowerController2Test {
public final WakelockController wakelockController;
public final ScreenOffBrightnessSensorController screenOffBrightnessSensorController;
public final HighBrightnessModeMetadata hbmMetadata;
public final BrightnessMappingStrategy brightnessMappingStrategy;
public final DisplayPowerController2.Injector injector;
DisplayPowerControllerHolder(DisplayPowerController2 dpc, LogicalDisplay display,
DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting,
@@ -840,7 +897,9 @@ public final class DisplayPowerController2Test {
AutomaticBrightnessController automaticBrightnessController,
WakelockController wakelockController,
ScreenOffBrightnessSensorController screenOffBrightnessSensorController,
HighBrightnessModeMetadata hbmMetadata) {
HighBrightnessModeMetadata hbmMetadata,
BrightnessMappingStrategy brightnessMappingStrategy,
DisplayPowerController2.Injector injector) {
this.dpc = dpc;
this.display = display;
this.displayPowerState = displayPowerState;
@@ -850,6 +909,8 @@ public final class DisplayPowerController2Test {
this.wakelockController = wakelockController;
this.screenOffBrightnessSensorController = screenOffBrightnessSensorController;
this.hbmMetadata = hbmMetadata;
this.brightnessMappingStrategy = brightnessMappingStrategy;
this.injector = injector;
}
}

View File

@@ -21,11 +21,14 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
@@ -676,6 +679,7 @@ public final class DisplayPowerControllerTest {
@Test
public void testStopScreenOffBrightnessSensorControllerWhenDisplayDeviceChanges() {
// New display device
setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
mock(DisplayDeviceConfig.class), /* isEnabled= */ true);
@@ -715,6 +719,56 @@ public final class DisplayPowerControllerTest {
verify(mHolder.animator, times(2)).animateTo(eq(newBrightness), anyFloat(), anyFloat());
}
@Test
public void testShortTermModelPersistsWhenDisplayDeviceChanges() {
float lux = 2000;
float brightness = 0.4f;
float nits = 500;
when(mHolder.brightnessMappingStrategy.getUserLux()).thenReturn(lux);
when(mHolder.brightnessMappingStrategy.getUserBrightness()).thenReturn(brightness);
when(mHolder.brightnessMappingStrategy.convertToNits(brightness)).thenReturn(nits);
when(mHolder.brightnessMappingStrategy.convertToFloatScale(nits)).thenReturn(brightness);
DisplayPowerRequest dpr = new DisplayPowerRequest();
mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
advanceTime(1);
clearInvocations(mHolder.injector);
// New display device
setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
mock(DisplayDeviceConfig.class), /* isEnabled= */ true);
mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY);
advanceTime(1);
verify(mHolder.injector).getAutomaticBrightnessController(
any(AutomaticBrightnessController.Callbacks.class),
any(Looper.class),
eq(mSensorManagerMock),
any(),
eq(mHolder.brightnessMappingStrategy),
anyInt(),
anyFloat(),
anyFloat(),
anyFloat(),
anyInt(),
anyInt(),
anyLong(),
anyLong(),
anyBoolean(),
any(HysteresisLevels.class),
any(HysteresisLevels.class),
any(HysteresisLevels.class),
any(HysteresisLevels.class),
eq(mContextSpy),
any(HighBrightnessModeController.class),
any(BrightnessThrottler.class),
isNull(),
anyInt(),
anyInt(),
eq(lux),
eq(brightness)
);
}
/**
* Creates a mock and registers it to {@link LocalServices}.
*/
@@ -799,9 +853,9 @@ public final class DisplayPowerControllerTest {
final ScreenOffBrightnessSensorController screenOffBrightnessSensorController =
mock(ScreenOffBrightnessSensorController.class);
DisplayPowerController.Injector injector = new TestInjector(displayPowerState, animator,
DisplayPowerController.Injector injector = spy(new TestInjector(displayPowerState, animator,
automaticBrightnessController, brightnessMappingStrategy, hysteresisLevels,
screenOffBrightnessSensorController);
screenOffBrightnessSensorController));
final LogicalDisplay display = mock(LogicalDisplay.class);
final DisplayDevice device = mock(DisplayDevice.class);
@@ -819,7 +873,7 @@ public final class DisplayPowerControllerTest {
return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting,
animator, automaticBrightnessController, screenOffBrightnessSensorController,
hbmMetadata);
hbmMetadata, brightnessMappingStrategy, injector);
}
/**
@@ -835,13 +889,17 @@ public final class DisplayPowerControllerTest {
public final AutomaticBrightnessController automaticBrightnessController;
public final ScreenOffBrightnessSensorController screenOffBrightnessSensorController;
public final HighBrightnessModeMetadata hbmMetadata;
public final BrightnessMappingStrategy brightnessMappingStrategy;
public final DisplayPowerController.Injector injector;
DisplayPowerControllerHolder(DisplayPowerController dpc, LogicalDisplay display,
DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting,
DualRampAnimator<DisplayPowerState> animator,
AutomaticBrightnessController automaticBrightnessController,
ScreenOffBrightnessSensorController screenOffBrightnessSensorController,
HighBrightnessModeMetadata hbmMetadata) {
HighBrightnessModeMetadata hbmMetadata,
BrightnessMappingStrategy brightnessMappingStrategy,
DisplayPowerController.Injector injector) {
this.dpc = dpc;
this.display = display;
this.displayPowerState = displayPowerState;
@@ -850,6 +908,8 @@ public final class DisplayPowerControllerTest {
this.automaticBrightnessController = automaticBrightnessController;
this.screenOffBrightnessSensorController = screenOffBrightnessSensorController;
this.hbmMetadata = hbmMetadata;
this.brightnessMappingStrategy = brightnessMappingStrategy;
this.injector = injector;
}
}