@Override
  protected DataKind inflateIm(Context context, int inflateLevel) {
    final DataKind kind = super.inflateIm(context, ContactsSource.LEVEL_MIMETYPES);

    if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
      kind.typeOverallMax = 3;

      // NOTE: even though a traditional "type" exists, for editing
      // purposes we're using the protocol to pick labels

      kind.defaultValues = new ContentValues();
      kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER);

      kind.typeColumn = Im.PROTOCOL;
      kind.typeList = Lists.newArrayList();
      kind.typeList.add(buildImType(Im.PROTOCOL_AIM));
      kind.typeList.add(buildImType(Im.PROTOCOL_MSN));
      kind.typeList.add(buildImType(Im.PROTOCOL_YAHOO));
      kind.typeList.add(buildImType(Im.PROTOCOL_SKYPE));
      kind.typeList.add(buildImType(Im.PROTOCOL_QQ));
      kind.typeList.add(buildImType(Im.PROTOCOL_GOOGLE_TALK));
      kind.typeList.add(buildImType(Im.PROTOCOL_ICQ));
      kind.typeList.add(buildImType(Im.PROTOCOL_JABBER));
      kind.typeList.add(
          buildImType(Im.PROTOCOL_CUSTOM).setSecondary(true).setCustomColumn(Im.CUSTOM_PROTOCOL));

      kind.fieldList = Lists.newArrayList();
      kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
    }

    return kind;
  }
  @Override
  protected DataKind inflatePhoto(Context context, int inflateLevel) {
    final DataKind kind = super.inflatePhoto(context, ContactsSource.LEVEL_MIMETYPES);

    if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
      kind.typeOverallMax = 1;

      kind.fieldList = Lists.newArrayList();
      kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1));
    }

    return kind;
  }
  @Override
  protected DataKind inflateEmail(Context context, int inflateLevel) {
    final DataKind kind = super.inflateEmail(context, ContactsSource.LEVEL_MIMETYPES);

    if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
      kind.typeOverallMax = 3;

      kind.fieldList = Lists.newArrayList();
      kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
    }

    return kind;
  }
  @Override
  protected DataKind inflateStructuredName(Context context, int inflateLevel) {
    final DataKind kind = super.inflateStructuredName(context, ContactsSource.LEVEL_MIMETYPES);

    if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
      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));
        kind.fieldList.add(
            new EditField(StructuredName.SUFFIX, R.string.name_suffix, FLAGS_PERSON_NAME)
                .setOptional(true));
        kind.fieldList.add(
            new EditField(
                    StructuredName.PHONETIC_FAMILY_NAME,
                    R.string.name_phonetic_family,
                    FLAGS_PHONETIC)
                .setOptional(true));
        kind.fieldList.add(
            new EditField(
                    StructuredName.PHONETIC_GIVEN_NAME,
                    R.string.name_phonetic_given,
                    FLAGS_PHONETIC)
                .setOptional(true));
      } 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));
        kind.fieldList.add(
            new EditField(
                    StructuredName.PHONETIC_GIVEN_NAME,
                    R.string.name_phonetic_given,
                    FLAGS_PHONETIC)
                .setOptional(true));
        kind.fieldList.add(
            new EditField(
                    StructuredName.PHONETIC_FAMILY_NAME,
                    R.string.name_phonetic_family,
                    FLAGS_PHONETIC)
                .setOptional(true));
      }
    }

    return kind;
  }