Home | History | Annotate | Download | only in map
      1 /*
      2 * Copyright (C) 2013 Samsung System LSI
      3 * Licensed under the Apache License, Version 2.0 (the "License");
      4 * you may not use this file except in compliance with the License.
      5 * You may obtain a copy of the License at
      6 *
      7 *      http://www.apache.org/licenses/LICENSE-2.0
      8 *
      9 * Unless required by applicable law or agreed to in writing, software
     10 * distributed under the License is distributed on an "AS IS" BASIS,
     11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 * See the License for the specific language governing permissions and
     13 * limitations under the License.
     14 */
     15 package com.android.bluetooth.map;
     16 
     17 import java.io.IOException;
     18 import java.io.StringWriter;
     19 
     20 import java.text.SimpleDateFormat;
     21 import java.util.Date;
     22 
     23 import org.xmlpull.v1.XmlSerializer;
     24 
     25 import android.telephony.PhoneNumberUtils;
     26 import android.util.Log;
     27 import android.util.Xml;
     28 
     29 import com.android.bluetooth.map.BluetoothMapUtils.TYPE;
     30 
     31 public class BluetoothMapMessageListingElement
     32     implements Comparable<BluetoothMapMessageListingElement> {
     33 
     34     private static final String TAG = "BluetoothMapMessageListingElement";
     35     private static final boolean D = false;
     36     private static final boolean V = false;
     37 
     38     private long mCpHandle = 0; /* The content provider handle - without type information */
     39     private String mSubject = null;
     40     private long mDateTime = 0;
     41     private String mSenderName = null;
     42     private String mSenderAddressing = null;
     43     private String mReplytoAddressing = null;
     44     private String mRecipientName = null;
     45     private String mRecipientAddressing = null;
     46     private TYPE mType = null;
     47     private int mSize = -1;
     48     private String mText = null;
     49     private String mReceptionStatus = null;
     50     private int mAttachmentSize = -1;
     51     private String mPriority = null;
     52     private boolean mRead = false;
     53     private String mSent = null;
     54     private String mProtect = null;
     55     private String mThreadId = null;
     56     private boolean mReportRead = false;
     57     private int mCursorIndex = 0;
     58 
     59     public int getCursorIndex() {
     60         return mCursorIndex;
     61     }
     62 
     63     public void setCursorIndex(int cursorIndex) {
     64         this.mCursorIndex = cursorIndex;
     65     }
     66 
     67     public long getHandle() {
     68         return mCpHandle;
     69     }
     70 
     71     public void setHandle(long handle) {
     72         this.mCpHandle = handle;
     73     }
     74 
     75     public long getDateTime() {
     76         return mDateTime;
     77     }
     78 
     79     public String getDateTimeString() {
     80         SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
     81         Date date = new Date(mDateTime);
     82         return format.format(date); // Format to YYYYMMDDTHHMMSS local time
     83     }
     84 
     85     public void setDateTime(long dateTime) {
     86         this.mDateTime = dateTime;
     87     }
     88 
     89     public String getSubject() {
     90         return mSubject;
     91     }
     92 
     93     public void setSubject(String subject) {
     94         this.mSubject = subject;
     95     }
     96 
     97     public String getSenderName() {
     98         return mSenderName;
     99     }
    100 
    101     public void setSenderName(String senderName) {
    102         this.mSenderName = senderName;
    103     }
    104 
    105     public String getSenderAddressing() {
    106         return mSenderAddressing;
    107     }
    108 
    109     public void setSenderAddressing(String senderAddressing) {
    110         this.mSenderAddressing = senderAddressing;
    111     }
    112 
    113     public String getReplyToAddressing() {
    114         return mReplytoAddressing;
    115     }
    116 
    117     public void setReplytoAddressing(String replytoAddressing) {
    118         this.mReplytoAddressing = replytoAddressing;
    119     }
    120 
    121     public String getRecipientName() {
    122         return mRecipientName;
    123     }
    124 
    125     public void setRecipientName(String recipientName) {
    126         this.mRecipientName = recipientName;
    127     }
    128 
    129     public String getRecipientAddressing() {
    130         return mRecipientAddressing;
    131     }
    132 
    133     public void setRecipientAddressing(String recipientAddressing) {
    134         this.mRecipientAddressing = recipientAddressing;
    135     }
    136 
    137     public TYPE getType() {
    138         return mType;
    139     }
    140 
    141     public void setType(TYPE type) {
    142         this.mType = type;
    143     }
    144 
    145     public int getSize() {
    146         return mSize;
    147     }
    148 
    149     public void setSize(int size) {
    150         this.mSize = size;
    151     }
    152 
    153     public String getText() {
    154         return mText;
    155     }
    156 
    157     public void setText(String text) {
    158         this.mText = text;
    159     }
    160 
    161     public String getReceptionStatus() {
    162         return mReceptionStatus;
    163     }
    164 
    165     public void setReceptionStatus(String receptionStatus) {
    166         this.mReceptionStatus = receptionStatus;
    167     }
    168 
    169     public int getAttachmentSize() {
    170         return mAttachmentSize;
    171     }
    172 
    173     public void setAttachmentSize(int attachmentSize) {
    174         this.mAttachmentSize = attachmentSize;
    175     }
    176 
    177     public String getPriority() {
    178         return mPriority;
    179     }
    180 
    181     public void setPriority(String priority) {
    182         this.mPriority = priority;
    183     }
    184 
    185     public String getRead() {
    186         return (mRead?"yes":"no");
    187     }
    188     public boolean getReadBool() {
    189         return mRead;
    190     }
    191 
    192     public void setRead(boolean read, boolean reportRead) {
    193         this.mRead = read;
    194         this.mReportRead = reportRead;
    195     }
    196 
    197     public String getSent() {
    198         return mSent;
    199     }
    200 
    201     public void setSent(String sent) {
    202         this.mSent = sent;
    203     }
    204 
    205     public String getProtect() {
    206         return mProtect;
    207     }
    208 
    209     public void setProtect(String protect) {
    210         this.mProtect = protect;
    211     }
    212 
    213     public void setThreadId(long threadId) {
    214         if(threadId != -1) {
    215             this.mThreadId = BluetoothMapUtils.getLongAsString(threadId);
    216         }
    217     }
    218 
    219     public int compareTo(BluetoothMapMessageListingElement e) {
    220         if (this.mDateTime < e.mDateTime) {
    221             return 1;
    222         } else if (this.mDateTime > e.mDateTime) {
    223             return -1;
    224         } else {
    225             return 0;
    226         }
    227     }
    228 
    229     /**
    230      * Strip away any illegal XML characters, that would otherwise cause the
    231      * xml serializer to throw an exception.
    232      * Examples of such characters are the emojis used on Android.
    233      * @param text The string to validate
    234      * @return the same string if valid, otherwise a new String stripped for
    235      * any illegal characters
    236      */
    237     private static String stripInvalidChars(String text) {
    238         char out[] = new char[text.length()];
    239         int i, o, l;
    240         for(i=0, o=0, l=text.length(); i<l; i++){
    241             char c = text.charAt(i);
    242             if((c >= 0x20 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfffd)) {
    243                 out[o++] = c;
    244             } // Else we skip the character
    245         }
    246 
    247         if(i==o) {
    248             return text;
    249         } else { // We removed some characters, create the new string
    250             return new String(out,0,o);
    251         }
    252     }
    253 
    254     /* Encode the MapMessageListingElement into the StringBuilder reference.
    255      * */
    256     public void encode(XmlSerializer xmlMsgElement, boolean includeThreadId) throws IllegalArgumentException, IllegalStateException, IOException
    257     {
    258 
    259             // contruct the XML tag for a single msg in the msglisting
    260             xmlMsgElement.startTag(null, "msg");
    261             xmlMsgElement.attribute(null, "handle", BluetoothMapUtils.getMapHandle(mCpHandle, mType));
    262             if(mSubject != null)
    263                 xmlMsgElement.attribute(null, "subject", stripInvalidChars(mSubject));
    264             if(mDateTime != 0)
    265                 xmlMsgElement.attribute(null, "datetime", this.getDateTimeString());
    266             if(mSenderName != null)
    267                 xmlMsgElement.attribute(null, "sender_name", stripInvalidChars(mSenderName));
    268             if(mSenderAddressing != null)
    269                 xmlMsgElement.attribute(null, "sender_addressing", mSenderAddressing);
    270             if(mReplytoAddressing != null)
    271                 xmlMsgElement.attribute(null, "replyto_addressing",mReplytoAddressing);
    272             if(mRecipientName != null)
    273                 xmlMsgElement.attribute(null, "recipient_name", stripInvalidChars(mRecipientName));
    274             if(mRecipientAddressing != null)
    275                 xmlMsgElement.attribute(null, "recipient_addressing", mRecipientAddressing);
    276             if(mType != null)
    277                 xmlMsgElement.attribute(null, "type", mType.name());
    278             if(mSize != -1)
    279                 xmlMsgElement.attribute(null, "size", Integer.toString(mSize));
    280             if(mText != null)
    281                 xmlMsgElement.attribute(null, "text", mText);
    282             if(mReceptionStatus != null)
    283                 xmlMsgElement.attribute(null, "reception_status", mReceptionStatus);
    284             if(mAttachmentSize != -1)
    285                 xmlMsgElement.attribute(null, "attachment_size", Integer.toString(mAttachmentSize));
    286             if(mPriority != null)
    287                 xmlMsgElement.attribute(null, "priority", mPriority);
    288             if(mReportRead)
    289                 xmlMsgElement.attribute(null, "read", getRead());
    290             if(mSent != null)
    291                 xmlMsgElement.attribute(null, "sent", mSent);
    292             if(mProtect != null)
    293                 xmlMsgElement.attribute(null, "protected", mProtect);
    294             if(mThreadId != null && includeThreadId == true)
    295                 xmlMsgElement.attribute(null, "thread_id", mThreadId);
    296             xmlMsgElement.endTag(null, "msg");
    297 
    298     }
    299 }
    300 
    301 
    302