Loading services/core/java/com/android/server/display/brightness/clamper/LightSensorController.java +19 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.Display; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; import com.android.server.display.config.SensorData; import com.android.server.display.utils.AmbientFilter; import com.android.server.display.utils.AmbientFilterFactory; Loading @@ -51,7 +52,8 @@ public class LightSensorController { private final SensorManager mSensorManager; private final LightSensorListener mLightSensorListener; private final Handler mHandler; private final Handler mUpdateHandler; private final Handler mRegistrationHandler; private final Injector mInjector; private final AmbientFilter mAmbientFilter; Loading Loading @@ -80,17 +82,20 @@ public class LightSensorController { LightSensorController(SensorManager sensorManager, Resources resources, LightSensorListener listener, Handler handler) { this(sensorManager, resources, listener, handler, new Injector()); this(sensorManager, resources, listener, handler, BackgroundThread.getHandler(), new Injector()); } @VisibleForTesting LightSensorController(SensorManager sensorManager, Resources resources, LightSensorListener listener, Handler handler, Injector injector) { LightSensorListener listener, Handler updateHandler, Handler registrationHandler, Injector injector) { mSensorManager = sensorManager; mLightSensorRate = injector.getLightSensorRate(resources); mAmbientFilter = injector.getAmbientFilter(resources); mLightSensorListener = listener; mHandler = handler; mUpdateHandler = updateHandler; mRegistrationHandler = registrationHandler; mInjector = injector; } Loading @@ -99,8 +104,12 @@ public class LightSensorController { return; } if (mLightSensor != null) { mSensorManager.registerListener(mLightSensorEventListener, mLightSensor, mLightSensorRate * 1000, mHandler); // move light sensor registration to registration handler, to avoid blocking // updatePowerState Sensor sensorToRegister = mLightSensor; mRegistrationHandler.post( () -> mSensorManager.registerListener(mLightSensorEventListener, sensorToRegister, mLightSensorRate * 1000, mUpdateHandler)); } if (mRegisteredLightSensor != null) { stop(); Loading @@ -116,7 +125,10 @@ public class LightSensorController { if (mRegisteredLightSensor == null) { return; } mSensorManager.unregisterListener(mLightSensorEventListener, mRegisteredLightSensor); Sensor sensorToUnregister = mRegisteredLightSensor; mRegistrationHandler.post(() -> mSensorManager.unregisterListener(mLightSensorEventListener, sensorToUnregister)); mRegisteredLightSensor = null; mAmbientFilter.clear(); mLightSensorListener.onAmbientLuxChange(INVALID_LUX); Loading services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/LightSensorControllerTest.kt +17 −4 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.android.server.display.brightness.clamper.LightSensorController.Light import com.android.server.display.config.SensorData import com.android.server.display.config.createSensorData import com.android.server.display.utils.AmbientFilter import com.android.server.testutils.TestHandler import org.junit.Before import org.junit.Test import org.mockito.kotlin.any Loading @@ -52,6 +53,7 @@ class LightSensorControllerTest { private val mockHandler: Handler = mock() private val mockAmbientFilter: AmbientFilter = mock() private val testHandler = TestHandler(null) private val testInjector = TestInjector() private val dummySensorData = createSensorData() Loading @@ -60,12 +62,13 @@ class LightSensorControllerTest { @Before fun setUp() { controller = LightSensorController(mockSensorManager, mockResources, mockLightSensorListener, mockHandler, testInjector) mockLightSensorListener, mockHandler, testHandler, testInjector) } @Test fun doesNotRegisterLightSensorIfNotConfigured() { controller.restart() testHandler.flush() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } Loading @@ -74,6 +77,7 @@ class LightSensorControllerTest { fun doesNotRegisterLightSensorIfMissing() { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } Loading @@ -84,6 +88,7 @@ class LightSensorControllerTest { .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() verify(mockSensorManager).registerListener(any(), eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) Loading @@ -97,7 +102,9 @@ class LightSensorControllerTest { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() controller.restart() testHandler.flush() verify(mockSensorManager).registerListener(any(), eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) Loading @@ -111,22 +118,27 @@ class LightSensorControllerTest { testInjector.lightSensor = lightSensor1 controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() val lightSensor2 = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) testInjector.lightSensor = lightSensor2 controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() inOrder(mockSensorManager, mockAmbientFilter, mockLightSensorListener) { // first restart verify(mockSensorManager).registerListener(any(), eq(lightSensor1), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) // second restart verify(mockAmbientFilter).clear() verify(mockLightSensorListener).onAmbientLuxChange(LightSensorController.INVALID_LUX) // delayed resubscribe verify(mockSensorManager).registerListener(any(), eq(lightSensor2), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verify(mockSensorManager).unregisterListener(any<SensorEventListener>(), eq(lightSensor1)) verify(mockAmbientFilter).clear() verify(mockLightSensorListener).onAmbientLuxChange(LightSensorController.INVALID_LUX) } verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } Loading @@ -142,6 +154,7 @@ class LightSensorControllerTest { .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() verify(mockSensorManager).registerListener(listenerCaptor.capture(), eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) Loading Loading
services/core/java/com/android/server/display/brightness/clamper/LightSensorController.java +19 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.view.Display; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; import com.android.server.display.config.SensorData; import com.android.server.display.utils.AmbientFilter; import com.android.server.display.utils.AmbientFilterFactory; Loading @@ -51,7 +52,8 @@ public class LightSensorController { private final SensorManager mSensorManager; private final LightSensorListener mLightSensorListener; private final Handler mHandler; private final Handler mUpdateHandler; private final Handler mRegistrationHandler; private final Injector mInjector; private final AmbientFilter mAmbientFilter; Loading Loading @@ -80,17 +82,20 @@ public class LightSensorController { LightSensorController(SensorManager sensorManager, Resources resources, LightSensorListener listener, Handler handler) { this(sensorManager, resources, listener, handler, new Injector()); this(sensorManager, resources, listener, handler, BackgroundThread.getHandler(), new Injector()); } @VisibleForTesting LightSensorController(SensorManager sensorManager, Resources resources, LightSensorListener listener, Handler handler, Injector injector) { LightSensorListener listener, Handler updateHandler, Handler registrationHandler, Injector injector) { mSensorManager = sensorManager; mLightSensorRate = injector.getLightSensorRate(resources); mAmbientFilter = injector.getAmbientFilter(resources); mLightSensorListener = listener; mHandler = handler; mUpdateHandler = updateHandler; mRegistrationHandler = registrationHandler; mInjector = injector; } Loading @@ -99,8 +104,12 @@ public class LightSensorController { return; } if (mLightSensor != null) { mSensorManager.registerListener(mLightSensorEventListener, mLightSensor, mLightSensorRate * 1000, mHandler); // move light sensor registration to registration handler, to avoid blocking // updatePowerState Sensor sensorToRegister = mLightSensor; mRegistrationHandler.post( () -> mSensorManager.registerListener(mLightSensorEventListener, sensorToRegister, mLightSensorRate * 1000, mUpdateHandler)); } if (mRegisteredLightSensor != null) { stop(); Loading @@ -116,7 +125,10 @@ public class LightSensorController { if (mRegisteredLightSensor == null) { return; } mSensorManager.unregisterListener(mLightSensorEventListener, mRegisteredLightSensor); Sensor sensorToUnregister = mRegisteredLightSensor; mRegistrationHandler.post(() -> mSensorManager.unregisterListener(mLightSensorEventListener, sensorToUnregister)); mRegisteredLightSensor = null; mAmbientFilter.clear(); mLightSensorListener.onAmbientLuxChange(INVALID_LUX); Loading
services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/LightSensorControllerTest.kt +17 −4 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.android.server.display.brightness.clamper.LightSensorController.Light import com.android.server.display.config.SensorData import com.android.server.display.config.createSensorData import com.android.server.display.utils.AmbientFilter import com.android.server.testutils.TestHandler import org.junit.Before import org.junit.Test import org.mockito.kotlin.any Loading @@ -52,6 +53,7 @@ class LightSensorControllerTest { private val mockHandler: Handler = mock() private val mockAmbientFilter: AmbientFilter = mock() private val testHandler = TestHandler(null) private val testInjector = TestInjector() private val dummySensorData = createSensorData() Loading @@ -60,12 +62,13 @@ class LightSensorControllerTest { @Before fun setUp() { controller = LightSensorController(mockSensorManager, mockResources, mockLightSensorListener, mockHandler, testInjector) mockLightSensorListener, mockHandler, testHandler, testInjector) } @Test fun doesNotRegisterLightSensorIfNotConfigured() { controller.restart() testHandler.flush() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } Loading @@ -74,6 +77,7 @@ class LightSensorControllerTest { fun doesNotRegisterLightSensorIfMissing() { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } Loading @@ -84,6 +88,7 @@ class LightSensorControllerTest { .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() verify(mockSensorManager).registerListener(any(), eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) Loading @@ -97,7 +102,9 @@ class LightSensorControllerTest { controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() controller.restart() testHandler.flush() verify(mockSensorManager).registerListener(any(), eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) Loading @@ -111,22 +118,27 @@ class LightSensorControllerTest { testInjector.lightSensor = lightSensor1 controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() val lightSensor2 = TestUtils .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) testInjector.lightSensor = lightSensor2 controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() inOrder(mockSensorManager, mockAmbientFilter, mockLightSensorListener) { // first restart verify(mockSensorManager).registerListener(any(), eq(lightSensor1), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) // second restart verify(mockAmbientFilter).clear() verify(mockLightSensorListener).onAmbientLuxChange(LightSensorController.INVALID_LUX) // delayed resubscribe verify(mockSensorManager).registerListener(any(), eq(lightSensor2), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) verify(mockSensorManager).unregisterListener(any<SensorEventListener>(), eq(lightSensor1)) verify(mockAmbientFilter).clear() verify(mockLightSensorListener).onAmbientLuxChange(LightSensorController.INVALID_LUX) } verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener) } Loading @@ -142,6 +154,7 @@ class LightSensorControllerTest { .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT) controller.configure(dummySensorData, DISPLAY_ID) controller.restart() testHandler.flush() verify(mockSensorManager).registerListener(listenerCaptor.capture(), eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler)) Loading