ExchangeAccountType.java revision 851222a96b5d68602fb361ea3527101e893f67e3
1/*
2 * Copyright (C) 2009 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
17package com.android.contacts.model.account;
18
19import android.content.ContentValues;
20import android.content.Context;
21import android.provider.ContactsContract.CommonDataKinds.Email;
22import android.provider.ContactsContract.CommonDataKinds.Event;
23import android.provider.ContactsContract.CommonDataKinds.Im;
24import android.provider.ContactsContract.CommonDataKinds.Nickname;
25import android.provider.ContactsContract.CommonDataKinds.Note;
26import android.provider.ContactsContract.CommonDataKinds.Organization;
27import android.provider.ContactsContract.CommonDataKinds.Phone;
28import android.provider.ContactsContract.CommonDataKinds.Photo;
29import android.provider.ContactsContract.CommonDataKinds.StructuredName;
30import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
31import android.provider.ContactsContract.CommonDataKinds.Website;
32import android.util.Log;
33
34import com.android.contacts.R;
35import com.android.contacts.model.dataitem.DataKind;
36import com.android.contacts.util.DateUtils;
37import com.google.common.collect.Lists;
38
39import java.util.Locale;
40
41public class ExchangeAccountType extends BaseAccountType {
42    private static final String TAG = "ExchangeAccountType";
43
44    public static final String ACCOUNT_TYPE = "com.android.exchange";
45
46    public ExchangeAccountType(Context context, String authenticatorPackageName) {
47        this.accountType = ACCOUNT_TYPE;
48        this.resourcePackageName = null;
49        this.syncAdapterPackageName = authenticatorPackageName;
50
51        try {
52            addDataKindStructuredName(context);
53            addDataKindDisplayName(context);
54            addDataKindPhoneticName(context);
55            addDataKindNickname(context);
56            addDataKindPhone(context);
57            addDataKindEmail(context);
58            addDataKindStructuredPostal(context);
59            addDataKindIm(context);
60            addDataKindOrganization(context);
61            addDataKindPhoto(context);
62            addDataKindNote(context);
63            addDataKindEvent(context);
64            addDataKindWebsite(context);
65            addDataKindGroupMembership(context);
66
67            mIsInitialized = true;
68        } catch (DefinitionException e) {
69            Log.e(TAG, "Problem building account type", e);
70        }
71    }
72
73    @Override
74    protected DataKind addDataKindStructuredName(Context context) throws DefinitionException {
75        DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
76                R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view));
77        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
78        kind.actionBody = new SimpleInflater(Nickname.NAME);
79
80        kind.typeOverallMax = 1;
81
82        kind.fieldList = Lists.newArrayList();
83        kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
84                FLAGS_PERSON_NAME).setOptional(true));
85        kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
86                R.string.name_family, FLAGS_PERSON_NAME));
87        kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
88                R.string.name_middle, FLAGS_PERSON_NAME));
89        kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
90                R.string.name_given, FLAGS_PERSON_NAME));
91        kind.fieldList.add(new EditField(StructuredName.SUFFIX,
92                R.string.name_suffix, FLAGS_PERSON_NAME));
93
94        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
95                R.string.name_phonetic_family, FLAGS_PHONETIC));
96        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
97                R.string.name_phonetic_given, FLAGS_PHONETIC));
98
99        return kind;
100    }
101
102    @Override
103    protected DataKind addDataKindDisplayName(Context context) throws DefinitionException {
104        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME,
105                R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view));
106
107        boolean displayOrderPrimary =
108                context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
109        kind.typeOverallMax = 1;
110
111        kind.fieldList = Lists.newArrayList();
112        kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
113                FLAGS_PERSON_NAME).setOptional(true));
114        if (!displayOrderPrimary) {
115            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
116                    R.string.name_family, FLAGS_PERSON_NAME));
117            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
118                    R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
119            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
120                    R.string.name_given, FLAGS_PERSON_NAME));
121        } else {
122            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
123                    R.string.name_given, FLAGS_PERSON_NAME));
124            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
125                    R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
126            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
127                    R.string.name_family, FLAGS_PERSON_NAME));
128        }
129        kind.fieldList.add(new EditField(StructuredName.SUFFIX,
130                R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
131
132        return kind;
133    }
134
135    @Override
136    protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException {
137        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME,
138                R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view));
139        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
140        kind.actionBody = new SimpleInflater(Nickname.NAME);
141
142        kind.typeOverallMax = 1;
143
144        kind.fieldList = Lists.newArrayList();
145        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
146                R.string.name_phonetic_family, FLAGS_PHONETIC));
147        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
148                R.string.name_phonetic_given, FLAGS_PHONETIC));
149
150        return kind;
151    }
152
153    @Override
154    protected DataKind addDataKindNickname(Context context) throws DefinitionException {
155        final DataKind kind = super.addDataKindNickname(context);
156
157        kind.typeOverallMax = 1;
158
159        kind.fieldList = Lists.newArrayList();
160        kind.fieldList.add(new EditField(Nickname.NAME, R.string.nicknameLabelsGroup,
161                FLAGS_PERSON_NAME));
162
163        return kind;
164    }
165
166    @Override
167    protected DataKind addDataKindPhone(Context context) throws DefinitionException {
168        final DataKind kind = super.addDataKindPhone(context);
169
170        kind.typeColumn = Phone.TYPE;
171        kind.typeList = Lists.newArrayList();
172        kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE).setSpecificMax(1));
173        kind.typeList.add(buildPhoneType(Phone.TYPE_HOME).setSpecificMax(2));
174        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK).setSpecificMax(2));
175        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)
176                .setSpecificMax(1));
177        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)
178                .setSpecificMax(1));
179        kind.typeList
180                .add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true).setSpecificMax(1));
181        kind.typeList.add(buildPhoneType(Phone.TYPE_CAR).setSecondary(true).setSpecificMax(1));
182        kind.typeList.add(buildPhoneType(Phone.TYPE_COMPANY_MAIN).setSecondary(true)
183                .setSpecificMax(1));
184        kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true).setSpecificMax(1));
185        kind.typeList
186                .add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true).setSpecificMax(1));
187        kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true)
188                .setSpecificMax(1));
189
190        kind.fieldList = Lists.newArrayList();
191        kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
192
193        return kind;
194    }
195
196    @Override
197    protected DataKind addDataKindEmail(Context context) throws DefinitionException {
198        final DataKind kind = super.addDataKindEmail(context);
199
200        kind.typeOverallMax = 3;
201
202        kind.fieldList = Lists.newArrayList();
203        kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
204
205        return kind;
206    }
207
208    @Override
209    protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException {
210        final DataKind kind = super.addDataKindStructuredPostal(context);
211
212        final boolean useJapaneseOrder =
213            Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage());
214        kind.typeColumn = StructuredPostal.TYPE;
215        kind.typeList = Lists.newArrayList();
216        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK).setSpecificMax(1));
217        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME).setSpecificMax(1));
218        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER).setSpecificMax(1));
219
220        kind.fieldList = Lists.newArrayList();
221        if (useJapaneseOrder) {
222            kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
223                    R.string.postal_country, FLAGS_POSTAL).setOptional(true));
224            kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
225                    R.string.postal_postcode, FLAGS_POSTAL));
226            kind.fieldList.add(new EditField(StructuredPostal.REGION,
227                    R.string.postal_region, FLAGS_POSTAL));
228            kind.fieldList.add(new EditField(StructuredPostal.CITY,
229                    R.string.postal_city,FLAGS_POSTAL));
230            kind.fieldList.add(new EditField(StructuredPostal.STREET,
231                    R.string.postal_street, FLAGS_POSTAL));
232        } else {
233            kind.fieldList.add(new EditField(StructuredPostal.STREET,
234                    R.string.postal_street, FLAGS_POSTAL));
235            kind.fieldList.add(new EditField(StructuredPostal.CITY,
236                    R.string.postal_city,FLAGS_POSTAL));
237            kind.fieldList.add(new EditField(StructuredPostal.REGION,
238                    R.string.postal_region, FLAGS_POSTAL));
239            kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
240                    R.string.postal_postcode, FLAGS_POSTAL));
241            kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
242                    R.string.postal_country, FLAGS_POSTAL).setOptional(true));
243        }
244
245        return kind;
246    }
247
248    @Override
249    protected DataKind addDataKindIm(Context context) throws DefinitionException {
250        final DataKind kind = super.addDataKindIm(context);
251
252        // Types are not supported for IM. There can be 3 IMs, but OWA only shows only the first
253        kind.typeOverallMax = 3;
254
255        kind.defaultValues = new ContentValues();
256        kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER);
257
258        kind.fieldList = Lists.newArrayList();
259        kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
260
261        return kind;
262    }
263
264    @Override
265    protected DataKind addDataKindOrganization(Context context) throws DefinitionException {
266        final DataKind kind = super.addDataKindOrganization(context);
267
268        kind.typeOverallMax = 1;
269
270        kind.fieldList = Lists.newArrayList();
271        kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
272                FLAGS_GENERIC_NAME));
273        kind.fieldList.add(new EditField(Organization.TITLE, R.string.ghostData_title,
274                FLAGS_GENERIC_NAME));
275
276        return kind;
277    }
278
279    @Override
280    protected DataKind addDataKindPhoto(Context context) throws DefinitionException {
281        final DataKind kind = super.addDataKindPhoto(context);
282
283        kind.typeOverallMax = 1;
284
285        kind.fieldList = Lists.newArrayList();
286        kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1));
287
288        return kind;
289    }
290
291    @Override
292    protected DataKind addDataKindNote(Context context) throws DefinitionException {
293        final DataKind kind = super.addDataKindNote(context);
294
295        kind.fieldList = Lists.newArrayList();
296        kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
297
298        return kind;
299    }
300
301    protected DataKind addDataKindEvent(Context context) throws DefinitionException {
302        DataKind kind = addKind(
303                new DataKind(Event.CONTENT_ITEM_TYPE, R.string.eventLabelsGroup, 150, true,
304                R.layout.event_field_editor_view));
305        kind.actionHeader = new EventActionInflater();
306        kind.actionBody = new SimpleInflater(Event.START_DATE);
307
308        kind.typeOverallMax = 1;
309
310        kind.typeColumn = Event.TYPE;
311        kind.typeList = Lists.newArrayList();
312        kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, false).setSpecificMax(1));
313
314        kind.dateFormatWithYear = DateUtils.DATE_AND_TIME_FORMAT;
315
316        kind.fieldList = Lists.newArrayList();
317        kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT));
318
319        return kind;
320    }
321
322    @Override
323    protected DataKind addDataKindWebsite(Context context) throws DefinitionException {
324        final DataKind kind = super.addDataKindWebsite(context);
325
326        kind.typeOverallMax = 1;
327
328        kind.fieldList = Lists.newArrayList();
329        kind.fieldList.add(new EditField(Website.URL, R.string.websiteLabelsGroup, FLAGS_WEBSITE));
330
331        return kind;
332    }
333
334    @Override
335    public boolean isGroupMembershipEditable() {
336        return true;
337    }
338
339    @Override
340    public boolean areContactsWritable() {
341        return true;
342    }
343}
344