141caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa/* 241caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * Copyright (C) 2011 The Android Open Source Project 341caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * 441caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); 541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * you may not use this file except in compliance with the License. 641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * You may obtain a copy of the License at 741caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * 841caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0 941caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * 1041caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software 1141caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, 1241caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1341caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * See the License for the specific language governing permissions and 1441caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * limitations under the License. 1541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa */ 1641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 1741caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawapackage com.android.ex.chips; 1841caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 1924a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawaimport android.net.Uri; 208c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Email; 218f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onukiimport android.provider.ContactsContract.DisplayNameSources; 22403e0d211ded97679e8c983481f9972f0a4b22c0Scott Kennedyimport android.text.util.Rfc822Token; 23403e0d211ded97679e8c983481f9972f0a4b22c0Scott Kennedyimport android.text.util.Rfc822Tokenizer; 2424a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 2541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa/** 2641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * Represents one entry inside recipient auto-complete list. 2741caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa */ 28f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereirapublic class RecipientEntry { 298c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa /* package */ static final int INVALID_CONTACT = -1; 301174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira /** 311174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * A GENERATED_CONTACT is one that was created based entirely on 321174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * information passed in to the RecipientEntry from an external source 331174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * that is not a real contact. 341174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira */ 358c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa /* package */ static final int GENERATED_CONTACT = -2; 368c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa 378c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa /** Used when {@link #mDestinationType} is invalid and thus shouldn't be used for display. */ 388c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa /* package */ static final int INVALID_DESTINATION_TYPE = -1; 3924a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 4024a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa public static final int ENTRY_TYPE_PERSON = 0; 4124a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 421e9e640680692868c1323422f248261c4ff4d259Mindy Pereira public static final int ENTRY_TYPE_SIZE = 1; 4324a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 4424a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa private final int mEntryType; 4541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 4641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa /** 4741caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * True when this entry is the first entry in a group, which should have a photo and display 4841caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa * name, while the second or later entries won't. 4941caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa */ 5041caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa private boolean mIsFirstLevel; 5141caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa private final String mDisplayName; 528f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki 5341caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa /** Destination for this contact entry. Would be an email address or a phone number. */ 5441caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa private final String mDestination; 558c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa /** Type of the destination like {@link Email#TYPE_HOME} */ 568c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa private final int mDestinationType; 578c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa /** 588c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa * Label of the destination which will be used when type was {@link Email#TYPE_CUSTOM}. 598c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa * Can be null when {@link #mDestinationType} is {@link #INVALID_DESTINATION_TYPE}. 608c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa */ 618c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa private final String mDestinationLabel; 62b5ebb8916a1bb178062a0ccb59e80de27ec1bb2dDaisuke Miyakawa /** ID for the person */ 6365b8c0327b00beda9309c7b7c116013d03b06d90Daisuke Miyakawa private final long mContactId; 64b5ebb8916a1bb178062a0ccb59e80de27ec1bb2dDaisuke Miyakawa /** ID for the destination */ 6565b8c0327b00beda9309c7b7c116013d03b06d90Daisuke Miyakawa private final long mDataId; 6641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa private final boolean mIsDivider; 6724a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 6824a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa private final Uri mPhotoThumbnailUri; 6924a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 70fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp private boolean mIsValid; 7124a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa /** 7224a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa * This can be updated after this object being constructed, when the photo is fetched 7324a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa * from remote directories. 7424a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa */ 7541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa private byte[] mPhotoBytes; 7641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 773e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy private final boolean mIsGalContact; 783e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy 79fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp private RecipientEntry(int entryType, String displayName, String destination, 80fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp int destinationType, String destinationLabel, long contactId, long dataId, 813e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy Uri photoThumbnailUri, boolean isFirstLevel, boolean isValid, boolean isGalContact) { 8224a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa mEntryType = entryType; 8390081ee88c7eb216ea22f426aa6856e310a867e1Mindy Pereira mIsFirstLevel = isFirstLevel; 8441caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa mDisplayName = displayName; 8541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa mDestination = destination; 868c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa mDestinationType = destinationType; 878c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa mDestinationLabel = destinationLabel; 8841caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa mContactId = contactId; 89b5ebb8916a1bb178062a0ccb59e80de27ec1bb2dDaisuke Miyakawa mDataId = dataId; 9024a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa mPhotoThumbnailUri = photoThumbnailUri; 9124a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa mPhotoBytes = null; 9241caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa mIsDivider = false; 93fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp mIsValid = isValid; 943e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy mIsGalContact = isGalContact; 95fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp } 96fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp 97fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp public boolean isValid() { 98fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp return mIsValid; 9941caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 10041caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 101f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereira /** 1021174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * Determine if this was a RecipientEntry created from recipient info or 1031174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * an entry from contacts. 1041174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira */ 1051174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira public static boolean isCreatedRecipient(long id) { 1061174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira return id == RecipientEntry.INVALID_CONTACT || id == RecipientEntry.GENERATED_CONTACT; 1071174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira } 1081174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira 1091174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira /** 110f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereira * Construct a RecipientEntry from just an address that has been entered. 111f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereira * This address has not been resolved to a contact and therefore does not 112f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereira * have a contact id or photo. 113f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereira */ 114403e0d211ded97679e8c983481f9972f0a4b22c0Scott Kennedy public static RecipientEntry constructFakeEntry(final String address, final boolean isValid) { 115403e0d211ded97679e8c983481f9972f0a4b22c0Scott Kennedy final Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(address); 1160ee09dfc02251a6932c3787400ce6e188e72ca23Tom Taylor final String tokenizedAddress = tokens.length > 0 ? tokens[0].getAddress() : address; 117403e0d211ded97679e8c983481f9972f0a4b22c0Scott Kennedy 118403e0d211ded97679e8c983481f9972f0a4b22c0Scott Kennedy return new RecipientEntry(ENTRY_TYPE_PERSON, tokenizedAddress, tokenizedAddress, 1198c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa INVALID_DESTINATION_TYPE, null, 1203e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy INVALID_CONTACT, INVALID_CONTACT, null, true, isValid, false /* isGalContact */); 1211174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira } 1221174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira 1231174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira /** 1246413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor * Construct a RecipientEntry from just a phone number. 1256413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor */ 1266413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor public static RecipientEntry constructFakePhoneEntry(final String phoneNumber, 1276413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor final boolean isValid) { 1286413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor return new RecipientEntry(ENTRY_TYPE_PERSON, phoneNumber, phoneNumber, 1296413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor INVALID_DESTINATION_TYPE, null, 1303e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy INVALID_CONTACT, INVALID_CONTACT, null, true, isValid, false /* isGalContact */); 1316413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor } 1326413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor 1336413ac6689b3d33cf2e42715575d3119d2c90f00Tom Taylor /** 1348f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki * @return the display name for the entry. If the display name source is larger than 1358f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki * {@link DisplayNameSources#PHONE} we use the contact's display name, but if not, 1368f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki * i.e. the display name came from an email address or a phone number, we don't use it 1378f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki * to avoid confusion and just use the destination instead. 1388f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki */ 1398f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki private static String pickDisplayName(int displayNameSource, String displayName, 1408f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki String destination) { 1418f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki return (displayNameSource > DisplayNameSources.PHONE) ? displayName : destination; 1428f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki } 1438f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki 1448f968fc75a99645b5b170c3ca0bd3aca9a207ca7Makoto Onuki /** 1451174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * Construct a RecipientEntry from just an address that has been entered 1461174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * with both an associated display name. This address has not been resolved 1471174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira * to a contact and therefore does not have a contact id or photo. 1481174eca98d1dbd263a9e72c5a9e35a1039aae979Mindy Pereira */ 149fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp public static RecipientEntry constructGeneratedEntry(String display, String address, 150fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp boolean isValid) { 151fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp return new RecipientEntry(ENTRY_TYPE_PERSON, display, address, INVALID_DESTINATION_TYPE, 1523e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy null, GENERATED_CONTACT, GENERATED_CONTACT, null, true, isValid, 1533e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy false /* isGalContact */); 154f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereira } 155f566dee91901e44db63df3bf393afb1d43a36f78Mindy Pereira 156fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp public static RecipientEntry constructTopLevelEntry(String displayName, int displayNameSource, 157fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp String destination, int destinationType, String destinationLabel, long contactId, 1583e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy long dataId, Uri photoThumbnailUri, boolean isValid, boolean isGalContact) { 159fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource, 160fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp displayName, destination), destination, destinationType, destinationLabel, 1613e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy contactId, dataId, photoThumbnailUri, true, isValid, isGalContact); 16224a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa } 16324a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 164fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp public static RecipientEntry constructTopLevelEntry(String displayName, int displayNameSource, 165fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp String destination, int destinationType, String destinationLabel, long contactId, 1663e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy long dataId, String thumbnailUriAsString, boolean isValid, boolean isGalContact) { 167fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource, 168fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp displayName, destination), destination, destinationType, destinationLabel, 169fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp contactId, dataId, (thumbnailUriAsString != null ? Uri.parse(thumbnailUriAsString) 1703e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy : null), true, isValid, isGalContact); 17141caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 17241caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 173fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp public static RecipientEntry constructSecondLevelEntry(String displayName, 174fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp int displayNameSource, String destination, int destinationType, 175fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp String destinationLabel, long contactId, long dataId, String thumbnailUriAsString, 1763e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy boolean isValid, boolean isGalContact) { 177fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp return new RecipientEntry(ENTRY_TYPE_PERSON, pickDisplayName(displayNameSource, 178fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp displayName, destination), destination, destinationType, destinationLabel, 179fbe2d2113c0d00e7f7c7197a3727bb0728d220d8mindyp contactId, dataId, (thumbnailUriAsString != null ? Uri.parse(thumbnailUriAsString) 1803e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy : null), false, isValid, isGalContact); 18124a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa } 18224a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 18324a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa public int getEntryType() { 18424a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa return mEntryType; 18541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 18641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 18741caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa public String getDisplayName() { 18841caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa return mDisplayName; 18941caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 19041caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 19141caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa public String getDestination() { 19241caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa return mDestination; 19341caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 19441caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 1958c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa public int getDestinationType() { 1968c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa return mDestinationType; 1978c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa } 1988c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa 1998c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa public String getDestinationLabel() { 2008c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa return mDestinationLabel; 2018c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa } 2028c03d35fec744db28a2a3230795f123c7afd50ccDaisuke Miyakawa 20365b8c0327b00beda9309c7b7c116013d03b06d90Daisuke Miyakawa public long getContactId() { 20441caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa return mContactId; 20541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 20641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 20765b8c0327b00beda9309c7b7c116013d03b06d90Daisuke Miyakawa public long getDataId() { 208b5ebb8916a1bb178062a0ccb59e80de27ec1bb2dDaisuke Miyakawa return mDataId; 209b5ebb8916a1bb178062a0ccb59e80de27ec1bb2dDaisuke Miyakawa } 210b5ebb8916a1bb178062a0ccb59e80de27ec1bb2dDaisuke Miyakawa 21141caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa public boolean isFirstLevel() { 21241caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa return mIsFirstLevel; 21341caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 21441caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 21524a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa public Uri getPhotoThumbnailUri() { 21624a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa return mPhotoThumbnailUri; 21724a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa } 21824a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 21924a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa /** This can be called outside main Looper thread. */ 22024a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa public synchronized void setPhotoBytes(byte[] photoBytes) { 22124a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa mPhotoBytes = photoBytes; 22224a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa } 22324a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa 22424a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa /** This can be called outside main Looper thread. */ 22524a05a268d1fa2839d62361dc50b88a4c2a2975bDaisuke Miyakawa public synchronized byte[] getPhotoBytes() { 22641caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa return mPhotoBytes; 22741caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 22841caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa 22941caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa public boolean isSeparator() { 23041caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa return mIsDivider; 23141caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa } 232e8adc2935e128eec6cae87ebfb3959b5bc6ec219Daisuke Miyakawa 233e8adc2935e128eec6cae87ebfb3959b5bc6ec219Daisuke Miyakawa public boolean isSelectable() { 234e8adc2935e128eec6cae87ebfb3959b5bc6ec219Daisuke Miyakawa return mEntryType == ENTRY_TYPE_PERSON; 235e8adc2935e128eec6cae87ebfb3959b5bc6ec219Daisuke Miyakawa } 2367b1c6d7dea5f4e3fcb3eb4f137b2e510b394ea79Scott Kennedy 2373e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy public boolean isGalContact() { 2383e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy return mIsGalContact; 2393e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy } 2403e8176df16950c067bcb1b37e62b2fc07d74065aScott Kennedy 2417b1c6d7dea5f4e3fcb3eb4f137b2e510b394ea79Scott Kennedy @Override 2427b1c6d7dea5f4e3fcb3eb4f137b2e510b394ea79Scott Kennedy public String toString() { 2437b1c6d7dea5f4e3fcb3eb4f137b2e510b394ea79Scott Kennedy return mDisplayName + " <" + mDestination + ">, isValid=" + mIsValid; 2447b1c6d7dea5f4e3fcb3eb4f137b2e510b394ea79Scott Kennedy } 24541caab4c41a94712f8eeb1585422df52f8ab5db2Daisuke Miyakawa}