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 import java.io.UnsupportedEncodingException;
     20 import java.util.ArrayList;
     21 import java.util.Collections;
     22 import java.util.List;
     23 import com.android.internal.util.FastXmlSerializer;
     24 
     25 import org.xmlpull.v1.XmlSerializer;
     26 
     27 import android.util.Log;
     28 import android.util.Xml;
     29 
     30 public class BluetoothMapMessageListing {
     31     private boolean hasUnread = false;
     32     private static final String TAG = "BluetoothMapMessageListing";
     33     private static final boolean D = BluetoothMapService.DEBUG;
     34 
     35     private List<BluetoothMapMessageListingElement> list;
     36 
     37     public BluetoothMapMessageListing(){
     38      list = new ArrayList<BluetoothMapMessageListingElement>();
     39     }
     40     public void add(BluetoothMapMessageListingElement element) {
     41         list.add(element);
     42         /* update info regarding whether the list contains unread messages */
     43         if (element.getReadBool())
     44         {
     45             hasUnread = true;
     46         }
     47     }
     48 
     49     /**
     50      * Used to fetch the number of BluetoothMapMessageListingElement elements in the list.
     51      * @return the number of elements in the list.
     52      */
     53     public int getCount() {
     54         if(list != null)
     55         {
     56             return list.size();
     57         }
     58         return 0;
     59     }
     60 
     61     /**
     62      * does the list contain any unread messages
     63      * @return true if unread messages have been added to the list, else false
     64      */
     65     public boolean hasUnread()
     66     {
     67         return hasUnread;
     68     }
     69 
     70 
     71     /**
     72      *  returns the entire list as a list
     73      * @return list
     74      */
     75     public List<BluetoothMapMessageListingElement> getList(){
     76         return list;
     77     }
     78 
     79     /**
     80      * Encode the list of BluetoothMapMessageListingElement(s) into a UTF-8
     81      * formatted XML-string in a trimmed byte array
     82      *
     83      * @return a reference to the encoded byte array.
     84      * @throws UnsupportedEncodingException
     85      *             if UTF-8 encoding is unsupported on the platform.
     86      */
     87     public byte[] encode(boolean includeThreadId) throws UnsupportedEncodingException {
     88         StringWriter sw = new StringWriter();
     89         XmlSerializer xmlMsgElement = new FastXmlSerializer();
     90         try {
     91             xmlMsgElement.setOutput(sw);
     92             xmlMsgElement.startDocument("UTF-8", true);
     93             xmlMsgElement.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
     94             xmlMsgElement.startTag(null, "MAP-msg-listing");
     95             xmlMsgElement.attribute(null, "version", "1.0");
     96             // Do the XML encoding of list
     97             for (BluetoothMapMessageListingElement element : list) {
     98                 element.encode(xmlMsgElement, includeThreadId); // Append the list element
     99             }
    100             xmlMsgElement.endTag(null, "MAP-msg-listing");
    101             xmlMsgElement.endDocument();
    102         } catch (IllegalArgumentException e) {
    103             Log.w(TAG, e);
    104         } catch (IllegalStateException e) {
    105             Log.w(TAG, e);
    106         } catch (IOException e) {
    107             Log.w(TAG, e);
    108         }
    109         return sw.toString().getBytes("UTF-8");
    110     }
    111 
    112     public void sort() {
    113         Collections.sort(list);
    114     }
    115 
    116     public void segment(int count, int offset) {
    117         count = Math.min(count, list.size() - offset);
    118         if (count > 0) {
    119             list = list.subList(offset, offset + count);
    120             if(list == null) {
    121                 list = new ArrayList<BluetoothMapMessageListingElement>(); // Return an empty list
    122             }
    123         } else {
    124             if(offset > list.size()) {
    125                list = new ArrayList<BluetoothMapMessageListingElement>();
    126                Log.d(TAG, "offset greater than list size. Returning empty list");
    127             } else {
    128                list = list.subList(offset, list.size());
    129             }
    130         }
    131     }
    132 }
    133