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
This commit is contained in:
Riddle Hsu
2022-05-25 21:45:04 +08:00
parent 054f5c15c9
commit 03512570f7
2 changed files with 9 additions and 1 deletions

View File

@@ -116,6 +116,9 @@ class WindowContextListenerController {
return;
}
listener.unregister();
if (listener.mDeathRecipient != null) {
listener.mDeathRecipient.unlinkToDeath();
}
}
void dispatchPendingConfigurationIfNeeded(int displayId) {

View File

@@ -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