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;
22d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedyimport android.text.util.Rfc822Token;
23d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedyimport android.text.util.Rfc822Tokenizer;
2474a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
256ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa/**
266ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa * Represents one entry inside recipient auto-complete list.
276ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa */
28f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereirapublic class RecipientEntry {
297211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /* package */ static final int INVALID_CONTACT = -1;
3001382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    /**
3101382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * A GENERATED_CONTACT is one that was created based entirely on
3201382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * information passed in to the RecipientEntry from an external source
3301382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * that is not a real contact.
3401382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     */
357211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /* package */ static final int GENERATED_CONTACT = -2;
367211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa
377211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /** Used when {@link #mDestinationType} is invalid and thus shouldn't be used for display. */
388af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein    public static final int INVALID_DESTINATION_TYPE = -1;
3974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
4074a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public static final int ENTRY_TYPE_PERSON = 0;
4174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
42c0e3599d01a4bcfa900ad8dab8becc349e25ad82Mindy Pereira    public static final int ENTRY_TYPE_SIZE = 1;
4374a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
4474a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    private final int mEntryType;
456ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
466ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    /**
476ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa     * True when this entry is the first entry in a group, which should have a photo and display
486ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa     * name, while the second or later entries won't.
496ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa     */
506ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private boolean mIsFirstLevel;
516ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private final String mDisplayName;
5200adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki
536ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    /** Destination for this contact entry. Would be an email address or a phone number. */
546ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private final String mDestination;
557211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /** Type of the destination like {@link Email#TYPE_HOME} */
567211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    private final int mDestinationType;
577211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    /**
587211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa     * Label of the destination which will be used when type was {@link Email#TYPE_CUSTOM}.
597211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa     * Can be null when {@link #mDestinationType} is {@link #INVALID_DESTINATION_TYPE}.
607211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa     */
617211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    private final String mDestinationLabel;
627537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa    /** ID for the person */
63f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    private final long mContactId;
647a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    /** ID for the directory this contact came from, or <code>null</code> */
657a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    private final Long mDirectoryId;
667537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa    /** ID for the destination */
67f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    private final long mDataId;
686ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private final boolean mIsDivider;
6974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
7074a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    private final Uri mPhotoThumbnailUri;
7174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
72ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    private boolean mIsValid;
7374a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    /**
7474a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa     * This can be updated after this object being constructed, when the photo is fetched
7574a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa     * from remote directories.
7674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa     */
776ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    private byte[] mPhotoBytes;
786ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
798af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein    /** See {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} */
807a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    private final String mLookupKey;
81514f8a75f72fa2e735418ffb5d6e30aa914fbe7bScott Kennedy
828af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein    protected RecipientEntry(int entryType, String displayName, String destination,
837a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            int destinationType, String destinationLabel, long contactId, Long directoryId,
847a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            long dataId, Uri photoThumbnailUri, boolean isFirstLevel, boolean isValid,
857a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String lookupKey) {
8674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mEntryType = entryType;
876b6de6266d3bede33728cf995f1fd5c59ec5a55dMindy Pereira        mIsFirstLevel = isFirstLevel;
886ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        mDisplayName = displayName;
896ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        mDestination = destination;
907211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        mDestinationType = destinationType;
917211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        mDestinationLabel = destinationLabel;
926ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        mContactId = contactId;
937a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        mDirectoryId = directoryId;
947537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa        mDataId = dataId;
9574a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mPhotoThumbnailUri = photoThumbnailUri;
9674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mPhotoBytes = null;
976ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        mIsDivider = false;
98ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        mIsValid = isValid;
997a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        mLookupKey = lookupKey;
100ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    }
101ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp
102ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public boolean isValid() {
103ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return mIsValid;
1046ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
1056ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
106f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira    /**
10701382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * Determine if this was a RecipientEntry created from recipient info or
10801382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * an entry from contacts.
10901382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     */
11001382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    public static boolean isCreatedRecipient(long id) {
11101382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira        return id == RecipientEntry.INVALID_CONTACT || id == RecipientEntry.GENERATED_CONTACT;
11201382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    }
11301382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira
11401382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    /**
115f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     * Construct a RecipientEntry from just an address that has been entered.
116f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     * This address has not been resolved to a contact and therefore does not
117f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     * have a contact id or photo.
118f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira     */
119d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy    public static RecipientEntry constructFakeEntry(final String address, final boolean isValid) {
120d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy        final Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(address);
121b7391a61487da625f371164257afb91636326b6cTom Taylor        final String tokenizedAddress = tokens.length > 0 ? tokens[0].getAddress() : address;
122d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy
123d2240c52c38d67ee6c340d625a240ded51e2ddaeScott Kennedy        return new RecipientEntry(ENTRY_TYPE_PERSON, tokenizedAddress, tokenizedAddress,
1247a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                INVALID_DESTINATION_TYPE, null, INVALID_CONTACT, null /* directoryId */,
1257a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                INVALID_CONTACT, null, true, isValid, null /* lookupKey */);
12601382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    }
12701382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira
12801382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira    /**
1290ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor     * Construct a RecipientEntry from just a phone number.
1300ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor     */
1310ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor    public static RecipientEntry constructFakePhoneEntry(final String phoneNumber,
1320ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor            final boolean isValid) {
1330ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor        return new RecipientEntry(ENTRY_TYPE_PERSON, phoneNumber, phoneNumber,
1347a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                INVALID_DESTINATION_TYPE, null, INVALID_CONTACT, null /* directoryId */,
1357a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                INVALID_CONTACT, null, true, isValid, null /* lookupKey */);
1360ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor    }
1370ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor
1380ba9133c904b8c35af8209a54604331cd671bc1fTom Taylor    /**
13900adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki     * @return the display name for the entry.  If the display name source is larger than
14000adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki     * {@link DisplayNameSources#PHONE} we use the contact's display name, but if not,
14100adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki     * i.e. the display name came from an email address or a phone number, we don't use it
14200adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki     * to avoid confusion and just use the destination instead.
14300adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki     */
14400adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki    private static String pickDisplayName(int displayNameSource, String displayName,
14500adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki            String destination) {
14600adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki        return (displayNameSource > DisplayNameSources.PHONE) ? displayName : destination;
14700adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki    }
14800adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki
14900adb32f3cea49ec82467c0e1a9e42659b556836Makoto Onuki    /**
15001382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * Construct a RecipientEntry from just an address that has been entered
15101382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * with both an associated display name. This address has not been resolved
15201382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     * to a contact and therefore does not have a contact id or photo.
15301382d764d2cbfbb4d2c1b554fe5c1ce1575dd26Mindy Pereira     */
154ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructGeneratedEntry(String display, String address,
155ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            boolean isValid) {
156ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, display, address, INVALID_DESTINATION_TYPE,
1577a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                null, GENERATED_CONTACT, null /* directoryId */, GENERATED_CONTACT, null, true,
1587a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                isValid, null /* lookupKey */);
159f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira    }
160f621a601e1f966c89b7aadbcca384021e14d668dMindy Pereira
161ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructTopLevelEntry(String displayName, int displayNameSource,
162ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            String destination, int destinationType, String destinationLabel, long contactId,
1637a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            Long directoryId, long dataId, Uri photoThumbnailUri, boolean isValid,
1647a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String lookupKey) {
165ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource,
166ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp                displayName, destination), destination, destinationType, destinationLabel,
1677a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                contactId, directoryId, dataId, photoThumbnailUri, true, isValid, lookupKey);
16874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
16974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
170ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructTopLevelEntry(String displayName, int displayNameSource,
171ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            String destination, int destinationType, String destinationLabel, long contactId,
1727a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            Long directoryId, long dataId, String thumbnailUriAsString, boolean isValid,
1737a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String lookupKey) {
174ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource,
175ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp                displayName, destination), destination, destinationType, destinationLabel,
1767a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                contactId, directoryId, dataId, (thumbnailUriAsString != null
1778af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein                ? Uri.parse(thumbnailUriAsString) : null), true, isValid, lookupKey);
1786ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
1796ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
180ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp    public static RecipientEntry constructSecondLevelEntry(String displayName,
181ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp            int displayNameSource, String destination, int destinationType,
1827a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String destinationLabel, long contactId, Long directoryId, long dataId,
1837a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy            String thumbnailUriAsString, boolean isValid, String lookupKey) {
184ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp        return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource,
185ccb8e237ec80934d1c983bb61f66b75541786ddcmindyp                displayName, destination), destination, destinationType, destinationLabel,
1867a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                contactId, directoryId, dataId, (thumbnailUriAsString != null
1878af0d3b6f34e03c08c8e67be2190da01c59889daAndrew Sapperstein                ? Uri.parse(thumbnailUriAsString) : null), false, isValid, lookupKey);
18874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
18974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
19074a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public int getEntryType() {
19174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        return mEntryType;
1926ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
1936ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
1946ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    public String getDisplayName() {
1956ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mDisplayName;
1966ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
1976ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
1986ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    public String getDestination() {
1996ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mDestination;
2006ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2016ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
2027211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    public int getDestinationType() {
2037211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        return mDestinationType;
2047211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    }
2057211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa
2067211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    public String getDestinationLabel() {
2077211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa        return mDestinationLabel;
2087211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa    }
2097211747e51623ae1305053f533c09dd335e013a2Daisuke Miyakawa
210f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    public long getContactId() {
2116ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mContactId;
2126ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2136ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
2147a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    public Long getDirectoryId() {
2157a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        return mDirectoryId;
2167a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    }
2177a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy
218f15b448bb9fd41ec7aea7cd95104ab3d82355a06Daisuke Miyakawa    public long getDataId() {
2197537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa        return mDataId;
2207537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa    }
2217537f840506bcb642bed9dc1c2bdcf6d31c6b2a7Daisuke Miyakawa
2226ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    public boolean isFirstLevel() {
2236ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mIsFirstLevel;
2246ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2256ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
22674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public Uri getPhotoThumbnailUri() {
22774a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        return mPhotoThumbnailUri;
22874a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
22974a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
23074a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    /** This can be called outside main Looper thread. */
23174a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public synchronized void setPhotoBytes(byte[] photoBytes) {
23274a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa        mPhotoBytes = photoBytes;
23374a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    }
23474a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa
23574a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    /** This can be called outside main Looper thread. */
23674a977cbc35413866ca039d509801fe0b02e1901Daisuke Miyakawa    public synchronized byte[] getPhotoBytes() {
2376ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mPhotoBytes;
2386ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2396ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa
2406ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    public boolean isSeparator() {
2416ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa        return mIsDivider;
2426ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa    }
2436d6bd68a492fbbfca50ae4793313083105e6f270Daisuke Miyakawa
2446d6bd68a492fbbfca50ae4793313083105e6f270Daisuke Miyakawa    public boolean isSelectable() {
2456d6bd68a492fbbfca50ae4793313083105e6f270Daisuke Miyakawa        return mEntryType == ENTRY_TYPE_PERSON;
2466d6bd68a492fbbfca50ae4793313083105e6f270Daisuke Miyakawa    }
2479796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy
2487a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy    public String getLookupKey() {
2497a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy        return mLookupKey;
250514f8a75f72fa2e735418ffb5d6e30aa914fbe7bScott Kennedy    }
251514f8a75f72fa2e735418ffb5d6e30aa914fbe7bScott Kennedy
2529796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy    @Override
2539796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy    public String toString() {
2549796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy        return mDisplayName + " <" + mDestination + ">, isValid=" + mIsValid;
2559796a50bc03bcf488417dbc5a52e01bd75e3ff0eScott Kennedy    }
256cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang
257cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang    /**
258cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang     * Returns if entry represents the same person as this instance. The default implementation
259cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang     * checks whether the contact ids are the same, and subclasses may opt to override this.
260cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang     */
261cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang    public boolean isSamePerson(final RecipientEntry entry) {
262cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang        return entry != null && mContactId == entry.mContactId;
263cd980d9f73bfa02155f7bb092ae1fb212ed6e8e2Kaikai Wang    }
2646ac7d0c6f6db2f5af06f9f2c73f24760d4df7b84Daisuke Miyakawa}