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