VCardEntryConstructor.java revision 48dd8e86a81d2ab40eb762975c8211c225002bf0
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.accounts.Account; 194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.text.TextUtils; 204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.util.Base64; 214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.util.Log; 224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.ArrayList; 244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Collection; 254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.List; 264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/** 284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p> 294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * The {@link VCardInterpreter} implementation which enables {@link VCardEntryHandler} objects 304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * to easily handle each vCard entry. 314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p> 324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p> 334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * This class understand details inside vCard and translates it to {@link VCardEntry}. 344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Then the class throw it to {@link VCardEntryHandler} registered via 354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * {@link #addEntryHandler(VCardEntryHandler)}, so that all those registered objects 364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * are able to handle the {@link VCardEntry} object. 374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p> 384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * <p> 394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * If you want to know the detail inside vCard, it would be better to implement 404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * {@link VCardInterpreter} directly, instead of relying on this class and 414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * {@link VCardEntry} created by the object. 424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * </p> 434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapublic class VCardEntryConstructor implements VCardInterpreter { 4502117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa private static String LOG_TAG = VCardConstants.LOG_TAG; 464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 4748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa /** 4848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa * Represents current stack of VCardEntry. Used to support nested vCard (vCard 2.1). 4948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa */ 5048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa private final List<VCardEntry> mEntryStack = new ArrayList<VCardEntry>(); 5148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa private VCardEntry mCurrentEntry; 524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private VCardEntry.Property mCurrentProperty = new VCardEntry.Property(); 534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private String mParamType; 5402117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa 554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // The charset using which {@link VCardInterpreter} parses the text. 564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // Each String is first decoded into binary stream with this charset, and encoded back 574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // to "target charset", which may be explicitly specified by the vCard with "CHARSET" 584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // property or implicitly mentioned by its version (e.g. vCard 3.0 recommends UTF-8). 594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final String mSourceCharset; 604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final boolean mStrictLineBreaking; 624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final int mVCardType; 634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final Account mAccount; 6402117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa 654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final List<VCardEntryHandler> mEntryHandlers = new ArrayList<VCardEntryHandler>(); 664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor() { 684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa this(VCardConfig.VCARD_TYPE_V21_GENERIC, null); 694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor(final int vcardType) { 724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa this(vcardType, null, null, false); 734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor(final int vcardType, final Account account) { 764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa this(vcardType, account, null, false); 774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor(final int vcardType, final Account account, 804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final String inputCharset) { 814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa this(vcardType, account, inputCharset, false); 824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa /** 854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * @hide Just for testing. 864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor(final int vcardType, final Account account, 884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final String inputCharset, final boolean strictLineBreakParsing) { 894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (inputCharset != null) { 904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mSourceCharset = inputCharset; 914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mSourceCharset = VCardConfig.DEFAULT_INTERMEDIATE_CHARSET; 934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mStrictLineBreaking = strictLineBreakParsing; 954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mVCardType = vcardType; 964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mAccount = account; 974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void addEntryHandler(VCardEntryHandler entryHandler) { 1004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mEntryHandlers.add(entryHandler); 1014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1022bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa 1032bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void start() { 1054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (VCardEntryHandler entryHandler : mEntryHandlers) { 1064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa entryHandler.onStart(); 1074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1102bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void end() { 1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (VCardEntryHandler entryHandler : mEntryHandlers) { 1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa entryHandler.onEnd(); 1144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void clear() { 11848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = null; 11948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mEntryStack.clear(); 1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mCurrentProperty = new VCardEntry.Property(); 1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1232bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void startEntry() { 12548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = new VCardEntry(mVCardType, mAccount); 12648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mEntryStack.add(mCurrentEntry); 1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1292bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void endEntry() { 13148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry.consolidateFields(); 1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (VCardEntryHandler entryHandler : mEntryHandlers) { 13348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa entryHandler.onEntryCreated(mCurrentEntry); 1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 13548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa 13648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa final int size = mEntryStack.size(); 13748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa if (size > 1) { 13848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa VCardEntry parent = mEntryStack.get(size - 2); 13948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa parent.addChild(mCurrentEntry); 14048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = parent; 14148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa } else { 14248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = null; 14348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa } 14448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mEntryStack.remove(size - 1); 1454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1472bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void startProperty() { 1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mCurrentProperty.clear(); 1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1522bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void endProperty() { 15448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry.addProperty(mCurrentProperty); 1554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 15602117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa 1572bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void propertyName(String name) { 1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mCurrentProperty.setPropertyName(name); 1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1622bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void propertyGroup(String group) { 1644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1662bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void propertyParamType(String type) { 1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (mParamType != null) { 1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa Log.e(LOG_TAG, "propertyParamType() is called more than once " + 1704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa "before propertyParamValue() is called"); 1714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mParamType = type; 1734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1752bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void propertyParamValue(String value) { 1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (mParamType == null) { 1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // From vCard 2.1 specification. vCard 3.0 formally does not allow this case. 1794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mParamType = "TYPE"; 1804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1812bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa if (!VCardUtils.containsOnlyAlphaDigitHyphen(value)) { 18258ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa value = VCardUtils.convertStringCharset( 1832bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa value, mSourceCharset, VCardConfig.DEFAULT_IMPORT_CHARSET); 1842bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa } 1854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mCurrentProperty.addParameter(mParamType, value); 1864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mParamType = null; 1874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private String handleOneValue(String value, 1904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa String sourceCharset, String targetCharset, String encoding) { 19158610106ce61adad9b1caa1fe9f7925c3e938babDaisuke Miyakawa // It is possible when some of multiple values are empty. 19258610106ce61adad9b1caa1fe9f7925c3e938babDaisuke Miyakawa // e.g. N:;a;;; -> values are "", "a", "", "", and "". 19358610106ce61adad9b1caa1fe9f7925c3e938babDaisuke Miyakawa if (TextUtils.isEmpty(value)) { 19458610106ce61adad9b1caa1fe9f7925c3e938babDaisuke Miyakawa return ""; 1954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (encoding != null) { 1984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (encoding.equals("BASE64") || encoding.equals("B")) { 1994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mCurrentProperty.setPropertyBytes(Base64.decode(value.getBytes(), Base64.DEFAULT)); 2004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return value; 2014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else if (encoding.equals("QUOTED-PRINTABLE")) { 2024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return VCardUtils.parseQuotedPrintable( 2034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa value, mStrictLineBreaking, sourceCharset, targetCharset); 2044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa Log.w(LOG_TAG, "Unknown encoding. Fall back to default."); 2064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 20802117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa // Just translate the charset of a given String from inputCharset to a system one. 20958ca5f9943bb5c8aeeab3150ac96f1143dfd86baDaisuke Miyakawa return VCardUtils.convertStringCharset(value, sourceCharset, targetCharset); 2104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2119919ad2126c06dbf2eb54a11e6158f87f316bc22Daisuke Miyakawa 2129919ad2126c06dbf2eb54a11e6158f87f316bc22Daisuke Miyakawa @Override 2134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void propertyValues(List<String> values) { 2144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (values == null || values.isEmpty()) { 2154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return; 2164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 218d5a8fc2a35c69fc34df35fd545ccf83d548ba50cDaisuke Miyakawa final Collection<String> charsetCollection = 219d5a8fc2a35c69fc34df35fd545ccf83d548ba50cDaisuke Miyakawa mCurrentProperty.getParameters(VCardConstants.PARAM_CHARSET); 220d5a8fc2a35c69fc34df35fd545ccf83d548ba50cDaisuke Miyakawa final Collection<String> encodingCollection = 221d5a8fc2a35c69fc34df35fd545ccf83d548ba50cDaisuke Miyakawa mCurrentProperty.getParameters(VCardConstants.PARAM_ENCODING); 2224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final String encoding = 2234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa ((encodingCollection != null) ? encodingCollection.iterator().next() : null); 2249919ad2126c06dbf2eb54a11e6158f87f316bc22Daisuke Miyakawa 2259919ad2126c06dbf2eb54a11e6158f87f316bc22Daisuke Miyakawa // String targetCharset = CharsetUtils.nameForDefaultVendor( 2269919ad2126c06dbf2eb54a11e6158f87f316bc22Daisuke Miyakawa // ((charsetCollection != null) ? charsetCollection.iterator().next() : null)); 2279919ad2126c06dbf2eb54a11e6158f87f316bc22Daisuke Miyakawa String targetCharset = 2289919ad2126c06dbf2eb54a11e6158f87f316bc22Daisuke Miyakawa ((charsetCollection != null) ? charsetCollection.iterator().next() : null); 2294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (TextUtils.isEmpty(targetCharset)) { 2304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa targetCharset = VCardConfig.DEFAULT_IMPORT_CHARSET; 2314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 2334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (final String value : values) { 23448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentProperty.addPropertyValue( 2354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa handleOneValue(value, mSourceCharset, targetCharset, encoding)); 2364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa} 239