VCardProperty.java revision 1de396f6df89363169d3a2e61a61fa98d12c1ef8
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2011 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.vcard;
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Arrays;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Collection;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashMap;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashSet;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Map;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Represents vCard's property, or logical "one line" of each vCard entry.
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * e.g.
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Given a vCard below, objects for <code>N:name</code>, <code>TEL:1111111111</code> are
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * "property".
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * BEGIN:VCARD
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * N:name
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * TEL:1111111111
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * END:VCARD
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * </code>
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * vCard's property has three elements: name, parameter (or param), and value. Name is the name
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * of each property. Parameter or param is additional information for the property. Value is one
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * or multiple values representing the parameter.
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * e.g.
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * <code>N;CHARSET=UTF-8:Joe;Due;M.;Mr.;Ph.D.</code>, has "N" for name, "CHALSET=UTF-8" for param,
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and "Joe;Due;M.;Mr.;Ph.D." for value.
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Usually params are represented as "key=value" pair, but not always
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (The property <code>TEL;WORK;VOICE:(111) 555-1212</code> has two params without key "TYPE",
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * which are same as "TYPE=WORK" and "TYPE=VOICE". In vCard 3.0, we can even express them as
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * "TYPE=WORK,VOICE").
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Sometimes (not always) value can be separated by semi-colon. In the example above "Joe;Due;;;"
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * should be interpreted as five strings: "Joe" (for family name), "Due" (for given name), "M."
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (for middle name), "Mr." (for prefix), and "Ph.D." (for suffix). Whether the value is
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * separable or not is specified by vCard specs.
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class VCardProperty {
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String LOG_TAG = VCardConstants.LOG_TAG;
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mName;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private List<String> mGroupList;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Map<String, Collection<String>> mParameterMap =
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            new HashMap<String, Collection<String>>();
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mRawValue;
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private List<String> mValueList;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private byte[] mByteValue;
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setName(String name) {
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mName != null) {
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.w(LOG_TAG, String.format("Property name is re-defined " +
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "(existing: %s, requested: %s", mName, name));
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mName = name;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void addGroup(String group) {
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mGroupList == null) {
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mGroupList = new ArrayList<String>();
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mGroupList.add(group);
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setParameter(final String paramName, final String paramValue) {
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mParameterMap.clear();
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        addParameter(paramName, paramValue);
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void addParameter(final String paramName, final String paramValue) {
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Collection<String> values;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!mParameterMap.containsKey(paramName)) {
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (paramName.equals("TYPE")) {
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                values = new HashSet<String>();
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                values = new ArrayList<String>();
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mParameterMap.put(paramName, values);
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            values = mParameterMap.get(paramName);
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        values.add(paramValue);
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setRawValue(String rawValue) {
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRawValue = rawValue;
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // TODO: would be much better to have translateRawValue() functionality instead of forcing
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // VCardParserImpl does this job.
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setValues(String... propertyValues) {
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mValueList = Arrays.asList(propertyValues);
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setValues(List<String> propertyValueList) {
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mValueList = propertyValueList;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void addValues(String... propertyValues) {
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mValueList == null) {
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mValueList = Arrays.asList(propertyValues);
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mValueList.addAll(Arrays.asList(propertyValues));
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void addValues(List<String> propertyValueList) {
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mValueList == null) {
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mValueList = new ArrayList<String>(propertyValueList);
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mValueList.addAll(propertyValueList);
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setByteValue(byte[] byteValue) {
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mByteValue = byteValue;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getName() {
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mName;
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public List<String> getGroupList() {
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mGroupList;
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Map<String, Collection<String>> getParameterMap() {
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mParameterMap;
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Collection<String> getParameters(String type) {
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mParameterMap.get(type);
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getRawValue() {
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRawValue;
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public List<String> getValueList() {
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mValueList;
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public byte[] getByteValue() {
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mByteValue;
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville