Merge "Tweak 7 inch layout a bit"
diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml
index ddfe25a..46c9d8a 100644
--- a/java/res/values-ar/strings.xml
+++ b/java/res/values-ar/strings.xml
@@ -37,12 +37,9 @@
     <string name="misc_category" msgid="6894192814868233453">"خيارات أخرى"</string>
     <string name="advanced_settings" msgid="362895144495591463">"الإعدادات المتقدمة"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"خيارات للخبراء"</string>
-    <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) -->
-    <skip />
-    <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) -->
-    <skip />
-    <!-- no translation found for suppress_language_switch_key (8003788410354806368) -->
-    <skip />
+    <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"التبديل إلى أسلوب إدخال آخر"</string>
+    <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"يغطي مفتاح تبديل اللغات أساليب الإدخال الأخرى أيضًا"</string>
+    <string name="suppress_language_switch_key" msgid="8003788410354806368">"إيقاف مفتاح تبديل اللغات"</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>
diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml
index 136c23a..2696ed6 100644
--- a/java/res/values-fa/strings.xml
+++ b/java/res/values-fa/strings.xml
@@ -37,12 +37,9 @@
     <string name="misc_category" msgid="6894192814868233453">"سایر گزینه ها"</string>
     <string name="advanced_settings" msgid="362895144495591463">"تنظیمات پیشرفته"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"گزینه‌هایی برای حرفه‌ای‌ها"</string>
-    <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) -->
-    <skip />
-    <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) -->
-    <skip />
-    <!-- no translation found for suppress_language_switch_key (8003788410354806368) -->
-    <skip />
+    <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"تغییر به دیگر روشهای ورودی"</string>
+    <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"کلید تغییر زبان، سایر ورودیهای زبان را نیز پوشش می‌دهد"</string>
+    <string name="suppress_language_switch_key" msgid="8003788410354806368">"کلید تغییر زبان را فشار دهید"</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>
diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml
index 1e385f1..1f03a05 100644
--- a/java/res/values-in/strings.xml
+++ b/java/res/values-in/strings.xml
@@ -22,11 +22,11 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="english_ime_name" msgid="7252517407088836577">"Keyboard Android"</string>
     <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Keyboard Android (AOSP)"</string>
-    <string name="english_ime_settings" msgid="6661589557206947774">"Pengaturan keyboard Android"</string>
+    <string name="english_ime_settings" msgid="6661589557206947774">"Setelan keyboard Android"</string>
     <string name="english_ime_input_options" msgid="3909945612939668554">"Opsi masukan"</string>
     <string name="spell_checker_service_name" msgid="7338064335159755926">"Pemeriksa ejaan Android"</string>
     <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Pemeriksa ejaan Android (AOSP)"</string>
-    <string name="android_spell_checker_settings" msgid="5822324635435443689">"Pengaturan pemeriksaan ejaan"</string>
+    <string name="android_spell_checker_settings" msgid="5822324635435443689">"Setelan pemeriksaan ejaan"</string>
     <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cari nama kenalan"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Pemeriksa ejaan menggunakan entri dari daftar kenalan Anda"</string>
     <string name="vibrate_on_keypress" msgid="5258079494276955460">"Getar jika tombol ditekan"</string>
@@ -35,7 +35,7 @@
     <string name="general_category" msgid="1859088467017573195">"Umum"</string>
     <string name="correction_category" msgid="2236750915056607613">"Koreksi teks"</string>
     <string name="misc_category" msgid="6894192814868233453">"Opsi lain"</string>
-    <string name="advanced_settings" msgid="362895144495591463">"Pengaturan lanjutan"</string>
+    <string name="advanced_settings" msgid="362895144495591463">"Setelan lanjutan"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Opsi untuk ahli"</string>
     <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) -->
     <skip />
@@ -90,7 +90,7 @@
     <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Simbol"</string>
     <string name="spoken_description_to_alpha" msgid="23129338819771807">"Huruf"</string>
     <string name="spoken_description_to_numeric" msgid="591752092685161732">"Angka"</string>
-    <string name="spoken_description_settings" msgid="4627462689603838099">"Pengaturan"</string>
+    <string name="spoken_description_settings" msgid="4627462689603838099">"Setelan"</string>
     <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string>
     <string name="spoken_description_space" msgid="2582521050049860859">"Spasi"</string>
     <string name="spoken_description_mic" msgid="615536748882611950">"Masukan suara"</string>
@@ -107,7 +107,7 @@
     <string name="voice_warning_title" msgid="4419354150908395008">"Masukan suara"</string>
     <string name="voice_warning_locale_not_supported" msgid="637923019716442333">"Masukan suara saat ini tidak didukung untuk bahasa Anda, tetapi bekerja dalam Bahasa Inggris."</string>
     <string name="voice_warning_may_not_understand" msgid="5596289095878251072">"Masukan suara menggunakan pengenalan ucapan Google. "<a href="http://m.google.com/privacy">"Kebijakan Privasi Seluler"</a>" berlaku."</string>
-    <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan masukan suara, buka pengaturan metode masukan."</string>
+    <string name="voice_warning_how_to_turn_off" msgid="3190378129944934856">"Untuk mematikan masukan suara, buka setelan metode masukan."</string>
     <string name="voice_hint_dialog_message" msgid="1420686286820661548">"Untuk menggunakan masukan suara, tekan tombol mikrofon."</string>
     <string name="voice_listening" msgid="467518160751321844">"Ucapkan sekarang"</string>
     <string name="voice_working" msgid="6666937792815731889">"Bekerja"</string>
@@ -143,6 +143,6 @@
     <string name="subtype_en_GB" msgid="88170601942311355">"Inggris (Inggris)"</string>
     <string name="subtype_en_US" msgid="6160452336634534239">"Inggris (AS)"</string>
     <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Modus studi daya guna"</string>
-    <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Pengaturan durasi getaran saat tombol ditekan"</string>
-    <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Pengaturan volume suara saat tombol ditekan"</string>
+    <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Setelan durasi getaran saat tombol ditekan"</string>
+    <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Setelan volume suara saat tombol ditekan"</string>
 </resources>
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 533b10a..246c4d7 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -37,12 +37,9 @@
     <string name="misc_category" msgid="6894192814868233453">"Pilihan lain"</string>
     <string name="advanced_settings" msgid="362895144495591463">"Tetapan terperinci"</string>
     <string name="advanced_settings_summary" msgid="4487980456152830271">"Pilihan untuk pakar"</string>
-    <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) -->
-    <skip />
-    <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) -->
-    <skip />
-    <!-- no translation found for suppress_language_switch_key (8003788410354806368) -->
-    <skip />
+    <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Tukar ke kaedah input lain"</string>
+    <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Kunci pertukaran bahasa meliputi kaedah masukan lain juga"</string>
+    <string name="suppress_language_switch_key" msgid="8003788410354806368">"Tekan kunci ptukaran bhs"</string>
     <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Pop tmbl knci ketpkn lengah"</string>
     <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Tiada lengah"</string>
     <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Lalai"</string>
diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml
index 3382d0e..12185ca 100644
--- a/java/res/values-sw/strings.xml
+++ b/java/res/values-sw/strings.xml
@@ -24,8 +24,8 @@
     <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Kicharazio cha Android (AOSP)"</string>
     <string name="english_ime_settings" msgid="6661589557206947774">"Mipangilio ya kibodi ya Android"</string>
     <string name="english_ime_input_options" msgid="3909945612939668554">"Chaguo za uingizaji"</string>
-    <string name="spell_checker_service_name" msgid="7338064335159755926">"Kikagua tahajia ya Android"</string>
-    <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kikagua tahajia ya Android (AOSP)"</string>
+    <string name="spell_checker_service_name" msgid="7338064335159755926">"Kikagua tahajia cha Android"</string>
+    <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kikagua tahajia cha Android (AOSP)"</string>
     <string name="android_spell_checker_settings" msgid="5822324635435443689">"Mipangilio ya kukagua sarufi"</string>
     <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Angalia majina ya wasiliani"</string>
     <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Kikagua tahajia hutumia ingizo kutoka kwa orodha yako ya anwani"</string>
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 7d9b505..f17c1d9 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -413,6 +413,8 @@
 
         final SuggestedWords.Builder builder;
         if (DBG) {
+            // TODO: this doesn't take into account the fact that removing dupes from mSuggestions
+            // may have made mScores[] and mSuggestions out of sync.
             final CharSequence autoCorrectionSuggestion = mSuggestions.get(0);
             final int autoCorrectionSuggestionScore = mScores[0];
             double normalizedScore = BinaryDictionary.calcNormalizedScore(
@@ -420,21 +422,28 @@
                     autoCorrectionSuggestionScore);
             ArrayList<SuggestedWords.SuggestedWordInfo> scoreInfoList =
                     new ArrayList<SuggestedWords.SuggestedWordInfo>();
-            scoreInfoList.add(new SuggestedWords.SuggestedWordInfo("+", false));
-            for (int i = 0; i < mScores.length; ++i) {
+            scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(autoCorrectionSuggestion, "+",
+                    false));
+            final int suggestionsSize = mSuggestions.size();
+            // Note: i here is the index in mScores[], but the index in mSuggestions is one more
+            // than i because we added the typed word to mSuggestions without touching mScores.
+            for (int i = 0; i < mScores.length && i < suggestionsSize - 1; ++i) {
                 if (normalizedScore > 0) {
                     final String scoreThreshold = String.format("%d (%4.2f)", mScores[i],
                             normalizedScore);
                     scoreInfoList.add(
-                            new SuggestedWords.SuggestedWordInfo(scoreThreshold, false));
+                            new SuggestedWords.SuggestedWordInfo(mSuggestions.get(i + 1),
+                                    scoreThreshold, false));
                     normalizedScore = 0.0;
                 } else {
                     final String score = Integer.toString(mScores[i]);
-                    scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(score, false));
+                    scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(mSuggestions.get(i + 1),
+                            score, false));
                 }
             }
-            for (int i = mScores.length; i < mSuggestions.size(); ++i) {
-                scoreInfoList.add(new SuggestedWords.SuggestedWordInfo("--", false));
+            for (int i = mScores.length; i < suggestionsSize; ++i) {
+                scoreInfoList.add(new SuggestedWords.SuggestedWordInfo(mSuggestions.get(i),
+                        "--", false));
             }
             builder = new SuggestedWords.Builder().addWords(mSuggestions, scoreInfoList)
                     .setAllowsToBeAutoCorrected(allowsToBeAutoCorrected)
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 8bfe769..4a51e79 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -20,30 +20,23 @@
 import android.view.inputmethod.CompletionInfo;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
 public class SuggestedWords {
-    public static final SuggestedWords EMPTY = new SuggestedWords(null, false, false, false, false,
-            null);
+    public static final SuggestedWords EMPTY = new SuggestedWords(false, false, false, false,
+            Collections.<SuggestedWordInfo>emptyList());
 
-    private final List<CharSequence> mWords;
     public final boolean mTypedWordValid;
     public final boolean mHasAutoCorrectionCandidate;
     public final boolean mIsPunctuationSuggestions;
     private final List<SuggestedWordInfo> mSuggestedWordInfoList;
 
-    SuggestedWords(List<CharSequence> words, boolean typedWordValid,
+    SuggestedWords(boolean typedWordValid,
             boolean hasAutoCorrectionCandidate, boolean isPunctuationSuggestions,
             boolean shouldBlockAutoCorrectionBySafetyNet,
             List<SuggestedWordInfo> suggestedWordInfoList) {
-        if (words != null) {
-            mWords = words;
-        } else {
-            mWords = Collections.emptyList();
-        }
         mTypedWordValid = typedWordValid;
         mHasAutoCorrectionCandidate = hasAutoCorrectionCandidate
                 && !shouldBlockAutoCorrectionBySafetyNet;
@@ -52,11 +45,11 @@
     }
 
     public int size() {
-        return mWords.size();
+        return mSuggestedWordInfoList.size();
     }
 
     public CharSequence getWord(int pos) {
-        return mWords.get(pos);
+        return mSuggestedWordInfoList.get(pos).mWord;
     }
 
     public SuggestedWordInfo getInfo(int pos) {
@@ -77,12 +70,10 @@
         return "SuggestedWords:"
                 + " mTypedWordValid=" + mTypedWordValid
                 + " mHasAutoCorrectionCandidate=" + mHasAutoCorrectionCandidate
-                + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions
-                + " mWords=" + Arrays.toString(mWords.toArray());
+                + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions;
     }
 
     public static class Builder {
-        private List<CharSequence> mWords = new ArrayList<CharSequence>();
         private boolean mTypedWordValid;
         private boolean mHasMinimalSuggestion;
         private boolean mIsPunctuationSuggestions;
@@ -100,14 +91,15 @@
                 List<SuggestedWordInfo> suggestedWordInfoList) {
             final int N = words.size();
             for (int i = 0; i < N; ++i) {
+                final CharSequence word = words.get(i);
                 SuggestedWordInfo suggestedWordInfo = null;
                 if (suggestedWordInfoList != null) {
                     suggestedWordInfo = suggestedWordInfoList.get(i);
                 }
                 if (suggestedWordInfo == null) {
-                    suggestedWordInfo = new SuggestedWordInfo();
+                    suggestedWordInfo = new SuggestedWordInfo(word);
                 }
-                addWord(words.get(i), suggestedWordInfo);
+                addWord(word, suggestedWordInfo);
             }
             return this;
         }
@@ -118,14 +110,14 @@
 
         public Builder addWord(CharSequence word, CharSequence debugString,
                 boolean isPreviousSuggestedWord) {
-            SuggestedWordInfo info = new SuggestedWordInfo(debugString, isPreviousSuggestedWord);
+            SuggestedWordInfo info = new SuggestedWordInfo(word, debugString,
+                    isPreviousSuggestedWord);
             return addWord(word, info);
         }
 
         /* package for tests */
         Builder addWord(CharSequence word, SuggestedWordInfo suggestedWordInfo) {
-            if (!TextUtils.isEmpty(word)) {
-                mWords.add(word);
+            if (!TextUtils.isEmpty(suggestedWordInfo.mWord)) {
                 // It's okay if suggestedWordInfo is null since it's checked where it's used.
                 mSuggestedWordInfoList.add(suggestedWordInfo);
             }
@@ -175,7 +167,6 @@
         // and replace it with what the user currently typed.
         public Builder addTypedWordAndPreviousSuggestions(CharSequence typedWord,
                 SuggestedWords previousSuggestions) {
-            mWords.clear();
             mSuggestedWordInfoList.clear();
             final HashSet<String> alreadySeen = new HashSet<String>();
             addWord(typedWord, null, false);
@@ -195,17 +186,17 @@
         }
 
         public SuggestedWords build() {
-            return new SuggestedWords(mWords, mTypedWordValid, mHasMinimalSuggestion,
+            return new SuggestedWords(mTypedWordValid, mHasMinimalSuggestion,
                     mIsPunctuationSuggestions, mShouldBlockAutoCorrectionBySafetyNet,
                     mSuggestedWordInfoList);
         }
 
         public int size() {
-            return mWords.size();
+            return mSuggestedWordInfoList.size();
         }
 
         public CharSequence getWord(int pos) {
-            return mWords.get(pos);
+            return mSuggestedWordInfoList.get(pos).mWord;
         }
 
         public boolean allowsToBeAutoCorrected() {
@@ -224,21 +215,24 @@
                     + " mHasMinimalSuggestion=" + mHasMinimalSuggestion
                     + " mIsPunctuationSuggestions=" + mIsPunctuationSuggestions
                     + " mShouldBlockAutoCorrectionBySafetyNet="
-                    + mShouldBlockAutoCorrectionBySafetyNet
-                    + " mWords=" + Arrays.toString(mWords.toArray());
+                    + mShouldBlockAutoCorrectionBySafetyNet;
         }
     }
 
     public static class SuggestedWordInfo {
+        private final CharSequence mWord;
         private final CharSequence mDebugString;
         private final boolean mPreviousSuggestedWord;
 
-        public SuggestedWordInfo() {
+        public SuggestedWordInfo(final CharSequence word) {
+            mWord = word;
             mDebugString = "";
             mPreviousSuggestedWord = false;
         }
 
-        public SuggestedWordInfo(CharSequence debugString, boolean previousSuggestedWord) {
+        public SuggestedWordInfo(final CharSequence word, final CharSequence debugString,
+                final boolean previousSuggestedWord) {
+            mWord = word;
             mDebugString = debugString;
             mPreviousSuggestedWord = previousSuggestedWord;
         }