BluetoothMapContent.java revision cd72c4dfe4db77c6df24db94f8d9a04efff7ab1d
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 175a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.annotation.TargetApi; 18fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.ContentResolver; 19fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.Context; 20fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.database.Cursor; 21fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.net.Uri; 225a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.net.Uri.Builder; 23326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.os.ParcelFileDescriptor; 24fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.BaseColumns; 25fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.ContactsContract; 26fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.ContactsContract.Contacts; 27fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.ContactsContract.PhoneLookup; 28fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.Mms; 29fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.Sms; 30cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Guptaimport android.provider.Telephony.MmsSms; 31cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Guptaimport android.provider.Telephony.CanonicalAddressesColumns; 325a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.provider.Telephony.Threads; 33326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.telephony.PhoneNumberUtils; 34fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.telephony.TelephonyManager; 35326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.text.util.Rfc822Token; 36326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.text.util.Rfc822Tokenizer; 37cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Guptaimport android.text.TextUtils; 38fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.util.Log; 395a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.util.SparseArray; 40fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 415a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.SignedLongLong; 425a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapContentObserver.Msg; 43fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.android.bluetooth.map.BluetoothMapUtils.TYPE; 445a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapbMessageMime.MimePart; 455a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract; 465a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract.ConversationColumns; 47fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.google.android.mms.pdu.CharacterSets; 4814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulzimport com.google.android.mms.pdu.PduHeaders; 49326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 50326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.ByteArrayOutputStream; 5128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulzimport java.io.Closeable; 52326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.FileInputStream; 53326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.FileNotFoundException; 54326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.IOException; 55326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.InputStream; 56326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.UnsupportedEncodingException; 57326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.text.SimpleDateFormat; 58326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.ArrayList; 59326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.Arrays; 60326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.Date; 615a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.HashMap; 62326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.List; 635a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.concurrent.atomic.AtomicLong; 64fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 655a60e47497f21f64e6d79420dc4c56c1907df22akschulz@TargetApi(19) 66fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xiepublic class BluetoothMapContent { 675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 68fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final String TAG = "BluetoothMapContent"; 69fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 70326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean D = BluetoothMapService.DEBUG; 71326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean V = BluetoothMapService.VERBOSE; 72fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 735a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Parameter Mask for selection of parameters to return in listings 745a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SUBJECT = 0x00000001; 755a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_DATETIME = 0x00000002; 765a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SENDER_NAME = 0x00000004; 775a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SENDER_ADDRESSING = 0x00000008; 785a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_RECIPIENT_NAME = 0x00000010; 795a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_RECIPIENT_ADDRESSING = 0x00000020; 805a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_TYPE = 0x00000040; 815a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SIZE = 0x00000080; 825a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_RECEPTION_STATUS = 0x00000100; 835a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_TEXT = 0x00000200; 845a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_ATTACHMENT_SIZE = 0x00000400; 855a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_PRIORITY = 0x00000800; 865a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_READ = 0x00001000; 875a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SENT = 0x00002000; 885a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_PROTECTED = 0x00004000; 895a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_REPLYTO_ADDRESSING = 0x00008000; 905a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Duplicate in proposed spec 915a60e47497f21f64e6d79420dc4c56c1907df22akschulz // private static final int MASK_RECEPTION_STATE = 0x00010000; 925a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_DELIVERY_STATUS = 0x00020000; 935a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_CONVERSATION_ID = 0x00040000; 945a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_CONVERSATION_NAME = 0x00080000; 955a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_FOLDER_TYPE = 0x00100000; 965a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: about to be removed from proposed spec 975a60e47497f21f64e6d79420dc4c56c1907df22akschulz // private static final int MASK_SEQUENCE_NUMBER = 0x00200000; 985a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_ATTACHMENT_MIME = 0x00400000; 995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1005a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_NAME = 0x00000001; 1015a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_LAST_ACTIVITY = 0x00000002; 1025a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_READ_STATUS = 0x00000004; 1035a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_VERSION_COUNTER = 0x00000008; 1045a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_SUMMARY = 0x00000010; 1055a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PARTTICIPANTS = 0x00000020; 1065a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_UCI = 0x00000040; 1075a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_DISP_NAME = 0x00000080; 1085a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_CHAT_STATE = 0x00000100; 1095a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_LAST_ACTIVITY = 0x00000200; 1105a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_X_BT_UID = 0x00000400; 1115a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_NAME = 0x00000800; 1125a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_PRESENCE = 0x00001000; 1135a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_PRESENCE_TEXT = 0x00002000; 1145a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_PRIORITY = 0x00004000; 1155a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1165a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Default values for omitted or 0 parameterMask application parameters */ 1175a60e47497f21f64e6d79420dc4c56c1907df22akschulz // MAP specification states that the default value for parameter mask are 1185a60e47497f21f64e6d79420dc4c56c1907df22akschulz // the #REQUIRED attributes in the DTD, and not all enabled 1195a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long PARAMETER_MASK_ALL_ENABLED = 0xFFFFFFFFL; 1205a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long PARAMETER_MASK_DEFAULT = 0x5E3L; 1215a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long CONVO_PARAMETER_MASK_ALL_ENABLED = 0xFFFFFFFFL; 1225a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long CONVO_PARAMETER_MASK_DEFAULT = 1235a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_CONVO_NAME | 1245a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_PARTTICIPANTS | 1255a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_PART_UCI | 1265a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_PART_DISP_NAME; 1275a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1295a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1315a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int FILTER_READ_STATUS_UNREAD_ONLY = 0x01; 1325a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int FILTER_READ_STATUS_READ_ONLY = 0x02; 1335a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int FILTER_READ_STATUS_ALL = 0x00; 134fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 135fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Type of MMS address. From Telephony.java it must be one of PduHeaders.BCC, */ 136fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* PduHeaders.CC, PduHeaders.FROM, PduHeaders.TO. These are from PduHeaders.java */ 1375a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_FROM = 0x89; 1385a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_TO = 0x97; 1395a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_BCC = 0x81; 1405a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_CC = 0x82; 141fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 142326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public static final String INSERT_ADDRES_TOKEN = "insert-address-token"; 143326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1445a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final Context mContext; 1455a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final ContentResolver mResolver; 1465a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final String mBaseUri; 1475a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final BluetoothMapAccountItem mAccount; 1485a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* The MasInstance reference is used to update persistent (over a connection) version counters*/ 1495a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final BluetoothMapMasInstance mMasInstance; 1505a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String mMessageVersion = BluetoothMapUtils.MAP_V10_STR; 1515a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1525a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mRemoteFeatureMask = BluetoothMapUtils.MAP_FEATURE_DEFAULT_BITMASK; 1535a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mMsgListingVersion = BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V10; 154fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 155fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static final String[] SMS_PROJECTION = new String[] { 156fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BaseColumns._ID, 157fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.THREAD_ID, 158fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.ADDRESS, 159fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.BODY, 160fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.DATE, 161fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.READ, 162fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.TYPE, 163fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.STATUS, 164fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.LOCKED, 165326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms.ERROR_CODE 166fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 167fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 168fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static final String[] MMS_PROJECTION = new String[] { 169fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BaseColumns._ID, 170fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.THREAD_ID, 171fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_ID, 172fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_SIZE, 173fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.SUBJECT, 174fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.CONTENT_TYPE, 175fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.TEXT_ONLY, 176fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.DATE, 177fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.DATE_SENT, 178fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.READ, 179fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_BOX, 180fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.STATUS, 1815a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.PRIORITY, 1825a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 1835a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1845a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] SMS_CONVO_PROJECTION = new String[] { 1855a60e47497f21f64e6d79420dc4c56c1907df22akschulz BaseColumns._ID, 1865a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.THREAD_ID, 1875a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.ADDRESS, 1885a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.DATE, 1895a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.READ, 1905a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.TYPE, 1915a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.STATUS, 1925a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.LOCKED, 1935a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.ERROR_CODE 1945a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 1955a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1965a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] MMS_CONVO_PROJECTION = new String[] { 1975a60e47497f21f64e6d79420dc4c56c1907df22akschulz BaseColumns._ID, 1985a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.THREAD_ID, 1995a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_ID, 2005a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_SIZE, 2015a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.SUBJECT, 2025a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.CONTENT_TYPE, 2035a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.TEXT_ONLY, 2045a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.DATE, 2055a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.DATE_SENT, 2065a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.READ, 2075a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_BOX, 2085a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.STATUS, 2095a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.PRIORITY, 2105a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.Addr.ADDRESS 211fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 212fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2135a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* CONVO LISTING projections and column indexes */ 2145a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String[] MMS_SMS_THREAD_PROJECTION = { 2155a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads._ID, 2165a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.DATE, 2175a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.SNIPPET, 2185a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.SNIPPET_CHARSET, 2195a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.READ, 2205a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.RECIPIENT_IDS 2215a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 2225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2235a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String[] CONVO_VERSION_PROJECTION = new String[] { 2245a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Thread information */ 2255a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.THREAD_ID, 2265a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.THREAD_NAME, 2275a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.READ_STATUS, 2285a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.LAST_THREAD_ACTIVITY, 2295a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.SUMMARY, 230fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 231fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2325a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Optimize the Cursor access to avoid the need to do a getColumnIndex() */ 2335a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_ID; 2345a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_DATE; 2355a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_SNIPPET; 2365a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_SNIPPET_CS; 2375a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_READ; 2385a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_RECIPIENT_IDS; 2395a60e47497f21f64e6d79420dc4c56c1907df22akschulz static { 2405a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: This might not work, if the projection is mapped in the content provider... 2415a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Change to init at first query? (Current use in the AOSP code is hard coded values 2425a60e47497f21f64e6d79420dc4c56c1907df22akschulz // unrelated to the projection used) 2435a60e47497f21f64e6d79420dc4c56c1907df22akschulz List<String> projection = Arrays.asList(MMS_SMS_THREAD_PROJECTION); 2445a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_ID = projection.indexOf(Threads._ID); 2455a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_DATE = projection.indexOf(Threads.DATE); 2465a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_SNIPPET = projection.indexOf(Threads.SNIPPET); 2475a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_SNIPPET_CS = projection.indexOf(Threads.SNIPPET_CHARSET); 2485a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_READ = projection.indexOf(Threads.READ); 2495a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_RECIPIENT_IDS = projection.indexOf(Threads.RECIPIENT_IDS); 2505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2515a60e47497f21f64e6d79420dc4c56c1907df22akschulz 252fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private class FilterInfo { 2535a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_SMS = 0; 2545a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_MMS = 1; 2555a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_EMAIL = 2; 2565a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_IM = 3; 257326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2585a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Change to ENUM, to ensure correct usage 259326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int mMsgType = TYPE_SMS; 260326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int mPhoneType = 0; 261326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String mPhoneNum = null; 262326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String mPhoneAlphaTag = null; 263326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /*column indices used to optimize queries */ 2645a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColId = -1; 2655a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColDate = -1; 2665a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColBody = -1; 2675a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColSubject = -1; 2685a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColFolder = -1; 2695a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColRead = -1; 2705a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColSize = -1; 2715a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColFromAddress = -1; 2725a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColToAddress = -1; 2735a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColCcAddress = -1; 2745a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColBccAddress = -1; 2755a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColReplyTo = -1; 2765a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAccountId = -1; 2775a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAttachment = -1; 2785a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAttachmentSize = -1; 2795a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAttachmentMime = -1; 2805a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColPriority = -1; 2815a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColProtected = -1; 2825a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColReception = -1; 2835a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColDelivery = -1; 2845a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColThreadId = -1; 2855a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColThreadName = -1; 2865a60e47497f21f64e6d79420dc4c56c1907df22akschulz 287326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColFolder = -1; 288326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColRead = -1; 2895a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColId = -1; 2905a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColSubject = -1; 2915a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColAddress = -1; 2925a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColDate = -1; 2935a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColType = -1; 2945a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColThreadId = -1; 2955a60e47497f21f64e6d79420dc4c56c1907df22akschulz 296326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColRead = -1; 2975a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMmsColFolder = -1; 298326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColAttachmentSize = -1; 299326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColTextOnly = -1; 300326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColId = -1; 301326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColSize = -1; 302326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColDate = -1; 303326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColSubject = -1; 3045a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMmsColThreadId = -1; 3055a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3065a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColConvoId = -1; 3075a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColLastActivity = -1; 3085a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColName = -1; 3095a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColRead = -1; 3105a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColVersionCounter = -1; 3115a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColSummary = -1; 3125a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColBtUid = -1; 3135a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColChatState = -1; 3145a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColContactUci = -1; 3155a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColNickname = -1; 3165a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColLastActive = -1; 3175a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColName = -1; 3185a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPresenceState = -1; 3195a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPresenceText = -1; 3205a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPriority = -1; 3215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3235a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setMessageColumns(Cursor c) { 3245a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColId = c.getColumnIndex( 3255a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns._ID); 3265a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColDate = c.getColumnIndex( 3275a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DATE); 3285a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColSubject = c.getColumnIndex( 3295a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.SUBJECT); 3305a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColFolder = c.getColumnIndex( 3315a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FOLDER_ID); 3325a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColRead = c.getColumnIndex( 3335a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_READ); 3345a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColSize = c.getColumnIndex( 3355a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.MESSAGE_SIZE); 3365a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColFromAddress = c.getColumnIndex( 3375a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FROM_LIST); 3385a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColToAddress = c.getColumnIndex( 3395a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.TO_LIST); 3405a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColAttachment = c.getColumnIndex( 3415a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_ATTACHMENT); 3425a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColAttachmentSize = c.getColumnIndex( 3435a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.ATTACHMENT_SIZE); 3445a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColPriority = c.getColumnIndex( 3455a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY); 3465a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColProtected = c.getColumnIndex( 3475a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_PROTECTED); 3485a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColReception = c.getColumnIndex( 3495a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.RECEPTION_STATE); 3505a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColDelivery = c.getColumnIndex( 3515a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DEVILERY_STATE); 3525a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColThreadId = c.getColumnIndex( 3535a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_ID); 3545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3555a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3565a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setEmailMessageColumns(Cursor c) { 3575a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMessageColumns(c); 3585a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColCcAddress = c.getColumnIndex( 3595a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.CC_LIST); 3605a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColBccAddress = c.getColumnIndex( 3615a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.BCC_LIST); 3625a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColReplyTo = c.getColumnIndex( 3635a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.REPLY_TO_LIST); 3645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3655a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3665a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setImMessageColumns(Cursor c) { 3675a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMessageColumns(c); 3685a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColThreadName = c.getColumnIndex( 3695a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_NAME); 3705a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColAttachmentMime = c.getColumnIndex( 3715a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.ATTACHMENT_MINE_TYPES); 3725a60e47497f21f64e6d79420dc4c56c1907df22akschulz //TODO this is temporary as text should come from parts table instead 3735a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColBody = c.getColumnIndex(BluetoothMapContract.MessageColumns.BODY); 3745a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3765a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3775a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setEmailImConvoColumns(Cursor c) { 3785a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColConvoId = c.getColumnIndex( 3795a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.THREAD_ID); 3805a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColLastActivity = c.getColumnIndex( 3815a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY); 3825a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColName = c.getColumnIndex( 3835a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.THREAD_NAME); 3845a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColRead = c.getColumnIndex( 3855a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.READ_STATUS); 3865a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColVersionCounter = c.getColumnIndex( 3875a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.VERSION_COUNTER); 3885a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColSummary = c.getColumnIndex( 3895a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.SUMMARY); 3905a60e47497f21f64e6d79420dc4c56c1907df22akschulz setEmailImConvoContactColumns(c); 3915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3935a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setEmailImConvoContactColumns(Cursor c){ 3945a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColBtUid = c.getColumnIndex( 3955a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.X_BT_UID); 3965a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColChatState = c.getColumnIndex( 3975a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CHAT_STATE); 3985a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColContactUci = c.getColumnIndex( 3995a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.UCI); 4005a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColNickname = c.getColumnIndex( 4015a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NICKNAME); 4025a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColLastActive = c.getColumnIndex( 4035a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.LAST_ACTIVE); 4045a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColName = c.getColumnIndex( 4055a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME); 4065a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPresenceState = c.getColumnIndex( 4075a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.PRESENCE_STATE); 4085a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPresenceText = c.getColumnIndex( 4095a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.STATUS_TEXT); 4105a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPriority = c.getColumnIndex( 4115a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.PRIORITY); 412326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 413326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 414326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void setSmsColumns(Cursor c) { 415326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColId = c.getColumnIndex(BaseColumns._ID); 416326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColFolder = c.getColumnIndex(Sms.TYPE); 417326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColRead = c.getColumnIndex(Sms.READ); 418326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColSubject = c.getColumnIndex(Sms.BODY); 419326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColAddress = c.getColumnIndex(Sms.ADDRESS); 4205a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsColDate = c.getColumnIndex(Sms.DATE); 4215a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsColType = c.getColumnIndex(Sms.TYPE); 4225a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsColThreadId= c.getColumnIndex(Sms.THREAD_ID); 423326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 424326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 425326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void setMmsColumns(Cursor c) { 426326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColId = c.getColumnIndex(BaseColumns._ID); 427326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColFolder = c.getColumnIndex(Mms.MESSAGE_BOX); 428326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColRead = c.getColumnIndex(Mms.READ); 429326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColAttachmentSize = c.getColumnIndex(Mms.MESSAGE_SIZE); 430326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColTextOnly = c.getColumnIndex(Mms.TEXT_ONLY); 431326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColSize = c.getColumnIndex(Mms.MESSAGE_SIZE); 432326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColDate = c.getColumnIndex(Mms.DATE); 433326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColSubject = c.getColumnIndex(Mms.SUBJECT); 4345a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMmsColThreadId = c.getColumnIndex(Mms.THREAD_ID); 435326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 436fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 437fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4385a60e47497f21f64e6d79420dc4c56c1907df22akschulz public BluetoothMapContent(final Context context, BluetoothMapAccountItem account, 4395a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMasInstance mas) { 440fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mContext = context; 441fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mResolver = mContext.getContentResolver(); 4425a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance = mas; 443fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (mResolver == null) { 444326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "getContentResolver failed"); 445fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 446fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(account != null){ 4485a60e47497f21f64e6d79420dc4c56c1907df22akschulz mBaseUri = account.mBase_uri + "/"; 4495a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount = account; 4505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 4515a60e47497f21f64e6d79420dc4c56c1907df22akschulz mBaseUri = null; 4525a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount = null; 4535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 45528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz private static void close(Closeable c) { 456fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 45728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) c.close(); 458fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 459fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 460fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 461fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setProtected(BluetoothMapMessageListingElement e, Cursor c, 462326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 463fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_PROTECTED) != 0) { 464fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String protect = "no"; 4655a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 4665a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 4675a60e47497f21f64e6d79420dc4c56c1907df22akschulz int flagProtected = c.getInt(fi.mMessageColProtected); 468326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (flagProtected == 1) { 469326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde protect = "yes"; 470326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 471326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 472326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setProtected: " + protect + "\n"); 473fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setProtect(protect); 474fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 475fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 476fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 477326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void setThreadId(BluetoothMapMessageListingElement e, Cursor c, 478326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 4795a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_CONVERSATION_ID) != 0) { 4805a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId = 0; 4815a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE type = TYPE.SMS_GSM; // Just used for handle encoding 4825a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 4835a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getLong(fi.mSmsColThreadId); 4845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 4855a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getLong(fi.mMmsColThreadId); 4865a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.MMS;// Just used for handle encoding 4875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 4885a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 4895a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getLong(fi.mMessageColThreadId); 4905a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.EMAIL;// Just used for handle encoding 4915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4925a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setThreadId(threadId,type); 493326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setThreadId: " + threadId + "\n"); 494326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 495326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 496326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 4975a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setThreadName(BluetoothMapMessageListingElement e, Cursor c, 4985a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 4995a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Maybe this should be valid for SMS/MMS 5005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_CONVERSATION_NAME) != 0) { 5015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_IM) { 5025a60e47497f21f64e6d79420dc4c56c1907df22akschulz String threadName = c.getString(fi.mMessageColThreadName); 5035a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setThreadName(threadName); 5045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setThreadName: " + threadName + "\n"); 5055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5085a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5095a60e47497f21f64e6d79420dc4c56c1907df22akschulz 510fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSent(BluetoothMapMessageListingElement e, Cursor c, 511326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 512fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENT) != 0) { 513fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = 0; 514326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 515326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgType = c.getInt(fi.mSmsColFolder); 516326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 517326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgType = c.getInt(fi.mMmsColFolder); 5185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 5195a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 5205a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgType = c.getInt(fi.mMessageColFolder); 521fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 522fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String sent = null; 523fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 2) { 524fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sent = "yes"; 525fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 526fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sent = "no"; 527fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 528326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSent: " + sent); 529fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSent(sent); 530fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 531fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 532fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 533fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRead(BluetoothMapMessageListingElement e, Cursor c, 534326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 53570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz int read = 0; 536326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 537326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde read = c.getInt(fi.mSmsColRead); 538326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 539326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde read = c.getInt(fi.mMmsColRead); 5405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 5415a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 5425a60e47497f21f64e6d79420dc4c56c1907df22akschulz read = c.getInt(fi.mMessageColRead); 54370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 54470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz String setread = null; 545326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 546326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setRead: " + setread); 547326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setRead((read==1?true:false), ((ap.getParameterMask() & MASK_READ) != 0)); 548fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 5495a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setConvoRead(BluetoothMapConvoListingElement e, Cursor c, 5505a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 5515a60e47497f21f64e6d79420dc4c56c1907df22akschulz String setread = null; 5525a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = 0; 5535a60e47497f21f64e6d79420dc4c56c1907df22akschulz read = c.getInt(fi.mConvoColRead); 5545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5555a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5565a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setRead: " + setread); 5575a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setRead((read==1?true:false), ((ap.getParameterMask() & MASK_READ) != 0)); 5585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 559fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 560fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setPriority(BluetoothMapMessageListingElement e, Cursor c, 561326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 562fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_PRIORITY) != 0) { 563326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String priority = "no"; 5645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 5655a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 5665a60e47497f21f64e6d79420dc4c56c1907df22akschulz int highPriority = c.getInt(fi.mMessageColPriority); 567326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (highPriority == 1) { 568326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde priority = "yes"; 569326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 570326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 57114f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz int pri = 0; 572326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_MMS) { 57314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz pri = c.getInt(c.getColumnIndex(Mms.PRIORITY)); 57414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 57514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz if (pri == PduHeaders.PRIORITY_HIGH) { 57614f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz priority = "yes"; 57714f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 578326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setPriority: " + priority); 579fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setPriority(priority); 580fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 581fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 582fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 58370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 58470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * For SMS we set the attachment size to 0, as all data will be text data, hence 58570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * attachments for SMS is not possible. 58670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * For MMS all data is actually attachments, hence we do set the attachment size to 58770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * the total message size. To provide a more accurate attachment size, one could 58870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * extract the length (in bytes) of the text parts. 58970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 5905a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setAttachment(BluetoothMapMessageListingElement e, Cursor c, 591326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 592fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_ATTACHMENT_SIZE) != 0) { 593fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int size = 0; 5945a60e47497f21f64e6d79420dc4c56c1907df22akschulz String attachmentMimeTypes = null; 595326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_MMS) { 596326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(c.getInt(fi.mMmsColTextOnly) == 0) { 597326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mMmsColAttachmentSize); 5988b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if(size <= 0) { 5998b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // We know there are attachments, since it is not TextOnly 6008b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Hence the size in the database must be wrong. 6018b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Set size to 1 to indicate to the client, that attachments are present 6028b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, size reported as: " + size 6038b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 6048b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; 6058b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde } 6065a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Add handling of attachemnt mime types 607326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 608326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 6095a60e47497f21f64e6d79420dc4c56c1907df22akschulz int attachment = c.getInt(fi.mMessageColAttachment); 6105a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = c.getInt(fi.mMessageColAttachmentSize); 611326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(attachment == 1 && size == 0) { 6128b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, attachment size reported as: " + size 6138b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 6148b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; /* Ensure we indicate we have attachments in the size, if the 615326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message has attachments, in case the e-mail client do not 616326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde report a size */ 617326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 6185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 6195a60e47497f21f64e6d79420dc4c56c1907df22akschulz int attachment = c.getInt(fi.mMessageColAttachment); 6205a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = c.getInt(fi.mMessageColAttachmentSize); 6215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(attachment == 1 && size == 0) { 6225a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = 1; /* Ensure we indicate we have attachments in the size, it the 6235a60e47497f21f64e6d79420dc4c56c1907df22akschulz message has attachments, in case the e-mail client do not 6245a60e47497f21f64e6d79420dc4c56c1907df22akschulz report a size */ 6255a60e47497f21f64e6d79420dc4c56c1907df22akschulz attachmentMimeTypes = c.getString(fi.mMessageColAttachmentMime); 6265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 62770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 6285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setAttachmentSize: " + size + "\n" + 6295a60e47497f21f64e6d79420dc4c56c1907df22akschulz "setAttachmentMimeTypes: " + attachmentMimeTypes ); 630fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setAttachmentSize(size); 6315a60e47497f21f64e6d79420dc4c56c1907df22akschulz 6325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if( (mMsgListingVersion > BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V10) 6335a60e47497f21f64e6d79420dc4c56c1907df22akschulz && ((ap.getParameterMask() & MASK_ATTACHMENT_MIME) != 0) ){ 6345a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setAttachmentMimeTypes(attachmentMimeTypes); 6355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 636fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 637fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 638fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 639fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setText(BluetoothMapMessageListingElement e, Cursor c, 640326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 641fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_TEXT) != 0) { 642fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String hasText = ""; 643326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 644fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 645326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 646326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int textOnly = c.getInt(fi.mMmsColTextOnly); 647fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (textOnly == 1) { 648fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 649fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 650326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 6515a60e47497f21f64e6d79420dc4c56c1907df22akschulz String text = getTextPartsMms(mResolver, id); 652fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (text != null && text.length() > 0) { 653fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 654fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 655fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "no"; 656fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 657fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 6585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 6595a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 660326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde hasText = "yes"; 661fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 662326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setText: " + hasText); 663fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setText(hasText); 664fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 665fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 666fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 667fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setReceptionStatus(BluetoothMapMessageListingElement e, Cursor c, 668fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 669fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECEPTION_STATUS) != 0) { 670fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String status = "complete"; 671326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setReceptionStatus: " + status); 672fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setReceptionStatus(status); 673fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 674fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 675fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 6765a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setDeliveryStatus(BluetoothMapMessageListingElement e, Cursor c, 6775a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 6785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_DELIVERY_STATUS) != 0) { 6795a60e47497f21f64e6d79420dc4c56c1907df22akschulz String deliveryStatus = "delivered"; 6805a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Should be handled for SMS and MMS as well 6815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 6825a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 6835a60e47497f21f64e6d79420dc4c56c1907df22akschulz deliveryStatus = c.getString(fi.mMessageColDelivery); 6845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setDeliveryStatus: " + deliveryStatus); 6865a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setDeliveryStatus(deliveryStatus); 6875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6895a60e47497f21f64e6d79420dc4c56c1907df22akschulz 690fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSize(BluetoothMapMessageListingElement e, Cursor c, 691fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 692fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SIZE) != 0) { 693fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int size = 0; 694326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 695326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String subject = c.getString(fi.mSmsColSubject); 696fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie size = subject.length(); 697326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 698326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mMmsColSize); 699cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //MMS complete size = attachment_size + subject length 700cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String subject = e.getSubject(); 701cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (subject == null || subject.length() == 0 ) { 702cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // Handle setSubject if not done case 703cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta setSubject(e, c, fi, ap); 704cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 705cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (subject != null && subject.length() != 0 ) 706cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta size += subject.length(); 7075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 7085a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 7095a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = c.getInt(fi.mMessageColSize); 710fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 7118b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if(size <= 0) { 7128b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // A message cannot have size 0 7138b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Hence the size in the database must be wrong. 7148b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Set size to 1 to indicate to the client, that the message has content. 7158b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, size reported as: " + size 7168b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 7178b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; 7188b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde } 719326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSize: " + size); 720fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSize(size); 721fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 722fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 723fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 7245a60e47497f21f64e6d79420dc4c56c1907df22akschulz private TYPE getType(Cursor c, FilterInfo fi) { 7255a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE type = null; 7262e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (V) Log.d(TAG, "getType: for filterMsgType" + fi.mMsgType); 7275a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 7282e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (V) Log.d(TAG, "getType: phoneType for SMS " + fi.mPhoneType); 7292e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (fi.mPhoneType == TelephonyManager.PHONE_TYPE_CDMA) { 7305a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.SMS_CDMA; 7312e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else { 7322e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta type = TYPE.SMS_GSM; 7335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7345a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 7355a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.MMS; 7365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 7375a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.EMAIL; 7385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 7395a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.IM; 7405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7415a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "getType: " + type); 7425a60e47497f21f64e6d79420dc4c56c1907df22akschulz 7435a60e47497f21f64e6d79420dc4c56c1907df22akschulz return type; 7445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7455a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setFolderType(BluetoothMapMessageListingElement e, Cursor c, 7465a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 7475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_FOLDER_TYPE) != 0) { 7485a60e47497f21f64e6d79420dc4c56c1907df22akschulz String folderType = null; 7495a60e47497f21f64e6d79420dc4c56c1907df22akschulz int folderId = 0; 750326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 7515a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = c.getInt(fi.mSmsColFolder); 7525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId == 1) 7535a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_INBOX; 7545a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 2) 7555a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_SENT; 7565a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 3) 7575a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DRAFT; 7585a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 4 || folderId == 5 || folderId == 6) 7595a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OUTBOX; 7605a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 7615a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DELETED; 762326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 7635a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = c.getInt(fi.mMmsColFolder); 7645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId == 1) 7655a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_INBOX; 7665a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 2) 7675a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_SENT; 7685a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 3) 7695a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DRAFT; 7705a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 4) 7715a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OUTBOX; 7725a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 7735a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DELETED; 774326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 7755a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: need to find name from id and then set folder type 7765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 7775a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = c.getInt(fi.mMessageColFolder); 7785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId == BluetoothMapContract.FOLDER_ID_INBOX) 7795a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_INBOX; 7805a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_SENT) 7815a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_SENT; 7825a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_DRAFT) 7835a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DRAFT; 7845a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_OUTBOX) 7855a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OUTBOX; 7865a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_DELETED) 7875a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DELETED; 7885a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 7895a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OTHER; 7905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setFolderType: " + folderType); 7925a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setFolderType(folderType); 7935a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7955a60e47497f21f64e6d79420dc4c56c1907df22akschulz 7965a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String getRecipientNameEmail(BluetoothMapMessageListingElement e, 7975a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c, 7985a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi) { 7995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8005a60e47497f21f64e6d79420dc4c56c1907df22akschulz String toAddress, ccAddress, bccAddress; 8015a60e47497f21f64e6d79420dc4c56c1907df22akschulz toAddress = c.getString(fi.mMessageColToAddress); 8025a60e47497f21f64e6d79420dc4c56c1907df22akschulz ccAddress = c.getString(fi.mMessageColCcAddress); 8035a60e47497f21f64e6d79420dc4c56c1907df22akschulz bccAddress = c.getString(fi.mMessageColBccAddress); 8045a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8055a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder sb = new StringBuilder(); 8065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (toAddress != null) { 8075a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(toAddress); 8085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "toName count= " + tokens.length); 8105a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8115a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8125a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ToName = " + tokens[i].toString()); 8145a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 8155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8165a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(name); 8175a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8185a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (ccAddress != null) { 8235a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 8245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8265a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (ccAddress != null) { 8275a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(ccAddress); 8285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "ccName count= " + tokens.length); 8305a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8315a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8325a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ccName = " + tokens[i].toString()); 8345a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 8355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8365a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(name); 8375a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8385a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8415a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (bccAddress != null) { 8425a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 8435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (bccAddress != null) { 8465a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(bccAddress); 8475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "bccName count= " + tokens.length); 8495a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8505a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8515a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "bccName = " + tokens[i].toString()); 8535a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 8545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8555a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(name); 8565a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8575a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 859fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 860fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 8615a60e47497f21f64e6d79420dc4c56c1907df22akschulz return sb.toString(); 862fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 863fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 8645a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String getRecipientAddressingEmail(BluetoothMapMessageListingElement e, 8655a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c, 8665a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi) { 867326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String toAddress, ccAddress, bccAddress; 8685a60e47497f21f64e6d79420dc4c56c1907df22akschulz toAddress = c.getString(fi.mMessageColToAddress); 8695a60e47497f21f64e6d79420dc4c56c1907df22akschulz ccAddress = c.getString(fi.mMessageColCcAddress); 8705a60e47497f21f64e6d79420dc4c56c1907df22akschulz bccAddress = c.getString(fi.mMessageColBccAddress); 871326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 8725a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder sb = new StringBuilder(); 873326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (toAddress != null) { 8745a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(toAddress); 8755a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "toAddress count= " + tokens.length); 8775a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8785a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8795a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ToAddress = " + tokens[i].toString()); 8815a60e47497f21f64e6d79420dc4c56c1907df22akschulz String email = tokens[i].getAddress(); 8825a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8835a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(email); 8845a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8855a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8865a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8885a60e47497f21f64e6d79420dc4c56c1907df22akschulz 889326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (ccAddress != null) { 8905a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 891326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 892326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 893326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (ccAddress != null) { 8945a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(ccAddress); 8955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "ccAddress count= " + tokens.length); 8975a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8985a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8995a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 9005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ccAddress = " + tokens[i].toString()); 9015a60e47497f21f64e6d79420dc4c56c1907df22akschulz String email = tokens[i].getAddress(); 9025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 9035a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(email); 9045a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 9055a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 9065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 908326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (bccAddress != null) { 9095a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 910326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 911326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 912326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (bccAddress != null) { 9135a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(bccAddress); 9145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 9155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "bccAddress count= " + tokens.length); 9165a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 9175a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 9185a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 9195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "bccAddress = " + tokens[i].toString()); 9205a60e47497f21f64e6d79420dc4c56c1907df22akschulz String email = tokens[i].getAddress(); 9215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 9225a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(email); 9235a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 9245a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 9255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 927326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 9285a60e47497f21f64e6d79420dc4c56c1907df22akschulz return sb.toString(); 929326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 930326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 931fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRecipientAddressing(BluetoothMapMessageListingElement e, Cursor c, 932fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 933fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECIPIENT_ADDRESSING) != 0) { 934326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String address = null; 935326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 936326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 937cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (msgType == Sms.MESSAGE_TYPE_INBOX ) { 938326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = fi.mPhoneNum; 939fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 940fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie address = c.getString(c.getColumnIndex(Sms.ADDRESS)); 941fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 942cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if ((address == null) && msgType == Sms.MESSAGE_TYPE_DRAFT) { 943cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Fetch address for Drafts folder from "canonical_address" table 944cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta int threadIdInd = c.getColumnIndex(Sms.THREAD_ID); 945cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String threadIdStr = c.getString(threadIdInd); 946cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta address = getCanonicalAddressSms(mResolver, Integer.valueOf(threadIdStr)); 947cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(V) Log.v(TAG, "threadId = " + threadIdStr + " adress:" + address +"\n"); 948cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 949326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 950fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 951fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie address = getAddressMms(mResolver, id, MMS_TO); 952326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 953326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Might be another way to handle addresses */ 9545a60e47497f21f64e6d79420dc4c56c1907df22akschulz address = getRecipientAddressingEmail(e, c,fi); 955fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 956326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setRecipientAddressing: " + address); 957326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null) 958326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = ""; 959fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setRecipientAddressing(address); 960fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 961fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 962fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 963fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRecipientName(BluetoothMapMessageListingElement e, Cursor c, 964fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 965fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECIPIENT_NAME) != 0) { 966326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = null; 967326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 968326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 969fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType != 1) { 970326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = c.getString(fi.mSmsColAddress); 971326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 9725a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 973fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 974326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = fi.mPhoneAlphaTag; 975fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 976326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 977326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 978326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone; 979326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(e.getRecipientAddressing() != null){ 980326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = getAddressMms(mResolver, id, MMS_TO); 981326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 982326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = e.getRecipientAddressing(); 983326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 984326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 9855a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 986326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 987326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Might be another way to handle address and names */ 9885a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getRecipientNameEmail(e,c,fi); 989fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 990326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setRecipientName: " + name); 991326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(name == null) 992326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = ""; 993fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setRecipientName(name); 994fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 995fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 996fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 997fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSenderAddressing(BluetoothMapMessageListingElement e, Cursor c, 998326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 999fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENDER_ADDRESSING) != 0) { 10005a60e47497f21f64e6d79420dc4c56c1907df22akschulz String address = ""; 1001326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String tempAddress; 1002326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1003326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 1004326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msgType == 1) { // INBOX 1005326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = c.getString(fi.mSmsColAddress); 1006fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1007326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = fi.mPhoneNum; 1008fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1009326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(tempAddress == null) { 1010326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* This can only happen on devices with no SIM - 1011326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde hence will typically not have any SMS messages. */ 1012326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1013326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = PhoneNumberUtils.extractNetworkPortion(tempAddress); 10145a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* extractNetworkPortion can return N if the number is a service "number" = 10155a60e47497f21f64e6d79420dc4c56c1907df22akschulz * a string with the a name in (i.e. "Some-Tele-company" would return N 10165a60e47497f21f64e6d79420dc4c56c1907df22akschulz * because of the N in compaNy) 1017326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Hence we need to check if the number is actually a string with alpha chars. 1018326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * */ 10195a60e47497f21f64e6d79420dc4c56c1907df22akschulz Boolean alpha = PhoneNumberUtils.stripSeparators(tempAddress).matches( 10205a60e47497f21f64e6d79420dc4c56c1907df22akschulz "[0-9]*[a-zA-Z]+[0-9]*"); 1021326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1022326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null || address.length() < 2 || alpha) { 1023326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = tempAddress; // if the number is a service acsii text just use it 1024326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1025326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1026326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1027326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 1028326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = getAddressMms(mResolver, id, MMS_FROM); 1029326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = PhoneNumberUtils.extractNetworkPortion(tempAddress); 1030326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null || address.length() < 1){ 1031326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = tempAddress; // if the number is a service acsii text just use it 1032326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 10335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL/* || 10345a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM*/) { 10355a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameEmail = c.getString(fi.mMessageColFromAddress); 10365a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(nameEmail); 10375a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 10385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Originator count= " + tokens.length); 10395a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 10405a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 10415a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 10425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "SenderAddress = " + tokens[i].toString()); 10435a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 10445a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 10455a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 10465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) address += "; "; //Delimiter 10475a60e47497f21f64e6d79420dc4c56c1907df22akschulz address += emails[0]; 10485a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 10495a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 10505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10515a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10525a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(fi.mMsgType == FilterInfo.TYPE_IM) { 10535a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: For IM we add the contact ID in the addressing 10545a60e47497f21f64e6d79420dc4c56c1907df22akschulz long contact_id = c.getLong(fi.mMessageColFromAddress); 10555a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: This is a BAD hack, that we map the contact ID to a conversation ID!!! 10565a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We need to reach a conclusion on what to do 10575a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contactsUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVOCONTACT); 10585a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor contacts = mResolver.query(contactsUri, 10595a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONTACT_PROJECTION, 10605a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CONVO_ID 10615a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " = " + contact_id, null, null); 10625a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 10635a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO this will not work for group-chats 10645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null && contacts.moveToFirst()){ 10655a60e47497f21f64e6d79420dc4c56c1907df22akschulz address = contacts.getString( 10665a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts.getColumnIndex( 10675a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.UCI)); 10685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 10705a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (contacts != null) contacts.close(); 10715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10725a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1073fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1074326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setSenderAddressing: " + address); 1075326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null) 1076326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = ""; 1077fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSenderAddressing(address); 1078fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1079fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1080fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1081fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSenderName(BluetoothMapMessageListingElement e, Cursor c, 1082326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1083fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENDER_NAME) != 0) { 10845a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = ""; 1085326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1086fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 1087fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 1088326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = c.getString(fi.mSmsColAddress); 1089326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 10905a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 1091fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1092326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = fi.mPhoneAlphaTag; 1093fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1094326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1095326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 1096326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone; 1097326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(e.getSenderAddressing() != null){ 1098326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = getAddressMms(mResolver, id, MMS_FROM); 1099326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1100326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = e.getSenderAddressing(); 1101326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1102326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty() ) 11035a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 11045a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL/* || 11055a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM*/) { 11065a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameEmail = c.getString(fi.mMessageColFromAddress); 11075a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(nameEmail); 11085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 11095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Originator count= " + tokens.length); 11105a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 11115a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 11125a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 11135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "senderName = " + tokens[i].toString()); 11145a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 11155a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 11165a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameIn = tokens[i].getName(); 11175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) name += "; "; //Delimiter 11185a60e47497f21f64e6d79420dc4c56c1907df22akschulz name += nameIn; 11195a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 11205a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 11215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(fi.mMsgType == FilterInfo.TYPE_IM) { 11245a60e47497f21f64e6d79420dc4c56c1907df22akschulz // For IM we add the contact ID in the addressing 11255a60e47497f21f64e6d79420dc4c56c1907df22akschulz long contact_id = c.getLong(fi.mMessageColFromAddress); 11265a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contactsUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVOCONTACT); 11275a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor contacts = mResolver.query(contactsUri, 11285a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONTACT_PROJECTION, 11295a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CONVO_ID 11305a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " = " + contact_id, null, null); 11315a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 11325a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO this will not work for group-chats 11335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null && contacts.moveToFirst()){ 11345a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = contacts.getString( 11355a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts.getColumnIndex( 11365a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME)); 11375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 11395a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (contacts != null) contacts.close(); 11405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1141fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1142326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setSenderName: " + name); 1143326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(name == null) 1144326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = ""; 1145fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSenderName(name); 1146fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1147fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1148fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 11495a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11505a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11515a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1152fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setDateTime(BluetoothMapMessageListingElement e, Cursor c, 1153326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1154326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getParameterMask() & MASK_DATETIME) != 0) { 1155326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long date = 0; 1156326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1157326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde date = c.getLong(fi.mSmsColDate); 1158326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1159326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Use Mms.DATE for all messages. Although contract class states */ 1160326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Mms.DATE_SENT are for outgoing messages. But that is not working. */ 1161326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde date = c.getLong(fi.mMmsColDate) * 1000L; 1162326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1163326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* int msgBox = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); */ 1164326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* if (msgBox == Mms.MESSAGE_BOX_INBOX) { */ 1165326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* date = c.getLong(c.getColumnIndex(Mms.DATE)) * 1000L; */ 1166326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* } else { */ 1167326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* date = c.getLong(c.getColumnIndex(Mms.DATE_SENT)) * 1000L; */ 1168326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* } */ 11695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 11705a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 11715a60e47497f21f64e6d79420dc4c56c1907df22akschulz date = c.getLong(fi.mMessageColDate); 1172326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1173326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setDateTime(date); 1174fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1175fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1176fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 11775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11785a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setLastActivity(BluetoothMapConvoListingElement e, Cursor c, 11795a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 11805a60e47497f21f64e6d79420dc4c56c1907df22akschulz long date = 0; 11815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS || 11825a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_MMS ) { 11835a60e47497f21f64e6d79420dc4c56c1907df22akschulz date = c.getLong(MMS_SMS_THREAD_COL_DATE); 11845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 11855a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 11865a60e47497f21f64e6d79420dc4c56c1907df22akschulz date = c.getLong(fi.mConvoColLastActivity); 11875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11885a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setLastActivity(date); 11895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG, "setDateTime: " + e.getLastActivityString()); 11905a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11935a60e47497f21f64e6d79420dc4c56c1907df22akschulz static public String getTextPartsMms(ContentResolver r, long id) { 1194fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String text = ""; 1195fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = new String("mid=" + id); 1196326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/part"); 1197fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 1198326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // TODO: maybe use a projection with only "ct" and "text" 11995a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = r.query(uriAddress, null, selection, 12005a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null); 120128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 12025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 12035a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 12045a60e47497f21f64e6d79420dc4c56c1907df22akschulz String ct = c.getString(c.getColumnIndex("ct")); 12055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (ct.equals("text/plain")) { 12065a60e47497f21f64e6d79420dc4c56c1907df22akschulz String part = c.getString(c.getColumnIndex("text")); 12075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(part != null) { 12085a60e47497f21f64e6d79420dc4c56c1907df22akschulz text += part; 12095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1210326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 12115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 121228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 121328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 12145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1215fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 12165a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1217fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return text; 1218fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1219fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1220fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSubject(BluetoothMapMessageListingElement e, Cursor c, 1221326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1222fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String subject = ""; 1223fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int subLength = ap.getSubjectLength(); 1224fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(subLength == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 1225fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie subLength = 256; 1226fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1227fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SUBJECT) != 0) { 1228326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1229326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = c.getString(fi.mSmsColSubject); 1230326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1231326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = c.getString(fi.mMmsColSubject); 1232fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (subject == null || subject.length() == 0) { 1233fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Get subject from mms text body parts - if any exists */ 1234326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 12355a60e47497f21f64e6d79420dc4c56c1907df22akschulz subject = getTextPartsMms(mResolver, id); 1236fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 12375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 12385a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 12395a60e47497f21f64e6d79420dc4c56c1907df22akschulz subject = c.getString(fi.mMessageColSubject); 1240fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1241326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (subject != null && subject.length() > subLength) { 1242326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = subject.substring(0, subLength); 1243fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1244326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSubject: " + subject); 1245fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSubject(subject); 1246fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1247fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1248fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1249fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setHandle(BluetoothMapMessageListingElement e, Cursor c, 1250326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1251326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long handle = -1; 1252326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1253326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = c.getLong(fi.mSmsColId); 1254326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1255326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = c.getLong(fi.mMmsColId); 12565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 12575a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 12585a60e47497f21f64e6d79420dc4c56c1907df22akschulz handle = c.getLong(fi.mMessageColId); 1259326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1260326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setHandle: " + handle ); 1261326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setHandle(handle); 1262fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1263fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1264fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private BluetoothMapMessageListingElement element(Cursor c, FilterInfo fi, 1265326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 1266fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BluetoothMapMessageListingElement e = new BluetoothMapMessageListingElement(); 1267fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setHandle(e, c, fi, ap); 1268fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setDateTime(e, c, fi, ap); 12695a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setType(getType(c, fi), ((ap.getParameterMask() & MASK_TYPE) != 0) ? true : false); 1270fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setRead(e, c, fi, ap); 1271326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // we set number and name for sender/recipient later 1272326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // they require lookup on contacts so no need to 1273326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // do it for all elements unless they are to be used. 1274326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setCursorIndex(c.getPosition()); 1275fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return e; 1276fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1277fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 12785a60e47497f21f64e6d79420dc4c56c1907df22akschulz private BluetoothMapConvoListingElement createConvoElement(Cursor c, FilterInfo fi, 12795a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams ap) { 12805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement e = new BluetoothMapConvoListingElement(); 12815a60e47497f21f64e6d79420dc4c56c1907df22akschulz setLastActivity(e, c, fi, ap); 12825a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setType(getType(c, fi)); 12835a60e47497f21f64e6d79420dc4c56c1907df22akschulz// setConvoRead(e, c, fi, ap); 12845a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setCursorIndex(c.getPosition()); 12855a60e47497f21f64e6d79420dc4c56c1907df22akschulz return e; 12865a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 12875a60e47497f21f64e6d79420dc4c56c1907df22akschulz 12885a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* TODO: Change to use SmsMmsContacts.getContactNameFromPhone() with proper use of 12895a60e47497f21f64e6d79420dc4c56c1907df22akschulz * caching. */ 12905a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static String getContactNameFromPhone(String phone, ContentResolver resolver) { 1291326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = null; 1292cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Handle possible exception for empty phone address 1293cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (TextUtils.isEmpty(phone)) { 1294cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta return name; 1295cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1296fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 12975006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai Uri uri = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, 12985006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai Uri.encode(phone)); 1299fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1300fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] projection = {Contacts._ID, Contacts.DISPLAY_NAME}; 1301fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = Contacts.IN_VISIBLE_GROUP + "=1"; 1302fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orderBy = Contacts.DISPLAY_NAME + " ASC"; 13035a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = null; 130428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 13055a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = resolver.query(uri, projection, selection, null, orderBy); 13065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) { 13075a60e47497f21f64e6d79420dc4c56c1907df22akschulz int colIndex = c.getColumnIndex(Contacts.DISPLAY_NAME); 13085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.getCount() >= 1) { 13095a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.moveToFirst(); 13105a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = c.getString(colIndex); 13115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 131328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 13145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 1315fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1316fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return name; 1317fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1318cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta /** 1319cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * Get SMS RecipientAddresses for DRAFT folder based on threadId 1320cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * 1321cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta */ 1322cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta static public String getCanonicalAddressSms(ContentResolver r, int threadId) { 1323cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String [] RECIPIENT_ID_PROJECTION = { Threads.RECIPIENT_IDS }; 1324cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta /* 1325cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 1. Get Recipient Ids from Threads.CONTENT_URI 1326cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 2. Get Recipient Address for corresponding Id from canonical-addresses table. 1327cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta */ 1328cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 1329cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Uri sAllCanonical = Uri.parse("content://mms-sms/canonical-addresses"); 1330cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Uri sAllCanonical = 1331cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta MmsSms.CONTENT_URI.buildUpon().appendPath("canonical-addresses").build(); 1332cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Uri sAllThreadsUri = 1333cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build(); 1334cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Cursor cr = null; 1335cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String recipientAddress = ""; 1336cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String recipientIds = null; 1337cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String whereClause = "_id="+threadId; 1338cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "whereClause is "+ whereClause); 1339cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta try { 1340cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr = r.query(sAllThreadsUri, RECIPIENT_ID_PROJECTION, whereClause, null, null); 1341cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (cr != null && cr.moveToFirst()) { 1342cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipientIds = cr.getString(0); 1343cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "cursor.getCount(): " + cr.getCount() + "recipientIds: " 1344cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta + recipientIds + "selection: "+ whereClause ); 1345cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1346cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } finally { 1347cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(cr != null) { 1348cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr.close(); 1349cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr = null; 1350cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1351cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1352cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "recipientIds with spaces: "+ recipientIds +"\n"); 1353cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(recipientIds != null) { 1354cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String recipients[] = null; 1355cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta whereClause = ""; 1356cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipients = recipientIds.split(" "); 1357cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta for (String id: recipients) { 1358cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(whereClause.length() != 0) 1359cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta whereClause +=" OR "; 1360cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta whereClause +="_id="+id; 1361cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1362cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "whereClause is "+ whereClause); 1363cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta try { 1364cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr = r.query(sAllCanonical , null, whereClause, null, null); 1365cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (cr != null && cr.moveToFirst()) { 1366cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta do { 1367cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //TODO: Multiple Recipeints are appended with ";" for now. 1368cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(recipientAddress.length() != 0 ) 1369cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipientAddress+=";"; 1370cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipientAddress += cr.getString( 1371cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr.getColumnIndex(CanonicalAddressesColumns.ADDRESS)); 1372cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } while(cr.moveToNext()); 1373cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1374cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } finally { 1375cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(cr != null) 1376cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr.close(); 1377cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1378cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1379cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 1380cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(V) Log.v(TAG,"Final recipientAddress : "+ recipientAddress); 1381cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta return recipientAddress; 1382cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1383fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1384fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static public String getAddressMms(ContentResolver r, long id, int type) { 1385fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = new String("msg_id=" + id + " AND type=" + type); 1386326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/addr"); 1387fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 1388fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String addr = null; 13895a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] projection = {Mms.Addr.ADDRESS}; 13905a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = null; 139128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 13925a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = r.query(uriAddress, projection, selection, null, null); // TODO: Add projection 13935a60e47497f21f64e6d79420dc4c56c1907df22akschulz int colIndex = c.getColumnIndex(Mms.Addr.ADDRESS); 13945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 13955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c.moveToFirst()) { 13965a60e47497f21f64e6d79420dc4c56c1907df22akschulz addr = c.getString(colIndex); 13975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addr.equals(INSERT_ADDRES_TOKEN)) { 13985a60e47497f21f64e6d79420dc4c56c1907df22akschulz addr = ""; 13995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 14005a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 140128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 140228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 14035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1404fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1405fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return addr; 1406fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1407fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1408326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1409326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Matching functions for originator and recipient for MMS 1410326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return true if found a match 1411326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1412fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipientMms(Cursor c, FilterInfo fi, String recip) { 1413fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1414fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 1415fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = getAddressMms(mResolver, id, MMS_TO); 1416fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 1417fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(recip)) { 1418326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientMms: match recipient phone = " + phone); 1419fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1420fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 14215a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1422fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(recip)) { 1423326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientMms: match recipient name = " + name); 1424fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1425fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1426fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1427fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1428fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1429fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1430fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1431fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1432fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1433fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1434fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1435fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipientSms(Cursor c, FilterInfo fi, String recip) { 1436fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1437fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 1438fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 1439326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = fi.mPhoneNum; 1440326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = fi.mPhoneAlphaTag; 1441fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0 && phone.matches(recip)) { 1442326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient phone = " + phone); 1443fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1444fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (name != null && name.length() > 0 && name.matches(recip)) { 1445326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient name = " + name); 1446fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1447fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1448fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1449fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1450326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1451fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 1452fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 1453fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(recip)) { 1454326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient phone = " + phone); 1455fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1456fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 14575a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1458fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(recip)) { 1459326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient name = " + name); 1460fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1461fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1462fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1463fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1464fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1465fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1466fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1467fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1468fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1469fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1470fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1471fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1472fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipient(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 1473fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1474fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String recip = ap.getFilterRecipient(); 1475fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (recip != null && recip.length() > 0) { 1476fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie recip = recip.replace("*", ".*"); 1477fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie recip = ".*" + recip + ".*"; 1478326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1479fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchRecipientSms(c, fi, recip); 1480326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1481fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchRecipientMms(c, fi, recip); 1482fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1483326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "matchRecipient: Unknown msg type: " + fi.mMsgType); 1484fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1485fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1486fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1487fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1488fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1489fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1490fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1491fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1492fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginatorMms(Cursor c, FilterInfo fi, String orig) { 1493fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1494fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 1495fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = getAddressMms(mResolver, id, MMS_FROM); 1496fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 1497fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(orig)) { 1498326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorMms: match originator phone = " + phone); 1499fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1500fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 15015a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1502fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(orig)) { 1503326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorMms: match originator name = " + name); 1504fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1505fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1506fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1507fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1508fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1509fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1510fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1511fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1512fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1513fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1514fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1515fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginatorSms(Cursor c, FilterInfo fi, String orig) { 1516fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1517fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 1518fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 1519fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 1520fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone !=null && phone.length() > 0) { 1521fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(orig)) { 1522326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator phone = " + phone); 1523fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1524fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 15255a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1526fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(orig)) { 1527326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator name = " + name); 1528fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1529fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1530fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1531fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1532fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1533fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1534fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1535fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1536326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1537326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = fi.mPhoneNum; 1538326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = fi.mPhoneAlphaTag; 1539fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0 && phone.matches(orig)) { 1540326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator phone = " + phone); 1541fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1542fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (name != null && name.length() > 0 && name.matches(orig)) { 1543326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator name = " + name); 1544fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1545fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1546fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1547fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1548fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1549fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1550fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1551fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1552fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginator(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 1553fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1554fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 1555fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 1556fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie orig = orig.replace("*", ".*"); 1557fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie orig = ".*" + orig + ".*"; 1558326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1559fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchOriginatorSms(c, fi, orig); 1560326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1561fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchOriginatorMms(c, fi, orig); 1562fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1563326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "matchOriginator: Unknown msg type: " + fi.mMsgType); 1564fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1565fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1566fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1567fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1568fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1569fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1570fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1571fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1572fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchAddresses(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 1573fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (matchOriginator(c, fi, ap) && matchRecipient(c, fi, ap)) { 1574fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1575fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1576fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1577fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1578fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1579fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1580326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* 1581326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Where filter functions 1582326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * */ 1583fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterFolderTypeSms(String folder) { 1584fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1585326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (BluetoothMapContract.FOLDER_NAME_INBOX.equalsIgnoreCase(folder)) { 1586326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 1 AND " + Sms.THREAD_ID + " <> -1"; 1587326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_OUTBOX.equalsIgnoreCase(folder)) { 1588326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = "(" + Sms.TYPE + " = 4 OR " + Sms.TYPE + " = 5 OR " 1589326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + Sms.TYPE + " = 6) AND " + Sms.THREAD_ID + " <> -1"; 1590326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_SENT.equalsIgnoreCase(folder)) { 1591326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 2 AND " + Sms.THREAD_ID + " <> -1"; 1592326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DRAFT.equalsIgnoreCase(folder)) { 1593326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 3 AND " + Sms.THREAD_ID + " <> -1"; 1594326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DELETED.equalsIgnoreCase(folder)) { 1595326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.THREAD_ID + " = -1"; 1596fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1597fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1598fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1599fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1600fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1601fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterFolderTypeMms(String folder) { 1602fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1603326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (BluetoothMapContract.FOLDER_NAME_INBOX.equalsIgnoreCase(folder)) { 1604326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 1 AND " + Mms.THREAD_ID + " <> -1"; 1605326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_OUTBOX.equalsIgnoreCase(folder)) { 1606326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 4 AND " + Mms.THREAD_ID + " <> -1"; 1607326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_SENT.equalsIgnoreCase(folder)) { 1608326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 2 AND " + Mms.THREAD_ID + " <> -1"; 1609326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DRAFT.equalsIgnoreCase(folder)) { 1610326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 3 AND " + Mms.THREAD_ID + " <> -1"; 1611326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DELETED.equalsIgnoreCase(folder)) { 1612326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.THREAD_ID + " = -1"; 1613fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1614fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1615fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1616fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1617fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1618326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterFolderTypeEmail(long folderId) { 1619fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1620326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (folderId >= 0) { 1621326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + folderId; 1622326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1623326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.e(TAG, "setWhereFilterFolderTypeEmail: not valid!" ); 1624326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("Invalid folder ID"); 1625fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1626326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return where; 1627326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1628fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 16295a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterFolderTypeIm(long folderId) { 1630326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = ""; 16315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId > BluetoothMapContract.FOLDER_ID_OTHER) { 16325a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + folderId; 16335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 16345a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.e(TAG, "setWhereFilterFolderTypeIm: not valid!" ); 16355a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("Invalid folder ID"); 16365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 16375a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 16385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 16395a60e47497f21f64e6d79420dc4c56c1907df22akschulz 16405a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterFolderType(BluetoothMapFolderElement folderElement, 16415a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi) { 16425a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = ""; 16435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(folderElement.shouldIgnore()) { 16445a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = "1=1"; 16455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 16465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 16475a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeSms(folderElement.getName()); 16485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 16495a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeMms(folderElement.getName()); 16505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 16515a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeEmail(folderElement.getFolderId()); 16525a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 16535a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeIm(folderElement.getFolderId()); 16545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1655326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1656fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1657fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1658fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1659326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterReadStatus(BluetoothMapAppParams ap, FilterInfo fi) { 1660fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1661fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (ap.getFilterReadStatus() != -1) { 1662326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1663326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 1664326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Sms.READ + "= 0"; 1665326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1666fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1667326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 1668326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Sms.READ + "= 1"; 1669326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1670326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1671326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 1672326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.READ + "= 0"; 1673326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1674326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1675326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 1676326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.READ + "= 1"; 1677326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 16785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 16795a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 1680326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 1681326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "= 0"; 1682326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1683326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 1684326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "= 1"; 1685326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1686fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1687fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1688fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1689fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1690fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1691fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterPeriod(BluetoothMapAppParams ap, FilterInfo fi) { 1692fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 16935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1694fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getFilterPeriodBegin() != -1)) { 1695326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 16965a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms.DATE + " >= " + ap.getFilterPeriodBegin(); 1697326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1698326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.DATE + " >= " + (ap.getFilterPeriodBegin() / 1000L); 16995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 17005a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 17015a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.DATE + 17025a60e47497f21f64e6d79420dc4c56c1907df22akschulz " >= " + (ap.getFilterPeriodBegin()); 1703fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1704fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1705fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1706fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getFilterPeriodEnd() != -1)) { 1707326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 17085a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + Sms.DATE + " < " + ap.getFilterPeriodEnd(); 1709326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1710326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Mms.DATE + " < " + (ap.getFilterPeriodEnd() / 1000L); 17115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 17125a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 17135a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.DATE + 17145a60e47497f21f64e6d79420dc4c56c1907df22akschulz " < " + (ap.getFilterPeriodEnd()); 17155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17175a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 17185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17195a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterLastActivity(BluetoothMapAppParams ap, FilterInfo fi) { 17205a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = ""; 17215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityBegin() != -1)) { 17225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 17235a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms.DATE + " >= " + ap.getFilterLastActivityBegin(); 17245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 17255a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Mms.DATE + " >= " + (ap.getFilterLastActivityBegin() / 1000L); 17265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 17275a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM ) { 17285a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY + 17295a60e47497f21f64e6d79420dc4c56c1907df22akschulz " >= " + (ap.getFilterPeriodBegin()); 17305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityEnd() != -1)) { 17335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 17345a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + Sms.DATE + " < " + ap.getFilterLastActivityEnd(); 17355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 17365a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + Mms.DATE + " < " + (ap.getFilterPeriodEnd() / 1000L); 17375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL||fi.mMsgType == FilterInfo.TYPE_IM) { 17385a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY 17395a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " < " + (ap.getFilterLastActivityEnd()); 1740fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1741fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1742fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1743fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1744fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1745326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1746326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterOriginatorEmail(BluetoothMapAppParams ap) { 1747fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1748fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 1749fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1750326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1751fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 1752326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde orig = orig.replace("*", "%"); 17535a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.FROM_LIST 17545a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " LIKE '%" + orig + "%'"; 1755fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1756fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1757fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1758fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 17595a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterOriginatorIM(BluetoothMapAppParams ap) { 1760fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1761fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 1762fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1763326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1764fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 1765326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde orig = orig.replace("*", "%"); 17665a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.FROM_LIST 17675a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " LIKE '%" + orig + "%'"; 1768fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1769fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1770fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 17715a60e47497f21f64e6d79420dc4c56c1907df22akschulz 177214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz private String setWhereFilterPriority(BluetoothMapAppParams ap, FilterInfo fi) { 177314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz String where = ""; 177414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz int pri = ap.getFilterPriority(); 177514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz /*only MMS have priority info */ 1776326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(fi.mMsgType == FilterInfo.TYPE_MMS) 177714f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz { 177814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz if(pri == 0x0002) 177914f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz { 178014f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz where += " AND " + Mms.PRIORITY + "<=" + 178114f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz Integer.toString(PduHeaders.PRIORITY_NORMAL); 178214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz }else if(pri == 0x0001) { 178314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz where += " AND " + Mms.PRIORITY + "=" + 178414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz Integer.toString(PduHeaders.PRIORITY_HIGH); 178514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 178614f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 17875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(fi.mMsgType == FilterInfo.TYPE_EMAIL || 17885a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) 17895a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 17905a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(pri == 0x0002) 17915a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 17925a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY + "!=1"; 17935a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else if(pri == 0x0001) { 17945a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY + "=1"; 17955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17965a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17975a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: no priority filtering in IM 179814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz return where; 179914f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 1800fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1801326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterRecipientEmail(BluetoothMapAppParams ap) { 1802fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1803fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String recip = ap.getFilterRecipient(); 1804fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1805326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1806fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (recip != null && recip.length() > 0) { 1807326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde recip = recip.replace("*", "%"); 1808326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND (" 1809326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.TO_LIST + " LIKE '%" + recip + "%' OR " 1810326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.CC_LIST + " LIKE '%" + recip + "%' OR " 1811326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.BCC_LIST + " LIKE '%" + recip + "%' )"; 1812fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1813fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1814fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1815fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 18165a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterMessageHandle(BluetoothMapAppParams ap, FilterInfo fi) { 1817fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 18185a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = -1; 18195a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgHandle = ap.getFilterMsgHandleString(); 18205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msgHandle != null) { 18215a60e47497f21f64e6d79420dc4c56c1907df22akschulz id = BluetoothMapUtils.getCpHandle(msgHandle); 18225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG,"id: " + id); 18235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(id != -1) { 18255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 18265a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms._ID + " = " + id; 18275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 18285a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Mms._ID + " = " + id; 18295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 18305a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 18315a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns._ID + " = " + id; 1832326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1833326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 18345a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 18355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18375a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterThreadId(BluetoothMapAppParams ap, FilterInfo fi) { 18385a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = ""; 18395a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = -1; 18405a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgHandle = ap.getFilterConvoIdString(); 18415a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msgHandle != null) { 18425a60e47497f21f64e6d79420dc4c56c1907df22akschulz id = BluetoothMapUtils.getMsgHandleAsLong(msgHandle); 18435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG,"id: " + id); 18445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(id > 0) { 18465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 18475a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms.THREAD_ID + " = " + id; 18485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 18495a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Mms.THREAD_ID + " = " + id; 18505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 18515a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 18525a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.THREAD_ID + " = " + id; 18535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18555a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18565a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 18575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18585a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1859326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilter(BluetoothMapFolderElement folderElement, 1860326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1861fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1862326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterFolderType(folderElement, fi); 18635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18645a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgHandleWhere = setWhereFilterMessageHandle(ap, fi); 18655a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* if message handle filter is available, the other filters should be ignored */ 18665a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msgHandleWhere.isEmpty()) { 1867326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterReadStatus(ap, fi); 1868326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterPriority(ap,fi); 18695a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterPeriod(ap, fi); 1870326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 1871326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterOriginatorEmail(ap); 1872326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterRecipientEmail(ap); 1873326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 18745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_IM) { 18755a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterOriginatorIM(ap); 18765a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: set 'where' filer recipient? 18775a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18785a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterThreadId(ap, fi); 18795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 18805a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += msgHandleWhere; 1881326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1882fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1883fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1884fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1885fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 18865a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18875a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Used only for SMS/MMS */ 18885a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setConvoWhereFilterSmsMms(StringBuilder selection, ArrayList<String> selectionArgs, 18895a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 18905a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsSelected(fi, ap) || mmsSelected(ap)) { 18925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18935a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Filter Read Status 18945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterReadStatus() != BluetoothMapAppParams.INVALID_VALUE_PARAMETER) { 18955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterReadStatus() & FILTER_READ_STATUS_UNREAD_ONLY) != 0) { 18965a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.READ).append(" = 0"); 18975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterReadStatus() & FILTER_READ_STATUS_READ_ONLY) != 0) { 18995a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.READ).append(" = 1"); 19005a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19025a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19035a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Filter time 19045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityBegin() != BluetoothMapAppParams.INVALID_VALUE_PARAMETER)){ 19055a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.DATE).append(" >= ") 19065a60e47497f21f64e6d79420dc4c56c1907df22akschulz .append(ap.getFilterLastActivityBegin()); 19075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityEnd() != BluetoothMapAppParams.INVALID_VALUE_PARAMETER)) { 19095a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.DATE).append(" <= ") 19105a60e47497f21f64e6d79420dc4c56c1907df22akschulz .append(ap.getFilterLastActivityEnd()); 19115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19125a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19135a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Filter ConvoId 19145a60e47497f21f64e6d79420dc4c56c1907df22akschulz long convoId = -1; 19155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterConvoId() != null) { 19165a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoId = ap.getFilterConvoId().getLeastSignificantBits(); 19175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoId > 0) { 19195a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads._ID).append(" = ") 19205a60e47497f21f64e6d79420dc4c56c1907df22akschulz .append(Long.toString(convoId)); 19215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19245a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19265a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1927326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1928326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if sms should be included. 1929326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1930326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1931326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 1932326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return boolean true if sms is selected, false if not 1933326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1934fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean smsSelected(FilterInfo fi, BluetoothMapAppParams ap) { 1935fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = ap.getFilterMessageType(); 1936326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int phoneType = fi.mPhoneType; 1937326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1938326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "smsSelected msgType: " + msgType); 1939fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 1941fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1942326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 19435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & (BluetoothMapAppParams.FILTER_NO_SMS_CDMA 19445a60e47497f21f64e6d79420dc4c56c1907df22akschulz |BluetoothMapAppParams.FILTER_NO_SMS_GSM)) == 0) 1945fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1946fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (((msgType & BluetoothMapAppParams.FILTER_NO_SMS_GSM) == 0) 19485a60e47497f21f64e6d79420dc4c56c1907df22akschulz && (phoneType == TelephonyManager.PHONE_TYPE_GSM)) 1949fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1950fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (((msgType & BluetoothMapAppParams.FILTER_NO_SMS_CDMA) == 0) 19525a60e47497f21f64e6d79420dc4c56c1907df22akschulz && (phoneType == TelephonyManager.PHONE_TYPE_CDMA)) 1953fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1954fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1955fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1956fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1957fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1958326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1959326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if mms should be included. 1960326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1961326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1962326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 19635a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return boolean true if mms is selected, false if not 1964326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 19655a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean mmsSelected(BluetoothMapAppParams ap) { 1966fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = ap.getFilterMessageType(); 1967fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1968326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "mmsSelected msgType: " + msgType); 1969326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 19705a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 1971fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1972fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & BluetoothMapAppParams.FILTER_NO_MMS) == 0) 1974fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1975fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1976fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1977fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1978fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1979326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1980326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if email should be included. 1981326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1982326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1983326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 19845a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return boolean true if email is selected, false if not 1985326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 19865a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean emailSelected(BluetoothMapAppParams ap) { 1987326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = ap.getFilterMessageType(); 1988326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1989326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "emailSelected msgType: " + msgType); 1990326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 19915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 19925a60e47497f21f64e6d79420dc4c56c1907df22akschulz return true; 19935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & BluetoothMapAppParams.FILTER_NO_EMAIL) == 0) 19955a60e47497f21f64e6d79420dc4c56c1907df22akschulz return true; 19965a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19975a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 19985a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20005a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 20015a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Determine from application parameter if IM should be included. 20025a60e47497f21f64e6d79420dc4c56c1907df22akschulz * The filter mask is set for message types not selected 20035a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param fi 20045a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap 20055a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return boolean true if im is selected, false if not 20065a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 20075a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean imSelected(BluetoothMapAppParams ap) { 20085a60e47497f21f64e6d79420dc4c56c1907df22akschulz int msgType = ap.getFilterMessageType(); 20095a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "imSelected msgType: " + msgType); 20115a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 2013326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 2014326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 20155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & BluetoothMapAppParams.FILTER_NO_IM) == 0) 2016326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 2017326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2018326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return false; 2019326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2020326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2021fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setFilterInfo(FilterInfo fi) { 20227769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde TelephonyManager tm = 20235a60e47497f21f64e6d79420dc4c56c1907df22akschulz (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 2024fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (tm != null) { 2025326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneType = tm.getPhoneType(); 2026326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneNum = tm.getLine1Number(); 2027326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneAlphaTag = tm.getLine1AlphaTag(); 2028326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "phone type = " + fi.mPhoneType + 2029326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " phone num = " + fi.mPhoneNum + 2030326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " phone alpha tag = " + fi.mPhoneAlphaTag); 2031fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2032fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2033fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2034326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 2035326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Get a listing of message in folder after applying filter. 2036326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param folder Must contain a valid folder string != null 2037326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap Parameters specifying message content and filters 2038326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return Listing object containing requested messages 2039326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 2040326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public BluetoothMapMessageListing msgListing(BluetoothMapFolderElement folderElement, 2041326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 20425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgListing: messageType = " + ap.getFilterMessageType() ); 2043326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 20445a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMessageListing bmList = new BluetoothMapMessageListing(); 2045fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 20460053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz /* We overwrite the parameter mask here if it is 0 or not present, as this 20470053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz * should cause all parameters to be included in the message list. */ 20480053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz if(ap.getParameterMask() == BluetoothMapAppParams.INVALID_VALUE_PARAMETER || 20490053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz ap.getParameterMask() == 0) { 20505a60e47497f21f64e6d79420dc4c56c1907df22akschulz ap.setParameterMask(PARAMETER_MASK_DEFAULT); 2051326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "msgListing(): appParameterMask is zero or not present, " + 20525a60e47497f21f64e6d79420dc4c56c1907df22akschulz "changing to default: " + ap.getParameterMask()); 20530053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz } 20545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG, "folderElement hasSmsMmsContent = " + folderElement.hasSmsMmsContent() + 20555a60e47497f21f64e6d79420dc4c56c1907df22akschulz " folderElement.hasEmailContent = " + folderElement.hasEmailContent() + 20565a60e47497f21f64e6d79420dc4c56c1907df22akschulz " folderElement.hasImContent = " + folderElement.hasImContent()); 20570053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz 2058fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Cache some info used throughout filtering */ 2059fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi = new FilterInfo(); 2060fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setFilterInfo(fi); 2061326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor smsCursor = null; 2062326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor mmsCursor = null; 2063326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor emailCursor = null; 20645a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor imCursor = null; 20655a60e47497f21f64e6d79420dc4c56c1907df22akschulz String limit = ""; 20665a60e47497f21f64e6d79420dc4c56c1907df22akschulz int countNum = ap.getMaxListCount(); 20675a60e47497f21f64e6d79420dc4c56c1907df22akschulz int offsetNum = ap.getStartOffset(); 20685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getMaxListCount()>0){ 20695a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit=" LIMIT "+ (ap.getMaxListCount()+ap.getStartOffset()); 20705a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20715a60e47497f21f64e6d79420dc4c56c1907df22akschulz try{ 207228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 207328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 207428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_MMS| 20755a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 20765a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)|| 207728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 207828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_MMS| 20795a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 20805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)){ 20815a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 20825a60e47497f21f64e6d79420dc4c56c1907df22akschulz // (only if offset/limit is used) 208328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 208428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "SMS Limit => "+limit); 208528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 208628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 208728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_SMS; 208828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterPriority() != 1){ /*SMS cannot have high priority*/ 208928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String where = setWhereFilter(folderElement, fi, ap); 20905a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 20915a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsCursor = mResolver.query(Sms.CONTENT_URI, 20925a60e47497f21f64e6d79420dc4c56c1907df22akschulz SMS_PROJECTION, where, null, Sms.DATE + " DESC" + limit); 20935a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsCursor != null) { 20945a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMessageListingElement e = null; 20955a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we dont have to look them up anymore (optimization) 20965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + smsCursor.getCount() + " sms messages."); 20975a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setSmsColumns(smsCursor); 20985a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (smsCursor.moveToNext()) { 20995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (matchAddresses(smsCursor, fi, ap)) { 21005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) BluetoothMapUtils.printCursor(smsCursor); 21015a60e47497f21f64e6d79420dc4c56c1907df22akschulz e = element(smsCursor, fi, ap); 21025a60e47497f21f64e6d79420dc4c56c1907df22akschulz bmList.add(e); 210328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 210428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 210528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 210628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 210728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 210828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 21095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mmsSelected(ap) && folderElement.hasSmsMmsContent()) { 211028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 211128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 21125a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 21135a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)){ 21145a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 21155a60e47497f21f64e6d79420dc4c56c1907df22akschulz //(only if offset/limit is used) 211628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 211728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "MMS Limit => "+limit); 211828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 211928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 212028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_MMS; 2121326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 2122326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(!where.isEmpty()) { 21235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 212428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz mmsCursor = mResolver.query(Mms.CONTENT_URI, 212528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz MMS_PROJECTION, where, null, Mms.DATE + " DESC" + limit); 212628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (mmsCursor != null) { 2127326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapMessageListingElement e = null; 2128326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // store column index so we dont have to look them up anymore (optimization) 212928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.setMmsColumns(mmsCursor); 213028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Found " + mmsCursor.getCount() + " mms messages."); 213128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (mmsCursor.moveToNext()) { 213228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (matchAddresses(mmsCursor, fi, ap)) { 21335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) BluetoothMapUtils.printCursor(mmsCursor); 213428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz e = element(mmsCursor, fi, ap); 2135326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde bmList.add(e); 2136326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2137326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2138326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2139326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2140326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 214114f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz 21425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) && folderElement.hasEmailContent()) { 214328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_MMS| 214428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 21455a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 21465a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)){ 21475a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 21485a60e47497f21f64e6d79420dc4c56c1907df22akschulz //(only if offset/limit is used) 214928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 215028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Email Limit => "+limit); 215128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 215228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 215328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 215428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String where = setWhereFilter(folderElement, fi, ap); 215528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 215628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(!where.isEmpty()) { 21575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 21585a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 21595a60e47497f21f64e6d79420dc4c56c1907df22akschulz emailCursor = mResolver.query(contentUri, 21605a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_MESSAGE_PROJECTION, where, null, 21615a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DATE + " DESC" + limit); 216228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (emailCursor != null) { 216328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapMessageListingElement e = null; 216428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // store column index so we dont have to look them up anymore (optimization) 21655a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setEmailMessageColumns(emailCursor); 216628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int cnt = 0; 21675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + emailCursor.getCount() + " email messages."); 216828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (emailCursor.moveToNext()) { 21695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) BluetoothMapUtils.printCursor(emailCursor); 217028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz e = element(emailCursor, fi, ap); 217114f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz bmList.add(e); 217214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 217328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // emailCursor.close(); 2174fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2175fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2176fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2177fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 21785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imSelected(ap) && folderElement.hasImContent()) { 21795a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_MMS| 21805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 21815a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 21825a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_EMAIL)){ 21835a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 21845a60e47497f21f64e6d79420dc4c56c1907df22akschulz //(only if offset/limit is used) 21855a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit = " LIMIT " + ap.getMaxListCount() + " OFFSET "+ ap.getStartOffset(); 21865a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "IM Limit => "+limit); 21875a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = 0; 21885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 21895a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 21905a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = setWhereFilter(folderElement, fi, ap); 21915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 21925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 21935a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 21945a60e47497f21f64e6d79420dc4c56c1907df22akschulz imCursor = mResolver.query(contentUri, 21955a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_INSTANT_MESSAGE_PROJECTION, 21965a60e47497f21f64e6d79420dc4c56c1907df22akschulz where, null, BluetoothMapContract.MessageColumns.DATE + " DESC" + limit); 21975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imCursor != null) { 21985a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMessageListingElement e = null; 21995a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we dont have to look them up anymore (optimization) 22005a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setImMessageColumns(imCursor); 22015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "Found " + imCursor.getCount() + " im messages."); 22025a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (imCursor.moveToNext()) { 22035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) BluetoothMapUtils.printCursor(imCursor); 22045a60e47497f21f64e6d79420dc4c56c1907df22akschulz e = element(imCursor, fi, ap); 22055a60e47497f21f64e6d79420dc4c56c1907df22akschulz bmList.add(e); 22065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22095a60e47497f21f64e6d79420dc4c56c1907df22akschulz 221028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Enable this if post sorting and segmenting needed */ 221128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz bmList.sort(); 221228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz bmList.segment(ap.getMaxListCount(), offsetNum); 221328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz List<BluetoothMapMessageListingElement> list = bmList.getList(); 221428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int listSize = list.size(); 221528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor tmpCursor = null; 22165a60e47497f21f64e6d79420dc4c56c1907df22akschulz for(int x=0;x<listSize;x++){ 221728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapMessageListingElement ele = list.get(x); 22182e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta /* If OBEX "GET" request header includes "ParameterMask" with 'Type' NOT set, 22192e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta * then ele.getType() returns "null" even for a valid cursor. 22202e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta * Avoid NullPointerException in equals() check when 'mType' value is "null" */ 22212e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta TYPE tmpType = ele.getType(); 22222e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (smsCursor!= null && 22232e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta ((TYPE.SMS_GSM).equals(tmpType) || (TYPE.SMS_CDMA).equals(tmpType))) { 222428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = smsCursor; 222528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_SMS; 22262e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else if(mmsCursor != null && (TYPE.MMS).equals(tmpType)) { 222728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = mmsCursor; 222828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_MMS; 22292e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else if(emailCursor != null && ((TYPE.EMAIL).equals(tmpType))) { 223028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = emailCursor; 223128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 22322e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else if(imCursor != null && ((TYPE.IM).equals(tmpType))) { 22335a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = imCursor; 22345a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 223528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 22365a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(tmpCursor != null){ 22375a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor.moveToPosition(ele.getCursorIndex()); 223828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSenderAddressing(ele, tmpCursor, fi, ap); 223928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSenderName(ele, tmpCursor, fi, ap); 224028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setRecipientAddressing(ele, tmpCursor, fi, ap); 224128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setRecipientName(ele, tmpCursor, fi, ap); 224228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSubject(ele, tmpCursor, fi, ap); 224328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSize(ele, tmpCursor, fi, ap); 224428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setText(ele, tmpCursor, fi, ap); 224528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setPriority(ele, tmpCursor, fi, ap); 224628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSent(ele, tmpCursor, fi, ap); 224728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setProtected(ele, tmpCursor, fi, ap); 22485a60e47497f21f64e6d79420dc4c56c1907df22akschulz setReceptionStatus(ele, tmpCursor, fi, ap); 22495a60e47497f21f64e6d79420dc4c56c1907df22akschulz setAttachment(ele, tmpCursor, fi, ap); 22505a60e47497f21f64e6d79420dc4c56c1907df22akschulz 22515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mMsgListingVersion > BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V10 ){ 22525a60e47497f21f64e6d79420dc4c56c1907df22akschulz setDeliveryStatus(ele, tmpCursor, fi, ap); 22535a60e47497f21f64e6d79420dc4c56c1907df22akschulz setThreadId(ele, tmpCursor, fi, ap); 22545a60e47497f21f64e6d79420dc4c56c1907df22akschulz setThreadName(ele, tmpCursor, fi, ap); 22555a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFolderType(ele, tmpCursor, fi, ap); 22565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2257fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2258fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 225928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 22605a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(emailCursor != null)emailCursor.close(); 22615a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(smsCursor != null)smsCursor.close(); 22625a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mmsCursor != null)mmsCursor.close(); 22635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(imCursor != null)imCursor.close(); 2264fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2265fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 22665a60e47497f21f64e6d79420dc4c56c1907df22akschulz 22675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "messagelisting end"); 2268fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return bmList; 2269fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2270fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2271326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 2272326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Get the size of the message listing 2273326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param folder Must contain a valid folder string != null 2274326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap Parameters specifying message content and filters 2275326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return Integer equal to message listing size 2276326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 2277326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int msgListingSize(BluetoothMapFolderElement folderElement, 2278326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 2279326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgListingSize: folder = " + folderElement.getName()); 2280fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int cnt = 0; 2281fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2282fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Cache some info used throughout filtering */ 2283fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi = new FilterInfo(); 2284fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setFilterInfo(fi); 2285fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 228628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 2287326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_SMS; 2288326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 2289fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Sms.CONTENT_URI, 2290326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SMS_PROJECTION, where, null, Sms.DATE + " DESC"); 22915a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 22925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 22935a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt = c.getCount(); 22945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 22965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 22975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2298fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 229970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 23005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mmsSelected(ap) && folderElement.hasSmsMmsContent()) { 2301326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_MMS; 2302326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 230370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Mms.CONTENT_URI, 2304326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde MMS_PROJECTION, where, null, Mms.DATE + " DESC"); 23055a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23075a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 23085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 231270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 231370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 23145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) && folderElement.hasEmailContent()) { 2315326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_EMAIL; 2316326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 23175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!where.isEmpty()) { 23185a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 2319326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, 2320326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 23215a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23235a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 23245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23265a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 23315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imSelected(ap) && folderElement.hasImContent()) { 23325a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 23335a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = setWhereFilter(folderElement, fi, ap); 23345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!where.isEmpty()) { 23355a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 23365a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, 23375a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_INSTANT_MESSAGE_PROJECTION, 23385a60e47497f21f64e6d79420dc4c56c1907df22akschulz where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 23395a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23415a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 23425a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2346326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2347326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2348326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 234970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if (D) Log.d(TAG, "msgListingSize: size = " + cnt); 2350fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return cnt; 2351fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2352326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 235370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 235470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * Return true if there are unread messages in the requested list of messages 235570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param folder folder where the message listing should come from 235670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param ap application parameter object 235770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return true if unread messages are in the list, else false 235870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 2359326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public boolean msgListingHasUnread(BluetoothMapFolderElement folderElement, 2360326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 2361326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgListingHasUnread: folder = " + folderElement.getName()); 236270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz int cnt = 0; 236370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 236470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /* Cache some info used throughout filtering */ 236570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz FilterInfo fi = new FilterInfo(); 236670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz setFilterInfo(fi); 236770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 2368326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 2369326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_SMS; 2370326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 2371326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Sms.READ + "=0 "; 237270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz where += setWhereFilterPeriod(ap, fi); 237370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Sms.CONTENT_URI, 2374326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SMS_PROJECTION, where, null, Sms.DATE + " DESC"); 23755a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23775a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt = c.getCount(); 23785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23815a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 238270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 238370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 23845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mmsSelected(ap) && folderElement.hasSmsMmsContent()) { 2385326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_MMS; 2386326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 2387326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Mms.READ + "=0 "; 238870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz where += setWhereFilterPeriod(ap, fi); 238970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Mms.CONTENT_URI, 2390326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde MMS_PROJECTION, where, null, Sms.DATE + " DESC"); 23915a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23935a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 23945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 239870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 239970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 2400326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 24015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) && folderElement.getFolderId() != -1) { 2402326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_EMAIL; 2403326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 2404326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(!where.isEmpty()) { 2405326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "=0 "; 2406326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterPeriod(ap, fi); 24075a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 2408326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, 2409326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 24105a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 24115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 24125a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 24135a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 24155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 24165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24195a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imSelected(ap) && folderElement.hasImContent()) { 24215a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 24225a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = setWhereFilter(folderElement, fi, ap); 24235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!where.isEmpty()) { 24245a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "=0 "; 24255a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterPeriod(ap, fi); 24265a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 24275a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, 24285a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_INSTANT_MESSAGE_PROJECTION, 24295a60e47497f21f64e6d79420dc4c56c1907df22akschulz where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 24305a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 24315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 24325a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 24335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24345a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 24355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 24365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2437326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2438326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2439326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 244070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if (D) Log.d(TAG, "msgListingHasUnread: numUnread = " + cnt); 244170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return (cnt>0)?true:false; 244270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 2443fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2444fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /** 24455a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Build the conversation listing. 24465a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap The Application Parameters 24475a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param sizeOnly TRUE: don't populate the list members, only build the list to get the size. 24485a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 24495a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 24505a60e47497f21f64e6d79420dc4c56c1907df22akschulz public BluetoothMapConvoListing convoListing(BluetoothMapAppParams ap, boolean sizeOnly) { 24515a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "convoListing: " + " messageType = " + ap.getFilterMessageType() ); 24535a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListing convoList = new BluetoothMapConvoListing(); 24545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24555a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We overwrite the parameter mask here if it is 0 or not present, as this 24565a60e47497f21f64e6d79420dc4c56c1907df22akschulz * should cause all parameters to be included in the message list. */ 24575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getConvoParameterMask() == BluetoothMapAppParams.INVALID_VALUE_PARAMETER || 24585a60e47497f21f64e6d79420dc4c56c1907df22akschulz ap.getConvoParameterMask() == 0) { 24595a60e47497f21f64e6d79420dc4c56c1907df22akschulz ap.setConvoParameterMask(CONVO_PARAMETER_MASK_DEFAULT); 24605a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.v(TAG, "convoListing(): appParameterMask is zero or not present, " + 24615a60e47497f21f64e6d79420dc4c56c1907df22akschulz "changing to default: " + ap.getConvoParameterMask()); 24625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24645a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Possible filters: 24655a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Recipient name (contacts DB) or id (for SMS/MMS this is the thread-id contact-id) 24665a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Activity start/begin 24675a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Read status 24685a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Thread_id 24695a60e47497f21f64e6d79420dc4c56c1907df22akschulz * The strategy for SMS/MMS 24705a60e47497f21f64e6d79420dc4c56c1907df22akschulz * With no filter on name - use limit and offset. 24715a60e47497f21f64e6d79420dc4c56c1907df22akschulz * With a filter on name - build the complete list of conversations and create a filter 24725a60e47497f21f64e6d79420dc4c56c1907df22akschulz * mechanism 24735a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 24745a60e47497f21f64e6d79420dc4c56c1907df22akschulz * The strategy for IM: 24755a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Join the conversation table with the contacts table in a way that makes it possible to 24765a60e47497f21f64e6d79420dc4c56c1907df22akschulz * get the data needed in a single query. 24775a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Manually handle limit/offset 24785a60e47497f21f64e6d79420dc4c56c1907df22akschulz * */ 24795a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24805a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Cache some info used throughout filtering */ 24815a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi = new FilterInfo(); 24825a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFilterInfo(fi); 24835a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor smsMmsCursor = null; 24845a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor imEmailCursor = null; 24855a60e47497f21f64e6d79420dc4c56c1907df22akschulz int offsetNum; 24865a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly) { 24875a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = 0; 24885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 24895a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = ap.getStartOffset(); 24905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24915a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Inverse meaning - hence a 1 is include. 24925a60e47497f21f64e6d79420dc4c56c1907df22akschulz int msgTypesInclude = ((~ap.getFilterMessageType()) 24935a60e47497f21f64e6d79420dc4c56c1907df22akschulz & BluetoothMapAppParams.FILTER_MSG_TYPE_MASK); 24945a60e47497f21f64e6d79420dc4c56c1907df22akschulz int maxThreads = ap.getMaxListCount()+ap.getStartOffset(); 24955a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24965a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24975a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 24985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsSelected(fi, ap) || mmsSelected(ap)) { 24995a60e47497f21f64e6d79420dc4c56c1907df22akschulz String limit = ""; 25005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((sizeOnly == false) && (ap.getMaxListCount()>0) && 25015a60e47497f21f64e6d79420dc4c56c1907df22akschulz (ap.getFilterRecipient()==null)){ 25025a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We can only use limit if we do not have a contacts filter */ 25035a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit=" LIMIT " + maxThreads; 25045a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25055a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder sortOrder = new StringBuilder(Threads.DATE + " DESC"); 25065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((sizeOnly == false) && 25075a60e47497f21f64e6d79420dc4c56c1907df22akschulz ((msgTypesInclude & ~(BluetoothMapAppParams.FILTER_NO_SMS_GSM | 25085a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA) | 25095a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_MMS) == 0) 25105a60e47497f21f64e6d79420dc4c56c1907df22akschulz && ap.getFilterRecipient() == null){ 25115a60e47497f21f64e6d79420dc4c56c1907df22akschulz // SMS/MMS messages only and no recipient filter - use optimization. 25125a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 25135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "SMS Limit => "+limit); 25145a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = 0; 25155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25165a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder selection = new StringBuilder(120); // This covers most cases 25175a60e47497f21f64e6d79420dc4c56c1907df22akschulz ArrayList<String> selectionArgs = new ArrayList<String>(12); // Covers all cases 25185a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append("1=1 "); // just to simplify building the where-clause 25195a60e47497f21f64e6d79420dc4c56c1907df22akschulz setConvoWhereFilterSmsMms(selection, selectionArgs, fi, ap); 25205a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] args = null; 25215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(selectionArgs.size() > 0) { 25225a60e47497f21f64e6d79420dc4c56c1907df22akschulz args = new String[selectionArgs.size()]; 25235a60e47497f21f64e6d79420dc4c56c1907df22akschulz selectionArgs.toArray(args); 25245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25255a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Threads.CONTENT_URI.buildUpon() 25265a60e47497f21f64e6d79420dc4c56c1907df22akschulz .appendQueryParameter("simple", "true").build(); 25275a60e47497f21f64e6d79420dc4c56c1907df22akschulz sortOrder.append(limit); 25285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Query using selection: " + selection.toString() + 25295a60e47497f21f64e6d79420dc4c56c1907df22akschulz " - sortOrder: " + sortOrder.toString()); 25305a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Optimize: Reduce projection based on convo parameter mask 25315a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor = mResolver.query(uri, MMS_SMS_THREAD_PROJECTION, selection.toString(), 25325a60e47497f21f64e6d79420dc4c56c1907df22akschulz args, sortOrder.toString()); 25335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsMmsCursor != null) { 25345a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 25355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + smsMmsCursor.getCount() 25365a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " sms/mms conversations."); 25375a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = null; 25385a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.moveToPosition(-1); 25395a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterRecipient() == null) { 25405a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 25415a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We have no Recipient filter, add contacts after the list is reduced 25425a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (smsMmsCursor.moveToNext()) { 25435a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = createConvoElement(smsMmsCursor, fi, ap); 25445a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.add(convoElement); 25455a60e47497f21f64e6d79420dc4c56c1907df22akschulz count++; 25465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly == false && count >= maxThreads) { 25475a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 25485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25495a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 25515a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We must be able to filter on recipient, add contacts now 25525a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts = new SmsMmsContacts(); 25535a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (smsMmsCursor.moveToNext()) { 25545a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 25555a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = createConvoElement(smsMmsCursor, fi, ap); 25565a60e47497f21f64e6d79420dc4c56c1907df22akschulz String idsStr = 25575a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.getString(MMS_SMS_THREAD_COL_RECIPIENT_IDS); 25585a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Add elements only if we do find a contact - if not we cannot apply 25595a60e47497f21f64e6d79420dc4c56c1907df22akschulz // the filter, hence the item is irrelevant 25605a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Perhaps the spec. should be changes to be able to search on 25615a60e47497f21f64e6d79420dc4c56c1907df22akschulz // phone number as well? 25625a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addSmsMmsContacts(convoElement, contacts, idsStr, 25635a60e47497f21f64e6d79420dc4c56c1907df22akschulz ap.getFilterRecipient(), ap)) { 25645a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.add(convoElement); 25655a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly == false && count >= maxThreads) { 25665a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 25675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25705a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25735a60e47497f21f64e6d79420dc4c56c1907df22akschulz 25745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) || imSelected(ap)) { 25755a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 25765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(emailSelected(ap)) { 25775a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 25785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(imSelected(ap)) { 25795a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 25805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType); 25825a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVERSATION); 25835a60e47497f21f64e6d79420dc4c56c1907df22akschulz 25845a60e47497f21f64e6d79420dc4c56c1907df22akschulz contentUri = appendConvoListQueryParameters(ap, contentUri); 25855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG, "URI with parameters: " + contentUri.toString()); 25865a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Optimize: Reduce projection based on convo parameter mask 25875a60e47497f21f64e6d79420dc4c56c1907df22akschulz imEmailCursor = mResolver.query(contentUri, 25885a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONVERSATION_PROJECTION, 25895a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null, BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY 25905a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " DESC, " + BluetoothMapContract.ConversationColumns.THREAD_ID 25915a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " ASC"); 25925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imEmailCursor != null) { 25935a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement e = null; 25945a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 25955a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Here we rely on only a single account-based message type for each MAS. 25965a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setEmailImConvoColumns(imEmailCursor); 25975a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean isValid = imEmailCursor.moveToNext(); 25985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + imEmailCursor.getCount() 25995a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " EMAIL/IM conversations. isValid = " + isValid); 26005a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (isValid && ((sizeOnly == true) || (count < maxThreads))) { 26015a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId = imEmailCursor.getLong(fi.mConvoColConvoId); 26025a60e47497f21f64e6d79420dc4c56c1907df22akschulz long nextThreadId; 26035a60e47497f21f64e6d79420dc4c56c1907df22akschulz count ++; 26045a60e47497f21f64e6d79420dc4c56c1907df22akschulz e = createConvoElement(imEmailCursor, fi, ap); 26055a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.add(e); 26065a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26075a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 26085a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId = imEmailCursor.getLong(fi.mConvoColConvoId); 26095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.i(TAG, " threadId = " + threadId + " newThreadId = " + 26105a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId); 26115a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: This seems rather inefficient in the case where we do not need 26125a60e47497f21f64e6d79420dc4c56c1907df22akschulz // to reduce the list. 26135a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while ((nextThreadId == threadId) && 26145a60e47497f21f64e6d79420dc4c56c1907df22akschulz (isValid = imEmailCursor.moveToNext() == true)); 26155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26185a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Done adding conversations - list size:" + 26205a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.getCount()); 26215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26225a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If sizeOnly - we are all done here - return the list as is - no need to populate the 26235a60e47497f21f64e6d79420dc4c56c1907df22akschulz // list. 26245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly) { 26255a60e47497f21f64e6d79420dc4c56c1907df22akschulz return convoList; 26265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26275a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26285a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Enable this if post sorting and segmenting needed */ 26295a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* This is too early */ 26305a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.sort(); 26315a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.segment(ap.getMaxListCount(), offsetNum); 26325a60e47497f21f64e6d79420dc4c56c1907df22akschulz List<BluetoothMapConvoListingElement> list = convoList.getList(); 26335a60e47497f21f64e6d79420dc4c56c1907df22akschulz int listSize = list.size(); 26345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.i(TAG, "List Size:" + listSize); 26355a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor tmpCursor = null; 26365a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts = new SmsMmsContacts(); 26375a60e47497f21f64e6d79420dc4c56c1907df22akschulz for(int x=0;x<listSize;x++){ 26385a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement ele = list.get(x); 26395a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE type = ele.getType(); 26405a60e47497f21f64e6d79420dc4c56c1907df22akschulz switch(type) { 26415a60e47497f21f64e6d79420dc4c56c1907df22akschulz case SMS_CDMA: 26425a60e47497f21f64e6d79420dc4c56c1907df22akschulz case SMS_GSM: 26435a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS: { 26445a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = null; // SMS/MMS needs special treatment 26455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(smsMmsCursor != null) { 26465a60e47497f21f64e6d79420dc4c56c1907df22akschulz populateSmsMmsConvoElement(ele, smsMmsCursor, ap, contacts); 26475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) fi.mMsgType = FilterInfo.TYPE_IM; 26495a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26515a60e47497f21f64e6d79420dc4c56c1907df22akschulz case EMAIL: 26525a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = imEmailCursor; 26535a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 26545a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26555a60e47497f21f64e6d79420dc4c56c1907df22akschulz case IM: 26565a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = imEmailCursor; 26575a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 26585a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26595a60e47497f21f64e6d79420dc4c56c1907df22akschulz default: 26605a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = null; 26615a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Working on cursor of type " + fi.mMsgType); 26655a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26665a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(tmpCursor != null){ 26675a60e47497f21f64e6d79420dc4c56c1907df22akschulz populateImEmailConvoElement(ele, tmpCursor, ap, fi); 26685a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else { 26695a60e47497f21f64e6d79420dc4c56c1907df22akschulz // No, it will be for SMS/MMS at the moment 26705a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "tmpCursor is Null - something is wrong - or the message is" + 26715a60e47497f21f64e6d79420dc4c56c1907df22akschulz " of type SMS/MMS"); 26725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26745a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 26755a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(imEmailCursor != null)imEmailCursor.close(); 26765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(smsMmsCursor != null)smsMmsCursor.close(); 26775a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "conversation end"); 26785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26795a60e47497f21f64e6d79420dc4c56c1907df22akschulz return convoList; 26805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26825a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26835a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 26845a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Refreshes the entire list of SMS/MMS conversation version counters. Use it to generate a 26855a60e47497f21f64e6d79420dc4c56c1907df22akschulz * new ConvoListVersinoCounter in mSmsMmsConvoListVersion 26865a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 26875a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 26885a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* package */ 26895a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean refreshSmsMmsConvoVersions() { 26905a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 26915a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor cursor = null; 26925a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Threads.CONTENT_URI.buildUpon() 26935a60e47497f21f64e6d79420dc4c56c1907df22akschulz .appendQueryParameter("simple", "true").build(); 26945a60e47497f21f64e6d79420dc4c56c1907df22akschulz cursor = mResolver.query(uri, MMS_SMS_THREAD_PROJECTION, null, 26955a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, Threads.DATE + " DESC"); 26965a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 26975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (cursor != null) { 26985a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 26995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + cursor.getCount() 27005a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " sms/mms conversations."); 27015a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = null; 27025a60e47497f21f64e6d79420dc4c56c1907df22akschulz cursor.moveToPosition(-1); 27035a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized (getSmsMmsConvoList()) { 27045a60e47497f21f64e6d79420dc4c56c1907df22akschulz int size = Math.max(getSmsMmsConvoList().size(), cursor.getCount()); 27055a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> newList = 27065a60e47497f21f64e6d79420dc4c56c1907df22akschulz new HashMap<Long,BluetoothMapConvoListingElement>(size); 27075a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (cursor.moveToNext()) { 27085a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Extract to function, that can be called at listing, which returns 27095a60e47497f21f64e6d79420dc4c56c1907df22akschulz // the versionCounter(existing or new). 27105a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 27115a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long id = cursor.getLong(MMS_SMS_THREAD_COL_ID); 27125a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = getSmsMmsConvoList().remove(id); 27135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 27145a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 27155a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 27165a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_SMS_MMS, id); 27175a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27185a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 27195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27205a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Currently we only need to compare name, last_activity and read_status, and 27215a60e47497f21f64e6d79420dc4c56c1907df22akschulz // name is not used for SMS/MMS. 27225a60e47497f21f64e6d79420dc4c56c1907df22akschulz // msg delete will be handled by update folderVersionCounter(). 27235a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = cursor.getLong(MMS_SMS_THREAD_COL_DATE); 27245a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (cursor.getInt(MMS_SMS_THREAD_COL_READ) == 1) ? 27255a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 27265a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27275a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 27285a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 27295a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 27305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27315a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 27335a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 27345a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 27355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27375a60e47497f21f64e6d79420dc4c56c1907df22akschulz String idsStr = cursor.getString(MMS_SMS_THREAD_COL_RECIPIENT_IDS); 27385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!idsStr.equals(convoElement.getSmsMmsContacts())) { 27395a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This should not trigger a change in conversationVersionCounter only the 27405a60e47497f21f64e6d79420dc4c56c1907df22akschulz // ConvoListVersionCounter. 27415a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27425a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setSmsMmsContacts(idsStr); 27435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27445a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 27465a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27475a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 27485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27495a60e47497f21f64e6d79420dc4c56c1907df22akschulz newList.put(id, convoElement); 27505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27515a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If we still have items on the old list, something was deleted 27525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(getSmsMmsConvoList().size() != 0) { 27535a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27555a60e47497f21f64e6d79420dc4c56c1907df22akschulz setSmsMmsConvoList(newList); 27565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27575a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 27595a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateSmsMmsConvoListVersionCounter(); 27605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 27635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(cursor != null) { 27645a60e47497f21f64e6d79420dc4c56c1907df22akschulz cursor.close(); 27655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27675a60e47497f21f64e6d79420dc4c56c1907df22akschulz return listChangeDetected; 27685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27695a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27705a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 27715a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Refreshes the entire list of SMS/MMS conversation version counters. Use it to generate a 27725a60e47497f21f64e6d79420dc4c56c1907df22akschulz * new ConvoListVersinoCounter in mSmsMmsConvoListVersion 27735a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 27745a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 27755a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* package */ 27765a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean refreshImEmailConvoVersions() { 27775a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 27785a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi = new FilterInfo(); 27795a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27805a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVERSATION); 27815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27825a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG, "URI with parameters: " + contentUri.toString()); 27835a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor imEmailCursor = mResolver.query(contentUri, 27845a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_VERSION_PROJECTION, 27855a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null, BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY 27865a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " DESC, " + BluetoothMapContract.ConversationColumns.THREAD_ID 27875a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " ASC"); 27885a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 27895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imEmailCursor != null) { 27905a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = null; 27915a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 27925a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Here we rely on only a single account-based message type for each MAS. 27935a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setEmailImConvoColumns(imEmailCursor); 27945a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean isValid = imEmailCursor.moveToNext(); 27955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Found " + imEmailCursor.getCount() 27965a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " EMAIL/IM conversations. isValid = " + isValid); 27975a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized (getImEmailConvoList()) { 27985a60e47497f21f64e6d79420dc4c56c1907df22akschulz int size = Math.max(getImEmailConvoList().size(), imEmailCursor.getCount()); 27995a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 28005a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> newList = 28015a60e47497f21f64e6d79420dc4c56c1907df22akschulz new HashMap<Long,BluetoothMapConvoListingElement>(size); 28025a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (isValid) { 28035a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = imEmailCursor.getLong(fi.mConvoColConvoId); 28045a60e47497f21f64e6d79420dc4c56c1907df22akschulz long nextThreadId; 28055a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = getImEmailConvoList().remove(id); 28065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 28075a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 28085a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 28095a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_EMAIL_IM, id); 28105a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 28115a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 28125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28135a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = imEmailCursor.getString(fi.mConvoColName); 28145a60e47497f21f64e6d79420dc4c56c1907df22akschulz String summary = imEmailCursor.getString(fi.mConvoColSummary); 28155a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = imEmailCursor.getLong(fi.mConvoColLastActivity); 28165a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (imEmailCursor.getInt(fi.mConvoColRead) == 1) ? 28175a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 28185a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 28205a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28215a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 28225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28235a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 28255a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28265a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 28275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name != null && !name.equals(convoElement.getName())) { 28305a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28315a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setName(name); 28325a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28335a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(summary != null && !summary.equals(convoElement.getFullSummary())) { 28355a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28365a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setSummary(summary); 28375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28385a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* If the query returned one row for each contact, skip all the dublicates */ 28395a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 28405a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId = imEmailCursor.getLong(fi.mConvoColConvoId); 28415a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.i(TAG, " threadId = " + id + " newThreadId = " + 28425a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId); 28435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while ((nextThreadId == id) && 28445a60e47497f21f64e6d79420dc4c56c1907df22akschulz (isValid = imEmailCursor.moveToNext() == true)); 28455a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 28475a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 28485a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 28495a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28505a60e47497f21f64e6d79420dc4c56c1907df22akschulz newList.put(id, convoElement); 28515a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28525a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If we still have items on the old list, something was deleted 28535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(getImEmailConvoList().size() != 0) { 28545a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 28555a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28565a60e47497f21f64e6d79420dc4c56c1907df22akschulz setImEmailConvoList(newList); 28575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 28605a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(imEmailCursor != null) { 28615a60e47497f21f64e6d79420dc4c56c1907df22akschulz imEmailCursor.close(); 28625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28645a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28655a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 28665a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateImEmailConvoListVersionCounter(); 28675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28685a60e47497f21f64e6d79420dc4c56c1907df22akschulz return listChangeDetected; 28695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28705a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28715a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 28725a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Update the convoVersionCounter within the element passed as parameter. 28735a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function has the side effect to update the ConvoListVersionCounter if needed. 28745a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function ignores changes to contacts as this shall not change the convoVersionCounter, 28755a60e47497f21f64e6d79420dc4c56c1907df22akschulz * only the convoListVersion counter, which will be updated upon request. 28765a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele Element to update shall not be null. 28775a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 28785a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void updateSmsMmsConvoVersion(Cursor cursor, BluetoothMapConvoListingElement ele) { 28795a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = ele.getCpConvoId(); 28805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = getSmsMmsConvoList().get(id); 28815a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 28825a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 28835a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 28845a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 28855a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 28865a60e47497f21f64e6d79420dc4c56c1907df22akschulz getSmsMmsConvoList().put(id, convoElement); 28875a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_SMS_MMS, id); 28885a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 28895a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 28905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28915a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = cursor.getLong(MMS_SMS_THREAD_COL_DATE); 28925a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (cursor.getInt(MMS_SMS_THREAD_COL_READ) == 1) ? 28935a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 28945a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 28965a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28975a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 28985a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 29015a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29025a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 29035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29045a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 29065a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 29075a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 29085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 29105a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateSmsMmsConvoListVersionCounter(); 29115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29125a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setVersionCounter(convoElement.getVersionCounter()); 29135a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29145a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29155a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 29165a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Update the convoVersionCounter within the element passed as parameter. 29175a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function has the side effect to update the ConvoListVersionCounter if needed. 29185a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function ignores changes to contacts as this shall not change the convoVersionCounter, 29195a60e47497f21f64e6d79420dc4c56c1907df22akschulz * only the convoListVersion counter, which will be updated upon request. 29205a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele Element to update shall not be null. 29215a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 29225a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void updateImEmailConvoVersion(Cursor cursor, FilterInfo fi, 29235a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement ele) { 29245a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = ele.getCpConvoId(); 29255a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = getImEmailConvoList().get(id); 29265a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 29275a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 29285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 29295a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 29305a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Added new conversation with ID = " + id); 29315a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 29325a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_EMAIL_IM, id); 29335a60e47497f21f64e6d79420dc4c56c1907df22akschulz getImEmailConvoList().put(id, convoElement); 29345a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 29355a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 29365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29375a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = cursor.getString(fi.mConvoColName); 29385a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = cursor.getLong(fi.mConvoColLastActivity); 29395a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (cursor.getInt(fi.mConvoColRead) == 1) ? 29405a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 29415a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 29435a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29445a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 29455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29465a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 29485a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29495a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 29505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29515a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name != null && !name.equals(convoElement.getName())) { 29535a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29545a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setName(name); 29555a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29565a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 29585a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 29595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "conversation with ID = " + id + " changed"); 29605a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 29615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29625a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 29635a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateImEmailConvoListVersionCounter(); 29645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29655a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setVersionCounter(convoElement.getVersionCounter()); 29665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29685a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 29695a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele 29705a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param smsMmsCursor 29715a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap 29725a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contacts 29735a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 29745a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void populateSmsMmsConvoElement(BluetoothMapConvoListingElement ele, 29755a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor smsMmsCursor, BluetoothMapAppParams ap, 29765a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts) { 29775a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.moveToPosition(ele.getCursorIndex()); 29785a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: If we ever get beyond 31 bit, change to long 29795a60e47497f21f64e6d79420dc4c56c1907df22akschulz int parameterMask = (int) ap.getConvoParameterMask(); // We always set a default value 29805a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29815a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: How to determine whether the convo-IDs can be used across message 29825a60e47497f21f64e6d79420dc4c56c1907df22akschulz // types? 29835a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_SMS_MMS, 29845a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.getLong(MMS_SMS_THREAD_COL_ID)); 29855a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29865a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (smsMmsCursor.getInt(MMS_SMS_THREAD_COL_READ) == 1) ? 29875a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 29885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_READ_STATUS) != 0) { 29895a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setRead(read, true); 29905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 29915a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setRead(read, false); 29925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_LAST_ACTIVITY) != 0) { 29955a60e47497f21f64e6d79420dc4c56c1907df22akschulz long timeStamp = smsMmsCursor.getLong(MMS_SMS_THREAD_COL_DATE); 29965a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(timeStamp); 29975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 29985a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We need to delete the time stamp, if it was added for multi msg-type 29995a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(-1); 30005a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30015a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_VERSION_COUNTER) != 0) { 30035a60e47497f21f64e6d79420dc4c56c1907df22akschulz updateSmsMmsConvoVersion(smsMmsCursor, ele); 30045a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30055a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_NAME) != 0) { 30075a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setName(""); // We never have a thread name for SMS/MMS 30085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30095a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_SUMMARY) != 0) { 30115a60e47497f21f64e6d79420dc4c56c1907df22akschulz String summary = smsMmsCursor.getString(MMS_SMS_THREAD_COL_SNIPPET); 30125a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cs = smsMmsCursor.getString(MMS_SMS_THREAD_COL_SNIPPET_CS); 30135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(summary != null && cs != null && !cs.equals("UTF-8")) { 30145a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 30155a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Not sure this is how to convert to UTF-8 30165a60e47497f21f64e6d79420dc4c56c1907df22akschulz summary = new String(summary.getBytes(cs),"UTF-8"); 30175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (UnsupportedEncodingException e){/*Cannot happen*/} 30185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30195a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setSummary(summary); 30205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PARTTICIPANTS) != 0) { 30235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterRecipient() == null) { 30245a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Add contacts only if not already added 30255a60e47497f21f64e6d79420dc4c56c1907df22akschulz String idsStr = 30265a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.getString(MMS_SMS_THREAD_COL_RECIPIENT_IDS); 30275a60e47497f21f64e6d79420dc4c56c1907df22akschulz addSmsMmsContacts(ele, contacts, idsStr, null, ap); 30285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30315a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30325a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 30335a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele 30345a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param tmpCursor 30355a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param fi 30365a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 30375a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void populateImEmailConvoElement( BluetoothMapConvoListingElement ele, 30385a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor tmpCursor, BluetoothMapAppParams ap, FilterInfo fi) { 30395a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor.moveToPosition(ele.getCursorIndex()); 30405a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: If we ever get beyond 31 bit, change to long 30415a60e47497f21f64e6d79420dc4c56c1907df22akschulz int parameterMask = (int) ap.getConvoParameterMask(); // We always set a default value 30425a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId = tmpCursor.getLong(fi.mConvoColConvoId); 30435a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30445a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Mandatory field 30455a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_EMAIL_IM, threadId); 30465a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_NAME) != 0) { 30485a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setName(tmpCursor.getString(fi.mConvoColName)); 30495a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30505a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30515a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean reportRead = false; 30525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_READ_STATUS) != 0) { 30535a60e47497f21f64e6d79420dc4c56c1907df22akschulz reportRead = true; 30545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30555a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setRead(((1==tmpCursor.getInt(fi.mConvoColRead))?true:false), reportRead); 30565a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30575a60e47497f21f64e6d79420dc4c56c1907df22akschulz long timestamp = tmpCursor.getLong(fi.mConvoColLastActivity); 30585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_LAST_ACTIVITY) != 0) { 30595a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(timestamp); 30605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 30615a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We need to delete the time stamp, if it was added for multi msg-type 30625a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(-1); 30635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30645a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30655a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30665a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_VERSION_COUNTER) != 0) { 30675a60e47497f21f64e6d79420dc4c56c1907df22akschulz updateImEmailConvoVersion(tmpCursor, fi, ele); 30685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_SUMMARY) != 0) { 30705a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setSummary(tmpCursor.getString(fi.mConvoColSummary)); 30715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30725a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: For optimization, we could avoid joining the contact and convo tables 30735a60e47497f21f64e6d79420dc4c56c1907df22akschulz // if we have no filter nor this bit is set. 30745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PARTTICIPANTS) != 0) { 30755a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 30765a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement c = new BluetoothMapConvoContactElement(); 30775a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_X_BT_UID) != 0) { 30785a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setBtUid(new SignedLongLong(tmpCursor.getLong(fi.mContactColBtUid),0)); 30795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_CHAT_STATE) != 0) { 30815a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setChatState(tmpCursor.getInt(fi.mContactColChatState)); 30825a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30835a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_PRESENCE) != 0) { 30845a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setPresenceAvailability(tmpCursor.getInt(fi.mContactColPresenceState)); 30855a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30865a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_PRESENCE_TEXT) != 0) { 30875a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setPresenceStatus(tmpCursor.getString(fi.mContactColPresenceText)); 30885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_PRIORITY) != 0) { 30905a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setPriority(tmpCursor.getInt(fi.mContactColPriority)); 30915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_DISP_NAME) != 0) { 30935a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setDisplayName(tmpCursor.getString(fi.mContactColNickname)); 30945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_UCI) != 0) { 30965a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setContactId(tmpCursor.getString(fi.mContactColContactUci)); 30975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_LAST_ACTIVITY) != 0) { 30995a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setLastActivity(tmpCursor.getLong(fi.mContactColLastActive)); 31005a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_NAME) != 0) { 31025a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setName(tmpCursor.getString(fi.mContactColName)); 31035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31045a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.addContact(c); 31055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (tmpCursor.moveToNext() == true 31065a60e47497f21f64e6d79420dc4c56c1907df22akschulz && tmpCursor.getLong(fi.mConvoColConvoId) == threadId); 31075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31095a60e47497f21f64e6d79420dc4c56c1907df22akschulz 31105a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 31115a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Extract the ConvoList parameters from appParams and build the matching URI with 31125a60e47497f21f64e6d79420dc4c56c1907df22akschulz * query parameters. 31135a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap the appParams from the request 31145a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contentUri the URI to append parameters to 31155a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return the new URI with the appended parameters (if any) 31165a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 31175a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Uri appendConvoListQueryParameters(BluetoothMapAppParams ap, 31185a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri) { 31195a60e47497f21f64e6d79420dc4c56c1907df22akschulz Builder newUri = contentUri.buildUpon(); 31205a60e47497f21f64e6d79420dc4c56c1907df22akschulz String str = ap.getFilterRecipient(); 31215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(str != null) { 31225a60e47497f21f64e6d79420dc4c56c1907df22akschulz str = str.trim(); 31235a60e47497f21f64e6d79420dc4c56c1907df22akschulz str = str.replace("*", "%"); 31245a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_ORIGINATOR_SUBSTRING, str); 31255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31265a60e47497f21f64e6d79420dc4c56c1907df22akschulz long time = ap.getFilterLastActivityBegin(); 31275a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(time > 0) { 31285a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_PERIOD_BEGIN, 31295a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long.toString(time)); 31305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31315a60e47497f21f64e6d79420dc4c56c1907df22akschulz time = ap.getFilterLastActivityEnd(); 31325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(time > 0) { 31335a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_PERIOD_END, 31345a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long.toString(time)); 31355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31365a60e47497f21f64e6d79420dc4c56c1907df22akschulz int readStatus = ap.getFilterReadStatus(); 31375a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(readStatus > 0) { 31385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(readStatus == 1) { 31395a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Conversations with Unread messages only 31405a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_READ_STATUS, 31415a60e47497f21f64e6d79420dc4c56c1907df22akschulz "false"); 31425a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else if(readStatus == 2) { 31435a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Conversations with all read messages only 31445a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_READ_STATUS, 31455a60e47497f21f64e6d79420dc4c56c1907df22akschulz "true"); 31465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31475a60e47497f21f64e6d79420dc4c56c1907df22akschulz // if both are set it will be the same as requesting an empty list, but 31485a60e47497f21f64e6d79420dc4c56c1907df22akschulz // as it makes no sense with such a structure in a bit mask, we treat 31495a60e47497f21f64e6d79420dc4c56c1907df22akschulz // requesting both the same as no filtering. 31505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31515a60e47497f21f64e6d79420dc4c56c1907df22akschulz long convoId = -1; 31525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterConvoId() != null) { 31535a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoId = ap.getFilterConvoId().getLeastSignificantBits(); 31545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoId > 0) { 31565a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_THREAD_ID, 31575a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long.toString(convoId)); 31585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31595a60e47497f21f64e6d79420dc4c56c1907df22akschulz return newUri.build(); 31605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31615a60e47497f21f64e6d79420dc4c56c1907df22akschulz 31625a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 31635a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Procedure if we have a filter: 31645a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - loop through all ids to examine if there is a match (this will build the cache) 31655a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - If there is a match loop again to add all contacts. 31665a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 31675a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Procedure if we don't have a filter 31685a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Add all contacts 31695a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 31705a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param convoElement 31715a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contacts 31725a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param idsStr 31735a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param recipientFilter 31745a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 31755a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 31765a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean addSmsMmsContacts( BluetoothMapConvoListingElement convoElement, 31775a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts, String idsStr, String recipientFilter, 31785a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams ap) { 31795a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement contactElement; 31805a60e47497f21f64e6d79420dc4c56c1907df22akschulz int parameterMask = (int) ap.getConvoParameterMask(); // We always set a default value 31815a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean foundContact = false; 31825a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] ids = idsStr.split(" "); 31835a60e47497f21f64e6d79420dc4c56c1907df22akschulz long[] longIds = new long[ids.length]; 31845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(recipientFilter != null) { 31855a60e47497f21f64e6d79420dc4c56c1907df22akschulz recipientFilter = recipientFilter.trim(); 31865a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31875a60e47497f21f64e6d79420dc4c56c1907df22akschulz 31885a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (int i = 0; i < ids.length; i++) { 31895a60e47497f21f64e6d79420dc4c56c1907df22akschulz long longId; 31905a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 31915a60e47497f21f64e6d79420dc4c56c1907df22akschulz longId = Long.parseLong(ids[i]); 31925a60e47497f21f64e6d79420dc4c56c1907df22akschulz longIds[i] = longId; 31935a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(recipientFilter == null) { 31945a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If there is not filter, all we need to do is to parse the ids 31955a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = true; 31965a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 31975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31985a60e47497f21f64e6d79420dc4c56c1907df22akschulz String addr = contacts.getPhoneNumber(mResolver, longId); 31995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addr == null) { 32005a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This can only happen if all messages from a contact is deleted while 32015a60e47497f21f64e6d79420dc4c56c1907df22akschulz // performing the query. 32025a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32045a60e47497f21f64e6d79420dc4c56c1907df22akschulz MapContact contact = 32055a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts.getContactNameFromPhone(addr, mResolver, recipientFilter); 32065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) { 32075a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG, " id " + longId + ": " + addr); 32085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contact != null) { 32095a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG," contact name: " + contact.getName() + " X-BT-UID: " 32105a60e47497f21f64e6d79420dc4c56c1907df22akschulz + contact.getXBtUid()); 32115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contact == null) { 32145a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32165a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = true; 32175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NumberFormatException ex) { 32185a60e47497f21f64e6d79420dc4c56c1907df22akschulz // skip this id 32195a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 32235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(foundContact == true) { 32245a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = false; 32255a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (long id : longIds) { 32265a60e47497f21f64e6d79420dc4c56c1907df22akschulz String addr = contacts.getPhoneNumber(mResolver, id); 32275a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addr == null) { 32285a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This can only happen if all messages from a contact is deleted while 32295a60e47497f21f64e6d79420dc4c56c1907df22akschulz // performing the query. 32305a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32325a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = true; 32335a60e47497f21f64e6d79420dc4c56c1907df22akschulz MapContact contact = contacts.getContactNameFromPhone(addr, mResolver); 32345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 32355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contact == null) { 32365a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We do not have a contact, we need to manually add one 32375a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement = new BluetoothMapConvoContactElement(); 32385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_NAME) != 0) { 32395a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setName(addr); // Use the phone number as name 32405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32415a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_UCI) != 0) { 32425a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setContactId(addr); 32435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 32455a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement = BluetoothMapConvoContactElement 32465a60e47497f21f64e6d79420dc4c56c1907df22akschulz .createFromMapContact(contact, addr); 32475a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Remove the parameters not to be reported 32485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_UCI) == 0) { 32495a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setContactId(null); 32505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_X_BT_UID) == 0) { 32525a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setBtUid(null); 32535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_DISP_NAME) == 0) { 32555a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setDisplayName(null); 32565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32585a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.addContact(contactElement); 32595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32615a60e47497f21f64e6d79420dc4c56c1907df22akschulz return foundContact; 32625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 32645a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 3265fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * Get the folder name of an SMS message or MMS message. 3266fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @param c the cursor pointing at the message 3267fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @return the folder name. 3268fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie */ 3269fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String getFolderName(int type, int threadId) { 3270fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3271fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(threadId == -1) 3272326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_DELETED; 3273fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3274fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie switch(type) { 3275fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 1: 3276326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_INBOX; 3277fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 2: 3278326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_SENT; 3279fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 3: 3280326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_DRAFT; 3281fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 4: // Just name outbox, failed and queued "outbox" 3282fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 5: 3283fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 6: 3284326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_OUTBOX; 3285fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3286fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return ""; 3287fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3288fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3289326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public byte[] getMessage(String handle, BluetoothMapAppParams appParams, 32905a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement folderElement, String version) 32915a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws UnsupportedEncodingException{ 3292fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TYPE type = BluetoothMapUtils.getMsgTypeFromHandle(handle); 32935a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageVersion = version; 3294fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = BluetoothMapUtils.getCpHandle(handle); 3295326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(appParams.getFractionRequest() == BluetoothMapAppParams.FRACTION_REQUEST_NEXT) { 3296326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("FRACTION_REQUEST_NEXT does not make sence as" + 3297326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " we always return the full message."); 3298326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3299fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie switch(type) { 3300fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case SMS_GSM: 3301fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case SMS_CDMA: 330270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return getSmsMessage(id, appParams.getCharset()); 3303fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case MMS: 330470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return getMmsMessage(id, appParams); 3305fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case EMAIL: 3306326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return getEmailMessage(id, appParams, folderElement); 33075a60e47497f21f64e6d79420dc4c56c1907df22akschulz case IM: 33085a60e47497f21f64e6d79420dc4c56c1907df22akschulz return getIMMessage(id, appParams, folderElement); 3309fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3310fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie throw new IllegalArgumentException("Invalid message handle."); 3311fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3312fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 33135a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setVCardFromPhoneNumber(BluetoothMapbMessage message, 3314cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String phone, boolean incoming) { 3315fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String contactId = null, contactName = null; 33167769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde String[] phoneNumbers = new String[1]; 3317cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Handle possible exception for empty phone address 3318cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (TextUtils.isEmpty(phone)) { 3319cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta return contactName; 3320cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 33217769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // 33227769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // Use only actual phone number, because the MCE cannot know which 33237769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // number the message is from. 33247769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // 33257769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde phoneNumbers[0] = phone; 3326fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] emailAddresses = null; 33275a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor p; 3328fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 33295006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai Uri uri = Uri 33305006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai .withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, 3331fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri.encode(phone)); 3332fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3333fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] projection = {Contacts._ID, Contacts.DISPLAY_NAME}; 3334fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = Contacts.IN_VISIBLE_GROUP + "=1"; 3335fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orderBy = Contacts._ID + " ASC"; 3336fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3337fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // Get the contact _ID and name 33385a60e47497f21f64e6d79420dc4c56c1907df22akschulz p = mResolver.query(uri, projection, selection, null, orderBy); 333928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 33407769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde if (p != null && p.moveToFirst()) { 334128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz contactId = p.getString(p.getColumnIndex(Contacts._ID)); 334228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz contactName = p.getString(p.getColumnIndex(Contacts.DISPLAY_NAME)); 334328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 33445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 33457769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde close(p); 33465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 33475a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Bail out if we are unable to find a contact, based on the phone number 33487769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde if (contactId != null) { 33497769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde Cursor q = null; 33507769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // Fetch the contact e-mail addresses 33515a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 33527769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde q = mResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 33537769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 33547769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde new String[]{contactId}, 33557769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde null); 33567769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde if (q != null && q.moveToFirst()) { 33577769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde int i = 0; 33587769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde emailAddresses = new String[q.getCount()]; 33597769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde do { 33607769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde String emailAddress = q.getString(q.getColumnIndex( 33617769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde ContactsContract.CommonDataKinds.Email.ADDRESS)); 33627769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde emailAddresses[i++] = emailAddress; 33637769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde } while (q != null && q.moveToNext()); 3364fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 33655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 33667769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde close(q); 3367fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3368fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 33697769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde 337028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (incoming == true) { 3371326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Adding originator for phone:" + phone); 33725a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Use version 3.0 as we only have a formatted name 33735a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(contactName, contactName, phoneNumbers, emailAddresses,null,null); 3374326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 3375326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Adding recipient for phone:" + phone); 33765a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Use version 3.0 as we only have a formatted name 33775a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(contactName, contactName, phoneNumbers, emailAddresses,null,null); 3378326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3379326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return contactName; 3380fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3381fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3382fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MAP_MESSAGE_CHARSET_NATIVE = 0; 3383fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MAP_MESSAGE_CHARSET_UTF8 = 1; 3384fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3385fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public byte[] getSmsMessage(long id, int charset) throws UnsupportedEncodingException{ 3386fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int type, threadId; 3387fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long time = -1; 3388fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String msgBody; 3389fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BluetoothMapbMessageSms message = new BluetoothMapbMessageSms(); 3390fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 339128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 3392fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Sms.CONTENT_URI, SMS_PROJECTION, "_ID = " + id, null, null); 339328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c == null || !c.moveToFirst()) { 339428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz throw new IllegalArgumentException("SMS handle not found"); 339528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 3396fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 33975a60e47497f21f64e6d79420dc4c56c1907df22akschulz try{ 33985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) 33995a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 34005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG,"c.count: " + c.getCount()); 3401fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 34025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) { 34035a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.SMS_GSM); 34045a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) { 34055a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.SMS_CDMA); 34065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 34075a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 34085a60e47497f21f64e6d79420dc4c56c1907df22akschulz String read = c.getString(c.getColumnIndex(Sms.READ)); 34095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read.equalsIgnoreCase("1")) 34105a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 3411fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie else 34125a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 34135a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34145a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = c.getInt(c.getColumnIndex(Sms.TYPE)); 34155a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 34165a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setFolder(getFolderName(type, threadId)); 34175a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34185a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgBody = c.getString(c.getColumnIndex(Sms.BODY)); 34195a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34205a60e47497f21f64e6d79420dc4c56c1907df22akschulz String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 3421cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if ((phone == null) && type == Sms.MESSAGE_TYPE_DRAFT) { 3422cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Fetch address for Drafts folder from "canonical_address" table 3423cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta phone = getCanonicalAddressSms(mResolver, threadId); 3424cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 34255a60e47497f21f64e6d79420dc4c56c1907df22akschulz time = c.getLong(c.getColumnIndex(Sms.DATE)); 34265a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(type == 1) // Inbox message needs to set the vCard as originator 34275a60e47497f21f64e6d79420dc4c56c1907df22akschulz setVCardFromPhoneNumber(message, phone, true); 34285a60e47497f21f64e6d79420dc4c56c1907df22akschulz else // Other messages sets the vCard as the recipient 34295a60e47497f21f64e6d79420dc4c56c1907df22akschulz setVCardFromPhoneNumber(message, phone, false); 34305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(charset == MAP_MESSAGE_CHARSET_NATIVE) { 34325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(type == 1) //Inbox 34335a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSmsBodyPdus(BluetoothMapSmsPdu.getDeliverPdus(msgBody, 34345a60e47497f21f64e6d79420dc4c56c1907df22akschulz phone, time)); 34355a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 34365a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSmsBodyPdus(BluetoothMapSmsPdu.getSubmitPdus(msgBody, phone)); 34375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else /*if (charset == MAP_MESSAGE_CHARSET_UTF8)*/ { 34385a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSmsBody(msgBody); 34395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 34405a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 3441fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 344228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 34435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3444fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 344528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 344628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return message.encode(); 3447fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3448fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 34495a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void extractMmsAddresses(long id, BluetoothMapbMessageMime message) { 3450fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie final String[] projection = null; 3451326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String selection = new String(Mms.Addr.MSG_ID + "=" + id); 3452326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/addr"); 3453fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 3454326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String contactName = null; 345528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 3456326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query( uriAddress, projection, selection, null, null); 345728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 34585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.moveToFirst()) { 34595a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 34605a60e47497f21f64e6d79420dc4c56c1907df22akschulz String address = c.getString(c.getColumnIndex(Mms.Addr.ADDRESS)); 34615a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(address.equals(INSERT_ADDRES_TOKEN)) 34625a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 34635a60e47497f21f64e6d79420dc4c56c1907df22akschulz Integer type = c.getInt(c.getColumnIndex(Mms.Addr.TYPE)); 34645a60e47497f21f64e6d79420dc4c56c1907df22akschulz switch(type) { 34655a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_FROM: 34665a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, true); 34675a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addFrom(contactName, address); 34685a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34695a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_TO: 34705a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, false); 34715a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addTo(contactName, address); 34725a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34735a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_CC: 34745a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, false); 34755a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addCc(contactName, address); 34765a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34775a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_BCC: 34785a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, false); 34795a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addBcc(contactName, address); 34805a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34815a60e47497f21f64e6d79420dc4c56c1907df22akschulz default: 34825a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 34845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 348528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 348628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 34875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3488fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3489fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3490fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 34915a60e47497f21f64e6d79420dc4c56c1907df22akschulz 349270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 34935a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Read out a mime data part and return the data in a byte array. 34945a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contentPartUri TODO 34955a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param partid the content provider id of the Mime Part. 349670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return 349770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 34985a60e47497f21f64e6d79420dc4c56c1907df22akschulz private byte[] readRawDataPart(Uri contentPartUri, long partid) { 34995a60e47497f21f64e6d79420dc4c56c1907df22akschulz String uriStr = new String(contentPartUri+"/"+ partid); 3500fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 3501fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie InputStream is = null; 3502fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ByteArrayOutputStream os = new ByteArrayOutputStream(); 3503fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int bufferSize = 8192; 3504fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie byte[] buffer = new byte[bufferSize]; 3505fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie byte[] retVal = null; 3506fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3507fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 3508fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie is = mResolver.openInputStream(uriAddress); 3509fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int len = 0; 3510fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie while ((len = is.read(buffer)) != -1) { 3511fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie os.write(buffer, 0, len); // We need to specify the len, as it can be != bufferSize 3512fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3513fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie retVal = os.toByteArray(); 3514fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 3515fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // do nothing for now 3516fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.w(TAG,"Error reading part data",e); 3517fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } finally { 351828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(os); 351928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(is); 3520fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3521fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return retVal; 3522fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3523fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 352470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 352570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * Read out the mms parts and update the bMessage object provided i {@linkplain message} 352670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param id the content provider ID of the message 352770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param message the bMessage object to add the information to 352870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 35295a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void extractMmsParts(long id, BluetoothMapbMessageMime message) 3530fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie { 3531326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Handling of filtering out non-text parts for exclude 3532326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * attachments is handled within the bMessage object. */ 3533fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie final String[] projection = null; 3534326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String selection = new String(Mms.Part.MSG_ID + "=" + id); 3535326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/"+ id + "/part"); 3536fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 35375a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime.MimePart part; 353828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor c = mResolver.query(uriAddress, projection, selection, null, null); 353928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 35405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.moveToFirst()) { 35415a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 35425a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long partId = c.getLong(c.getColumnIndex(BaseColumns._ID)); 35435a60e47497f21f64e6d79420dc4c56c1907df22akschulz String contentType = c.getString(c.getColumnIndex(Mms.Part.CONTENT_TYPE)); 35445a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = c.getString(c.getColumnIndex(Mms.Part.NAME)); 35455a60e47497f21f64e6d79420dc4c56c1907df22akschulz String charset = c.getString(c.getColumnIndex(Mms.Part.CHARSET)); 35465a60e47497f21f64e6d79420dc4c56c1907df22akschulz String filename = c.getString(c.getColumnIndex(Mms.Part.FILENAME)); 35475a60e47497f21f64e6d79420dc4c56c1907df22akschulz String text = c.getString(c.getColumnIndex(Mms.Part.TEXT)); 35485a60e47497f21f64e6d79420dc4c56c1907df22akschulz Integer fd = c.getInt(c.getColumnIndex(Mms.Part._DATA)); 35495a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cid = c.getString(c.getColumnIndex(Mms.Part.CONTENT_ID)); 35505a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cl = c.getString(c.getColumnIndex(Mms.Part.CONTENT_LOCATION)); 35515a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cdisp = c.getString(c.getColumnIndex(Mms.Part.CONTENT_DISPOSITION)); 35525a60e47497f21f64e6d79420dc4c56c1907df22akschulz 35535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, " _id : " + partId + 35545a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n ct : " + contentType + 35555a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n partname : " + name + 35565a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n charset : " + charset + 35575a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n filename : " + filename + 35585a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n text : " + text + 35595a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n fd : " + fd + 35605a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cid : " + cid + 35615a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cl : " + cl + 35625a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cdisp : " + cdisp); 35635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 35645a60e47497f21f64e6d79420dc4c56c1907df22akschulz part = message.addMimePart(); 35655a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentType = contentType; 35665a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mPartName = name; 35675a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentId = cid; 35685a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentLocation = cl; 35695a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentDisposition = cdisp; 35705a60e47497f21f64e6d79420dc4c56c1907df22akschulz 35715a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 35725a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(text != null) { 35735a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = text.getBytes("UTF-8"); 35745a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = "utf-8"; 35755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 35765a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = 35775a60e47497f21f64e6d79420dc4c56c1907df22akschulz readRawDataPart(Uri.parse(Mms.CONTENT_URI+"/part"), partId); 35785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(charset != null) { 35795a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = 35805a60e47497f21f64e6d79420dc4c56c1907df22akschulz CharacterSets.getMimeName(Integer.parseInt(charset)); 35815a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 35825a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 35835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NumberFormatException e) { 35845a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractMmsParts",e); 35855a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 35865a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 35875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (UnsupportedEncodingException e) { 35885a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractMmsParts",e); 35895a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 35905a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 35915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 35925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 35935a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mFileName = filename; 35945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 35955a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.updateCharset(); 35965a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 359770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 35985a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 35995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 36005a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 36015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 36025a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 36035a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Read out the mms parts and update the bMessage object provided i {@linkplain message} 36045a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param id the content provider ID of the message 36055a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param message the bMessage object to add the information to 36065a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 36075a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void extractIMParts(long id, BluetoothMapbMessageMime message) 36085a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 36095a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Handling of filtering out non-text parts for exclude 36105a60e47497f21f64e6d79420dc4c56c1907df22akschulz * attachments is handled within the bMessage object. */ 36115a60e47497f21f64e6d79420dc4c56c1907df22akschulz final String[] projection = null; 36125a60e47497f21f64e6d79420dc4c56c1907df22akschulz String selection = new String(BluetoothMapContract.MessageColumns._ID + "=" + id); 36135a60e47497f21f64e6d79420dc4c56c1907df22akschulz String uriStr = new String(mBaseUri 36145a60e47497f21f64e6d79420dc4c56c1907df22akschulz + BluetoothMapContract.TABLE_MESSAGE + "/"+ id + "/part"); 36155a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uriAddress = Uri.parse(uriStr); 36165a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime.MimePart part; 36175a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(uriAddress, projection, selection, null, null); 36185a60e47497f21f64e6d79420dc4c56c1907df22akschulz try{ 36195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.moveToFirst()) { 36205a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 36215a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long partId = c.getLong( 36225a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns._ID)); 36235a60e47497f21f64e6d79420dc4c56c1907df22akschulz String charset = c.getString( 36245a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.CHARSET)); 36255a60e47497f21f64e6d79420dc4c56c1907df22akschulz String filename = c.getString( 36265a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.FILENAME)); 36275a60e47497f21f64e6d79420dc4c56c1907df22akschulz String text = c.getString( 36285a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.TEXT)); 36295a60e47497f21f64e6d79420dc4c56c1907df22akschulz String body = c.getString( 36305a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.RAW_DATA)); 36315a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cid = c.getString( 36325a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.CONTENT_ID)); 36335a60e47497f21f64e6d79420dc4c56c1907df22akschulz 36345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, " _id : " + partId + 36355a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n charset : " + charset + 36365a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n filename : " + filename + 36375a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n text : " + text + 36385a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cid : " + cid); 36395a60e47497f21f64e6d79420dc4c56c1907df22akschulz 36405a60e47497f21f64e6d79420dc4c56c1907df22akschulz part = message.addMimePart(); 36415a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentId = cid; 36425a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 36435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(text.equalsIgnoreCase("yes")) { 36445a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = body.getBytes("UTF-8"); 36455a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = "utf-8"; 36465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 36475a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = readRawDataPart(Uri.parse(mBaseUri 36485a60e47497f21f64e6d79420dc4c56c1907df22akschulz + BluetoothMapContract.TABLE_MESSAGE_PART) , partId); 36495a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(charset != null) 36505a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = CharacterSets.getMimeName( 36515a60e47497f21f64e6d79420dc4c56c1907df22akschulz Integer.parseInt(charset)); 36525a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 36535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NumberFormatException e) { 36545a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractIMParts",e); 36555a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 36565a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 36575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (UnsupportedEncodingException e) { 36585a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractIMParts",e); 36595a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 36605a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 36615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 3662fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 36635a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mFileName = filename; 36645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 366528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 366628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 36675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 3668fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 366928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 3670fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.updateCharset(); 3671fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3672fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 367370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 367470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * 367570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param id the content provider id for the message to fetch. 367670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param appParams The application parameter object received from the client. 367770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 367870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @throws UnsupportedEncodingException if UTF-8 is not supported, 367970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * which is guaranteed to be supported on an android device 368070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 36815a60e47497f21f64e6d79420dc4c56c1907df22akschulz public byte[] getMmsMessage(long id,BluetoothMapAppParams appParams) 36825a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws UnsupportedEncodingException { 3683fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgBox, threadId; 3684326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 36855a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("MMS charset native not allowed for MMS" 36865a60e47497f21f64e6d79420dc4c56c1907df22akschulz +" - must be utf-8"); 3687326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 36885a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime message = new BluetoothMapbMessageMime(); 3689fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Mms.CONTENT_URI, MMS_PROJECTION, "_ID = " + id, null, null); 369028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 36915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) 36925a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 36935a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.MMS); 36945a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 36955a60e47497f21f64e6d79420dc4c56c1907df22akschulz 36965a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The MMS info: 36975a60e47497f21f64e6d79420dc4c56c1907df22akschulz String read = c.getString(c.getColumnIndex(Mms.READ)); 36985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read.equalsIgnoreCase("1")) 36995a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 37005a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 37015a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 37025a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37035a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgBox = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); 37045a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 37055a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setFolder(getFolderName(msgBox, threadId)); 37065a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSubject(c.getString(c.getColumnIndex(Mms.SUBJECT))); 37075a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setMessageId(c.getString(c.getColumnIndex(Mms.MESSAGE_ID))); 37085a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setContentType(c.getString(c.getColumnIndex(Mms.CONTENT_TYPE))); 37095a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setDate(c.getLong(c.getColumnIndex(Mms.DATE)) * 1000L); 37105a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setTextOnly(c.getInt(c.getColumnIndex(Mms.TEXT_ONLY)) == 0 ? false : true); 37115a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setIncludeAttachments(appParams.getAttachment() == 0 ? false : true); 37125a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getLong(c.getColumnIndex(Mms.DATE_SENT)); - this is never used 37135a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getInt(c.getColumnIndex(Mms.STATUS)); - don't know what this is 37145a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37155a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The parts 37165a60e47497f21f64e6d79420dc4c56c1907df22akschulz extractMmsParts(id, message); 37175a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37185a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The addresses 37195a60e47497f21f64e6d79420dc4c56c1907df22akschulz extractMmsAddresses(id, message); 37205a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37225a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 37235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 372428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 37255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3726fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3727fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 372828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return message.encode(); 3729fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3730fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3731326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 3732326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * 3733326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param id the content provider id for the message to fetch. 3734326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param appParams The application parameter object received from the client. 3735326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 3736326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @throws UnsupportedEncodingException if UTF-8 is not supported, 3737326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * which is guaranteed to be supported on an android device 3738326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 3739326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public byte[] getEmailMessage(long id, BluetoothMapAppParams appParams, 3740326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement currentFolder) throws UnsupportedEncodingException { 3741326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Log print out of application parameters set 3742326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D && appParams != null) { 3743326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG,"TYPE_MESSAGE (GET): Attachment = " + appParams.getAttachment() + 3744326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ", Charset = " + appParams.getCharset() + 3745326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ", FractionRequest = " + appParams.getFractionRequest()); 3746326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3747326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3748326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Throw exception if requester NATIVE charset for Email 3749326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Exception is caught by MapObexServer sendGetMessageResp 3750326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 3751326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("EMAIL charset not UTF-8"); 3752326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3753326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapbMessageEmail message = new BluetoothMapbMessageEmail(); 37545a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 37555a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, "_ID = " 37565a60e47497f21f64e6d79420dc4c56c1907df22akschulz + id, null, null); 375728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 37585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) 37595a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 37605a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement folderElement; 37615a60e47497f21f64e6d79420dc4c56c1907df22akschulz FileInputStream is = null; 37625a60e47497f21f64e6d79420dc4c56c1907df22akschulz ParcelFileDescriptor fd = null; 37635a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 37645a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Handle fraction requests 37655a60e47497f21f64e6d79420dc4c56c1907df22akschulz int fractionRequest = appParams.getFractionRequest(); 37665a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fractionRequest != BluetoothMapAppParams.INVALID_VALUE_PARAMETER) { 37675a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Fraction requested 37685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) { 37695a60e47497f21f64e6d79420dc4c56c1907df22akschulz String fractionStr = (fractionRequest == 0) ? "FIRST" : "NEXT"; 37705a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.v(TAG, "getEmailMessage - FractionRequest " + fractionStr 37715a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " - send compete message" ); 37725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 37735a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Check if message is complete and if not - request message from server 37745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.getString(c.getColumnIndex( 37755a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.RECEPTION_STATE)).equalsIgnoreCase( 37765a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.RECEPTION_STATE_COMPLETE) == false) { 37775a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: request message from server 37785a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, "getEmailMessage - receptionState not COMPLETE - Not Implemented!" ); 37795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 37805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 37815a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set read status: 37825a60e47497f21f64e6d79420dc4c56c1907df22akschulz String read = c.getString( 37835a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_READ)); 37845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read != null && read.equalsIgnoreCase("1")) 37855a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 37865a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 37875a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 37885a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37895a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set message type: 37905a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.EMAIL); 37915a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 37925a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set folder: 37935a60e47497f21f64e6d79420dc4c56c1907df22akschulz long folderId = c.getLong( 37945a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.FOLDER_ID)); 37955a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderElement = currentFolder.getFolderById(folderId); 37965a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setCompleteFolder(folderElement.getFullPath()); 37975a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37985a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set recipient: 37995a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameEmail = c.getString( 38005a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.TO_LIST)); 38015a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(nameEmail); 38025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 38035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Recipient count= " + tokens.length); 38045a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 38055a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 38065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Recipient = " + tokens[i].toString()); 38075a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 38085a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 38095a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 38105a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(name, name, null, emails, null, null); 38115a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 38125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38135a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38145a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38155a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set originator: 38165a60e47497f21f64e6d79420dc4c56c1907df22akschulz nameEmail = c.getString(c.getColumnIndex(BluetoothMapContract.MessageColumns.FROM_LIST)); 38175a60e47497f21f64e6d79420dc4c56c1907df22akschulz tokens = Rfc822Tokenizer.tokenize(nameEmail); 38185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 38195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Originator count= " + tokens.length); 38205a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 38215a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 38225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Originator = " + tokens[i].toString()); 38235a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 38245a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 38255a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 38265a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(name, name, null, emails, null, null); 38275a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 38285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 38315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 3832326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 38335a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Find out if we get attachments 38345a60e47497f21f64e6d79420dc4c56c1907df22akschulz String attStr = (appParams.getAttachment() == 0) ? 38355a60e47497f21f64e6d79420dc4c56c1907df22akschulz "/" + BluetoothMapContract.FILE_MSG_NO_ATTACHMENTS : ""; 38365a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Uri.parse(contentUri + "/" + id + attStr); 38375a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38385a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Get email message body content 38395a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 38405a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 38415a60e47497f21f64e6d79420dc4c56c1907df22akschulz fd = mResolver.openFileDescriptor(uri, "r"); 38425a60e47497f21f64e6d79420dc4c56c1907df22akschulz is = new FileInputStream(fd.getFileDescriptor()); 38435a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder email = new StringBuilder(""); 38445a60e47497f21f64e6d79420dc4c56c1907df22akschulz byte[] buffer = new byte[1024]; 38455a60e47497f21f64e6d79420dc4c56c1907df22akschulz while((count = is.read(buffer)) != -1) { 38465a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Handle breaks within a UTF8 character 38475a60e47497f21f64e6d79420dc4c56c1907df22akschulz email.append(new String(buffer,0,count)); 38485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Email part = " 38495a60e47497f21f64e6d79420dc4c56c1907df22akschulz + new String(buffer,0,count) 38505a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " count=" + count); 38515a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38525a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set email message body: 38535a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setEmailBody(email.toString()); 38545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (FileNotFoundException e) { 38555a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, e); 38565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NullPointerException e) { 38575a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, e); 38585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (IOException e) { 38595a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, e); 38605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 38615a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 38625a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(is != null) is.close(); 38635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (IOException e) {} 38645a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 38655a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(fd != null) fd.close(); 38665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (IOException e) {} 3867326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 38685a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 3869326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 38705a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 38715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 38725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38735a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("EMAIL handle not found"); 38745a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38755a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 38765a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 38775a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param id the content provider id for the message to fetch. 38785a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param appParams The application parameter object received from the client. 38795a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return a byte[] containing the UTF-8 encoded bMessage to send to the client. 38805a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @throws UnsupportedEncodingException if UTF-8 is not supported, 38815a60e47497f21f64e6d79420dc4c56c1907df22akschulz * which is guaranteed to be supported on an android device 38825a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 38835a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38845a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 38855a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 38865a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param id the content provider id for the message to fetch. 38875a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param appParams The application parameter object received from the client. 38885a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 38895a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @throws UnsupportedEncodingException if UTF-8 is not supported, 38905a60e47497f21f64e6d79420dc4c56c1907df22akschulz * which is guaranteed to be supported on an android device 38915a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 38925a60e47497f21f64e6d79420dc4c56c1907df22akschulz public byte[] getIMMessage(long id, 38935a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams appParams, 38945a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement folderElement) 38955a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws UnsupportedEncodingException { 38965a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId, folderId; 3897326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 38985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 38995a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException( 39005a60e47497f21f64e6d79420dc4c56c1907df22akschulz "IM charset native not allowed for IM - must be utf-8"); 39015a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39025a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime message = new BluetoothMapbMessageMime(); 39035a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 39045a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, 39055a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_MESSAGE_PROJECTION, "_ID = " + id, null, null); 39065a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor contacts = null; 39075a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 39085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) { 39095a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.IM); 39105a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 39115a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39125a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The IM message info: 39135a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = 39145a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getInt(c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_READ)); 39155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read == 1) 39165a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 39175a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 39185a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 39195a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39205a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = 39215a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getInt(c.getColumnIndex(BluetoothMapContract.MessageColumns.THREAD_ID)); 39225a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = 39235a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getLong(c.getColumnIndex(BluetoothMapContract.MessageColumns.FOLDER_ID)); 39245a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderElement = folderElement.getFolderById(folderId); 39255a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setCompleteFolder(folderElement.getFullPath()); 39265a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSubject(c.getString( 39275a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.SUBJECT))); 39285a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setMessageId(c.getString( 39295a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns._ID))); 39305a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setDate(c.getLong( 39315a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.DATE))); 39325a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setTextOnly(c.getInt(c.getColumnIndex( 39335a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.ATTACHMENT_SIZE)) != 0 ? false : true); 39345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39355a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setIncludeAttachments(appParams.getAttachment() == 0 ? false : true); 39365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39375a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getLong(c.getColumnIndex(Mms.DATE_SENT)); - this is never used 39385a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getInt(c.getColumnIndex(Mms.STATUS)); - don't know what this is 39395a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39405a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The parts 39415a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39425a60e47497f21f64e6d79420dc4c56c1907df22akschulz //FIXME use the parts when ready - until then use the body column for text-only 39435a60e47497f21f64e6d79420dc4c56c1907df22akschulz // extractIMParts(id, message); 39445a60e47497f21f64e6d79420dc4c56c1907df22akschulz //FIXME next few lines are temporary code 39455a60e47497f21f64e6d79420dc4c56c1907df22akschulz MimePart part = message.addMimePart(); 39465a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = c.getString((c.getColumnIndex( 39475a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.BODY))).getBytes("UTF-8"); 39485a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = "utf-8"; 39495a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentId = "0"; 39505a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentType = "text/plain"; 39515a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.updateCharset(); 39525a60e47497f21f64e6d79420dc4c56c1907df22akschulz // FIXME end temp code 39535a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39545a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contactsUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVOCONTACT); 39555a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts = mResolver.query(contactsUri, 39565a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONTACT_PROJECTION, 39575a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CONVO_ID 39585a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " = " + threadId, null, null); 39595a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO this will not work for group-chats 39605a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null && contacts.moveToFirst()){ 39615a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = contacts.getString(contacts.getColumnIndex( 39625a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME)); 39635a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btUid[] = new String[1]; 39645a60e47497f21f64e6d79420dc4c56c1907df22akschulz btUid[0]= contacts.getString(contacts.getColumnIndex( 39655a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.X_BT_UID)); 39665a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nickname = contacts.getString(contacts.getColumnIndex( 39675a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NICKNAME)); 39685a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btUci[] = new String[1]; 39695a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btOwnUci[] = new String[1]; 39705a60e47497f21f64e6d79420dc4c56c1907df22akschulz btOwnUci[0] = mAccount.getUciFull(); 39715a60e47497f21f64e6d79420dc4c56c1907df22akschulz btUci[0] = contacts.getString(contacts.getColumnIndex( 39725a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.UCI)); 39735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(folderId == BluetoothMapContract.FOLDER_ID_SENT 39745a60e47497f21f64e6d79420dc4c56c1907df22akschulz || folderId == BluetoothMapContract.FOLDER_ID_OUTBOX) { 39755a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(nickname,name,null, null, btUid, btUci); 39765a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(null, btOwnUci); 39775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39785a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else { 39795a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(nickname,name,null, null, btUid, btUci); 39805a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(null, btOwnUci); 39815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39825a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3983326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 39845a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 3985326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 398628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 39875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 39885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null) contacts.close(); 3989326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 399028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 39915a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("IM handle not found"); 3992326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 39935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39945a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setRemoteFeatureMask(int featureMask){ 39955a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mRemoteFeatureMask = featureMask; 39965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "setRemoteFeatureMask"); 39975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((this.mRemoteFeatureMask & BluetoothMapUtils.MAP_FEATURE_MESSAGE_LISTING_FORMAT_V11_BIT) 39985a60e47497f21f64e6d79420dc4c56c1907df22akschulz == BluetoothMapUtils.MAP_FEATURE_MESSAGE_LISTING_FORMAT_V11_BIT) { 39995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "setRemoteFeatureMask MAP_MESSAGE_LISTING_FORMAT_V11"); 40005a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mMsgListingVersion = BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V11; 40015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40025a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40035a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40045a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int getRemoteFeatureMask(){ 40055a60e47497f21f64e6d79420dc4c56c1907df22akschulz return this.mRemoteFeatureMask; 40065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40075a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40085a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> getSmsMmsConvoList() { 40095a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mMasInstance.getSmsMmsConvoList(); 40105a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40115a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40125a60e47497f21f64e6d79420dc4c56c1907df22akschulz void setSmsMmsConvoList(HashMap<Long,BluetoothMapConvoListingElement> smsMmsConvoList) { 40135a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setSmsMmsConvoList(smsMmsConvoList); 40145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40155a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40165a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> getImEmailConvoList() { 40175a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mMasInstance.getImEmailConvoList(); 40185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40195a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40205a60e47497f21f64e6d79420dc4c56c1907df22akschulz void setImEmailConvoList(HashMap<Long,BluetoothMapConvoListingElement> imEmailConvoList) { 40215a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setImEmailConvoList(imEmailConvoList); 40225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4023fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie} 4024