BluetoothMapMessageListing.java revision 326b5e610063ac24c0ba467ac585bd4c7f618a67
1fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie/* 2fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* Copyright (C) 2013 Samsung System LSI 3fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* Licensed under the Apache License, Version 2.0 (the "License"); 4fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* you may not use this file except in compliance with the License. 5fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* You may obtain a copy of the License at 6fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* 7fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* http://www.apache.org/licenses/LICENSE-2.0 8fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* 9fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* Unless required by applicable law or agreed to in writing, software 10fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* distributed under the License is distributed on an "AS IS" BASIS, 11fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* See the License for the specific language governing permissions and 13fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie* limitations under the License. 14fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie*/ 15fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xiepackage com.android.bluetooth.map; 16fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 17fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport java.io.IOException; 18fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport java.io.StringWriter; 19fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport java.io.UnsupportedEncodingException; 20fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport java.util.ArrayList; 21fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport java.util.Collections; 22fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport java.util.List; 235079ae05a3fa7cf09d2d8e564b71382dfc70a1aeHemant Guptaimport com.android.internal.util.FastXmlSerializer; 24fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 25fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport org.xmlpull.v1.XmlSerializer; 26fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 27fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.util.Log; 28fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.util.Xml; 29fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 30fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xiepublic class BluetoothMapMessageListing { 3170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz private boolean hasUnread = false; 32fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final String TAG = "BluetoothMapMessageListing"; 33326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean D = BluetoothMapService.DEBUG; 34326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 35fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private List<BluetoothMapMessageListingElement> list; 36fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 37fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public BluetoothMapMessageListing(){ 38fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie list = new ArrayList<BluetoothMapMessageListingElement>(); 39fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 40fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void add(BluetoothMapMessageListingElement element) { 41fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie list.add(element); 4270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /* update info regarding whether the list contains unread messages */ 43326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (element.getReadBool()) 4470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz { 4570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz hasUnread = true; 4670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 47fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 48fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 49fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /** 50fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * Used to fetch the number of BluetoothMapMessageListingElement elements in the list. 51fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @return the number of elements in the list. 52fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie */ 53fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public int getCount() { 5470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if(list != null) 5570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz { 5670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return list.size(); 5770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 5870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return 0; 5970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 6070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 6170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 6270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * does the list contain any unread messages 6370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return true if unread messages have been added to the list, else false 6470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 6570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz public boolean hasUnread() 6670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz { 6770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return hasUnread; 68fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 6970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 70326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 71326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 72326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * returns the entire list as a list 73326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return list 74326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 75326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public List<BluetoothMapMessageListingElement> getList(){ 76326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return list; 77326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 78326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 79fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /** 80fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * Encode the list of BluetoothMapMessageListingElement(s) into a UTF-8 81fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * formatted XML-string in a trimmed byte array 82fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * 83fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @return a reference to the encoded byte array. 84fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @throws UnsupportedEncodingException 85fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * if UTF-8 encoding is unsupported on the platform. 86fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie */ 87326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public byte[] encode(boolean includeThreadId) throws UnsupportedEncodingException { 88fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie StringWriter sw = new StringWriter(); 895079ae05a3fa7cf09d2d8e564b71382dfc70a1aeHemant Gupta XmlSerializer xmlMsgElement = new FastXmlSerializer(); 90fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 91fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlMsgElement.setOutput(sw); 925079ae05a3fa7cf09d2d8e564b71382dfc70a1aeHemant Gupta xmlMsgElement.startDocument("UTF-8", true); 935079ae05a3fa7cf09d2d8e564b71382dfc70a1aeHemant Gupta xmlMsgElement.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 945079ae05a3fa7cf09d2d8e564b71382dfc70a1aeHemant Gupta xmlMsgElement.startTag(null, "MAP-msg-listing"); 955079ae05a3fa7cf09d2d8e564b71382dfc70a1aeHemant Gupta xmlMsgElement.attribute(null, "version", "1.0"); 96fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // Do the XML encoding of list 97fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie for (BluetoothMapMessageListingElement element : list) { 98326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde element.encode(xmlMsgElement, includeThreadId); // Append the list element 99fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1005079ae05a3fa7cf09d2d8e564b71382dfc70a1aeHemant Gupta xmlMsgElement.endTag(null, "MAP-msg-listing"); 101fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlMsgElement.endDocument(); 102fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IllegalArgumentException e) { 103326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 104fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IllegalStateException e) { 105326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 106fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 107326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 108fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 109fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return sw.toString().getBytes("UTF-8"); 110fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 111fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 112fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void sort() { 113fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Collections.sort(list); 114fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 115fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 116fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void segment(int count, int offset) { 117326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde count = Math.min(count, list.size() - offset); 118326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (count > 0) { 119fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie list = list.subList(offset, offset + count); 120326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(list == null) { 121326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde list = new ArrayList<BluetoothMapMessageListingElement>(); // Return an empty list 122326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 123fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 124c1f597b3ec02ccc112f3c917fd079588034c3eacHemant Gupta if(offset > list.size()) { 125c1f597b3ec02ccc112f3c917fd079588034c3eacHemant Gupta list = new ArrayList<BluetoothMapMessageListingElement>(); 126c1f597b3ec02ccc112f3c917fd079588034c3eacHemant Gupta Log.d(TAG, "offset greater than list size. Returning empty list"); 127c1f597b3ec02ccc112f3c917fd079588034c3eacHemant Gupta } else { 128c1f597b3ec02ccc112f3c917fd079588034c3eacHemant Gupta list = list.subList(offset, list.size()); 129c1f597b3ec02ccc112f3c917fd079588034c3eacHemant Gupta } 130fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 131fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 132fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie} 133