Fix NPE when IMM#invalidateInput() is called too early
This is a follow up CL to my previous CL [1], which introduced
InputMethodManager#invalidateInput(View).
One thing I overlooked is that apps may call that API even before
InputMethodManager#mCurrentInputMethodSession,
which results in a NullPointerException.
With this CL, such a case will be gracefully fallen back into
InputMethodManager#restartInput(View)
like other cases when IMM#invalidateInput() is not available.
[1]: I3161755779080f98bcef0e47dd0c5247d8a3a256
daa6695c2e
Fix: 213350732
Test: atest CtsInputMethodTestCases:InputMethodStartInputLifecycleTest
Change-Id: I67458494b3069498a1395e3278f6a975e821e610
This commit is contained in:
@@ -2031,14 +2031,20 @@ public final class InputMethodManager {
|
||||
* @param inputConnection the connection to be invalidated.
|
||||
* @param textSnapshot {@link TextSnapshot} to be used to update {@link EditorInfo}.
|
||||
* @param sessionId the session ID to be sent.
|
||||
* @return {@code true} if the operation is done. {@code false} if the caller needs to fall back
|
||||
* to {@link InputMethodManager#restartInput(View)}.
|
||||
* @hide
|
||||
*/
|
||||
public void doInvalidateInput(@NonNull RemoteInputConnectionImpl inputConnection,
|
||||
public boolean doInvalidateInput(@NonNull RemoteInputConnectionImpl inputConnection,
|
||||
@NonNull TextSnapshot textSnapshot, int sessionId) {
|
||||
synchronized (mH) {
|
||||
if (mServedInputConnection != inputConnection || mCurrentTextBoxAttribute == null) {
|
||||
// OK to ignore because the calling InputConnection is already abandoned.
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
if (mCurrentInputMethodSession == null) {
|
||||
// IME is not yet bound to the client. Need to fall back to the restartInput().
|
||||
return false;
|
||||
}
|
||||
final EditorInfo editorInfo = mCurrentTextBoxAttribute.createCopyInternal();
|
||||
editorInfo.initialSelStart = mCursorSelStart = textSnapshot.getSelectionStart();
|
||||
@@ -2051,6 +2057,7 @@ public final class InputMethodManager {
|
||||
sessionId);
|
||||
forAccessibilitySessions(wrapper -> wrapper.invalidateInput(editorInfo,
|
||||
mServedInputConnection, sessionId));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -282,9 +282,8 @@ public final class RemoteInputConnectionImpl extends IInputContext.Stub {
|
||||
|
||||
if (!alwaysTrueEndBatchEditDetected) {
|
||||
final TextSnapshot textSnapshot = ic.takeSnapshot();
|
||||
if (textSnapshot != null) {
|
||||
mParentInputMethodManager.doInvalidateInput(this, textSnapshot,
|
||||
nextSessionId);
|
||||
if (textSnapshot != null && mParentInputMethodManager.doInvalidateInput(
|
||||
this, textSnapshot, nextSessionId)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user