Merge "Use long for ids"
diff --git a/src/com/android/ex/chips/BaseRecipientAdapter.java b/src/com/android/ex/chips/BaseRecipientAdapter.java
index b90bf3c..939ff3c 100644
--- a/src/com/android/ex/chips/BaseRecipientAdapter.java
+++ b/src/com/android/ex/chips/BaseRecipientAdapter.java
@@ -283,7 +283,7 @@
      * mEntries are less than mPreferredMaxResultCount, contacts in
      * mNonAggregatedEntries are also used.
      */
-    private final LinkedHashMap<Integer, List<RecipientEntry>> mEntryMap;
+    private final LinkedHashMap<Long, List<RecipientEntry>> mEntryMap;
     private final List<RecipientEntry> mNonAggregatedEntries;
     private final List<RecipientEntry> mEntries;
     private final Set<String> mExistingDestinations;
@@ -315,7 +315,7 @@
         mInflater = LayoutInflater.from(context);
         mQueryType = queryType;
         mPreferredMaxResultCount = preferredMaxResultCount;
-        mEntryMap = new LinkedHashMap<Integer, List<RecipientEntry>>();
+        mEntryMap = new LinkedHashMap<Long, List<RecipientEntry>>();
         mNonAggregatedEntries = new ArrayList<RecipientEntry>();
         mEntries = new ArrayList<RecipientEntry>();
         mExistingDestinations = new HashSet<String>();
@@ -486,20 +486,20 @@
         while (cursor.moveToNext()) {
             final String displayName;
             final String destination;
-            final int contactId;
-            final int dataId;
+            final long contactId;
+            final long dataId;
             final String thumbnailUriString;
             if (mQueryType == QUERY_TYPE_EMAIL) {
                 displayName = cursor.getString(EmailQuery.NAME);
                 destination = cursor.getString(EmailQuery.ADDRESS);
-                contactId = cursor.getInt(EmailQuery.CONTACT_ID);
-                dataId = cursor.getInt(EmailQuery.DATA_ID);
+                contactId = cursor.getLong(EmailQuery.CONTACT_ID);
+                dataId = cursor.getLong(EmailQuery.DATA_ID);
                 thumbnailUriString = cursor.getString(EmailQuery.PHOTO_THUMBNAIL_URI);
             } else if (mQueryType == QUERY_TYPE_PHONE) {
                 displayName = cursor.getString(PhoneQuery.NAME);
                 destination = cursor.getString(PhoneQuery.NUMBER);
-                contactId = cursor.getInt(PhoneQuery.CONTACT_ID);
-                dataId = cursor.getInt(PhoneQuery.DATA_ID);
+                contactId = cursor.getLong(PhoneQuery.CONTACT_ID);
+                dataId = cursor.getLong(PhoneQuery.DATA_ID);
                 thumbnailUriString = cursor.getString(PhoneQuery.PHOTO_THUMBNAIL_URI);
             } else {
                 throw new IndexOutOfBoundsException("Unexpected query type: " + mQueryType);
@@ -539,7 +539,7 @@
     private void constructEntryList() {
         mEntries.clear();
         int validEntryCount = 0;
-        for (Map.Entry<Integer, List<RecipientEntry>> mapEntry : mEntryMap.entrySet()) {
+        for (Map.Entry<Long, List<RecipientEntry>> mapEntry : mEntryMap.entrySet()) {
             final List<RecipientEntry> entryList = mapEntry.getValue();
             final int size = entryList.size();
             for (int i = 0; i < size; i++) {
diff --git a/src/com/android/ex/chips/ChipsUtil.java b/src/com/android/ex/chips/ChipsUtil.java
index b23870a..e14363b 100644
--- a/src/com/android/ex/chips/ChipsUtil.java
+++ b/src/com/android/ex/chips/ChipsUtil.java
@@ -22,10 +22,14 @@
 import android.content.Context;
 import android.net.Uri;
 import android.os.Build;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.text.TextUtils;
+import android.widget.MultiAutoCompleteTextView;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 
 public class ChipsUtil {
@@ -38,31 +42,58 @@
         return TextUtils.equals("IceCreamSandwich", Build.VERSION.RELEASE);
     }
 
+    public static boolean tryUpdateRecencyInfo(MultiAutoCompleteTextView... views) {
+        for (MultiAutoCompleteTextView view : views) {
+            if (view instanceof RecipientEditTextView) {
+                updateRecencyInfo((RecipientEditTextView)view);
+            }
+        }
+        return true;
+    }
+
     // TODO: check this works
     public static void updateRecencyInfo(RecipientEditTextView view) {
         final Context context = view.getContext();
         final ContentResolver resolver = context.getContentResolver();
         final long currentTimeMillis = System.currentTimeMillis();
 
-        final Collection<Integer> contactIds = view.getContactIds();
+        final Collection<Long> contactIds = view.getContactIds();
         if (contactIds != null) {
-            for (Integer contactId : contactIds) {
-                final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
-                final ContentValues values = new ContentValues();
-                values.put(Contacts.LAST_TIME_CONTACTED, currentTimeMillis);
-                resolver.update(uri, values, null, null);
+            StringBuilder whereBuilder = new StringBuilder();
+            ArrayList<String> whereArgs = new ArrayList<String>();
+            String[] questionMarks = new String[contactIds.size()];
+            for (Long contactId : contactIds) {
+                whereArgs.add(String.valueOf(contactId));
             }
+            Arrays.fill(questionMarks, "?");
+            whereBuilder.append(ContactsContract.Contacts._ID + " IN (").
+                    append(TextUtils.join(",", questionMarks)).
+                    append(")");
+
+            ContentValues values = new ContentValues();
+            values.put(ContactsContract.Contacts.LAST_TIME_CONTACTED,
+                    System.currentTimeMillis());
+            resolver.update(ContactsContract.Contacts.CONTENT_URI, values,
+                    whereBuilder.toString(), whereArgs.toArray(new String[0]));
         }
 
-        /* Not effective yet.
-        final Collection<Integer> dataIds = view.getDataIds();
+        final Collection<Long> dataIds = view.getDataIds();
         if (dataIds != null) {
-            for (Integer dataId : dataIds) {
-                Uri uri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
-                final ContentValues values = new ContentValues();
-                values.put("last_time_contacted", currentTimeMillis);
-                resolver.update(uri, values, null, null);
+            StringBuilder whereBuilder = new StringBuilder();
+            ArrayList<String> whereArgs = new ArrayList<String>();
+            String[] questionMarks = new String[dataIds.size()];
+            for (Long dataId : dataIds) {
+                whereArgs.add(String.valueOf(dataId));
             }
-        }*/
+            Arrays.fill(questionMarks, "?");
+            whereBuilder.append(ContactsContract.Data._ID + " IN (").
+            append(TextUtils.join(",", questionMarks)).
+            append(")");
+
+            final ContentValues values = new ContentValues();
+            values.put("last_time_contacted", currentTimeMillis);
+            resolver.update(Data.CONTENT_URI, values,
+                    whereBuilder.toString(), whereArgs.toArray(new String[0]));
+        }
     }
 }
\ No newline at end of file
diff --git a/src/com/android/ex/chips/RecipientEditTextView.java b/src/com/android/ex/chips/RecipientEditTextView.java
index f3c19d4..abc7afb 100644
--- a/src/com/android/ex/chips/RecipientEditTextView.java
+++ b/src/com/android/ex/chips/RecipientEditTextView.java
@@ -389,8 +389,8 @@
     }
 
     /** Returns a collection of contact Id for each chip inside this View. */
-    /* package */ Collection<Integer> getContactIds() {
-        final Set<Integer> result = new HashSet<Integer>();
+    /* package */ Collection<Long> getContactIds() {
+        final Set<Long> result = new HashSet<Long>();
         for (RecipientChip chip : mRecipients) {
             result.add(chip.getContactId());
         }
@@ -398,8 +398,8 @@
     }
 
     /** Returns a collection of data Id for each chip inside this View. May be null. */
-    /* package */ Collection<Integer> getDataIds() {
-        final Set<Integer> result = new HashSet<Integer>();
+    /* package */ Collection<Long> getDataIds() {
+        final Set<Long> result = new HashSet<Long>();
         for (RecipientChip chip : mRecipients) {
             result.add(chip.getDataId());
         }
@@ -424,9 +424,9 @@
 
         private int mLeft;
 
-        private final int mContactId;
+        private final long mContactId;
 
-        private final int mDataId;
+        private final long mDataId;
 
         private RecipientEntry mEntry;
 
@@ -642,11 +642,11 @@
             }
         }
 
-        public int getContactId() {
+        public long getContactId() {
             return mContactId;
         }
 
-        public int getDataId() {
+        public long getDataId() {
             return mDataId;
         }
     }
diff --git a/src/com/android/ex/chips/RecipientEntry.java b/src/com/android/ex/chips/RecipientEntry.java
index 027b2e3..d8fc9f5 100644
--- a/src/com/android/ex/chips/RecipientEntry.java
+++ b/src/com/android/ex/chips/RecipientEntry.java
@@ -47,9 +47,9 @@
     /** Destination for this contact entry. Would be an email address or a phone number. */
     private final String mDestination;
     /** ID for the person */
-    private final int mContactId;
+    private final long mContactId;
     /** ID for the destination */
-    private final int mDataId;
+    private final long mDataId;
     private final boolean mIsDivider;
 
     private final Uri mPhotoThumbnailUri;
@@ -73,7 +73,7 @@
 
 
     private RecipientEntry(
-            int entryType, String displayName, String destination, int contactId, int dataId) {
+            int entryType, String displayName, String destination, long contactId, long dataId) {
         mEntryType = entryType;
         mIsFirstLevel = false;
         mDisplayName = displayName;
@@ -86,7 +86,7 @@
     }
 
     private RecipientEntry(
-            int entryType, String displayName, String destination, int contactId, int dataId,
+            int entryType, String displayName, String destination, long contactId, long dataId,
             Uri photoThumbnailUri) {
         mEntryType = entryType;
         mIsFirstLevel = true;
@@ -109,14 +109,14 @@
     }
 
     public static RecipientEntry constructTopLevelEntry(
-            String displayName, String destination, int contactId, int dataId,
+            String displayName, String destination, long contactId, long dataId,
             Uri photoThumbnailUri) {
         return new RecipientEntry(
                 ENTRY_TYPE_PERSON, displayName, destination, contactId, dataId, photoThumbnailUri);
     }
 
     public static RecipientEntry constructTopLevelEntry(
-            String displayName, String destination, int contactId, int dataId,
+            String displayName, String destination, long contactId, long dataId,
             String thumbnailUriAsString) {
         return new RecipientEntry(
                 ENTRY_TYPE_PERSON, displayName, destination, contactId, dataId,
@@ -124,7 +124,7 @@
     }
 
     public static RecipientEntry constructSecondLevelEntry(
-            String displayName, String destination, int contactId, int dataId) {
+            String displayName, String destination, long contactId, long dataId) {
         return new RecipientEntry(
                 ENTRY_TYPE_PERSON, displayName, destination, contactId, dataId);
     }
@@ -141,11 +141,11 @@
         return mDestination;
     }
 
-    public int getContactId() {
+    public long getContactId() {
         return mContactId;
     }
 
-    public int getDataId() {
+    public long getDataId() {
         return mDataId;
     }