Set the text bgcolor only when CursorAnchorInfo is available

When CursorAnchorInfo is unavailable, we shouldn't try to show
the commit indicator and set the text highlight color.

With this CL, RichInputConnection can be used to track if the
application responded that it does support CursorAnchorInfo or
not.  This result will be taken into consideration when
InputLogic needs to determine whether the commit indicator
should be displayed or not.

Change-Id: I945d70eeb02a7a5f3d9b22459b23d7028508910f
main
Yohei Yukawa 2014-08-26 21:32:25 -07:00
parent a475c85480
commit 29200b0abe
3 changed files with 53 additions and 14 deletions

View File

@ -57,7 +57,6 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.accessibility.AccessibilityUtils; import com.android.inputmethod.accessibility.AccessibilityUtils;
import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.compat.CursorAnchorInfoCompatWrapper; import com.android.inputmethod.compat.CursorAnchorInfoCompatWrapper;
import com.android.inputmethod.compat.InputConnectionCompatUtils;
import com.android.inputmethod.compat.InputMethodServiceCompatUtils; import com.android.inputmethod.compat.InputMethodServiceCompatUtils;
import com.android.inputmethod.dictionarypack.DictionaryPackConstants; import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
import com.android.inputmethod.event.Event; import com.android.inputmethod.event.Event;
@ -777,20 +776,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged() // Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged()
// is not guaranteed. It may even be called at the same time on a different thread. // is not guaranteed. It may even be called at the same time on a different thread.
mSubtypeSwitcher.onSubtypeChanged(subtype); mSubtypeSwitcher.onSubtypeChanged(subtype);
mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype)); mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype),
mSettings.getCurrent());
loadKeyboard(); loadKeyboard();
} }
private void onStartInputInternal(final EditorInfo editorInfo, final boolean restarting) { private void onStartInputInternal(final EditorInfo editorInfo, final boolean restarting) {
super.onStartInput(editorInfo, restarting); super.onStartInput(editorInfo, restarting);
if (ProductionFlags.ENABLE_CURSOR_ANCHOR_INFO_CALLBACK) {
// AcceptTypedWord feature relies on CursorAnchorInfo.
if (mSettings.getCurrent().mShouldShowUiToAcceptTypedWord) {
InputConnectionCompatUtils.requestUpdateCursorAnchorInfo(
getCurrentInputConnection(), true /* enableMonitor */,
true /* requestImmediateCallback */);
}
}
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -859,7 +851,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// span, so we should reset our state unconditionally, even if restarting is true. // span, so we should reset our state unconditionally, even if restarting is true.
// We also tell the input logic about the combining rules for the current subtype, so // We also tell the input logic about the combining rules for the current subtype, so
// it can adjust its combiners if needed. // it can adjust its combiners if needed.
mInputLogic.startInput(mSubtypeSwitcher.getCombiningRulesExtraValueOfCurrentSubtype()); mInputLogic.startInput(mSubtypeSwitcher.getCombiningRulesExtraValueOfCurrentSubtype(),
currentSettingsValues);
// Note: the following does a round-trip IPC on the main thread: be careful // Note: the following does a round-trip IPC on the main thread: be careful
final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale(); final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale();

View File

@ -30,7 +30,9 @@ import android.view.inputmethod.CorrectionInfo;
import android.view.inputmethod.ExtractedText; import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import com.android.inputmethod.compat.InputConnectionCompatUtils;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations; import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import com.android.inputmethod.latin.utils.CapsModeUtils; import com.android.inputmethod.latin.utils.CapsModeUtils;
import com.android.inputmethod.latin.utils.DebugLogUtils; import com.android.inputmethod.latin.utils.DebugLogUtils;
@ -906,4 +908,33 @@ public final class RichInputConnection {
mIC.setSelection(mExpectedSelStart, mExpectedSelEnd); mIC.setSelection(mExpectedSelStart, mExpectedSelEnd);
} }
} }
private boolean mCursorAnchorInfoMonitorEnabled = false;
/**
* Requests the editor to call back {@link InputMethodManager#updateCursorAnchorInfo}.
* @param enableMonitor {@code true} to request the editor to call back the method whenever the
* cursor/anchor position is changed.
* @param requestImmediateCallback {@code true} to request the editor to call back the method
* as soon as possible to notify the current cursor/anchor position to the input method.
* @return {@code true} if the request is accepted. Returns {@code false} otherwise, which
* includes "not implemented" or "rejected" or "temporarily unavailable" or whatever which
* prevents the application from fulfilling the request. (TODO: Improve the API when it turns
* out that we actually need more detailed error codes)
*/
public boolean requestUpdateCursorAnchorInfo(final boolean enableMonitor,
final boolean requestImmediateCallback) {
final boolean scheduled = InputConnectionCompatUtils.requestUpdateCursorAnchorInfo(mIC,
enableMonitor, requestImmediateCallback);
mCursorAnchorInfoMonitorEnabled = (scheduled && enableMonitor);
return scheduled;
}
/**
* @return {@code true} if the application reported that the monitor mode of
* {@link InputMethodService#onUpdateCursorAnchorInfo(CursorAnchorInfo)} is currently enabled.
*/
public boolean isCursorAnchorInfoMonitorEnabled() {
return mCursorAnchorInfoMonitorEnabled;
}
} }

View File

@ -50,6 +50,7 @@ import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.WordComposer; import com.android.inputmethod.latin.WordComposer;
import com.android.inputmethod.latin.define.DebugFlags; import com.android.inputmethod.latin.define.DebugFlags;
import com.android.inputmethod.latin.define.ProductionFlags;
import com.android.inputmethod.latin.settings.SettingsValues; import com.android.inputmethod.latin.settings.SettingsValues;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion; import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations; import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
@ -140,8 +141,9 @@ public final class InputLogic {
* Call this when input starts or restarts in some editor (typically, in onStartInputView). * Call this when input starts or restarts in some editor (typically, in onStartInputView).
* *
* @param combiningSpec the combining spec string for this subtype * @param combiningSpec the combining spec string for this subtype
* @param settingsValues the current settings values
*/ */
public void startInput(final String combiningSpec) { public void startInput(final String combiningSpec, final SettingsValues settingsValues) {
mEnteredText = null; mEnteredText = null;
mWordComposer.restartCombining(combiningSpec); mWordComposer.restartCombining(combiningSpec);
resetComposingState(true /* alsoResetLastComposedWord */); resetComposingState(true /* alsoResetLastComposedWord */);
@ -159,15 +161,24 @@ public final class InputLogic {
} else { } else {
mInputLogicHandler.reset(); mInputLogicHandler.reset();
} }
if (ProductionFlags.ENABLE_CURSOR_ANCHOR_INFO_CALLBACK) {
// AcceptTypedWord feature relies on CursorAnchorInfo.
if (settingsValues.mShouldShowUiToAcceptTypedWord) {
mConnection.requestUpdateCursorAnchorInfo(true /* enableMonitor */,
true /* requestImmediateCallback */);
}
}
} }
/** /**
* Call this when the subtype changes. * Call this when the subtype changes.
* @param combiningSpec the spec string for the combining rules * @param combiningSpec the spec string for the combining rules
* @param settingsValues the current settings values
*/ */
public void onSubtypeChanged(final String combiningSpec) { public void onSubtypeChanged(final String combiningSpec, final SettingsValues settingsValues) {
finishInput(); finishInput();
startInput(combiningSpec); startInput(combiningSpec, settingsValues);
} }
/** /**
@ -2238,6 +2249,10 @@ public final class InputLogic {
*/ */
private boolean shouldShowCommitIndicator(final SuggestedWords suggestedWords, private boolean shouldShowCommitIndicator(final SuggestedWords suggestedWords,
final SettingsValues settingsValues) { final SettingsValues settingsValues) {
if (!mConnection.isCursorAnchorInfoMonitorEnabled()) {
// We cannot help in this case because we are heavily relying on this new API.
return false;
}
if (!settingsValues.mShouldShowUiToAcceptTypedWord) { if (!settingsValues.mShouldShowUiToAcceptTypedWord) {
return false; return false;
} }