Merge "Add isDictionaryAvailable to SubtypeSwitcher"
diff --git a/java/proguard.flags b/java/proguard.flags
index 6cc3342..fd73e12 100644
--- a/java/proguard.flags
+++ b/java/proguard.flags
@@ -28,7 +28,7 @@
   # Keep getter/setter methods for ObjectAnimator
   int getLanguageOnSpacebarAnimAlpha();
   void setLanguageOnSpacebarAnimAlpha(int);
-  int getAltCodeKeyWhileTypingAnimAlhpa();
+  int getAltCodeKeyWhileTypingAnimAlpha();
   void setAltCodeKeyWhileTypingAnimAlpha(int);
 }
 
diff --git a/java/res/anim/alt_code_key_while_typing_fadein.xml b/java/res/anim/alt_code_key_while_typing_fadein.xml
index f8caca3..079c980 100644
--- a/java/res/anim/alt_code_key_while_typing_fadein.xml
+++ b/java/res/anim/alt_code_key_while_typing_fadein.xml
@@ -22,6 +22,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:propertyName="altCodeKeyWhileTypingAnimAlpha"
     android:valueType="intType"
-    android:duration="100"
+    android:duration="1000"
     android:valueFrom="128"
     android:valueTo="255" />
diff --git a/java/res/anim/alt_code_key_while_typing_fadeout.xml b/java/res/anim/alt_code_key_while_typing_fadeout.xml
index bad1e74..511e138 100644
--- a/java/res/anim/alt_code_key_while_typing_fadeout.xml
+++ b/java/res/anim/alt_code_key_while_typing_fadeout.xml
@@ -22,6 +22,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:propertyName="altCodeKeyWhileTypingAnimAlpha"
     android:valueType="intType"
-    android:duration="70"
+    android:duration="3000"
     android:valueFrom="255"
     android:valueTo="128" />
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index b51dbb9..804ccf6 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -260,7 +260,7 @@
             mKeyHintLabelSize = (int)(keyHeight * mKeyHintLabelRatio);
         }
 
-        public void brendAlpha(Paint paint) {
+        public void blendAlpha(Paint paint) {
             final int color = paint.getColor();
             paint.setARGB((paint.getAlpha() * mAnimAlpha) / ALPHA_OPAQUE,
                     Color.red(color), Color.green(color), Color.blue(color));
@@ -600,7 +600,7 @@
                 // Make label invisible
                 paint.setColor(Color.TRANSPARENT);
             }
-            params.brendAlpha(paint);
+            params.blendAlpha(paint);
             canvas.drawText(label, 0, label.length(), positionX, baseline, paint);
             // Turn off drop shadow and reset x-scale.
             paint.setShadowLayer(0, 0, 0, 0);
@@ -645,7 +645,7 @@
                 hintSize = params.mKeyHintLetterSize;
             }
             paint.setColor(hintColor);
-            params.brendAlpha(paint);
+            params.blendAlpha(paint);
             paint.setTextSize(hintSize);
             final float hintX, hintY;
             if (key.hasHintLabel()) {
@@ -715,7 +715,7 @@
 
         paint.setTextSize(params.mKeyHintLetterSize);
         paint.setColor(params.mKeyHintLabelColor);
-        params.brendAlpha(paint);
+        params.blendAlpha(paint);
         paint.setTextAlign(Align.CENTER);
         final float hintX = keyWidth - params.mKeyHintLetterPadding
                 - getCharWidth(KEY_LABEL_REFERENCE_CHAR, paint) / 2;
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index 5ebf92c..7fadb3b 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -227,26 +227,22 @@
             removeMessages(MSG_LONGPRESS_KEY);
         }
 
-        public static void cancelAndStartAnimators(ObjectAnimator animatorToCancel,
-                ObjectAnimator animatorToStart) {
-            if (animatorToCancel != null && animatorToCancel.isStarted()) {
+        public static void cancelAndStartAnimators(final ObjectAnimator animatorToCancel,
+                final ObjectAnimator animatorToStart) {
+            float startFraction = 0.0f;
+            if (animatorToCancel.isStarted()) {
                 animatorToCancel.cancel();
+                startFraction = 1.0f - animatorToCancel.getAnimatedFraction();
             }
-            // TODO: Start the animation with an initial value that is the same as the final value
-            // of the above animation when it gets cancelled.
-            if (animatorToStart != null && !animatorToStart.isStarted()) {
-                animatorToStart.start();
-            }
-        }
-
-        private void cancelTypingStateTimer() {
-            removeMessages(MSG_TYPING_STATE_EXPIRED);
+            final long startTime = (long)(animatorToStart.getDuration() * startFraction);
+            animatorToStart.start();
+            animatorToStart.setCurrentPlayTime(startTime);
         }
 
         @Override
         public void startTypingStateTimer() {
             final boolean isTyping = isTypingState();
-            cancelTypingStateTimer();
+            removeMessages(MSG_TYPING_STATE_EXPIRED);
             sendMessageDelayed(
                     obtainMessage(MSG_TYPING_STATE_EXPIRED), mParams.mIgnoreAltCodeKeyTimeout);
             if (isTyping) {
@@ -286,7 +282,6 @@
 
         public void cancelAllMessages() {
             cancelKeyTimers();
-            cancelTypingStateTimer();
         }
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 24ab547..37d9b6a 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -248,6 +248,9 @@
             mListener.onPressKey(key.mCode);
             final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged;
             mKeyboardLayoutHasBeenChanged = false;
+            if (!key.altCodeWhileTyping() && !key.isModifier()) {
+                mTimerProxy.startTypingStateTimer();
+            }
             return keyboardLayoutHasBeenChanged;
         }
         return false;
@@ -279,9 +282,6 @@
             } else if (code != Keyboard.CODE_UNSPECIFIED) {
                 mListener.onCodeInput(code, x, y);
             }
-            if (!key.altCodeWhileTyping() && !key.isModifier()) {
-                mTimerProxy.startTypingStateTimer();
-            }
         }
     }
 
@@ -734,6 +734,9 @@
     public void onRepeatKey(Key key) {
         if (key != null) {
             detectAndSendKey(key, key.mX, key.mY);
+            if (!key.altCodeWhileTyping() && !key.isModifier()) {
+                mTimerProxy.startTypingStateTimer();
+            }
         }
     }