1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2012 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.contacts.common.model; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.ContentValues; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.net.Uri; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Photo; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.Data; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.Directory; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.DisplayNameSources; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.VisibleForTesting; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.GroupMetaData; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.model.account.AccountType; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.google.common.collect.ImmutableList; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.ArrayList; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * A Contact represents a single person or logical entity as perceived by the user. The information 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * about a contact can come from multiple data sources, which are each represented by a RawContact 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * object. Thus, a Contact is associated with a collection of RawContact objects. 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * <p>The aggregation of raw contacts into a single contact is performed automatically, and it is 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * also possible for users to manually split and join raw contacts into various contacts. 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * <p>Only the {@link ContactLoader} class can create a Contact object with various flags to allow 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * partial loading of contact data. Thus, an instance of this class should be treated as a read-only 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * object. 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class Contact { 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Uri mRequestedUri; 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Uri mLookupUri; 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Uri mUri; 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final long mDirectoryId; 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final String mLookupKey; 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final long mId; 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final long mNameRawContactId; 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final int mDisplayNameSource; 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final long mPhotoId; 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final String mPhotoUri; 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final String mDisplayName; 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final String mAltDisplayName; 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final String mPhoneticName; 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final boolean mStarred; 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Integer mPresence; 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final boolean mSendToVoicemail; 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final String mCustomRingtone; 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final boolean mIsUserProfile; 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Contact.Status mStatus; 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Exception mException; 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private ImmutableList<RawContact> mRawContacts; 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private ImmutableList<AccountType> mInvitableAccountTypes; 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private String mDirectoryDisplayName; 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private String mDirectoryType; 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private String mDirectoryAccountType; 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private String mDirectoryAccountName; 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private int mDirectoryExportSupport; 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private ImmutableList<GroupMetaData> mGroups; 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private byte[] mPhotoBinaryData; 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Small version of the contact photo loaded from a blob instead of from a file. If a large 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * contact photo is not available yet, then this has the same value as mPhotoBinaryData. 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private byte[] mThumbnailPhotoBinaryData; 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Constructor for special results, namely "no contact found" and "error". */ 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private Contact(Uri requestedUri, Contact.Status status, Exception exception) { 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (status == Status.ERROR && exception == null) { 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian throw new IllegalArgumentException("ERROR result must have exception"); 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mStatus = status; 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mException = exception; 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mRequestedUri = requestedUri; 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mLookupUri = null; 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mUri = null; 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryId = -1; 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mLookupKey = null; 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mId = -1; 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mRawContacts = null; 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mNameRawContactId = -1; 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDisplayNameSource = DisplayNameSources.UNDEFINED; 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoId = -1; 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoUri = null; 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDisplayName = null; 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mAltDisplayName = null; 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhoneticName = null; 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mStarred = false; 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPresence = null; 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mInvitableAccountTypes = null; 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mSendToVoicemail = false; 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mCustomRingtone = null; 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsUserProfile = false; 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Constructor to call when contact was found */ 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Contact( 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Uri requestedUri, 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Uri uri, 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Uri lookupUri, 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian long directoryId, 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String lookupKey, 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian long id, 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian long nameRawContactId, 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian int displayNameSource, 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian long photoId, 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String photoUri, 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String displayName, 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String altDisplayName, 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String phoneticName, 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian boolean starred, 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Integer presence, 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian boolean sendToVoicemail, 127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String customRingtone, 128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian boolean isUserProfile) { 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mStatus = Status.LOADED; 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mException = null; 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mRequestedUri = requestedUri; 132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mLookupUri = lookupUri; 133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mUri = uri; 134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryId = directoryId; 135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mLookupKey = lookupKey; 136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mId = id; 137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mRawContacts = null; 138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mNameRawContactId = nameRawContactId; 139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDisplayNameSource = displayNameSource; 140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoId = photoId; 141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoUri = photoUri; 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDisplayName = displayName; 143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mAltDisplayName = altDisplayName; 144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhoneticName = phoneticName; 145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mStarred = starred; 146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPresence = presence; 147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mInvitableAccountTypes = null; 148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mSendToVoicemail = sendToVoicemail; 149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mCustomRingtone = customRingtone; 150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsUserProfile = isUserProfile; 151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Contact(Uri requestedUri, Contact from) { 154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mRequestedUri = requestedUri; 155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mStatus = from.mStatus; 157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mException = from.mException; 158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mLookupUri = from.mLookupUri; 159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mUri = from.mUri; 160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryId = from.mDirectoryId; 161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mLookupKey = from.mLookupKey; 162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mId = from.mId; 163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mNameRawContactId = from.mNameRawContactId; 164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDisplayNameSource = from.mDisplayNameSource; 165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoId = from.mPhotoId; 166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoUri = from.mPhotoUri; 167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDisplayName = from.mDisplayName; 168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mAltDisplayName = from.mAltDisplayName; 169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhoneticName = from.mPhoneticName; 170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mStarred = from.mStarred; 171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPresence = from.mPresence; 172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mRawContacts = from.mRawContacts; 173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mInvitableAccountTypes = from.mInvitableAccountTypes; 174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryDisplayName = from.mDirectoryDisplayName; 176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryType = from.mDirectoryType; 177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryAccountType = from.mDirectoryAccountType; 178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryAccountName = from.mDirectoryAccountName; 179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryExportSupport = from.mDirectoryExportSupport; 180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mGroups = from.mGroups; 182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoBinaryData = from.mPhotoBinaryData; 184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mSendToVoicemail = from.mSendToVoicemail; 185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mCustomRingtone = from.mCustomRingtone; 186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsUserProfile = from.mIsUserProfile; 187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static Contact forError(Uri requestedUri, Exception exception) { 190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new Contact(requestedUri, Status.ERROR, exception); 191ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static Contact forNotFound(Uri requestedUri) { 194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new Contact(requestedUri, Status.NOT_FOUND, null); 195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** @param exportSupport See {@link Directory#EXPORT_SUPPORT}. */ 198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setDirectoryMetaData( 199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String displayName, 200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String directoryType, 201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String accountType, 202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian String accountName, 203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian int exportSupport) { 204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryDisplayName = displayName; 205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryType = directoryType; 206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryAccountType = accountType; 207ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryAccountName = accountName; 208ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mDirectoryExportSupport = exportSupport; 209ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 210ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 211ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 212ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Returns the URI for the contact that contains both the lookup key and the ID. This is the best 213ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * URI to reference a contact. For directory contacts, this is the same a the URI as returned by 214ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * {@link #getUri()} 215ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 216ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Uri getLookupUri() { 217ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mLookupUri; 218ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 219ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 220ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String getLookupKey() { 221ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mLookupKey; 222ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 223ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 224ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 225ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Returns the contact Uri that was passed to the provider to make the query. This is the same as 226ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * the requested Uri, unless the requested Uri doesn't specify a Contact: If it either references 227ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * a Raw-Contact or a Person (a pre-Eclair style Uri), this Uri will always reference the full 228ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * aggregate contact. 229ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 230ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Uri getUri() { 231ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mUri; 232ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 233ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 234ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Returns the contact ID. */ 235ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @VisibleForTesting 236ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public long getId() { 237ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mId; 238ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 239ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 240ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 241ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @return true when an exception happened during loading, in which case {@link #getException} 242ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * returns the actual exception object. 243ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 244ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isError() { 245ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mStatus == Status.ERROR; 246ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 247ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 248ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Exception getException() { 249ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mException; 250ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 251ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 252ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** @return true if the specified contact is successfully loaded. */ 253ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isLoaded() { 254ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mStatus == Status.LOADED; 255ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 256ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 257ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public long getNameRawContactId() { 258ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mNameRawContactId; 259ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 260ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 261ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getDisplayNameSource() { 262ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mDisplayNameSource; 263ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 264ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 265ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public long getPhotoId() { 266ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mPhotoId; 267ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 268ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 269ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String getPhotoUri() { 270ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mPhotoUri; 271ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 272ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 273ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String getDisplayName() { 274ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mDisplayName; 275ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 276ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 277ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean getStarred() { 278ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mStarred; 279ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 280ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 281ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Integer getPresence() { 282ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mPresence; 283ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 284ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 285ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 286ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * This can return non-null invitable account types only if the {@link ContactLoader} was 287ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * configured to load invitable account types in its constructor. 288ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 289ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public ImmutableList<AccountType> getInvitableAccountTypes() { 290ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mInvitableAccountTypes; 291ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 292ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 293ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /* package */ void setInvitableAccountTypes(ImmutableList<AccountType> accountTypes) { 294ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mInvitableAccountTypes = accountTypes; 295ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 296ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 297ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public ImmutableList<RawContact> getRawContacts() { 298ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mRawContacts; 299ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 300ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 301ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /* package */ void setRawContacts(ImmutableList<RawContact> rawContacts) { 302ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mRawContacts = rawContacts; 303ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 304ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 305ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public long getDirectoryId() { 306ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mDirectoryId; 307ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 308ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 309ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isDirectoryEntry() { 310ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mDirectoryId != -1 311ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian && mDirectoryId != Directory.DEFAULT 312ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian && mDirectoryId != Directory.LOCAL_INVISIBLE; 313ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 314ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 315ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /* package */ void setPhotoBinaryData(byte[] photoBinaryData) { 316ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mPhotoBinaryData = photoBinaryData; 317ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 318ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 319ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public byte[] getThumbnailPhotoBinaryData() { 320ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mThumbnailPhotoBinaryData; 321ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 322ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 323ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /* package */ void setThumbnailPhotoBinaryData(byte[] photoBinaryData) { 324ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mThumbnailPhotoBinaryData = photoBinaryData; 325ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 326ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 327ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public ArrayList<ContentValues> getContentValues() { 328ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (mRawContacts.size() != 1) { 329ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian throw new IllegalStateException("Cannot extract content values from an aggregated contact"); 330ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 331ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 332ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian RawContact rawContact = mRawContacts.get(0); 333ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ArrayList<ContentValues> result = rawContact.getContentValues(); 334ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 335ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // If the photo was loaded using the URI, create an entry for the photo 336ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // binary data. 337ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (mPhotoId == 0 && mPhotoBinaryData != null) { 338ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ContentValues photo = new ContentValues(); 339ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian photo.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 340ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian photo.put(Photo.PHOTO, mPhotoBinaryData); 341ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian result.add(photo); 342ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 343ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 344ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return result; 345ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 346ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 347ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 348ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * This can return non-null group meta-data only if the {@link ContactLoader} was configured to 349ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * load group metadata in its constructor. 350ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 351ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public ImmutableList<GroupMetaData> getGroupMetaData() { 352ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mGroups; 353ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 354ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 355ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /* package */ void setGroupMetaData(ImmutableList<GroupMetaData> groups) { 356ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mGroups = groups; 357ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 358ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 359ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isUserProfile() { 360ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mIsUserProfile; 361ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 362ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 363ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 364ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String toString() { 365ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return "{requested=" 366ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + mRequestedUri 367ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + ",lookupkey=" 368ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + mLookupKey 369ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + ",uri=" 370ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + mUri 371ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + ",status=" 372ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + mStatus 373ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + "}"; 374ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 375ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 376ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private enum Status { 377ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Contact is successfully loaded */ 378ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian LOADED, 379ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** There was an error loading the contact */ 380ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ERROR, 381ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Contact is not found */ 382ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian NOT_FOUND, 383ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 384ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 385