diff options
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java | 11 | ||||
-rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java | 98 |
2 files changed, 107 insertions, 2 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java index a1cabff4c7aa..5790ba36ac5c 100644 --- a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java +++ b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java @@ -28,6 +28,7 @@ import android.os.HandlerThread; import android.os.MemoryFile; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import java.util.List; @@ -46,7 +47,7 @@ public class AsyncSensorManager extends SensorManager { private final SensorManager mInner; private final List<Sensor> mSensorCache; private final HandlerThread mHandlerThread = new HandlerThread("async_sensor"); - private final Handler mHandler; + @VisibleForTesting final Handler mHandler; public AsyncSensorManager(SensorManager inner) { mInner = inner; @@ -150,6 +151,12 @@ public class AsyncSensorManager extends SensorManager { @Override protected void unregisterListenerImpl(SensorEventListener listener, Sensor sensor) { - mHandler.post(() -> mInner.unregisterListener(listener, sensor)); + mHandler.post(() -> { + if (sensor == null) { + mInner.unregisterListener(listener); + } else { + mInner.unregisterListener(listener, sensor); + } + }); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java new file mode 100644 index 000000000000..469bdc0918d9 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.util; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.support.test.filters.SmallTest; +import android.testing.AndroidTestingRunner; + +import com.android.systemui.SysuiTestCase; +import com.android.systemui.utils.hardware.FakeSensorManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +public class AsyncSensorManagerTest extends SysuiTestCase { + + private TestableAsyncSensorManager mAsyncSensorManager; + private FakeSensorManager mFakeSensorManager; + private SensorEventListener mListener; + private FakeSensorManager.MockProximitySensor mSensor; + + @Before + public void setUp() throws Exception { + mFakeSensorManager = new FakeSensorManager(mContext); + mAsyncSensorManager = new TestableAsyncSensorManager(mFakeSensorManager); + mSensor = mFakeSensorManager.getMockProximitySensor(); + mListener = mock(SensorEventListener.class); + } + + @Test + public void registerListenerImpl() throws Exception { + mAsyncSensorManager.registerListener(mListener, mSensor.getSensor(), 100); + + mAsyncSensorManager.waitUntilRequestsCompleted(); + + // Verify listener was registered. + mSensor.sendProximityResult(true); + verify(mListener).onSensorChanged(any()); + } + + @Test + public void unregisterListenerImpl_withNullSensor() throws Exception { + mAsyncSensorManager.registerListener(mListener, mSensor.getSensor(), 100); + mAsyncSensorManager.unregisterListener(mListener); + + mAsyncSensorManager.waitUntilRequestsCompleted(); + + // Verify listener was unregistered. + mSensor.sendProximityResult(true); + verifyNoMoreInteractions(mListener); + } + + @Test + public void unregisterListenerImpl_withSensor() throws Exception { + mAsyncSensorManager.registerListener(mListener, mSensor.getSensor(), 100); + mAsyncSensorManager.unregisterListener(mListener, mSensor.getSensor()); + + mAsyncSensorManager.waitUntilRequestsCompleted(); + + // Verify listener was unregistered. + mSensor.sendProximityResult(true); + verifyNoMoreInteractions(mListener); + } + + private class TestableAsyncSensorManager extends AsyncSensorManager { + public TestableAsyncSensorManager(SensorManager sensorManager) { + super(sensorManager); + } + + public void waitUntilRequestsCompleted() { + assertTrue(mHandler.runWithScissors(() -> {}, 0)); + } + } +}
\ No newline at end of file |