diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java index 13ba1a3cbf315..378dde284747a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java @@ -170,7 +170,11 @@ public class ProximitySensor { return false; } - mListeners.add(listener); + if (mListeners.contains(listener)) { + Log.d(TAG, "ProxListener registered multiple times: " + listener); + } else { + mListeners.add(listener); + } registerInternal(); return true; diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java index 37b315fec26e0..526fba726e9d9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorTest.java @@ -103,6 +103,30 @@ public class ProximitySensorTest extends SysuiTestCase { waitForSensorManager(); } + @Test + public void testDuplicateListener() { + TestableListener listenerA = new TestableListener(); + + assertFalse(mProximitySensor.isRegistered()); + + mProximitySensor.register(listenerA); + waitForSensorManager(); + assertTrue(mProximitySensor.isRegistered()); + mProximitySensor.register(listenerA); + waitForSensorManager(); + assertTrue(mProximitySensor.isRegistered()); + assertNull(listenerA.mLastEvent); + + mFakeProximitySensor.sendProximityResult(true); + assertFalse(listenerA.mLastEvent.getNear()); + assertEquals(listenerA.mCallCount, 1); + mFakeProximitySensor.sendProximityResult(false); + assertTrue(listenerA.mLastEvent.getNear()); + assertEquals(listenerA.mCallCount, 2); + + mProximitySensor.unregister(listenerA); + waitForSensorManager(); + } @Test public void testUnregister() { TestableListener listener = new TestableListener();