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

Commit 03512570 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Fix death recipient leakage of WindowTokenClient

When WindowContext#finalize is called on client side, it
will call WindowTokenClient#detachFromWindowContainerIfNeeded
to notify system server to remove the listener.
But unregisterWindowContainerListener didn't unlink its death
recipient, that causes the objects are never actual released
both on client and server side.

Bug: 233784911
Test: atest WindowContextListenerControllerTests# \
            testRegisterWindowContextListener
Change-Id: I0e203d07e485c4577f669f512123757fd2dea058
parent 054f5c15
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -116,6 +116,9 @@ class WindowContextListenerController {
            return;
        }
        listener.unregister();
        if (listener.mDeathRecipient != null) {
            listener.mDeathRecipient.unlinkToDeath();
        }
    }

    void dispatchPendingConfigurationIfNeeded(int displayId) {
+6 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.window.WindowProvider.KEY_IS_WINDOW_PROVIDER_SERVICE;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;

import static com.google.common.truth.Truth.assertThat;
@@ -86,7 +87,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {

        assertEquals(1, mController.mListeners.size());

        final IBinder clientToken = new Binder();
        final IBinder clientToken = mock(IBinder.class);
        mController.registerWindowContainerListener(clientToken, mContainer, -1,
                TYPE_APPLICATION_OVERLAY, null /* options */);

@@ -103,6 +104,10 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
        WindowContextListenerController.WindowContextListenerImpl listener =
                mController.mListeners.get(mClientToken);
        assertEquals(container, listener.getWindowContainer());

        mController.unregisterWindowContainerListener(clientToken);
        assertFalse(mController.mListeners.containsKey(clientToken));
        verify(clientToken).unlinkToDeath(any(), anyInt());
    }

    @UseTestDisplay