blob: 8ee9728e3e9a3b54d2662be817db22ddeac13229 [file] [log] [blame]
/*
* Copyright (C) 2015 Samsung System LSI
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.bluetooth.map;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import android.util.Log;
import com.android.bluetooth.SignedLongLong;
public class BluetoothMapConvoContactElement
implements Comparable<BluetoothMapConvoContactElement> {
public static final long CONTACT_ID_TYPE_SMS_MMS = 1;
public static final long CONTACT_ID_TYPE_EMAIL = 2;
public static final long CONTACT_ID_TYPE_IM = 3;
private static final String XML_ATT_PRIORITY = "priority";
private static final String XML_ATT_PRESENCE_STATUS = "presence_status";
private static final String XML_ATT_PRESENCE_AVAILABILITY = "presence_availability";
private static final String XML_ATT_X_BT_UID = "x_bt_uid";
private static final String XML_ATT_LAST_ACTIVITY = "last_activity";
private static final String XML_ATT_CHAT_STATE = "chat_state";
private static final String XML_ATT_NAME = "name";
private static final String XML_ATT_DISPLAY_NAME = "display_name";
private static final String XML_ATT_UCI = "x_bt_uci";
protected static final String XML_TAG_CONVOCONTACT = "convocontact";
private static final String TAG = "BluetoothMapConvoContactElement";
private static final boolean D = false;
private static final boolean V = false;
private String mUci = null;
private String mName = null;
private String mDisplayName = null;
private String mPresenceStatus = null;
private int mPresenceAvailability = -1;
private int mPriority = -1;
private long mLastActivity = -1;
private SignedLongLong mBtUid = null;
private int mChatState = -1;
public static BluetoothMapConvoContactElement createFromMapContact(MapContact contact,
String address) {
BluetoothMapConvoContactElement newElement = new BluetoothMapConvoContactElement();
newElement.mUci = address;
// TODO: For now we use the ID as BT-UID
newElement.mBtUid = new SignedLongLong(contact.getId(),0);
newElement.mDisplayName = contact.getName();
return newElement;
}
public BluetoothMapConvoContactElement(String uci, String name, String displayName,
String presenceStatus, int presenceAvailability, long lastActivity, int chatState,
int priority, String btUid) {
this.mUci = uci;
this.mName = name;
this.mDisplayName = displayName;
this.mPresenceStatus = presenceStatus;
this.mPresenceAvailability = presenceAvailability;
this.mLastActivity = lastActivity;
this.mChatState = chatState;
this.mPresenceStatus = presenceStatus;
this.mPriority = priority;
if(btUid != null) {
try {
this.mBtUid = SignedLongLong.fromString(btUid);
} catch (UnsupportedEncodingException e) {
Log.w(TAG,e);
}
}
}
public BluetoothMapConvoContactElement() {
// TODO Auto-generated constructor stub
}
public String getPresenceStatus() {
return mPresenceStatus;
}
public String getDisplayName() {
return mDisplayName;
}
public void setDisplayName(String displayName) {
this.mDisplayName = displayName;
}
public void setPresenceStatus(String presenceStatus) {
this.mPresenceStatus = presenceStatus;
}
public int getPresenceAvailability() {
return mPresenceAvailability;
}
public void setPresenceAvailability(int presenceAvailability) {
this.mPresenceAvailability = presenceAvailability;
}
public int getPriority() {
return mPriority;
}
public void setPriority(int priority) {
this.mPriority = priority;
}
public String getName() {
return mName;
}
public void setName(String name) {
this.mName = name;
}
public String getBtUid() {
return mBtUid.toHexString();
}
public void setBtUid(SignedLongLong btUid) {
this.mBtUid = btUid;
}
public int getChatState() {
return mChatState;
}
public void setChatState(int chatState) {
this.mChatState = chatState;
}
public void setChatState(String chatState) {
this.mChatState = Integer.valueOf(chatState);
}
public String getLastActivityString() {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
Date date = new Date(mLastActivity);
return format.format(date); // Format to YYYYMMDDTHHMMSS local time
}
public void setLastActivity(long dateTime) {
this.mLastActivity = dateTime;
}
public void setLastActivity(String lastActivity) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
Date date = format.parse(lastActivity);
this.mLastActivity = date.getTime();
}
public void setContactId(String uci) {
this.mUci = uci;
}
public String getContactId(){
return mUci;
}
public int compareTo(BluetoothMapConvoContactElement e) {
if (this.mLastActivity < e.mLastActivity) {
return 1;
} else if (this.mLastActivity > e.mLastActivity) {
return -1;
} else {
return 0;
}
}
/* Encode the MapConvoContactElement into the StringBuilder reference.
* Here we have taken the choice not to report empty attributes, to reduce the
* amount of data to be transfered over BT. */
public void encode(XmlSerializer xmlConvoElement)
throws IllegalArgumentException, IllegalStateException, IOException
{
// construct the XML tag for a single contact in the convolisting element.
xmlConvoElement.startTag(null, XML_TAG_CONVOCONTACT);
if(mUci != null) {
xmlConvoElement.attribute(null, XML_ATT_UCI, mUci);
}
if(mDisplayName != null) {
xmlConvoElement.attribute(null, XML_ATT_DISPLAY_NAME,
BluetoothMapUtils.stripInvalidChars(mDisplayName));
}
if(mName != null) {
xmlConvoElement.attribute(null, XML_ATT_NAME,
BluetoothMapUtils.stripInvalidChars(mName));
}
if(mChatState != -1) {
xmlConvoElement.attribute(null, XML_ATT_CHAT_STATE, String.valueOf(mChatState));
}
if(mLastActivity != -1) {
xmlConvoElement.attribute(null, XML_ATT_LAST_ACTIVITY,
this.getLastActivityString());
}
if(mBtUid != null) {
xmlConvoElement.attribute(null, XML_ATT_X_BT_UID, mBtUid.toHexString());
}
if(mPresenceAvailability != -1) {
xmlConvoElement.attribute(null, XML_ATT_PRESENCE_AVAILABILITY,
String.valueOf(mPresenceAvailability));
}
if(mPresenceStatus != null) {
xmlConvoElement.attribute(null, XML_ATT_PRESENCE_STATUS, mPresenceStatus);
}
if(mPriority != -1) {
xmlConvoElement.attribute(null, XML_ATT_PRIORITY, String.valueOf(mPriority));
}
xmlConvoElement.endTag(null, XML_TAG_CONVOCONTACT);
}
/**
* Call this function to create a BluetoothMapConvoContactElement. Will consume the end-tag.
* @param parser must point into XML_TAG_CONVERSATION tag, hence attributes can be read.
* @return
* @throws IOException
* @throws XmlPullParserException
*/
public static BluetoothMapConvoContactElement createFromXml(XmlPullParser parser)
throws ParseException, XmlPullParserException, IOException {
int count = parser.getAttributeCount();
BluetoothMapConvoContactElement newElement;
if(count<1) {
throw new IllegalArgumentException(XML_TAG_CONVOCONTACT +
" is not decorated with attributes");
}
newElement = new BluetoothMapConvoContactElement();
for (int i = 0; i<count; i++) {
String attributeName = parser.getAttributeName(i).trim();
String attributeValue = parser.getAttributeValue(i);
if(attributeName.equalsIgnoreCase(XML_ATT_UCI)) {
newElement.mUci = attributeValue;
} else if(attributeName.equalsIgnoreCase(XML_ATT_NAME)) {
newElement.mName = attributeValue;
} else if(attributeName.equalsIgnoreCase(XML_ATT_DISPLAY_NAME)) {
newElement.mDisplayName = attributeValue;
} else if(attributeName.equalsIgnoreCase(XML_ATT_CHAT_STATE)) {
newElement.setChatState(attributeValue);
} else if(attributeName.equalsIgnoreCase(XML_ATT_LAST_ACTIVITY)) {
newElement.setLastActivity(attributeValue);
} else if(attributeName.equalsIgnoreCase(XML_ATT_X_BT_UID)) {
newElement.setBtUid(SignedLongLong.fromString(attributeValue));
} else if(attributeName.equalsIgnoreCase(XML_ATT_PRESENCE_AVAILABILITY)) {
newElement.mPresenceAvailability = Integer.parseInt(attributeValue);
} else if(attributeName.equalsIgnoreCase(XML_ATT_PRESENCE_STATUS)) {
newElement.setPresenceStatus(attributeValue);
} else if(attributeName.equalsIgnoreCase(XML_ATT_PRIORITY)) {
newElement.setPriority(Integer.parseInt(attributeValue));
} else {
if(D) Log.i(TAG,"Unknown XML attribute: " + parser.getAttributeName(i));
}
}
parser.nextTag(); // Consume the end-tag
return newElement;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
BluetoothMapConvoContactElement other = (BluetoothMapConvoContactElement) obj;
/* As we use equals only for test, we don't compare auto assigned values
* if (mBtUid == null) {
if (other.mBtUid != null) {
return false;
}
} else if (!mBtUid.equals(other.mBtUid)) {
return false;
}*/
if (mChatState != other.mChatState) {
return false;
}
if (mDisplayName == null) {
if (other.mDisplayName != null) {
return false;
}
} else if (!mDisplayName.equals(other.mDisplayName)) {
return false;
}
/* As we use equals only for test, we don't compare auto assigned values
* if (mId == null) {
if (other.mId != null) {
return false;
}
} else if (!mId.equals(other.mId)) {
return false;
}*/
if (mLastActivity != other.mLastActivity) {
return false;
}
if (mName == null) {
if (other.mName != null) {
return false;
}
} else if (!mName.equals(other.mName)) {
return false;
}
if (mPresenceAvailability != other.mPresenceAvailability) {
return false;
}
if (mPresenceStatus == null) {
if (other.mPresenceStatus != null) {
return false;
}
} else if (!mPresenceStatus.equals(other.mPresenceStatus)) {
return false;
}
if (mPriority != other.mPriority) {
return false;
}
return true;
}
}