BluetoothMapContent.java revision 28446a56718e80574ba7b81901fc5a1368bf5839
1fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie/* 2326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde* Copyright (C) 2014 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 org.apache.http.util.ByteArrayBuffer; 18fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.ContentResolver; 20fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.ContentValues; 21fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.Context; 22fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.database.Cursor; 23fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.net.Uri; 24326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.os.Debug; 25326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.os.ParcelFileDescriptor; 26fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.BaseColumns; 27326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport com.android.bluetooth.mapapi.BluetoothMapContract; 28326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport com.android.bluetooth.mapapi.BluetoothMapContract.MessageColumns; 29fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.ContactsContract; 30fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.ContactsContract.Contacts; 31fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.ContactsContract.PhoneLookup; 32fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.Mms; 33fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.Sms; 34326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.telephony.PhoneNumberUtils; 35fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.telephony.TelephonyManager; 36326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.text.util.Rfc822Token; 37326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.text.util.Rfc822Tokenizer; 38fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.util.Log; 39fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 40326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport com.android.bluetooth.map.BluetoothMapSmsPdu.SmsPdu; 41fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.android.bluetooth.map.BluetoothMapUtils.TYPE; 42fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.google.android.mms.pdu.CharacterSets; 4314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulzimport com.google.android.mms.pdu.PduHeaders; 44326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport com.android.bluetooth.map.BluetoothMapAppParams; 45326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 46326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.ByteArrayOutputStream; 4728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulzimport java.io.Closeable; 48326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.FileInputStream; 49326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.FileNotFoundException; 50326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.IOException; 51326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.InputStream; 52326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.UnsupportedEncodingException; 53326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.text.ParseException; 54326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.text.SimpleDateFormat; 55326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.ArrayList; 56326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.Arrays; 57326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.Date; 58326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.List; 59fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 60fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xiepublic class BluetoothMapContent { 61fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final String TAG = "BluetoothMapContent"; 62fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 63326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean D = BluetoothMapService.DEBUG; 64326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean V = BluetoothMapService.VERBOSE; 65fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 66fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_SUBJECT = 0x1; 67fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_DATETIME = 0x2; 68fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_SENDER_NAME = 0x4; 69fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_SENDER_ADDRESSING = 0x8; 70fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 71fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_RECIPIENT_NAME = 0x10; 72fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_RECIPIENT_ADDRESSING = 0x20; 73fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_TYPE = 0x40; 74fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_SIZE = 0x80; 75fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 76fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_RECEPTION_STATUS = 0x100; 77fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_TEXT = 0x200; 78fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_ATTACHMENT_SIZE = 0x400; 79fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_PRIORITY = 0x800; 80fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 81fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_READ = 0x1000; 82fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_SENT = 0x2000; 83fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_PROTECTED = 0x4000; 84fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final int MASK_REPLYTO_ADDRESSING = 0x8000; 85fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 86fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Type of MMS address. From Telephony.java it must be one of PduHeaders.BCC, */ 87fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* PduHeaders.CC, PduHeaders.FROM, PduHeaders.TO. These are from PduHeaders.java */ 88fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MMS_FROM = 0x89; 89fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MMS_TO = 0x97; 90fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MMS_BCC = 0x81; 91fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MMS_CC = 0x82; 92fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 93326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public static final String INSERT_ADDRES_TOKEN = "insert-address-token"; 94326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 95fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private Context mContext; 96fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private ContentResolver mResolver; 97326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String mBaseEmailUri = null; 98fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 99fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static final String[] SMS_PROJECTION = new String[] { 100fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BaseColumns._ID, 101fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.THREAD_ID, 102fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.ADDRESS, 103fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.BODY, 104fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.DATE, 105fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.READ, 106fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.TYPE, 107fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.STATUS, 108fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.LOCKED, 109326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms.ERROR_CODE 110fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 111fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 112fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static final String[] MMS_PROJECTION = new String[] { 113fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BaseColumns._ID, 114fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.THREAD_ID, 115fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_ID, 116fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_SIZE, 117fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.SUBJECT, 118fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.CONTENT_TYPE, 119fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.TEXT_ONLY, 120fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.DATE, 121fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.DATE_SENT, 122fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.READ, 123fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_BOX, 124fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.STATUS, 125326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Mms.PRIORITY 126fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 127fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 128fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private class FilterInfo { 129fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int TYPE_SMS = 0; 130fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int TYPE_MMS = 1; 131326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public static final int TYPE_EMAIL = 2; 132326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 133326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int mMsgType = TYPE_SMS; 134326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int mPhoneType = 0; 135326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String mPhoneNum = null; 136326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String mPhoneAlphaTag = null; 137326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /*column indices used to optimize queries */ 138326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColThreadId = -1; 139326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColProtected = -1; 140326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColFolder = -1; 141326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColFolder = -1; 142326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColFolder = -1; 143326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColRead = -1; 144326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColRead = -1; 145326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColRead = -1; 146326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColPriority = -1; 147326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColAttachmentSize = -1; 148326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColAttachment = -1; 149326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColAttachementSize = -1; 150326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColTextOnly = -1; 151326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColId = -1; 152326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColId = -1; 153326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColSize = -1; 154326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColSubject = -1; 155326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColSize = -1; 156326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColToAddress = -1; 157326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColCcAddress = -1; 158326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColBccAddress = -1; 159326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColAddress = -1; 160326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColDate = -1; 161326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColDate = -1; 162326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColDate = -1; 163326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColSubject = -1; 164326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColSubject = -1; 165326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColType = -1; 166326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColFromAddress = -1; 167326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mEmailColId = -1; 168326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 169326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 170326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void setEmailColumns(Cursor c) { 171326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColThreadId = c.getColumnIndex(BluetoothMapContract.MessageColumns.THREAD_ID); 172326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColProtected = c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_PROTECTED); 173326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColFolder = c.getColumnIndex(BluetoothMapContract.MessageColumns.FOLDER_ID); 174326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColRead = c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_READ); 175326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColPriority = c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY); 176326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColAttachment = c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_ATTACHMENT); 177326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColAttachementSize = c.getColumnIndex(BluetoothMapContract.MessageColumns.ATTACHMENT_SIZE); 178326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColSize = c.getColumnIndex(BluetoothMapContract.MessageColumns.MESSAGE_SIZE); 179326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColToAddress = c.getColumnIndex(BluetoothMapContract.MessageColumns.TO_LIST); 180326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColCcAddress = c.getColumnIndex(BluetoothMapContract.MessageColumns.CC_LIST); 181326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColBccAddress = c.getColumnIndex(BluetoothMapContract.MessageColumns.BCC_LIST); 182326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColDate = c.getColumnIndex(BluetoothMapContract.MessageColumns.DATE); 183326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColSubject = c.getColumnIndex(BluetoothMapContract.MessageColumns.SUBJECT); 184326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColFromAddress = c.getColumnIndex(BluetoothMapContract.MessageColumns.FROM_LIST); 185326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEmailColId = c.getColumnIndex(BluetoothMapContract.MessageColumns._ID); 186326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 187326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 188326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void setSmsColumns(Cursor c) { 189326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColId = c.getColumnIndex(BaseColumns._ID); 190326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColFolder = c.getColumnIndex(Sms.TYPE); 191326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColRead = c.getColumnIndex(Sms.READ); 192326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColSubject = c.getColumnIndex(Sms.BODY); 193326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColAddress = c.getColumnIndex(Sms.ADDRESS); 194326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColDate = c.getColumnIndex(Sms.DATE); 195326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColType = c.getColumnIndex(Sms.TYPE); 196326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 197326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 198326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void setMmsColumns(Cursor c) { 199326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColId = c.getColumnIndex(BaseColumns._ID); 200326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColFolder = c.getColumnIndex(Mms.MESSAGE_BOX); 201326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColRead = c.getColumnIndex(Mms.READ); 202326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColAttachmentSize = c.getColumnIndex(Mms.MESSAGE_SIZE); 203326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColTextOnly = c.getColumnIndex(Mms.TEXT_ONLY); 204326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColSize = c.getColumnIndex(Mms.MESSAGE_SIZE); 205326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColDate = c.getColumnIndex(Mms.DATE); 206326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColSubject = c.getColumnIndex(Mms.SUBJECT); 207fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 208326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 209fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 210fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 211326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public BluetoothMapContent(final Context context, String emailBaseUri) { 212fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mContext = context; 213fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mResolver = mContext.getContentResolver(); 214fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (mResolver == null) { 215326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "getContentResolver failed"); 216fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 217326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mBaseEmailUri = emailBaseUri; 218fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 219fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 22028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz private static void close(Closeable c) { 221fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 22228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) c.close(); 223fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 224fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 225fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 226fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 227fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setProtected(BluetoothMapMessageListingElement e, Cursor c, 228326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 229fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_PROTECTED) != 0) { 230fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String protect = "no"; 231326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 232326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int flagProtected = c.getInt(fi.mEmailColProtected); 233326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (flagProtected == 1) { 234326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde protect = "yes"; 235326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 236326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 237326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setProtected: " + protect + "\n"); 238fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setProtect(protect); 239fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 240fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 241fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 242326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 243326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Email only 244326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 245326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void setThreadId(BluetoothMapMessageListingElement e, Cursor c, 246326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 247326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 248326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long threadId = c.getLong(fi.mEmailColThreadId); 249326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setThreadId(threadId); 250326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setThreadId: " + threadId + "\n"); 251326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 252326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 253326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 254fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSent(BluetoothMapMessageListingElement e, Cursor c, 255326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 256fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENT) != 0) { 257fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = 0; 258326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 259326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgType = c.getInt(fi.mSmsColFolder); 260326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 261326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgType = c.getInt(fi.mMmsColFolder); 262326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 263326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgType = c.getInt(fi.mEmailColFolder); 264fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 265fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String sent = null; 266fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 2) { 267fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sent = "yes"; 268fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 269fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sent = "no"; 270fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 271326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSent: " + sent); 272fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSent(sent); 273fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 274fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 275fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 276fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRead(BluetoothMapMessageListingElement e, Cursor c, 277326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 27870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz int read = 0; 279326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 280326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde read = c.getInt(fi.mSmsColRead); 281326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 282326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde read = c.getInt(fi.mMmsColRead); 283326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 284326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde read = c.getInt(fi.mEmailColRead); 28570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 28670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz String setread = null; 287326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 288326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setRead: " + setread); 289326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setRead((read==1?true:false), ((ap.getParameterMask() & MASK_READ) != 0)); 290fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 291fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 292fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setPriority(BluetoothMapMessageListingElement e, Cursor c, 293326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 294fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_PRIORITY) != 0) { 295326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String priority = "no"; 296326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 297326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int highPriority = c.getInt(fi.mEmailColPriority); 298326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (highPriority == 1) { 299326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde priority = "yes"; 300326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 301326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 30214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz int pri = 0; 303326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_MMS) { 30414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz pri = c.getInt(c.getColumnIndex(Mms.PRIORITY)); 30514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 30614f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz if (pri == PduHeaders.PRIORITY_HIGH) { 30714f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz priority = "yes"; 30814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 309326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setPriority: " + priority); 310fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setPriority(priority); 311fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 312fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 313fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 31470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 31570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * For SMS we set the attachment size to 0, as all data will be text data, hence 31670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * attachments for SMS is not possible. 31770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * For MMS all data is actually attachments, hence we do set the attachment size to 31870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * the total message size. To provide a more accurate attachment size, one could 31970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * extract the length (in bytes) of the text parts. 32070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 321fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setAttachmentSize(BluetoothMapMessageListingElement e, Cursor c, 322326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 323fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_ATTACHMENT_SIZE) != 0) { 324fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int size = 0; 325326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_MMS) { 326326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(c.getInt(fi.mMmsColTextOnly) == 0) { 327326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mMmsColAttachmentSize); 3288b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if(size <= 0) { 3298b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // We know there are attachments, since it is not TextOnly 3308b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Hence the size in the database must be wrong. 3318b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Set size to 1 to indicate to the client, that attachments are present 3328b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, size reported as: " + size 3338b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 3348b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; 3358b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde } 336326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 337326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 338326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int attachment = c.getInt(fi.mEmailColAttachment); 339326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mEmailColAttachementSize); 340326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(attachment == 1 && size == 0) { 3418b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, attachment size reported as: " + size 3428b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 3438b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; /* Ensure we indicate we have attachments in the size, if the 344326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message has attachments, in case the e-mail client do not 345326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde report a size */ 346326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 34770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 348326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setAttachmentSize: " + size); 349fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setAttachmentSize(size); 350fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 351fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 352fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 353fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setText(BluetoothMapMessageListingElement e, Cursor c, 354326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 355fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_TEXT) != 0) { 356fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String hasText = ""; 357326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 358fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 359326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 360326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int textOnly = c.getInt(fi.mMmsColTextOnly); 361fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (textOnly == 1) { 362fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 363fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 364326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 365fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String text = getTextPartsMms(id); 366fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (text != null && text.length() > 0) { 367fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 368fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 369fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "no"; 370fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 371fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 372326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 373326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde hasText = "yes"; 374fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 375326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setText: " + hasText); 376fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setText(hasText); 377fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 378fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 379fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 380fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setReceptionStatus(BluetoothMapMessageListingElement e, Cursor c, 381fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 382fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECEPTION_STATUS) != 0) { 383fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String status = "complete"; 384326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setReceptionStatus: " + status); 385fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setReceptionStatus(status); 386fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 387fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 388fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 389fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSize(BluetoothMapMessageListingElement e, Cursor c, 390fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 391fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SIZE) != 0) { 392fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int size = 0; 393326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 394326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String subject = c.getString(fi.mSmsColSubject); 395fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie size = subject.length(); 396326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 397326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mMmsColSize); 398326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 399326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mEmailColSize); 400fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 4018b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if(size <= 0) { 4028b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // A message cannot have size 0 4038b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Hence the size in the database must be wrong. 4048b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Set size to 1 to indicate to the client, that the message has content. 4058b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, size reported as: " + size 4068b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 4078b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; 4088b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde } 409326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSize: " + size); 410fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSize(size); 411fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 412fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 413fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 414fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setType(BluetoothMapMessageListingElement e, Cursor c, 415fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 416fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_TYPE) != 0) { 417fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TYPE type = null; 418326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 419326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mPhoneType == TelephonyManager.PHONE_TYPE_GSM) { 420fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie type = TYPE.SMS_GSM; 421326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mPhoneType == TelephonyManager.PHONE_TYPE_CDMA) { 422fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie type = TYPE.SMS_CDMA; 423fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 424326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 425fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie type = TYPE.MMS; 426326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 427326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde type = TYPE.EMAIL; 428fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 429326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setType: " + type); 430fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setType(type); 431fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 432fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 433fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 434326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setRecipientAddressingEmail(BluetoothMapMessageListingElement e, Cursor c, FilterInfo fi) { 435326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String toAddress, ccAddress, bccAddress; 436326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde toAddress = c.getString(fi.mEmailColToAddress); 437326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ccAddress = c.getString(fi.mEmailColCcAddress); 438326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde bccAddress = c.getString(fi.mEmailColBccAddress); 439326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 440326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String address = ""; 441326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (toAddress != null) { 442326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address += toAddress; 443326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (ccAddress != null) { 444326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address += ","; 445326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 446326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 447326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (ccAddress != null) { 448326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address += ccAddress; 449326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (bccAddress != null) { 450326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address += ","; 451326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 452326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 453326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (bccAddress != null) { 454326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address += bccAddress; 455326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 456326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return address; 457326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 458326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 459fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRecipientAddressing(BluetoothMapMessageListingElement e, Cursor c, 460fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 461fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECIPIENT_ADDRESSING) != 0) { 462326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String address = null; 463326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 464326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 465fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 466326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = fi.mPhoneNum; 467fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 468fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie address = c.getString(c.getColumnIndex(Sms.ADDRESS)); 469fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 470326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 471fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 472fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie address = getAddressMms(mResolver, id, MMS_TO); 473326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 474326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Might be another way to handle addresses */ 475326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = setRecipientAddressingEmail(e, c,fi); 476fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 477326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setRecipientAddressing: " + address); 478326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null) 479326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = ""; 480fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setRecipientAddressing(address); 481fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 482fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 483fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 484fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRecipientName(BluetoothMapMessageListingElement e, Cursor c, 485fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 486fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECIPIENT_NAME) != 0) { 487326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = null; 488326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 489326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 490fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType != 1) { 491326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = c.getString(fi.mSmsColAddress); 492326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 493326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = getContactNameFromPhone(phone); 494fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 495326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = fi.mPhoneAlphaTag; 496fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 497326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 498326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 499326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone; 500326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(e.getRecipientAddressing() != null){ 501326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = getAddressMms(mResolver, id, MMS_TO); 502326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 503326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = e.getRecipientAddressing(); 504326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 505326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 506326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = getContactNameFromPhone(phone); 507326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 508326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Might be another way to handle address and names */ 509326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = setRecipientAddressingEmail(e,c,fi); 510fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 511326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setRecipientName: " + name); 512326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(name == null) 513326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = ""; 514fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setRecipientName(name); 515fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 516fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 517fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 518fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSenderAddressing(BluetoothMapMessageListingElement e, Cursor c, 519326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 520fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENDER_ADDRESSING) != 0) { 521fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String address = null; 522326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String tempAddress; 523326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 524326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 525326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msgType == 1) { // INBOX 526326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = c.getString(fi.mSmsColAddress); 527fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 528326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = fi.mPhoneNum; 529fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 530326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(tempAddress == null) { 531326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* This can only happen on devices with no SIM - 532326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde hence will typically not have any SMS messages. */ 533326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 534326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = PhoneNumberUtils.extractNetworkPortion(tempAddress); 535326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* extractNetworkPortion can return N if the number is a service "number" = a string 536326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * with the a name in (i.e. "Some-Tele-company" would return N because of the N in compaNy) 537326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Hence we need to check if the number is actually a string with alpha chars. 538326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * */ 539326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Boolean alpha = PhoneNumberUtils.stripSeparators(tempAddress).matches("[0-9]*[a-zA-Z]+[0-9]*"); 540326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 541326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null || address.length() < 2 || alpha) { 542326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = tempAddress; // if the number is a service acsii text just use it 543326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 544326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 545326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 546326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 547326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = getAddressMms(mResolver, id, MMS_FROM); 548326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = PhoneNumberUtils.extractNetworkPortion(tempAddress); 549326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null || address.length() < 1){ 550326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = tempAddress; // if the number is a service acsii text just use it 551326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 552326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 553326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = c.getString(fi.mEmailColFromAddress); 554fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 555326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setSenderAddressing: " + address); 556326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null) 557326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = ""; 558fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSenderAddressing(address); 559fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 560fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 561fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 562fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSenderName(BluetoothMapMessageListingElement e, Cursor c, 563326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 564fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENDER_NAME) != 0) { 565326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = null; 566326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 567fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 568fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 569326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = c.getString(fi.mSmsColAddress); 570326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 571326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = getContactNameFromPhone(phone); 572fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 573326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = fi.mPhoneAlphaTag; 574fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 575326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 576326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 577326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone; 578326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(e.getSenderAddressing() != null){ 579326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = getAddressMms(mResolver, id, MMS_FROM); 580326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 581326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = e.getSenderAddressing(); 582326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 583326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty() ) 584326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = getContactNameFromPhone(phone); 585326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 586326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = c.getString(fi.mEmailColFromAddress); 587fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 588326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setSenderName: " + name); 589326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(name == null) 590326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = ""; 591fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSenderName(name); 592fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 593fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 594fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 595fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setDateTime(BluetoothMapMessageListingElement e, Cursor c, 596326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 597326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getParameterMask() & MASK_DATETIME) != 0) { 598326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long date = 0; 599326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 600326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde date = c.getLong(fi.mSmsColDate); 601326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 602326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Use Mms.DATE for all messages. Although contract class states */ 603326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Mms.DATE_SENT are for outgoing messages. But that is not working. */ 604326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde date = c.getLong(fi.mMmsColDate) * 1000L; 605326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 606326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* int msgBox = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); */ 607326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* if (msgBox == Mms.MESSAGE_BOX_INBOX) { */ 608326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* date = c.getLong(c.getColumnIndex(Mms.DATE)) * 1000L; */ 609326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* } else { */ 610326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* date = c.getLong(c.getColumnIndex(Mms.DATE_SENT)) * 1000L; */ 611326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* } */ 612326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 613326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde date = c.getLong(fi.mEmailColDate); 614326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 615326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setDateTime(date); 616fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 617fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 618fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 619fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String getTextPartsMms(long id) { 620fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String text = ""; 621fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = new String("mid=" + id); 622326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/part"); 623fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 624326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // TODO: maybe use a projection with only "ct" and "text" 625fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 62628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor c = mResolver.query(uriAddress, null, selection, null, null); 62728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 62828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while(c != null && c.moveToNext()) { 629fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String ct = c.getString(c.getColumnIndex("ct")); 630fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (ct.equals("text/plain")) { 631326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String part = c.getString(c.getColumnIndex("text")); 632326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part != null) { 633326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde text += part; 634326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 635fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 63628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 63728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 63828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 639fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 640fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return text; 641fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 642fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 643fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSubject(BluetoothMapMessageListingElement e, Cursor c, 644326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 645fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String subject = ""; 646fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int subLength = ap.getSubjectLength(); 647fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(subLength == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 648fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie subLength = 256; 649fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 650fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SUBJECT) != 0) { 651326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 652326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = c.getString(fi.mSmsColSubject); 653326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 654326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = c.getString(fi.mMmsColSubject); 655fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (subject == null || subject.length() == 0) { 656fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Get subject from mms text body parts - if any exists */ 657326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 658fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie subject = getTextPartsMms(id); 659fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 660326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 661326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = c.getString(fi.mEmailColSubject); 662fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 663326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (subject != null && subject.length() > subLength) { 664326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = subject.substring(0, subLength); 665fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 666326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSubject: " + subject); 667fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSubject(subject); 668fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 669fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 670fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 671fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setHandle(BluetoothMapMessageListingElement e, Cursor c, 672326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 673326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long handle = -1; 674326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 675326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = c.getLong(fi.mSmsColId); 676326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 677326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = c.getLong(fi.mMmsColId); 678326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 679326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = c.getLong(fi.mEmailColId); 680326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 681326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setHandle: " + handle ); 682326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setHandle(handle); 683fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 684fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 685fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private BluetoothMapMessageListingElement element(Cursor c, FilterInfo fi, 686326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 687fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BluetoothMapMessageListingElement e = new BluetoothMapMessageListingElement(); 688fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setHandle(e, c, fi, ap); 689fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setDateTime(e, c, fi, ap); 690fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setType(e, c, fi, ap); 691fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setRead(e, c, fi, ap); 692326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // we set number and name for sender/recipient later 693326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // they require lookup on contacts so no need to 694326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // do it for all elements unless they are to be used. 695326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setCursorIndex(c.getPosition()); 696fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return e; 697fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 698fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 699fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String getContactNameFromPhone(String phone) { 700326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = null; 701fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 702fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 703fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri.encode(phone)); 704fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 705fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] projection = {Contacts._ID, Contacts.DISPLAY_NAME}; 706fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = Contacts.IN_VISIBLE_GROUP + "=1"; 707fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orderBy = Contacts.DISPLAY_NAME + " ASC"; 708fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 709fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(uri, projection, selection, null, orderBy); 71028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 71128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 71228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz name = c.getString(c.getColumnIndex(Contacts.DISPLAY_NAME)); 71328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz }; 71428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 71528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 716fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 717fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return name; 718fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 719fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 720fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static public String getAddressMms(ContentResolver r, long id, int type) { 721fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = new String("msg_id=" + id + " AND type=" + type); 722326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/addr"); 723fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 724fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String addr = null; 725fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 72628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor c = r.query(uriAddress, null, selection, null, null); 72728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 72828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 72928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz addr = c.getString(c.getColumnIndex(Mms.Addr.ADDRESS)); 73028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (addr.equals(INSERT_ADDRES_TOKEN)) addr = ""; 73128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 73228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 73328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 734fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 735fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 736fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return addr; 737fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 738fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 739326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 740326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Matching functions for originator and recipient for MMS 741326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return true if found a match 742326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 743fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipientMms(Cursor c, FilterInfo fi, String recip) { 744fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 745fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 746fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = getAddressMms(mResolver, id, MMS_TO); 747fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 748fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(recip)) { 749326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientMms: match recipient phone = " + phone); 750fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 751fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 752fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String name = getContactNameFromPhone(phone); 753fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(recip)) { 754326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientMms: match recipient name = " + name); 755fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 756fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 757fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 758fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 759fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 760fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 761fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 762fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 763fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 764fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 765fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 766fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipientSms(Cursor c, FilterInfo fi, String recip) { 767fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 768fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 769fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 770326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = fi.mPhoneNum; 771326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = fi.mPhoneAlphaTag; 772fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0 && phone.matches(recip)) { 773326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient phone = " + phone); 774fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 775fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (name != null && name.length() > 0 && name.matches(recip)) { 776326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient name = " + name); 777fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 778fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 779fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 780fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 781326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 782fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 783fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 784fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(recip)) { 785326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient phone = " + phone); 786fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 787fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 788fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String name = getContactNameFromPhone(phone); 789fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(recip)) { 790326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient name = " + name); 791fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 792fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 793fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 794fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 795fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 796fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 797fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 798fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 799fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 800fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 801fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 802fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 803fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipient(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 804fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 805fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String recip = ap.getFilterRecipient(); 806fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (recip != null && recip.length() > 0) { 807fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie recip = recip.replace("*", ".*"); 808fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie recip = ".*" + recip + ".*"; 809326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 810fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchRecipientSms(c, fi, recip); 811326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 812fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchRecipientMms(c, fi, recip); 813fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 814326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "matchRecipient: Unknown msg type: " + fi.mMsgType); 815fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 816fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 817fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 818fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 819fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 820fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 821fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 822fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 823fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginatorMms(Cursor c, FilterInfo fi, String orig) { 824fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 825fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 826fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = getAddressMms(mResolver, id, MMS_FROM); 827fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 828fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(orig)) { 829326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorMms: match originator phone = " + phone); 830fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 831fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 832fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String name = getContactNameFromPhone(phone); 833fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(orig)) { 834326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorMms: match originator name = " + name); 835fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 836fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 837fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 838fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 839fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 840fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 841fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 842fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 843fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 844fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 845fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 846fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginatorSms(Cursor c, FilterInfo fi, String orig) { 847fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 848fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 849fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 850fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 851fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone !=null && phone.length() > 0) { 852fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(orig)) { 853326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator phone = " + phone); 854fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 855fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 856fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String name = getContactNameFromPhone(phone); 857fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(orig)) { 858326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator name = " + name); 859fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 860fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 861fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 862fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 863fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 864fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 865fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 866fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 867326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 868326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = fi.mPhoneNum; 869326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = fi.mPhoneAlphaTag; 870fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0 && phone.matches(orig)) { 871326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator phone = " + phone); 872fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 873fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (name != null && name.length() > 0 && name.matches(orig)) { 874326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator name = " + name); 875fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 876fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 877fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 878fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 879fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 880fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 881fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 882fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 883fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginator(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 884fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 885fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 886fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 887fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie orig = orig.replace("*", ".*"); 888fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie orig = ".*" + orig + ".*"; 889326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 890fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchOriginatorSms(c, fi, orig); 891326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 892fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchOriginatorMms(c, fi, orig); 893fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 894326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "matchOriginator: Unknown msg type: " + fi.mMsgType); 895fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 896fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 897fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 898fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 899fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 900fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 901fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 902fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 903fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchAddresses(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 904fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (matchOriginator(c, fi, ap) && matchRecipient(c, fi, ap)) { 905fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 906fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 907fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 908fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 909fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 910fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 911326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* 912326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Where filter functions 913326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * */ 914fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterFolderTypeSms(String folder) { 915fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 916326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (BluetoothMapContract.FOLDER_NAME_INBOX.equalsIgnoreCase(folder)) { 917326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 1 AND " + Sms.THREAD_ID + " <> -1"; 918326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_OUTBOX.equalsIgnoreCase(folder)) { 919326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = "(" + Sms.TYPE + " = 4 OR " + Sms.TYPE + " = 5 OR " 920326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + Sms.TYPE + " = 6) AND " + Sms.THREAD_ID + " <> -1"; 921326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_SENT.equalsIgnoreCase(folder)) { 922326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 2 AND " + Sms.THREAD_ID + " <> -1"; 923326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DRAFT.equalsIgnoreCase(folder)) { 924326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 3 AND " + Sms.THREAD_ID + " <> -1"; 925326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DELETED.equalsIgnoreCase(folder)) { 926326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.THREAD_ID + " = -1"; 927fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 928fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 929fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 930fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 931fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 932fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterFolderTypeMms(String folder) { 933fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 934326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (BluetoothMapContract.FOLDER_NAME_INBOX.equalsIgnoreCase(folder)) { 935326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 1 AND " + Mms.THREAD_ID + " <> -1"; 936326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_OUTBOX.equalsIgnoreCase(folder)) { 937326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 4 AND " + Mms.THREAD_ID + " <> -1"; 938326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_SENT.equalsIgnoreCase(folder)) { 939326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 2 AND " + Mms.THREAD_ID + " <> -1"; 940326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DRAFT.equalsIgnoreCase(folder)) { 941326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 3 AND " + Mms.THREAD_ID + " <> -1"; 942326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DELETED.equalsIgnoreCase(folder)) { 943326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.THREAD_ID + " = -1"; 944fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 945fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 946fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 947fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 948fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 949326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterFolderTypeEmail(long folderId) { 950fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 951326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (folderId >= 0) { 952326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + folderId; 953326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 954326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.e(TAG, "setWhereFilterFolderTypeEmail: not valid!" ); 955326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("Invalid folder ID"); 956fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 957326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return where; 958326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 959fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 960326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterFolderType(BluetoothMapFolderElement folderElement, FilterInfo fi) { 961326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = ""; 962326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 963326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = setWhereFilterFolderTypeSms(folderElement.getName()); 964326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 965326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = setWhereFilterFolderTypeMms(folderElement.getName()); 966326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 967326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = setWhereFilterFolderTypeEmail(folderElement.getEmailFolderId()); 968326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 969fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 970fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 971fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 972326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterReadStatus(BluetoothMapAppParams ap, FilterInfo fi) { 973fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 974fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (ap.getFilterReadStatus() != -1) { 975326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 976326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 977326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Sms.READ + "= 0"; 978326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 979fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 980326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 981326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Sms.READ + "= 1"; 982326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 983326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 984326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 985326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.READ + "= 0"; 986326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 987326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 988326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 989326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.READ + "= 1"; 990326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 991326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 992326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 993326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "= 0"; 994326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 995326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 996326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 997326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "= 1"; 998326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 999fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1000fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1001fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1002fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1003fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1004fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterPeriod(BluetoothMapAppParams ap, FilterInfo fi) { 1005fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1006fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getFilterPeriodBegin() != -1)) { 1007326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1008326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Sms.DATE + " >= " + ap.getFilterPeriodBegin(); 1009326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1010326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.DATE + " >= " + (ap.getFilterPeriodBegin() / 1000L); 1011326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 1012326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.DATE + " >= " + (ap.getFilterPeriodBegin()); 1013fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1014fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1015fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1016fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getFilterPeriodEnd() != -1)) { 1017326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1018326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Sms.DATE + " < " + ap.getFilterPeriodEnd(); 1019326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1020326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Mms.DATE + " < " + (ap.getFilterPeriodEnd() / 1000L); 1021326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 1022326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + BluetoothMapContract.MessageColumns.DATE + " < " + (ap.getFilterPeriodEnd()); 1023fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1024fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1025fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1026326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1027fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1028fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1029fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1030fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterPhones(String str) { 1031fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1032fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie str = str.replace("*", "%"); 1033fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1034fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(ContactsContract.Contacts.CONTENT_URI, null, 1035fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ContactsContract.Contacts.DISPLAY_NAME + " like ?", 1036fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie new String[]{str}, 1037fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ContactsContract.Contacts.DISPLAY_NAME + " ASC"); 1038fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 103928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 104028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (c != null && c.moveToNext()) { 104128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String contactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); 1042fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 104328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor p = mResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 104428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 104528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz new String[]{contactId}, 104628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz null); 1047fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 104828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 104928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (p != null && p.moveToNext()) { 105028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String number = p.getString( 105128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz p.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 1052fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 105328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz where += " address = " + "'" + number + "'"; 105428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (!p.isLast()) where += " OR "; 105528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 105628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 105728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(p); 1058fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 105928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 106028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (!c.isLast()) where += " OR "; 1061fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 106228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 106328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1064fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1065fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1066fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (str != null && str.length() > 0) { 1067fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (where.length() > 0) { 1068fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie where += " OR "; 1069fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1070fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie where += " address like " + "'" + str + "'"; 1071fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1072fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1073fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1074fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1075fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1076326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterOriginatorEmail(BluetoothMapAppParams ap) { 1077fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1078fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 1079fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1080326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1081fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 1082326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde orig = orig.replace("*", "%"); 1083326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.FROM_LIST + " LIKE '%" + orig + "%'"; 1084fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1085fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1086fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 108714f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz private String setWhereFilterPriority(BluetoothMapAppParams ap, FilterInfo fi) { 108814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz String where = ""; 108914f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz int pri = ap.getFilterPriority(); 109014f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz /*only MMS have priority info */ 1091326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(fi.mMsgType == FilterInfo.TYPE_MMS) 109214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz { 109314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz if(pri == 0x0002) 109414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz { 109514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz where += " AND " + Mms.PRIORITY + "<=" + 109614f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz Integer.toString(PduHeaders.PRIORITY_NORMAL); 109714f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz }else if(pri == 0x0001) { 109814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz where += " AND " + Mms.PRIORITY + "=" + 109914f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz Integer.toString(PduHeaders.PRIORITY_HIGH); 110014f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 110114f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 110214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz return where; 110314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 1104fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1105326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterRecipientEmail(BluetoothMapAppParams ap) { 1106fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1107fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String recip = ap.getFilterRecipient(); 1108fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1109326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1110fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (recip != null && recip.length() > 0) { 1111326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde recip = recip.replace("*", "%"); 1112326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND (" 1113326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.TO_LIST + " LIKE '%" + recip + "%' OR " 1114326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.CC_LIST + " LIKE '%" + recip + "%' OR " 1115326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.BCC_LIST + " LIKE '%" + recip + "%' )"; 1116fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1117fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1118fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1119fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1120326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilter(BluetoothMapFolderElement folderElement, 1121326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1122fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1123fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1124326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterFolderType(folderElement, fi); 1125326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(!where.isEmpty()) { 1126326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterReadStatus(ap, fi); 1127326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterPeriod(ap, fi); 1128326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterPriority(ap,fi); 1129326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1130326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 1131326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterOriginatorEmail(ap); 1132326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterRecipientEmail(ap); 1133326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1134326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1135fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1136fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1137fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1138fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1139fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1140326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1141326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if sms should be included. 1142326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1143326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1144326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 1145326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return boolean true if sms is selected, false if not 1146326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1147fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean smsSelected(FilterInfo fi, BluetoothMapAppParams ap) { 1148fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = ap.getFilterMessageType(); 1149326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int phoneType = fi.mPhoneType; 1150326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1151326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "smsSelected msgType: " + msgType); 1152fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1153fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == -1) 1154fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1155326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1156fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((msgType & 0x03) == 0) 1157fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1158fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1159fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (((msgType & 0x01) == 0) && (phoneType == TelephonyManager.PHONE_TYPE_GSM)) 1160fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1161fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1162fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (((msgType & 0x02) == 0) && (phoneType == TelephonyManager.PHONE_TYPE_CDMA)) 1163fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1164fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1165fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1166fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1167fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1168326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1169326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if mms should be included. 1170326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1171326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1172326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 1173326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return boolean true if sms is selected, false if not 1174326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1175fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean mmsSelected(FilterInfo fi, BluetoothMapAppParams ap) { 1176fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = ap.getFilterMessageType(); 1177fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1178326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "mmsSelected msgType: " + msgType); 1179326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1180fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == -1) 1181fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1182fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1183fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((msgType & 0x08) == 0) 1184fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1185fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1186fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1187fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1188fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1189326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1190326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if email should be included. 1191326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1192326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1193326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 1194326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return boolean true if sms is selected, false if not 1195326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1196326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private boolean emailSelected(FilterInfo fi, BluetoothMapAppParams ap) { 1197326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = ap.getFilterMessageType(); 1198326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1199326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "emailSelected msgType: " + msgType); 1200326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1201326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msgType == -1) 1202326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 1203326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1204326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((msgType & 0x04) == 0) 1205326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 1206326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1207326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return false; 1208326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1209326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1210fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setFilterInfo(FilterInfo fi) { 1211fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 1212fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (tm != null) { 1213326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneType = tm.getPhoneType(); 1214326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneNum = tm.getLine1Number(); 1215326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneAlphaTag = tm.getLine1AlphaTag(); 1216326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "phone type = " + fi.mPhoneType + 1217326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " phone num = " + fi.mPhoneNum + 1218326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " phone alpha tag = " + fi.mPhoneAlphaTag); 1219fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1220fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1221fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1222326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1223326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Get a listing of message in folder after applying filter. 1224326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param folder Must contain a valid folder string != null 1225326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap Parameters specifying message content and filters 1226326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return Listing object containing requested messages 1227326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1228326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public BluetoothMapMessageListing msgListing(BluetoothMapFolderElement folderElement, 1229326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 1230326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgListing: folderName = " + folderElement.getName() 1231326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + " folderId = " + folderElement.getEmailFolderId() 1232326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + " messageType = " + ap.getFilterMessageType() ); 1233fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BluetoothMapMessageListing bmList = new BluetoothMapMessageListing(); 1234326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1235fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 12360053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz /* We overwrite the parameter mask here if it is 0 or not present, as this 12370053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz * should cause all parameters to be included in the message list. */ 12380053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz if(ap.getParameterMask() == BluetoothMapAppParams.INVALID_VALUE_PARAMETER || 12390053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz ap.getParameterMask() == 0) { 12400053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz ap.setParameterMask(BluetoothMapAppParams.PARAMETER_MASK_ALL_ENABLED); 1241326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "msgListing(): appParameterMask is zero or not present, " + 12420053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz "changing to: " + ap.getParameterMask()); 12430053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz } 12440053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz 1245fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Cache some info used throughout filtering */ 1246fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi = new FilterInfo(); 1247fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setFilterInfo(fi); 1248326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor smsCursor = null; 1249326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor mmsCursor = null; 1250326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor emailCursor = null; 1251326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 125228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 125328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String limit = ""; 125428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int countNum = ap.getMaxListCount(); 125528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int offsetNum = ap.getStartOffset(); 125628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getMaxListCount()>0){ 125728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit=" LIMIT "+ (ap.getMaxListCount()+ap.getStartOffset()); 1258326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 125928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 126028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 126128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 126228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_MMS| 126328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_GSM)|| 126428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 126528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_MMS| 126628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA)){ 126728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz //set real limit and offset if only this type is used (only if offset/limit is used 126828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 126928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "SMS Limit => "+limit); 127028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 127128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 127228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_SMS; 127328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterPriority() != 1){ /*SMS cannot have high priority*/ 127428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String where = setWhereFilter(folderElement, fi, ap); 127528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(!where.isEmpty()) { 127628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType); 127728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz smsCursor = mResolver.query(Sms.CONTENT_URI, 127828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz SMS_PROJECTION, where, null, Sms.DATE + " DESC" + limit); 127928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (smsCursor != null) { 128028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapMessageListingElement e = null; 128128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // store column index so we dont have to look them up anymore (optimization) 128228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Found " + smsCursor.getCount() + " sms messages."); 128328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.setSmsColumns(smsCursor); 128428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (smsCursor.moveToNext()) { 128528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (matchAddresses(smsCursor, fi, ap)) { 128628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz e = element(smsCursor, fi, ap); 128728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz bmList.add(e); 128828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 128928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 129028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 129128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 129228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 129328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 129428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 129528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (mmsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 129628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 129728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 129828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_GSM)){ 129928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz //set real limit and offset if only this type is used (only if offset/limit is used 130028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 130128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "MMS Limit => "+limit); 130228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 130328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 130428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_MMS; 1305326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 1306326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(!where.isEmpty()) { 1307326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgType: " + fi.mMsgType); 130828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz mmsCursor = mResolver.query(Mms.CONTENT_URI, 130928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz MMS_PROJECTION, where, null, Mms.DATE + " DESC" + limit); 131028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (mmsCursor != null) { 1311326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapMessageListingElement e = null; 1312326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // store column index so we dont have to look them up anymore (optimization) 131328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.setMmsColumns(mmsCursor); 131428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int cnt = 0; 131528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Found " + mmsCursor.getCount() + " mms messages."); 131628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (mmsCursor.moveToNext()) { 131728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (matchAddresses(mmsCursor, fi, ap)) { 131828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz e = element(mmsCursor, fi, ap); 1319326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde bmList.add(e); 1320326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1321326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1322326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1323326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1324326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 132514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz 132628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (emailSelected(fi, ap) && folderElement.getEmailFolderId() != -1) { 132728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_MMS| 132828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 132928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_GSM)){ 133028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz //set real limit and offset if only this type is used (only if offset/limit is used 133128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 133228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Email Limit => "+limit); 133328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 133428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 133528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 133628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String where = setWhereFilter(folderElement, fi, ap); 133728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 133828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(!where.isEmpty()) { 133928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType); 134028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Uri contentUri = Uri.parse(mBaseEmailUri + BluetoothMapContract.TABLE_MESSAGE); 134128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz emailCursor = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, 134228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz where, null, BluetoothMapContract.MessageColumns.DATE + " DESC" + limit); 134328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (emailCursor != null) { 134428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapMessageListingElement e = null; 134528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // store column index so we dont have to look them up anymore (optimization) 134628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.setEmailColumns(emailCursor); 134728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int cnt = 0; 134828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (emailCursor.moveToNext()) { 134928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Found " + emailCursor.getCount() + " email messages."); 135028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz e = element(emailCursor, fi, ap); 135114f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz bmList.add(e); 135214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 135328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // emailCursor.close(); 1354fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1355fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1356fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1357fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 135828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Enable this if post sorting and segmenting needed */ 135928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz bmList.sort(); 136028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz bmList.segment(ap.getMaxListCount(), offsetNum); 136128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz List<BluetoothMapMessageListingElement> list = bmList.getList(); 136228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int listSize = list.size(); 136328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor tmpCursor = null; 136428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz for (int x=0; x<listSize; x++){ 136528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapMessageListingElement ele = list.get(x); 136628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if ((ele.getType().equals(TYPE.SMS_GSM)||ele.getType().equals(TYPE.SMS_CDMA)) && smsCursor != null){ 136728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = smsCursor; 136828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_SMS; 136928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else if (ele.getType().equals(TYPE.MMS) && mmsCursor != null){ 137028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = mmsCursor; 137128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_MMS; 137228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else if (ele.getType().equals(TYPE.EMAIL) && emailCursor != null){ 137328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = emailCursor; 137428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 137528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 1376326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 137728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (tmpCursor != null && tmpCursor.moveToPosition(ele.getCursorIndex())) { 137828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSenderAddressing(ele, tmpCursor, fi, ap); 137928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSenderName(ele, tmpCursor, fi, ap); 138028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setRecipientAddressing(ele, tmpCursor, fi, ap); 138128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setRecipientName(ele, tmpCursor, fi, ap); 138228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSubject(ele, tmpCursor, fi, ap); 138328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSize(ele, tmpCursor, fi, ap); 138428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setReceptionStatus(ele, tmpCursor, fi, ap); 138528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setText(ele, tmpCursor, fi, ap); 138628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setAttachmentSize(ele, tmpCursor, fi, ap); 138728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setPriority(ele, tmpCursor, fi, ap); 138828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSent(ele, tmpCursor, fi, ap); 138928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setProtected(ele, tmpCursor, fi, ap); 139028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setThreadId(ele, tmpCursor, fi, ap); 1391fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1392fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 139328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 139428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(emailCursor); 139528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(smsCursor); 139628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(mmsCursor); 1397fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1398fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 139928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (D) Log.d(TAG, "messagelisting end"); 1400fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return bmList; 1401fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1402fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1403326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1404326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Get the size of the message listing 1405326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param folder Must contain a valid folder string != null 1406326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap Parameters specifying message content and filters 1407326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return Integer equal to message listing size 1408326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1409326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int msgListingSize(BluetoothMapFolderElement folderElement, 1410326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 1411326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgListingSize: folder = " + folderElement.getName()); 1412fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int cnt = 0; 1413fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1414fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Cache some info used throughout filtering */ 1415fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi = new FilterInfo(); 1416fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setFilterInfo(fi); 1417fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 141828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 1419326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_SMS; 1420326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 1421fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Sms.CONTENT_URI, 1422326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SMS_PROJECTION, where, null, Sms.DATE + " DESC"); 1423fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 142428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) cnt = c.getCount(); 142528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1426fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 142770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 142828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (mmsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 1429326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_MMS; 1430326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 143170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Mms.CONTENT_URI, 1432326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde MMS_PROJECTION, where, null, Mms.DATE + " DESC"); 143328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) cnt += c.getCount(); 143428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 143570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 143670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 1437326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (emailSelected(fi, ap) && folderElement.getEmailFolderId() != -1) { 1438326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_EMAIL; 1439326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 144028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (!where.isEmpty()) { 1441326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri contentUri = Uri.parse(mBaseEmailUri + BluetoothMapContract.TABLE_MESSAGE); 1442326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, 1443326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 144428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) cnt += c.getCount(); 144528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1446326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1447326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1448326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 144970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if (D) Log.d(TAG, "msgListingSize: size = " + cnt); 1450fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return cnt; 1451fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1452326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 145370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 145470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * Return true if there are unread messages in the requested list of messages 145570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param folder folder where the message listing should come from 145670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param ap application parameter object 145770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return true if unread messages are in the list, else false 145870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 1459326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public boolean msgListingHasUnread(BluetoothMapFolderElement folderElement, 1460326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 1461326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgListingHasUnread: folder = " + folderElement.getName()); 146270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz int cnt = 0; 146370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 146470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /* Cache some info used throughout filtering */ 146570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz FilterInfo fi = new FilterInfo(); 146670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz setFilterInfo(fi); 146770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 1468326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 1469326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_SMS; 1470326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 1471326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Sms.READ + "=0 "; 147270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz where += setWhereFilterPeriod(ap, fi); 147370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Sms.CONTENT_URI, 1474326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SMS_PROJECTION, where, null, Sms.DATE + " DESC"); 147570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 147628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) cnt += c.getCount(); 147728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 147870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 147970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 1480326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (mmsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 1481326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_MMS; 1482326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 1483326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Mms.READ + "=0 "; 148470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz where += setWhereFilterPeriod(ap, fi); 148570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Mms.CONTENT_URI, 1486326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde MMS_PROJECTION, where, null, Sms.DATE + " DESC"); 148770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 148828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) cnt += c.getCount(); 148928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 149070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 149170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 1492326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1493326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (emailSelected(fi, ap) && folderElement.getEmailFolderId() != -1) { 1494326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_EMAIL; 1495326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 1496326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(!where.isEmpty()) { 1497326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "=0 "; 1498326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterPeriod(ap, fi); 1499326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri contentUri = Uri.parse(mBaseEmailUri + BluetoothMapContract.TABLE_MESSAGE); 1500326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, 1501326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 150228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) cnt += c.getCount(); 150328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1504326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1505326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1506326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 150770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if (D) Log.d(TAG, "msgListingHasUnread: numUnread = " + cnt); 150870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return (cnt>0)?true:false; 150970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 1510fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1511fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /** 1512fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * Get the folder name of an SMS message or MMS message. 1513fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @param c the cursor pointing at the message 1514fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @return the folder name. 1515fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie */ 1516fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String getFolderName(int type, int threadId) { 1517fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1518fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(threadId == -1) 1519326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_DELETED; 1520fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1521fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie switch(type) { 1522fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 1: 1523326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_INBOX; 1524fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 2: 1525326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_SENT; 1526fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 3: 1527326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_DRAFT; 1528fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 4: // Just name outbox, failed and queued "outbox" 1529fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 5: 1530fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 6: 1531326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_OUTBOX; 1532fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1533fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return ""; 1534fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1535fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1536326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public byte[] getMessage(String handle, BluetoothMapAppParams appParams, 1537326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement folderElement) throws UnsupportedEncodingException{ 1538fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TYPE type = BluetoothMapUtils.getMsgTypeFromHandle(handle); 1539fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = BluetoothMapUtils.getCpHandle(handle); 1540326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(appParams.getFractionRequest() == BluetoothMapAppParams.FRACTION_REQUEST_NEXT) { 1541326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("FRACTION_REQUEST_NEXT does not make sence as" + 1542326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " we always return the full message."); 1543326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1544fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie switch(type) { 1545fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case SMS_GSM: 1546fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case SMS_CDMA: 154770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return getSmsMessage(id, appParams.getCharset()); 1548fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case MMS: 154970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return getMmsMessage(id, appParams); 1550fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case EMAIL: 1551326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return getEmailMessage(id, appParams, folderElement); 1552fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1553fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie throw new IllegalArgumentException("Invalid message handle."); 1554fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1555fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1556326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setVCardFromPhoneNumber(BluetoothMapbMessage message, String phone, boolean incoming) { 1557fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String contactId = null, contactName = null; 1558fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] phoneNumbers = null; 1559fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] emailAddresses = null; 1560fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1561fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 1562fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri.encode(phone)); 1563fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1564fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] projection = {Contacts._ID, Contacts.DISPLAY_NAME}; 1565fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = Contacts.IN_VISIBLE_GROUP + "=1"; 1566fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orderBy = Contacts._ID + " ASC"; 1567fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1568fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // Get the contact _ID and name 156928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor p = mResolver.query(uri, projection, selection, null, orderBy); 1570fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 157128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 157228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (p != null && p.moveToFirst()) { 157328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz contactId = p.getString(p.getColumnIndex(Contacts._ID)); 157428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz contactName = p.getString(p.getColumnIndex(Contacts.DISPLAY_NAME)); 157528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 157628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 157728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // Bail out if we are unable to find a contact, based on the phone number 157828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(contactId == null) { 157928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz phoneNumbers = new String[1]; 158028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz phoneNumbers[0] = phone; 158128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else { 158228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // use only actual phone number 158328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz phoneNumbers = new String[1]; 158428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz phoneNumbers[0] = phone; 158528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 158628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // Fetch contact e-mail addresses 158728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close (p); 158828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz p = mResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 158928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 159028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz new String[]{contactId}, 159128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz null); 159228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (p != null) { 159328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int i = 0; 159428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz emailAddresses = new String[p.getCount()]; 159528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (p != null && p.moveToNext()) { 159628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String emailAddress = p.getString( 159728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz p.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 159828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz emailAddresses[i++] = emailAddress; 159928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 1600fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1601fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 160228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 160328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(p); 1604fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 160528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 160628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (incoming == true) { 1607326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Adding originator for phone:" + phone); 1608fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.addOriginator(contactName, contactName, phoneNumbers, emailAddresses); // Use version 3.0 as we only have a formatted name 1609326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1610326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Adding recipient for phone:" + phone); 1611fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.addRecipient(contactName, contactName, phoneNumbers, emailAddresses); // Use version 3.0 as we only have a formatted name 1612326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1613326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return contactName; 1614fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1615fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1616fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MAP_MESSAGE_CHARSET_NATIVE = 0; 1617fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MAP_MESSAGE_CHARSET_UTF8 = 1; 1618fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1619fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public byte[] getSmsMessage(long id, int charset) throws UnsupportedEncodingException{ 1620fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int type, threadId; 1621fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long time = -1; 1622fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String msgBody; 1623fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BluetoothMapbMessageSms message = new BluetoothMapbMessageSms(); 1624fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 162528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 1626fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Sms.CONTENT_URI, SMS_PROJECTION, "_ID = " + id, null, null); 162728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c == null || !c.moveToFirst()) { 162828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz throw new IllegalArgumentException("SMS handle not found"); 162928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 1630fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 163128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 1632326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.v(TAG,"c.count: " + c.getCount()); 1633fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1634fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) { 1635fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setType(TYPE.SMS_GSM); 1636fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) { 1637fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setType(TYPE.SMS_CDMA); 1638fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1639fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1640fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String read = c.getString(c.getColumnIndex(Sms.READ)); 1641fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (read.equalsIgnoreCase("1")) 1642fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setStatus(true); 1643fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie else 1644fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setStatus(false); 1645fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1646fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie type = c.getInt(c.getColumnIndex(Sms.TYPE)); 1647fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 1648fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setFolder(getFolderName(type, threadId)); 1649fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1650fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie msgBody = c.getString(c.getColumnIndex(Sms.BODY)); 1651fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1652fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 1653fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 165470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz time = c.getLong(c.getColumnIndex(Sms.DATE)); 1655fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(type == 1) // Inbox message needs to set the vCard as originator 1656fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setVCardFromPhoneNumber(message, phone, true); 1657fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie else // Other messages sets the vCard as the recipient 1658fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setVCardFromPhoneNumber(message, phone, false); 1659fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1660fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(charset == MAP_MESSAGE_CHARSET_NATIVE) { 166170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if(type == 1) //Inbox 166270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz message.setSmsBodyPdus(BluetoothMapSmsPdu.getDeliverPdus(msgBody, phone, time)); 1663fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie else 166470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz message.setSmsBodyPdus(BluetoothMapSmsPdu.getSubmitPdus(msgBody, phone)); 1665fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else /*if (charset == MAP_MESSAGE_CHARSET_UTF8)*/ { 1666fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setSmsBody(msgBody); 1667fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 166828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 166928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1670fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 167128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 167228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return message.encode(); 1673fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1674fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1675326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void extractMmsAddresses(long id, BluetoothMapbMessageMms message) { 1676fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie final String[] projection = null; 1677326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String selection = new String(Mms.Addr.MSG_ID + "=" + id); 1678326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/addr"); 1679fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 1680326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String contactName = null; 168128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 1682326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query( uriAddress, projection, selection, null, null); 168328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 168428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (c != null && c.moveToNext()) { 1685326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String address = c.getString(c.getColumnIndex(Mms.Addr.ADDRESS)); 1686326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address.equals(INSERT_ADDRES_TOKEN)) 1687326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde continue; 1688326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Integer type = c.getInt(c.getColumnIndex(Mms.Addr.TYPE)); 1689fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie switch(type) { 1690fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case MMS_FROM: 1691326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contactName = setVCardFromPhoneNumber(message, address, true); 1692326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.addFrom(contactName, address); 1693fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie break; 1694fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case MMS_TO: 1695326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contactName = setVCardFromPhoneNumber(message, address, false); 1696326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.addTo(contactName, address); 1697fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie break; 1698fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case MMS_CC: 1699326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contactName = setVCardFromPhoneNumber(message, address, false); 1700326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.addCc(contactName, address); 1701fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie break; 1702fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case MMS_BCC: 1703326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contactName = setVCardFromPhoneNumber(message, address, false); 1704326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.addBcc(contactName, address); 1705326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde break; 1706fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie default: 1707fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie break; 1708fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 170928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 171028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 171128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close (c); 1712fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1713fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1714fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 171570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 171670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * Read out a mms data part and return the data in a byte array. 171770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param partid the content provider id of the mms. 171870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return 171970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 1720fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private byte[] readMmsDataPart(long partid) { 1721326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/part/" + partid); 1722fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 1723fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie InputStream is = null; 1724fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ByteArrayOutputStream os = new ByteArrayOutputStream(); 1725fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int bufferSize = 8192; 1726fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie byte[] buffer = new byte[bufferSize]; 1727fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie byte[] retVal = null; 1728fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1729fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 1730fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie is = mResolver.openInputStream(uriAddress); 1731fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int len = 0; 1732fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie while ((len = is.read(buffer)) != -1) { 1733fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie os.write(buffer, 0, len); // We need to specify the len, as it can be != bufferSize 1734fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1735fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie retVal = os.toByteArray(); 1736fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 1737fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // do nothing for now 1738fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.w(TAG,"Error reading part data",e); 1739fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } finally { 174028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(os); 174128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(is); 1742fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1743fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return retVal; 1744fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1745fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 174670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 174770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * Read out the mms parts and update the bMessage object provided i {@linkplain message} 174870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param id the content provider ID of the message 174970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param message the bMessage object to add the information to 175070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 1751326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void extractMmsParts(long id, BluetoothMapbMessageMms message) 1752fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie { 1753326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Handling of filtering out non-text parts for exclude 1754326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * attachments is handled within the bMessage object. */ 1755fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie final String[] projection = null; 1756326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String selection = new String(Mms.Part.MSG_ID + "=" + id); 1757326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/"+ id + "/part"); 1758fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 1759326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapbMessageMms.MimePart part; 176028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor c = mResolver.query(uriAddress, projection, selection, null, null); 176128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 176228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 176328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while(c != null && c.moveToNext()) { 1764fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Long partId = c.getLong(c.getColumnIndex(BaseColumns._ID)); 1765326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String contentType = c.getString(c.getColumnIndex(Mms.Part.CONTENT_TYPE)); 1766326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = c.getString(c.getColumnIndex(Mms.Part.NAME)); 1767326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String charset = c.getString(c.getColumnIndex(Mms.Part.CHARSET)); 1768326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String filename = c.getString(c.getColumnIndex(Mms.Part.FILENAME)); 1769326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String text = c.getString(c.getColumnIndex(Mms.Part.TEXT)); 1770326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Integer fd = c.getInt(c.getColumnIndex(Mms.Part._DATA)); 1771326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String cid = c.getString(c.getColumnIndex(Mms.Part.CONTENT_ID)); 1772326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String cl = c.getString(c.getColumnIndex(Mms.Part.CONTENT_LOCATION)); 1773326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String cdisp = c.getString(c.getColumnIndex(Mms.Part.CONTENT_DISPOSITION)); 1774326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1775326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, " _id : " + partId + 177670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n ct : " + contentType + 177770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n partname : " + name + 177870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n charset : " + charset + 177970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n filename : " + filename + 178070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n text : " + text + 178170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n fd : " + fd + 178270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n cid : " + cid + 178370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n cl : " + cl + 178470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz "\n cdisp : " + cdisp); 1785fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1786fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie part = message.addMimePart(); 1787326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mContentType = contentType; 1788326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mPartName = name; 1789326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mContentId = cid; 1790326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mContentLocation = cl; 1791326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mContentDisposition = cdisp; 179270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 1793fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 1794fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(text != null) { 1795326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mData = text.getBytes("UTF-8"); 1796326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mCharsetName = "utf-8"; 1797326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1798326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mData = readMmsDataPart(partId); 1799fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(charset != null) 1800326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mCharsetName = CharacterSets.getMimeName(Integer.parseInt(charset)); 1801fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1802fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (NumberFormatException e) { 1803fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.d(TAG,"extractMmsParts",e); 1804326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mData = null; 1805326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mCharsetName = null; 1806fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (UnsupportedEncodingException e) { 1807fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.d(TAG,"extractMmsParts",e); 1808326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mData = null; 1809326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mCharsetName = null; 1810fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1811326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde part.mFileName = filename; 181228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 181328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 181428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1815fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 181628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 1817fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.updateCharset(); 1818fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1819fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 182070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 182170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * 182270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param id the content provider id for the message to fetch. 182370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param appParams The application parameter object received from the client. 182470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 182570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @throws UnsupportedEncodingException if UTF-8 is not supported, 182670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * which is guaranteed to be supported on an android device 182770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 182870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz public byte[] getMmsMessage(long id, BluetoothMapAppParams appParams) throws UnsupportedEncodingException { 1829fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgBox, threadId; 1830326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 1831326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("MMS charset native not allowed for MMS - must be utf-8"); 1832326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1833326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapbMessageMms message = new BluetoothMapbMessageMms(); 1834fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Mms.CONTENT_URI, MMS_PROJECTION, "_ID = " + id, null, null); 183528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c == null || !c.moveToFirst()) { 183628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz throw new IllegalArgumentException("MMS handle not found"); 183728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 183828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 183928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 1840fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setType(TYPE.MMS); 1841fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1842fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // The MMS info: 1843fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String read = c.getString(c.getColumnIndex(Mms.READ)); 1844fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (read.equalsIgnoreCase("1")) 1845fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setStatus(true); 1846fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie else 1847fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setStatus(false); 1848fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1849fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie msgBox = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); 1850fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 1851fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setFolder(getFolderName(msgBox, threadId)); 1852fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setSubject(c.getString(c.getColumnIndex(Mms.SUBJECT))); 1853fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setMessageId(c.getString(c.getColumnIndex(Mms.MESSAGE_ID))); 1854fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setContentType(c.getString(c.getColumnIndex(Mms.CONTENT_TYPE))); 1855fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.setDate(c.getLong(c.getColumnIndex(Mms.DATE)) * 1000L); 1856326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.setTextOnly(c.getInt(c.getColumnIndex(Mms.TEXT_ONLY)) == 0 ? false : true); 1857b42ddd9abf40e1f3e3c5a33fa67dea898adcb219Ying Wang message.setIncludeAttachments(appParams.getAttachment() == 0 ? false : true); 1858fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1859fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie extractMmsParts(id, message); 1860fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie extractMmsAddresses(id, message); 186128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 186228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1863fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1864fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 186528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return message.encode(); 1866fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1867fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1868326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1869326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * 1870326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param id the content provider id for the message to fetch. 1871326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param appParams The application parameter object received from the client. 1872326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 1873326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @throws UnsupportedEncodingException if UTF-8 is not supported, 1874326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * which is guaranteed to be supported on an android device 1875326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1876326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public byte[] getEmailMessage(long id, BluetoothMapAppParams appParams, 1877326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement currentFolder) throws UnsupportedEncodingException { 1878326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Log print out of application parameters set 1879326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D && appParams != null) { 1880326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG,"TYPE_MESSAGE (GET): Attachment = " + appParams.getAttachment() + 1881326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ", Charset = " + appParams.getCharset() + 1882326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ", FractionRequest = " + appParams.getFractionRequest()); 1883326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1884326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1885326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Throw exception if requester NATIVE charset for Email 1886326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Exception is caught by MapObexServer sendGetMessageResp 1887326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 1888326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("EMAIL charset not UTF-8"); 1889326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1890326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapbMessageEmail message = new BluetoothMapbMessageEmail(); 1891326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri contentUri = Uri.parse(mBaseEmailUri + BluetoothMapContract.TABLE_MESSAGE); 1892326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, "_ID = " + id, null, null); 189328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 189428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz throw new IllegalArgumentException("EMAIL handle not found"); 189528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 189628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 189728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 1898326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement folderElement; 1899326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1900326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Handle fraction requests 1901326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int fractionRequest = appParams.getFractionRequest(); 1902326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fractionRequest != BluetoothMapAppParams.INVALID_VALUE_PARAMETER) { 1903326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Fraction requested 1904326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) { 1905326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String fractionStr = (fractionRequest == 0) ? "FIRST" : "NEXT"; 1906326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.v(TAG, "getEmailMessage - FractionRequest " + fractionStr 1907326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + " - send compete message" ); 1908326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1909326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Check if message is complete and if not - request message from server 1910326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (c.getString(c.getColumnIndex( 1911326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapContract.MessageColumns.RECEPTION_STATE)).equalsIgnoreCase( 1912326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapContract.RECEPTION_STATE_COMPLETE) == false) { 1913326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // TODO: request message from server 1914326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, "getEmailMessage - receptionState not COMPLETE - Not Implemented!" ); 1915326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1916326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1917326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Set read status: 1918326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String read = c.getString(c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_READ)); 1919326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (read != null && read.equalsIgnoreCase("1")) 1920326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.setStatus(true); 1921326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde else 1922326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.setStatus(false); 1923326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1924326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Set message type: 1925326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.setType(TYPE.EMAIL); 1926326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1927326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Set folder: 1928326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long folderId = c.getLong(c.getColumnIndex(BluetoothMapContract.MessageColumns.FOLDER_ID)); 1929326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde folderElement = currentFolder.getEmailFolderById(folderId); 1930326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.setCompleteFolder(folderElement.getFullPath()); 1931326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1932326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Set recipient: 1933326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String nameEmail = c.getString(c.getColumnIndex(BluetoothMapContract.MessageColumns.TO_LIST)); 1934326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(nameEmail); 1935326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (tokens.length != 0) { 1936326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "Recipient count= " + tokens.length); 1937326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int i = 0; 1938326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde while (i < tokens.length) { 1939326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Recipient = " + tokens[i].toString()); 1940326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String[] emails = new String[1]; 1941326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde emails[0] = tokens[i].getAddress(); 1942326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = tokens[i].getName(); 1943326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.addRecipient(name, name, null, emails); 1944326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde i++; 1945326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1946326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1947326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1948326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Set originator: 1949326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde nameEmail = c.getString(c.getColumnIndex(BluetoothMapContract.MessageColumns.FROM_LIST)); 1950326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tokens = Rfc822Tokenizer.tokenize(nameEmail); 1951326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (tokens.length != 0) { 1952326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "Originator count= " + tokens.length); 1953326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int i = 0; 1954326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde while (i < tokens.length) { 1955326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Originator = " + tokens[i].toString()); 1956326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String[] emails = new String[1]; 1957326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde emails[0] = tokens[i].getAddress(); 1958326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = tokens[i].getName(); 1959326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.addOriginator(name, name, null, emails); 1960326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde i++; 1961326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1962326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1963326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1964326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Find out if we get attachments 1965326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String attStr = (appParams.getAttachment() == 0) ? "/" + BluetoothMapContract.FILE_MSG_NO_ATTACHMENTS : ""; 1966326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uri = Uri.parse(contentUri + "/" + id + attStr); 1967326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1968326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Get email message body content 1969326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int count = 0; 197028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz FileInputStream is = null; 197128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz ParcelFileDescriptor fd = null; 197228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 1973326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde try { 1974326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fd = mResolver.openFileDescriptor(uri, "r"); 1975326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde is = new FileInputStream(fd.getFileDescriptor()); 1976326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde StringBuilder email = new StringBuilder(""); 1977326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde byte[] buffer = new byte[1024]; 1978326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde while((count = is.read(buffer)) != -1) { 1979326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // TODO: Handle breaks within a UTF8 character 1980326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde email.append(new String(buffer,0,count)); 1981326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Email part = " + new String(buffer,0,count) + " count=" + count); 1982326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1983326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Set email message body: 1984326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message.setEmailBody(email.toString()); 1985326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (FileNotFoundException e) { 1986326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 1987326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (NullPointerException e) { 1988326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 1989326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (IOException e) { 1990326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 199128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 199228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(is); 199328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(fd); 1994326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 199528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 199628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(c); 1997326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 199828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 199928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return message.encode(); 2000326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2001fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie} 2002