Merge "Fix stale InputMethodManager#mFullscreenMode." into nyc-dev

This commit is contained in:
Yohei Yukawa
2016-05-05 21:55:48 +00:00
committed by Android (Google) Code Review
2 changed files with 47 additions and 12 deletions

View File

@@ -39,6 +39,7 @@ import android.os.RemoteException;
import android.os.ResultReceiver; import android.os.ResultReceiver;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.Trace; import android.os.Trace;
import android.text.TextUtils;
import android.text.style.SuggestionSpan; import android.text.style.SuggestionSpan;
import android.util.Log; import android.util.Log;
import android.util.Pools.Pool; import android.util.Pools.Pool;
@@ -553,8 +554,9 @@ public final class InputMethodManager {
} }
@Override @Override
protected void onReportFullscreenMode(boolean enabled) { protected void onReportFullscreenMode(boolean enabled, boolean calledInBackground) {
mParentInputMethodManager.setFullscreenMode(enabled); mParentInputMethodManager.onReportFullscreenMode(enabled, calledInBackground,
getInputMethodId());
} }
@Override @Override
@@ -563,6 +565,7 @@ public final class InputMethodManager {
+ "connection=" + getInputConnection() + "connection=" + getInputConnection()
+ " finished=" + isFinished() + " finished=" + isFinished()
+ " mParentInputMethodManager.mActive=" + mParentInputMethodManager.mActive + " mParentInputMethodManager.mActive=" + mParentInputMethodManager.mActive
+ " mInputMethodId=" + getInputMethodId()
+ "}"; + "}";
} }
} }
@@ -718,8 +721,13 @@ public final class InputMethodManager {
} }
/** @hide */ /** @hide */
public void setFullscreenMode(boolean fullScreen) { public void onReportFullscreenMode(boolean fullScreen, boolean calledInBackground,
mFullscreenMode = fullScreen; String inputMethodId) {
synchronized (mH) {
if (!calledInBackground || TextUtils.equals(mCurId, inputMethodId)) {
mFullscreenMode = fullScreen;
}
}
} }
/** @hide */ /** @hide */
@@ -746,9 +754,11 @@ public final class InputMethodManager {
* your UI, else returns false. * your UI, else returns false.
*/ */
public boolean isFullscreenMode() { public boolean isFullscreenMode() {
return mFullscreenMode; synchronized (mH) {
return mFullscreenMode;
}
} }
/** /**
* Return true if the given view is the currently active view for the * Return true if the given view is the currently active view for the
* input method. * input method.
@@ -1254,6 +1264,9 @@ public final class InputMethodManager {
mCurId = res.id; mCurId = res.id;
mNextUserActionNotificationSequenceNumber = mNextUserActionNotificationSequenceNumber =
res.userActionNotificationSequenceNumber; res.userActionNotificationSequenceNumber;
if (mServedInputConnectionWrapper != null) {
mServedInputConnectionWrapper.setInputMethodId(mCurId);
}
} else { } else {
if (res.channel != null && res.channel != mCurChannel) { if (res.channel != null && res.channel != mCurChannel) {
res.channel.dispose(); res.channel.dispose();

View File

@@ -71,6 +71,8 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
private Object mLock = new Object(); private Object mLock = new Object();
@GuardedBy("mLock") @GuardedBy("mLock")
private boolean mFinished = false; private boolean mFinished = false;
@GuardedBy("mLock")
private String mInputMethodId;
static class SomeArgs { static class SomeArgs {
Object arg1; Object arg1;
@@ -109,6 +111,18 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
} }
} }
public String getInputMethodId() {
synchronized (mLock) {
return mInputMethodId;
}
}
public void setInputMethodId(final String inputMethodId) {
synchronized (mLock) {
mInputMethodId = inputMethodId;
}
}
abstract protected boolean isActive(); abstract protected boolean isActive();
/** /**
@@ -119,9 +133,11 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
/** /**
* Called when the input method started or stopped full-screen mode. * Called when the input method started or stopped full-screen mode.
* * @param enabled {@code true} if the input method starts full-screen mode.
* @param calledInBackground {@code true} if this input connection is in a state when incoming
* events are usually ignored.
*/ */
abstract protected void onReportFullscreenMode(boolean enabled); abstract protected void onReportFullscreenMode(boolean enabled, boolean calledInBackground);
public void getTextAfterCursor(int length, int flags, int seq, IInputContextCallback callback) { public void getTextAfterCursor(int length, int flags, int seq, IInputContextCallback callback) {
dispatchMessage(obtainMessageIISC(DO_GET_TEXT_AFTER_CURSOR, length, flags, seq, callback)); dispatchMessage(obtainMessageIISC(DO_GET_TEXT_AFTER_CURSOR, length, flags, seq, callback));
@@ -464,13 +480,19 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
} }
case DO_REPORT_FULLSCREEN_MODE: { case DO_REPORT_FULLSCREEN_MODE: {
InputConnection ic = getInputConnection(); InputConnection ic = getInputConnection();
if (ic == null) { boolean isBackground = false;
if (ic == null || !isActive()) {
Log.w(TAG, "reportFullscreenMode on inexistent InputConnection"); Log.w(TAG, "reportFullscreenMode on inexistent InputConnection");
return; isBackground = true;
} }
final boolean enabled = msg.arg1 == 1; final boolean enabled = msg.arg1 == 1;
ic.reportFullscreenMode(enabled); if (!isBackground) {
onReportFullscreenMode(enabled); ic.reportFullscreenMode(enabled);
}
// Due to the nature of asynchronous event handling, currently InputMethodService
// has relied on the fact that #reportFullscreenMode() can be handled even when the
// InputConnection is inactive. We have to notify this event to InputMethodManager.
onReportFullscreenMode(enabled, isBackground);
return; return;
} }
case DO_PERFORM_PRIVATE_COMMAND: { case DO_PERFORM_PRIVATE_COMMAND: {