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; 5202117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa 534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final int mVCardType; 544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final Account mAccount; 5502117b3d19787ff65486b9f9db8abd338ae4c9f9Daisuke Miyakawa 564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final List<VCardEntryHandler> mEntryHandlers = new ArrayList<VCardEntryHandler>(); 574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor() { 591de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa this(VCardConfig.VCARD_TYPE_V21_GENERIC, null, null); 604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor(final int vcardType) { 631de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa this(vcardType, null, null); 644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor(final int vcardType, final Account account) { 671de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa this(vcardType, account, null); 684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa /** 711de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa * @deprecated targetCharset is not used anymore. 721de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa * Use {@link #VCardEntryConstructor(int, Account)} 734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 741de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa @Deprecated 754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public VCardEntryConstructor(final int vcardType, final Account account, 761de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa String targetCharset) { 774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mVCardType = vcardType; 784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mAccount = account; 794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void addEntryHandler(VCardEntryHandler entryHandler) { 824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mEntryHandlers.add(entryHandler); 834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 842bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa 852bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 861de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa public void onVCardStarted() { 874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (VCardEntryHandler entryHandler : mEntryHandlers) { 884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa entryHandler.onStart(); 894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 922bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 931de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa public void onVCardEnded() { 944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (VCardEntryHandler entryHandler : mEntryHandlers) { 954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa entryHandler.onEnd(); 964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void clear() { 10048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = null; 10148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mEntryStack.clear(); 1024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1042bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1051de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa public void onEntryStarted() { 10648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = new VCardEntry(mVCardType, mAccount); 10748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mEntryStack.add(mCurrentEntry); 1084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1102bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1111de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa public void onEntryEnded() { 11248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry.consolidateFields(); 1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (VCardEntryHandler entryHandler : mEntryHandlers) { 11448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa entryHandler.onEntryCreated(mCurrentEntry); 1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 11648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa 11748dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa final int size = mEntryStack.size(); 11848dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa if (size > 1) { 11948dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa VCardEntry parent = mEntryStack.get(size - 2); 12048dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa parent.addChild(mCurrentEntry); 12148dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = parent; 12248dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa } else { 12348dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mCurrentEntry = null; 12448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa } 12548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa mEntryStack.remove(size - 1); 1264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1282bf85a1a15a3175119ab8415fc590fd5fe3d0752Daisuke Miyakawa @Override 1291de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa public void onPropertyCreated(VCardProperty property) { 1301de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa mCurrentEntry.addProperty(property); 1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa} 133