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