From 07a7f23e36c3461268cbd28bb6779bdcf613d7ad Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Mon, 10 Jan 2022 22:37:37 +0800 Subject: [PATCH] [RESTRICT AUTOMERGE] Attempt to fix exception in IMS IMS might throw IllegalStateException in WindowContextController#attachToWindowToken when #initializeInternal is called. A possible root cause may be #initializeInternal is called after onDestroy, which detach IMS from ImeContainer. This CL add a flag in #onDestroy to prevent #initializeInternal from being called after #onDestroy. Bug: 211062619 Test: presubmit Change-Id: Ie7814da801878a3487123fefdc9e71d0e1ed28d7 --- .../android/inputmethodservice/InputMethodService.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index afaa085c7cbdd..f537a71cf01dd 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -523,6 +523,7 @@ public class InputMethodService extends AbstractInputMethodService { private Handler mHandler; private boolean mImeSurfaceScheduledForRemoval; private ImsConfigurationTracker mConfigTracker = new ImsConfigurationTracker(); + private boolean mDestroyed; /** * An opaque {@link Binder} token of window requesting {@link InputMethodImpl#showSoftInput} @@ -599,6 +600,11 @@ public class InputMethodService extends AbstractInputMethodService { @Override public final void initializeInternal(@NonNull IBinder token, IInputMethodPrivilegedOperations privilegedOperations, int configChanges) { + if (mDestroyed) { + Log.i(TAG, "The InputMethodService has already onDestroyed()." + + "Ignore the initialization."); + return; + } Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.initializeInternal"); mConfigTracker.onInitialize(configChanges); mPrivOps.set(privilegedOperations); @@ -1435,6 +1441,7 @@ public class InputMethodService extends AbstractInputMethodService { } @Override public void onDestroy() { + mDestroyed = true; super.onDestroy(); mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( mInsetsComputer);