Update BrightnessTracker to use same sensor as ABC.

Bug: 209948220
Test: manually check the sensor for BrightnessTracker using
      dumpsys display.
Test: atest BrightnessTrackerTest
Change-Id: I20d93322cc42c28bc2c74c9ce048b0f550bb8127
This commit is contained in:
Santos Cordon
2022-01-14 17:26:13 +00:00
committed by Chris Kuiper
parent 6f989effda
commit 817d2df3a7
3 changed files with 89 additions and 5 deletions

View File

@@ -131,6 +131,7 @@ public class BrightnessTracker {
private static final int MSG_STOP_SENSOR_LISTENER = 2;
private static final int MSG_START_SENSOR_LISTENER = 3;
private static final int MSG_BRIGHTNESS_CONFIG_CHANGED = 4;
private static final int MSG_SENSOR_CHANGED = 5;
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
@@ -158,6 +159,7 @@ public class BrightnessTracker {
// These members should only be accessed on the mBgHandler thread.
private BroadcastReceiver mBroadcastReceiver;
private SensorListener mSensorListener;
private Sensor mLightSensor;
private SettingsObserver mSettingsObserver;
private DisplayListener mDisplayListener;
private boolean mSensorRegistered;
@@ -327,6 +329,14 @@ public class BrightnessTracker {
m.sendToTarget();
}
/**
* Updates the light sensor to use.
*/
public void setLightSensor(Sensor lightSensor) {
mBgHandler.obtainMessage(MSG_SENSOR_CHANGED, 0 /*unused*/, 0/*unused*/, lightSensor)
.sendToTarget();
}
private void handleBrightnessChanged(float brightness, boolean userInitiated,
float powerBrightnessFactor, boolean isUserSetBrightness,
boolean isDefaultBrightnessConfig, long timestamp, String uniqueDisplayId) {
@@ -428,13 +438,28 @@ public class BrightnessTracker {
}
}
private void handleSensorChanged(Sensor lightSensor) {
if (mLightSensor != lightSensor) {
mLightSensor = lightSensor;
stopSensorListener();
synchronized (mDataCollectionLock) {
mLastSensorReadings.clear();
}
// Attempt to restart the sensor listener. It will check to see if it should be running
// so there is no need to also check here.
startSensorListener();
}
}
private void startSensorListener() {
if (!mSensorRegistered
&& mLightSensor != null
&& mAmbientBrightnessStatsTracker != null
&& mInjector.isInteractive(mContext)
&& mInjector.isBrightnessModeAutomatic(mContentResolver)) {
mAmbientBrightnessStatsTracker.start();
mSensorRegistered = true;
mInjector.registerSensorListener(mContext, mSensorListener,
mInjector.registerSensorListener(mContext, mSensorListener, mLightSensor,
mInjector.getBackgroundHandler());
}
}
@@ -736,6 +761,7 @@ public class BrightnessTracker {
pw.println("BrightnessTracker state:");
synchronized (mDataCollectionLock) {
pw.println(" mStarted=" + mStarted);
pw.println(" mLightSensor=" + mLightSensor);
pw.println(" mLastBatteryLevel=" + mLastBatteryLevel);
pw.println(" mLastBrightness=" + mLastBrightness);
pw.println(" mLastSensorReadings.size=" + mLastSensorReadings.size());
@@ -1017,6 +1043,9 @@ public class BrightnessTracker {
disableColorSampling();
}
break;
case MSG_SENSOR_CHANGED:
handleSensorChanged((Sensor) msg.obj);
break;
}
}
@@ -1045,9 +1074,8 @@ public class BrightnessTracker {
@VisibleForTesting
static class Injector {
public void registerSensorListener(Context context,
SensorEventListener sensorListener, Handler handler) {
SensorEventListener sensorListener, Sensor lightSensor, Handler handler) {
SensorManager sensorManager = context.getSystemService(SensorManager.class);
Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(sensorListener,
lightSensor, SensorManager.SENSOR_DELAY_NORMAL, handler);
}

View File

@@ -795,7 +795,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
// All properties that depend on the associated DisplayDevice and the DDC must be
// updated here.
loadAmbientLightSensor();
loadBrightnessRampRates();
loadProximitySensor();
loadNitsRange(mContext.getResources());
@@ -925,6 +924,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
loadAmbientLightSensor();
if (mBrightnessTracker != null) {
mBrightnessTracker.setLightSensor(mLightSensor);
}
if (mAutomaticBrightnessController != null) {
mAutomaticBrightnessController.stop();

View File

@@ -33,6 +33,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ParceledListSlice;
import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.display.AmbientBrightnessDayStats;
@@ -42,6 +43,7 @@ import android.hardware.display.ColorDisplayManager;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayedContentSample;
import android.hardware.display.DisplayedContentSamplingAttributes;
import android.hardware.input.InputSensorInfo;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.HandlerThread;
@@ -63,6 +65,8 @@ import com.android.internal.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -84,8 +88,11 @@ public class BrightnessTrackerTest {
private static final String DEFAULT_DISPLAY_ID = "123";
private static final float FLOAT_DELTA = 0.01f;
@Mock private InputSensorInfo mInputSensorInfoMock;
private BrightnessTracker mTracker;
private TestInjector mInjector;
private Sensor mLightSensorFake;
private static Object sHandlerLock = new Object();
private static Handler sHandler;
@@ -108,9 +115,12 @@ public class BrightnessTrackerTest {
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mInjector = new TestInjector(ensureHandler());
mLightSensorFake = new Sensor(mInputSensorInfoMock);
mTracker = new BrightnessTracker(InstrumentationRegistry.getContext(), mInjector);
mTracker.setLightSensor(mLightSensorFake);
mDefaultNightModeColorTemperature =
InstrumentationRegistry.getContext().getResources().getInteger(
R.integer.config_nightDisplayColorTemperatureDefault);
@@ -834,6 +844,47 @@ public class BrightnessTrackerTest {
mTracker.stop();
}
@Test
public void testLightSensorChange() {
// verify the tracker started correctly and a listener registered
startTracker(mTracker);
assertNotNull(mInjector.mSensorListener);
assertEquals(mInjector.mLightSensor, mLightSensorFake);
// Setting the sensor to null should stop the registered listener.
mTracker.setLightSensor(null);
mInjector.waitForHandler();
assertNull(mInjector.mSensorListener);
assertNull(mInjector.mLightSensor);
// Resetting sensor should start listener again
mTracker.setLightSensor(mLightSensorFake);
mInjector.waitForHandler();
assertNotNull(mInjector.mSensorListener);
assertEquals(mInjector.mLightSensor, mLightSensorFake);
Sensor secondSensor = new Sensor(mInputSensorInfoMock);
// Setting a different listener should keep things working
mTracker.setLightSensor(secondSensor);
mInjector.waitForHandler();
assertNotNull(mInjector.mSensorListener);
assertEquals(mInjector.mLightSensor, secondSensor);
}
@Test
public void testSetLightSensorDoesntStartListener() {
mTracker.setLightSensor(mLightSensorFake);
assertNull(mInjector.mSensorListener);
}
@Test
public void testNullLightSensorWontRegister() {
mTracker.setLightSensor(null);
startTracker(mTracker);
assertNull(mInjector.mSensorListener);
assertNull(mInjector.mLightSensor);
}
private InputStream getInputStream(String data) {
return new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
}
@@ -924,6 +975,7 @@ public class BrightnessTrackerTest {
private class TestInjector extends BrightnessTracker.Injector {
SensorEventListener mSensorListener;
Sensor mLightSensor;
BroadcastReceiver mBroadcastReceiver;
DisplayManager.DisplayListener mDisplayListener;
Map<String, Integer> mSecureIntSettings = new HashMap<>();
@@ -974,14 +1026,16 @@ public class BrightnessTrackerTest {
@Override
public void registerSensorListener(Context context,
SensorEventListener sensorListener, Handler handler) {
SensorEventListener sensorListener, Sensor lightSensor, Handler handler) {
mSensorListener = sensorListener;
mLightSensor = lightSensor;
}
@Override
public void unregisterSensorListener(Context context,
SensorEventListener sensorListener) {
mSensorListener = null;
mLightSensor = null;
}
@Override