Loading services/core/java/com/android/server/display/BrightnessTracker.java +31 −3 Original line number Diff line number Diff line Loading @@ -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"); Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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()); } } Loading Loading @@ -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()); Loading Loading @@ -1017,6 +1043,9 @@ public class BrightnessTracker { disableColorSampling(); } break; case MSG_SENSOR_CHANGED: handleSensorChanged((Sensor) msg.obj); break; } } Loading Loading @@ -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); } Loading services/core/java/com/android/server/display/DisplayPowerController.java +3 −1 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -925,6 +924,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } loadAmbientLightSensor(); if (mBrightnessTracker != null) { mBrightnessTracker.setLightSensor(mLightSensor); } if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.stop(); Loading services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java +55 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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); Loading Loading @@ -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)); } Loading Loading @@ -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<>(); Loading Loading @@ -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 Loading Loading
services/core/java/com/android/server/display/BrightnessTracker.java +31 −3 Original line number Diff line number Diff line Loading @@ -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"); Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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()); } } Loading Loading @@ -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()); Loading Loading @@ -1017,6 +1043,9 @@ public class BrightnessTracker { disableColorSampling(); } break; case MSG_SENSOR_CHANGED: handleSensorChanged((Sensor) msg.obj); break; } } Loading Loading @@ -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); } Loading
services/core/java/com/android/server/display/DisplayPowerController.java +3 −1 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -925,6 +924,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } loadAmbientLightSensor(); if (mBrightnessTracker != null) { mBrightnessTracker.setLightSensor(mLightSensor); } if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.stop(); Loading
services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java +55 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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); Loading Loading @@ -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)); } Loading Loading @@ -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<>(); Loading Loading @@ -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 Loading