Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 511110aa authored by petsjonkin's avatar petsjonkin
Browse files

Moving lightSensor subscritpion to bg thread

Subscribe to lightSensor in background to avoid blocking updatePowerState

Bug: b/394274826, b/404365338
Test: atest LightSensorControllerTest
Flag: EXEMPT bugfix

Change-Id: I759611a0eb130bebd33a4263e2c4d17a0db70ef8
parent 815fdd84
Loading
Loading
Loading
Loading
+19 −7
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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;
    }

@@ -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();
@@ -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);
+17 −4
Original line number Diff line number Diff line
@@ -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
@@ -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()

@@ -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)
    }
@@ -74,6 +77,7 @@ class LightSensorControllerTest {
    fun doesNotRegisterLightSensorIfMissing() {
        controller.configure(dummySensorData, DISPLAY_ID)
        controller.restart()
        testHandler.flush()

        verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener)
    }
@@ -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))
@@ -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))
@@ -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)
    }
@@ -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))