Merge "All keys should be processed before processing modifier key" into gingerbread
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 50fc484..4e8723c 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1348,14 +1348,21 @@
             }
         }
         if (mKeyboardSwitcher.getInputView().isShifted()) {
-            // TODO: This doesn't work with [beta], need to fix it in the next release.
             if (keyCodes == null || keyCodes[0] < Character.MIN_CODE_POINT
                     || keyCodes[0] > Character.MAX_CODE_POINT) {
                 return;
             }
             primaryCode = keyCodes[0];
-            if (mKeyboardSwitcher.isAlphabetMode()) {
-                primaryCode = Character.toUpperCase(primaryCode);
+            if (mKeyboardSwitcher.isAlphabetMode() && Character.isLowerCase(primaryCode)) {
+                int upperCaseCode = Character.toUpperCase(primaryCode);
+                if (upperCaseCode != primaryCode) {
+                    primaryCode = upperCaseCode;
+                } else {
+                    // Some keys, such as [eszett], have upper case as multi-characters.
+                    String upperCase = new String(new int[] {primaryCode}, 0, 1).toUpperCase();
+                    onText(upperCase);
+                    return;
+                }
             }
         }
         if (mPredicting) {
diff --git a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java
index 709d082..356e62d 100644
--- a/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/latin/MiniKeyboardKeyDetector.java
@@ -41,19 +41,19 @@
         final Key[] keys = getKeys();
         final int touchX = getTouchX(x);
         final int touchY = getTouchY(y);
-        int closestKey = LatinKeyboardBaseView.NOT_A_KEY;
+        int closestKeyIndex = LatinKeyboardBaseView.NOT_A_KEY;
         int closestKeyDist = (y < 0) ? mSlideAllowanceSquareTop : mSlideAllowanceSquare;
         final int keyCount = keys.length;
         for (int i = 0; i < keyCount; i++) {
             final Key key = keys[i];
             int dist = key.squaredDistanceFrom(touchX, touchY);
             if (dist < closestKeyDist) {
-                closestKey = i;
+                closestKeyIndex = i;
                 closestKeyDist = dist;
             }
         }
-        if (allKeys != null && closestKey != LatinKeyboardBaseView.NOT_A_KEY)
-            allKeys[0] = closestKey;
-        return closestKey;
+        if (allKeys != null && closestKeyIndex != LatinKeyboardBaseView.NOT_A_KEY)
+            allKeys[0] = keys[closestKeyIndex].codes[0];
+        return closestKeyIndex;
     }
 }