diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java index 18bfd899a4e7f..490890f263aa4 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java @@ -159,6 +159,15 @@ public class DozeMachine { mDozeHost = dozeHost; } + /** + * Clean ourselves up. + */ + public void destroy() { + for (Part part : mParts) { + part.destroy(); + } + } + /** Initializes the set of {@link Part}s. Must be called exactly once after construction. */ public void setParts(Part[] parts) { Preconditions.checkState(mParts == null); @@ -411,6 +420,9 @@ public class DozeMachine { /** Dump current state. For debugging only. */ default void dump(PrintWriter pw) {} + + /** Give the Part a chance to clean itself up. */ + default void destroy() {} } /** A wrapper interface for {@link android.service.dreams.DreamService} */ diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 700a8611c8bd7..10776c91df843 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -163,6 +163,17 @@ public class DozeSensors { }); } + /** + * Unregister any sensors. + */ + public void destroy() { + // Unregisters everything, which is enough to allow gc. + for (TriggerSensor triggerSensor : mSensors) { + triggerSensor.setListening(false); + } + mProximitySensor.pause(); + } + /** * Temporarily disable some sensors to avoid turning on the device while the user is * turning it off. diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java index 7cbbdd783e749..529b016aaca6a 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java @@ -65,6 +65,7 @@ public class DozeService extends DreamService mPluginManager.removePluginListener(this); } super.onDestroy(); + mDozeMachine.destroy(); mDozeMachine = null; } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index b3299916356cc..1be4d438683a8 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -111,6 +111,11 @@ public class DozeTriggers implements DozeMachine.Part { mBroadcastDispatcher = broadcastDispatcher; } + @Override + public void destroy() { + mDozeSensors.destroy(); + } + private void onNotification(Runnable onPulseSuppressedListener) { if (DozeMachine.DEBUG) { Log.d(TAG, "requestNotificationPulse"); 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 ff03fbae3f3a3..317500cf5b025 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -158,6 +158,13 @@ public class DozeSensorsTest extends SysuiTestCase { verify(mTriggerSensor).setListening(eq(false)); } + @Test + public void testDestroy() { + mDozeSensors.destroy(); + + verify(mTriggerSensor).setListening(false); + } + private class TestableDozeSensors extends DozeSensors { TestableDozeSensors() {