1851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu/*
2851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * Copyright (C) 2012 The Android Open Source Project
3851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu *
4851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * Licensed under the Apache License, Version 2.0 (the "License");
5851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * you may not use this file except in compliance with the License.
6851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * You may obtain a copy of the License at
7851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu *
8851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu *      http://www.apache.org/licenses/LICENSE-2.0
9851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu *
10851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * Unless required by applicable law or agreed to in writing, software
11851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * distributed under the License is distributed on an "AS IS" BASIS,
12851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * See the License for the specific language governing permissions and
14851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * limitations under the License.
15851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu */
16851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
17851222a96b5d68602fb361ea3527101e893f67e3Maurice Chupackage com.android.contacts.model;
18851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
19851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.content.ContentValues;
20851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.content.Context;
21851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.net.Uri;
22851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Photo;
23851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.Data;
24851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.Directory;
25851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.DisplayNameSources;
26851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
27851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.GroupMetaData;
28851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.account.AccountType;
29851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.dataitem.DataItem;
30851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.util.DataStatus;
31851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.util.StreamItemEntry;
32851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.google.common.annotations.VisibleForTesting;
33851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.google.common.collect.ImmutableList;
34851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.google.common.collect.ImmutableMap;
35851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
36851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport java.util.ArrayList;
37851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
38851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu/**
39851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * A Contact represents a single person or logical entity as perceived by the user.  The information
40851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * about a contact can come from multiple data sources, which are each represented by a RawContact
41851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * object.  Thus, a Contact is associated with a collection of RawContact objects.
42851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu *
43851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * The aggregation of raw contacts into a single contact is performed automatically, and it is
44851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * also possible for users to manually split and join raw contacts into various contacts.
45851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu *
46851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * Only the {@link ContactLoader} class can create a Contact object with various flags to allow
47851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * partial loading of contact data.  Thus, an instance of this class should be treated as
48851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * a read-only object.
49851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu */
50851222a96b5d68602fb361ea3527101e893f67e3Maurice Chupublic class Contact {
51851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private enum Status {
52851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        /** Contact is successfully loaded */
53851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        LOADED,
54851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        /** There was an error loading the contact */
55851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        ERROR,
56851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        /** Contact is not found */
57851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        NOT_FOUND,
58851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
59851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
60851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final Uri mRequestedUri;
61851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final Uri mLookupUri;
62851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final Uri mUri;
63851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final long mDirectoryId;
64851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final String mLookupKey;
65851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final long mId;
66851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final long mNameRawContactId;
67851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final int mDisplayNameSource;
68851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final long mPhotoId;
69851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final String mPhotoUri;
70851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final String mDisplayName;
71851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final String mAltDisplayName;
72851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final String mPhoneticName;
73851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final boolean mStarred;
74851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final Integer mPresence;
75851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private ImmutableList<RawContact> mRawContacts;
76851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private ImmutableList<StreamItemEntry> mStreamItems;
77851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private ImmutableMap<Long,DataStatus> mStatuses;
78851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private ImmutableList<AccountType> mInvitableAccountTypes;
79851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
80851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private String mDirectoryDisplayName;
81851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private String mDirectoryType;
82851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private String mDirectoryAccountType;
83851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private String mDirectoryAccountName;
84851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private int mDirectoryExportSupport;
85851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
86851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private ImmutableList<GroupMetaData> mGroups;
87851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
88851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private byte[] mPhotoBinaryData;
89851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final boolean mSendToVoicemail;
90851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final String mCustomRingtone;
91851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final boolean mIsUserProfile;
92851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
93851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final Contact.Status mStatus;
94851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final Exception mException;
95851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
96851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
97851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Constructor for special results, namely "no contact found" and "error".
98851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
99851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private Contact(Uri requestedUri, Contact.Status status, Exception exception) {
100851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (status == Status.ERROR && exception == null) {
101851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            throw new IllegalArgumentException("ERROR result must have exception");
102851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
103851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStatus = status;
104851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mException = exception;
105851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mRequestedUri = requestedUri;
106851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mLookupUri = null;
107851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mUri = null;
108851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryId = -1;
109851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mLookupKey = null;
110851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mId = -1;
111851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mRawContacts = null;
112851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStreamItems = null;
113851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStatuses = null;
114851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mNameRawContactId = -1;
115851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDisplayNameSource = DisplayNameSources.UNDEFINED;
116851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoId = -1;
117851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoUri = null;
118851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDisplayName = null;
119851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mAltDisplayName = null;
120851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhoneticName = null;
121851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStarred = false;
122851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPresence = null;
123851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mInvitableAccountTypes = null;
124851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mSendToVoicemail = false;
125851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mCustomRingtone = null;
126851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mIsUserProfile = false;
127851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
128851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
129851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public static Contact forError(Uri requestedUri, Exception exception) {
130851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return new Contact(requestedUri, Status.ERROR, exception);
131851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
132851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
133851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public static Contact forNotFound(Uri requestedUri) {
134851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return new Contact(requestedUri, Status.NOT_FOUND, null);
135851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
136851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
137851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
138851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Constructor to call when contact was found
139851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
140851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Contact(Uri requestedUri, Uri uri, Uri lookupUri, long directoryId, String lookupKey,
141851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            long id, long nameRawContactId, int displayNameSource, long photoId,
142851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            String photoUri, String displayName, String altDisplayName, String phoneticName,
143851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            boolean starred, Integer presence, boolean sendToVoicemail, String customRingtone,
144851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            boolean isUserProfile) {
145851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStatus = Status.LOADED;
146851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mException = null;
147851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mRequestedUri = requestedUri;
148851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mLookupUri = lookupUri;
149851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mUri = uri;
150851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryId = directoryId;
151851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mLookupKey = lookupKey;
152851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mId = id;
153851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mRawContacts = null;
154851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStreamItems = null;
155851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStatuses = null;
156851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mNameRawContactId = nameRawContactId;
157851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDisplayNameSource = displayNameSource;
158851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoId = photoId;
159851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoUri = photoUri;
160851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDisplayName = displayName;
161851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mAltDisplayName = altDisplayName;
162851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhoneticName = phoneticName;
163851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStarred = starred;
164851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPresence = presence;
165851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mInvitableAccountTypes = null;
166851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mSendToVoicemail = sendToVoicemail;
167851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mCustomRingtone = customRingtone;
168851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mIsUserProfile = isUserProfile;
169851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
170851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
171851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Contact(Uri requestedUri, Contact from) {
172851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mRequestedUri = requestedUri;
173851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
174851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStatus = from.mStatus;
175851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mException = from.mException;
176851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mLookupUri = from.mLookupUri;
177851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mUri = from.mUri;
178851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryId = from.mDirectoryId;
179851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mLookupKey = from.mLookupKey;
180851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mId = from.mId;
181851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mNameRawContactId = from.mNameRawContactId;
182851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDisplayNameSource = from.mDisplayNameSource;
183851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoId = from.mPhotoId;
184851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoUri = from.mPhotoUri;
185851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDisplayName = from.mDisplayName;
186851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mAltDisplayName = from.mAltDisplayName;
187851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhoneticName = from.mPhoneticName;
188851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStarred = from.mStarred;
189851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPresence = from.mPresence;
190851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mRawContacts = from.mRawContacts;
191851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStreamItems = from.mStreamItems;
192851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStatuses = from.mStatuses;
193851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mInvitableAccountTypes = from.mInvitableAccountTypes;
194851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
195851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryDisplayName = from.mDirectoryDisplayName;
196851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryType = from.mDirectoryType;
197851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryAccountType = from.mDirectoryAccountType;
198851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryAccountName = from.mDirectoryAccountName;
199851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryExportSupport = from.mDirectoryExportSupport;
200851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
201851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mGroups = from.mGroups;
202851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
203851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoBinaryData = from.mPhotoBinaryData;
204851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mSendToVoicemail = from.mSendToVoicemail;
205851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mCustomRingtone = from.mCustomRingtone;
206851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mIsUserProfile = from.mIsUserProfile;
207851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
208851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
209851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
210851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @param exportSupport See {@link Directory#EXPORT_SUPPORT}.
211851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
212851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setDirectoryMetaData(String displayName, String directoryType,
213851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            String accountType, String accountName, int exportSupport) {
214851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryDisplayName = displayName;
215851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryType = directoryType;
216851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryAccountType = accountType;
217851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryAccountName = accountName;
218851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDirectoryExportSupport = exportSupport;
219851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
220851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
221851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /* package */ void setPhotoBinaryData(byte[] photoBinaryData) {
222851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mPhotoBinaryData = photoBinaryData;
223851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
224851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
225851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
226851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the URI for the contact that contains both the lookup key and the ID. This is
227851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * the best URI to reference a contact.
228851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * For directory contacts, this is the same a the URI as returned by {@link #getUri()}
229851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
230851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Uri getLookupUri() {
231851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mLookupUri;
232851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
233851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
234851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getLookupKey() {
235851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mLookupKey;
236851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
237851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
238851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
239851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the contact Uri that was passed to the provider to make the query. This is
240851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * the same as the requested Uri, unless the requested Uri doesn't specify a Contact:
241851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * If it either references a Raw-Contact or a Person (a pre-Eclair style Uri), this Uri will
242851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * always reference the full aggregate contact.
243851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
244851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Uri getUri() {
245851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mUri;
246851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
247851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
248851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
249851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the URI for which this {@link ContactLoader) was initially requested.
250851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
251851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Uri getRequestedUri() {
252851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mRequestedUri;
253851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
254851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
255851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
256851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Instantiate a new RawContactDeltaList for this contact.
257851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
258851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public RawContactDeltaList createRawContactDeltaList() {
259851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return RawContactDeltaList.fromIterator(getRawContacts().iterator());
260851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
261851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
262851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
263851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the contact ID.
264851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
265851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    @VisibleForTesting
266851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /* package */ long getId() {
267851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mId;
268851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
269851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
270851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
271851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @return true when an exception happened during loading, in which case
272851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     {@link #getException} returns the actual exception object.
273851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     Note {@link #isNotFound()} and {@link #isError()} are mutually exclusive; If
274851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     {@link #isError()} is {@code true}, {@link #isNotFound()} is always {@code false},
275851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     and vice versa.
276851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
277851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isError() {
278851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mStatus == Status.ERROR;
279851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
280851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
281851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Exception getException() {
282851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mException;
283851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
284851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
285851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
286851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @return true when the specified contact is not found.
287851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     Note {@link #isNotFound()} and {@link #isError()} are mutually exclusive; If
288851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     {@link #isError()} is {@code true}, {@link #isNotFound()} is always {@code false},
289851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     and vice versa.
290851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
291851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isNotFound() {
292851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mStatus == Status.NOT_FOUND;
293851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
294851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
295851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
296851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @return true if the specified contact is successfully loaded.
297851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *     i.e. neither {@link #isError()} nor {@link #isNotFound()}.
298851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
299851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isLoaded() {
300851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mStatus == Status.LOADED;
301851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
302851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
303851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getNameRawContactId() {
304851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mNameRawContactId;
305851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
306851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
307851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public int getDisplayNameSource() {
308851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDisplayNameSource;
309851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
310851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
311851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getPhotoId() {
312851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mPhotoId;
313851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
314851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
315851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getPhotoUri() {
316851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mPhotoUri;
317851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
318851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
319851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getDisplayName() {
320851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDisplayName;
321851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
322851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
323851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getAltDisplayName() {
324851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mAltDisplayName;
325851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
326851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
327851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getPhoneticName() {
328851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mPhoneticName;
329851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
330851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
331851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean getStarred() {
332851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mStarred;
333851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
334851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
335851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Integer getPresence() {
336851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mPresence;
337851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
338851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
339851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
340851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * This can return non-null invitable account types only if the {@link ContactLoader} was
341851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * configured to load invitable account types in its constructor.
342851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @return
343851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
344851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ImmutableList<AccountType> getInvitableAccountTypes() {
345851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mInvitableAccountTypes;
346851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
347851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
348851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ImmutableList<RawContact> getRawContacts() {
349851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mRawContacts;
350851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
351851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
352851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
353851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * This can return non-null stream items only if the {@link ContactLoader} was
354851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * configured to load stream items in its constructor.
355851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @return
356851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
357851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ImmutableList<StreamItemEntry> getStreamItems() {
358851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mStreamItems;
359851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
360851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
361851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ImmutableMap<Long, DataStatus> getStatuses() {
362851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mStatuses;
363851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
364851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
365851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getDirectoryId() {
366851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDirectoryId;
367851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
368851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
369851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isDirectoryEntry() {
370851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDirectoryId != -1 && mDirectoryId != Directory.DEFAULT
371851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                && mDirectoryId != Directory.LOCAL_INVISIBLE;
372851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
373851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
374851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
375851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @return true if this is a contact (not group, etc.) with at least one
376851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *         writable raw-contact, and false otherwise.
377851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
378851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isWritableContact(final Context context) {
379851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getFirstWritableRawContactId(context) != -1;
380851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
381851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
382851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
383851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Return the ID of the first raw-contact in the contact data that belongs to a
384851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * contact-writable account, or -1 if no such entity exists.
385851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
386851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getFirstWritableRawContactId(final Context context) {
387851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        // Directory entries are non-writable
388851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (isDirectoryEntry()) return -1;
389851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
390851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        // Iterate through raw-contacts; if we find a writable on, return its ID.
391851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        for (RawContact rawContact : getRawContacts()) {
392851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            AccountType accountType = rawContact.getAccountType();
393851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            if (accountType != null && accountType.areContactsWritable()) {
394851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                return rawContact.getId();
395851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            }
396851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
397851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        // No writable raw-contact was found.
398851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return -1;
399851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
400851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
401851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public int getDirectoryExportSupport() {
402851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDirectoryExportSupport;
403851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
404851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
405851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getDirectoryDisplayName() {
406851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDirectoryDisplayName;
407851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
408851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
409851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getDirectoryType() {
410851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDirectoryType;
411851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
412851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
413851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getDirectoryAccountType() {
414851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDirectoryAccountType;
415851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
416851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
417851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getDirectoryAccountName() {
418851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDirectoryAccountName;
419851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
420851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
421851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public byte[] getPhotoBinaryData() {
422851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mPhotoBinaryData;
423851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
424851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
425851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ArrayList<ContentValues> getContentValues() {
426851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (mRawContacts.size() != 1) {
427851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            throw new IllegalStateException(
428851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                    "Cannot extract content values from an aggregated contact");
429851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
430851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
431851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        RawContact rawContact = mRawContacts.get(0);
432851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        ArrayList<ContentValues> result = new ArrayList<ContentValues>();
433851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        for (DataItem dataItem : rawContact.getDataItems()) {
434851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            result.add(dataItem.getContentValues());
435851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
436851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
437851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        // If the photo was loaded using the URI, create an entry for the photo
438851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        // binary data.
439851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (mPhotoId == 0 && mPhotoBinaryData != null) {
440851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            ContentValues photo = new ContentValues();
441851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            photo.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
442851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            photo.put(Photo.PHOTO, mPhotoBinaryData);
443851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            result.add(photo);
444851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
445851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
446851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return result;
447851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
448851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
449851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
450851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * This can return non-null group meta-data only if the {@link ContactLoader} was configured to
451851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * load group metadata in its constructor.
452851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * @return
453851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
454851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ImmutableList<GroupMetaData> getGroupMetaData() {
455851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mGroups;
456851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
457851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
458851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isSendToVoicemail() {
459851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mSendToVoicemail;
460851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
461851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
462851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getCustomRingtone() {
463851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mCustomRingtone;
464851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
465851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
466851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isUserProfile() {
467851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mIsUserProfile;
468851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
469851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
470851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    @Override
471851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String toString() {
472851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return "{requested=" + mRequestedUri + ",lookupkey=" + mLookupKey +
473851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                ",uri=" + mUri + ",status=" + mStatus + "}";
474851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
475851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
476851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /* package */ void setRawContacts(ImmutableList<RawContact> rawContacts) {
477851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mRawContacts = rawContacts;
478851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
479851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
480851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /* package */ void setStatuses(ImmutableMap<Long, DataStatus> statuses) {
481851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStatuses = statuses;
482851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
483851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
484851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /* package */ void setInvitableAccountTypes(ImmutableList<AccountType> accountTypes) {
485851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mInvitableAccountTypes = accountTypes;
486851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
487851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
488851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /* package */ void setGroupMetaData(ImmutableList<GroupMetaData> groups) {
489851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mGroups = groups;
490851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
491851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
492851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /* package */ void setStreamItems(ImmutableList<StreamItemEntry> streamItems) {
493851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mStreamItems = streamItems;
494851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
495851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu}
496