diff options
author | Santos Cordon <santoscordon@google.com> | 2022-01-14 17:26:13 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-02-24 02:43:36 +0000 |
commit | f24d549cc6f025c5559b257708954c5987595bde (patch) | |
tree | 34292ff723c389941fa4eff7f09c36f85e790778 | |
parent | 7ace3f267538f0f4ddec44f7711d3d268c4b58dc (diff) | |
download | base-f24d549cc6f025c5559b257708954c5987595bde.tar.gz |
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
(cherry picked from commit 817d2df3a73dfd8632690d36fdae9378d5d96b63)
Merged-In:I20d93322cc42c28bc2c74c9ce048b0f550bb8127
3 files changed, 89 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java index 2c2a2bf24cfd..17215e5ae4ad 100644 --- a/services/core/java/com/android/server/display/BrightnessTracker.java +++ b/services/core/java/com/android/server/display/BrightnessTracker.java @@ -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); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index e4cda38e4ae5..77c1fc031598 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -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(); diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java index bdf94f3a2882..356600d84099 100644 --- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java @@ -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 |