From c6db4059da7964dbfa7f4d4149313b318e5ddec5 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Mon, 6 Jul 2020 14:33:44 -0400 Subject: [PATCH] QSTileImpl is set to DESTROYED when handleDestroy This will guarantee that there are no remaining references in the CallbackController. Test: atest QSTileImplTest CallbackControllerTest Bug: 160160246 Change-Id: I308ea00b2d24febf9ad0ab1c533c4f3d2f34c675 --- .../systemui/qs/tileimpl/QSTileImpl.java | 3 ++ .../systemui/qs/tileimpl/QSTileImplTest.java | 8 +++++ .../policy/CallbackControllerTest.java | 30 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 795d0627c4474..d11079294a85d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -14,6 +14,7 @@ package com.android.systemui.qs.tileimpl; +import static androidx.lifecycle.Lifecycle.State.DESTROYED; import static androidx.lifecycle.Lifecycle.State.RESUMED; import static androidx.lifecycle.Lifecycle.State.STARTED; @@ -475,6 +476,8 @@ public abstract class QSTileImpl implements QSTile, Lifecy } mCallbacks.clear(); mHandler.removeCallbacksAndMessages(null); + // This will force it to be removed from all controllers that may have it registered. + mLifecycle.setCurrentState(DESTROYED); } protected void checkIfRestrictionEnforcedByAdminOnly(State state, String userRestriction) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java index 438de99015a4c..20f13bb024351 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java @@ -259,6 +259,14 @@ public class QSTileImplTest extends SysuiTestCase { verify(mTile, never()).handleStale(); } + @Test + public void testHandleDestroyLifecycle() { + assertNotEquals(DESTROYED, mTile.getLifecycle().getCurrentState()); + mTile.handleDestroy(); + + assertEquals(DESTROYED, mTile.getLifecycle().getCurrentState()); + } + @Test public void testHandleDestroy_log() { mTile.handleDestroy(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java index fa711f1cf9a2e..a16fb5e8dc179 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackControllerTest.java @@ -23,10 +23,12 @@ import static org.mockito.Mockito.verify; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; +import androidx.annotation.NonNull; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle.Event; import androidx.lifecycle.LifecycleEventObserver; import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LifecycleRegistry; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; @@ -76,6 +78,34 @@ public class CallbackControllerTest extends SysuiTestCase { verify(controller).removeCallback(eq(callback)); } + @Test + public void testCallbackIsRemovedOnDestroy() { + SimpleLifecycleOwner owner = new SimpleLifecycleOwner(); + + Object callback = new Object(); + Controller controller = mock(Controller.class); + controller.observe(owner, callback); + + owner.setState(Lifecycle.State.RESUMED); + verify(controller).addCallback(callback); + + owner.setState(Lifecycle.State.DESTROYED); + verify(controller).removeCallback(callback); + } + + private static class SimpleLifecycleOwner implements LifecycleOwner { + LifecycleRegistry mLifecycle = new LifecycleRegistry(this); + @NonNull + @Override + public Lifecycle getLifecycle() { + return mLifecycle; + } + + public void setState(Lifecycle.State state) { + mLifecycle.setCurrentState(state); + } + } + private static class Controller implements CallbackController { @Override public void addCallback(Object listener) {