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