Add shortcut when clicking QuickContact badge

Bug: 2858540
Change-Id: I67456936742926c1fb5591170aaa325fcb016e8a
diff --git a/res/layout/contact_suggestion.xml b/res/layout/contact_suggestion.xml
index 0fbd800..c4abc86 100644
--- a/res/layout/contact_suggestion.xml
+++ b/res/layout/contact_suggestion.xml
@@ -35,7 +35,7 @@
         android:layout_alignParentBottom="true"
     >
 
-        <android.widget.QuickContactBadge android:id="@+id/icon1"
+        <com.android.quicksearchbox.ui.ContactBadge android:id="@+id/icon1"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:scaleType="centerInside"
diff --git a/src/com/android/quicksearchbox/EventLogLogger.java b/src/com/android/quicksearchbox/EventLogLogger.java
index b1fc1b2..63dd976 100644
--- a/src/com/android/quicksearchbox/EventLogLogger.java
+++ b/src/com/android/quicksearchbox/EventLogLogger.java
@@ -28,9 +28,6 @@
  */
 public class EventLogLogger implements Logger {
 
-    private static final int SUGGESTION_CLICK_TYPE_LAUNCH = 0;
-    private static final int SUGGESTION_CLICK_TYPE_REFINE = 1;
-
     private static final char LIST_SEPARATOR = '|';
 
     private final Context mContext;
@@ -70,17 +67,7 @@
                 latency, currentCorpus, enabledCorpora);
     }
 
-    public void logSuggestionClick(int position,
-            SuggestionCursor suggestionCursor, Collection<Corpus> queriedCorpora) {
-        logQsbClick(position, suggestionCursor, queriedCorpora, SUGGESTION_CLICK_TYPE_LAUNCH);
-    }
-
-    public void logRefine(int position, SuggestionCursor suggestionCursor,
-            Collection<Corpus> queriedCorpora) {
-        logQsbClick(position, suggestionCursor, queriedCorpora, SUGGESTION_CLICK_TYPE_REFINE);
-    }
-
-    private void logQsbClick(int position, SuggestionCursor suggestionCursor,
+    public void logSuggestionClick(int position, SuggestionCursor suggestionCursor,
             Collection<Corpus> queriedCorpora, int clickType) {
         String suggestions = getSuggestions(suggestionCursor);
         String corpora = getCorpusLogNames(queriedCorpora);
diff --git a/src/com/android/quicksearchbox/EventLogTags.logtags b/src/com/android/quicksearchbox/EventLogTags.logtags
index 9b463dd..06ffca5 100644
--- a/src/com/android/quicksearchbox/EventLogTags.logtags
+++ b/src/com/android/quicksearchbox/EventLogTags.logtags
@@ -32,6 +32,7 @@
 # @param click_type
 #     SUGGESTION_CLICK_TYPE_LAUNCH = 0
 #     SUGGESTION_CLICK_TYPE_REFINE = 1
+#     SUGGESTION_CLICK_TYPE_QUICK_CONTACT = 2
 #
 # TODO: latency?
 71002 qsb_click (position|1),(suggestions|3),(queried_sources|3),(num_chars|1),(click_type|1)
diff --git a/src/com/android/quicksearchbox/Logger.java b/src/com/android/quicksearchbox/Logger.java
index 7427593..ac3be67 100644
--- a/src/com/android/quicksearchbox/Logger.java
+++ b/src/com/android/quicksearchbox/Logger.java
@@ -28,6 +28,10 @@
     public static final int SEARCH_METHOD_BUTTON = 0;
     public static final int SEARCH_METHOD_KEYBOARD = 1;
 
+    public static final int SUGGESTION_CLICK_TYPE_LAUNCH = 0;
+    public static final int SUGGESTION_CLICK_TYPE_REFINE = 1;
+    public static final int SUGGESTION_CLICK_TYPE_QUICK_CONTACT = 2;
+
     /**
      * Called when QSB has started.
      *
@@ -43,20 +47,10 @@
      * @param suggestionCursor all the suggestions shown in the UI.
      * @param queriedCorpora all corpora that were queried to produce the suggestions in
      *        {@code suggestionCursor}, ordered by rank.
+     * @param clickType One of the SUGGESTION_CLICK_TYPE constants.
      */
     void logSuggestionClick(int position, SuggestionCursor suggestionCursor,
-            Collection<Corpus> queriedCorpora);
-
-    /**
-     * The user clicked the query refine button.
-     *
-     * @param position 0-based position of the suggestion in the UI.
-     * @param suggestionCursor all the suggestions shown in the UI.
-     * @param queriedCorpora all corpora that were queried to produce the suggestions in
-     *        {@code suggestionCursor}, ordered by rank.
-     */
-    void logRefine(int position, SuggestionCursor suggestionCursor,
-            Collection<Corpus> queriedCorpora);
+            Collection<Corpus> queriedCorpora, int clickType);
 
     /**
      * The user launched a search.
diff --git a/src/com/android/quicksearchbox/NoLogger.java b/src/com/android/quicksearchbox/NoLogger.java
index 2347633..b6b4f7f 100644
--- a/src/com/android/quicksearchbox/NoLogger.java
+++ b/src/com/android/quicksearchbox/NoLogger.java
@@ -32,11 +32,8 @@
     }
 
     public void logSuggestionClick(int position,
-            SuggestionCursor suggestionCursor, Collection<Corpus> queriedCorpora) {
-    }
-
-    public void logRefine(int position, SuggestionCursor suggestionCursor,
-            Collection<Corpus> queriedCorpora) {
+            SuggestionCursor suggestionCursor, Collection<Corpus> queriedCorpora,
+            int clickType) {
     }
 
     public void logSearch(Corpus corpus, int startMethod, int numChars) {
diff --git a/src/com/android/quicksearchbox/SearchActivity.java b/src/com/android/quicksearchbox/SearchActivity.java
index 1bbfe34..b519f2f 100644
--- a/src/com/android/quicksearchbox/SearchActivity.java
+++ b/src/com/android/quicksearchbox/SearchActivity.java
@@ -50,7 +50,6 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Set;
 
 /**
@@ -571,7 +570,8 @@
         mTookAction = true;
 
         // Log suggestion click
-        getLogger().logSuggestionClick(position, suggestions, getCurrentIncludedCorpora());
+        getLogger().logSuggestionClick(position, suggestions, getCurrentIncludedCorpora(),
+                Logger.SUGGESTION_CLICK_TYPE_LAUNCH);
 
         // Create shortcut
         getShortcutRepository().reportClick(suggestions, position);
@@ -584,6 +584,21 @@
         return true;
     }
 
+    protected void clickedQuickContact(int position) {
+        SuggestionCursor suggestions = getCurrentSuggestions(position);
+        if (suggestions == null) return;
+
+        if (DBG) Log.d(TAG, "Used suggestion " + position);
+        mTookAction = true;
+
+        // Log suggestion click
+        getLogger().logSuggestionClick(position, suggestions, getCurrentIncludedCorpora(),
+                Logger.SUGGESTION_CLICK_TYPE_QUICK_CONTACT);
+
+        // Create shortcut
+        getShortcutRepository().reportClick(suggestions, position);
+    }
+
     protected boolean onSuggestionLongClicked(int position) {
         if (DBG) Log.d(TAG, "Long clicked on suggestion " + position);
         return false;
@@ -612,7 +627,8 @@
         }
 
         // Log refine click
-        getLogger().logRefine(position, suggestions, getCurrentIncludedCorpora());
+        getLogger().logSuggestionClick(position, suggestions, getCurrentIncludedCorpora(),
+                Logger.SUGGESTION_CLICK_TYPE_REFINE);
 
         // Put query + space in query text view
         String queryWithSpace = query + ' ';
@@ -830,6 +846,10 @@
            launchSuggestion(position);
        }
 
+       public void onSuggestionQuickContactClicked(int position) {
+           clickedQuickContact(position);
+       }
+
        public boolean onSuggestionLongClicked(int position) {
            return SearchActivity.this.onSuggestionLongClicked(position);
        }
diff --git a/src/com/android/quicksearchbox/ui/ContactBadge.java b/src/com/android/quicksearchbox/ui/ContactBadge.java
new file mode 100644
index 0000000..15b8320
--- /dev/null
+++ b/src/com/android/quicksearchbox/ui/ContactBadge.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 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.
+ */
+package com.android.quicksearchbox.ui;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.QuickContactBadge;
+
+/**
+ * A {@link QuickContactBadge} that allows setting a click listener.
+ * The base class may use {@link View#setOnClickListener} internally,
+ * so this class adds a separate click listener field.
+ */
+public class ContactBadge extends QuickContactBadge {
+
+    private View.OnClickListener mExtraOnClickListener;
+
+    public ContactBadge(Context context) {
+        super(context);
+    }
+
+    public ContactBadge(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ContactBadge(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    @Override
+    public void onClick(View v) {
+        super.onClick(v);
+        if (mExtraOnClickListener != null) {
+            mExtraOnClickListener.onClick(v);
+        }
+    }
+
+    public void setExtraOnClickListener(View.OnClickListener extraOnClickListener) {
+        mExtraOnClickListener = extraOnClickListener;
+    }
+
+}
diff --git a/src/com/android/quicksearchbox/ui/ContactSuggestionView.java b/src/com/android/quicksearchbox/ui/ContactSuggestionView.java
index e90057a..1cf8fc6 100644
--- a/src/com/android/quicksearchbox/ui/ContactSuggestionView.java
+++ b/src/com/android/quicksearchbox/ui/ContactSuggestionView.java
@@ -22,14 +22,14 @@
 import android.content.Context;
 import android.net.Uri;
 import android.util.AttributeSet;
-import android.widget.QuickContactBadge;
+import android.view.View;
 
 /**
  * View for contacts appearing in the suggestions list.
  */
 public class ContactSuggestionView extends DefaultSuggestionView {
 
-    private QuickContactBadge mQuickContact;
+    private ContactBadge mQuickContact;
 
     public ContactSuggestionView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
@@ -46,12 +46,19 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mQuickContact = (QuickContactBadge) findViewById(R.id.icon1);
+        mQuickContact = (ContactBadge) findViewById(R.id.icon1);
     }
 
     @Override
     public void bindAsSuggestion(SuggestionCursor suggestion, SuggestionClickListener onClick) {
         super.bindAsSuggestion(suggestion, onClick);
         mQuickContact.assignContactUri(Uri.parse(suggestion.getSuggestionIntentDataString()));
+        mQuickContact.setExtraOnClickListener(new ContactBadgeClickListener());
+    }
+
+    private class ContactBadgeClickListener implements View.OnClickListener {
+        public void onClick(View v) {
+            fireOnSuggestionQuickContactClicked();
+        }
     }
 }
\ No newline at end of file
diff --git a/src/com/android/quicksearchbox/ui/DefaultSuggestionView.java b/src/com/android/quicksearchbox/ui/DefaultSuggestionView.java
index 501120c..c19c042 100644
--- a/src/com/android/quicksearchbox/ui/DefaultSuggestionView.java
+++ b/src/com/android/quicksearchbox/ui/DefaultSuggestionView.java
@@ -256,6 +256,12 @@
         }
     }
 
+    protected void fireOnSuggestionQuickContactClicked() {
+        if (mClickListener != null) {
+            mClickListener.onSuggestionQuickContactClicked(mPosition);
+        }
+    }
+
     private class ClickListener implements OnClickListener {
         public void onClick(View v) {
             if (DBG) Log.d(TAG, "onItemClick(" + mPosition + ")");
diff --git a/src/com/android/quicksearchbox/ui/SuggestionClickListener.java b/src/com/android/quicksearchbox/ui/SuggestionClickListener.java
index 10fc714..9eaee0c 100644
--- a/src/com/android/quicksearchbox/ui/SuggestionClickListener.java
+++ b/src/com/android/quicksearchbox/ui/SuggestionClickListener.java
@@ -29,6 +29,13 @@
     void onSuggestionClicked(int position);
 
     /**
+     * Called when a quick contact badge in a suggestion is clicked.
+     *
+     * @param position Position of the suggestion.
+     */
+    void onSuggestionQuickContactClicked(int position);
+
+    /**
      * Called when a suggestion is long clicked.
      *
      * @param position Position of the long clicked suggestion.