Ignore unchecked IME show/hide when no root

Both showSoftInputUnchecked() and closeCurrenInput() rely on rootView to
obtain window token. If view root is null, window has already gone away
and IME control had been revoked. Trying to show or hide at this time
would be a no-op.

Bug: 149900693
Test: Manually using the steps mentioned in bug and verify that there is
      no NPE.
Change-Id: I294bb2ec5395d7502a855bafbac672af069e9b4a
Merged-In: I294bb2ec5395d7502a855bafbac672af069e9b4a
(cherry picked from commit ba9b716a70)
This commit is contained in:
Tarandeep Singh
2020-03-02 10:41:14 -08:00
committed by Taran Singh
parent 81866d4149
commit 7bbce8ee6b

View File

@@ -1634,16 +1634,22 @@ public final class InputMethodManager {
@Deprecated @Deprecated
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123768499) @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123768499)
public void showSoftInputUnchecked(int flags, ResultReceiver resultReceiver) { public void showSoftInputUnchecked(int flags, ResultReceiver resultReceiver) {
synchronized (mH) {
try { try {
Log.w(TAG, "showSoftInputUnchecked() is a hidden method, which will be removed " Log.w(TAG, "showSoftInputUnchecked() is a hidden method, which will be"
+ "soon. If you are using android.support.v7.widget.SearchView, please update " + " removed soon. If you are using android.support.v7.widget.SearchView,"
+ "to version 26.0 or newer version."); + " please update to version 26.0 or newer version.");
if (mCurRootView == null || mCurRootView.getView() == null) {
Log.w(TAG, "No current root view, ignoring showSoftInputUnchecked()");
return;
}
mService.showSoftInput( mService.showSoftInput(
mClient, mCurRootView.getView().getWindowToken(), flags, resultReceiver); mClient, mCurRootView.getView().getWindowToken(), flags, resultReceiver);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
} }
}
/** /**
* Flag for {@link #hideSoftInputFromWindow} and {@link InputMethodService#requestHideSelf(int)} * Flag for {@link #hideSoftInputFromWindow} and {@link InputMethodService#requestHideSelf(int)}
@@ -1986,6 +1992,11 @@ public final class InputMethodManager {
@UnsupportedAppUsage @UnsupportedAppUsage
void closeCurrentInput() { void closeCurrentInput() {
synchronized (mH) {
if (mCurRootView == null || mCurRootView.getView() == null) {
Log.w(TAG, "No current root view, ignoring closeCurrentInput()");
return;
}
try { try {
mService.hideSoftInput( mService.hideSoftInput(
mClient, mCurRootView.getView().getWindowToken(), HIDE_NOT_ALWAYS, null); mClient, mCurRootView.getView().getWindowToken(), HIDE_NOT_ALWAYS, null);
@@ -1993,6 +2004,7 @@ public final class InputMethodManager {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
} }
}
/** /**
* Register for IME state callbacks and applying visibility in * Register for IME state callbacks and applying visibility in