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.content.Entity; 225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.net.Uri; 235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.os.Parcel; 245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.os.Parcelable; 255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Contacts; 265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Data; 275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.RawContacts; 285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.AccountTypeManager; 305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType; 315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountWithDataSet; 325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.dataitem.DataItem; 335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.google.common.base.Objects; 345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.google.common.collect.Lists; 355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.ArrayList; 375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.List; 385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/** 405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * RawContact represents a single raw contact in the raw contacts database. 415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * It has specialized getters/setters for raw contact 425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * items, and also contains a collection of DataItem objects. A RawContact contains the information 435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * from a single account. 445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * This allows RawContact objects to be thought of as a class with raw contact 465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * fields (like account type, name, data set, sync state, etc.) and a list of 475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * DataItem objects that represent contact information elements (like phone 485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * numbers, email, address, etc.). 495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leefinal public class RawContact implements Parcelable { 515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private AccountTypeManager mAccountTypeManager; 535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private final ContentValues mValues; 545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private final ArrayList<NamedDataItem> mDataItems; 555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final public static class NamedDataItem implements Parcelable { 575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public final Uri mUri; 585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // This use to be a DataItem. DataItem creation is now delayed until the point of request 605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // since there is no benefit to storing them here due to the multiple inheritance. 615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Eventually instanceof still has to be used anyways to determine which sub-class of 625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // DataItem it is. And having parent DataItem's here makes it very difficult to serialize or 635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // parcelable. 645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // 655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Instead of having a common DataItem super class, we should refactor this to be a generic 665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Object where the object is a concrete class that no longer relies on ContentValues. 675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // (this will also make the classes easier to use). 685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Since instanceof is used later anyways, having a list of Objects won't hurt and is no 695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // worse than having a DataItem. 705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public final ContentValues mContentValues; 715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public NamedDataItem(Uri uri, ContentValues values) { 735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee this.mUri = uri; 745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee this.mContentValues = values; 755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public NamedDataItem(Parcel parcel) { 785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee this.mUri = parcel.readParcelable(Uri.class.getClassLoader()); 795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee this.mContentValues = parcel.readParcelable(ContentValues.class.getClassLoader()); 805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public int describeContents() { 845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return 0; 855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void writeToParcel(Parcel parcel, int i) { 895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee parcel.writeParcelable(mUri, i); 905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee parcel.writeParcelable(mContentValues, i); 915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public static final Parcelable.Creator<NamedDataItem> CREATOR 945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee = new Parcelable.Creator<NamedDataItem>() { 955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public NamedDataItem createFromParcel(Parcel parcel) { 985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return new NamedDataItem(parcel); 995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public NamedDataItem[] newArray(int i) { 1035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return new NamedDataItem[i]; 1045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee }; 1065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public int hashCode() { 1095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return Objects.hashCode(mUri, mContentValues); 1105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public boolean equals(Object obj) { 1145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (obj == null) return false; 1155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (getClass() != obj.getClass()) return false; 1165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final NamedDataItem other = (NamedDataItem) obj; 1185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return Objects.equal(mUri, other.mUri) && 1195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee Objects.equal(mContentValues, other.mContentValues); 1205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public static RawContact createFrom(Entity entity) { 1245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues values = entity.getEntityValues(); 1255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<Entity.NamedContentValues> subValues = entity.getSubValues(); 1265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContact rawContact = new RawContact(values); 1285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee for (Entity.NamedContentValues subValue : subValues) { 1295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee rawContact.addNamedDataItemValues(subValue.uri, subValue.values); 1305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return rawContact; 1325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * A RawContact object can be created with or without a context. 1365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public RawContact() { 1385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee this(new ContentValues()); 1395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public RawContact(ContentValues values) { 1425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mValues = values; 1435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mDataItems = new ArrayList<NamedDataItem>(); 1445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Constructor for the parcelable. 1485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 1495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * @param parcel The parcel to de-serialize from. 1505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private RawContact(Parcel parcel) { 1525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mValues = parcel.readParcelable(ContentValues.class.getClassLoader()); 1535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mDataItems = Lists.newArrayList(); 1545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee parcel.readTypedList(mDataItems, NamedDataItem.CREATOR); 1555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public int describeContents() { 1595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return 0; 1605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void writeToParcel(Parcel parcel, int i) { 1645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee parcel.writeParcelable(mValues, i); 1655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee parcel.writeTypedList(mDataItems); 1665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Create for building the parcelable. 1705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public static final Parcelable.Creator<RawContact> CREATOR 1725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee = new Parcelable.Creator<RawContact>() { 1735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public RawContact createFromParcel(Parcel parcel) { 1765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return new RawContact(parcel); 1775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public RawContact[] newArray(int i) { 1815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return new RawContact[i]; 1825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee }; 1845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public AccountTypeManager getAccountTypeManager(Context context) { 1865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (mAccountTypeManager == null) { 1875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mAccountTypeManager = AccountTypeManager.getInstance(context); 1885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return mAccountTypeManager; 1905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public ContentValues getValues() { 1935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return mValues; 1945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Returns the id of the raw contact. 1985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public Long getId() { 2005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsLong(RawContacts._ID); 2015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 2045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Returns the account name of the raw contact. 2055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 2065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getAccountName() { 2075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.ACCOUNT_NAME); 2085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 2115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Returns the account type of the raw contact. 2125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 2135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getAccountTypeString() { 2145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.ACCOUNT_TYPE); 2155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 2185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Returns the data set of the raw contact. 2195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 2205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getDataSet() { 2215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.DATA_SET); 2225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public boolean isDirty() { 2255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsBoolean(RawContacts.DIRTY); 2265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getSourceId() { 2295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.SOURCE_ID); 2305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getSync1() { 2335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.SYNC1); 2345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getSync2() { 2375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.SYNC2); 2385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getSync3() { 2415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.SYNC3); 2425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String getSync4() { 2455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsString(RawContacts.SYNC4); 2465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public boolean isDeleted() { 2495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsBoolean(RawContacts.DELETED); 2505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public long getContactId() { 2535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsLong(Contacts.Entity.CONTACT_ID); 2545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public boolean isStarred() { 2575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getValues().getAsBoolean(Contacts.STARRED); 2585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public AccountType getAccountType(Context context) { 2615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return getAccountTypeManager(context).getAccountType(getAccountTypeString(), getDataSet()); 2625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 2655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Sets the account name, account type, and data set strings. 2665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Valid combinations for account-name, account-type, data-set 2675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 1) null, null, null (local account) 2685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 2) non-null, non-null, null (valid account without data-set) 2695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 3) non-null, non-null, non-null (valid account with data-set) 2705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 2715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private void setAccount(String accountName, String accountType, String dataSet) { 2725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues values = getValues(); 2735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (accountName == null) { 2745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (accountType == null && dataSet == null) { 2755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // This is a local account 2765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.putNull(RawContacts.ACCOUNT_NAME); 2775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.putNull(RawContacts.ACCOUNT_TYPE); 2785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.putNull(RawContacts.DATA_SET); 2795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return; 2805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } else { 2825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (accountType != null) { 2835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // This is a valid account, either with or without a dataSet. 2845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.put(RawContacts.ACCOUNT_NAME, accountName); 2855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.put(RawContacts.ACCOUNT_TYPE, accountType); 2865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (dataSet == null) { 2875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.putNull(RawContacts.DATA_SET); 2885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } else { 2895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.put(RawContacts.DATA_SET, dataSet); 2905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return; 2925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee throw new IllegalArgumentException( 2955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee "Not a valid combination of account name, type, and data set."); 2965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void setAccount(AccountWithDataSet accountWithDataSet) { 2995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee setAccount(accountWithDataSet.name, accountWithDataSet.type, accountWithDataSet.dataSet); 3005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void setAccountToLocal() { 3035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee setAccount(null, null, null); 3045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 3075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Creates and inserts a DataItem object that wraps the content values, and returns it. 3085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 3095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void addDataItemValues(ContentValues values) { 3105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee addNamedDataItemValues(Data.CONTENT_URI, values); 3115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public NamedDataItem addNamedDataItemValues(Uri uri, ContentValues values) { 3145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final NamedDataItem namedItem = new NamedDataItem(uri, values); 3155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mDataItems.add(namedItem); 3165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return namedItem; 3175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public ArrayList<ContentValues> getContentValues() { 3205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentValues> list = Lists.newArrayListWithCapacity(mDataItems.size()); 3215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee for (NamedDataItem dataItem : mDataItems) { 3225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (Data.CONTENT_URI.equals(dataItem.mUri)) { 3235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee list.add(dataItem.mContentValues); 3245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return list; 3275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public List<DataItem> getDataItems() { 3305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<DataItem> list = Lists.newArrayListWithCapacity(mDataItems.size()); 3315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee for (NamedDataItem dataItem : mDataItems) { 3325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (Data.CONTENT_URI.equals(dataItem.mUri)) { 3335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee list.add(DataItem.createFrom(dataItem.mContentValues)); 3345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return list; 3375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public String toString() { 3405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final StringBuilder sb = new StringBuilder(); 3415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee sb.append("RawContact: ").append(mValues); 3425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee for (RawContact.NamedDataItem namedDataItem : mDataItems) { 3435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee sb.append("\n ").append(namedDataItem.mUri); 3445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee sb.append("\n -> ").append(namedDataItem.mContentValues); 3455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return sb.toString(); 3475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 3505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public int hashCode() { 3515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return Objects.hashCode(mValues, mDataItems); 3525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 3555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public boolean equals(Object obj) { 3565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (obj == null) return false; 3575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (getClass() != obj.getClass()) return false; 3585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContact other = (RawContact) obj; 3605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return Objects.equal(mValues, other.mValues) && 3615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee Objects.equal(mDataItems, other.mDataItems); 3625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee} 364