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