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.content.Entity;
22851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.net.Uri;
23851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.Contacts;
24851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.Data;
25851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.RawContacts;
26851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
27851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.account.AccountType;
28851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.account.AccountWithDataSet;
29851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.dataitem.DataItem;
30851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
31851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport java.util.ArrayList;
32851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport java.util.List;
33851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
34851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu/**
35851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * RawContact represents a single raw contact in the raw contacts database.
36851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * It has specialized getters/setters for raw contact
37851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * items, and also contains a collection of DataItem objects.  A RawContact contains the information
38851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * from a single account.
39851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu *
40851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * This allows RawContact objects to be thought of as a class with raw contact
41851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * fields (like account type, name, data set, sync state, etc.) and a list of
42851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * DataItem objects that represent contact information elements (like phone
43851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * numbers, email, address, etc.).
44851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu */
45851222a96b5d68602fb361ea3527101e893f67e3Maurice Chupublic class RawContact {
46851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
47851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final Context mContext;
48851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private AccountTypeManager mAccountTypeManager;
49851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final ContentValues mValues;
50851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final ArrayList<NamedDataItem> mDataItems;
51851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
52851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public static class NamedDataItem {
53851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        public final Uri uri;
54851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        public final DataItem dataItem;
55851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
56851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        public NamedDataItem(Uri uri, DataItem dataItem) {
57851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            this.uri = uri;
58851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            this.dataItem = dataItem;
59851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
60851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
61851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
62851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public static RawContact createFrom(Entity entity) {
63851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        final ContentValues values = entity.getEntityValues();
64851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        final ArrayList<Entity.NamedContentValues> subValues = entity.getSubValues();
65851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
66851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        RawContact rawContact = new RawContact(null, values);
67851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        for (Entity.NamedContentValues subValue : subValues) {
68851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            rawContact.addNamedDataItemValues(subValue.uri, subValue.values);
69851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
70851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return rawContact;
71851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
72851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
73851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
74851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * A RawContact object can be created with or without a context.
75851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     *
76851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * The context is used for the buildString() member function in DataItem objects,
77851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * specifically for retrieving an instance of AccountTypeManager.  It is okay to
78851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * pass in null for the context in which case, you will not be able to call buildString(),
79851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * getDataKind(), or getAccountType() from a DataItem object.
80851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
81851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public RawContact(Context context) {
82851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        this(context, new ContentValues());
83851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
84851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
85851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public RawContact(Context context, ContentValues values) {
86851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mContext = context;
87851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mValues = values;
88851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mDataItems = new ArrayList<NamedDataItem>();
89851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
90851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
91851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public AccountTypeManager getAccountTypeManager() {
92851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (mAccountTypeManager == null) {
93851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            mAccountTypeManager = AccountTypeManager.getInstance(mContext);
94851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
95851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mAccountTypeManager;
96851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
97851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
98851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Context getContext() {
99851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mContext;
100851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
101851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
102851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ContentValues getValues() {
103851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mValues;
104851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
105851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
106851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
107851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the id of the raw contact.
108851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
109851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public Long getId() {
110851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsLong(RawContacts._ID);
111851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
112851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
113851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
114851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the account name of the raw contact.
115851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
116851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getAccountName() {
117851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.ACCOUNT_NAME);
118851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
119851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
120851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
121851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the account type of the raw contact.
122851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
123851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getAccountTypeString() {
124851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.ACCOUNT_TYPE);
125851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
126851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
127851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
128851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the data set of the raw contact.
129851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
130851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getDataSet() {
131851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.DATA_SET);
132851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
133851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
134851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
135851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the account type and data set of the raw contact.
136851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
137851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getAccountTypeAndDataSetString() {
138851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.ACCOUNT_TYPE_AND_DATA_SET);
139851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
140851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
141851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isDirty() {
142851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsBoolean(RawContacts.DIRTY);
143851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
144851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
145851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getVersion() {
146851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsLong(RawContacts.DIRTY);
147851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
148851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
149851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getSourceId() {
150851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.SOURCE_ID);
151851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
152851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
153851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getSync1() {
154851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.SYNC1);
155851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
156851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
157851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getSync2() {
158851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.SYNC2);
159851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
160851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
161851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getSync3() {
162851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.SYNC3);
163851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
164851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
165851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getSync4() {
166851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsString(RawContacts.SYNC4);
167851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
168851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
169851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isDeleted() {
170851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsBoolean(RawContacts.DELETED);
171851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
172851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
173851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isNameVerified() {
174851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsBoolean(RawContacts.NAME_VERIFIED);
175851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
176851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
177851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getContactId() {
178851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsLong(Contacts.Entity.CONTACT_ID);
179851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
180851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
181851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isStarred() {
182851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getValues().getAsBoolean(Contacts.STARRED);
183851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
184851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
185851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public AccountType getAccountType() {
186851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return getAccountTypeManager().getAccountType(getAccountTypeString(), getDataSet());
187851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
188851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
189851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
190851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Sets the account name, account type, and data set strings.
191851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Valid combinations for account-name, account-type, data-set
192851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * 1) null, null, null (local account)
193851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * 2) non-null, non-null, null (valid account without data-set)
194851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * 3) non-null, non-null, non-null (valid account with data-set)
195851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
196851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private void setAccount(String accountName, String accountType, String dataSet) {
197851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        final ContentValues values = getValues();
198851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (accountName == null) {
199851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            if (accountType == null && dataSet == null) {
200851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                // This is a local account
201851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                values.putNull(RawContacts.ACCOUNT_NAME);
202851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                values.putNull(RawContacts.ACCOUNT_TYPE);
203851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                values.putNull(RawContacts.DATA_SET);
204851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                return;
205851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            }
206851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else {
207851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            if (accountType != null) {
208851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                // This is a valid account, either with or without a dataSet.
209851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                values.put(RawContacts.ACCOUNT_NAME, accountName);
210851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                values.put(RawContacts.ACCOUNT_TYPE, accountType);
211851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                if (dataSet == null) {
212851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                    values.putNull(RawContacts.DATA_SET);
213851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                } else {
214851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                    values.put(RawContacts.DATA_SET, dataSet);
215851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                }
21659b83fa3647dd104df899953321a4c37945448a4Geobio Boo                return;
217851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            }
218851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
219851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        throw new IllegalArgumentException(
220851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                "Not a valid combination of account name, type, and data set.");
221851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
222851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
223851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setAccount(AccountWithDataSet accountWithDataSet) {
224851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        setAccount(accountWithDataSet.name, accountWithDataSet.type, accountWithDataSet.dataSet);
225851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
226851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
227851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setAccountToLocal() {
228851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        setAccount(null, null, null);
229851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
230851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
23110bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu    /**
23210bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu     * Creates and inserts a DataItem object that wraps the content values, and returns it.
23310bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu     */
23410bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu    public DataItem addDataItemValues(ContentValues values) {
23510bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu        final NamedDataItem namedItem = addNamedDataItemValues(Data.CONTENT_URI, values);
23610bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu        return namedItem.dataItem;
237851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
238851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
23910bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu    public NamedDataItem addNamedDataItemValues(Uri uri, ContentValues values) {
24010bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu        final NamedDataItem namedItem = new NamedDataItem(uri, DataItem.createFrom(this, values));
24110bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu        mDataItems.add(namedItem);
24210bf684e0c9022d80b04d9cc69665c6341677beaMaurice Chu        return namedItem;
243851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
244851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
245851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public List<DataItem> getDataItems() {
246851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        final ArrayList<DataItem> list = new ArrayList<DataItem>();
247851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        for (NamedDataItem dataItem : mDataItems) {
248851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            if (Data.CONTENT_URI.equals(dataItem.uri)) {
249851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu                list.add(dataItem.dataItem);
250851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            }
251851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
252851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return list;
253851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
254851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
255851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public List<NamedDataItem> getNamedDataItems() {
256851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mDataItems;
257851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
258851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
259851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String toString() {
260851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        final StringBuilder sb = new StringBuilder();
261851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        sb.append("RawContact: ").append(mValues);
262851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        for (RawContact.NamedDataItem namedDataItem : mDataItems) {
263851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            sb.append("\n  ").append(namedDataItem.uri);
264851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            sb.append("\n  -> ").append(namedDataItem.dataItem.getContentValues());
265851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
266851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return sb.toString();
267851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
268851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu}
269