Fix wrong commitText parameter in sendKeyCodePoint()

Small optimization on generating a String instance from a single code
point too.

bug: 11181913

Change-Id: I0f905e4dc6ec7841092bb4d3d940daf3b2303f5b
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index dc96cd7..8654f3b 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -99,6 +99,7 @@
 import com.android.inputmethod.latin.utils.LatinImeLoggerUtils;
 import com.android.inputmethod.latin.utils.RecapitalizeStatus;
 import com.android.inputmethod.latin.utils.StaticInnerHandlerWrapper;
+import com.android.inputmethod.latin.utils.StringUtils;
 import com.android.inputmethod.latin.utils.TargetPackageInfoGetterTask;
 import com.android.inputmethod.latin.utils.TextRange;
 import com.android.inputmethod.latin.utils.UserHistoryForgettingCurveUtils;
@@ -1586,8 +1587,7 @@
             // relying on this behavior so we continue to support it for older apps.
             sendDownUpKeyEvent(KeyEvent.KEYCODE_ENTER);
         } else {
-            final String text = new String(new int[] { code }, 0, 1);
-            mConnection.commitText(text, text.length());
+            mConnection.commitText(StringUtils.newSingleCodePointString(code), 1);
         }
     }
 
@@ -2335,11 +2335,11 @@
         if (mWordComposer.isComposingWord()) { // May have changed since we stored wasComposing
             if (currentSettings.mCorrectionEnabled) {
                 final String separator = shouldAvoidSendingCode ? LastComposedWord.NOT_A_SEPARATOR
-                        : new String(new int[] { primaryCode }, 0, 1);
+                        : StringUtils.newSingleCodePointString(primaryCode);
                 commitCurrentAutoCorrection(separator);
                 didAutoCorrect = true;
             } else {
-                commitTyped(new String(new int[]{primaryCode}, 0, 1));
+                commitTyped(StringUtils.newSingleCodePointString(primaryCode));
             }
         }
 
diff --git a/java/src/com/android/inputmethod/latin/utils/StringUtils.java b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
index 121aecf..a365483 100644
--- a/java/src/com/android/inputmethod/latin/utils/StringUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
@@ -48,6 +48,16 @@
         return text.codePointCount(0, text.length());
     }
 
+    public static String newSingleCodePointString(int codePoint) {
+        if (Character.charCount(codePoint) == 1) {
+            // Optimization: avoid creating an temporary array for characters that are
+            // represented by a single char value
+            return String.valueOf((char) codePoint);
+        }
+        // For surrogate pair
+        return new String(Character.toChars(codePoint));
+    }
+
     public static boolean containsInArray(final String text, final String[] array) {
         for (final String element : array) {
             if (text.equals(element)) return true;