From 3d4a7d1bc923ac2e39f801d7b03d54368ce4c7f4 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Fri, 12 Apr 2019 16:18:30 +0800 Subject: [PATCH] Unregister ImeInsetsSourceConsumer when focus lost MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ImeInsetsSourceConsumer was not unregistered when focus lost, it was still references by InputMethodManager. So, the last activity in the process won’t be GCed even though it has been destroyed. Bug: 130216346 Test: atest ImeInsetsSourceConsumerTest Change-Id: Ida19411d8361180692e7de7e012d2cd3b431fa9f --- .../android/view/ImeInsetsSourceConsumer.java | 1 + .../view/inputmethod/InputMethodManager.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/core/java/android/view/ImeInsetsSourceConsumer.java b/core/java/android/view/ImeInsetsSourceConsumer.java index 2ba1e016e03d2..d415387808dd4 100644 --- a/core/java/android/view/ImeInsetsSourceConsumer.java +++ b/core/java/android/view/ImeInsetsSourceConsumer.java @@ -85,6 +85,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { @Override public void onWindowFocusLost() { mHasWindowFocus = false; + getImm().unregisterImeConsumer(this); } /** diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 5e00425407ba8..fd73856bf79b5 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -1950,6 +1950,23 @@ public final class InputMethodManager { } } + /** + * Unregister for IME state callbacks and applying visibility in + * {@link android.view.ImeInsetsSourceConsumer}. + * @hide + */ + public void unregisterImeConsumer(@NonNull ImeInsetsSourceConsumer imeInsetsConsumer) { + if (imeInsetsConsumer == null) { + throw new IllegalStateException("ImeInsetsSourceConsumer cannot be null."); + } + + synchronized (mH) { + if (mImeInsetsConsumer == imeInsetsConsumer) { + mImeInsetsConsumer = null; + } + } + } + /** * Call showSoftInput with currently focused view. * @return {@code true} if IME can be shown.