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
This commit is contained in:
Fabian Kozynski
2020-07-06 14:33:44 -04:00
parent 27c69329ab
commit c6db4059da
3 changed files with 41 additions and 0 deletions

View File

@@ -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<TState extends State> 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) {

View File

@@ -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();

View File

@@ -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<Object> {
@Override
public void addCallback(Object listener) {