/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.contacts.model; import com.android.contacts.R; import com.android.contacts.model.AccountType.DefinitionException; import com.android.contacts.util.DateUtils; import com.google.android.collect.Lists; import android.content.ContentValues; import android.content.Context; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Event; import android.provider.ContactsContract.CommonDataKinds.Im; import android.provider.ContactsContract.CommonDataKinds.Nickname; import android.provider.ContactsContract.CommonDataKinds.Note; import android.provider.ContactsContract.CommonDataKinds.Organization; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.Website; import android.util.Log; import java.util.Locale; public class ExchangeAccountType extends BaseAccountType { private static final String TAG = "ExchangeAccountType"; public static final String ACCOUNT_TYPE = "com.android.exchange"; public ExchangeAccountType(Context context, String resPackageName) { this.accountType = ACCOUNT_TYPE; this.resPackageName = null; this.summaryResPackageName = resPackageName; try { addDataKindStructuredName(context); addDataKindDisplayName(context); addDataKindPhoneticName(context); addDataKindNickname(context); addDataKindPhone(context); addDataKindEmail(context); addDataKindStructuredPostal(context); addDataKindIm(context); addDataKindOrganization(context); addDataKindPhoto(context); addDataKindNote(context); addDataKindEvent(context); addDataKindWebsite(context); addDataKindGroupMembership(context); mIsInitialized = true; } catch (DefinitionException e) { Log.e(TAG, "Problem building account type", e); } } @Override protected DataKind addDataKindStructuredName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE, R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix, FLAGS_PERSON_NAME).setOptional(true)); kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family, FLAGS_PERSON_NAME)); kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle, FLAGS_PERSON_NAME)); kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given, FLAGS_PERSON_NAME)); kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix, FLAGS_PERSON_NAME)); kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME, R.string.name_phonetic_family, FLAGS_PHONETIC)); kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME, R.string.name_phonetic_given, FLAGS_PHONETIC)); return kind; } @Override protected DataKind addDataKindDisplayName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME, R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view)); boolean displayOrderPrimary = context.getResources().getBoolean(R.bool.config_editor_field_order_primary); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix, FLAGS_PERSON_NAME).setOptional(true)); if (!displayOrderPrimary) { kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family, FLAGS_PERSON_NAME)); kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true)); kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given, FLAGS_PERSON_NAME)); } else { kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given, FLAGS_PERSON_NAME)); kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true)); kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family, FLAGS_PERSON_NAME)); } kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true)); return kind; } @Override protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME, R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME, R.string.name_phonetic_family, FLAGS_PHONETIC)); kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME, R.string.name_phonetic_given, FLAGS_PHONETIC)); return kind; } @Override protected DataKind addDataKindNickname(Context context) throws DefinitionException { final DataKind kind = super.addDataKindNickname(context); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Nickname.NAME, R.string.nicknameLabelsGroup, FLAGS_PERSON_NAME)); return kind; } @Override protected DataKind addDataKindPhone(Context context) throws DefinitionException { final DataKind kind = super.addDataKindPhone(context); kind.typeColumn = Phone.TYPE; kind.typeList = Lists.newArrayList(); kind.typeList.add(buildPhoneType(Phone.TYPE_HOME).setSpecificMax(2)); kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE).setSpecificMax(1)); kind.typeList.add(buildPhoneType(Phone.TYPE_WORK).setSpecificMax(2)); kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true) .setSpecificMax(1)); kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true) .setSpecificMax(1)); kind.typeList .add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true).setSpecificMax(1)); kind.typeList.add(buildPhoneType(Phone.TYPE_CAR).setSecondary(true).setSpecificMax(1)); kind.typeList.add(buildPhoneType(Phone.TYPE_COMPANY_MAIN).setSecondary(true) .setSpecificMax(1)); kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true).setSpecificMax(1)); kind.typeList .add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true).setSpecificMax(1)); kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true) .setSpecificMax(1)); kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE)); return kind; } @Override protected DataKind addDataKindEmail(Context context) throws DefinitionException { final DataKind kind = super.addDataKindEmail(context); kind.typeOverallMax = 3; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL)); return kind; } @Override protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException { final DataKind kind = super.addDataKindStructuredPostal(context); final boolean useJapaneseOrder = Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage()); kind.typeColumn = StructuredPostal.TYPE; kind.typeList = Lists.newArrayList(); kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK).setSpecificMax(1)); kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME).setSpecificMax(1)); kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER).setSpecificMax(1)); kind.fieldList = Lists.newArrayList(); if (useJapaneseOrder) { kind.fieldList.add(new EditField(StructuredPostal.COUNTRY, R.string.postal_country, FLAGS_POSTAL).setOptional(true)); kind.fieldList.add(new EditField(StructuredPostal.POSTCODE, R.string.postal_postcode, FLAGS_POSTAL)); kind.fieldList.add(new EditField(StructuredPostal.REGION, R.string.postal_region, FLAGS_POSTAL)); kind.fieldList.add(new EditField(StructuredPostal.CITY, R.string.postal_city,FLAGS_POSTAL)); kind.fieldList.add(new EditField(StructuredPostal.STREET, R.string.postal_street, FLAGS_POSTAL)); } else { kind.fieldList.add(new EditField(StructuredPostal.STREET, R.string.postal_street, FLAGS_POSTAL)); kind.fieldList.add(new EditField(StructuredPostal.CITY, R.string.postal_city,FLAGS_POSTAL)); kind.fieldList.add(new EditField(StructuredPostal.REGION, R.string.postal_region, FLAGS_POSTAL)); kind.fieldList.add(new EditField(StructuredPostal.POSTCODE, R.string.postal_postcode, FLAGS_POSTAL)); kind.fieldList.add(new EditField(StructuredPostal.COUNTRY, R.string.postal_country, FLAGS_POSTAL).setOptional(true)); } return kind; } @Override protected DataKind addDataKindIm(Context context) throws DefinitionException { final DataKind kind = super.addDataKindIm(context); // Types are not supported for IM. There can be 3 IMs, but OWA only shows only the first kind.typeOverallMax = 3; kind.defaultValues = new ContentValues(); kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER); kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL)); return kind; } @Override protected DataKind addDataKindOrganization(Context context) throws DefinitionException { final DataKind kind = super.addDataKindOrganization(context); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company, FLAGS_GENERIC_NAME)); kind.fieldList.add(new EditField(Organization.TITLE, R.string.ghostData_title, FLAGS_GENERIC_NAME)); return kind; } @Override protected DataKind addDataKindPhoto(Context context) throws DefinitionException { final DataKind kind = super.addDataKindPhoto(context); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1)); return kind; } @Override protected DataKind addDataKindNote(Context context) throws DefinitionException { final DataKind kind = super.addDataKindNote(context); kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE)); return kind; } protected DataKind addDataKindEvent(Context context) throws DefinitionException { DataKind kind = addKind( new DataKind(Event.CONTENT_ITEM_TYPE, R.string.eventLabelsGroup, 150, true, R.layout.event_field_editor_view)); kind.actionHeader = new EventActionInflater(); kind.actionBody = new SimpleInflater(Event.START_DATE); kind.typeOverallMax = 1; kind.typeColumn = Event.TYPE; kind.typeList = Lists.newArrayList(); kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, false).setSpecificMax(1)); kind.dateFormatWithYear = DateUtils.DATE_AND_TIME_FORMAT; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT)); return kind; } @Override protected DataKind addDataKindWebsite(Context context) throws DefinitionException { final DataKind kind = super.addDataKindWebsite(context); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Website.URL, R.string.websiteLabelsGroup, FLAGS_WEBSITE)); return kind; } @Override public boolean isGroupMembershipEditable() { return true; } @Override public boolean areContactsWritable() { return true; } }