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