VCardConfig.java revision 36ba003879c5583609af3afcec8df22f51d94cd3
14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2009 The Android Open Source Project
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License.
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License.
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapackage com.android.vcard;
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.telephony.PhoneNumberUtils;
194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.util.Log;
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.HashMap;
224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.HashSet;
234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Map;
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Set;
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/**
274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * The class representing VCard related configurations. Useful static methods are not in this class
284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * but in VCardUtils.
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapublic class VCardConfig {
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final String LOG_TAG = "VCardConfig";
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final int LOG_LEVEL_NONE = 0;
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final int LOG_LEVEL_PERFORMANCE_MEASUREMENT = 0x1;
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final int LOG_LEVEL_SHOW_WARNING = 0x2;
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final int LOG_LEVEL_VERBOSE =
374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        LOG_LEVEL_PERFORMANCE_MEASUREMENT | LOG_LEVEL_SHOW_WARNING;
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final int LOG_LEVEL = LOG_LEVEL_NONE;
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The charset used during import.
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We cannot determine which charset should be used to interpret lines in vCard,
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * while Java requires us to specify it when InputStream is used.
484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We need to rely on the mechanism due to some performance reason.
494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * In order to avoid "misinterpretation" of charset and lose any data in vCard,
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * "ISO-8859-1" is first used for reading the stream.
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * When a charset is specified in a property (with "CHARSET=..." parameter),
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * the string is decoded to raw bytes and encoded into the specific charset,
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Unicode specification there's a one to one mapping between each byte in ISO-8859-1
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * and a codepoint, and Java specification requires runtime must have the charset.
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Thus, ISO-8859-1 is one effective mapping for intermediate mapping.
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final String DEFAULT_INTERMEDIATE_CHARSET = "ISO-8859-1";
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The charset used when there's no information affbout what charset should be used to
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * encode the binary given from vCard.
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final String DEFAULT_IMPORT_CHARSET = "UTF-8";
694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final String DEFAULT_EXPORT_CHARSET = "UTF-8";
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
7136ba003879c5583609af3afcec8df22f51d94cd3Daisuke Miyakawa    /**
7236ba003879c5583609af3afcec8df22f51d94cd3Daisuke Miyakawa     * Do not use statically like "version == VERSION_V21"
7336ba003879c5583609af3afcec8df22f51d94cd3Daisuke Miyakawa     */
74be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static final int VERSION_21 = 0;
75be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static final int VERSION_30 = 1;
76be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static final int VERSION_40 = 2;
77be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static final int VERSION_MASK = 3;
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int NAME_ORDER_DEFAULT = 0;
804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int NAME_ORDER_EUROPE = 0x4;
814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int NAME_ORDER_JAPANESE = 0x8;
824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final int NAME_ORDER_MASK = 0xC;
834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    // 0x10 is reserved for safety
854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating the vCard composer will add some "X-" properties used only in Android
894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * when the formal vCard specification does not have appropriate fields for that data.
904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * For example, Android accepts nickname information while vCard 2.1 does not.
934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * When this flag is on, vCard composer emits alternative "X-" property (like "X-NICKNAME")
944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * instead of just dropping it.
954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * vCard parser code automatically parses the field emitted even when this flag is off.
984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
1004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final int FLAG_USE_ANDROID_PROPERTY = 0x80000000;
1014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
1034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating the vCard composer will add some "X-" properties seen in the
1054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * vCard data emitted by the other softwares/devices when the formal vCard specification
1064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * does not have appropriate field(s) for that data.
1074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * One example is X-PHONETIC-FIRST-NAME/X-PHONETIC-MIDDLE-NAME/X-PHONETIC-LAST-NAME, which are
1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * for phonetic name (how the name is pronounced), seen in the vCard emitted by some other
1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * non-Android devices/softwares. We chose to enable the vCard composer to use those
1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * defact properties since they are also useful for Android devices.
1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Note for developers: only "X-" properties should be added with this flag. vCard 2.1/3.0
1164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * allows any kind of "X-" properties but does not allow non-"X-" properties (except IANA tokens
1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * in vCard 3.0). Some external parsers may get confused with non-valid, non-"X-" properties.
1184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final int FLAG_USE_DEFACT_PROPERTY = 0x40000000;
1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
1234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating some specific dialect seen in vCard of DoCoMo (one of Japanese
1254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * mobile careers) should be used. This flag does not include any other information like
1264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * that "the vCard is for Japanese". So it is "possible" that "the vCard should have DoCoMo's
1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * dialect but the name order should be European", but it is not recommended.
1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
1304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final int FLAG_DOCOMO = 0x20000000;
1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
1334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating the vCard composer does "NOT" use Quoted-Printable toward "primary"
1354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * properties even though it is required by vCard 2.1 (QP is prohibited in vCard 3.0).
1364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We actually cannot define what is the "primary" property. Note that this is NOT defined
1394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * in vCard specification either. Also be aware that it is NOT related to "primary" notion
1404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * used in {@link android.provider.ContactsContract}.
1414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * This notion is just for vCard composition in Android.
1424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We added this Android-specific notion since some (incomplete) vCard exporters for vCard 2.1
1454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * do NOT use Quoted-Printable encoding toward some properties related names like "N", "FN", etc.
1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * even when their values contain non-ascii or/and CR/LF, while they use the encoding in the
1474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * other properties like "ADR", "ORG", etc.
1484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We are afraid of the case where some vCard importer also forget handling QP presuming QP is
1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * not used in such fields.
1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * This flag is useful when some target importer you are going to focus on does not accept
1544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * such properties with Quoted-Printable encoding.
1554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Again, we should not use this flag at all for complying vCard 2.1 spec.
1584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * In vCard 3.0, Quoted-Printable is explicitly "prohibitted", so we don't need to care this
1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * kind of problem (hopefully).
1624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * @hide
1644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
1654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int FLAG_REFRAIN_QP_TO_NAME_PROPERTIES = 0x10000000;
1664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating that phonetic name related fields must be converted to
1704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * appropriate form. Note that "appropriate" is not defined in any vCard specification.
1714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * This is Android-specific.
1724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * One typical (and currently sole) example where we need this flag is the time when
1754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * we need to emit Japanese phonetic names into vCard entries. The property values
1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * should be encoded into half-width katakana when the target importer is Japanese mobile
1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * phones', which are probably not able to parse full-width hiragana/katakana for
1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * historical reasons, while the vCard importers embedded to softwares for PC should be
1794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * able to parse them as we expect.
1804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
1824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int FLAG_CONVERT_PHONETIC_NAME_STRINGS = 0x08000000;
1834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
1854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating the vCard composer "for 2.1" emits "TYPE=" string toward TYPE params
1874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * every time possible. The default behavior does not emit it and is valid in the spec.
1884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * In vCrad 3.0, this flag is unnecessary, since "TYPE=" is MUST in vCard 3.0 specification.
1894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Detail:
1924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * How more than one TYPE fields are expressed is different between vCard 2.1 and vCard 3.0.
1934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
1954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * e.g.
1964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
1974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <ol>
1984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <li>Probably valid in both vCard 2.1 and vCard 3.0: "ADR;TYPE=DOM;TYPE=HOME:..."</li>
1994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <li>Valid in vCard 2.1 but not in vCard 3.0: "ADR;DOM;HOME:..."</li>
2004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <li>Valid in vCard 3.0 but not in vCard 2.1: "ADR;TYPE=DOM,HOME:..."</li>
2014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </ol>
2024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * If you are targeting to the importer which cannot accept TYPE params without "TYPE="
2044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * strings (which should be rare though), please use this flag.
2054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Example usage:
2084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <pre class="prettyprint">int type = (VCARD_TYPE_V21_GENERIC | FLAG_APPEND_TYPE_PARAM);</pre>
2094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
2114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int FLAG_APPEND_TYPE_PARAM = 0x04000000;
2124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
2144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating the vCard composer does touch nothing toward phone number Strings
2164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * but leave it as is.
2174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The vCard specifications mention nothing toward phone numbers, while some devices
2204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * do (wrongly, but with innevitable reasons).
2214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * For example, there's a possibility Japanese mobile phones are expected to have
2224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * just numbers, hypens, plus, etc. but not usual alphabets, while US mobile phones
2234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * should get such characters. To make exported vCard simple for external parsers,
2244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * we have used {@link PhoneNumberUtils#formatNumber(String)} during export, and
2254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * removed unnecessary characters inside the number (e.g. "111-222-3333 (Miami)"
2264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * becomes "111-222-3333").
2274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Unfortunate side effect of that use was some control characters used in the other
2284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * areas may be badly affected by the formatting.
2294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * This flag disables that formatting, affecting both importer and exporter.
2324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * If the user is aware of some side effects due to the implicit formatting, use this flag.
2334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
2354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int FLAG_REFRAIN_PHONE_NUMBER_FORMATTING = 0x02000000;
2364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
2384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * For importer only. Ignored in exporter.
2404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The flag indicating the parser should handle a nested vCard, in which vCard clause starts
2434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * in another vCard clause. Here's a typical example.
2444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <pre class="prettyprint">BEGIN:VCARD
2464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * BEGIN:VCARD
2474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * VERSION:2.1
2484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * ...
2494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * END:VCARD
2504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * END:VCARD</pre>
2514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The vCard 2.1 specification allows the nest, but also let parsers ignore nested entries,
2534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * while some mobile devices emit nested ones as primary data to be imported.
2544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * This flag forces a vCard parser to torelate such a nest and understand its content.
2574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
2594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int FLAG_TORELATE_NEST = 0x01000000;
2604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    //// The followings are VCard types available from importer/exporter. ////
2624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
2644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The type indicating nothing. Used by {@link VCardSourceDetector} when it
2664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * was not able to guess the exact vCard type.
2674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
2694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_UNKNOWN = 0;
2704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
2724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Generic vCard format with the vCard 2.1. When composing a vCard entry,
2744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * the US convension will be used toward formatting some values.
2754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * e.g. The order of the display name would be "Prefix Given Middle Family Suffix",
2784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * while it should be "Prefix Family Middle Given Suffix" in Japan for example.
2794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Uses UTF-8 for the charset as a charset for exporting. Note that old vCard importer
2824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * outside Android cannot accept it since vCard 2.1 specifically does not allow
2834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * that charset, while we need to use it to support various languages around the world.
2844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * If you want to use alternative charset, you should notify the charset to the other
2874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * compontent to be used.
2884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
2904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_V21_GENERIC =
291be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_21 | NAME_ORDER_DEFAULT | FLAG_USE_DEFACT_PROPERTY | FLAG_USE_ANDROID_PROPERTY);
2924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static String VCARD_TYPE_V21_GENERIC_STR = "v21_generic";
2944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
2964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
2974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * General vCard format with the version 3.0. Uses UTF-8 for the charset.
2984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
2994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Not fully ready yet. Use with caution when you use this.
3014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_V30_GENERIC =
304be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_30 | NAME_ORDER_DEFAULT | FLAG_USE_DEFACT_PROPERTY | FLAG_USE_ANDROID_PROPERTY);
3054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_V30_GENERIC_STR = "v30_generic";
307be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa
308be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    /**
309be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa     * General vCard format with the version 4.0.
3104560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa     * @hide vCard 4.0 is not published yet.
311be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa     */
312be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static final int VCARD_TYPE_V40_GENERIC =
313be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_40 | NAME_ORDER_DEFAULT | FLAG_USE_DEFACT_PROPERTY | FLAG_USE_ANDROID_PROPERTY);
314be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa
315be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_V40_GENERIC_STR = "v40_generic";
316be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa
3174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
3184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * General vCard format for the vCard 2.1 with some Europe convension. Uses Utf-8.
3204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Currently, only name order is considered ("Prefix Middle Given Family Suffix")
3214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_V21_EUROPE =
324be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_21 | NAME_ORDER_EUROPE | FLAG_USE_DEFACT_PROPERTY | FLAG_USE_ANDROID_PROPERTY);
3254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_V21_EUROPE_STR = "v21_europe";
3274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
3294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * General vCard format with the version 3.0 with some Europe convension. Uses UTF-8.
3314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Not ready yet. Use with caution when you use this.
3344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_V30_EUROPE =
337be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_30 | NAME_ORDER_EUROPE | FLAG_USE_DEFACT_PROPERTY | FLAG_USE_ANDROID_PROPERTY);
3384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_V30_EUROPE_STR = "v30_europe";
3404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
3424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The vCard 2.1 format for miscellaneous Japanese devices, using UTF-8 as default charset.
3444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Not ready yet. Use with caution when you use this.
3474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_V21_JAPANESE =
350be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_21 | NAME_ORDER_JAPANESE | FLAG_USE_DEFACT_PROPERTY | FLAG_USE_ANDROID_PROPERTY);
3514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_V21_JAPANESE_STR = "v21_japanese_utf8";
3534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
3554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The vCard 3.0 format for miscellaneous Japanese devices, using UTF-8 as default charset.
3574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Not ready yet. Use with caution when you use this.
3604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_V30_JAPANESE =
363be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_30 | NAME_ORDER_JAPANESE | FLAG_USE_DEFACT_PROPERTY | FLAG_USE_ANDROID_PROPERTY);
3644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_V30_JAPANESE_STR = "v30_japanese_utf8";
3664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
3684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The vCard 2.1 based format which (partially) considers the convention in Japanese
3704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * mobile phones, where phonetic names are translated to half-width katakana if
3714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * possible, etc. It would be better to use Shift_JIS as a charset for maximum
3724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * compatibility.
3734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * @hide Should not be available world wide.
3754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_V21_JAPANESE_MOBILE =
377be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        (VERSION_21 | NAME_ORDER_JAPANESE |
3784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                FLAG_CONVERT_PHONETIC_NAME_STRINGS | FLAG_REFRAIN_QP_TO_NAME_PROPERTIES);
3794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_V21_JAPANESE_MOBILE_STR = "v21_japanese_mobile";
3814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
3834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * The vCard format used in DoCoMo, which is one of Japanese mobile phone careers.
3854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
3874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * Base version is vCard 2.1, but the data has several DoCoMo-specific convensions.
3884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * No Android-specific property nor defact property is included. The "Primary" properties
3894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * are NOT encoded to Quoted-Printable.
3904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
3914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * @hide Should not be available world wide.
3924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
3934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static final int VCARD_TYPE_DOCOMO =
3944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        (VCARD_TYPE_V21_JAPANESE_MOBILE | FLAG_DOCOMO);
3954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static final String VCARD_TYPE_DOCOMO_STR = "docomo";
3974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
3984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static int VCARD_TYPE_DEFAULT = VCARD_TYPE_V21_GENERIC;
3994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final Map<String, Integer> sVCardTypeMap;
4014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static final Set<Integer> sJapaneseMobileTypeSet;
4024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    static {
4044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap = new HashMap<String, Integer>();
4054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_V21_GENERIC_STR, VCARD_TYPE_V21_GENERIC);
4064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_V30_GENERIC_STR, VCARD_TYPE_V30_GENERIC);
4074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_V21_EUROPE_STR, VCARD_TYPE_V21_EUROPE);
4084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_V30_EUROPE_STR, VCARD_TYPE_V30_EUROPE);
4094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_V21_JAPANESE_STR, VCARD_TYPE_V21_JAPANESE);
4104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_V30_JAPANESE_STR, VCARD_TYPE_V30_JAPANESE);
4114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_V21_JAPANESE_MOBILE_STR, VCARD_TYPE_V21_JAPANESE_MOBILE);
4124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sVCardTypeMap.put(VCARD_TYPE_DOCOMO_STR, VCARD_TYPE_DOCOMO);
4134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sJapaneseMobileTypeSet = new HashSet<Integer>();
4154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sJapaneseMobileTypeSet.add(VCARD_TYPE_V21_JAPANESE);
4164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sJapaneseMobileTypeSet.add(VCARD_TYPE_V30_JAPANESE);
4174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sJapaneseMobileTypeSet.add(VCARD_TYPE_V21_JAPANESE_MOBILE);
4184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        sJapaneseMobileTypeSet.add(VCARD_TYPE_DOCOMO);
4194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static int getVCardTypeFromString(final String vcardTypeString) {
4224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String loweredKey = vcardTypeString.toLowerCase();
4234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (sVCardTypeMap.containsKey(loweredKey)) {
4244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return sVCardTypeMap.get(loweredKey);
4254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else if ("default".equalsIgnoreCase(vcardTypeString)) {
4264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return VCARD_TYPE_DEFAULT;
4274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        } else {
4284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Log.e(LOG_TAG, "Unknown vCard type String: \"" + vcardTypeString + "\"");
4294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return VCARD_TYPE_DEFAULT;
4304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
4314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
433be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static boolean isVersion21(final int vcardType) {
434be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        return (vcardType & VERSION_MASK) == VERSION_21;
435be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    }
436be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa
437be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static boolean isVersion30(final int vcardType) {
438be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        return (vcardType & VERSION_MASK) == VERSION_30;
439be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    }
440be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa
441be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa    public static boolean isVersion40(final int vcardType) {
442be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        return (vcardType & VERSION_MASK) == VERSION_40;
4434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean shouldUseQuotedPrintable(final int vcardType) {
446be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        return !isVersion30(vcardType);
4474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static int getNameOrderType(final int vcardType) {
4504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return vcardType & NAME_ORDER_MASK;
4514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean usesAndroidSpecificProperty(final int vcardType) {
4544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return ((vcardType & FLAG_USE_ANDROID_PROPERTY) != 0);
4554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean usesDefactProperty(final int vcardType) {
4584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return ((vcardType & FLAG_USE_DEFACT_PROPERTY) != 0);
4594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean showPerformanceLog() {
4624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return (VCardConfig.LOG_LEVEL & VCardConfig.LOG_LEVEL_PERFORMANCE_MEASUREMENT) != 0;
4634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean shouldRefrainQPToNameProperties(final int vcardType) {
4664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa       return (!shouldUseQuotedPrintable(vcardType) ||
4674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa               ((vcardType & FLAG_REFRAIN_QP_TO_NAME_PROPERTIES) != 0));
4684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean appendTypeParamName(final int vcardType) {
471be378d5b188f51cf717e5309e3c39180e85833a8Daisuke Miyakawa        return (isVersion30(vcardType) || ((vcardType & FLAG_APPEND_TYPE_PARAM) != 0));
4724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
4754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * @return true if the device is Japanese and some Japanese convension is
4764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * applied to creating "formatted" something like FORMATTED_ADDRESS.
4774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
4784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean isJapaneseDevice(final int vcardType) {
4794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // TODO: Some mask will be required so that this method wrongly interpret
4804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        //        Japanese"-like" vCard type.
4814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        //        e.g. VCARD_TYPE_V21_JAPANESE_SJIS | FLAG_APPEND_TYPE_PARAMS
4824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return sJapaneseMobileTypeSet.contains(vcardType);
4834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /* package */ static boolean refrainPhoneNumberFormatting(final int vcardType) {
4864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return ((vcardType & FLAG_REFRAIN_PHONE_NUMBER_FORMATTING) != 0);
4874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean needsToConvertPhoneticString(final int vcardType) {
4904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return ((vcardType & FLAG_CONVERT_PHONETIC_NAME_STRINGS) != 0);
4914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean onlyOneNoteFieldIsAvailable(final int vcardType) {
4944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return vcardType == VCARD_TYPE_DOCOMO;
4954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
4964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
4974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public static boolean isDoCoMo(final int vcardType) {
4984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return ((vcardType & FLAG_DOCOMO) != 0);
4994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
5014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private VCardConfig() {
5024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
5034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}