15f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira/* 25f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * Copyright (C) 2011 The Android Open Source Project 35f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * 45f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 55f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * you may not use this file except in compliance with the License. 65f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * You may obtain a copy of the License at 75f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * 85f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 95f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * 105f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * Unless required by applicable law or agreed to in writing, software 115f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 125f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * See the License for the specific language governing permissions and 145f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira * limitations under the License. 155f2cc770801133c2db389ebe108063427d1cf6aaMindy Pereira */ 16699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 17699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereirapackage com.android.ex.chips; 18699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 19699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereiraimport android.content.Context; 20699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereiraimport android.database.Cursor; 21f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onukiimport android.database.MatrixCursor; 2277056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereiraimport android.text.util.Rfc822Token; 2377056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereiraimport android.text.util.Rfc822Tokenizer; 244f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereiraimport android.util.Log; 25699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereiraimport android.view.LayoutInflater; 26699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereiraimport android.view.View; 27699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereiraimport android.view.ViewGroup; 28699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereiraimport android.widget.CursorAdapter; 2955bb2833b29945c08b809408ff94ddf7703e911aMindy Pereiraimport android.widget.ImageView; 30699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereiraimport android.widget.TextView; 31699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 3275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylorimport com.android.ex.chips.Queries.Query; 33f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki 34441b417f05bf807429281e6ad7cd43c9bdba87a6Mindy Pereiraimport java.util.ArrayList; 3577056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereiraimport java.util.HashMap; 36f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onukiimport java.util.HashSet; 3777056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira 3875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor/** 3975f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor * RecipientAlternatesAdapter backs the RecipientEditTextView for managing contacts 4075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor * queried by email or by phone number. 4175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor */ 42699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereirapublic class RecipientAlternatesAdapter extends CursorAdapter { 4377056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira static final int MAX_LOOKUPS = 50; 44699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira private final LayoutInflater mLayoutInflater; 45699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 46699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira private final long mCurrentId; 47699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 48156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira private int mCheckedItemPosition = -1; 49156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira 503656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira private OnCheckedItemChangedListener mCheckedItemChangedListener; 513656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira 524f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira private static final String TAG = "RecipAlternates"; 534f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira 5475f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor public static final int QUERY_TYPE_EMAIL = 0; 5575f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor public static final int QUERY_TYPE_PHONE = 1; 5675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor private Query mQuery; 5775f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor 5875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor public static HashMap<String, RecipientEntry> getMatchingRecipients(Context context, 59441b417f05bf807429281e6ad7cd43c9bdba87a6Mindy Pereira ArrayList<String> inAddresses) { 6075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor return getMatchingRecipients(context, inAddresses, QUERY_TYPE_EMAIL); 6175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } 6275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor 6377056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira /** 6477056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira * Get a HashMap of address to RecipientEntry that contains all contact 6577056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira * information for a contact with the provided address, if one exists. This 6677056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira * may block the UI, so run it in an async task. 6777056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira * 6877056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira * @param context Context. 698c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa * @param inAddresses Array of addresses on which to perform the lookup. 7077056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira * @return HashMap<String,RecipientEntry> 7177056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira */ 7277056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira public static HashMap<String, RecipientEntry> getMatchingRecipients(Context context, 73441b417f05bf807429281e6ad7cd43c9bdba87a6Mindy Pereira ArrayList<String> inAddresses, int addressType) { 7475f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor Queries.Query query; 7575f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor if (addressType == QUERY_TYPE_EMAIL) { 7675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor query = Queries.EMAIL; 7775f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } else { 7875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor query = Queries.PHONE; 7975f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } 80441b417f05bf807429281e6ad7cd43c9bdba87a6Mindy Pereira int addressesSize = Math.min(MAX_LOOKUPS, inAddresses.size()); 8177056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira String[] addresses = new String[addressesSize]; 8277056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira StringBuilder bindString = new StringBuilder(); 8377056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira // Create the "?" string and set up arguments. 8477056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira for (int i = 0; i < addressesSize; i++) { 85441b417f05bf807429281e6ad7cd43c9bdba87a6Mindy Pereira Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(inAddresses.get(i).toLowerCase()); 86441b417f05bf807429281e6ad7cd43c9bdba87a6Mindy Pereira addresses[i] = (tokens.length > 0 ? tokens[0].getAddress() : inAddresses.get(i)); 8777056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira bindString.append("?"); 8877056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira if (i < addressesSize - 1) { 8977056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira bindString.append(","); 9077056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } 9177056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } 9277056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira 934f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira if (Log.isLoggable(TAG, Log.DEBUG)) { 944f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira Log.d(TAG, "Doing reverse lookup for " + addresses.toString()); 954f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira } 964f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira 978c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa HashMap<String, RecipientEntry> recipientEntries = new HashMap<String, RecipientEntry>(); 9875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor Cursor c = context.getContentResolver().query( 99593f0b4e64753b8e8ad17fdf6dc7625819c829b8Mindy Pereira query.getContentUri(), 100593f0b4e64753b8e8ad17fdf6dc7625819c829b8Mindy Pereira query.getProjection(), 101593f0b4e64753b8e8ad17fdf6dc7625819c829b8Mindy Pereira query.getProjection()[Queries.Query.DESTINATION] + " IN (" + bindString.toString() 102593f0b4e64753b8e8ad17fdf6dc7625819c829b8Mindy Pereira + ")", addresses, null); 10375f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor 10477056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira if (c != null) { 10577056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira try { 10677056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira if (c.moveToFirst()) { 10777056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira do { 10875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor String address = c.getString(Queries.Query.DESTINATION); 10977056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira recipientEntries.put(address, RecipientEntry.constructTopLevelEntry( 11075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.NAME), 1118f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki c.getInt(Queries.Query.DISPLAY_NAME_SOURCE), 11275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.DESTINATION), 11375f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getInt(Queries.Query.DESTINATION_TYPE), 11475f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.DESTINATION_LABEL), 11575f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getLong(Queries.Query.CONTACT_ID), 11675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getLong(Queries.Query.DATA_ID), 11775f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.PHOTO_THUMBNAIL_URI))); 1184f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira if (Log.isLoggable(TAG, Log.DEBUG)) { 1194f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira Log.d(TAG, "Received reverse look up information for " + address 1204f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira + " RESULTS: " 12175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor + " NAME : " + c.getString(Queries.Query.NAME) 12275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor + " CONTACT ID : " + c.getLong(Queries.Query.CONTACT_ID) 12375f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor + " ADDRESS :" + c.getString(Queries.Query.DESTINATION)); 1244f36b72bcfe3e9f9b9d99a5872de0522f20c7a6cMindy Pereira } 12577056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } while (c.moveToNext()); 12677056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } 12777056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } finally { 12877056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira c.close(); 12977056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } 13077056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } 13177056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira return recipientEntries; 13277056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira } 13377056d7532cd26e869964a52456ef18c96f6cbd7Mindy Pereira 1343656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira public RecipientAlternatesAdapter(Context context, long contactId, long currentId, int viewId, 1353656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira OnCheckedItemChangedListener listener) { 13675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor this(context, contactId, currentId, viewId, QUERY_TYPE_EMAIL, listener); 13775f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } 13875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor 13975f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor public RecipientAlternatesAdapter(Context context, long contactId, long currentId, int viewId, 14075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor int queryMode, OnCheckedItemChangedListener listener) { 14175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor super(context, getCursorForConstruction(context, contactId, queryMode), 0); 142699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira mLayoutInflater = LayoutInflater.from(context); 143699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira mCurrentId = currentId; 1443656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira mCheckedItemChangedListener = listener; 14575f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor 14675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor if (queryMode == QUERY_TYPE_EMAIL) { 14775f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor mQuery = Queries.EMAIL; 14875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } else if (queryMode == QUERY_TYPE_PHONE) { 14975f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor mQuery = Queries.PHONE; 15075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } else { 15175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor mQuery = Queries.EMAIL; 15275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor Log.e(TAG, "Unsupported query type: " + queryMode); 15375f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } 15475f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } 15575f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor 15675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor private static Cursor getCursorForConstruction(Context context, long contactId, int queryType) { 157f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki final Cursor cursor; 15875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor if (queryType == QUERY_TYPE_EMAIL) { 159f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki cursor = context.getContentResolver().query( 16075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor Queries.EMAIL.getContentUri(), 16175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor Queries.EMAIL.getProjection(), 162e71f6dbce4fb8b28c4733d9562c4cf651b23c3ddMindy Pereira Queries.EMAIL.getProjection()[Queries.Query.CONTACT_ID] + " =?", new String[] { 16375f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor String.valueOf(contactId) 16475f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor }, null); 16575f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } else { 166f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki cursor = context.getContentResolver().query( 16775f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor Queries.PHONE.getContentUri(), 16875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor Queries.PHONE.getProjection(), 1690d17760bb685bc0d4623cbc07da17415955acdabTom Taylor Queries.PHONE.getProjection()[Queries.Query.CONTACT_ID] + " =?", new String[] { 17075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor String.valueOf(contactId) 17175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor }, null); 17275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor } 173f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki return removeDuplicateDestinations(cursor); 174f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki } 175f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki 176f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki /** 177f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * @return a new cursor based on the given cursor with all duplicate destinations removed. 178f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * 179f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * It's only intended to use for the alternate list, so... 180f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * - This method ignores all other fields and dedupe solely on the destination. Normally, 181f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * if a cursor contains multiple contacts and they have the same destination, we'd still want 182f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * to show both. 183f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * - This method creates a MatrixCursor, so all data will be kept in memory. We wouldn't want 184f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * to do this if the original cursor is large, but it's okay here because the alternate list 185f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki * won't be that big. 186f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki */ 187f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki // Visible for testing 188f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki /* package */ static Cursor removeDuplicateDestinations(Cursor original) { 189f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki final MatrixCursor result = new MatrixCursor( 190f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getColumnNames(), original.getCount()); 191f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki final HashSet<String> destinationsSeen = new HashSet<String>(); 192f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki 193f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.moveToPosition(-1); 194f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki while (original.moveToNext()) { 195f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki final String destination = original.getString(Query.DESTINATION); 196f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki if (destinationsSeen.contains(destination)) { 197f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki continue; 198f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki } 199f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki destinationsSeen.add(destination); 200f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki 201f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki result.addRow(new Object[] { 202f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getString(Query.NAME), 203f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getString(Query.DESTINATION), 204f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getInt(Query.DESTINATION_TYPE), 205f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getString(Query.DESTINATION_LABEL), 206f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getLong(Query.CONTACT_ID), 207f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getLong(Query.DATA_ID), 208f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getString(Query.PHOTO_THUMBNAIL_URI), 209f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki original.getInt(Query.DISPLAY_NAME_SOURCE) 210f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki }); 211f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki } 212f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki 213f64cbf19fb2bc09835a46472c8efd8c6c07fa5abMakoto Onuki return result; 214699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 215699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 216699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira @Override 217699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira public long getItemId(int position) { 218699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira Cursor c = getCursor(); 2190fc929e5fb977fe028d7db04a3ad57e74f42e654Mindy Pereira if (c.moveToPosition(position)) { 22075f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getLong(Queries.Query.DATA_ID); 2210fc929e5fb977fe028d7db04a3ad57e74f42e654Mindy Pereira } 2220fc929e5fb977fe028d7db04a3ad57e74f42e654Mindy Pereira return -1; 223699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 224699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 225699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira public RecipientEntry getRecipientEntry(int position) { 226699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira Cursor c = getCursor(); 227699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira c.moveToPosition(position); 22875f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor return RecipientEntry.constructTopLevelEntry( 22975f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.NAME), 2308f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki c.getInt(Queries.Query.DISPLAY_NAME_SOURCE), 23175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.DESTINATION), 23275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getInt(Queries.Query.DESTINATION_TYPE), 23375f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.DESTINATION_LABEL), 23475f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getLong(Queries.Query.CONTACT_ID), 23575f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getLong(Queries.Query.DATA_ID), 23675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor c.getString(Queries.Query.PHOTO_THUMBNAIL_URI)); 237699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 238699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 239699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira @Override 240699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira public View getView(int position, View convertView, ViewGroup parent) { 24155bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira Cursor cursor = getCursor(); 24255bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira cursor.moveToPosition(position); 243699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira if (convertView == null) { 244156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira convertView = newView(); 245156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira } 24675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor if (cursor.getLong(Queries.Query.DATA_ID) == mCurrentId) { 247156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira mCheckedItemPosition = position; 2483656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira if (mCheckedItemChangedListener != null) { 2493656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira mCheckedItemChangedListener.onCheckedItemChanged(mCheckedItemPosition); 2503656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira } 251699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 25255bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira bindView(convertView, convertView.getContext(), cursor); 253699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira return convertView; 254699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 255699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 25655bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira // TODO: this is VERY similar to the BaseRecipientAdapter. Can we combine 25755bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira // somehow? 258699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira @Override 259699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira public void bindView(View view, Context context, Cursor cursor) { 26055bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira int position = cursor.getPosition(); 26155bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira 2629160cd5d914d6975a5e72920950bd007d05aa7baDaisuke Miyakawa TextView display = (TextView) view.findViewById(android.R.id.title); 26355bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); 26455bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira RecipientEntry entry = getRecipientEntry(position); 26555bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira if (position == 0) { 26675f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor display.setText(cursor.getString(Queries.Query.NAME)); 26755bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira display.setVisibility(View.VISIBLE); 26855bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira // TODO: see if this needs to be done outside the main thread 26955bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira // as it may be too slow to get immediately. 27055bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira imageView.setImageURI(entry.getPhotoThumbnailUri()); 27155bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira imageView.setVisibility(View.VISIBLE); 27255bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira } else { 27355bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira display.setVisibility(View.GONE); 27455bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira imageView.setVisibility(View.GONE); 27555bb2833b29945c08b809408ff94ddf7703e911aMindy Pereira } 2769160cd5d914d6975a5e72920950bd007d05aa7baDaisuke Miyakawa TextView destination = (TextView) view.findViewById(android.R.id.text1); 27775f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor destination.setText(cursor.getString(Queries.Query.DESTINATION)); 2789160cd5d914d6975a5e72920950bd007d05aa7baDaisuke Miyakawa 2799160cd5d914d6975a5e72920950bd007d05aa7baDaisuke Miyakawa TextView destinationType = (TextView) view.findViewById(android.R.id.text2); 2802f5589283d93933751c20791ef42dc7eab87061aMindy Pereira if (destinationType != null) { 28175f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor destinationType.setText(mQuery.getTypeLabel(context.getResources(), 28275f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor cursor.getInt(Queries.Query.DESTINATION_TYPE), 28375f1f6994f77a6538c71df720aa2250fe71fed4bTom Taylor cursor.getString(Queries.Query.DESTINATION_LABEL)).toString().toUpperCase()); 2842f5589283d93933751c20791ef42dc7eab87061aMindy Pereira } 285699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 286699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 287699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira @Override 288699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira public View newView(Context context, Cursor cursor, ViewGroup parent) { 289156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira return newView(); 290156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira } 291156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira 292156467329e276c9bc90945bea916ce3ac4849574Mindy Pereira private View newView() { 293a11c2b0e1ea043aa4d8745285f2dcbe20448b417Mindy Pereira return mLayoutInflater.inflate(R.layout.chips_recipient_dropdown_item, null); 294699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 295699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira 2963656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira /*package*/ static interface OnCheckedItemChangedListener { 2973656f7e97c58dc8443132d2d8297629b6a04cce7Mindy Pereira public void onCheckedItemChanged(int position); 298699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira } 299699c1e37a1bf26daab34f2117a14c6e883636077Mindy Pereira} 300