Merge "Import revised translations.  DO NOT MERGE" into ics-mr1
diff --git a/java/res/values-ar/donottranslate-more-keys.xml b/java/res/values-ar/donottranslate-more-keys.xml
index 36f670e..cde6860 100644
--- a/java/res/values-ar/donottranslate-more-keys.xml
+++ b/java/res/values-ar/donottranslate-more-keys.xml
@@ -102,5 +102,10 @@
     <!-- In order to make Tatweel easily distinguishable from other punctuations, we use consecutive Tatweels only for its displayed label. -->
     <string name="more_keys_for_dash">"\u0651,\u0652,\u064c,\u0653,\u064f,\u0650,\u064e,\u064b,\u0640\u0640\u0640|\u0640,\u064d,\u0654,\u0656,\u0655,\u0670"</string>
     <string name="more_keys_for_bullet">♪</string>
-    <string name="more_keys_for_star">★</string>
+    <!-- \u066d: ARABIC FIVE POINTED STAR -->
+    <string name="more_keys_for_star">★,\u066d</string>
+    <!-- \ufd3e: ORNATE LEFT PARENTHESIS -->
+    <string name="more_keys_for_left_parenthesis">[,{,&lt;,\ufd3e</string>
+    <!-- \ufd3f: ORNATE RIGHT PARENTHESIS -->
+    <string name="more_keys_for_right_parenthesis">],},&gt;,\ufd3f</string>
 </resources>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 8b4cd6d..352141c 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -81,7 +81,7 @@
     <dimen name="more_suggestions_key_horizontal_padding">12dip</dimen>
     <dimen name="more_suggestions_row_height">40dip</dimen>
     <dimen name="more_suggestions_bottom_gap">6dip</dimen>
-    <dimen name="more_suggestions_modal_tolerance">0.05in</dimen>
+    <dimen name="more_suggestions_modal_tolerance">0.2in</dimen>
     <dimen name="more_suggestions_slide_allowance">0.1in</dimen>
     <integer name="max_more_suggestions_row">6</integer>
     <fraction name="min_more_suggestions_width">90%</fraction>
diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml
index 6322adc..6c77539 100644
--- a/java/res/values/donottranslate-more-keys.xml
+++ b/java/res/values/donottranslate-more-keys.xml
@@ -99,4 +99,6 @@
     <string name="more_keys_for_bullet">♪,♥,♠,♦,♣</string>
     <string name="more_keys_for_star">†,‡,★</string>
     <string name="more_keys_for_plus">±</string>
+    <string name="more_keys_for_left_parenthesis">[,{,&lt;</string>
+    <string name="more_keys_for_right_parenthesis">],},&gt;</string>
 </resources>
diff --git a/java/res/xml/kbd_rows_symbols.xml b/java/res/xml/kbd_rows_symbols.xml
index 074db50..c5bcb14 100644
--- a/java/res/xml/kbd_rows_symbols.xml
+++ b/java/res/xml/kbd_rows_symbols.xml
@@ -85,10 +85,10 @@
             latin:moreKeys="@string/more_keys_for_plus" />
         <Key
             latin:keyLabel="("
-            latin:moreKeys="[,{,&lt;" />
+            latin:moreKeys="@string/more_keys_for_left_parenthesis" />
         <Key
             latin:keyLabel=")"
-            latin:moreKeys="],},&gt;"
+            latin:moreKeys="@string/more_keys_for_right_parenthesis"
             latin:keyWidth="fillRight" />
     </Row>
     <Row
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java
index 0e6e129..f2c5b7b 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java
@@ -27,7 +27,6 @@
 import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
 import com.android.inputmethod.latin.R;
 
-
 /**
  * A view that renders a virtual {@link MiniKeyboard}. It handles rendering of keys and detecting
  * key presses and touch movements.
@@ -115,7 +114,7 @@
 
     @Override
     public DrawingProxy getDrawingProxy() {
-        return  this;
+        return this;
     }
 
     @Override
@@ -174,9 +173,15 @@
         return x;
     }
 
+    private boolean mIsDismissing;
+
     @Override
     public boolean dismissMoreKeysPanel() {
-        return mController.dismissMoreKeysPanel();
+        if (mIsDismissing) return false;
+        mIsDismissing = true;
+        final boolean dismissed = mController.dismissMoreKeysPanel();
+        mIsDismissing = false;
+        return dismissed;
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java b/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java
index 51f6c04..c61dd63 100644
--- a/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java
+++ b/java/src/com/android/inputmethod/latin/MoreSuggestionsView.java
@@ -35,7 +35,6 @@
 import com.android.inputmethod.keyboard.PointerTracker.KeyEventHandler;
 import com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
 
-
 /**
  * A view that renders a virtual {@link MoreSuggestions}. It handles rendering of keys and detecting
  * key presses and touch movements.
@@ -125,7 +124,7 @@
 
     @Override
     public DrawingProxy getDrawingProxy() {
-        return  this;
+        return this;
     }
 
     @Override
@@ -180,10 +179,15 @@
         return x;
     }
 
+    private boolean mIsDismissing;
+
     @Override
     public boolean dismissMoreKeysPanel() {
-        if (mController == null) return false;
-        return mController.dismissMoreKeysPanel();
+        if (mIsDismissing) return false;
+        mIsDismissing = true;
+        final boolean dismissed = mController.dismissMoreKeysPanel();
+        mIsDismissing = false;
+        return dismissed;
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
index 8f478f3..095c2c5 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java
@@ -61,11 +61,6 @@
     private static final int CAPITALIZE_ALL = 2; // All caps
 
     private final static String[] EMPTY_STRING_ARRAY = new String[0];
-    private final static SuggestionsInfo NOT_IN_DICT_EMPTY_SUGGESTIONS =
-            new SuggestionsInfo(0, EMPTY_STRING_ARRAY);
-    private final static SuggestionsInfo IN_DICT_EMPTY_SUGGESTIONS =
-            new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY,
-                    EMPTY_STRING_ARRAY);
     private final static Flag[] USE_FULL_EDIT_DISTANCE_FLAG_ARRAY;
     static {
         // See BinaryDictionary.java for an explanation of these flags
@@ -103,6 +98,15 @@
         return new AndroidSpellCheckerSession(this);
     }
 
+    private static SuggestionsInfo getNotInDictEmptySuggestions() {
+        return new SuggestionsInfo(0, EMPTY_STRING_ARRAY);
+    }
+
+    private static SuggestionsInfo getInDictEmptySuggestions() {
+        return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY,
+                EMPTY_STRING_ARRAY);
+    }
+
     private static class SuggestionsGatherer implements WordCallback {
         public static class Result {
             public final String[] mSuggestions;
@@ -408,9 +412,9 @@
                     DictAndProximity dictInfo = null;
                     try {
                         dictInfo = mDictionaryPool.takeOrGetNull();
-                        if (null == dictInfo) return NOT_IN_DICT_EMPTY_SUGGESTIONS;
-                        return dictInfo.mDictionary.isValidWord(text) ? IN_DICT_EMPTY_SUGGESTIONS
-                                : NOT_IN_DICT_EMPTY_SUGGESTIONS;
+                        if (null == dictInfo) return getNotInDictEmptySuggestions();
+                        return dictInfo.mDictionary.isValidWord(text) ? getInDictEmptySuggestions()
+                                : getNotInDictEmptySuggestions();
                     } finally {
                         if (null != dictInfo) {
                             if (!mDictionaryPool.offer(dictInfo)) {
@@ -445,7 +449,7 @@
                 DictAndProximity dictInfo = null;
                 try {
                     dictInfo = mDictionaryPool.takeOrGetNull();
-                    if (null == dictInfo) return NOT_IN_DICT_EMPTY_SUGGESTIONS;
+                    if (null == dictInfo) return getNotInDictEmptySuggestions();
                     dictInfo.mDictionary.getWords(composer, suggestionsGatherer,
                             dictInfo.mProximityInfo);
                     isInDict = dictInfo.mDictionary.isValidWord(text);
@@ -490,7 +494,7 @@
                     throw e;
                 } else {
                     Log.e(TAG, "Exception while spellcheking: " + e);
-                    return NOT_IN_DICT_EMPTY_SUGGESTIONS;
+                    return getNotInDictEmptySuggestions();
                 }
             }
         }