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.dataitem;
18851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
19851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.content.ContentValues;
2047b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Chengimport android.content.Context;
21851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Email;
22851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Event;
23851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
24851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Identity;
25851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Im;
26851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Nickname;
27851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Note;
28851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Organization;
29851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Phone;
30851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Photo;
31851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Relation;
32851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.SipAddress;
33851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
34851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
35851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.CommonDataKinds.Website;
36851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport android.provider.ContactsContract.Contacts.Data;
37851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
38428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.dataitem.DataKind;
39428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Cheng
40851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu/**
41851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * This is the base class for data items, which represents a row from the Data table.
42851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu */
43851222a96b5d68602fb361ea3527101e893f67e3Maurice Chupublic class DataItem {
44851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
45851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    private final ContentValues mContentValues;
46851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
4747b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng    protected DataItem(ContentValues values) {
48851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mContentValues = values;
49851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
50851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
51851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
52851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Factory for creating subclasses of DataItem objects based on the mimetype in the
53851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * content values.  Raw contact is the raw contact that this data item is associated with.
54851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
5547b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng    public static DataItem createFrom(ContentValues values) {
56851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        final String mimeType = values.getAsString(Data.MIMETYPE);
57851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
5847b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new GroupMembershipDataItem(values);
59851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
6047b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new StructuredNameDataItem(values);
61851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
6247b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new PhoneDataItem(values);
63851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
6447b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new EmailDataItem(values);
65851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType)) {
6647b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new StructuredPostalDataItem(values);
67851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)) {
6847b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new ImDataItem(values);
69851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) {
7047b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new OrganizationDataItem(values);
71851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
7247b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new NicknameDataItem(values);
73851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Note.CONTENT_ITEM_TYPE.equals(mimeType)) {
7447b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new NoteDataItem(values);
75851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Website.CONTENT_ITEM_TYPE.equals(mimeType)) {
7647b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new WebsiteDataItem(values);
77851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType)) {
7847b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new SipAddressDataItem(values);
79851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Event.CONTENT_ITEM_TYPE.equals(mimeType)) {
8047b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new EventDataItem(values);
81851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Relation.CONTENT_ITEM_TYPE.equals(mimeType)) {
8247b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new RelationDataItem(values);
83851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Identity.CONTENT_ITEM_TYPE.equals(mimeType)) {
8447b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new IdentityDataItem(values);
85851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        } else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
8647b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng            return new PhotoDataItem(values);
87851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
88851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
89851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        // generic
9047b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng        return new DataItem(values);
91851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
92851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
93851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public ContentValues getContentValues() {
94851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mContentValues;
95851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
96851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
97851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setRawContactId(long rawContactId) {
98851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mContentValues.put(Data.RAW_CONTACT_ID, rawContactId);
99851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
100851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
101851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
102851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the data id.
103851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
104851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getId() {
105851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mContentValues.getAsLong(Data._ID);
106851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
107851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
108851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public long getRawContactId() {
109851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mContentValues.getAsLong(Data.RAW_CONTACT_ID);
110851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
111851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
112851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * Returns the mimetype of the data.
113851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
114851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public String getMimeType() {
115851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mContentValues.getAsString(Data.MIMETYPE);
116851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
117851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
118851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public void setMimeType(String mimeType) {
119851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        mContentValues.put(Data.MIMETYPE, mimeType);
120851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
121851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
122851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isPrimary() {
123851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        Integer primary = mContentValues.getAsInteger(Data.IS_PRIMARY);
124851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return primary != null && primary != 0;
125851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
126851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
127851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public boolean isSuperPrimary() {
128851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        Integer superPrimary = mContentValues.getAsInteger(Data.IS_SUPER_PRIMARY);
129851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return superPrimary != null && superPrimary != 0;
130851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
131851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
132851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public int getDataVersion() {
133851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mContentValues.getAsInteger(Data.DATA_VERSION);
134851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
135851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
13647b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng    public boolean hasKindTypeColumn(DataKind kind) {
13747b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng        final String key = kind.typeColumn;
138851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return key != null && mContentValues.containsKey(key);
139851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
140851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
14147b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng    public int getKindTypeColumn(DataKind kind) {
14247b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng        final String key = kind.typeColumn;
143851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return mContentValues.getAsInteger(key);
144851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
145851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu
146851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    /**
147851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * This builds the data string depending on the type of data item by using the generic
14847b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng     * DataKind object underneath.
149851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     */
15047b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng    public String buildDataString(Context context, DataKind kind) {
151851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        if (kind.actionBody == null) {
152851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu            return null;
153851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        }
15447b6f70eadb118d815b4aaf5426c070bd75a38fbChiao Cheng        CharSequence actionBody = kind.actionBody.inflateUsing(context, mContentValues);
155851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu        return actionBody == null ? null : actionBody.toString();
156851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    }
157b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee
158b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee    /**
159b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee     * This builds the data string(intended for display) depending on the type of data item. It
160b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee     * returns the same value as {@link #buildDataString} by default, but certain data items can
161b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee     * override it to provide their version of formatted data strings.
162b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee     *
163b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee     * @return Data string representing the data item, possibly formatted for display
164b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee     */
165b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee    public String buildDataStringForDisplay(Context context, DataKind kind) {
166b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee        return buildDataString(context, kind);
167b2b435a944947fbf1965c3bb7c202a97f0273259Yorke Lee    }
168851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu}
169