15a60e47497f21f64e6d79420dc4c56c1907df22akschulz/* 25a60e47497f21f64e6d79420dc4c56c1907df22akschulz* Copyright (C) 2015 Samsung System LSI 35a60e47497f21f64e6d79420dc4c56c1907df22akschulz* Licensed under the Apache License, Version 2.0 (the "License"); 45a60e47497f21f64e6d79420dc4c56c1907df22akschulz* you may not use this file except in compliance with the License. 55a60e47497f21f64e6d79420dc4c56c1907df22akschulz* You may obtain a copy of the License at 65a60e47497f21f64e6d79420dc4c56c1907df22akschulz* 75a60e47497f21f64e6d79420dc4c56c1907df22akschulz* http://www.apache.org/licenses/LICENSE-2.0 85a60e47497f21f64e6d79420dc4c56c1907df22akschulz* 95a60e47497f21f64e6d79420dc4c56c1907df22akschulz* Unless required by applicable law or agreed to in writing, software 105a60e47497f21f64e6d79420dc4c56c1907df22akschulz* distributed under the License is distributed on an "AS IS" BASIS, 115a60e47497f21f64e6d79420dc4c56c1907df22akschulz* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125a60e47497f21f64e6d79420dc4c56c1907df22akschulz* See the License for the specific language governing permissions and 135a60e47497f21f64e6d79420dc4c56c1907df22akschulz* limitations under the License. 145a60e47497f21f64e6d79420dc4c56c1907df22akschulz*/ 155a60e47497f21f64e6d79420dc4c56c1907df22akschulzpackage com.android.bluetooth.map; 165a60e47497f21f64e6d79420dc4c56c1907df22akschulz 175a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.IOException; 185a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.UnsupportedEncodingException; 195a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.text.ParseException; 205a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.text.SimpleDateFormat; 215a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.Date; 225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 235a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport org.xmlpull.v1.XmlPullParser; 245a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport org.xmlpull.v1.XmlPullParserException; 255a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport org.xmlpull.v1.XmlSerializer; 265a60e47497f21f64e6d79420dc4c56c1907df22akschulz 275a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.util.Log; 285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 295a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.SignedLongLong; 305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 315a60e47497f21f64e6d79420dc4c56c1907df22akschulzpublic class BluetoothMapConvoContactElement 325a60e47497f21f64e6d79420dc4c56c1907df22akschulz implements Comparable<BluetoothMapConvoContactElement> { 335a60e47497f21f64e6d79420dc4c56c1907df22akschulz 345a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long CONTACT_ID_TYPE_SMS_MMS = 1; 355a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long CONTACT_ID_TYPE_EMAIL = 2; 365a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long CONTACT_ID_TYPE_IM = 3; 375a60e47497f21f64e6d79420dc4c56c1907df22akschulz 385a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_PRIORITY = "priority"; 395a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_PRESENCE_STATUS = "presence_status"; 405a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_PRESENCE_AVAILABILITY = "presence_availability"; 415a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_X_BT_UID = "x_bt_uid"; 425a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_LAST_ACTIVITY = "last_activity"; 435a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_CHAT_STATE = "chat_state"; 445a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_NAME = "name"; 455a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_DISPLAY_NAME = "display_name"; 465a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String XML_ATT_UCI = "x_bt_uci"; 475a60e47497f21f64e6d79420dc4c56c1907df22akschulz protected static final String XML_TAG_CONVOCONTACT = "convocontact"; 485a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String TAG = "BluetoothMapConvoContactElement"; 495a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final boolean D = false; 505a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final boolean V = false; 515a60e47497f21f64e6d79420dc4c56c1907df22akschulz 525a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String mUci = null; 535a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String mName = null; 545a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String mDisplayName = null; 555a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String mPresenceStatus = null; 565a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mPresenceAvailability = -1; 575a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mPriority = -1; 585a60e47497f21f64e6d79420dc4c56c1907df22akschulz private long mLastActivity = -1; 595a60e47497f21f64e6d79420dc4c56c1907df22akschulz private SignedLongLong mBtUid = null; 605a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mChatState = -1; 615a60e47497f21f64e6d79420dc4c56c1907df22akschulz 625a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static BluetoothMapConvoContactElement createFromMapContact(MapContact contact, 635a60e47497f21f64e6d79420dc4c56c1907df22akschulz String address) { 645a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement newElement = new BluetoothMapConvoContactElement(); 655a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.mUci = address; 665a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: For now we use the ID as BT-UID 675a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.mBtUid = new SignedLongLong(contact.getId(),0); 685a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.mDisplayName = contact.getName(); 695a60e47497f21f64e6d79420dc4c56c1907df22akschulz return newElement; 705a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 715a60e47497f21f64e6d79420dc4c56c1907df22akschulz 725a60e47497f21f64e6d79420dc4c56c1907df22akschulz public BluetoothMapConvoContactElement(String uci, String name, String displayName, 735a60e47497f21f64e6d79420dc4c56c1907df22akschulz String presenceStatus, int presenceAvailability, long lastActivity, int chatState, 745a60e47497f21f64e6d79420dc4c56c1907df22akschulz int priority, String btUid) { 755a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mUci = uci; 765a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mName = name; 775a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mDisplayName = displayName; 785a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mPresenceStatus = presenceStatus; 795a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mPresenceAvailability = presenceAvailability; 805a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mLastActivity = lastActivity; 815a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mChatState = chatState; 825a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mPresenceStatus = presenceStatus; 835a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mPriority = priority; 845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(btUid != null) { 855a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 865a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mBtUid = SignedLongLong.fromString(btUid); 875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (UnsupportedEncodingException e) { 885a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG,e); 895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 935a60e47497f21f64e6d79420dc4c56c1907df22akschulz public BluetoothMapConvoContactElement() { 945a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO Auto-generated constructor stub 955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 965a60e47497f21f64e6d79420dc4c56c1907df22akschulz 975a60e47497f21f64e6d79420dc4c56c1907df22akschulz public String getPresenceStatus() { 985a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mPresenceStatus; 995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1005a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1015a60e47497f21f64e6d79420dc4c56c1907df22akschulz public String getDisplayName() { 1025a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mDisplayName; 1035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1045a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1055a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setDisplayName(String displayName) { 1065a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mDisplayName = displayName; 1075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1085a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1095a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setPresenceStatus(String presenceStatus) { 1105a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mPresenceStatus = presenceStatus; 1115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1125a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1135a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int getPresenceAvailability() { 1145a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mPresenceAvailability; 1155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1165a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1175a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setPresenceAvailability(int presenceAvailability) { 1185a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mPresenceAvailability = presenceAvailability; 1195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1205a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1215a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int getPriority() { 1225a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mPriority; 1235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1245a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1255a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setPriority(int priority) { 1265a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mPriority = priority; 1275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1295a60e47497f21f64e6d79420dc4c56c1907df22akschulz public String getName() { 1305a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mName; 1315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1325a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1335a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setName(String name) { 1345a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mName = name; 1355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1375a60e47497f21f64e6d79420dc4c56c1907df22akschulz public String getBtUid() { 1385a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mBtUid.toHexString(); 1395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1405a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1415a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setBtUid(SignedLongLong btUid) { 1425a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mBtUid = btUid; 1435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1445a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1455a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int getChatState() { 1465a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mChatState; 1475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1485a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1495a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setChatState(int chatState) { 1505a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mChatState = chatState; 1515a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1525a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1535a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setChatState(String chatState) { 1545a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mChatState = Integer.valueOf(chatState); 1555a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1565a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1575a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1585a60e47497f21f64e6d79420dc4c56c1907df22akschulz public String getLastActivityString() { 1595a60e47497f21f64e6d79420dc4c56c1907df22akschulz SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); 1605a60e47497f21f64e6d79420dc4c56c1907df22akschulz Date date = new Date(mLastActivity); 1615a60e47497f21f64e6d79420dc4c56c1907df22akschulz return format.format(date); // Format to YYYYMMDDTHHMMSS local time 1625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1645a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setLastActivity(long dateTime) { 1655a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mLastActivity = dateTime; 1665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1685a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setLastActivity(String lastActivity) throws ParseException { 1695a60e47497f21f64e6d79420dc4c56c1907df22akschulz SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); 1705a60e47497f21f64e6d79420dc4c56c1907df22akschulz Date date = format.parse(lastActivity); 1715a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mLastActivity = date.getTime(); 1725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1735a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1745a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setContactId(String uci) { 1755a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mUci = uci; 1765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1785a60e47497f21f64e6d79420dc4c56c1907df22akschulz public String getContactId(){ 1795a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mUci; 1805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1825a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int compareTo(BluetoothMapConvoContactElement e) { 1835a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (this.mLastActivity < e.mLastActivity) { 1845a60e47497f21f64e6d79420dc4c56c1907df22akschulz return 1; 1855a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (this.mLastActivity > e.mLastActivity) { 1865a60e47497f21f64e6d79420dc4c56c1907df22akschulz return -1; 1875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 1885a60e47497f21f64e6d79420dc4c56c1907df22akschulz return 0; 1895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1915a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1925a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Encode the MapConvoContactElement into the StringBuilder reference. 1935a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Here we have taken the choice not to report empty attributes, to reduce the 1945a60e47497f21f64e6d79420dc4c56c1907df22akschulz * amount of data to be transfered over BT. */ 1955a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void encode(XmlSerializer xmlConvoElement) 1965a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws IllegalArgumentException, IllegalStateException, IOException 1975a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 1985a60e47497f21f64e6d79420dc4c56c1907df22akschulz // construct the XML tag for a single contact in the convolisting element. 1995a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.startTag(null, XML_TAG_CONVOCONTACT); 2005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mUci != null) { 2015a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_UCI, mUci); 2025a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mDisplayName != null) { 2045a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_DISPLAY_NAME, 2055a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.stripInvalidChars(mDisplayName)); 2065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mName != null) { 2085a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_NAME, 2095a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.stripInvalidChars(mName)); 2105a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mChatState != -1) { 2125a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_CHAT_STATE, String.valueOf(mChatState)); 2135a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mLastActivity != -1) { 2155a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_LAST_ACTIVITY, 2165a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.getLastActivityString()); 2175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mBtUid != null) { 2195a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_X_BT_UID, mBtUid.toHexString()); 2205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mPresenceAvailability != -1) { 2225a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_PRESENCE_AVAILABILITY, 2235a60e47497f21f64e6d79420dc4c56c1907df22akschulz String.valueOf(mPresenceAvailability)); 2245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mPresenceStatus != null) { 2265a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_PRESENCE_STATUS, mPresenceStatus); 2275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mPriority != -1) { 2295a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.attribute(null, XML_ATT_PRIORITY, String.valueOf(mPriority)); 2305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2315a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2325a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlConvoElement.endTag(null, XML_TAG_CONVOCONTACT); 2335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2355a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2365a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 2375a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Call this function to create a BluetoothMapConvoContactElement. Will consume the end-tag. 2385a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param parser must point into XML_TAG_CONVERSATION tag, hence attributes can be read. 2395a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 2405a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @throws IOException 2415a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @throws XmlPullParserException 2425a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 2435a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static BluetoothMapConvoContactElement createFromXml(XmlPullParser parser) 2445a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws ParseException, XmlPullParserException, IOException { 2455a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = parser.getAttributeCount(); 2465a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement newElement; 2475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(count<1) { 2485a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException(XML_TAG_CONVOCONTACT + 2495a60e47497f21f64e6d79420dc4c56c1907df22akschulz " is not decorated with attributes"); 2505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2515a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement = new BluetoothMapConvoContactElement(); 2525a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (int i = 0; i<count; i++) { 2535a60e47497f21f64e6d79420dc4c56c1907df22akschulz String attributeName = parser.getAttributeName(i).trim(); 2545a60e47497f21f64e6d79420dc4c56c1907df22akschulz String attributeValue = parser.getAttributeValue(i); 2555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(attributeName.equalsIgnoreCase(XML_ATT_UCI)) { 2565a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.mUci = attributeValue; 2575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_NAME)) { 2585a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.mName = attributeValue; 2595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_DISPLAY_NAME)) { 2605a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.mDisplayName = attributeValue; 2615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_CHAT_STATE)) { 2625a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.setChatState(attributeValue); 2635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_LAST_ACTIVITY)) { 2645a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.setLastActivity(attributeValue); 2655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_X_BT_UID)) { 2665a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.setBtUid(SignedLongLong.fromString(attributeValue)); 2675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_PRESENCE_AVAILABILITY)) { 2685a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.mPresenceAvailability = Integer.parseInt(attributeValue); 2695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_PRESENCE_STATUS)) { 2705a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.setPresenceStatus(attributeValue); 2715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(attributeName.equalsIgnoreCase(XML_ATT_PRIORITY)) { 2725a60e47497f21f64e6d79420dc4c56c1907df22akschulz newElement.setPriority(Integer.parseInt(attributeValue)); 2735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 2745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.i(TAG,"Unknown XML attribute: " + parser.getAttributeName(i)); 2755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2775a60e47497f21f64e6d79420dc4c56c1907df22akschulz parser.nextTag(); // Consume the end-tag 2785a60e47497f21f64e6d79420dc4c56c1907df22akschulz return newElement; 2795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2805a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2815a60e47497f21f64e6d79420dc4c56c1907df22akschulz @Override 2825a60e47497f21f64e6d79420dc4c56c1907df22akschulz public boolean equals(Object obj) { 2835a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (this == obj) { 2845a60e47497f21f64e6d79420dc4c56c1907df22akschulz return true; 2855a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2865a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (obj == null) { 2875a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 2885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (getClass() != obj.getClass()) { 2905a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 2915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2925a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement other = (BluetoothMapConvoContactElement) obj; 2935a60e47497f21f64e6d79420dc4c56c1907df22akschulz/* As we use equals only for test, we don't compare auto assigned values 2945a60e47497f21f64e6d79420dc4c56c1907df22akschulz * if (mBtUid == null) { 2955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (other.mBtUid != null) { 2965a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 2975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2985a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (!mBtUid.equals(other.mBtUid)) { 2995a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3005a60e47497f21f64e6d79420dc4c56c1907df22akschulz }*/ 3015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mChatState != other.mChatState) { 3025a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mDisplayName == null) { 3055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (other.mDisplayName != null) { 3065a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (!mDisplayName.equals(other.mDisplayName)) { 3095a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3105a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3115a60e47497f21f64e6d79420dc4c56c1907df22akschulz/* As we use equals only for test, we don't compare auto assigned values 3125a60e47497f21f64e6d79420dc4c56c1907df22akschulz * if (mId == null) { 3135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (other.mId != null) { 3145a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (!mId.equals(other.mId)) { 3175a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3185a60e47497f21f64e6d79420dc4c56c1907df22akschulz }*/ 3195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mLastActivity != other.mLastActivity) { 3205a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mName == null) { 3235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (other.mName != null) { 3245a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (!mName.equals(other.mName)) { 3275a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mPresenceAvailability != other.mPresenceAvailability) { 3305a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mPresenceStatus == null) { 3335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (other.mPresenceStatus != null) { 3345a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (!mPresenceStatus.equals(other.mPresenceStatus)) { 3375a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3395a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mPriority != other.mPriority) { 3405a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 3415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3425a60e47497f21f64e6d79420dc4c56c1907df22akschulz return true; 3435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3445a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3455a60e47497f21f64e6d79420dc4c56c1907df22akschulz} 3465a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3475a60e47497f21f64e6d79420dc4c56c1907df22akschulz 348