1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.contacts.common.model.account; 18 19 import com.google.common.collect.Lists; 20 21 import com.android.contacts.common.R; 22 import com.android.contacts.common.model.dataitem.DataKind; 23 import com.android.contacts.common.util.CommonDateUtils; 24 25 import android.content.ContentValues; 26 import android.content.Context; 27 import android.provider.ContactsContract.CommonDataKinds.Email; 28 import android.provider.ContactsContract.CommonDataKinds.Event; 29 import android.provider.ContactsContract.CommonDataKinds.Phone; 30 import android.provider.ContactsContract.CommonDataKinds.Relation; 31 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 32 import android.util.Log; 33 34 import java.util.Locale; 35 36 /** 37 * A writable account type that can be used to support samsung contacts. This may not perfectly 38 * match Samsung's latest intended account schema. 39 * 40 * This is only used to partially support Samsung accounts. The DataKind labels & fields are 41 * setup to support the values used by Samsung. But, not everything in the Samsung account type is 42 * supported. The Samsung account type includes a "Message Type" mimetype that we have no intention 43 * of showing inside the Contact editor. Similarly, we don't handle the "Ringtone" mimetype here 44 * since managing ringtones is handled in a different flow. 45 */ 46 public class SamsungAccountType extends BaseAccountType { 47 private static final String TAG = "KnownExternalAccountType"; 48 private static final String ACCOUNT_TYPE_SAMSUNG = "com.osp.app.signin"; 49 50 public SamsungAccountType(Context context, String authenticatorPackageName, String type) { 51 this.accountType = type; 52 this.resourcePackageName = null; 53 this.syncAdapterPackageName = authenticatorPackageName; 54 55 try { 56 addDataKindStructuredName(context); 57 addDataKindDisplayName(context); 58 addDataKindPhoneticName(context); 59 addDataKindNickname(context); 60 addDataKindPhone(context); 61 addDataKindEmail(context); 62 addDataKindStructuredPostal(context); 63 addDataKindIm(context); 64 addDataKindOrganization(context); 65 addDataKindPhoto(context); 66 addDataKindNote(context); 67 addDataKindWebsite(context); 68 addDataKindGroupMembership(context); 69 addDataKindRelation(context); 70 addDataKindEvent(context); 71 72 mIsInitialized = true; 73 } catch (DefinitionException e) { 74 Log.e(TAG, "Problem building account type", e); 75 } 76 } 77 78 /** 79 * Returns {@code TRUE} if this is samsung's account type and Samsung hasn't bothered to 80 * define a contacts.xml to provide a more accurate definition than ours. 81 */ 82 public static boolean isSamsungAccountType(Context context, String type, 83 String packageName) { 84 return ACCOUNT_TYPE_SAMSUNG.equals(type) 85 && !ExternalAccountType.hasContactsXml(context, packageName); 86 } 87 88 @Override 89 protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException { 90 final DataKind kind = super.addDataKindStructuredPostal(context); 91 92 final boolean useJapaneseOrder = 93 Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage()); 94 kind.typeColumn = StructuredPostal.TYPE; 95 kind.typeList = Lists.newArrayList(); 96 kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK).setSpecificMax(1)); 97 kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME).setSpecificMax(1)); 98 kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER).setSpecificMax(1)); 99 100 kind.fieldList = Lists.newArrayList(); 101 if (useJapaneseOrder) { 102 kind.fieldList.add(new EditField(StructuredPostal.COUNTRY, 103 R.string.postal_country, FLAGS_POSTAL).setOptional(true)); 104 kind.fieldList.add(new EditField(StructuredPostal.POSTCODE, 105 R.string.postal_postcode, FLAGS_POSTAL)); 106 kind.fieldList.add(new EditField(StructuredPostal.REGION, 107 R.string.postal_region, FLAGS_POSTAL)); 108 kind.fieldList.add(new EditField(StructuredPostal.CITY, 109 R.string.postal_city,FLAGS_POSTAL)); 110 kind.fieldList.add(new EditField(StructuredPostal.STREET, 111 R.string.postal_street, FLAGS_POSTAL)); 112 } else { 113 kind.fieldList.add(new EditField(StructuredPostal.STREET, 114 R.string.postal_street, FLAGS_POSTAL)); 115 kind.fieldList.add(new EditField(StructuredPostal.CITY, 116 R.string.postal_city,FLAGS_POSTAL)); 117 kind.fieldList.add(new EditField(StructuredPostal.REGION, 118 R.string.postal_region, FLAGS_POSTAL)); 119 kind.fieldList.add(new EditField(StructuredPostal.POSTCODE, 120 R.string.postal_postcode, FLAGS_POSTAL)); 121 kind.fieldList.add(new EditField(StructuredPostal.COUNTRY, 122 R.string.postal_country, FLAGS_POSTAL).setOptional(true)); 123 } 124 125 return kind; 126 } 127 128 @Override 129 protected DataKind addDataKindPhone(Context context) throws DefinitionException { 130 final DataKind kind = super.addDataKindPhone(context); 131 132 kind.typeColumn = Phone.TYPE; 133 kind.typeList = Lists.newArrayList(); 134 kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE)); 135 kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); 136 kind.typeList.add(buildPhoneType(Phone.TYPE_WORK)); 137 kind.typeList.add(buildPhoneType(Phone.TYPE_MAIN)); 138 kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)); 139 kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)); 140 kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true)); 141 kind.typeList.add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true)); 142 kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER)); 143 kind.typeList.add(buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true) 144 .setCustomColumn(Phone.LABEL)); 145 146 kind.fieldList = Lists.newArrayList(); 147 kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE)); 148 149 return kind; 150 } 151 152 @Override 153 protected DataKind addDataKindEmail(Context context) throws DefinitionException { 154 final DataKind kind = super.addDataKindEmail(context); 155 156 kind.typeColumn = Email.TYPE; 157 kind.typeList = Lists.newArrayList(); 158 kind.typeList.add(buildEmailType(Email.TYPE_HOME)); 159 kind.typeList.add(buildEmailType(Email.TYPE_WORK)); 160 kind.typeList.add(buildEmailType(Email.TYPE_OTHER)); 161 kind.typeList.add(buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn( 162 Email.LABEL)); 163 164 kind.fieldList = Lists.newArrayList(); 165 kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL)); 166 167 return kind; 168 } 169 170 private DataKind addDataKindRelation(Context context) throws DefinitionException { 171 DataKind kind = addKind(new DataKind(Relation.CONTENT_ITEM_TYPE, 172 R.string.relationLabelsGroup, 160, true)); 173 kind.actionHeader = new RelationActionInflater(); 174 kind.actionBody = new SimpleInflater(Relation.NAME); 175 176 kind.typeColumn = Relation.TYPE; 177 kind.typeList = Lists.newArrayList(); 178 kind.typeList.add(buildRelationType(Relation.TYPE_ASSISTANT)); 179 kind.typeList.add(buildRelationType(Relation.TYPE_BROTHER)); 180 kind.typeList.add(buildRelationType(Relation.TYPE_CHILD)); 181 kind.typeList.add(buildRelationType(Relation.TYPE_DOMESTIC_PARTNER)); 182 kind.typeList.add(buildRelationType(Relation.TYPE_FATHER)); 183 kind.typeList.add(buildRelationType(Relation.TYPE_FRIEND)); 184 kind.typeList.add(buildRelationType(Relation.TYPE_MANAGER)); 185 kind.typeList.add(buildRelationType(Relation.TYPE_MOTHER)); 186 kind.typeList.add(buildRelationType(Relation.TYPE_PARENT)); 187 kind.typeList.add(buildRelationType(Relation.TYPE_PARTNER)); 188 kind.typeList.add(buildRelationType(Relation.TYPE_REFERRED_BY)); 189 kind.typeList.add(buildRelationType(Relation.TYPE_RELATIVE)); 190 kind.typeList.add(buildRelationType(Relation.TYPE_SISTER)); 191 kind.typeList.add(buildRelationType(Relation.TYPE_SPOUSE)); 192 kind.typeList.add(buildRelationType(Relation.TYPE_CUSTOM).setSecondary(true) 193 .setCustomColumn(Relation.LABEL)); 194 195 kind.defaultValues = new ContentValues(); 196 kind.defaultValues.put(Relation.TYPE, Relation.TYPE_SPOUSE); 197 198 kind.fieldList = Lists.newArrayList(); 199 kind.fieldList.add(new EditField(Relation.DATA, R.string.relationLabelsGroup, 200 FLAGS_RELATION)); 201 202 return kind; 203 } 204 205 private DataKind addDataKindEvent(Context context) throws DefinitionException { 206 DataKind kind = addKind(new DataKind(Event.CONTENT_ITEM_TYPE, 207 R.string.eventLabelsGroup, 150, true)); 208 kind.actionHeader = new EventActionInflater(); 209 kind.actionBody = new SimpleInflater(Event.START_DATE); 210 211 kind.typeColumn = Event.TYPE; 212 kind.typeList = Lists.newArrayList(); 213 kind.dateFormatWithoutYear = CommonDateUtils.NO_YEAR_DATE_FORMAT; 214 kind.dateFormatWithYear = CommonDateUtils.FULL_DATE_FORMAT; 215 kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, true).setSpecificMax(1)); 216 kind.typeList.add(buildEventType(Event.TYPE_ANNIVERSARY, false)); 217 kind.typeList.add(buildEventType(Event.TYPE_OTHER, false)); 218 kind.typeList.add(buildEventType(Event.TYPE_CUSTOM, false).setSecondary(true) 219 .setCustomColumn(Event.LABEL)); 220 221 kind.defaultValues = new ContentValues(); 222 kind.defaultValues.put(Event.TYPE, Event.TYPE_BIRTHDAY); 223 224 kind.fieldList = Lists.newArrayList(); 225 kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT)); 226 227 return kind; 228 } 229 230 @Override 231 public boolean isGroupMembershipEditable() { 232 return true; 233 } 234 235 @Override 236 public boolean areContactsWritable() { 237 return true; 238 } 239 } 240