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