Updates DataUsage table on entry click

Change-Id: I0c0b5a527577cc57ff260637ab75898dee96a8e4
diff --git a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
index bdbe9ca..1a4051e 100644
--- a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
+++ b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
@@ -52,6 +52,7 @@
      */
     public static final class Entry {
 
+        private final int mViewId;
         private final Drawable mIcon;
         private final String mHeader;
         private final String mSubHeader;
@@ -61,14 +62,15 @@
         private final Intent mIntent;
         private final boolean mIsEditable;
 
-        public Entry(Drawable icon, String header, String subHeader, String text,
+        public Entry(int viewId, Drawable icon, String header, String subHeader, String text,
                 Intent intent, boolean isEditable) {
-            this(icon, header, subHeader, null, text, null, intent, isEditable);
+            this(viewId, icon, header, subHeader, null, text, null, intent, isEditable);
         }
 
-        public Entry(Drawable mainIcon, String header, String subHeader,
+        public Entry(int viewId, Drawable mainIcon, String header, String subHeader,
                 Drawable subHeaderIcon, String text, Drawable textIcon, Intent intent,
                 boolean isEditable) {
+            mViewId = viewId;
             mIcon = mainIcon;
             mHeader = header;
             mSubHeader = subHeader;
@@ -110,6 +112,10 @@
         boolean isEditable() {
             return mIsEditable;
         }
+
+        int getViewId() {
+            return mViewId;
+        }
     }
 
     public interface ExpandingEntryCardViewListener {
@@ -337,6 +343,8 @@
         View view = layoutInflater.inflate(
                 R.layout.expanding_entry_card_item, this, false);
 
+        view.setId(entry.getViewId());
+
         ImageView icon = (ImageView) view.findViewById(R.id.icon);
         if (entry.getIcon() != null) {
             icon.setImageDrawable(entry.getIcon());
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 7617128..290f399 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -28,6 +28,7 @@
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.ContentUris;
+import android.content.ContentValues;
 import android.content.Intent;
 import android.content.Loader;
 import android.content.pm.PackageManager;
@@ -63,6 +64,7 @@
 import android.provider.ContactsContract.CommonDataKinds.Website;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.DisplayNameSources;
+import android.provider.ContactsContract.DataUsageFeedback;
 import android.provider.ContactsContract.QuickContact;
 import android.provider.ContactsContract.RawContacts;
 import android.support.v7.graphics.Palette;
@@ -163,6 +165,8 @@
     private static final int REQUEST_CODE_CONTACT_EDITOR_ACTIVITY = 1;
     private static final float SYSTEM_BAR_BRIGHTNESS_FACTOR = 0.7f;
     private static final int SCRIM_COLOR = Color.argb(0xB2, 0, 0, 0);
+    private static final String SCHEME_SMSTO = "smsto";
+    private static final String MIMETYPE_SMS = "vnd.android-dir/mms-sms";
 
     /** This is the Intent action to install a shortcut in the launcher. */
     private static final String ACTION_INSTALL_SHORTCUT =
@@ -272,12 +276,40 @@
     final OnClickListener mEntryClickHandler = new OnClickListener() {
         @Override
         public void onClick(View v) {
-            Log.i(TAG, "mEntryClickHandler onClick");
-            final Object intent = v.getTag();
-            if (intent == null || !(intent instanceof Intent)) {
+            // Data Id is stored as the entry view id
+            final int dataId = v.getId();
+            Object intentObject = v.getTag();
+            if (intentObject == null || !(intentObject instanceof Intent)) {
+                Log.w(TAG, "Intent tag was not used correctly");
                 return;
             }
-            startActivity((Intent) intent);
+            final Intent intent = (Intent) intentObject;
+
+            // Default to USAGE_TYPE_CALL. Usage is summed among all types for sorting each data id
+            // so the exact usage type is not necessary in all cases
+            String usageType = DataUsageFeedback.USAGE_TYPE_CALL;
+
+            if (intent.getData().getScheme().equals(SCHEME_SMSTO) ||
+                    (intent.getType() != null && intent.getType().equals(MIMETYPE_SMS))) {
+                usageType = DataUsageFeedback.USAGE_TYPE_SHORT_TEXT;
+            }
+
+            // Data IDs start at 1 so anything less is invalid
+            if (dataId > 0) {
+                final Uri uri = DataUsageFeedback.FEEDBACK_URI.buildUpon()
+                        .appendPath(String.valueOf(dataId))
+                        .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, usageType)
+                        .build();
+                final boolean successful = getContentResolver().update(
+                        uri, new ContentValues(), null, null) > 0;
+                if (!successful) {
+                    Log.w(TAG, "DataUsageFeedback increment failed");
+                }
+            } else {
+                Log.w(TAG, "Invalid Data ID");
+            }
+
+            startActivity(intent);
         }
     };
 
@@ -781,8 +813,10 @@
                                 Uri.fromParts(CallUtil.SCHEME_SMSTO, phone.getNumber(), null));
                         smsIntent.setComponent(mSmsComponent);
                     }
+                    final int dataId = phone.getId() > Integer.MAX_VALUE ?
+                            -1 : (int) phone.getId();
                     contactCardEntries.add(topContactIndex++,
-                            new Entry(
+                            new Entry(dataId,
                                     getResources().getDrawable(R.drawable.ic_message_24dp),
                                     getResources().getString(R.string.send_message),
                                     /* subHeader = */ null,
@@ -1057,7 +1091,10 @@
             return null;
         }
 
-        return new Entry(icon, header, subHeader, subHeaderIcon, text, textIcon,
+        final int dataId = dataItem.getId() > Integer.MAX_VALUE ?
+                -1 : (int) dataItem.getId();
+
+        return new Entry(dataId, icon, header, subHeader, subHeaderIcon, text, textIcon,
                 intent, isEditable);
     }
 
@@ -1197,7 +1234,8 @@
     private List<Entry> contactInteractionsToEntries(List<ContactInteraction> interactions) {
         final List<Entry> entries = new ArrayList<>();
         for (ContactInteraction interaction : interactions) {
-            entries.add(new Entry(interaction.getIcon(this),
+            entries.add(new Entry(/* id = */ -1,
+                    interaction.getIcon(this),
                     interaction.getViewHeader(this),
                     interaction.getViewBody(this),
                     interaction.getBodyIcon(this),