Merge "Add Arabic comma to phone keyboard"
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 5304d83..ae32a3c 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -155,7 +155,7 @@
 
     private UserDictionary mUserDictionary;
     private UserBigramDictionary mUserBigramDictionary;
-    private AutoDictionary mAutoDictionary;
+    private UserUnigramDictionary mUserUnigramDictionary;
 
     // TODO: Create an inner class to group options and pseudo-options to improve readability.
     // These variables are initialized according to the {@link EditorInfo#inputType}.
@@ -443,10 +443,12 @@
 
         resetContactsDictionary();
 
-        mAutoDictionary = new AutoDictionary(this, this, localeStr, Suggest.DIC_AUTO);
-        mSuggest.setAutoDictionary(mAutoDictionary);
+        mUserUnigramDictionary
+                = new UserUnigramDictionary(this, this, localeStr, Suggest.DIC_USER_UNIGRAM);
+        mSuggest.setUserUnigramDictionary(mUserUnigramDictionary);
 
-        mUserBigramDictionary = new UserBigramDictionary(this, this, localeStr, Suggest.DIC_USER);
+        mUserBigramDictionary
+                = new UserBigramDictionary(this, this, localeStr, Suggest.DIC_USER_BIGRAM);
         mSuggest.setUserBigramDictionary(mUserBigramDictionary);
 
         updateCorrectionMode();
@@ -672,7 +674,7 @@
 
         KeyboardView inputView = mKeyboardSwitcher.getKeyboardView();
         if (inputView != null) inputView.closing();
-        if (mAutoDictionary != null) mAutoDictionary.flushPendingWrites();
+        if (mUserUnigramDictionary != null) mUserUnigramDictionary.flushPendingWrites();
         if (mUserBigramDictionary != null) mUserBigramDictionary.flushPendingWrites();
     }
 
@@ -951,8 +953,8 @@
             }
             mCommittedLength = mComposingStringBuilder.length();
             TextEntryState.acceptedTyped(mComposingStringBuilder);
-            addToAutoAndUserBigramDictionaries(mComposingStringBuilder,
-                    AutoDictionary.FREQUENCY_FOR_TYPED);
+            addToUserUnigramAndBigramDictionaries(mComposingStringBuilder,
+                    UserUnigramDictionary.FREQUENCY_FOR_TYPED);
         }
         updateSuggestions();
     }
@@ -1557,8 +1559,9 @@
             TextEntryState.acceptedDefault(mWordComposer.getTypedWord(), mBestWord, separatorCode);
             mExpectingUpdateSelection = true;
             commitBestWord(mBestWord);
-            // Add the word to the auto dictionary if it's not a known word
-            addToAutoAndUserBigramDictionaries(mBestWord, AutoDictionary.FREQUENCY_FOR_TYPED);
+            // Add the word to the user unigram dictionary if it's not a known word
+            addToUserUnigramAndBigramDictionaries(mBestWord,
+                    UserUnigramDictionary.FREQUENCY_FOR_TYPED);
             return true;
         }
         return false;
@@ -1627,7 +1630,8 @@
         commitBestWord(suggestion);
         // Add the word to the auto dictionary if it's not a known word
         if (index == 0) {
-            addToAutoAndUserBigramDictionaries(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
+            addToUserUnigramAndBigramDictionaries(suggestion,
+                    UserUnigramDictionary.FREQUENCY_FOR_PICKED);
         } else {
             addToOnlyBigramDictionary(suggestion, 1);
         }
@@ -1725,7 +1729,8 @@
         setSuggestionStripShown(isCandidateStripVisible());
     }
 
-    private void addToAutoAndUserBigramDictionaries(CharSequence suggestion, int frequencyDelta) {
+    private void addToUserUnigramAndBigramDictionaries(CharSequence suggestion,
+            int frequencyDelta) {
         checkAddToDictionary(suggestion, frequencyDelta, false);
     }
 
@@ -1734,7 +1739,7 @@
     }
 
     /**
-     * Adds to the UserBigramDictionary and/or AutoDictionary
+     * Adds to the UserBigramDictionary and/or UserUnigramDictionary
      * @param selectedANotTypedWord true if it should be added to bigram dictionary if possible
      */
     private void checkAddToDictionary(CharSequence suggestion, int frequencyDelta,
@@ -1749,14 +1754,14 @@
             return;
         }
 
-        final boolean selectedATypedWordAndItsInAutoDic =
-                !selectedANotTypedWord && mAutoDictionary.isValidWord(suggestion);
+        final boolean selectedATypedWordAndItsInUserUnigramDic =
+                !selectedANotTypedWord && mUserUnigramDictionary.isValidWord(suggestion);
         final boolean isValidWord = AutoCorrection.isValidWord(
                 mSuggest.getUnigramDictionaries(), suggestion, true);
-        final boolean needsToAddToAutoDictionary = selectedATypedWordAndItsInAutoDic
+        final boolean needsToAddToUserUnigramDictionary = selectedATypedWordAndItsInUserUnigramDic
                 || !isValidWord;
-        if (needsToAddToAutoDictionary) {
-            mAutoDictionary.addWord(suggestion.toString(), frequencyDelta);
+        if (needsToAddToUserUnigramDictionary) {
+            mUserUnigramDictionary.addWord(suggestion.toString(), frequencyDelta);
         }
 
         if (mUserBigramDictionary != null) {
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index eb5ed5a..8ae653f 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -60,18 +60,24 @@
      */
     public static final int MAXIMUM_BIGRAM_FREQUENCY = 127;
 
+    // It seems the following values are only used for logging.
     public static final int DIC_USER_TYPED = 0;
     public static final int DIC_MAIN = 1;
     public static final int DIC_USER = 2;
-    public static final int DIC_AUTO = 3;
+    public static final int DIC_USER_UNIGRAM = 3;
     public static final int DIC_CONTACTS = 4;
+    public static final int DIC_USER_BIGRAM = 5;
     // If you add a type of dictionary, increment DIC_TYPE_LAST_ID
-    public static final int DIC_TYPE_LAST_ID = 4;
+    // TODO: this value seems unused. Remove it?
+    public static final int DIC_TYPE_LAST_ID = 5;
 
     public static final String DICT_KEY_MAIN = "main";
     public static final String DICT_KEY_CONTACTS = "contacts";
-    public static final String DICT_KEY_AUTO = "auto";
+    // User dictionary, the system-managed one.
     public static final String DICT_KEY_USER = "user";
+    // User unigram dictionary, internal to LatinIME
+    public static final String DICT_KEY_USER_UNIGRAM = "user_unigram";
+    // User bigram dictionary, internal to LatinIME
     public static final String DICT_KEY_USER_BIGRAM = "user_bigram";
     public static final String DICT_KEY_WHITELIST ="whitelist";
 
@@ -177,7 +183,7 @@
 
     /**
      * Sets an optional user dictionary resource to be loaded. The user dictionary is consulted
-     * before the main dictionary, if set.
+     * before the main dictionary, if set. This refers to the system-managed user dictionary.
      */
     public void setUserDictionary(Dictionary userDictionary) {
         addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_USER, userDictionary);
@@ -193,8 +199,8 @@
         addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_CONTACTS, contactsDictionary);
     }
 
-    public void setAutoDictionary(Dictionary autoDictionary) {
-        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_AUTO, autoDictionary);
+    public void setUserUnigramDictionary(Dictionary userUnigramDictionary) {
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_USER_UNIGRAM, userUnigramDictionary);
     }
 
     public void setUserBigramDictionary(Dictionary userBigramDictionary) {
@@ -335,8 +341,8 @@
         } else if (wordComposer.size() > 1) {
             // At second character typed, search the unigrams (scores being affected by bigrams)
             for (final String key : mUnigramDictionaries.keySet()) {
-                // Skip AutoDictionary and WhitelistDictionary to lookup
-                if (key.equals(DICT_KEY_AUTO) || key.equals(DICT_KEY_WHITELIST))
+                // Skip UserUnigramDictionary and WhitelistDictionary to lookup
+                if (key.equals(DICT_KEY_USER_UNIGRAM) || key.equals(DICT_KEY_WHITELIST))
                     continue;
                 final Dictionary dictionary = mUnigramDictionaries.get(key);
                 dictionary.getWords(wordComposer, this);
diff --git a/java/src/com/android/inputmethod/latin/AutoDictionary.java b/java/src/com/android/inputmethod/latin/UserUnigramDictionary.java
similarity index 88%
rename from java/src/com/android/inputmethod/latin/AutoDictionary.java
rename to java/src/com/android/inputmethod/latin/UserUnigramDictionary.java
index 460930f..382d640 100644
--- a/java/src/com/android/inputmethod/latin/AutoDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserUnigramDictionary.java
@@ -31,12 +31,11 @@
 import java.util.Set;
 
 /**
- * Stores new words temporarily until they are promoted to the user dictionary
- * for longevity. Words in the auto dictionary are used to determine if it's ok
- * to accept a word that's not in the main or user dictionary. Using a new word
- * repeatedly will promote it to the user dictionary.
+ * This class (inherited from the old AutoDictionary) is used for user history
+ * based dictionary. It stores words that the user typed to supply a provision
+ * for suggesting and re-ordering of candidates.
  */
-public class AutoDictionary extends ExpandableDictionary {
+public class UserUnigramDictionary extends ExpandableDictionary {
     // Weight added to a user picking a new word from the suggestion strip
     static final int FREQUENCY_FOR_PICKED = 3;
     // Weight added to a user typing a new word that doesn't get corrected (or is reverted)
@@ -45,12 +44,13 @@
     private static final int VALIDITY_THRESHOLD = 2 * FREQUENCY_FOR_PICKED;
 
     private LatinIME mIme;
-    // Locale for which this auto dictionary is storing words
+    // Locale for which this user unigram dictionary is storing words
     private String mLocale;
 
     private HashMap<String,Integer> mPendingWrites = new HashMap<String,Integer>();
     private final Object mPendingWritesLock = new Object();
 
+    // TODO: we should probably change the database name
     private static final String DATABASE_NAME = "auto_dict.db";
     private static final int DATABASE_VERSION = 1;
 
@@ -65,8 +65,8 @@
     /** Sort by descending order of frequency. */
     public static final String DEFAULT_SORT_ORDER = COLUMN_FREQUENCY + " DESC";
 
-    /** Name of the words table in the auto_dict.db */
-    private static final String AUTODICT_TABLE_NAME = "words";
+    /** Name of the words table in the database */
+    private static final String USER_UNIGRAM_DICT_TABLE_NAME = "words";
 
     private static HashMap<String, String> sDictProjectionMap;
 
@@ -80,7 +80,7 @@
 
     private static DatabaseHelper sOpenHelper = null;
 
-    public AutoDictionary(Context context, LatinIME ime, String locale, int dicTypeId) {
+    public UserUnigramDictionary(Context context, LatinIME ime, String locale, int dicTypeId) {
         super(context, dicTypeId);
         mIme = ime;
         mLocale = locale;
@@ -177,7 +177,7 @@
 
         @Override
         public void onCreate(SQLiteDatabase db) {
-            db.execSQL("CREATE TABLE " + AUTODICT_TABLE_NAME + " ("
+            db.execSQL("CREATE TABLE " + USER_UNIGRAM_DICT_TABLE_NAME + " ("
                     + COLUMN_ID + " INTEGER PRIMARY KEY,"
                     + COLUMN_WORD + " TEXT,"
                     + COLUMN_FREQUENCY + " INTEGER,"
@@ -187,16 +187,16 @@
 
         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            Log.w("AutoDictionary", "Upgrading database from version " + oldVersion + " to "
+            Log.w("UserUnigramDictionary", "Upgrading database from version " + oldVersion + " to "
                     + newVersion + ", which will destroy all old data");
-            db.execSQL("DROP TABLE IF EXISTS " + AUTODICT_TABLE_NAME);
+            db.execSQL("DROP TABLE IF EXISTS " + USER_UNIGRAM_DICT_TABLE_NAME);
             onCreate(db);
         }
     }
 
     private Cursor query(String selection, String[] selectionArgs) {
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-        qb.setTables(AUTODICT_TABLE_NAME);
+        qb.setTables(USER_UNIGRAM_DICT_TABLE_NAME);
         qb.setProjectionMap(sDictProjectionMap);
 
         // Get the database and run the query
@@ -229,10 +229,10 @@
             Set<Entry<String,Integer>> mEntries = mMap.entrySet();
             for (Entry<String,Integer> entry : mEntries) {
                 Integer freq = entry.getValue();
-                db.delete(AUTODICT_TABLE_NAME, COLUMN_WORD + "=? AND " + COLUMN_LOCALE + "=?",
-                        new String[] { entry.getKey(), mLocale });
+                db.delete(USER_UNIGRAM_DICT_TABLE_NAME, COLUMN_WORD + "=? AND " + COLUMN_LOCALE
+                        + "=?", new String[] { entry.getKey(), mLocale });
                 if (freq != null) {
-                    db.insert(AUTODICT_TABLE_NAME, null,
+                    db.insert(USER_UNIGRAM_DICT_TABLE_NAME, null,
                             getContentValues(entry.getKey(), freq, mLocale));
                 }
             }