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