Merge "Update BrightnessTracker to use same sensor as ABC." into sc-v2-dev

This commit is contained in:
Chris Kuiper
2022-02-16 16:32:08 +00:00
committed by Android (Google) Code Review
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_STOP_SENSOR_LISTENER = 2;
private static final int MSG_START_SENSOR_LISTENER = 3; private static final int MSG_START_SENSOR_LISTENER = 3;
private static final int MSG_BRIGHTNESS_CONFIG_CHANGED = 4; 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"); 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. // These members should only be accessed on the mBgHandler thread.
private BroadcastReceiver mBroadcastReceiver; private BroadcastReceiver mBroadcastReceiver;
private SensorListener mSensorListener; private SensorListener mSensorListener;
private Sensor mLightSensor;
private SettingsObserver mSettingsObserver; private SettingsObserver mSettingsObserver;
private DisplayListener mDisplayListener; private DisplayListener mDisplayListener;
private boolean mSensorRegistered; private boolean mSensorRegistered;
@@ -327,6 +329,14 @@ public class BrightnessTracker {
m.sendToTarget(); 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, private void handleBrightnessChanged(float brightness, boolean userInitiated,
float powerBrightnessFactor, boolean isUserSetBrightness, float powerBrightnessFactor, boolean isUserSetBrightness,
boolean isDefaultBrightnessConfig, long timestamp, String uniqueDisplayId) { 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() { private void startSensorListener() {
if (!mSensorRegistered if (!mSensorRegistered
&& mLightSensor != null
&& mAmbientBrightnessStatsTracker != null
&& mInjector.isInteractive(mContext) && mInjector.isInteractive(mContext)
&& mInjector.isBrightnessModeAutomatic(mContentResolver)) { && mInjector.isBrightnessModeAutomatic(mContentResolver)) {
mAmbientBrightnessStatsTracker.start(); mAmbientBrightnessStatsTracker.start();
mSensorRegistered = true; mSensorRegistered = true;
mInjector.registerSensorListener(mContext, mSensorListener, mInjector.registerSensorListener(mContext, mSensorListener, mLightSensor,
mInjector.getBackgroundHandler()); mInjector.getBackgroundHandler());
} }
} }
@@ -736,6 +761,7 @@ public class BrightnessTracker {
pw.println("BrightnessTracker state:"); pw.println("BrightnessTracker state:");
synchronized (mDataCollectionLock) { synchronized (mDataCollectionLock) {
pw.println(" mStarted=" + mStarted); pw.println(" mStarted=" + mStarted);
pw.println(" mLightSensor=" + mLightSensor);
pw.println(" mLastBatteryLevel=" + mLastBatteryLevel); pw.println(" mLastBatteryLevel=" + mLastBatteryLevel);
pw.println(" mLastBrightness=" + mLastBrightness); pw.println(" mLastBrightness=" + mLastBrightness);
pw.println(" mLastSensorReadings.size=" + mLastSensorReadings.size()); pw.println(" mLastSensorReadings.size=" + mLastSensorReadings.size());
@@ -1017,6 +1043,9 @@ public class BrightnessTracker {
disableColorSampling(); disableColorSampling();
} }
break; break;
case MSG_SENSOR_CHANGED:
handleSensorChanged((Sensor) msg.obj);
break;
} }
} }
@@ -1045,9 +1074,8 @@ public class BrightnessTracker {
@VisibleForTesting @VisibleForTesting
static class Injector { static class Injector {
public void registerSensorListener(Context context, public void registerSensorListener(Context context,
SensorEventListener sensorListener, Handler handler) { SensorEventListener sensorListener, Sensor lightSensor, Handler handler) {
SensorManager sensorManager = context.getSystemService(SensorManager.class); SensorManager sensorManager = context.getSystemService(SensorManager.class);
Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(sensorListener, sensorManager.registerListener(sensorListener,
lightSensor, SensorManager.SENSOR_DELAY_NORMAL, handler); 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) { private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
// All properties that depend on the associated DisplayDevice and the DDC must be // All properties that depend on the associated DisplayDevice and the DDC must be
// updated here. // updated here.
loadAmbientLightSensor();
loadBrightnessRampRates(); loadBrightnessRampRates();
loadProximitySensor(); loadProximitySensor();
loadNitsRange(mContext.getResources()); loadNitsRange(mContext.getResources());
@@ -925,6 +924,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
} }
loadAmbientLightSensor(); loadAmbientLightSensor();
if (mBrightnessTracker != null) {
mBrightnessTracker.setLightSensor(mLightSensor);
}
if (mAutomaticBrightnessController != null) { if (mAutomaticBrightnessController != null) {
mAutomaticBrightnessController.stop(); mAutomaticBrightnessController.stop();

View File

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