Merge "Fix brightness not being updated when RBC is toggled" into tm-dev

This commit is contained in:
Rupesh Bansal
2022-05-19 08:56:18 +00:00
committed by Android (Google) Code Review
2 changed files with 61 additions and 51 deletions

View File

@@ -1057,6 +1057,7 @@ class AutomaticBrightnessController {
public void recalculateSplines(boolean applyAdjustment, float[] adjustment) {
mCurrentBrightnessMapper.recalculateSplines(applyAdjustment, adjustment);
updateAutoBrightness(true /*sendUpdate*/, false /*isManuallySet*/);
}
private final class AutomaticBrightnessHandler extends Handler {

View File

@@ -30,6 +30,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.hardware.Sensor;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
@@ -73,6 +74,7 @@ public class AutomaticBrightnessControllerTest {
private TestLooper mTestLooper;
private Context mContext;
private AutomaticBrightnessController mController;
private Sensor mLightSensor;
@Mock SensorManager mSensorManager;
@Mock BrightnessMappingStrategy mBrightnessMappingStrategy;
@@ -84,12 +86,14 @@ public class AutomaticBrightnessControllerTest {
@Mock BrightnessThrottler mBrightnessThrottler;
@Before
public void setUp() {
public void setUp() throws Exception {
// Share classloader to allow package private access.
System.setProperty("dexmaker.share_classloader", "true");
MockitoAnnotations.initMocks(this);
mLightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mContext = InstrumentationRegistry.getContext();
mController = setupController(mLightSensor);
}
@After
@@ -101,11 +105,6 @@ public class AutomaticBrightnessControllerTest {
}
}
private void advanceTime(long timeMs) {
mClock.fastForward(timeMs);
mTestLooper.dispatchAll();
}
private AutomaticBrightnessController setupController(Sensor lightSensor) {
mClock = new OffsettableClock.Stopped();
mTestLooper = new TestLooper(mClock::now);
@@ -150,12 +149,9 @@ public class AutomaticBrightnessControllerTest {
@Test
public void testNoHysteresisAtMinBrightness() throws Exception {
Sensor lightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mController = setupController(lightSensor);
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(lightSensor),
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
SensorEventListener listener = listenerCaptor.getValue();
@@ -177,7 +173,7 @@ public class AutomaticBrightnessControllerTest {
.thenReturn(1.0f);
// Send new sensor value and verify
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux1));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux1));
assertEquals(normalizedBrightness1, mController.getAutomaticScreenBrightness(), 0.001f);
// Set up system to return 0.0f (minimum possible brightness) as a brightness value
@@ -191,18 +187,15 @@ public class AutomaticBrightnessControllerTest {
.thenReturn(normalizedBrightness2);
// Send new sensor value and verify
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux2));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux2));
assertEquals(normalizedBrightness2, mController.getAutomaticScreenBrightness(), 0.001f);
}
@Test
public void testNoHysteresisAtMaxBrightness() throws Exception {
Sensor lightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mController = setupController(lightSensor);
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(lightSensor),
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
SensorEventListener listener = listenerCaptor.getValue();
@@ -223,7 +216,7 @@ public class AutomaticBrightnessControllerTest {
.thenReturn(1.1f);
// Send new sensor value and verify
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux1));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux1));
assertEquals(normalizedBrightness1, mController.getAutomaticScreenBrightness(), 0.001f);
@@ -238,23 +231,20 @@ public class AutomaticBrightnessControllerTest {
.thenReturn(normalizedBrightness2);
// Send new sensor value and verify
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux2));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux2));
assertEquals(normalizedBrightness2, mController.getAutomaticScreenBrightness(), 0.001f);
}
@Test
public void testUserAddUserDataPoint() throws Exception {
Sensor lightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mController = setupController(lightSensor);
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(lightSensor),
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
SensorEventListener listener = listenerCaptor.getValue();
// Sensor reads 1000 lux,
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 1000));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 1000));
// User sets brightness to 100
mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration */,
@@ -266,18 +256,43 @@ public class AutomaticBrightnessControllerTest {
}
@Test
public void testSwitchToIdleMappingStrategy() throws Exception {
Sensor lightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mController = setupController(lightSensor);
public void testRecalculateSplines() throws Exception {
// Enabling the light sensor, and setting the ambient lux to 1000
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(lightSensor),
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
SensorEventListener listener = listenerCaptor.getValue();
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 1000));
//Setting the brightnessFloat to 0.5f
float currentBrightnessFloat = 0.5f;
when(mBrightnessMappingStrategy.getBrightness(1000,
null, ApplicationInfo.CATEGORY_UNDEFINED)).thenReturn(currentBrightnessFloat);
mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration */,
currentBrightnessFloat /* brightness */, false /* userChangedBrightness */,
0 /* adjustment */, false /* userChanged */, DisplayPowerRequest.POLICY_BRIGHT);
// Adjusting spline, and accordingly remapping the current 0.5f brightnessFloat to 0.3f
float updatedBrightnessFloat = 0.3f;
when(mBrightnessMappingStrategy.getBrightness(1000,
null, ApplicationInfo.CATEGORY_UNDEFINED)).thenReturn(updatedBrightnessFloat);
float[] adjustments = new float[]{0.2f, 0.5f};
mController.recalculateSplines(true, adjustments);
verify(mBrightnessMappingStrategy).recalculateSplines(true, adjustments);
assertEquals(mController.getAutomaticScreenBrightness(), updatedBrightnessFloat, EPSILON);
}
@Test
public void testSwitchToIdleMappingStrategy() throws Exception {
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
SensorEventListener listener = listenerCaptor.getValue();
// Sensor reads 1000 lux,
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 1000));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 1000));
// User sets brightness to 100
mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration */,
@@ -307,51 +322,48 @@ public class AutomaticBrightnessControllerTest {
@Test
public void testAmbientLightHorizon() throws Exception {
// create abc
Sensor lightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mController = setupController(lightSensor);
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(lightSensor),
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
SensorEventListener listener = listenerCaptor.getValue();
long increment = 500;
// set autobrightness to low
// t = 0
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
// t = 500
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
// t = 1000
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
assertEquals(0.0f, mController.getAmbientLux(), EPSILON);
// t = 1500
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
assertEquals(0.0f, mController.getAmbientLux(), EPSILON);
// t = 2000
// ensure that our reading is at 0.
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
assertEquals(0.0f, mController.getAmbientLux(), EPSILON);
// t = 2500
// first 10000 lux sensor event reading
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 10000));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 10000));
assertTrue(mController.getAmbientLux() > 0.0f);
assertTrue(mController.getAmbientLux() < 10000.0f);
// t = 3000
// lux reading should still not yet be 10000.
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 10000));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 10000));
assertTrue(mController.getAmbientLux() > 0.0f);
assertTrue(mController.getAmbientLux() < 10000.0f);
@@ -360,39 +372,39 @@ public class AutomaticBrightnessControllerTest {
// lux has been high (10000) for 1000ms.
// lux reading should be 10000
// short horizon (ambient lux) is high, long horizon is still not high
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 10000));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 10000));
assertEquals(10000.0f, mController.getAmbientLux(), EPSILON);
// t = 4000
// stay high
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 10000));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 10000));
assertEquals(10000.0f, mController.getAmbientLux(), EPSILON);
// t = 4500
Mockito.clearInvocations(mBrightnessMappingStrategy);
mClock.fastForward(increment);
// short horizon is high, long horizon is high too
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 10000));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 10000));
verify(mBrightnessMappingStrategy, times(1)).getBrightness(10000, null, -1);
assertEquals(10000.0f, mController.getAmbientLux(), EPSILON);
// t = 5000
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
assertTrue(mController.getAmbientLux() > 0.0f);
assertTrue(mController.getAmbientLux() < 10000.0f);
// t = 5500
mClock.fastForward(increment);
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
assertTrue(mController.getAmbientLux() > 0.0f);
assertTrue(mController.getAmbientLux() < 10000.0f);
// t = 6000
mClock.fastForward(increment);
// ambient lux goes to 0
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 0));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 0));
assertEquals(0.0f, mController.getAmbientLux(), EPSILON);
}
@@ -427,12 +439,9 @@ public class AutomaticBrightnessControllerTest {
@Test
public void testBrightnessGetsThrottled() throws Exception {
Sensor lightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mController = setupController(lightSensor);
ArgumentCaptor<SensorEventListener> listenerCaptor =
ArgumentCaptor.forClass(SensorEventListener.class);
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(lightSensor),
verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
eq(INITIAL_LIGHT_SENSOR_RATE * 1000), any(Handler.class));
SensorEventListener listener = listenerCaptor.getValue();
@@ -447,7 +456,7 @@ public class AutomaticBrightnessControllerTest {
.thenReturn(normalizedBrightness);
// Sensor reads 100 lux. We should get max brightness.
listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, (int) lux));
listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, (int) lux));
assertEquals(BRIGHTNESS_MAX_FLOAT, mController.getAutomaticScreenBrightness(), 0.0f);
// Apply throttling and notify ABC (simulates DisplayPowerController#updatePowerState())