Remove Key.isStick, use backgroundType="stick" instead

Change-Id: I50e88c0870a3fe360b81f19163ca2f64ec38d8e8
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 0451c9f..6e9461a 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -199,9 +199,8 @@
             <enum name="normal" value="0" />
             <enum name="functional" value="1" />
             <enum name="action" value="2" />
+            <enum name="sticky" value="3" />
         </attr>
-        <!-- Whether this is a toggle key. -->
-        <attr name="isSticky" format="boolean" />
         <!-- Whether long-pressing on this key will make it repeat. -->
         <attr name="isRepeatable" format="boolean" />
         <!-- The string of characters to output when this key is pressed. -->
diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml
index d86a01d..0b6d871 100644
--- a/java/res/xml-sw600dp/kbd_key_styles.xml
+++ b/java/res/xml-sw600dp/kbd_key_styles.xml
@@ -44,8 +44,7 @@
         latin:code="@integer/key_shift"
         latin:keyIcon="iconShiftKey"
         latin:keyIconShifted="iconShiftedShiftKey"
-        latin:backgroundType="functional"
-        latin:isSticky="true" />
+        latin:backgroundType="sticky" />
     <key-style
         latin:styleName="deleteKeyStyle"
         latin:code="@integer/key_delete"
diff --git a/java/res/xml-sw768dp/kbd_key_styles.xml b/java/res/xml-sw768dp/kbd_key_styles.xml
index 4deb263..686e7b6 100644
--- a/java/res/xml-sw768dp/kbd_key_styles.xml
+++ b/java/res/xml-sw768dp/kbd_key_styles.xml
@@ -26,8 +26,7 @@
         latin:code="@integer/key_shift"
         latin:keyIcon="iconShiftKey"
         latin:keyIconShifted="iconShiftedShiftKey"
-        latin:backgroundType="functional"
-        latin:isSticky="true" />
+        latin:backgroundType="sticky" />
     <key-style
         latin:styleName="deleteKeyStyle"
         latin:code="@integer/key_delete"
diff --git a/java/res/xml/kbd_key_styles.xml b/java/res/xml/kbd_key_styles.xml
index 9ed97b1..11b1abb 100644
--- a/java/res/xml/kbd_key_styles.xml
+++ b/java/res/xml/kbd_key_styles.xml
@@ -67,8 +67,7 @@
         latin:code="@integer/key_shift"
         latin:keyIcon="iconShiftKey"
         latin:keyIconShifted="iconShiftedShiftKey"
-        latin:backgroundType="functional"
-        latin:isSticky="true" />
+        latin:backgroundType="sticky" />
     <key-style
         latin:styleName="deleteKeyStyle"
         latin:code="@integer/key_delete"
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 9959a78..7ae3467 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -82,8 +82,6 @@
     /** The visual insets */
     public final int mVisualInsetsLeft;
     public final int mVisualInsetsRight;
-    /** Whether this key is sticky, i.e., a toggle key */
-    public final boolean mSticky;
     /** X coordinate of the key in the keyboard layout */
     public final int mX;
     /** Y coordinate of the key in the keyboard layout */
@@ -108,6 +106,7 @@
     public static final int BACKGROUND_TYPE_NORMAL = 0;
     public static final int BACKGROUND_TYPE_FUNCTIONAL = 1;
     public static final int BACKGROUND_TYPE_ACTION = 2;
+    public static final int BACKGROUND_TYPE_STICKY = 3;
 
     /** Whether this key repeats itself when held down */
     public final boolean mRepeatable;
@@ -126,55 +125,6 @@
     private static final int KEYWIDTH_FILL_RIGHT = -1;
     private static final int KEYWIDTH_FILL_BOTH = -2;
 
-    private final static int[] KEY_STATE_NORMAL_ON = {
-        android.R.attr.state_checkable,
-        android.R.attr.state_checked
-    };
-
-    private final static int[] KEY_STATE_PRESSED_ON = {
-        android.R.attr.state_pressed,
-        android.R.attr.state_checkable,
-        android.R.attr.state_checked
-    };
-
-    private final static int[] KEY_STATE_NORMAL_OFF = {
-        android.R.attr.state_checkable
-    };
-
-    private final static int[] KEY_STATE_PRESSED_OFF = {
-        android.R.attr.state_pressed,
-        android.R.attr.state_checkable
-    };
-
-    private final static int[] KEY_STATE_NORMAL = {
-    };
-
-    private final static int[] KEY_STATE_PRESSED = {
-        android.R.attr.state_pressed
-    };
-
-    // functional normal state (with properties)
-    private static final int[] KEY_STATE_FUNCTIONAL_NORMAL = {
-            android.R.attr.state_single
-    };
-
-    // functional pressed state (with properties)
-    private static final int[] KEY_STATE_FUNCTIONAL_PRESSED = {
-            android.R.attr.state_single,
-            android.R.attr.state_pressed
-    };
-
-    // action normal state (with properties)
-    private static final int[] KEY_STATE_ACTIVE_NORMAL = {
-            android.R.attr.state_active
-    };
-
-    // action pressed state (with properties)
-    private static final int[] KEY_STATE_ACTIVE_PRESSED = {
-            android.R.attr.state_active,
-            android.R.attr.state_pressed
-    };
-
     // RTL parenthesis character swapping map.
     private static final Map<Integer, Integer> sRtlParenthesisMap = new HashMap<Integer, Integer>();
 
@@ -242,7 +192,6 @@
         mHintLabel = hintLabel;
         mLabelOption = 0;
         mBackgroundType = BACKGROUND_TYPE_NORMAL;
-        mSticky = false;
         mRepeatable = false;
         mMoreKeys = null;
         mMaxMoreKeysColumn = 0;
@@ -344,7 +293,6 @@
         mBackgroundType = style.getInt(
                 keyAttr, R.styleable.Keyboard_Key_backgroundType, BACKGROUND_TYPE_NORMAL);
         mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false);
-        mSticky = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky, false);
         mEnabled = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_enabled, true);
         mEdgeFlags = 0;
 
@@ -388,6 +336,10 @@
         mEdgeFlags |= flags;
     }
 
+    public boolean isSticky() {
+        return mBackgroundType == BACKGROUND_TYPE_STICKY;
+    }
+
     public boolean isSpacer() {
         return false;
     }
@@ -550,6 +502,55 @@
         return dx * dx + dy * dy;
     }
 
+    private final static int[] KEY_STATE_NORMAL_HIGHLIGHT_ON = {
+        android.R.attr.state_checkable,
+        android.R.attr.state_checked
+    };
+
+    private final static int[] KEY_STATE_PRESSED_HIGHLIGHT_ON = {
+        android.R.attr.state_pressed,
+        android.R.attr.state_checkable,
+        android.R.attr.state_checked
+    };
+
+    private final static int[] KEY_STATE_NORMAL_HIGHLIGHT_OFF = {
+        android.R.attr.state_checkable
+    };
+
+    private final static int[] KEY_STATE_PRESSED_HIGHLIGHT_OFF = {
+        android.R.attr.state_pressed,
+        android.R.attr.state_checkable
+    };
+
+    private final static int[] KEY_STATE_NORMAL = {
+    };
+
+    private final static int[] KEY_STATE_PRESSED = {
+        android.R.attr.state_pressed
+    };
+
+    // functional normal state (with properties)
+    private static final int[] KEY_STATE_FUNCTIONAL_NORMAL = {
+            android.R.attr.state_single
+    };
+
+    // functional pressed state (with properties)
+    private static final int[] KEY_STATE_FUNCTIONAL_PRESSED = {
+            android.R.attr.state_single,
+            android.R.attr.state_pressed
+    };
+
+    // action normal state (with properties)
+    private static final int[] KEY_STATE_ACTIVE_NORMAL = {
+            android.R.attr.state_active
+    };
+
+    // action pressed state (with properties)
+    private static final int[] KEY_STATE_ACTIVE_PRESSED = {
+            android.R.attr.state_active,
+            android.R.attr.state_pressed
+    };
+
     /**
      * Returns the drawable state for the key, based on the current state and type of the key.
      * @return the drawable state of the key.
@@ -558,20 +559,17 @@
     public int[] getCurrentDrawableState() {
         final boolean pressed = mPressed;
 
-        // TODO: "Sticky" should be one of backgroundType.
-        if (mSticky) {
-            if (mHighlightOn) {
-                return pressed ? KEY_STATE_PRESSED_ON : KEY_STATE_NORMAL_ON;
-            } else {
-                return pressed ? KEY_STATE_PRESSED_OFF : KEY_STATE_NORMAL_OFF;
-            }
-        }
-
         switch (mBackgroundType) {
         case BACKGROUND_TYPE_FUNCTIONAL:
             return pressed ? KEY_STATE_FUNCTIONAL_PRESSED : KEY_STATE_FUNCTIONAL_NORMAL;
         case BACKGROUND_TYPE_ACTION:
             return pressed ? KEY_STATE_ACTIVE_PRESSED : KEY_STATE_ACTIVE_NORMAL;
+        case BACKGROUND_TYPE_STICKY:
+            if (mHighlightOn) {
+                return pressed ? KEY_STATE_PRESSED_HIGHLIGHT_ON : KEY_STATE_NORMAL_HIGHLIGHT_ON;
+            } else {
+                return pressed ? KEY_STATE_PRESSED_HIGHLIGHT_OFF : KEY_STATE_NORMAL_HIGHLIGHT_OFF;
+            }
         default: /* BACKGROUND_TYPE_NORMAL */
             return pressed ? KEY_STATE_PRESSED : KEY_STATE_NORMAL;
         }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
index 9800f24..3d2d77c 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java
@@ -173,7 +173,6 @@
             readInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted);
             readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn);
             readInt(keyAttr, R.styleable.Keyboard_Key_backgroundType);
-            readBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky);
             readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable);
             readBoolean(keyAttr, R.styleable.Keyboard_Key_enabled);
         }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
index 4432ee1..593c3dc 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java
@@ -78,7 +78,7 @@
         updateHistogram(key);
         if (key.mCode == Keyboard.CODE_SHIFT) {
             mShiftKeys.add(key);
-            if (key.mSticky) {
+            if (key.isSticky()) {
                 mShiftLockKeys.add(key);
             }
         }