Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5291680 authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Colin Cross
Browse files

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
Merged-In: I308ea00b2d24febf9ad0ab1c533c4f3d2f34c675
(cherry picked from commit c6db4059)
parent efc3806b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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) {
+8 −0
Original line number Diff line number Diff line
@@ -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();
+30 −0
Original line number Diff line number Diff line
@@ -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) {