1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2012 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.contacts.common.model.dataitem; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.ContentValues; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Email; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Event; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Identity; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Im; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Nickname; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Note; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Organization; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Phone; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Photo; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Relation; 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.SipAddress; 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Website; 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.Contacts.Data; 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.Contacts.Entity; 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.Collapser; 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.MoreContactUtils; 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.model.account.AccountType.EditType; 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** This is the base class for data items, which represents a row from the Data table. */ 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class DataItem implements Collapser.Collapsible<DataItem> { 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final ContentValues mContentValues; 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected DataKind mKind; 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected DataItem(ContentValues values) { 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues = values; 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Factory for creating subclasses of DataItem objects based on the mimetype in the content 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * values. Raw contact is the raw contact that this data item is associated with. 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static DataItem createFrom(ContentValues values) { 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final String mimeType = values.getAsString(Data.MIMETYPE); 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) { 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new GroupMembershipDataItem(values); 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) { 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new StructuredNameDataItem(values); 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) { 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new PhoneDataItem(values); 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) { 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new EmailDataItem(values); 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType)) { 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new StructuredPostalDataItem(values); 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)) { 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new ImDataItem(values); 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) { 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new OrganizationDataItem(values); 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) { 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new NicknameDataItem(values); 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Note.CONTENT_ITEM_TYPE.equals(mimeType)) { 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new NoteDataItem(values); 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Website.CONTENT_ITEM_TYPE.equals(mimeType)) { 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new WebsiteDataItem(values); 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (SipAddress.CONTENT_ITEM_TYPE.equals(mimeType)) { 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new SipAddressDataItem(values); 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Event.CONTENT_ITEM_TYPE.equals(mimeType)) { 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new EventDataItem(values); 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Relation.CONTENT_ITEM_TYPE.equals(mimeType)) { 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new RelationDataItem(values); 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Identity.CONTENT_ITEM_TYPE.equals(mimeType)) { 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new IdentityDataItem(values); 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) { 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new PhotoDataItem(values); 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // generic 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new DataItem(values); 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public ContentValues getContentValues() { 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues; 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Long getRawContactId() { 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues.getAsLong(Data.RAW_CONTACT_ID); 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setRawContactId(long rawContactId) { 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put(Data.RAW_CONTACT_ID, rawContactId); 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Returns the data id. */ 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public long getId() { 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues.getAsLong(Data._ID); 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Returns the mimetype of the data. */ 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String getMimeType() { 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues.getAsString(Data.MIMETYPE); 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setMimeType(String mimeType) { 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put(Data.MIMETYPE, mimeType); 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isPrimary() { 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Integer primary = mContentValues.getAsInteger(Data.IS_PRIMARY); 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return primary != null && primary != 0; 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isSuperPrimary() { 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Integer superPrimary = mContentValues.getAsInteger(Data.IS_SUPER_PRIMARY); 127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return superPrimary != null && superPrimary != 0; 128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean hasKindTypeColumn(DataKind kind) { 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final String key = kind.typeColumn; 132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return key != null 133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian && mContentValues.containsKey(key) 134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian && mContentValues.getAsInteger(key) != null; 135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getKindTypeColumn(DataKind kind) { 138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final String key = kind.typeColumn; 139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues.getAsInteger(key); 140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Indicates the carrier presence value for the current {@link DataItem}. 144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @return {@link Data#CARRIER_PRESENCE_VT_CAPABLE} if the {@link DataItem} supports carrier video 146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * calling, {@code 0} otherwise. 147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public int getCarrierPresence() { 149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues.getAsInteger(Data.CARRIER_PRESENCE); 150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * This builds the data string depending on the type of data item by using the generic DataKind 154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * object underneath. 155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String buildDataString(Context context, DataKind kind) { 157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (kind.actionBody == null) { 158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return null; 159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian CharSequence actionBody = kind.actionBody.inflateUsing(context, mContentValues); 161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return actionBody == null ? null : actionBody.toString(); 162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * This builds the data string(intended for display) depending on the type of data item. It 166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * returns the same value as {@link #buildDataString} by default, but certain data items can 167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * override it to provide their version of formatted data strings. 168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @return Data string representing the data item, possibly formatted for display 170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String buildDataStringForDisplay(Context context, DataKind kind) { 172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return buildDataString(context, kind); 173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public DataKind getDataKind() { 176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mKind; 177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setDataKind(DataKind kind) { 180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mKind = kind; 181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Integer getTimesUsed() { 184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues.getAsInteger(Entity.TIMES_USED); 185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Long getLastTimeUsed() { 188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mContentValues.getAsLong(Entity.LAST_TIME_USED); 189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 191ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void collapseWith(DataItem that) { 193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian DataKind thisKind = getDataKind(); 194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian DataKind thatKind = that.getDataKind(); 195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // If this does not have a type and that does, or if that's type is higher precedence, 196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // use that's type 197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if ((!hasKindTypeColumn(thisKind) && that.hasKindTypeColumn(thatKind)) 198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian || (that.hasKindTypeColumn(thatKind) 199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian && getTypePrecedence(thisKind, getKindTypeColumn(thisKind)) 200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian > getTypePrecedence(thatKind, that.getKindTypeColumn(thatKind)))) { 201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put(thatKind.typeColumn, that.getKindTypeColumn(thatKind)); 202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mKind = thatKind; 203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Choose the max of the maxLines and maxLabelLines values. 206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mKind.maxLinesForDisplay = Math.max(thisKind.maxLinesForDisplay, thatKind.maxLinesForDisplay); 207ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 208ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // If any of the collapsed entries are super primary make the whole thing super primary. 209ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (isSuperPrimary() || that.isSuperPrimary()) { 210ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put(Data.IS_SUPER_PRIMARY, 1); 211ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put(Data.IS_PRIMARY, 1); 212ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 213ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 214ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // If any of the collapsed entries are primary make the whole thing primary. 215ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (isPrimary() || that.isPrimary()) { 216ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put(Data.IS_PRIMARY, 1); 217ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 218ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 219ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Add up the times used 220ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put( 221ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Entity.TIMES_USED, 222ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian (getTimesUsed() == null ? 0 : getTimesUsed()) 223ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian + (that.getTimesUsed() == null ? 0 : that.getTimesUsed())); 224ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 225ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Use the most recent time 226ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mContentValues.put( 227ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Entity.LAST_TIME_USED, 228ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Math.max( 229ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getLastTimeUsed() == null ? 0 : getLastTimeUsed(), 230ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian that.getLastTimeUsed() == null ? 0 : that.getLastTimeUsed())); 231ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 232ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 233ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 234ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean shouldCollapseWith(DataItem t, Context context) { 235ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (mKind == null || t.getDataKind() == null) { 236ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return false; 237ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 238ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return MoreContactUtils.shouldCollapse( 239ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getMimeType(), 240ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian buildDataString(context, mKind), 241ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian t.getMimeType(), 242ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian t.buildDataString(context, t.getDataKind())); 243ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 244ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 245ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 246ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Return the precedence for the the given {@link EditType#rawValue}, where lower numbers are 247ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * higher precedence. 248ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 249ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static int getTypePrecedence(DataKind kind, int rawValue) { 250ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian for (int i = 0; i < kind.typeList.size(); i++) { 251ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final EditType type = kind.typeList.get(i); 252ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (type.rawValue == rawValue) { 253ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return i; 254ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 255ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 256ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return Integer.MAX_VALUE; 257ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 258ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 259