diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 239109af7a3d8..c8720e409883a 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -288,7 +288,7 @@ public class DozeSensors { for (TriggerSensor triggerSensor : mTriggerSensors) { triggerSensor.setListening(false); } - mProximitySensor.pause(); + mProximitySensor.destroy(); mDevicePostureController.removeCallback(mDevicePostureCallback); mAuthController.removeCallback(mAuthControllerCallback); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 68b74bdd7addd..8bff3ba0b6ba6 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -228,6 +228,7 @@ public class DozeTriggers implements DozeMachine.Part { @Override public void destroy() { mDozeSensors.destroy(); + mProxCheck.destroy(); } private void onNotification(Runnable onPulseSuppressedListener) { diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java index 40982bb18023e..460b7d9f2de95 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/PostureDependentProximitySensor.java @@ -37,6 +37,8 @@ class PostureDependentProximitySensor extends ProximitySensorImpl { private final ThresholdSensor[] mPostureToPrimaryProxSensorMap; private final ThresholdSensor[] mPostureToSecondaryProxSensorMap; + private final DevicePostureController mDevicePostureController; + @Inject PostureDependentProximitySensor( @PrimaryProxSensor ThresholdSensor[] postureToPrimaryProxSensorMap, @@ -53,15 +55,24 @@ class PostureDependentProximitySensor extends ProximitySensorImpl { ); mPostureToPrimaryProxSensorMap = postureToPrimaryProxSensorMap; mPostureToSecondaryProxSensorMap = postureToSecondaryProxSensorMap; - mDevicePosture = devicePostureController.getDevicePosture(); - devicePostureController.addCallback(mDevicePostureCallback); + mDevicePostureController = devicePostureController; + + mDevicePosture = mDevicePostureController.getDevicePosture(); + mDevicePostureController.addCallback(mDevicePostureCallback); chooseSensors(); } + + @Override + public void destroy() { + super.destroy(); + mDevicePostureController.removeCallback(mDevicePostureCallback); + } + private void chooseSensors() { if (mDevicePosture >= mPostureToPrimaryProxSensorMap.length || mDevicePosture >= mPostureToSecondaryProxSensorMap.length) { - Log.e("PostureDependentProxSensor", + Log.e("PostureDependProxSensor", "unsupported devicePosture=" + mDevicePosture); return; } diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java index a8a6341cc5eeb..c06a3a1e200c9 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximityCheck.java @@ -73,6 +73,13 @@ public class ProximityCheck implements Runnable { } } + /** + * Cleanup after no longer needed. + */ + public void destroy() { + mSensor.destroy(); + } + private void unregister() { mSensor.unregister(mListener); mRegistered.set(false); 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 d3f1c93195a15..7f643223f1d8a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java @@ -42,4 +42,10 @@ public interface ProximitySensor extends ThresholdSensor { * of what is reported by the primary sensor. */ void setSecondarySafe(boolean safe); + + /** + * Called when the proximity sensor is no longer needed. All listeners should + * be unregistered and cleaned up. + */ + void destroy(); } diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java index 5568f64f50846..8ab5bc68fa261 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensorImpl.java @@ -251,6 +251,11 @@ class ProximitySensorImpl implements ProximitySensor { } } + @Override + public void destroy() { + pause(); + } + @Override public String getName() { return mPrimaryThresholdSensor.getName(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index f207b9eb7e541..0a1e45c2b28f1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -175,6 +175,7 @@ public class DozeSensorsTest extends SysuiTestCase { public void testDestroy() { mDozeSensors.destroy(); + verify(mProximitySensor).destroy(); verify(mTriggerSensor).setListening(false); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 7fc354f8106f0..ae387e86de9d0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -299,6 +299,12 @@ public class DozeTriggersTest extends SysuiTestCase { verify(mAuthController).onAodInterrupt(eq(screenX), eq(screenY), eq(major), eq(minor)); } + @Test + public void testDestroy() { + mTriggers.destroy(); + verify(mProximityCheck).destroy(); + } + private void waitForSensorManager() { mExecutor.runAllReady(); }