Merge "Followup TBR in I87060049" into gingerbread
diff --git a/java/res/drawable-hdpi/sym_keyboard_delete.png b/java/res/drawable-hdpi/sym_keyboard_delete.png
index ee29af0..3c89e28 100755
--- a/java/res/drawable-hdpi/sym_keyboard_delete.png
+++ b/java/res/drawable-hdpi/sym_keyboard_delete.png
Binary files differ
diff --git a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png
index 71da573..af5c7d8 100644
--- a/java/res/drawable-hdpi/sym_keyboard_space_led.9.png
+++ b/java/res/drawable-hdpi/sym_keyboard_space_led.9.png
Binary files differ
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index 4995727..bd73c6f 100755
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -237,6 +237,8 @@
         final boolean typedWordValid = mTypedWordValid;
         final int y = (int) (height + mPaint.getTextSize() - mDescent) / 2;
 
+        boolean existsAutoCompletion = false;
+
         for (int i = 0; i < count; i++) {
             CharSequence suggestion = mSuggestions.get(i);
             if (suggestion == null) continue;
@@ -245,6 +247,7 @@
                     && ((i == 1 && !typedWordValid) || (i == 0 && typedWordValid))) {
                 paint.setTypeface(Typeface.DEFAULT_BOLD);
                 paint.setColor(mColorRecommended);
+                existsAutoCompletion = true;
             } else if (i != 0) {
                 paint.setColor(mColorOther);
             }
@@ -285,6 +288,7 @@
             paint.setTypeface(Typeface.DEFAULT);
             x += wordWidth;
         }
+        mService.onAutoCompletionStateChanged(existsAutoCompletion);
         mTotalWidth = x;
         if (mTargetScrollX != scrollX) {
             scrollToTarget();
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 9c0a5a3..2919e9b 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -88,6 +88,9 @@
     private int mMode = MODE_NONE; /** One of the MODE_XXX values */
     private int mImeOptions;
     private boolean mIsSymbols;
+    /** mIsAutoCompletionActive indicates that auto completed word will be input instead of
+     * what user actually typed. */
+    private boolean mIsAutoCompletionActive;
     private boolean mHasVoice;
     private boolean mVoiceOnPrimary;
     private boolean mPreferSymbols;
@@ -239,7 +242,7 @@
         keyboard.setShifted(false);
         keyboard.setShiftLocked(keyboard.isShiftLocked());
         keyboard.setImeOptions(mContext.getResources(), mMode, imeOptions);
-        keyboard.setBlackFlag(isBlackSym());
+        keyboard.setColorOfSymbolIcons(mIsAutoCompletionActive, isBlackSym());
     }
 
     private LatinKeyboard getKeyboard(KeyboardId id) {
@@ -249,12 +252,10 @@
             Locale saveLocale = conf.locale;
             conf.locale = mInputLocale;
             orig.updateConfiguration(conf, null);
-            LatinKeyboard keyboard = new LatinKeyboard(
-                mContext, id.mXml, id.mKeyboardMode);
+            LatinKeyboard keyboard = new LatinKeyboard(mContext, id.mXml, id.mKeyboardMode);
             keyboard.setVoiceMode(hasVoiceButton(id.mXml == R.xml.kbd_symbols
                     || id.mXml == R.xml.kbd_symbols_black), mHasVoice);
-            keyboard.setLanguageSwitcher(mLanguageSwitcher);
-            keyboard.setBlackFlag(isBlackSym());
+            keyboard.setLanguageSwitcher(mLanguageSwitcher, mIsAutoCompletionActive, isBlackSym());
 
             if (id.mEnableShiftLock) {
                 keyboard.enableShiftLock();
@@ -450,4 +451,12 @@
         }
     }
 
+    public void onAutoCompletionStateChanged(boolean isAutoCompletion) {
+        if (isAutoCompletion != mIsAutoCompletionActive) {
+            LatinKeyboardView keyboardView = getInputView();
+            mIsAutoCompletionActive = isAutoCompletion;
+            keyboardView.invalidateKey(((LatinKeyboard) keyboardView.getKeyboard())
+                    .onAutoCompletionStateChanged(isAutoCompletion));
+        }
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 7afee3f..d0e6e69 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -2483,4 +2483,7 @@
         System.out.println("CPS = " + ((CPS_BUFFER_SIZE * 1000f) / total));
     }
 
+    public void onAutoCompletionStateChanged(boolean isAutoCompletion) {
+        mKeyboardSwitcher.onAutoCompletionStateChanged(isAutoCompletion);
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
index 33519e4..b7c4fc4 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java
@@ -43,11 +43,13 @@
 
     private static final boolean DEBUG_PREFERRED_LETTER = false;
     private static final String TAG = "LatinKeyboard";
+    private static final int OPACITY_FULLY_OPAQUE = 255;
 
     private Drawable mShiftLockIcon;
     private Drawable mShiftLockPreviewIcon;
     private Drawable mOldShiftIcon;
     private Drawable mSpaceIcon;
+    private Drawable mSpaceAutoCompletionIndicator;
     private Drawable mSpacePreviewIcon;
     private Drawable mMicIcon;
     private Drawable mMicPreviewIcon;
@@ -111,6 +113,7 @@
                 mShiftLockPreviewIcon.getIntrinsicWidth(),
                 mShiftLockPreviewIcon.getIntrinsicHeight());
         mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space);
+        mSpaceAutoCompletionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
         mSpacePreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_space);
         mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic);
         mMicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_mic);
@@ -277,9 +280,9 @@
         return mIsAlphaKeyboard;
     }
 
-    public void setBlackFlag(boolean f) {
-        mIsBlackSym = f;
-        if (f) {
+    public void setColorOfSymbolIcons(boolean isAutoCompletion, boolean isBlack) {
+        mIsBlackSym = isBlack;
+        if (isBlack) {
             mShiftLockIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_shift_locked);
             mSpaceIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_space);
             mMicIcon = mRes.getDrawable(R.drawable.sym_bkeyboard_mic);
@@ -292,8 +295,7 @@
         }
         updateF1Key();
         if (mSpaceKey != null) {
-            mSpaceKey.icon = mSpaceIcon;
-            updateSpaceBarForLocale(f);
+            updateSpaceBarForLocale(isAutoCompletion, isBlack);
         }
     }
 
@@ -334,23 +336,34 @@
         }
     }
 
-    private void updateSpaceBarForLocale(boolean isBlack) {
+    /**
+     * @return a key which should be invalidated.
+     */
+    public Key onAutoCompletionStateChanged(boolean isAutoCompletion) {
+        updateSpaceBarForLocale(isAutoCompletion, mIsBlackSym);
+        return mSpaceKey;
+    }
+
+    private void updateSpaceBarForLocale(boolean isAutoCompletion, boolean isBlack) {
         if (mLocale != null) {
-            // Create the graphic for spacebar
-            Bitmap buffer = Bitmap.createBitmap(mSpaceKey.width, mSpaceIcon.getIntrinsicHeight(),
-                    Bitmap.Config.ARGB_8888);
-            Canvas canvas = new Canvas(buffer);
-            drawSpaceBar(canvas, buffer.getWidth(), buffer.getHeight(), 255, isBlack);
+            Bitmap buffer = drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCompletion, isBlack);
             mSpaceKey.icon = new BitmapDrawable(mRes, buffer);
             mSpaceKey.repeatable = mLanguageSwitcher.getLocaleCount() < 2;
         } else {
-            mSpaceKey.icon = isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space)
-                : mRes.getDrawable(R.drawable.sym_keyboard_space);
+            // sym_keyboard_space_led can be shared with Black and White symbol themes.
+            mSpaceKey.icon =
+                isAutoCompletion ? mRes.getDrawable(R.drawable.sym_keyboard_space_led)
+                        : isBlack ? mRes.getDrawable(R.drawable.sym_bkeyboard_space)
+                                : mRes.getDrawable(R.drawable.sym_keyboard_space);
             mSpaceKey.repeatable = true;
         }
     }
 
-    private void drawSpaceBar(Canvas canvas, int width, int height, int opacity, boolean isBlack) {
+    private Bitmap drawSpaceBar(int opacity, boolean isAutoCompletion, boolean isBlack) {
+        int width = mSpaceKey.width;
+        int height = mSpaceIcon.getIntrinsicHeight();
+        Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(buffer);
         canvas.drawColor(mRes.getColor(R.color.latinkeyboard_transparent), PorterDuff.Mode.CLEAR);
         Paint paint = new Paint();
         paint.setAntiAlias(true);
@@ -380,11 +393,22 @@
                     (mSpaceKey.width + bounds.right) / 2, (int) paint.getTextSize());
         }
         // Draw the spacebar icon at the bottom
-        int x = (width - mSpaceIcon.getIntrinsicWidth()) / 2;
-        int y = height - mSpaceIcon.getIntrinsicHeight();
-        mSpaceIcon.setBounds(x, y, 
-                x + mSpaceIcon.getIntrinsicWidth(), y + mSpaceIcon.getIntrinsicHeight());
-        mSpaceIcon.draw(canvas);
+        if (isAutoCompletion) {
+            final int iconWidth = mSpaceAutoCompletionIndicator.getIntrinsicWidth();
+            final int iconHeight = mSpaceAutoCompletionIndicator.getIntrinsicHeight();
+            int x = (width - iconWidth) / 2;
+            int y = height - iconHeight;
+            mSpaceAutoCompletionIndicator.setBounds(x, y, x + iconWidth, y + iconHeight);
+            mSpaceAutoCompletionIndicator.draw(canvas);
+        } else {
+            final int iconWidth = mSpaceIcon.getIntrinsicWidth();
+            final int iconHeight = mSpaceIcon.getIntrinsicHeight();
+            int x = (width - iconWidth) / 2;
+            int y = height - iconHeight;
+            mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
+            mSpaceIcon.draw(canvas);
+        }
+        return buffer;
     }
 
     private void drawButtonArrow(Drawable arrow, Canvas canvas, int x, int bottomY) {
@@ -438,7 +462,8 @@
         return mSpaceDragLastDiff > 0 ? 1 : -1;
     }
 
-    public void setLanguageSwitcher(LanguageSwitcher switcher) {
+    public void setLanguageSwitcher(LanguageSwitcher switcher, boolean isAutoCompletion,
+            boolean isBlackSym) {
         mLanguageSwitcher = switcher;
         Locale locale = mLanguageSwitcher.getLocaleCount() > 0
                 ? mLanguageSwitcher.getInputLocale()
@@ -450,9 +475,9 @@
                    .equalsIgnoreCase(locale.getLanguage())) {
             locale = null;
         }
+        setColorOfSymbolIcons(isAutoCompletion, isBlackSym);
         if (mLocale != null && mLocale.equals(locale)) return;
         mLocale = locale;
-        updateSpaceBarForLocale(mIsBlackSym);
     }
 
     boolean isCurrentlyInSpace() {
@@ -729,7 +754,7 @@
             mTextPaint.setTextSize(textSize);
             mTextPaint.setColor(R.color.latinkeyboard_transparent);
             mTextPaint.setTextAlign(Align.CENTER);
-            mTextPaint.setAlpha(255);
+            mTextPaint.setAlpha(OPACITY_FULLY_OPAQUE);
             mTextPaint.setAntiAlias(true);
             mAscent = (int) mTextPaint.ascent();
             mMiddleX = (mWidth - mBackground.getIntrinsicWidth()) / 2;