aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/RichInputConnection.java
diff options
context:
space:
mode:
authorDan Zivkovic <zivkovic@google.com>2015-02-05 00:47:29 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-02-05 00:47:29 +0000
commit7b2646dd58769f7c4a078febfb79810b953bf2ad (patch)
tree595ef02164f1e51213f903e0721d10b5af9dec52 /java/src/com/android/inputmethod/latin/RichInputConnection.java
parentbae6848434c0618887bd3fd441dd5ce16a2375fd (diff)
parentf3c319fb8ac29448c491af95261a4ce01b64a59c (diff)
downloadlatinime-7b2646dd58769f7c4a078febfb79810b953bf2ad.tar.gz
latinime-7b2646dd58769f7c4a078febfb79810b953bf2ad.tar.xz
latinime-7b2646dd58769f7c4a078febfb79810b953bf2ad.zip
Merge "Selections spans should not split surrogate pair."
Diffstat (limited to 'java/src/com/android/inputmethod/latin/RichInputConnection.java')
-rw-r--r--java/src/com/android/inputmethod/latin/RichInputConnection.java25
1 files changed, 24 insertions, 1 deletions
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 2cf476f8b..f770e88ef 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -21,6 +21,7 @@ import android.os.Build;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
+import android.text.style.CharacterStyle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.inputmethod.CompletionInfo;
@@ -32,6 +33,7 @@ import android.view.inputmethod.InputMethodManager;
import com.android.inputmethod.compat.InputConnectionCompatUtils;
import com.android.inputmethod.latin.common.Constants;
+import com.android.inputmethod.latin.common.UnicodeSurrogate;
import com.android.inputmethod.latin.common.StringUtils;
import com.android.inputmethod.latin.inputlogic.PrivateCommandPerformer;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
@@ -261,7 +263,28 @@ public final class RichInputConnection implements PrivateCommandPerformer {
mComposingText.setLength(0);
mLastCommittedTextHasBackgroundColor = false;
if (null != mIC) {
- mIC.commitText(text, newCursorPosition);
+ mTempObjectForCommitText.clear();
+ mTempObjectForCommitText.append(text);
+ final CharacterStyle[] spans = mTempObjectForCommitText.getSpans(
+ 0, text.length(), CharacterStyle.class);
+ for (final CharacterStyle span : spans) {
+ final int spanStart = mTempObjectForCommitText.getSpanStart(span);
+ final int spanEnd = mTempObjectForCommitText.getSpanEnd(span);
+ final int spanFlags = mTempObjectForCommitText.getSpanFlags(span);
+ // We have to adjust the end of the span to include an additional character.
+ // This is to avoid splitting a unicode surrogate pair.
+ // See com.android.inputmethod.latin.common.Constants.UnicodeSurrogate
+ // See https://b.corp.google.com/issues/19255233
+ if (0 < spanEnd && spanEnd < mTempObjectForCommitText.length()) {
+ final char spanEndChar = mTempObjectForCommitText.charAt(spanEnd - 1);
+ final char nextChar = mTempObjectForCommitText.charAt(spanEnd);
+ if (UnicodeSurrogate.isLowSurrogate(spanEndChar)
+ && UnicodeSurrogate.isHighSurrogate(nextChar)) {
+ mTempObjectForCommitText.setSpan(span, spanStart, spanEnd + 1, spanFlags);
+ }
+ }
+ }
+ mIC.commitText(mTempObjectForCommitText, newCursorPosition);
}
}