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