11d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickpackage com.android.mms.data; 21d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 31d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport java.util.ArrayList; 41d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport java.util.List; 51d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 6a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Taoimport android.net.Uri; 7a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Taoimport android.os.Parcelable; 81d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport android.text.TextUtils; 9d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huangimport android.util.Log; 101d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 111d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport com.android.mms.data.Contact.UpdateListener; 12d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huangimport com.android.mms.LogTag; 1378f81825431c8c52cad57bc4a363747533a701abWei Huangimport com.android.mms.ui.MessageUtils; 141d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 151d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickpublic class ContactList extends ArrayList<Contact> { 161d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick private static final long serialVersionUID = 1L; 171d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 181d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public static ContactList getByNumbers(Iterable<String> numbers, boolean canBlock) { 191d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList list = new ContactList(); 201d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (String number : numbers) { 2149eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor if (!TextUtils.isEmpty(number)) { 2249eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor list.add(Contact.get(number, canBlock)); 2349eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor } 241d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 251d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return list; 261d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 271d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 2856e77a576e452f26da6941f01746435fe4b3011bWei Huang public static ContactList getByNumbers(String semiSepNumbers, 2956e77a576e452f26da6941f01746435fe4b3011bWei Huang boolean canBlock, 3056e77a576e452f26da6941f01746435fe4b3011bWei Huang boolean replaceNumber) { 311d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList list = new ContactList(); 321d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (String number : semiSepNumbers.split(";")) { 3349eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor if (!TextUtils.isEmpty(number)) { 3456e77a576e452f26da6941f01746435fe4b3011bWei Huang Contact contact = Contact.get(number, canBlock); 3556e77a576e452f26da6941f01746435fe4b3011bWei Huang if (replaceNumber) { 3656e77a576e452f26da6941f01746435fe4b3011bWei Huang contact.setNumber(number); 3756e77a576e452f26da6941f01746435fe4b3011bWei Huang } 3856e77a576e452f26da6941f01746435fe4b3011bWei Huang list.add(contact); 3949eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor } 401d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 411d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return list; 421d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 431d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 44431e11d429783c07eca6e789de0518d17b42fb74Wei Huang /** 45a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao * Returns a ContactList for the corresponding recipient URIs passed in. This method will 46a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao * always block to query provider. The given URIs could be the phone data URIs or tel URI 47a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao * for the numbers don't belong to any contact. 48a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao * 49a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao * @param uris phone URI to create the ContactList 50a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao */ 51a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao public static ContactList blockingGetByUris(Parcelable[] uris) { 52a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao ContactList list = new ContactList(); 53a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao if (uris != null && uris.length > 0) { 54a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao for (Parcelable p : uris) { 55a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao Uri uri = (Uri) p; 56a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao if ("tel".equals(uri.getScheme())) { 57a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao Contact contact = Contact.get(uri.getSchemeSpecificPart(), true); 58a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao list.add(contact); 59a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao } 60a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao } 61a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao final List<Contact> contacts = Contact.getByPhoneUris(uris); 62a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao if (contacts != null) { 63a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao list.addAll(contacts); 64a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao } 65a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao } 66a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao return list; 67a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao } 68a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao 69a6dd14dc0963aa8f30e625aa88e925e3fa0744f0Bai Tao /** 70431e11d429783c07eca6e789de0518d17b42fb74Wei Huang * Returns a ContactList for the corresponding recipient ids passed in. This method will 71431e11d429783c07eca6e789de0518d17b42fb74Wei Huang * create the contact if it doesn't exist, and would inject the recipient id into the contact. 72431e11d429783c07eca6e789de0518d17b42fb74Wei Huang */ 731d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public static ContactList getByIds(String spaceSepIds, boolean canBlock) { 741d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList list = new ContactList(); 75431e11d429783c07eca6e789de0518d17b42fb74Wei Huang for (RecipientIdCache.Entry entry : RecipientIdCache.getAddresses(spaceSepIds)) { 76431e11d429783c07eca6e789de0518d17b42fb74Wei Huang if (entry != null && !TextUtils.isEmpty(entry.number)) { 77431e11d429783c07eca6e789de0518d17b42fb74Wei Huang Contact contact = Contact.get(entry.number, canBlock); 78ea5e915b6104ff0e30c313bcb5a96f838997e57bMark Wagner contact.setRecipientId(entry.id); 79431e11d429783c07eca6e789de0518d17b42fb74Wei Huang list.add(contact); 8049eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor } 811d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 821d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return list; 831d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 841d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 851d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public int getPresenceResId() { 861d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // We only show presence for single contacts. 871d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (size() != 1) 881d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return 0; 891d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 901d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return get(0).getPresenceResId(); 911d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 921d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 931d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String formatNames(String separator) { 941d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick String[] names = new String[size()]; 951d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick int i = 0; 961d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 971d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick names[i++] = c.getName(); 981d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 991d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return TextUtils.join(separator, names); 1001d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1011d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1021d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String formatNamesAndNumbers(String separator) { 1031d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick String[] nans = new String[size()]; 1041d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick int i = 0; 1051d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 1061d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick nans[i++] = c.getNameAndNumber(); 1071d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1081d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return TextUtils.join(separator, nans); 1091d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1101d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1111d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String serialize() { 1121d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return TextUtils.join(";", getNumbers()); 1131d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1141d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1151d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public boolean containsEmail() { 1161d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 1171d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (c.isEmail()) { 1181d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return true; 1191d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1201d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1211d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1221d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1231d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1241d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String[] getNumbers() { 12578f81825431c8c52cad57bc4a363747533a701abWei Huang return getNumbers(false /* don't scrub for MMS address */); 12678f81825431c8c52cad57bc4a363747533a701abWei Huang } 12778f81825431c8c52cad57bc4a363747533a701abWei Huang 12878f81825431c8c52cad57bc4a363747533a701abWei Huang public String[] getNumbers(boolean scrubForMmsAddress) { 1291d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick List<String> numbers = new ArrayList<String>(); 1307203001c04b42ef7a32440c753faa99d5839df04Tom Taylor String number; 1311d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 1327203001c04b42ef7a32440c753faa99d5839df04Tom Taylor number = c.getNumber(); 13378f81825431c8c52cad57bc4a363747533a701abWei Huang 13478f81825431c8c52cad57bc4a363747533a701abWei Huang if (scrubForMmsAddress) { 13578f81825431c8c52cad57bc4a363747533a701abWei Huang // parse/scrub the address for valid MMS address. The returned number 13678f81825431c8c52cad57bc4a363747533a701abWei Huang // could be null if it's not a valid MMS address. We don't want to send 13778f81825431c8c52cad57bc4a363747533a701abWei Huang // a message to an invalid number, as the network may do its own stripping, 13878f81825431c8c52cad57bc4a363747533a701abWei Huang // and end up sending the message to a different number! 13978f81825431c8c52cad57bc4a363747533a701abWei Huang number = MessageUtils.parseMmsAddress(number); 14078f81825431c8c52cad57bc4a363747533a701abWei Huang } 14178f81825431c8c52cad57bc4a363747533a701abWei Huang 1427203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // Don't add duplicate numbers. This can happen if a contact name has a comma. 1437203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // Since we use a comma as a delimiter between contacts, the code will consider 1447203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // the same recipient has been added twice. The recipients UI still works correctly. 1457203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // It's easiest to just make sure we only send to the same recipient once. 14678f81825431c8c52cad57bc4a363747533a701abWei Huang if (!TextUtils.isEmpty(number) && !numbers.contains(number)) { 1477203001c04b42ef7a32440c753faa99d5839df04Tom Taylor numbers.add(number); 1487203001c04b42ef7a32440c753faa99d5839df04Tom Taylor } 1491d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1501d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return numbers.toArray(new String[numbers.size()]); 1511d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1521d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1531d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick @Override 1541d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public boolean equals(Object obj) { 1551d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick try { 1561d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList other = (ContactList)obj; 1571d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // If they're different sizes, the contact 1581d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // set is obviously different. 1591d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (size() != other.size()) { 1601d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1611d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1621d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1631d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // Make sure all the individual contacts are the same. 1641d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 1651d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (!other.contains(c)) { 1661d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1671d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1681d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1691d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1701d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return true; 1711d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } catch (ClassCastException e) { 1721d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1731d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1741d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 175d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang 176d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang private void log(String msg) { 177d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang Log.d(LogTag.TAG, "[ContactList] " + msg); 178d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang } 1791d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick} 180