From e963b4c53709b14c1719267498d1f3adbb7480ca Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 3 Apr 2020 11:19:31 -0700 Subject: [PATCH] Remove the input consumer surfaces when the consumer is disposed - When disposing the input consumer we were just hiding it, while a new one was created everytime the IC is requested, resulting a leak of input surfaces for these consumers Bug: 153081070 Test: Enter pip several times, ensure there is only one pip input surface Change-Id: I0161a36f3c4eb675dab9a72a896801c837d75852 --- .../core/java/com/android/server/wm/InputConsumerImpl.java | 3 ++- services/core/java/com/android/server/wm/InputMonitor.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/InputConsumerImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java index a9a9df8458e26..a6066684d850e 100644 --- a/services/core/java/com/android/server/wm/InputConsumerImpl.java +++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java @@ -153,10 +153,11 @@ class InputConsumerImpl implements IBinder.DeathRecipient { t.reparent(mInputSurface, wc.getSurfaceControl()); } - void disposeChannelsLw() { + void disposeChannelsLw(SurfaceControl.Transaction t) { mService.mInputManager.unregisterInputChannel(mServerChannel); mClientChannel.dispose(); mServerChannel.dispose(); + t.remove(mInputSurface); unlinkFromDeathRecipient(); } diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 18332b9484c0f..8b34b9b8dd8fb 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -112,8 +112,9 @@ final class InputMonitor { @Override public void dispose() { synchronized (mService.mGlobalLock) { - disposeChannelsLw(); + disposeChannelsLw(mInputMonitor.mInputTransaction); mInputEventReceiver.dispose(); + mInputMonitor.updateInputWindowsLw(true /* force */); } } } @@ -195,8 +196,7 @@ final class InputMonitor { private boolean disposeInputConsumer(InputConsumerImpl consumer) { if (consumer != null) { - consumer.disposeChannelsLw(); - consumer.hide(mInputTransaction); + consumer.disposeChannelsLw(mInputTransaction); return true; } return false;