15ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/*
25ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Copyright (C) 2012 The Android Open Source Project
35ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
45ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Licensed under the Apache License, Version 2.0 (the "License");
55ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * you may not use this file except in compliance with the License.
65ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * You may obtain a copy of the License at
75ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
85ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *      http://www.apache.org/licenses/LICENSE-2.0
95ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Unless required by applicable law or agreed to in writing, software
115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * distributed under the License is distributed on an "AS IS" BASIS,
125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * See the License for the specific language governing permissions and
145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * limitations under the License.
155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepackage com.android.contacts.common.model;
185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.ContentValues;
205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.Context;
215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.net.Uri;
225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Photo;
235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Data;
245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Directory;
255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.DisplayNameSources;
265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.GroupMetaData;
285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType;
295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.util.DataStatus;
305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.google.common.annotations.VisibleForTesting;
325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.google.common.collect.ImmutableList;
335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.google.common.collect.ImmutableMap;
345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.ArrayList;
365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.Collections;
375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/**
395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * A Contact represents a single person or logical entity as perceived by the user.  The information
405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * about a contact can come from multiple data sources, which are each represented by a RawContact
415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * object.  Thus, a Contact is associated with a collection of RawContact objects.
425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * The aggregation of raw contacts into a single contact is performed automatically, and it is
445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * also possible for users to manually split and join raw contacts into various contacts.
455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Only the {@link ContactLoader} class can create a Contact object with various flags to allow
475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * partial loading of contact data.  Thus, an instance of this class should be treated as
485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * a read-only object.
495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepublic class Contact {
515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private enum Status {
525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        /** Contact is successfully loaded */
535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        LOADED,
545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        /** There was an error loading the contact */
555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ERROR,
565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        /** Contact is not found */
575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        NOT_FOUND,
585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final Uri mRequestedUri;
615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final Uri mLookupUri;
625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final Uri mUri;
635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final long mDirectoryId;
645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final String mLookupKey;
655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final long mId;
665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final long mNameRawContactId;
675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final int mDisplayNameSource;
685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final long mPhotoId;
695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final String mPhotoUri;
705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final String mDisplayName;
715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final String mAltDisplayName;
725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final String mPhoneticName;
735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final boolean mStarred;
745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final Integer mPresence;
755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private ImmutableList<RawContact> mRawContacts;
765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private ImmutableMap<Long,DataStatus> mStatuses;
775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private ImmutableList<AccountType> mInvitableAccountTypes;
785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private String mDirectoryDisplayName;
805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private String mDirectoryType;
815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private String mDirectoryAccountType;
825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private String mDirectoryAccountName;
835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private int mDirectoryExportSupport;
845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private ImmutableList<GroupMetaData> mGroups;
865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private byte[] mPhotoBinaryData;
8878c550493787bc702a80f124c1eda067cffb9444Brian Attwell    /**
8978c550493787bc702a80f124c1eda067cffb9444Brian Attwell     * Small version of the contact photo loaded from a blob instead of from a file. If a large
9078c550493787bc702a80f124c1eda067cffb9444Brian Attwell     * contact photo is not available yet, then this has the same value as mPhotoBinaryData.
9178c550493787bc702a80f124c1eda067cffb9444Brian Attwell     */
9278c550493787bc702a80f124c1eda067cffb9444Brian Attwell    private byte[] mThumbnailPhotoBinaryData;
935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final boolean mSendToVoicemail;
945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final String mCustomRingtone;
955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final boolean mIsUserProfile;
965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final Contact.Status mStatus;
985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private final Exception mException;
995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
1015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Constructor for special results, namely "no contact found" and "error".
1025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
1035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private Contact(Uri requestedUri, Contact.Status status, Exception exception) {
1045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        if (status == Status.ERROR && exception == null) {
1055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            throw new IllegalArgumentException("ERROR result must have exception");
1065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
1075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStatus = status;
1085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mException = exception;
1095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mRequestedUri = requestedUri;
1105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mLookupUri = null;
1115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mUri = null;
1125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryId = -1;
1135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mLookupKey = null;
1145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mId = -1;
1155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mRawContacts = null;
1165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStatuses = null;
1175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mNameRawContactId = -1;
1185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDisplayNameSource = DisplayNameSources.UNDEFINED;
1195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoId = -1;
1205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoUri = null;
1215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDisplayName = null;
1225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mAltDisplayName = null;
1235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhoneticName = null;
1245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStarred = false;
1255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPresence = null;
1265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mInvitableAccountTypes = null;
1275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mSendToVoicemail = false;
1285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mCustomRingtone = null;
1295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mIsUserProfile = false;
1305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public static Contact forError(Uri requestedUri, Exception exception) {
1335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return new Contact(requestedUri, Status.ERROR, exception);
1345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public static Contact forNotFound(Uri requestedUri) {
1375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return new Contact(requestedUri, Status.NOT_FOUND, null);
1385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
1415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Constructor to call when contact was found
1425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
1435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public Contact(Uri requestedUri, Uri uri, Uri lookupUri, long directoryId, String lookupKey,
1445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            long id, long nameRawContactId, int displayNameSource, long photoId,
1455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            String photoUri, String displayName, String altDisplayName, String phoneticName,
1465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            boolean starred, Integer presence, boolean sendToVoicemail, String customRingtone,
1475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            boolean isUserProfile) {
1485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStatus = Status.LOADED;
1495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mException = null;
1505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mRequestedUri = requestedUri;
1515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mLookupUri = lookupUri;
1525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mUri = uri;
1535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryId = directoryId;
1545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mLookupKey = lookupKey;
1555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mId = id;
1565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mRawContacts = null;
1575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStatuses = null;
1585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mNameRawContactId = nameRawContactId;
1595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDisplayNameSource = displayNameSource;
1605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoId = photoId;
1615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoUri = photoUri;
1625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDisplayName = displayName;
1635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mAltDisplayName = altDisplayName;
1645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhoneticName = phoneticName;
1655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStarred = starred;
1665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPresence = presence;
1675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mInvitableAccountTypes = null;
1685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mSendToVoicemail = sendToVoicemail;
1695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mCustomRingtone = customRingtone;
1705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mIsUserProfile = isUserProfile;
1715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public Contact(Uri requestedUri, Contact from) {
1745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mRequestedUri = requestedUri;
1755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStatus = from.mStatus;
1775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mException = from.mException;
1785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mLookupUri = from.mLookupUri;
1795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mUri = from.mUri;
1805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryId = from.mDirectoryId;
1815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mLookupKey = from.mLookupKey;
1825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mId = from.mId;
1835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mNameRawContactId = from.mNameRawContactId;
1845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDisplayNameSource = from.mDisplayNameSource;
1855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoId = from.mPhotoId;
1865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoUri = from.mPhotoUri;
1875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDisplayName = from.mDisplayName;
1885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mAltDisplayName = from.mAltDisplayName;
1895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhoneticName = from.mPhoneticName;
1905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStarred = from.mStarred;
1915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPresence = from.mPresence;
1925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mRawContacts = from.mRawContacts;
1935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStatuses = from.mStatuses;
1945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mInvitableAccountTypes = from.mInvitableAccountTypes;
1955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryDisplayName = from.mDirectoryDisplayName;
1975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryType = from.mDirectoryType;
1985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryAccountType = from.mDirectoryAccountType;
1995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryAccountName = from.mDirectoryAccountName;
2005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryExportSupport = from.mDirectoryExportSupport;
2015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mGroups = from.mGroups;
2035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoBinaryData = from.mPhotoBinaryData;
2055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mSendToVoicemail = from.mSendToVoicemail;
2065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mCustomRingtone = from.mCustomRingtone;
2075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mIsUserProfile = from.mIsUserProfile;
2085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * @param exportSupport See {@link Directory#EXPORT_SUPPORT}.
2125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void setDirectoryMetaData(String displayName, String directoryType,
2145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            String accountType, String accountName, int exportSupport) {
2155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryDisplayName = displayName;
2165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryType = directoryType;
2175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryAccountType = accountType;
2185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryAccountName = accountName;
2195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mDirectoryExportSupport = exportSupport;
2205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /* package */ void setPhotoBinaryData(byte[] photoBinaryData) {
2235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mPhotoBinaryData = photoBinaryData;
2245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
22678c550493787bc702a80f124c1eda067cffb9444Brian Attwell    /* package */ void setThumbnailPhotoBinaryData(byte[] photoBinaryData) {
22778c550493787bc702a80f124c1eda067cffb9444Brian Attwell        mThumbnailPhotoBinaryData = photoBinaryData;
22878c550493787bc702a80f124c1eda067cffb9444Brian Attwell    }
22978c550493787bc702a80f124c1eda067cffb9444Brian Attwell
2305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Returns the URI for the contact that contains both the lookup key and the ID. This is
2325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * the best URI to reference a contact.
2335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * For directory contacts, this is the same a the URI as returned by {@link #getUri()}
2345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public Uri getLookupUri() {
2365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mLookupUri;
2375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getLookupKey() {
2405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mLookupKey;
2415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Returns the contact Uri that was passed to the provider to make the query. This is
2455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * the same as the requested Uri, unless the requested Uri doesn't specify a Contact:
2465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * If it either references a Raw-Contact or a Person (a pre-Eclair style Uri), this Uri will
2475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * always reference the full aggregate contact.
2485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public Uri getUri() {
2505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mUri;
2515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Returns the URI for which this {@link ContactLoader) was initially requested.
2555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public Uri getRequestedUri() {
2575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mRequestedUri;
2585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Instantiate a new RawContactDeltaList for this contact.
2625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public RawContactDeltaList createRawContactDeltaList() {
2645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return RawContactDeltaList.fromIterator(getRawContacts().iterator());
2655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Returns the contact ID.
2695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    @VisibleForTesting
2715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /* package */ long getId() {
2725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mId;
2735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * @return true when an exception happened during loading, in which case
2775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     {@link #getException} returns the actual exception object.
2785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     Note {@link #isNotFound()} and {@link #isError()} are mutually exclusive; If
2795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     {@link #isError()} is {@code true}, {@link #isNotFound()} is always {@code false},
2805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     and vice versa.
2815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean isError() {
2835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mStatus == Status.ERROR;
2845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public Exception getException() {
2875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mException;
2885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
2915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * @return true when the specified contact is not found.
2925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     Note {@link #isNotFound()} and {@link #isError()} are mutually exclusive; If
2935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     {@link #isError()} is {@code true}, {@link #isNotFound()} is always {@code false},
2945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     and vice versa.
2955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
2965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean isNotFound() {
2975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mStatus == Status.NOT_FOUND;
2985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
3015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * @return true if the specified contact is successfully loaded.
3025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *     i.e. neither {@link #isError()} nor {@link #isNotFound()}.
3035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
3045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean isLoaded() {
3055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mStatus == Status.LOADED;
3065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public long getNameRawContactId() {
3095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mNameRawContactId;
3105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public int getDisplayNameSource() {
3135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDisplayNameSource;
3145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3166084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee    /**
3176084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee     * Used by various classes to determine whether or not this contact should be displayed as
3186084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee     * a business rather than a person.
3196084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee     */
3206084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee    public boolean isDisplayNameFromOrganization() {
3216084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee        return DisplayNameSources.ORGANIZATION == mDisplayNameSource;
3226084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee    }
3236084726fbdda78bdb16e2d4cc1c3b81c84fd5da1Yorke Lee
3245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public long getPhotoId() {
3255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mPhotoId;
3265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getPhotoUri() {
3295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mPhotoUri;
3305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getDisplayName() {
3335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDisplayName;
3345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getAltDisplayName() {
3375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mAltDisplayName;
3385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getPhoneticName() {
3415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mPhoneticName;
3425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean getStarred() {
3455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mStarred;
3465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public Integer getPresence() {
3495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mPresence;
3505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
3535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * This can return non-null invitable account types only if the {@link ContactLoader} was
3545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * configured to load invitable account types in its constructor.
3555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * @return
3565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
3575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public ImmutableList<AccountType> getInvitableAccountTypes() {
3585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mInvitableAccountTypes;
3595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public ImmutableList<RawContact> getRawContacts() {
3625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mRawContacts;
3635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public ImmutableMap<Long, DataStatus> getStatuses() {
3665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mStatuses;
3675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public long getDirectoryId() {
3705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDirectoryId;
3715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean isDirectoryEntry() {
3745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDirectoryId != -1 && mDirectoryId != Directory.DEFAULT
3755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                && mDirectoryId != Directory.LOCAL_INVISIBLE;
3765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
3795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * @return true if this is a contact (not group, etc.) with at least one
3805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     *         writable raw-contact, and false otherwise.
3815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
3825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean isWritableContact(final Context context) {
3835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return getFirstWritableRawContactId(context) != -1;
3845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
3875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * Return the ID of the first raw-contact in the contact data that belongs to a
3885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * contact-writable account, or -1 if no such entity exists.
3895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
3905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public long getFirstWritableRawContactId(final Context context) {
3915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Directory entries are non-writable
3925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        if (isDirectoryEntry()) return -1;
3935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Iterate through raw-contacts; if we find a writable on, return its ID.
3955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        for (RawContact rawContact : getRawContacts()) {
3965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            AccountType accountType = rawContact.getAccountType(context);
3975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            if (accountType != null && accountType.areContactsWritable()) {
3985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                return rawContact.getId();
3995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            }
4005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
4015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // No writable raw-contact was found.
4025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return -1;
4035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public int getDirectoryExportSupport() {
4065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDirectoryExportSupport;
4075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getDirectoryDisplayName() {
4105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDirectoryDisplayName;
4115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getDirectoryType() {
4145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDirectoryType;
4155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getDirectoryAccountType() {
4185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDirectoryAccountType;
4195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getDirectoryAccountName() {
4225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mDirectoryAccountName;
4235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public byte[] getPhotoBinaryData() {
4265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mPhotoBinaryData;
4275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
42978c550493787bc702a80f124c1eda067cffb9444Brian Attwell    public byte[] getThumbnailPhotoBinaryData() {
43078c550493787bc702a80f124c1eda067cffb9444Brian Attwell        return mThumbnailPhotoBinaryData;
43178c550493787bc702a80f124c1eda067cffb9444Brian Attwell    }
43278c550493787bc702a80f124c1eda067cffb9444Brian Attwell
4335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public ArrayList<ContentValues> getContentValues() {
4345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        if (mRawContacts.size() != 1) {
4355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            throw new IllegalStateException(
4365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    "Cannot extract content values from an aggregated contact");
4375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
4385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        RawContact rawContact = mRawContacts.get(0);
4405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ArrayList<ContentValues> result = rawContact.getContentValues();
4415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // If the photo was loaded using the URI, create an entry for the photo
4435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // binary data.
4445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        if (mPhotoId == 0 && mPhotoBinaryData != null) {
4455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            ContentValues photo = new ContentValues();
4465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            photo.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
4475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            photo.put(Photo.PHOTO, mPhotoBinaryData);
4485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            result.add(photo);
4495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
4505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return result;
4525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /**
4555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * This can return non-null group meta-data only if the {@link ContactLoader} was configured to
4565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * load group metadata in its constructor.
4575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     * @return
4585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee     */
4595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public ImmutableList<GroupMetaData> getGroupMetaData() {
4605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mGroups;
4615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean isSendToVoicemail() {
4645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mSendToVoicemail;
4655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String getCustomRingtone() {
4685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mCustomRingtone;
4695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public boolean isUserProfile() {
4725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return mIsUserProfile;
4735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    @Override
4765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public String toString() {
4775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return "{requested=" + mRequestedUri + ",lookupkey=" + mLookupKey +
4785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                ",uri=" + mUri + ",status=" + mStatus + "}";
4795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /* package */ void setRawContacts(ImmutableList<RawContact> rawContacts) {
4825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mRawContacts = rawContacts;
4835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /* package */ void setStatuses(ImmutableMap<Long, DataStatus> statuses) {
4865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mStatuses = statuses;
4875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /* package */ void setInvitableAccountTypes(ImmutableList<AccountType> accountTypes) {
4905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mInvitableAccountTypes = accountTypes;
4915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
4935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    /* package */ void setGroupMetaData(ImmutableList<GroupMetaData> groups) {
4945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mGroups = groups;
4955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee}
497