From 52229d8d395133c6daa9a547650ac30d2dab6809 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Mon, 27 Apr 2020 16:55:50 -0400 Subject: [PATCH] Ensure that DozeSensors can unregister itself. When DozeService shuts down, we need to ensure that any registered callbacks in DozeSensors get a chance to remove themselves from the SensorManager. Fixes: 155104806 Test: atest SystemUITests Change-Id: I5126cdb1b65d4db42674722839adb7331091e099 --- .../src/com/android/systemui/doze/DozeMachine.java | 12 ++++++++++++ .../src/com/android/systemui/doze/DozeSensors.java | 11 +++++++++++ .../src/com/android/systemui/doze/DozeService.java | 1 + .../src/com/android/systemui/doze/DozeTriggers.java | 5 +++++ .../com/android/systemui/doze/DozeSensorsTest.java | 7 +++++++ 5 files changed, 36 insertions(+) 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() {