Add candidates of manually picked suggestions

Change-Id: Ieed585be5f4e88509cdcc31f5d82474cb06add6a
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index 3234e24..e0de965 100755
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -83,7 +83,6 @@
     private int mDescent;
     private boolean mScrolled;
     private boolean mShowingAddToDictionary;
-    private CharSequence mWordToAddToDictionary;
     private CharSequence mAddToDictionaryHint;
 
     private int mTargetScrollX;
@@ -220,7 +219,6 @@
         }
         int x = 0;
         final int count = Math.min(mSuggestions.size(), MAX_SUGGESTIONS);
-        final int width = getWidth();
         final Rect bgPadding = mBgPadding;
         final Paint paint = mPaint;
         final int touchX = mTouchX;
@@ -325,7 +323,6 @@
     }
 
     public void showAddToDictionaryHint(CharSequence word) {
-        mWordToAddToDictionary = word;
         ArrayList<CharSequence> suggestions = new ArrayList<CharSequence>();
         suggestions.add(word);
         suggestions.add(mAddToDictionaryHint);
@@ -376,8 +373,14 @@
             mScrolled = true;
         }
     }
-    
+
+    /* package */ List<CharSequence> getSuggestions() {
+        return mSuggestions;
+    }
+
     public void clear() {
+        // Don't call mSuggestions.clear() because it's being used for logging
+        // in LatinIME.pickSuggestionManually().
         mSuggestions = EMPTY_LIST;
         mTouchX = OUT_OF_BOUNDS;
         mSelectedString = null;
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 50b1d38..46fca37 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1521,6 +1521,7 @@
 
     public void pickSuggestionManually(int index, CharSequence suggestion) {
         if (mAfterVoiceInput && mShowingVoiceSuggestions) mVoiceInput.logNBestChoose(index);
+        List<CharSequence> suggestions = mCandidateView.getSuggestions();
 
         if (mAfterVoiceInput && !mShowingVoiceSuggestions) {
             mVoiceInput.flushAllTextModificationCounters();
@@ -1554,8 +1555,8 @@
                 || isSuggestedPunctuation(suggestion.charAt(0)))) {
             // Word separators are suggested before the user inputs something.
             // So, LatinImeLogger logs "" as a user's input.
-            LatinImeLogger.logOnClickSuggestion(
-                    "", suggestion.toString(), index);
+            LatinImeLogger.logOnManualSuggestion(
+                    "", suggestion.toString(), index, suggestions);
             onKey(suggestion.charAt(0), null);
             if (ic != null) {
                 ic.endBatchEdit();
@@ -1568,8 +1569,8 @@
         if (index == 0) {
             checkAddToDictionary(suggestion, AutoDictionary.FREQUENCY_FOR_PICKED);
         }
-        LatinImeLogger.logOnClickSuggestion(
-                mComposing.toString(), suggestion.toString(), index);
+        LatinImeLogger.logOnManualSuggestion(mComposing.toString(), suggestion.toString(),
+                index, suggestions);
         TextEntryState.acceptedSuggestion(mComposing.toString(), suggestion);
         // Follow it with a space
         if (mAutoSpace) {
diff --git a/java/src/com/android/inputmethod/latin/LatinImeLogger.java b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
index 4f757d7..53b15dd 100644
--- a/java/src/com/android/inputmethod/latin/LatinImeLogger.java
+++ b/java/src/com/android/inputmethod/latin/LatinImeLogger.java
@@ -32,6 +32,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 
 public class LatinImeLogger implements SharedPreferences.OnSharedPreferenceChangeListener {
     private static final String TAG = "LatinIMELogs";
@@ -47,7 +48,7 @@
     private static final long MINIMUMSENDSIZE = 40;
     private static final char SEPARATER = ';';
     private static final char NULL_CHAR = '\uFFFC';
-    private static final int ID_CLICKSUGGESTION = 0;
+    private static final int ID_MANUALSUGGESTION = 0;
     private static final int ID_AUTOSUGGESTIONCANCELLED = 1;
     private static final int ID_AUTOSUGGESTION = 2;
     private static final int ID_INPUT_COUNT = 3;
@@ -58,7 +59,9 @@
     private static final int ID_SETTING_AUTO_COMPLETE = 8;
     private static final int ID_VERSION = 9;
     private static final int ID_EXCEPTION = 10;
-    private static final int ID_SUGGESTIONCOUNT = 11;
+    private static final int ID_MANUALSUGGESTIONCOUNT = 11;
+    private static final int ID_AUTOSUGGESTIONCANCELLEDCOUNT = 12;
+    private static final int ID_AUTOSUGGESTIONCOUNT = 13;
 
     private static final String PREF_ENABLE_LOG = "enable_logging";
     private static final String PREF_DEBUG_MODE = "debug_mode";
@@ -88,6 +91,7 @@
     private int mInputCount;
     private int mWordCount;
     private int[] mAutoSuggestCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1];
+    private int[] mManualSuggestCountPerDic = new int[Suggest.DIC_TYPE_LAST_ID + 1];
     private int mAutoCancelledCount;
     // ActualCharCount includes all characters that were completed.
     private int mActualCharCount;
@@ -126,6 +130,7 @@
         mWordCount = 0;
         mActualCharCount = 0;
         Arrays.fill(mAutoSuggestCountPerDic, 0);
+        Arrays.fill(mManualSuggestCountPerDic, 0);
         mAutoCancelledCount = 0;
         mLogBuffer = new ArrayList<LogEntry>();
         mPrivacyLogBuffer = new ArrayList<LogEntry>();
@@ -147,6 +152,7 @@
         mWordCount = 0;
         mActualCharCount = 0;
         Arrays.fill(mAutoSuggestCountPerDic, 0);
+        Arrays.fill(mManualSuggestCountPerDic, 0);
         mAutoCancelledCount = 0;
         mLogBuffer.clear();
         mPrivacyLogBuffer.clear();
@@ -191,12 +197,22 @@
         if (sLOGPRINT) {
             Log.d(TAG, "log suggest counts. (1)");
         }
-        String[] s = new String[mAutoSuggestCountPerDic.length + 1];
-        s[0] = String.valueOf(mAutoCancelledCount);
-        for (int i = 1; i < s.length; ++i) {
-            s[i] = String.valueOf(mAutoSuggestCountPerDic[i - 1]);
+        String[] s = new String[mAutoSuggestCountPerDic.length];
+        for (int i = 0; i < s.length; ++i) {
+            s[i] = String.valueOf(mAutoSuggestCountPerDic[i]);
         }
-        mLogBuffer.add(new LogEntry(time, ID_SUGGESTIONCOUNT, s));
+        mLogBuffer.add(new LogEntry(time, ID_AUTOSUGGESTIONCOUNT, s));
+
+        mLogBuffer.add(new LogEntry(time, ID_AUTOSUGGESTIONCANCELLEDCOUNT,
+                new String[] {String.valueOf(mAutoCancelledCount)}));
+        s = new String[mManualSuggestCountPerDic.length];
+        for (int i = 0; i < s.length; ++i) {
+            s[i] = String.valueOf(mManualSuggestCountPerDic[i]);
+        }
+        mLogBuffer.add(new LogEntry(time, ID_MANUALSUGGESTIONCOUNT, s));
+        Arrays.fill(mAutoSuggestCountPerDic, 0);
+        Arrays.fill(mManualSuggestCountPerDic, 0);
+        mAutoCancelledCount = 0;
     }
 
     private void addThemeIdEntry(long time) {
@@ -272,7 +288,7 @@
                 }
                 mInputCount += (Integer)data;
                 break;
-            case ID_CLICKSUGGESTION:
+            case ID_MANUALSUGGESTION:
             case ID_AUTOSUGGESTION:
                 ++mWordCount;
                 String[] dataStrings = (String[]) data;
@@ -354,7 +370,9 @@
     private void commitInternalAndStopSelf() {
         Log.e(TAG, "Exception was caused and let's die.");
         commitInternal();
-        ((LatinIME) mContext).stopSelf();
+        LatinIME ime = ((LatinIME) mContext);
+        ime.hideWindow();
+        ime.stopSelf();
     }
 
     private synchronized void sendLogToDropBox(int tag, Object s) {
@@ -416,14 +434,36 @@
     }
 
     // TODO: Handle CharSequence instead of String
-    public static void logOnClickSuggestion(String before, String after, int position) {
+    public static void logOnManualSuggestion(String before, String after, int position
+            , List<CharSequence> suggestions) {
         if (sLogEnabled) {
+            if (!sSuggestDicMap.containsKey(after)) {
+                if (DBG) {
+                    Log.e(TAG, "logOnManualSuggestion was cancelled: came from unknown source.");
+                }
+                return;
+            }
+            int dicTypeId = sSuggestDicMap.get(after);
+            sLatinImeLogger.mManualSuggestCountPerDic[dicTypeId]++;
+            sSuggestDicMap.clear();
+            if (dicTypeId != Suggest.DIC_MAIN) {
+                if (DBG) {
+                    Log.d(TAG, "logOnManualSuggestion was cancelled: didn't come from main dic.");
+                }
+                return;
+            }
             if (before.equals(after)) {
                 before = "";
                 after = "";
             }
-            String[] strings = new String[] {before, after, String.valueOf(position)};
-            sLatinImeLogger.sendLogToDropBox(ID_CLICKSUGGESTION, strings);
+            String[] strings = new String[3 + suggestions.size()];
+            strings[0] = before;
+            strings[1] = after;
+            strings[2] = String.valueOf(position);
+            for (int i = 0; i < suggestions.size(); ++i) {
+                strings[i + 3] = suggestions.get(i).toString();
+            }
+            sLatinImeLogger.sendLogToDropBox(ID_MANUALSUGGESTION, strings);
         }
     }