ContactList.java revision 78f81825431c8c52cad57bc4a363747533a701ab
11d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickpackage com.android.mms.data; 21d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 31d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport java.util.ArrayList; 41d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport java.util.List; 51d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 61d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport android.text.TextUtils; 7d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huangimport android.util.Log; 81d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 91d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport com.android.mms.data.Contact.UpdateListener; 10d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huangimport com.android.mms.LogTag; 1178f81825431c8c52cad57bc4a363747533a701abWei Huangimport com.android.mms.ui.MessageUtils; 121d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 131d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickpublic class ContactList extends ArrayList<Contact> { 141d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick private static final long serialVersionUID = 1L; 151d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 161d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public static ContactList getByNumbers(Iterable<String> numbers, boolean canBlock) { 171d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList list = new ContactList(); 181d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (String number : numbers) { 1949eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor if (!TextUtils.isEmpty(number)) { 2049eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor list.add(Contact.get(number, canBlock)); 2149eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor } 221d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 231d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return list; 241d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 251d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 2656e77a576e452f26da6941f01746435fe4b3011bWei Huang public static ContactList getByNumbers(String semiSepNumbers, 2756e77a576e452f26da6941f01746435fe4b3011bWei Huang boolean canBlock, 2856e77a576e452f26da6941f01746435fe4b3011bWei Huang boolean replaceNumber) { 291d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList list = new ContactList(); 301d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (String number : semiSepNumbers.split(";")) { 3149eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor if (!TextUtils.isEmpty(number)) { 3256e77a576e452f26da6941f01746435fe4b3011bWei Huang Contact contact = Contact.get(number, canBlock); 3356e77a576e452f26da6941f01746435fe4b3011bWei Huang if (replaceNumber) { 3456e77a576e452f26da6941f01746435fe4b3011bWei Huang contact.setNumber(number); 3556e77a576e452f26da6941f01746435fe4b3011bWei Huang } 3656e77a576e452f26da6941f01746435fe4b3011bWei Huang list.add(contact); 3749eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor } 381d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 391d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return list; 401d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 411d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 421d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public static ContactList getByIds(String spaceSepIds, boolean canBlock) { 431d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList list = new ContactList(); 441d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (String number : RecipientIdCache.getNumbers(spaceSepIds)) { 4549eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor if (!TextUtils.isEmpty(number)) { 4649eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor list.add(Contact.get(number, canBlock)); 4749eaf0b56e323f2b9526677165443bb51b014d52Tom Taylor } 481d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 491d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return list; 501d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 511d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 521d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public int getPresenceResId() { 531d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // We only show presence for single contacts. 541d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (size() != 1) 551d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return 0; 561d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 571d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return get(0).getPresenceResId(); 581d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 591d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 601d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public void addListeners(UpdateListener l) { 611d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 621d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick c.addListener(l); 631d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 641d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 651d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 661d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public void removeListeners(UpdateListener l) { 671d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 681d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick c.removeListener(l); 691d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 701d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 711d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 721d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String formatNames(String separator) { 731d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick String[] names = new String[size()]; 741d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick int i = 0; 751d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 761d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick names[i++] = c.getName(); 771d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 781d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return TextUtils.join(separator, names); 791d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 801d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 811d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String formatNamesAndNumbers(String separator) { 821d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick String[] nans = new String[size()]; 831d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick int i = 0; 841d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 851d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick nans[i++] = c.getNameAndNumber(); 861d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 871d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return TextUtils.join(separator, nans); 881d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 891d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 901d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String serialize() { 911d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return TextUtils.join(";", getNumbers()); 921d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 931d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 941d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public boolean containsEmail() { 951d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 961d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (c.isEmail()) { 971d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return true; 981d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 991d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1001d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1011d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1021d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1031d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public String[] getNumbers() { 10478f81825431c8c52cad57bc4a363747533a701abWei Huang return getNumbers(false /* don't scrub for MMS address */); 10578f81825431c8c52cad57bc4a363747533a701abWei Huang } 10678f81825431c8c52cad57bc4a363747533a701abWei Huang 10778f81825431c8c52cad57bc4a363747533a701abWei Huang public String[] getNumbers(boolean scrubForMmsAddress) { 1081d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick List<String> numbers = new ArrayList<String>(); 1097203001c04b42ef7a32440c753faa99d5839df04Tom Taylor String number; 1101d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 1117203001c04b42ef7a32440c753faa99d5839df04Tom Taylor number = c.getNumber(); 11278f81825431c8c52cad57bc4a363747533a701abWei Huang 11378f81825431c8c52cad57bc4a363747533a701abWei Huang if (scrubForMmsAddress) { 11478f81825431c8c52cad57bc4a363747533a701abWei Huang // parse/scrub the address for valid MMS address. The returned number 11578f81825431c8c52cad57bc4a363747533a701abWei Huang // could be null if it's not a valid MMS address. We don't want to send 11678f81825431c8c52cad57bc4a363747533a701abWei Huang // a message to an invalid number, as the network may do its own stripping, 11778f81825431c8c52cad57bc4a363747533a701abWei Huang // and end up sending the message to a different number! 11878f81825431c8c52cad57bc4a363747533a701abWei Huang number = MessageUtils.parseMmsAddress(number); 11978f81825431c8c52cad57bc4a363747533a701abWei Huang } 12078f81825431c8c52cad57bc4a363747533a701abWei Huang 1217203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // Don't add duplicate numbers. This can happen if a contact name has a comma. 1227203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // Since we use a comma as a delimiter between contacts, the code will consider 1237203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // the same recipient has been added twice. The recipients UI still works correctly. 1247203001c04b42ef7a32440c753faa99d5839df04Tom Taylor // It's easiest to just make sure we only send to the same recipient once. 12578f81825431c8c52cad57bc4a363747533a701abWei Huang if (!TextUtils.isEmpty(number) && !numbers.contains(number)) { 1267203001c04b42ef7a32440c753faa99d5839df04Tom Taylor numbers.add(number); 1277203001c04b42ef7a32440c753faa99d5839df04Tom Taylor } 1281d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1291d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return numbers.toArray(new String[numbers.size()]); 1301d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1311d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1321d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick @Override 1331d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick public boolean equals(Object obj) { 1341d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick try { 1351d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick ContactList other = (ContactList)obj; 1361d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // If they're different sizes, the contact 1371d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // set is obviously different. 1381d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (size() != other.size()) { 1391d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1401d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1411d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1421d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick // Make sure all the individual contacts are the same. 1431d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick for (Contact c : this) { 1441d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick if (!other.contains(c)) { 1451d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1461d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1471d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1481d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick 1491d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return true; 1501d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } catch (ClassCastException e) { 1511d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick return false; 1521d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 1531d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick } 154d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang 155d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang private void log(String msg) { 156d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang Log.d(LogTag.TAG, "[ContactList] " + msg); 157d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang } 1581d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick} 159