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