summaryrefslogtreecommitdiffstats
path: root/chips/src/com/android/ex/chips
diff options
context:
space:
mode:
Diffstat (limited to 'chips/src/com/android/ex/chips')
-rw-r--r--chips/src/com/android/ex/chips/Queries.java18
-rw-r--r--chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java50
2 files changed, 56 insertions, 12 deletions
diff --git a/chips/src/com/android/ex/chips/Queries.java b/chips/src/com/android/ex/chips/Queries.java
index f44ce73..9d31aec 100644
--- a/chips/src/com/android/ex/chips/Queries.java
+++ b/chips/src/com/android/ex/chips/Queries.java
@@ -18,9 +18,9 @@ package com.android.ex.chips;
import android.content.res.Resources;
import android.net.Uri;
-import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.Contacts;
/**
* Phone and Email queries for supporting Chips UI.
@@ -68,14 +68,14 @@ import android.provider.ContactsContract.CommonDataKinds.Phone;
private final Uri mContentFilterUri;
private final Uri mContentUri;
- public static final int NAME = 0;
- public static final int DESTINATION = 1;
- public static final int DESTINATION_TYPE = 2;
- public static final int DESTINATION_LABEL = 3;
- public static final int CONTACT_ID = 4;
- public static final int DATA_ID = 5;
- public static final int PHOTO_THUMBNAIL_URI = 6;
- public static final int DISPLAY_NAME_SOURCE = 7;
+ public static final int NAME = 0; // String
+ public static final int DESTINATION = 1; // String
+ public static final int DESTINATION_TYPE = 2; // int
+ public static final int DESTINATION_LABEL = 3; // String
+ public static final int CONTACT_ID = 4; // long
+ public static final int DATA_ID = 5; // long
+ public static final int PHOTO_THUMBNAIL_URI = 6; // String
+ public static final int DISPLAY_NAME_SOURCE = 7; // int
public Query (String[] projection, Uri contentFilter, Uri content) {
mProjection = projection;
diff --git a/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java b/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java
index 9bc4645..39257fa 100644
--- a/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java
+++ b/chips/src/com/android/ex/chips/RecipientAlternatesAdapter.java
@@ -18,7 +18,7 @@ package com.android.ex.chips;
import android.content.Context;
import android.database.Cursor;
-import android.provider.ContactsContract.DisplayNameSources;
+import android.database.MatrixCursor;
import android.text.util.Rfc822Token;
import android.text.util.Rfc822Tokenizer;
import android.util.Log;
@@ -30,7 +30,9 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.android.ex.chips.Queries.Query;
+
import java.util.HashMap;
+import java.util.HashSet;
/**
* RecipientAlternatesAdapter backs the RecipientEditTextView for managing contacts
@@ -151,21 +153,63 @@ public class RecipientAlternatesAdapter extends CursorAdapter {
}
private static Cursor getCursorForConstruction(Context context, long contactId, int queryType) {
+ final Cursor cursor;
if (queryType == QUERY_TYPE_EMAIL) {
- return context.getContentResolver().query(
+ cursor = context.getContentResolver().query(
Queries.EMAIL.getContentUri(),
Queries.EMAIL.getProjection(),
Queries.EMAIL.getProjection()[Queries.Query.CONTACT_ID] + " =?", new String[] {
String.valueOf(contactId)
}, null);
} else {
- return context.getContentResolver().query(
+ cursor = context.getContentResolver().query(
Queries.PHONE.getContentUri(),
Queries.PHONE.getProjection(),
Queries.PHONE.getProjection()[Queries.Query.CONTACT_ID] + " =?", new String[] {
String.valueOf(contactId)
}, null);
}
+ return removeDuplicateDestinations(cursor);
+ }
+
+ /**
+ * @return a new cursor based on the given cursor with all duplicate destinations removed.
+ *
+ * It's only intended to use for the alternate list, so...
+ * - This method ignores all other fields and dedupe solely on the destination. Normally,
+ * if a cursor contains multiple contacts and they have the same destination, we'd still want
+ * to show both.
+ * - This method creates a MatrixCursor, so all data will be kept in memory. We wouldn't want
+ * to do this if the original cursor is large, but it's okay here because the alternate list
+ * won't be that big.
+ */
+ // Visible for testing
+ /* package */ static Cursor removeDuplicateDestinations(Cursor original) {
+ final MatrixCursor result = new MatrixCursor(
+ original.getColumnNames(), original.getCount());
+ final HashSet<String> destinationsSeen = new HashSet<String>();
+
+ original.moveToPosition(-1);
+ while (original.moveToNext()) {
+ final String destination = original.getString(Query.DESTINATION);
+ if (destinationsSeen.contains(destination)) {
+ continue;
+ }
+ destinationsSeen.add(destination);
+
+ result.addRow(new Object[] {
+ original.getString(Query.NAME),
+ original.getString(Query.DESTINATION),
+ original.getInt(Query.DESTINATION_TYPE),
+ original.getString(Query.DESTINATION_LABEL),
+ original.getLong(Query.CONTACT_ID),
+ original.getLong(Query.DATA_ID),
+ original.getString(Query.PHOTO_THUMBNAIL_URI),
+ original.getInt(Query.DISPLAY_NAME_SOURCE)
+ });
+ }
+
+ return result;
}
@Override