BaseAccountType.java revision 27e78563c1f04490ffa8b850a0442715482d1f2c
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;
18
19import com.android.contacts.R;
20import com.google.android.collect.Lists;
21
22import android.content.ContentValues;
23import android.content.Context;
24import android.content.res.Resources;
25import android.database.Cursor;
26import android.provider.ContactsContract.CommonDataKinds.BaseTypes;
27import android.provider.ContactsContract.CommonDataKinds.Email;
28import android.provider.ContactsContract.CommonDataKinds.Event;
29import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
30import android.provider.ContactsContract.CommonDataKinds.Im;
31import android.provider.ContactsContract.CommonDataKinds.Nickname;
32import android.provider.ContactsContract.CommonDataKinds.Note;
33import android.provider.ContactsContract.CommonDataKinds.Organization;
34import android.provider.ContactsContract.CommonDataKinds.Phone;
35import android.provider.ContactsContract.CommonDataKinds.Photo;
36import android.provider.ContactsContract.CommonDataKinds.Relation;
37import android.provider.ContactsContract.CommonDataKinds.SipAddress;
38import android.provider.ContactsContract.CommonDataKinds.StructuredName;
39import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
40import android.provider.ContactsContract.CommonDataKinds.Website;
41import android.view.inputmethod.EditorInfo;
42
43public class BaseAccountType extends AccountType {
44    protected static final int FLAGS_PHONE = EditorInfo.TYPE_CLASS_PHONE;
45    protected static final int FLAGS_EMAIL = EditorInfo.TYPE_CLASS_TEXT
46            | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
47    protected static final int FLAGS_PERSON_NAME = EditorInfo.TYPE_CLASS_TEXT
48            | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS | EditorInfo.TYPE_TEXT_VARIATION_PERSON_NAME;
49    protected static final int FLAGS_PHONETIC = EditorInfo.TYPE_CLASS_TEXT
50            | EditorInfo.TYPE_TEXT_VARIATION_PHONETIC;
51    protected static final int FLAGS_GENERIC_NAME = EditorInfo.TYPE_CLASS_TEXT
52            | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS;
53    protected static final int FLAGS_NOTE = EditorInfo.TYPE_CLASS_TEXT
54            | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE;
55    protected static final int FLAGS_EVENT = EditorInfo.TYPE_CLASS_TEXT;
56    protected static final int FLAGS_WEBSITE = EditorInfo.TYPE_CLASS_TEXT
57            | EditorInfo.TYPE_TEXT_VARIATION_URI;
58    protected static final int FLAGS_POSTAL = EditorInfo.TYPE_CLASS_TEXT
59            | EditorInfo.TYPE_TEXT_VARIATION_POSTAL_ADDRESS | EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS
60            | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE;
61    protected static final int FLAGS_SIP_ADDRESS = EditorInfo.TYPE_CLASS_TEXT
62            | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;  // since SIP addresses have the same
63                                                             // basic format as email addresses
64
65    public BaseAccountType() {
66        this.accountType = null;
67        this.titleRes = R.string.account_phone;
68        this.iconRes = R.mipmap.ic_launcher_contacts;
69    }
70
71    protected EditType buildPhoneType(int type) {
72        return new EditType(type, Phone.getTypeLabelResource(type))
73                .setUnspecifiedType(type == Phone.TYPE_OTHER);
74    }
75
76    protected EditType buildEmailType(int type) {
77        return new EditType(type, Email.getTypeLabelResource(type))
78                .setUnspecifiedType(type == Email.TYPE_OTHER);
79    }
80
81    protected EditType buildPostalType(int type) {
82        return new EditType(type, StructuredPostal.getTypeLabelResource(type))
83                .setUnspecifiedType(type == StructuredPostal.TYPE_OTHER);
84    }
85
86    protected EditType buildImType(int type) {
87        return new EditType(type, Im.getProtocolLabelResource(type))
88                .setUnspecifiedType(type == Im.TYPE_OTHER);
89    }
90
91    protected EditType buildEventType(int type, boolean yearOptional) {
92        return new EventEditType(type, Event.getTypeResource(type)).setYearOptional(yearOptional)
93                .setUnspecifiedType(type == Event.TYPE_OTHER);
94    }
95
96    protected EditType buildRelationType(int type) {
97        return new EditType(type, Relation.getTypeLabelResource(type));
98    }
99
100    protected DataKind addDataKindStructuredName(Context context) {
101        DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
102                R.string.nameLabelsGroup, -1, -1, true));
103        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
104        kind.actionBody = new SimpleInflater(Nickname.NAME);
105
106        kind.fieldList = Lists.newArrayList();
107        kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
108                R.string.full_name, FLAGS_PERSON_NAME).setShortForm(true));
109
110        boolean displayOrderPrimary =
111                context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
112
113        if (!displayOrderPrimary) {
114            kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
115                    FLAGS_PERSON_NAME).setLongForm(true));
116            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
117                    FLAGS_PERSON_NAME).setLongForm(true));
118            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
119                    FLAGS_PERSON_NAME).setLongForm(true));
120            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
121                    FLAGS_PERSON_NAME).setLongForm(true));
122            kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
123                    FLAGS_PERSON_NAME).setLongForm(true));
124        } else {
125            kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
126                    FLAGS_PERSON_NAME).setLongForm(true));
127            kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
128                    FLAGS_PERSON_NAME).setLongForm(true));
129            kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
130                    FLAGS_PERSON_NAME).setLongForm(true));
131            kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
132                    FLAGS_PERSON_NAME).setLongForm(true));
133            kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
134                    FLAGS_PERSON_NAME).setLongForm(true));
135        }
136        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
137                R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true));
138        kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
139                R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true));
140        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
141                R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true));
142
143        return kind;
144    }
145
146    protected DataKind addDataKindNickname(Context context) {
147        DataKind kind = addKind(new DataKind(Nickname.CONTENT_ITEM_TYPE,
148                    R.string.nicknameLabelsGroup, -1, 115, true));
149
150        kind.isList = false;
151        kind.actionHeader = new SimpleInflater(R.string.nicknameLabelsGroup);
152        kind.actionBody = new SimpleInflater(Nickname.NAME);
153        kind.defaultValues = new ContentValues();
154        kind.defaultValues.put(Nickname.TYPE, Nickname.TYPE_DEFAULT);
155
156        kind.fieldList = Lists.newArrayList();
157        kind.fieldList.add(new EditField(Nickname.NAME, R.string.nicknameLabelsGroup,
158                FLAGS_PERSON_NAME));
159
160        return kind;
161    }
162
163    protected DataKind addDataKindPhone(Context context) {
164        DataKind kind = addKind(new DataKind(Phone.CONTENT_ITEM_TYPE, R.string.phoneLabelsGroup,
165                android.R.drawable.sym_action_call, 10, true));
166        kind.iconAltRes = R.drawable.sym_action_sms;
167        kind.actionHeader = new PhoneActionInflater();
168        kind.actionAltHeader = new PhoneActionAltInflater();
169        kind.actionBody = new SimpleInflater(Phone.NUMBER);
170        kind.typeColumn = Phone.TYPE;
171        kind.typeList = Lists.newArrayList();
172        kind.typeList.add(buildPhoneType(Phone.TYPE_HOME));
173        kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE));
174        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK));
175        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true));
176        kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true));
177        kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true));
178        kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER));
179        kind.typeList.add(
180                buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Phone.LABEL));
181        kind.typeList.add(buildPhoneType(Phone.TYPE_CALLBACK).setSecondary(true));
182        kind.typeList.add(buildPhoneType(Phone.TYPE_CAR).setSecondary(true));
183        kind.typeList.add(buildPhoneType(Phone.TYPE_COMPANY_MAIN).setSecondary(true));
184        kind.typeList.add(buildPhoneType(Phone.TYPE_ISDN).setSecondary(true));
185        kind.typeList.add(buildPhoneType(Phone.TYPE_MAIN).setSecondary(true));
186        kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER_FAX).setSecondary(true));
187        kind.typeList.add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true));
188        kind.typeList.add(buildPhoneType(Phone.TYPE_TELEX).setSecondary(true));
189        kind.typeList.add(buildPhoneType(Phone.TYPE_TTY_TDD).setSecondary(true));
190        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_MOBILE).setSecondary(true));
191        kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_PAGER).setSecondary(true));
192        kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true).setCustomColumn(
193                Phone.LABEL));
194        kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true));
195
196        kind.fieldList = Lists.newArrayList();
197        kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
198
199        return kind;
200    }
201
202    protected DataKind addDataKindEmail(Context context) {
203        DataKind kind = addKind(new DataKind(Email.CONTENT_ITEM_TYPE, R.string.emailLabelsGroup,
204                R.drawable.sym_action_email_holo_light, 15, true));
205        kind.actionHeader = new EmailActionInflater();
206        kind.actionBody = new SimpleInflater(Email.DATA);
207        kind.typeColumn = Email.TYPE;
208        kind.typeList = Lists.newArrayList();
209        kind.typeList.add(buildEmailType(Email.TYPE_HOME));
210        kind.typeList.add(buildEmailType(Email.TYPE_WORK));
211        kind.typeList.add(buildEmailType(Email.TYPE_OTHER));
212        kind.typeList.add(buildEmailType(Email.TYPE_MOBILE));
213        kind.typeList.add(
214                buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Email.LABEL));
215
216        kind.fieldList = Lists.newArrayList();
217        kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
218
219        return kind;
220    }
221
222    protected DataKind addDataKindStructuredPostal(Context context) {
223        DataKind kind = addKind(new DataKind(StructuredPostal.CONTENT_ITEM_TYPE,
224                R.string.postalLabelsGroup, R.drawable.sym_action_show_map_holo_light, 25,
225                true));
226        kind.actionHeader = new PostalActionInflater();
227        kind.actionBody = new SimpleInflater(StructuredPostal.FORMATTED_ADDRESS);
228        kind.typeColumn = StructuredPostal.TYPE;
229        kind.typeList = Lists.newArrayList();
230        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME));
231        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK));
232        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER));
233        kind.typeList.add(buildPostalType(StructuredPostal.TYPE_CUSTOM).setSecondary(true)
234                .setCustomColumn(StructuredPostal.LABEL));
235
236        kind.fieldList = Lists.newArrayList();
237        kind.fieldList.add(
238                new EditField(StructuredPostal.FORMATTED_ADDRESS, R.string.postal_address,
239                        FLAGS_POSTAL).setMinLines(3));
240
241        return kind;
242    }
243
244    protected DataKind addDataKindIm(Context context) {
245        DataKind kind = addKind(new DataKind(Im.CONTENT_ITEM_TYPE, R.string.imLabelsGroup,
246                    R.drawable.sym_action_talk_holo_light, 20, true));
247        kind.actionHeader = new ImActionInflater();
248        kind.actionBody = new SimpleInflater(Im.DATA);
249
250        // NOTE: even though a traditional "type" exists, for editing
251        // purposes we're using the protocol to pick labels
252
253        kind.defaultValues = new ContentValues();
254        kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER);
255
256        kind.typeColumn = Im.PROTOCOL;
257        kind.typeList = Lists.newArrayList();
258        kind.typeList.add(buildImType(Im.PROTOCOL_AIM));
259        kind.typeList.add(buildImType(Im.PROTOCOL_MSN));
260        kind.typeList.add(buildImType(Im.PROTOCOL_YAHOO));
261        kind.typeList.add(buildImType(Im.PROTOCOL_SKYPE));
262        kind.typeList.add(buildImType(Im.PROTOCOL_QQ));
263        kind.typeList.add(buildImType(Im.PROTOCOL_GOOGLE_TALK));
264        kind.typeList.add(buildImType(Im.PROTOCOL_ICQ));
265        kind.typeList.add(buildImType(Im.PROTOCOL_JABBER));
266        kind.typeList.add(buildImType(Im.PROTOCOL_CUSTOM).setSecondary(true).setCustomColumn(
267                Im.CUSTOM_PROTOCOL));
268
269        kind.fieldList = Lists.newArrayList();
270        kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
271
272        return kind;
273    }
274
275    protected DataKind addDataKindOrganization(Context context) {
276        DataKind kind = addKind(new DataKind(Organization.CONTENT_ITEM_TYPE,
277                    R.string.organizationLabelsGroup, -1, 5, true));
278        kind.actionHeader = new SimpleInflater(Organization.COMPANY);
279        kind.actionBody = new SimpleInflater(Organization.TITLE);
280        kind.isList = false;
281
282        kind.fieldList = Lists.newArrayList();
283        kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
284                FLAGS_GENERIC_NAME));
285        kind.fieldList.add(new EditField(Organization.TITLE, R.string.ghostData_title,
286                FLAGS_GENERIC_NAME));
287
288        return kind;
289    }
290
291    protected DataKind addDataKindPhoto(Context context) {
292        DataKind kind = addKind(new DataKind(Photo.CONTENT_ITEM_TYPE, -1, -1, -1, true));
293        kind.fieldList = Lists.newArrayList();
294        kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1));
295        return kind;
296    }
297
298    protected DataKind addDataKindNote(Context context) {
299        DataKind kind = addKind(new DataKind(Note.CONTENT_ITEM_TYPE,
300                    R.string.label_notes, -1, 110, true));
301        kind.isList = false;
302        kind.actionHeader = new SimpleInflater(R.string.label_notes);
303        kind.actionBody = new SimpleInflater(Note.NOTE);
304        kind.fieldList = Lists.newArrayList();
305        kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
306
307        return kind;
308    }
309
310    protected DataKind addDataKindWebsite(Context context) {
311        DataKind kind = addKind(new DataKind(Website.CONTENT_ITEM_TYPE,
312                R.string.websiteLabelsGroup, R.drawable.sym_action_goto_website_holo_light, 120,
313                true));
314        kind.actionHeader = new SimpleInflater(R.string.websiteLabelsGroup);
315        kind.actionBody = new SimpleInflater(Website.URL);
316        kind.defaultValues = new ContentValues();
317        kind.defaultValues.put(Website.TYPE, Website.TYPE_OTHER);
318
319        kind.fieldList = Lists.newArrayList();
320        kind.fieldList.add(new EditField(Website.URL, R.string.websiteLabelsGroup, FLAGS_WEBSITE));
321
322        return kind;
323    }
324
325    protected DataKind addDataKindSipAddress(Context context) {
326        // The icon specified here is the one that gets displayed for
327        // "Internet call" items, in the "view contact" UI within the
328        // Contacts app.
329        //
330        // This is independent of the "SIP call" icon that gets
331        // displayed in the Quick Contacts widget, which comes from
332        // the android:icon attribute of the SIP-related
333        // intent-filters in the Phone app's manifest.
334        DataKind kind = addKind(new DataKind(SipAddress.CONTENT_ITEM_TYPE,
335                    R.string.label_sip_address, android.R.drawable.sym_action_call, 130, true));
336
337        kind.isList = false;
338        kind.actionHeader = new SimpleInflater(R.string.label_sip_address);
339        kind.actionBody = new SimpleInflater(SipAddress.SIP_ADDRESS);
340        kind.fieldList = Lists.newArrayList();
341        kind.fieldList.add(new EditField(SipAddress.SIP_ADDRESS,
342                                         R.string.label_sip_address, FLAGS_SIP_ADDRESS));
343
344        return kind;
345    }
346
347    protected DataKind addDataKindGroupMembership(Context context) {
348        DataKind kind = getKindForMimetype(GroupMembership.CONTENT_ITEM_TYPE);
349        kind = addKind(new DataKind(GroupMembership.CONTENT_ITEM_TYPE,
350                R.string.groupsLabel, android.R.drawable.sym_contact_card, 999, true));
351
352        kind.isList = false;
353        kind.fieldList = Lists.newArrayList();
354        kind.fieldList.add(new EditField(GroupMembership.GROUP_ROW_ID, -1, -1));
355
356        return kind;
357    }
358
359    /**
360     * Simple inflater that assumes a string resource has a "%s" that will be
361     * filled from the given column.
362     */
363    public static class SimpleInflater implements StringInflater {
364        private final int mStringRes;
365        private final String mColumnName;
366
367        public SimpleInflater(int stringRes) {
368            this(stringRes, null);
369        }
370
371        public SimpleInflater(String columnName) {
372            this(-1, columnName);
373        }
374
375        public SimpleInflater(int stringRes, String columnName) {
376            mStringRes = stringRes;
377            mColumnName = columnName;
378        }
379
380        public CharSequence inflateUsing(Context context, Cursor cursor) {
381            final int index = mColumnName != null ? cursor.getColumnIndex(mColumnName) : -1;
382            final boolean validString = mStringRes > 0;
383            final boolean validColumn = index != -1;
384
385            final CharSequence stringValue = validString ? context.getText(mStringRes) : null;
386            final CharSequence columnValue = validColumn ? cursor.getString(index) : null;
387
388            if (validString && validColumn) {
389                return String.format(stringValue.toString(), columnValue);
390            } else if (validString) {
391                return stringValue;
392            } else if (validColumn) {
393                return columnValue;
394            } else {
395                return null;
396            }
397        }
398
399        public CharSequence inflateUsing(Context context, ContentValues values) {
400            final boolean validColumn = values.containsKey(mColumnName);
401            final boolean validString = mStringRes > 0;
402
403            final CharSequence stringValue = validString ? context.getText(mStringRes) : null;
404            final CharSequence columnValue = validColumn ? values.getAsString(mColumnName) : null;
405
406            if (validString && validColumn) {
407                return String.format(stringValue.toString(), columnValue);
408            } else if (validString) {
409                return stringValue;
410            } else if (validColumn) {
411                return columnValue;
412            } else {
413                return null;
414            }
415        }
416    }
417
418    public static abstract class CommonInflater implements StringInflater {
419        protected abstract int getTypeLabelResource(Integer type);
420
421        protected boolean isCustom(Integer type) {
422            return type == BaseTypes.TYPE_CUSTOM;
423        }
424
425        protected String getTypeColumn() {
426            return Phone.TYPE;
427        }
428
429        protected String getLabelColumn() {
430            return Phone.LABEL;
431        }
432
433        protected CharSequence getTypeLabel(Resources res, Integer type, CharSequence label) {
434            final int labelRes = getTypeLabelResource(type);
435            if (type == null) {
436                return res.getText(labelRes);
437            } else if (isCustom(type)) {
438                return res.getString(labelRes, label == null ? "" : label);
439            } else {
440                return res.getText(labelRes);
441            }
442        }
443
444        public CharSequence inflateUsing(Context context, Cursor cursor) {
445            final Integer type = cursor.getInt(cursor.getColumnIndex(getTypeColumn()));
446            final String label = cursor.getString(cursor.getColumnIndex(getLabelColumn()));
447            return getTypeLabel(context.getResources(), type, label);
448        }
449
450        public CharSequence inflateUsing(Context context, ContentValues values) {
451            final Integer type = values.getAsInteger(getTypeColumn());
452            final String label = values.getAsString(getLabelColumn());
453            return getTypeLabel(context.getResources(), type, label);
454        }
455    }
456
457    public static class PhoneActionInflater extends CommonInflater {
458        @Override
459        protected boolean isCustom(Integer type) {
460            return type == Phone.TYPE_CUSTOM || type == Phone.TYPE_ASSISTANT;
461        }
462
463        @Override
464        protected int getTypeLabelResource(Integer type) {
465            if (type == null) return R.string.call_other;
466            switch (type) {
467                case Phone.TYPE_HOME: return R.string.call_home;
468                case Phone.TYPE_MOBILE: return R.string.call_mobile;
469                case Phone.TYPE_WORK: return R.string.call_work;
470                case Phone.TYPE_FAX_WORK: return R.string.call_fax_work;
471                case Phone.TYPE_FAX_HOME: return R.string.call_fax_home;
472                case Phone.TYPE_PAGER: return R.string.call_pager;
473                case Phone.TYPE_OTHER: return R.string.call_other;
474                case Phone.TYPE_CALLBACK: return R.string.call_callback;
475                case Phone.TYPE_CAR: return R.string.call_car;
476                case Phone.TYPE_COMPANY_MAIN: return R.string.call_company_main;
477                case Phone.TYPE_ISDN: return R.string.call_isdn;
478                case Phone.TYPE_MAIN: return R.string.call_main;
479                case Phone.TYPE_OTHER_FAX: return R.string.call_other_fax;
480                case Phone.TYPE_RADIO: return R.string.call_radio;
481                case Phone.TYPE_TELEX: return R.string.call_telex;
482                case Phone.TYPE_TTY_TDD: return R.string.call_tty_tdd;
483                case Phone.TYPE_WORK_MOBILE: return R.string.call_work_mobile;
484                case Phone.TYPE_WORK_PAGER: return R.string.call_work_pager;
485                case Phone.TYPE_ASSISTANT: return R.string.call_assistant;
486                case Phone.TYPE_MMS: return R.string.call_mms;
487                default: return R.string.call_custom;
488            }
489        }
490    }
491
492    public static class PhoneActionAltInflater extends CommonInflater {
493        @Override
494        protected boolean isCustom(Integer type) {
495            return (type == Phone.TYPE_CUSTOM || type == Phone.TYPE_ASSISTANT);
496        }
497
498        @Override
499        protected int getTypeLabelResource(Integer type) {
500            if (type == null) return R.string.sms_other;
501            switch (type) {
502                case Phone.TYPE_HOME: return R.string.sms_home;
503                case Phone.TYPE_MOBILE: return R.string.sms_mobile;
504                case Phone.TYPE_WORK: return R.string.sms_work;
505                case Phone.TYPE_FAX_WORK: return R.string.sms_fax_work;
506                case Phone.TYPE_FAX_HOME: return R.string.sms_fax_home;
507                case Phone.TYPE_PAGER: return R.string.sms_pager;
508                case Phone.TYPE_OTHER: return R.string.sms_other;
509                case Phone.TYPE_CALLBACK: return R.string.sms_callback;
510                case Phone.TYPE_CAR: return R.string.sms_car;
511                case Phone.TYPE_COMPANY_MAIN: return R.string.sms_company_main;
512                case Phone.TYPE_ISDN: return R.string.sms_isdn;
513                case Phone.TYPE_MAIN: return R.string.sms_main;
514                case Phone.TYPE_OTHER_FAX: return R.string.sms_other_fax;
515                case Phone.TYPE_RADIO: return R.string.sms_radio;
516                case Phone.TYPE_TELEX: return R.string.sms_telex;
517                case Phone.TYPE_TTY_TDD: return R.string.sms_tty_tdd;
518                case Phone.TYPE_WORK_MOBILE: return R.string.sms_work_mobile;
519                case Phone.TYPE_WORK_PAGER: return R.string.sms_work_pager;
520                case Phone.TYPE_ASSISTANT: return R.string.sms_assistant;
521                case Phone.TYPE_MMS: return R.string.sms_mms;
522                default: return R.string.sms_custom;
523            }
524        }
525    }
526
527    public static class EmailActionInflater extends CommonInflater {
528        @Override
529        protected int getTypeLabelResource(Integer type) {
530            if (type == null) return R.string.email;
531            switch (type) {
532                case Email.TYPE_HOME: return R.string.email_home;
533                case Email.TYPE_WORK: return R.string.email_work;
534                case Email.TYPE_OTHER: return R.string.email_other;
535                case Email.TYPE_MOBILE: return R.string.email_mobile;
536                default: return R.string.email_custom;
537            }
538        }
539    }
540
541    public static class EventActionInflater extends CommonInflater {
542        @Override
543        protected int getTypeLabelResource(Integer type) {
544            return Event.getTypeResource(type);
545        }
546    }
547
548    public static class RelationActionInflater extends CommonInflater {
549        @Override
550        protected int getTypeLabelResource(Integer type) {
551            return Relation.getTypeLabelResource(type == null ? Relation.TYPE_CUSTOM : type);
552        }
553    }
554
555    public static class PostalActionInflater extends CommonInflater {
556        @Override
557        protected int getTypeLabelResource(Integer type) {
558            if (type == null) return R.string.map_other;
559            switch (type) {
560                case StructuredPostal.TYPE_HOME: return R.string.map_home;
561                case StructuredPostal.TYPE_WORK: return R.string.map_work;
562                case StructuredPostal.TYPE_OTHER: return R.string.map_other;
563                default: return R.string.map_custom;
564            }
565        }
566    }
567
568    public static class ImActionInflater extends CommonInflater {
569        @Override
570        protected String getTypeColumn() {
571            return Im.PROTOCOL;
572        }
573
574        @Override
575        protected String getLabelColumn() {
576            return Im.CUSTOM_PROTOCOL;
577        }
578
579        @Override
580        protected int getTypeLabelResource(Integer type) {
581            if (type == null) return R.string.chat;
582            switch (type) {
583                case Im.PROTOCOL_AIM: return R.string.chat_aim;
584                case Im.PROTOCOL_MSN: return R.string.chat_msn;
585                case Im.PROTOCOL_YAHOO: return R.string.chat_yahoo;
586                case Im.PROTOCOL_SKYPE: return R.string.chat_skype;
587                case Im.PROTOCOL_QQ: return R.string.chat_qq;
588                case Im.PROTOCOL_GOOGLE_TALK: return R.string.chat_gtalk;
589                case Im.PROTOCOL_ICQ: return R.string.chat_icq;
590                case Im.PROTOCOL_JABBER: return R.string.chat_jabber;
591                case Im.PROTOCOL_NETMEETING: return R.string.chat;
592                default: return R.string.chat;
593            }
594        }
595    }
596
597    @Override
598    public int getHeaderColor(Context context) {
599        return 0xff7f93bc;
600    }
601
602    @Override
603    public int getSideBarColor(Context context) {
604        return 0xffbdc7b8;
605    }
606}
607