16ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa/*
26ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * Copyright (C) 2011 The Android Open Source Project
36ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa *
46ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
56ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * you may not use this file except in compliance with the License.
66ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * You may obtain a copy of the License at
76ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa *
86ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
96ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa *
106ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
116ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
126ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * See the License for the specific language governing permissions and
146ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * limitations under the License.
156ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa */
166ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
176ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawapackage com.android.ex.chips;
186ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
1974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawaimport android.net.Uri;
207211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Email;
2100adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onukiimport android.provider.ContactsContract.DisplayNameSources;
22f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovicimport android.support.annotation.DrawableRes;
23d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedyimport android.text.util.Rfc822Token;
24d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedyimport android.text.util.Rfc822Tokenizer;
2574a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
266ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa/**
276ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * Represents one entry inside recipient auto-complete list.
286ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa */
29f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereirapublic class RecipientEntry {
307211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /* package */ static final int INVALID_CONTACT = -1;
3101382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    /**
3201382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * A GENERATED_CONTACT is one that was created based entirely on
3301382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * information passed in to the RecipientEntry from an external source
3401382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * that is not a real contact.
3501382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     */
367211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /* package */ static final int GENERATED_CONTACT = -2;
377211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa
387211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /** Used when {@link #mDestinationType} is invalid and thus shouldn't be used for display. */
398af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein    public static final int INVALID_DESTINATION_TYPE = -1;
4074a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
4174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public static final int ENTRY_TYPE_PERSON = 0;
4274a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
43f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    /**
44f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * Entry of this type represents the item in auto-complete that asks user to grant permissions
45f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * to the app. This permission model is introduced in M platform.
46f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     *
47f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * <p>Entries of this type should have {@link #mPermissions} set as well.
48f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     */
49f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    public static final int ENTRY_TYPE_PERMISSION_REQUEST = 1;
50f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic
51f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    public static final int ENTRY_TYPE_SIZE = 2;
5274a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
5374a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    private final int mEntryType;
546ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
556ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    /**
566ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa     * True when this entry is the first entry in a group, which should have a photo and display
576ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa     * name, while the second or later entries won't.
586ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa     */
596ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private boolean mIsFirstLevel;
606ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private final String mDisplayName;
6100adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki
626ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    /** Destination for this contact entry. Would be an email address or a phone number. */
636ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private final String mDestination;
647211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /** Type of the destination like {@link Email#TYPE_HOME} */
657211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    private final int mDestinationType;
667211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /**
677211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa     * Label of the destination which will be used when type was {@link Email#TYPE_CUSTOM}.
687211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa     * Can be null when {@link #mDestinationType} is {@link #INVALID_DESTINATION_TYPE}.
697211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa     */
707211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    private final String mDestinationLabel;
717537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa    /** ID for the person */
72f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    private final long mContactId;
737a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    /** ID for the directory this contact came from, or <code>null</code> */
747a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    private final Long mDirectoryId;
757537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa    /** ID for the destination */
76f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    private final long mDataId;
7774a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
7874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    private final Uri mPhotoThumbnailUri;
79a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha    /** Configures showing the icon in the chip */
80a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha    private final boolean mShouldDisplayIcon;
8174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
82ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    private boolean mIsValid;
8374a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    /**
8474a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa     * This can be updated after this object being constructed, when the photo is fetched
8574a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa     * from remote directories.
8674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa     */
876ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private byte[] mPhotoBytes;
886ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
89f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    @DrawableRes private int mIndicatorIconId;
9084f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    private String mIndicatorText;
9184f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker
928af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein    /** See {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} */
937a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    private final String mLookupKey;
94514f8a75f72fa2e735418ffb5d6e30aa914fbe7bScott Kennedy
95f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    /** Should be used when type is {@link #ENTRY_TYPE_PERMISSION_REQUEST}. */
96f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    private final String[] mPermissions;
97f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic
9811c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    /** Whether RecipientEntry is in a replaced chip or not. */
9911c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    private boolean mInReplacedChip;
10011c15260cb6878a67eb5d958277fce33e641720fEkin Oguz
1018af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein    protected RecipientEntry(int entryType, String displayName, String destination,
102a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha        int destinationType, String destinationLabel, long contactId, Long directoryId,
103a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha        long dataId, Uri photoThumbnailUri, boolean isFirstLevel, boolean isValid,
104a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha        String lookupKey, String[] permissions) {
105a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha        this(entryType, displayName, destination, destinationType,
106a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha            destinationLabel, contactId, directoryId, dataId, photoThumbnailUri,
107a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha            true /* shouldDisplayIcon */, isFirstLevel, isValid, lookupKey, permissions);
108a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha    }
109a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha
110a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha    protected RecipientEntry(int entryType, String displayName, String destination,
1117a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            int destinationType, String destinationLabel, long contactId, Long directoryId,
112a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha            long dataId, Uri photoThumbnailUri, boolean shouldDisplayIcon,
113a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha            boolean isFirstLevel, boolean isValid, String lookupKey, String[] permissions) {
11474a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mEntryType = entryType;
1156b6de6266d3bede33728cf995f1fd5c59ec5a55dMindy Pereira        mIsFirstLevel = isFirstLevel;
1166ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        mDisplayName = displayName;
1176ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        mDestination = destination;
1187211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        mDestinationType = destinationType;
1197211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        mDestinationLabel = destinationLabel;
1206ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        mContactId = contactId;
1217a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        mDirectoryId = directoryId;
1227537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa        mDataId = dataId;
12374a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mPhotoThumbnailUri = photoThumbnailUri;
124a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha        mShouldDisplayIcon = shouldDisplayIcon;
12574a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mPhotoBytes = null;
126ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        mIsValid = isValid;
1277a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        mLookupKey = lookupKey;
128f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic        mIndicatorIconId = 0;
12984f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker        mIndicatorText = null;
130f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic        mPermissions = permissions;
131ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    }
132ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp
133a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey    protected RecipientEntry(int entryType, String displayName, String destination,
134a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey            int destinationType, String destinationLabel, long contactId, Long directoryId,
135a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey            long dataId, Uri photoThumbnailUri, boolean isFirstLevel, boolean isValid,
136a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey            String lookupKey) {
137a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey        this(entryType, displayName, destination, destinationType, destinationLabel,
138a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey                contactId, directoryId, dataId, photoThumbnailUri, isFirstLevel, isValid,
139a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey                lookupKey, null);
140a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey    }
141a79d61da6e3f7051a4d8989a196a379c1fe45139Jeff Sharkey
142ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public boolean isValid() {
143ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return mIsValid;
1446ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
1456ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
146f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira    /**
14701382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * Determine if this was a RecipientEntry created from recipient info or
14801382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * an entry from contacts.
14901382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     */
15001382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    public static boolean isCreatedRecipient(long id) {
15101382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira        return id == RecipientEntry.INVALID_CONTACT || id == RecipientEntry.GENERATED_CONTACT;
15201382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    }
15301382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira
15401382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    /**
155f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     * Construct a RecipientEntry from just an address that has been entered.
156f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     * This address has not been resolved to a contact and therefore does not
157f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     * have a contact id or photo.
158f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     */
159d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy    public static RecipientEntry constructFakeEntry(final String address, final boolean isValid) {
160d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy        final Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(address);
161b7391a61487da625f371164257afb91636326b6cTom Taylor        final String tokenizedAddress = tokens.length > 0 ? tokens[0].getAddress() : address;
162d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy
163d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy        return new RecipientEntry(ENTRY_TYPE_PERSON, tokenizedAddress, tokenizedAddress,
1647a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                INVALID_DESTINATION_TYPE, null, INVALID_CONTACT, null /* directoryId */,
165f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                INVALID_CONTACT, null, true, isValid, null /* lookupKey */, null /* permissions */);
16601382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    }
16701382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira
16801382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    /**
1690ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor     * Construct a RecipientEntry from just a phone number.
1700ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor     */
1710ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor    public static RecipientEntry constructFakePhoneEntry(final String phoneNumber,
1720ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor            final boolean isValid) {
1730ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor        return new RecipientEntry(ENTRY_TYPE_PERSON, phoneNumber, phoneNumber,
1747a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                INVALID_DESTINATION_TYPE, null, INVALID_CONTACT, null /* directoryId */,
175f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                INVALID_CONTACT, null, true, isValid, null /* lookupKey */, null /* permissions */);
17600adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki    }
17700adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki
17800adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki    /**
17901382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * Construct a RecipientEntry from just an address that has been entered
18001382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * with both an associated display name. This address has not been resolved
18101382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * to a contact and therefore does not have a contact id or photo.
18201382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     */
183ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructGeneratedEntry(String display, String address,
184ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            boolean isValid) {
185ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, display, address, INVALID_DESTINATION_TYPE,
1867a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                null, GENERATED_CONTACT, null /* directoryId */, GENERATED_CONTACT, null, true,
187f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                isValid, null /* lookupKey */, null /* permissions */);
188f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira    }
189f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira
190ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructTopLevelEntry(String displayName, int displayNameSource,
191ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            String destination, int destinationType, String destinationLabel, long contactId,
1927a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            Long directoryId, long dataId, Uri photoThumbnailUri, boolean isValid,
1937a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String lookupKey) {
194ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource,
195ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp                displayName, destination), destination, destinationType, destinationLabel,
196f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                contactId, directoryId, dataId, photoThumbnailUri, true, isValid, lookupKey,
197f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                null /* permissions */);
19874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
19974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
200ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructTopLevelEntry(String displayName, int displayNameSource,
201ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            String destination, int destinationType, String destinationLabel, long contactId,
2027a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            Long directoryId, long dataId, String thumbnailUriAsString, boolean isValid,
2037a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String lookupKey) {
204ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource,
205ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp                displayName, destination), destination, destinationType, destinationLabel,
2067a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                contactId, directoryId, dataId, (thumbnailUriAsString != null
207f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                ? Uri.parse(thumbnailUriAsString) : null), true, isValid, lookupKey,
208f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                null /* permissions */);
2096ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2106ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
211ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructSecondLevelEntry(String displayName,
212ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            int displayNameSource, String destination, int destinationType,
2137a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String destinationLabel, long contactId, Long directoryId, long dataId,
2147a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String thumbnailUriAsString, boolean isValid, String lookupKey) {
215ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource,
216ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp                displayName, destination), destination, destinationType, destinationLabel,
2177a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                contactId, directoryId, dataId, (thumbnailUriAsString != null
218f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                ? Uri.parse(thumbnailUriAsString) : null), false, isValid, lookupKey,
219f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                null /* permissions */);
220f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    }
221f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic
222626f8cd53e91d43e98a4fe37ceedd43e1a5829b5Shri Borde    public static RecipientEntry constructPermissionEntry(String[] permissions) {
223f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic        return new RecipientEntry(
224f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                ENTRY_TYPE_PERMISSION_REQUEST,
225f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                "" /* displayName */,
226f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                "" /* destination */,
227f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                Email.TYPE_CUSTOM,
228f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                "" /* destinationLabel */,
229f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                INVALID_CONTACT,
230f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                null /* directoryId */,
231f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                INVALID_CONTACT,
232f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                null /* photoThumbnailUri */,
233f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                true /* isFirstLevel*/,
234f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                false /* isValid */,
235f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic                null /* lookupKey */,
236626f8cd53e91d43e98a4fe37ceedd43e1a5829b5Shri Borde                permissions);
237f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    }
238f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic
239f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    /**
240f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * @return the display name for the entry.  If the display name source is larger than
241f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * {@link DisplayNameSources#PHONE} we use the contact's display name, but if not,
242f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * i.e. the display name came from an email address or a phone number, we don't use it
243f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * to avoid confusion and just use the destination instead.
244f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     */
245f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    private static String pickDisplayName(int displayNameSource, String displayName,
246f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic            String destination) {
247f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic        return (displayNameSource > DisplayNameSources.PHONE) ? displayName : destination;
24874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
24974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
25074a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public int getEntryType() {
25174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        return mEntryType;
2526ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2536ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
2546ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    public String getDisplayName() {
2556ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mDisplayName;
2566ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2576ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
2586ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    public String getDestination() {
2596ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mDestination;
2606ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2616ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
2627211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    public int getDestinationType() {
2637211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        return mDestinationType;
2647211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    }
2657211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa
2667211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    public String getDestinationLabel() {
2677211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        return mDestinationLabel;
2687211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    }
2697211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa
270f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    public long getContactId() {
2716ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mContactId;
2726ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2736ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
2747a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    public Long getDirectoryId() {
2757a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        return mDirectoryId;
2767a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    }
2777a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy
278f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    public long getDataId() {
2797537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa        return mDataId;
2807537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa    }
2817537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa
2826ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    public boolean isFirstLevel() {
2836ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mIsFirstLevel;
2846ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2856ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
28674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public Uri getPhotoThumbnailUri() {
28774a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        return mPhotoThumbnailUri;
28874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
28974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
290a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha    /** Indicates whether the icon in the chip is displayed or not. */
291a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha    public boolean shouldDisplayIcon() {
292a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha        return mShouldDisplayIcon;
293a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha    }
294a233af88e381e4a8caf917176974aeb0aa259c19Sandeep Siddhartha
29574a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    /** This can be called outside main Looper thread. */
29674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public synchronized void setPhotoBytes(byte[] photoBytes) {
29774a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mPhotoBytes = photoBytes;
29874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
29974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
30074a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    /** This can be called outside main Looper thread. */
30174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public synchronized byte[] getPhotoBytes() {
3026ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mPhotoBytes;
3036ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
3046ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
305f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    /**
306f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * Used together with {@link #ENTRY_TYPE_PERMISSION_REQUEST} and indicates what permissions we
307f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * need to ask user to grant.
308f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     */
309f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    public String[] getPermissions() {
310f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic        return mPermissions;
3116d6bd68a492fbbfca50ae4793313083105e6f270Daisuke Miyakawa    }
3129796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy
3137a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    public String getLookupKey() {
3147a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        return mLookupKey;
315514f8a75f72fa2e735418ffb5d6e30aa914fbe7bScott Kennedy    }
316514f8a75f72fa2e735418ffb5d6e30aa914fbe7bScott Kennedy
317f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    public boolean isSelectable() {
318f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic        return mEntryType == ENTRY_TYPE_PERSON || mEntryType == ENTRY_TYPE_PERMISSION_REQUEST;
319f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    }
320f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic
3219796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy    @Override
3229796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy    public String toString() {
3239796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy        return mDisplayName + " <" + mDestination + ">, isValid=" + mIsValid;
3249796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy    }
325cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang
326cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang    /**
327cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang     * Returns if entry represents the same person as this instance. The default implementation
328cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang     * checks whether the contact ids are the same, and subclasses may opt to override this.
329cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang     */
330cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang    public boolean isSamePerson(final RecipientEntry entry) {
331cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang        return entry != null && mContactId == entry.mContactId;
332cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang    }
33384f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker
33484f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    /**
335f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * Returns the resource ID for the indicator icon, or 0 if no icon should be displayed.
33684f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker     */
337f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    @DrawableRes
33884f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    public int getIndicatorIconId() {
33984f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker        return mIndicatorIconId;
34084f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    }
34184f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker
34284f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    /**
343f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic     * Sets the indicator icon to the given resource ID.  Set to 0 to display no icon.
34484f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker     */
345f1ad4f6dba7c6ea28f529736b8662faa6fb498f8Milos Stankovic    public void setIndicatorIconId(@DrawableRes int indicatorIconId) {
34684f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker        mIndicatorIconId = indicatorIconId;
34784f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    }
34884f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker
34984f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    /**
35084f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker     * Get the indicator text, or null if no text should be displayed.
35184f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker     */
35284f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    public String getIndicatorText() {
35384f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker        return mIndicatorText;
35484f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    }
35584f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker
35684f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    /**
35784f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker     * Set the indicator text.  Set to null for no text to be displayed.
35884f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker     */
35984f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    public void setIndicatorText(String indicatorText) {
36084f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker        mIndicatorText = indicatorText;
36184f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker    }
36211c15260cb6878a67eb5d958277fce33e641720fEkin Oguz
36311c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    /**
36411c15260cb6878a67eb5d958277fce33e641720fEkin Oguz     * Get whether this RecipientEntry is in a replaced chip or not. Replaced chip only occurs
36511c15260cb6878a67eb5d958277fce33e641720fEkin Oguz     * if {@link RecipientEditTextView} uses a replacement chip for the entry.
36611c15260cb6878a67eb5d958277fce33e641720fEkin Oguz     */
36711c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    public boolean getInReplacedChip() {
36811c15260cb6878a67eb5d958277fce33e641720fEkin Oguz        return mInReplacedChip;
36911c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    }
37011c15260cb6878a67eb5d958277fce33e641720fEkin Oguz
37111c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    /**
37211c15260cb6878a67eb5d958277fce33e641720fEkin Oguz     * Sets {@link #mInReplacedChip} to {@param inReplacedChip}.
37311c15260cb6878a67eb5d958277fce33e641720fEkin Oguz     */
37411c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    public void setInReplacedChip(boolean inReplacedChip) {
37511c15260cb6878a67eb5d958277fce33e641720fEkin Oguz        mInReplacedChip = inReplacedChip;
37611c15260cb6878a67eb5d958277fce33e641720fEkin Oguz    }
37784f848c6601f1759689c5318e8d01924ce2f0b2bBraden Walker}
378