merge in ics-mr1-release history after reset to ics-mr1
diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml
index 58d515d..de95ab8 100644
--- a/java/res/values-hi/strings.xml
+++ b/java/res/values-hi/strings.xml
@@ -37,7 +37,7 @@
     <string name="advanced_settings_summary" msgid="5193513161106637254">"विशेषज्ञ उपयोगकर्ताओं के लिए विकल्‍प"</string>
     <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"कुंजी पॉपअप खारिज़ विलंब"</string>
     <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"कोई विलंब नहीं"</string>
-    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"डिफ़ॉल्ट"</string>
+    <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"डिफ़ॉल्ट"</string>
     <string name="use_contacts_dict" msgid="4435317977804180815">"संपर्क नाम सुझाएं"</string>
     <string name="use_contacts_dict_summary" msgid="6599983334507879959">"सुझाव और सुधार के लिए संपर्क से नामों का उपयोग करें"</string>
     <string name="enable_span_insert" msgid="7204653105667167620">"पुन: सुधार सक्षम करें"</string>
diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml
index 1ea5a69..292517c 100644
--- a/java/res/values-iw/strings.xml
+++ b/java/res/values-iw/strings.xml
@@ -56,7 +56,7 @@
     <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"כבוי"</string>
     <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"מצומצם"</string>
     <string name="auto_correction_threshold_mode_aggeressive" msgid="3524029103734923819">"מחמיר"</string>
-    <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"אגרסיבי מאוד"</string>
+    <string name="auto_correction_threshold_mode_very_aggeressive" msgid="3386782235540547678">"מחמיר מאוד"</string>
     <string name="bigram_suggestion" msgid="2636414079905220518">"הצעות של צמדי אותיות (Bigram)"</string>
     <string name="bigram_suggestion_summary" msgid="4383845146070101531">"השתמש במילה הקודמת כדי לשפר את ההצעה"</string>
     <string name="bigram_prediction" msgid="8914273444762259739">"חיזוי צמדי אותיות (Bigram)"</string>
diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml
index fbfe93a..ba831a4 100644
--- a/java/res/values-vi/strings.xml
+++ b/java/res/values-vi/strings.xml
@@ -65,7 +65,7 @@
     <string name="label_go_key" msgid="1635148082137219148">"Đến"</string>
     <string name="label_next_key" msgid="362972844525672568">"Tiếp theo"</string>
     <string name="label_done_key" msgid="2441578748772529288">"Xong"</string>
-    <string name="label_send_key" msgid="2815056534433717444">"Gửi"</string>
+    <string name="label_send_key" msgid="2815056534433717444">"Gửi"</string>
     <string name="label_to_alpha_key" msgid="4793983863798817523">"ABC"</string>
     <string name="label_to_symbol_key" msgid="8516904117128967293">"?123"</string>
     <string name="label_to_symbol_with_microphone_key" msgid="9035925553010061906">"123"</string>
@@ -116,7 +116,7 @@
     <string name="voice_listening" msgid="467518160751321844">"Xin mời nói"</string>
     <string name="voice_working" msgid="6666937792815731889">"Đang hoạt động"</string>
     <string name="voice_initializing" msgid="661962047129906646"></string>
-    <string name="voice_error" msgid="5140896300312186162">"Lỗi. Vui lòng thử lại."</string>
+    <string name="voice_error" msgid="5140896300312186162">"Lỗi. Vui lòng thử lại."</string>
     <string name="voice_network_error" msgid="6649556447401862563">"Không thể kết nối"</string>
     <string name="voice_too_much_speech" msgid="5746973620134227376">"Lỗi, quá nhiều câu thoại."</string>
     <string name="voice_audio_error" msgid="5072707727016414454">"Sự cố âm thanh"</string>
@@ -143,7 +143,7 @@
     <string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string>
     <string name="prefs_enable_log" msgid="6620424505072963557">"Bật phản hồi của người dùng"</string>
     <string name="prefs_description_log" msgid="5827825607258246003">"Giúp nâng cao trình chỉnh sửa phương thức nhập này bằng cách tự động gửi thống kê sử dụng và báo cáo sự cố cho Google."</string>
-    <string name="keyboard_layout" msgid="8451164783510487501">"Chủ đề bàn phím"</string>
+    <string name="keyboard_layout" msgid="8451164783510487501">"Chủ đề bàn phím"</string>
     <string name="subtype_de_qwerty" msgid="3358900499589259491">"Bàn phím QWERTY tiếng Đức"</string>
     <string name="subtype_en_GB" msgid="88170601942311355">"Tiếng Anh (Anh)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Tiếng Anh (Mỹ)"</string>
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
index 55175e0..08e7a7a 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
@@ -21,13 +21,13 @@
 import java.util.LinkedList;
 
 public class PointerTrackerQueue {
-    private LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>();
+    private final LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>();
 
-    public void add(PointerTracker tracker) {
+    public synchronized void add(PointerTracker tracker) {
         mQueue.add(tracker);
     }
 
-    public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) {
+    public synchronized void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) {
         if (mQueue.lastIndexOf(tracker) < 0) {
             return;
         }
@@ -47,25 +47,28 @@
         releaseAllPointersExcept(null, eventTime);
     }
 
-    public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
+    public synchronized void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
         for (PointerTracker t : mQueue) {
-            if (t == tracker)
+            if (t == tracker) {
                 continue;
+            }
             t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime);
         }
         mQueue.clear();
-        if (tracker != null)
+        if (tracker != null) {
             mQueue.add(tracker);
+        }
     }
 
-    public void remove(PointerTracker tracker) {
+    public synchronized void remove(PointerTracker tracker) {
         mQueue.remove(tracker);
     }
 
-    public boolean isAnyInSlidingKeyInput() {
+    public synchronized boolean isAnyInSlidingKeyInput() {
         for (final PointerTracker tracker : mQueue) {
-            if (tracker.isInSlidingKeyInput())
+            if (tracker.isInSlidingKeyInput()) {
                 return true;
+            }
         }
         return false;
     }
diff --git a/native/src/correction.cpp b/native/src/correction.cpp
index 0c56680..27dc407 100644
--- a/native/src/correction.cpp
+++ b/native/src/correction.cpp
@@ -758,6 +758,9 @@
                 //         \             .
                 // C        \            .
                 //   0   R1 R2
+                if (factor <= 0) {
+                    return -1;
+                }
                 multiplyRate((int)(factor * 100), &finalFreq);
             } else if (squaredDistance == PROXIMITY_CHAR_WITHOUT_DISTANCE_INFO) {
                 multiplyRate(WORDS_WITH_PROXIMITY_CHARACTER_DEMOTION_RATE, &finalFreq);