1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2009 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.account; 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.Phone; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Relation; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.util.Log; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.R; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.model.dataitem.DataKind; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.util.CommonDateUtils; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.ArrayList; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.Collections; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.List; 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class GoogleAccountType extends BaseAccountType { 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * The package name that we should load contacts.xml from and rely on to handle G+ account 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * actions. Even though this points to gms, in some cases gms will still hand off responsibility 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * to the G+ app. 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static final String PLUS_EXTENSION_PACKAGE_NAME = "com.google.android.gms"; 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static final String ACCOUNT_TYPE = "com.google"; 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String TAG = "GoogleAccountType"; 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final List<String> mExtensionPackages = 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new ArrayList<>(Collections.singletonList(PLUS_EXTENSION_PACKAGE_NAME)); 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public GoogleAccountType(Context context, String authenticatorPackageName) { 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian this.accountType = ACCOUNT_TYPE; 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian this.resourcePackageName = null; 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian this.syncAdapterPackageName = authenticatorPackageName; 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian try { 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindStructuredName(context); 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindDisplayName(context); 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindPhoneticName(context); 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindNickname(context); 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindPhone(context); 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindEmail(context); 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindStructuredPostal(context); 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindIm(context); 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindOrganization(context); 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindPhoto(context); 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindNote(context); 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindWebsite(context); 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindSipAddress(context); 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindGroupMembership(context); 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindRelation(context); 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addDataKindEvent(context); 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsInitialized = true; 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } catch (DefinitionException e) { 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Log.e(TAG, "Problem building account type", e); 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public List<String> getExtensionPackageNames() { 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mExtensionPackages; 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected DataKind addDataKindPhone(Context context) throws DefinitionException { 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final DataKind kind = super.addDataKindPhone(context); 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeColumn = Phone.TYPE; 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList = new ArrayList<>(); 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE)); 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_WORK)); 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_MAIN)); 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)); 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)); 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true)); 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER)); 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add( 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Phone.LABEL)); 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList = new ArrayList<>(); 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE)); 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return kind; 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected DataKind addDataKindEmail(Context context) throws DefinitionException { 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final DataKind kind = super.addDataKindEmail(context); 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeColumn = Email.TYPE; 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList = new ArrayList<>(); 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildEmailType(Email.TYPE_HOME)); 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildEmailType(Email.TYPE_WORK)); 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildEmailType(Email.TYPE_OTHER)); 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add( 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Email.LABEL)); 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList = new ArrayList<>(); 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL)); 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return kind; 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private DataKind addDataKindRelation(Context context) throws DefinitionException { 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian DataKind kind = 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addKind( 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new DataKind( 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Relation.CONTENT_ITEM_TYPE, 127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian R.string.relationLabelsGroup, 128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Weight.RELATIONSHIP, 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian true)); 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.actionHeader = new RelationActionInflater(); 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.actionBody = new SimpleInflater(Relation.NAME); 132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeColumn = Relation.TYPE; 134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList = new ArrayList<>(); 135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_ASSISTANT)); 136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_BROTHER)); 137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_CHILD)); 138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_DOMESTIC_PARTNER)); 139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_FATHER)); 140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_FRIEND)); 141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_MANAGER)); 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_MOTHER)); 143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_PARENT)); 144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_PARTNER)); 145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_REFERRED_BY)); 146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_RELATIVE)); 147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_SISTER)); 148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildRelationType(Relation.TYPE_SPOUSE)); 149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add( 150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian buildRelationType(Relation.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Relation.LABEL)); 151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.defaultValues = new ContentValues(); 153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.defaultValues.put(Relation.TYPE, Relation.TYPE_SPOUSE); 154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList = new ArrayList<>(); 156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList.add(new EditField(Relation.DATA, R.string.relationLabelsGroup, FLAGS_RELATION)); 157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return kind; 159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private DataKind addDataKindEvent(Context context) throws DefinitionException { 162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian DataKind kind = 163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian addKind( 164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new DataKind(Event.CONTENT_ITEM_TYPE, R.string.eventLabelsGroup, Weight.EVENT, true)); 165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.actionHeader = new EventActionInflater(); 166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.actionBody = new SimpleInflater(Event.START_DATE); 167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeColumn = Event.TYPE; 169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList = new ArrayList<>(); 170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.dateFormatWithoutYear = CommonDateUtils.NO_YEAR_DATE_FORMAT; 171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.dateFormatWithYear = CommonDateUtils.FULL_DATE_FORMAT; 172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, true).setSpecificMax(1)); 173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildEventType(Event.TYPE_ANNIVERSARY, false)); 174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add(buildEventType(Event.TYPE_OTHER, false)); 175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.typeList.add( 176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian buildEventType(Event.TYPE_CUSTOM, false).setSecondary(true).setCustomColumn(Event.LABEL)); 177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.defaultValues = new ContentValues(); 179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.defaultValues.put(Event.TYPE, Event.TYPE_BIRTHDAY); 180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList = new ArrayList<>(); 182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT)); 183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return kind; 185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean isGroupMembershipEditable() { 189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return true; 190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 191ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public boolean areContactsWritable() { 194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return true; 195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String getViewContactNotifyServiceClassName() { 199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return "com.google.android.syncadapters.contacts." + "SyncHighResPhotoIntentService"; 200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public String getViewContactNotifyServicePackageName() { 204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return "com.google.android.syncadapters.contacts"; 205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 207