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

Commit 7fc8c3b3 authored by Joe Bolinger's avatar Joe Bolinger Committed by Android (Google) Code Review
Browse files

Merge "Ensure await lux calls are completed when there is no sensor activity." into tm-qpr-dev

parents b748cc39 ec5da04c
Loading
Loading
Loading
Loading
+27 −25
Original line number Diff line number Diff line
@@ -52,16 +52,13 @@ final class ALSProbe implements Probe {
    private boolean mDestroyed = false;
    private boolean mDestroyRequested = false;
    private boolean mDisableRequested = false;
    private volatile NextConsumer mNextConsumer = null;
    private NextConsumer mNextConsumer = null;
    private volatile float mLastAmbientLux = -1;

    private final SensorEventListener mLightSensorListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            mLastAmbientLux = event.values[0];
            if (mNextConsumer != null) {
                completeNextConsumer(mLastAmbientLux);
            }
            onNext(event.values[0]);
        }

        @Override
@@ -133,11 +130,29 @@ final class ALSProbe implements Probe {

        // if a final consumer is set it will call destroy/disable on the next value if requested
        if (!mDestroyed && mNextConsumer == null) {
            disable();
            disableLightSensorLoggingLocked();
            mDestroyed = true;
        }
    }

    private synchronized void onNext(float value) {
        mLastAmbientLux = value;

        final NextConsumer consumer = mNextConsumer;
        mNextConsumer = null;
        if (consumer != null) {
            Slog.v(TAG, "Finishing next consumer");

            if (mDestroyRequested) {
                destroy();
            } else if (mDisableRequested) {
                disable();
            }

            consumer.consume(value);
        }
    }

    /** The most recent lux reading. */
    public float getMostRecentLux() {
        return mLastAmbientLux;
@@ -160,7 +175,7 @@ final class ALSProbe implements Probe {
            @Nullable Handler handler) {
        final NextConsumer nextConsumer = new NextConsumer(consumer, handler);
        final float current = mLastAmbientLux;
        if (current > 0) {
        if (current > -1f) {
            nextConsumer.consume(current);
        } else if (mDestroyed) {
            nextConsumer.consume(-1f);
@@ -172,23 +187,6 @@ final class ALSProbe implements Probe {
        }
    }

    private synchronized void completeNextConsumer(float value) {
        Slog.v(TAG, "Finishing next consumer");

        final NextConsumer consumer = mNextConsumer;
        mNextConsumer = null;

        if (mDestroyRequested) {
            destroy();
        } else if (mDisableRequested) {
            disable();
        }

        if (consumer != null) {
            consumer.consume(value);
        }
    }

    private void enableLightSensorLoggingLocked() {
        if (!mEnabled) {
            mEnabled = true;
@@ -219,9 +217,13 @@ final class ALSProbe implements Probe {
        }
    }

    private void onTimeout() {
    private synchronized void onTimeout() {
        Slog.e(TAG, "Max time exceeded for ALS logger - disabling: "
                + mLightSensorListener.hashCode());

        // if consumers are waiting but there was no sensor change, complete them with the latest
        // value before disabling
        onNext(mLastAmbientLux);
        disable();
    }

+17 −0
Original line number Diff line number Diff line
@@ -177,6 +177,23 @@ public class ALSProbeTest {
        assertThat(mProbe.getMostRecentLux()).isLessThan(0f);
    }

    @Test
    public void testWatchDogCompletesAwait() {
        mProbe.enable();

        AtomicInteger lux = new AtomicInteger(-9);
        mProbe.awaitNextLux((v) -> lux.set(Math.round(v)), null /* handler */);

        verify(mSensorManager).registerListener(
                mSensorEventListenerCaptor.capture(), any(), anyInt());

        moveTimeBy(TIMEOUT_MS);

        assertThat(lux.get()).isEqualTo(-1);
        verify(mSensorManager).unregisterListener(any(SensorEventListener.class));
        verifyNoMoreInteractions(mSensorManager);
    }

    @Test
    public void testNextLuxWhenAlreadyEnabledAndNotAvailable() {
        testNextLuxWhenAlreadyEnabled(false /* dataIsAvailable */);