Merge "Add an option to use or not the contacts dictionary."
diff --git a/java/res/layout-sw768dp/candidates.xml b/java/res/layout-sw768dp/candidates.xml
deleted file mode 100644
index 93b0304..0000000
--- a/java/res/layout-sw768dp/candidates.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/candidates_container"
-    android:orientation="horizontal"
-    android:gravity="bottom"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="@dimen/candidate_strip_minimum_height"
->
-    <!-- On tablets, the candidate strip is centered with horizontal paddings on both sides because
-         width of the landscape mode is too long for the candidate strip. This LinearLayout is
-         required to hold the paddings. -->
-    <LinearLayout
-        android:orientation="horizontal"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingRight="@dimen/candidate_strip_padding"
-        android:paddingLeft="@dimen/candidate_strip_padding"
-        style="?attr/suggestionsStripBackgroundStyle"
-    >
-        <HorizontalScrollView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:fadingEdge="horizontal"
-            android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
-            android:scrollbars="none"
-        >
-            <com.android.inputmethod.latin.CandidateView
-                android:id="@+id/candidates"
-                android:layout_width="match_parent"
-                android:layout_height="@dimen/candidate_strip_height"
-                android:gravity="center_vertical" />
-        </HorizontalScrollView>
-    </LinearLayout>
-</LinearLayout>
diff --git a/java/res/layout/candidate.xml b/java/res/layout/candidate.xml
index 8437bf9..94ae2b4 100644
--- a/java/res/layout/candidate.xml
+++ b/java/res/layout/candidate.xml
@@ -21,11 +21,7 @@
 <Button
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
-    android:layout_height="match_parent"
+    android:layout_height="wrap_content"
     android:minWidth="@dimen/candidate_min_width"
     android:textSize="@dimen/candidate_text_size"
-    android:textColor="@color/candidate_typed_word"
-    android:focusable="true"
-    android:clickable="true"
-    android:gravity="center_vertical|center_horizontal"
     style="?attr/suggestionBackgroundStyle" />
diff --git a/java/res/layout/candidates.xml b/java/res/layout/candidates.xml
deleted file mode 100644
index 2bcafc9..0000000
--- a/java/res/layout/candidates.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 2010, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/candidates_container"
-    android:orientation="horizontal"
-    android:gravity="bottom"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="@dimen/candidate_strip_minimum_height"
-    android:paddingRight="@dimen/candidate_strip_padding"
-    android:paddingLeft="@dimen/candidate_strip_padding"
->
-    <HorizontalScrollView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:fadingEdge="horizontal"
-        android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
-        android:scrollbars="none"
-        style="?attr/suggestionsStripBackgroundStyle"
-    >
-        <com.android.inputmethod.latin.CandidateView
-            android:id="@+id/candidates"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/candidate_strip_height"
-            android:gravity="center_vertical" />
-    </HorizontalScrollView>
-</LinearLayout>
diff --git a/java/res/layout/input_view.xml b/java/res/layout/input_view.xml
index c8820b0..5da1a48 100644
--- a/java/res/layout/input_view.xml
+++ b/java/res/layout/input_view.xml
@@ -25,12 +25,42 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
 >
-    <include
-        layout="@layout/candidates" />
-    <com.android.inputmethod.keyboard.LatinKeyboardView
-        android:id="@+id/latin_keyboard_view"
-        android:layout_alignParentBottom="true"
+    <!-- On tablets, the candidate strip is centered with horizontal paddings on both sides because
+         width of the landscape mode is too long for the candidate strip. This LinearLayout is
+         required to hold the paddings. -->
+    <LinearLayout
+        android:id="@+id/candidates_container"
+        android:orientation="horizontal"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:padding="0dip" />
+        style="?attr/suggestionsStripBackgroundStyle"
+    >
+        <View
+            android:layout_width="@dimen/candidate_strip_padding"
+            android:layout_height="@dimen/candidate_strip_height"
+            style="?attr/suggestionsStripBackgroundStyle" />
+        <HorizontalScrollView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:fadingEdge="horizontal"
+            android:fadingEdgeLength="@dimen/candidate_strip_fading_edge_length"
+            android:scrollbars="none"
+        >
+            <com.android.inputmethod.latin.CandidateView
+                android:id="@+id/candidates"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/candidate_strip_height"
+                android:gravity="center_vertical" />
+        </HorizontalScrollView>
+        <View
+            android:layout_width="@dimen/candidate_strip_padding"
+            android:layout_height="@dimen/candidate_strip_height"
+            style="?attr/suggestionsStripBackgroundStyle" />
+    </LinearLayout>
+
+    <com.android.inputmethod.keyboard.LatinKeyboardView
+        android:id="@+id/keyboard_view"
+        android:layout_alignParentBottom="true"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
 </LinearLayout>
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 2512118..7c68c93 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -745,8 +745,7 @@
             }
         }
 
-        mKeyboardView = (LatinKeyboardView) mCurrentInputView.findViewById(
-                R.id.latin_keyboard_view);
+        mKeyboardView = (LatinKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view);
         mKeyboardView.setOnKeyboardActionListener(mInputMethodService);
         mThemeIndex = themeIndex;
         return mCurrentInputView;
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index e5ed2da..b4f6b2c 100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -156,7 +156,7 @@
                 tv.setOnLongClickListener(this);
             mWords.add(tv);
             if (i > 0) {
-                View divider = inflater.inflate(R.layout.candidate_divider, null);
+                final View divider = inflater.inflate(R.layout.candidate_divider, null);
                 mDividers.add(divider);
             }
         }
@@ -198,7 +198,7 @@
         final int color;
         if (isAutoCorrect && mConfigCandidateHighlightFontColorEnabled) {
             color = mColorAutoCorrect;
-        } else if (isSuggestedCandidate) {
+        } else if (isSuggestedCandidate && mConfigCandidateHighlightFontColorEnabled) {
             color = mColorSuggestedCandidate;
         } else {
             color = mColorTypedWord;
@@ -349,8 +349,10 @@
 
     @Override
     public boolean onLongClick(View view) {
-        int index = (Integer) view.getTag();
-        CharSequence word = mSuggestions.getWord(index);
+        final int index = (Integer) view.getTag();
+        if (index >= mSuggestions.size())
+            return true;
+        final CharSequence word = mSuggestions.getWord(index);
         if (word.length() < 2)
             return false;
         addToDictionary(word);
@@ -359,8 +361,10 @@
 
     @Override
     public void onClick(View view) {
-        int index = (Integer) view.getTag();
-        CharSequence word = mSuggestions.getWord(index);
+        final int index = (Integer) view.getTag();
+        if (index >= mSuggestions.size())
+            return;
+        final CharSequence word = mSuggestions.getWord(index);
         if (mShowingAddToDictionary && index == 0) {
             addToDictionary(word);
         } else {
diff --git a/java/src/com/android/inputmethod/latin/ContactsDictionary.java b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
index b057cf4..66a0415 100644
--- a/java/src/com/android/inputmethod/latin/ContactsDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsDictionary.java
@@ -40,7 +40,7 @@
     /**
      * Frequency for contacts information into the dictionary
      */
-    private static final int FREQUENCY_FOR_CONTACTS = 128;
+    private static final int FREQUENCY_FOR_CONTACTS = 40;
     private static final int FREQUENCY_FOR_CONTACTS_BIGRAM = 90;
 
     private static final int INDEX_NAME = 1;
@@ -114,7 +114,7 @@
                 while (!cursor.isAfterLast()) {
                     String name = cursor.getString(INDEX_NAME);
 
-                    if (name != null) {
+                    if (name != null && -1 == name.indexOf('@')) {
                         int len = name.length();
                         String prevWord = null;
 
@@ -143,8 +143,6 @@
                                 if (wordLen < maxWordLength && wordLen > 1) {
                                     super.addWord(word, FREQUENCY_FOR_CONTACTS);
                                     if (!TextUtils.isEmpty(prevWord)) {
-                                        // TODO Do not add email address
-                                        // Not so critical
                                         super.setBigram(prevWord, word,
                                                 FREQUENCY_FOR_CONTACTS_BIGRAM);
                                     }