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; 39fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 405a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.SignedLongLong; 41fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.android.bluetooth.map.BluetoothMapUtils.TYPE; 425a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapbMessageMime.MimePart; 435a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract; 445a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract.ConversationColumns; 45fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.google.android.mms.pdu.CharacterSets; 4614f1f53e829b1d00f6c27618e878b1ebb18df8cckschulzimport com.google.android.mms.pdu.PduHeaders; 47326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 48326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.ByteArrayOutputStream; 4928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulzimport java.io.Closeable; 50326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.FileInputStream; 51326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.FileNotFoundException; 52326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.IOException; 53326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.InputStream; 54326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.io.UnsupportedEncodingException; 55326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.ArrayList; 56326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.Arrays; 575a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.HashMap; 58326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport java.util.List; 59fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 605a60e47497f21f64e6d79420dc4c56c1907df22akschulz@TargetApi(19) 61fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xiepublic class BluetoothMapContent { 625a60e47497f21f64e6d79420dc4c56c1907df22akschulz 63fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final String TAG = "BluetoothMapContent"; 64fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 65326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean D = BluetoothMapService.DEBUG; 66326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean V = BluetoothMapService.VERBOSE; 67fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 685a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Parameter Mask for selection of parameters to return in listings 695a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SUBJECT = 0x00000001; 705a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_DATETIME = 0x00000002; 715a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SENDER_NAME = 0x00000004; 725a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SENDER_ADDRESSING = 0x00000008; 735a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_RECIPIENT_NAME = 0x00000010; 745a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_RECIPIENT_ADDRESSING = 0x00000020; 755a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_TYPE = 0x00000040; 765a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SIZE = 0x00000080; 775a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_RECEPTION_STATUS = 0x00000100; 785a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_TEXT = 0x00000200; 795a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_ATTACHMENT_SIZE = 0x00000400; 805a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_PRIORITY = 0x00000800; 815a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_READ = 0x00001000; 825a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_SENT = 0x00002000; 835a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_PROTECTED = 0x00004000; 845a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_REPLYTO_ADDRESSING = 0x00008000; 855a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Duplicate in proposed spec 865a60e47497f21f64e6d79420dc4c56c1907df22akschulz // private static final int MASK_RECEPTION_STATE = 0x00010000; 875a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_DELIVERY_STATUS = 0x00020000; 885a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_CONVERSATION_ID = 0x00040000; 895a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_CONVERSATION_NAME = 0x00080000; 905a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_FOLDER_TYPE = 0x00100000; 915a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: about to be removed from proposed spec 925a60e47497f21f64e6d79420dc4c56c1907df22akschulz // private static final int MASK_SEQUENCE_NUMBER = 0x00200000; 935a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MASK_ATTACHMENT_MIME = 0x00400000; 945a60e47497f21f64e6d79420dc4c56c1907df22akschulz 955a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_NAME = 0x00000001; 965a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_LAST_ACTIVITY = 0x00000002; 975a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_READ_STATUS = 0x00000004; 985a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_VERSION_COUNTER = 0x00000008; 995a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_CONVO_SUMMARY = 0x00000010; 1005a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PARTTICIPANTS = 0x00000020; 1015a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_UCI = 0x00000040; 1025a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_DISP_NAME = 0x00000080; 1035a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_CHAT_STATE = 0x00000100; 1045a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_LAST_ACTIVITY = 0x00000200; 1055a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_X_BT_UID = 0x00000400; 1065a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_NAME = 0x00000800; 1075a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_PRESENCE = 0x00001000; 1085a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_PRESENCE_TEXT = 0x00002000; 1095a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int CONVO_PARAM_MASK_PART_PRIORITY = 0x00004000; 1105a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1115a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Default values for omitted or 0 parameterMask application parameters */ 1125a60e47497f21f64e6d79420dc4c56c1907df22akschulz // MAP specification states that the default value for parameter mask are 1135a60e47497f21f64e6d79420dc4c56c1907df22akschulz // the #REQUIRED attributes in the DTD, and not all enabled 1145a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long PARAMETER_MASK_ALL_ENABLED = 0xFFFFFFFFL; 1155a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long CONVO_PARAMETER_MASK_ALL_ENABLED = 0xFFFFFFFFL; 1165a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final long CONVO_PARAMETER_MASK_DEFAULT = 1175a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_CONVO_NAME | 1185a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_PARTTICIPANTS | 1195a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_PART_UCI | 1205a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_PARAM_MASK_PART_DISP_NAME; 1215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1235a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1245a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1255a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int FILTER_READ_STATUS_UNREAD_ONLY = 0x01; 1265a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int FILTER_READ_STATUS_READ_ONLY = 0x02; 1275a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int FILTER_READ_STATUS_ALL = 0x00; 128fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 129fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Type of MMS address. From Telephony.java it must be one of PduHeaders.BCC, */ 130fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* PduHeaders.CC, PduHeaders.FROM, PduHeaders.TO. These are from PduHeaders.java */ 1315a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_FROM = 0x89; 1325a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_TO = 0x97; 1335a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_BCC = 0x81; 1345a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int MMS_CC = 0x82; 135fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1361ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta /* OMA-TS-MMS-ENC defined many types in X-Mms-Message-Type. 1371ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta Only m-send-req (128) m-retrieve-conf (132), m-notification-ind (130) 1381ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta are interested by user */ 1391ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta private static final String INTERESTED_MESSAGE_TYPE_CLAUSE = String 1401ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta .format("( %s = %d OR %s = %d OR %s = %d )", Mms.MESSAGE_TYPE, 1411ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta PduHeaders.MESSAGE_TYPE_SEND_REQ, Mms.MESSAGE_TYPE, 1421ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF, Mms.MESSAGE_TYPE, 1431ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND ); 1441ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta 145326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public static final String INSERT_ADDRES_TOKEN = "insert-address-token"; 146326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1475a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final Context mContext; 1485a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final ContentResolver mResolver; 1495a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final String mBaseUri; 1505a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final BluetoothMapAccountItem mAccount; 1515a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* The MasInstance reference is used to update persistent (over a connection) version counters*/ 1525a60e47497f21f64e6d79420dc4c56c1907df22akschulz private final BluetoothMapMasInstance mMasInstance; 1535a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String mMessageVersion = BluetoothMapUtils.MAP_V10_STR; 1545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1555a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mRemoteFeatureMask = BluetoothMapUtils.MAP_FEATURE_DEFAULT_BITMASK; 1565a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mMsgListingVersion = BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V10; 157fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 158fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static final String[] SMS_PROJECTION = new String[] { 159fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BaseColumns._ID, 160fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.THREAD_ID, 161fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.ADDRESS, 162fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.BODY, 163fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.DATE, 164fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.READ, 165fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.TYPE, 166fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.STATUS, 167fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.LOCKED, 168326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms.ERROR_CODE 169fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 170fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 171fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static final String[] MMS_PROJECTION = new String[] { 172fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BaseColumns._ID, 173fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.THREAD_ID, 174fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_ID, 175fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_SIZE, 176fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.SUBJECT, 177fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.CONTENT_TYPE, 178fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.TEXT_ONLY, 179fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.DATE, 180fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.DATE_SENT, 181fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.READ, 182fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_BOX, 183fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.STATUS, 1845a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.PRIORITY, 1855a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 1865a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1875a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] SMS_CONVO_PROJECTION = new String[] { 1885a60e47497f21f64e6d79420dc4c56c1907df22akschulz BaseColumns._ID, 1895a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.THREAD_ID, 1905a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.ADDRESS, 1915a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.DATE, 1925a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.READ, 1935a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.TYPE, 1945a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.STATUS, 1955a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.LOCKED, 1965a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.ERROR_CODE 1975a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 1985a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1995a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] MMS_CONVO_PROJECTION = new String[] { 2005a60e47497f21f64e6d79420dc4c56c1907df22akschulz BaseColumns._ID, 2015a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.THREAD_ID, 2025a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_ID, 2035a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_SIZE, 2045a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.SUBJECT, 2055a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.CONTENT_TYPE, 2065a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.TEXT_ONLY, 2075a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.DATE, 2085a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.DATE_SENT, 2095a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.READ, 2105a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_BOX, 2115a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.STATUS, 2125a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.PRIORITY, 2135a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.Addr.ADDRESS 214fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 215fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2165a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* CONVO LISTING projections and column indexes */ 2175a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String[] MMS_SMS_THREAD_PROJECTION = { 2185a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads._ID, 2195a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.DATE, 2205a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.SNIPPET, 2215a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.SNIPPET_CHARSET, 2225a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.READ, 2235a60e47497f21f64e6d79420dc4c56c1907df22akschulz Threads.RECIPIENT_IDS 2245a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 2255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2265a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String[] CONVO_VERSION_PROJECTION = new String[] { 2275a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Thread information */ 2285a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.THREAD_ID, 2295a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.THREAD_NAME, 2305a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.READ_STATUS, 2315a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.LAST_THREAD_ACTIVITY, 2325a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConversationColumns.SUMMARY, 233fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 234fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2355a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Optimize the Cursor access to avoid the need to do a getColumnIndex() */ 2365a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_ID; 2375a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_DATE; 2385a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_SNIPPET; 2395a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_SNIPPET_CS; 2405a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_READ; 2415a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final int MMS_SMS_THREAD_COL_RECIPIENT_IDS; 2425a60e47497f21f64e6d79420dc4c56c1907df22akschulz static { 2435a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: This might not work, if the projection is mapped in the content provider... 2445a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Change to init at first query? (Current use in the AOSP code is hard coded values 2455a60e47497f21f64e6d79420dc4c56c1907df22akschulz // unrelated to the projection used) 2465a60e47497f21f64e6d79420dc4c56c1907df22akschulz List<String> projection = Arrays.asList(MMS_SMS_THREAD_PROJECTION); 2475a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_ID = projection.indexOf(Threads._ID); 2485a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_DATE = projection.indexOf(Threads.DATE); 2495a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_SNIPPET = projection.indexOf(Threads.SNIPPET); 2505a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_SNIPPET_CS = projection.indexOf(Threads.SNIPPET_CHARSET); 2515a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_READ = projection.indexOf(Threads.READ); 2525a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_SMS_THREAD_COL_RECIPIENT_IDS = projection.indexOf(Threads.RECIPIENT_IDS); 2535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 255fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private class FilterInfo { 2565a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_SMS = 0; 2575a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_MMS = 1; 2585a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_EMAIL = 2; 2595a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static final int TYPE_IM = 3; 260326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2615a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Change to ENUM, to ensure correct usage 262326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int mMsgType = TYPE_SMS; 263326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int mPhoneType = 0; 264326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String mPhoneNum = null; 265326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String mPhoneAlphaTag = null; 266326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /*column indices used to optimize queries */ 2675a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColId = -1; 2685a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColDate = -1; 2695a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColBody = -1; 2705a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColSubject = -1; 2715a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColFolder = -1; 2725a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColRead = -1; 2735a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColSize = -1; 2745a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColFromAddress = -1; 2755a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColToAddress = -1; 2765a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColCcAddress = -1; 2775a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColBccAddress = -1; 2785a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColReplyTo = -1; 2795a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAccountId = -1; 2805a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAttachment = -1; 2815a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAttachmentSize = -1; 2825a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColAttachmentMime = -1; 2835a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColPriority = -1; 2845a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColProtected = -1; 2855a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColReception = -1; 2865a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColDelivery = -1; 2875a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColThreadId = -1; 2885a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMessageColThreadName = -1; 2895a60e47497f21f64e6d79420dc4c56c1907df22akschulz 290326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColFolder = -1; 291326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mSmsColRead = -1; 2925a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColId = -1; 2935a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColSubject = -1; 2945a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColAddress = -1; 2955a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColDate = -1; 2965a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColType = -1; 2975a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mSmsColThreadId = -1; 2985a60e47497f21f64e6d79420dc4c56c1907df22akschulz 299326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColRead = -1; 3005a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMmsColFolder = -1; 301326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColAttachmentSize = -1; 302326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColTextOnly = -1; 303326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColId = -1; 304326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColSize = -1; 305326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColDate = -1; 306326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int mMmsColSubject = -1; 3075a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mMmsColThreadId = -1; 3085a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3095a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColConvoId = -1; 3105a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColLastActivity = -1; 3115a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColName = -1; 3125a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColRead = -1; 3135a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColVersionCounter = -1; 3145a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColSummary = -1; 3155a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColBtUid = -1; 3165a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColChatState = -1; 3175a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColContactUci = -1; 3185a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColNickname = -1; 3195a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColLastActive = -1; 3205a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColName = -1; 3215a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPresenceState = -1; 3225a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPresenceText = -1; 3235a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPriority = -1; 3245a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3265a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setMessageColumns(Cursor c) { 3275a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColId = c.getColumnIndex( 3285a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns._ID); 3295a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColDate = c.getColumnIndex( 3305a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DATE); 3315a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColSubject = c.getColumnIndex( 3325a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.SUBJECT); 3335a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColFolder = c.getColumnIndex( 3345a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FOLDER_ID); 3355a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColRead = c.getColumnIndex( 3365a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_READ); 3375a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColSize = c.getColumnIndex( 3385a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.MESSAGE_SIZE); 3395a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColFromAddress = c.getColumnIndex( 3405a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FROM_LIST); 3415a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColToAddress = c.getColumnIndex( 3425a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.TO_LIST); 3435a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColAttachment = c.getColumnIndex( 3445a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_ATTACHMENT); 3455a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColAttachmentSize = c.getColumnIndex( 3465a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.ATTACHMENT_SIZE); 3475a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColPriority = c.getColumnIndex( 3485a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY); 3495a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColProtected = c.getColumnIndex( 3505a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_PROTECTED); 3515a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColReception = c.getColumnIndex( 3525a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.RECEPTION_STATE); 3535a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColDelivery = c.getColumnIndex( 3545a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DEVILERY_STATE); 3555a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColThreadId = c.getColumnIndex( 3565a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_ID); 3575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3585a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3595a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setEmailMessageColumns(Cursor c) { 3605a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMessageColumns(c); 3615a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColCcAddress = c.getColumnIndex( 3625a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.CC_LIST); 3635a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColBccAddress = c.getColumnIndex( 3645a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.BCC_LIST); 3655a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColReplyTo = c.getColumnIndex( 3665a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.REPLY_TO_LIST); 3675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3685a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3695a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setImMessageColumns(Cursor c) { 3705a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMessageColumns(c); 3715a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColThreadName = c.getColumnIndex( 3725a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_NAME); 3735a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColAttachmentMime = c.getColumnIndex( 3745a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.ATTACHMENT_MINE_TYPES); 3755a60e47497f21f64e6d79420dc4c56c1907df22akschulz //TODO this is temporary as text should come from parts table instead 3765a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageColBody = c.getColumnIndex(BluetoothMapContract.MessageColumns.BODY); 3775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3795a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3805a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setEmailImConvoColumns(Cursor c) { 3815a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColConvoId = c.getColumnIndex( 3825a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.THREAD_ID); 3835a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColLastActivity = c.getColumnIndex( 3845a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY); 3855a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColName = c.getColumnIndex( 3865a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.THREAD_NAME); 3875a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColRead = c.getColumnIndex( 3885a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.READ_STATUS); 3895a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColVersionCounter = c.getColumnIndex( 3905a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.VERSION_COUNTER); 3915a60e47497f21f64e6d79420dc4c56c1907df22akschulz mConvoColSummary = c.getColumnIndex( 3925a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConversationColumns.SUMMARY); 3935a60e47497f21f64e6d79420dc4c56c1907df22akschulz setEmailImConvoContactColumns(c); 3945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3955a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3965a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setEmailImConvoContactColumns(Cursor c){ 3975a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColBtUid = c.getColumnIndex( 3985a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.X_BT_UID); 3995a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColChatState = c.getColumnIndex( 4005a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CHAT_STATE); 4015a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColContactUci = c.getColumnIndex( 4025a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.UCI); 4035a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColNickname = c.getColumnIndex( 4045a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NICKNAME); 4055a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColLastActive = c.getColumnIndex( 4065a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.LAST_ACTIVE); 4075a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColName = c.getColumnIndex( 4085a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME); 4095a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPresenceState = c.getColumnIndex( 4105a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.PRESENCE_STATE); 4115a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPresenceText = c.getColumnIndex( 4125a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.STATUS_TEXT); 4135a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPriority = c.getColumnIndex( 4145a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.PRIORITY); 415326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 416326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 417326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void setSmsColumns(Cursor c) { 418326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColId = c.getColumnIndex(BaseColumns._ID); 419326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColFolder = c.getColumnIndex(Sms.TYPE); 420326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColRead = c.getColumnIndex(Sms.READ); 421326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColSubject = c.getColumnIndex(Sms.BODY); 422326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mSmsColAddress = c.getColumnIndex(Sms.ADDRESS); 4235a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsColDate = c.getColumnIndex(Sms.DATE); 4245a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsColType = c.getColumnIndex(Sms.TYPE); 4255a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsColThreadId= c.getColumnIndex(Sms.THREAD_ID); 426326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 427326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 428326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void setMmsColumns(Cursor c) { 429326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColId = c.getColumnIndex(BaseColumns._ID); 430326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColFolder = c.getColumnIndex(Mms.MESSAGE_BOX); 431326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColRead = c.getColumnIndex(Mms.READ); 432326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColAttachmentSize = c.getColumnIndex(Mms.MESSAGE_SIZE); 433326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColTextOnly = c.getColumnIndex(Mms.TEXT_ONLY); 434326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColSize = c.getColumnIndex(Mms.MESSAGE_SIZE); 435326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColDate = c.getColumnIndex(Mms.DATE); 436326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMmsColSubject = c.getColumnIndex(Mms.SUBJECT); 4375a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMmsColThreadId = c.getColumnIndex(Mms.THREAD_ID); 438326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 439fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 440fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4415a60e47497f21f64e6d79420dc4c56c1907df22akschulz public BluetoothMapContent(final Context context, BluetoothMapAccountItem account, 4425a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMasInstance mas) { 443fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mContext = context; 444fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mResolver = mContext.getContentResolver(); 4455a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance = mas; 446fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (mResolver == null) { 447326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "getContentResolver failed"); 448fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 449fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(account != null){ 4515a60e47497f21f64e6d79420dc4c56c1907df22akschulz mBaseUri = account.mBase_uri + "/"; 4525a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount = account; 4535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 4545a60e47497f21f64e6d79420dc4c56c1907df22akschulz mBaseUri = null; 4555a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount = null; 4565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 45828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz private static void close(Closeable c) { 459fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 46028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null) c.close(); 461fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 462fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 463fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 464fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setProtected(BluetoothMapMessageListingElement e, Cursor c, 465326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 466fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_PROTECTED) != 0) { 467fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String protect = "no"; 4685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 4695a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 4705a60e47497f21f64e6d79420dc4c56c1907df22akschulz int flagProtected = c.getInt(fi.mMessageColProtected); 471326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (flagProtected == 1) { 472326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde protect = "yes"; 473326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 474326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 475326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setProtected: " + protect + "\n"); 476fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setProtect(protect); 477fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 478fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 479fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 480326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void setThreadId(BluetoothMapMessageListingElement e, Cursor c, 481326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 4825a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_CONVERSATION_ID) != 0) { 4835a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId = 0; 4845a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE type = TYPE.SMS_GSM; // Just used for handle encoding 4855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 4865a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getLong(fi.mSmsColThreadId); 4875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 4885a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getLong(fi.mMmsColThreadId); 4895a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.MMS;// Just used for handle encoding 4905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 4915a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 4925a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getLong(fi.mMessageColThreadId); 4935a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.EMAIL;// Just used for handle encoding 4945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4955a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setThreadId(threadId,type); 496326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setThreadId: " + threadId + "\n"); 497326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 498326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 499326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 5005a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setThreadName(BluetoothMapMessageListingElement e, Cursor c, 5015a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 5025a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Maybe this should be valid for SMS/MMS 5035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_CONVERSATION_NAME) != 0) { 5045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_IM) { 5055a60e47497f21f64e6d79420dc4c56c1907df22akschulz String threadName = c.getString(fi.mMessageColThreadName); 5065a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setThreadName(threadName); 5075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setThreadName: " + threadName + "\n"); 5085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5105a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5115a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5125a60e47497f21f64e6d79420dc4c56c1907df22akschulz 513fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSent(BluetoothMapMessageListingElement e, Cursor c, 514326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 515fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENT) != 0) { 516fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = 0; 517326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 518326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgType = c.getInt(fi.mSmsColFolder); 519326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 520326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgType = c.getInt(fi.mMmsColFolder); 5215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 5225a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 5235a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgType = c.getInt(fi.mMessageColFolder); 524fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 525fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String sent = null; 526fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 2) { 527fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sent = "yes"; 528fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 529fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sent = "no"; 530fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 531326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSent: " + sent); 532fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSent(sent); 533fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 534fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 535fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 536fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRead(BluetoothMapMessageListingElement e, Cursor c, 537326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 53870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz int read = 0; 539326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 540326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde read = c.getInt(fi.mSmsColRead); 541326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 542326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde read = c.getInt(fi.mMmsColRead); 5435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 5445a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 5455a60e47497f21f64e6d79420dc4c56c1907df22akschulz read = c.getInt(fi.mMessageColRead); 54670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 54770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz String setread = null; 548326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 549326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setRead: " + setread); 550326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setRead((read==1?true:false), ((ap.getParameterMask() & MASK_READ) != 0)); 551fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 5525a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setConvoRead(BluetoothMapConvoListingElement e, Cursor c, 5535a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 5545a60e47497f21f64e6d79420dc4c56c1907df22akschulz String setread = null; 5555a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = 0; 5565a60e47497f21f64e6d79420dc4c56c1907df22akschulz read = c.getInt(fi.mConvoColRead); 5575a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5585a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setRead: " + setread); 5605a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setRead((read==1?true:false), ((ap.getParameterMask() & MASK_READ) != 0)); 5615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 562fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 563fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setPriority(BluetoothMapMessageListingElement e, Cursor c, 564326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 565fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_PRIORITY) != 0) { 566326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String priority = "no"; 5675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 5685a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 5695a60e47497f21f64e6d79420dc4c56c1907df22akschulz int highPriority = c.getInt(fi.mMessageColPriority); 570326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (highPriority == 1) { 571326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde priority = "yes"; 572326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 573326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 57414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz int pri = 0; 575326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_MMS) { 57614f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz pri = c.getInt(c.getColumnIndex(Mms.PRIORITY)); 57714f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 57814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz if (pri == PduHeaders.PRIORITY_HIGH) { 57914f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz priority = "yes"; 58014f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 581326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setPriority: " + priority); 582fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setPriority(priority); 583fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 584fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 585fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 58670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 58770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * For SMS we set the attachment size to 0, as all data will be text data, hence 58870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * attachments for SMS is not possible. 58970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * For MMS all data is actually attachments, hence we do set the attachment size to 59070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * the total message size. To provide a more accurate attachment size, one could 59170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * extract the length (in bytes) of the text parts. 59270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 5935a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setAttachment(BluetoothMapMessageListingElement e, Cursor c, 594326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 595fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_ATTACHMENT_SIZE) != 0) { 596fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int size = 0; 5975a60e47497f21f64e6d79420dc4c56c1907df22akschulz String attachmentMimeTypes = null; 598326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_MMS) { 599326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(c.getInt(fi.mMmsColTextOnly) == 0) { 600326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mMmsColAttachmentSize); 6018b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if(size <= 0) { 6028b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // We know there are attachments, since it is not TextOnly 6038b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Hence the size in the database must be wrong. 6048b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Set size to 1 to indicate to the client, that attachments are present 6058b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, size reported as: " + size 6068b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 6078b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; 6088b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde } 6095a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Add handling of attachemnt mime types 610326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 611326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 6125a60e47497f21f64e6d79420dc4c56c1907df22akschulz int attachment = c.getInt(fi.mMessageColAttachment); 6135a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = c.getInt(fi.mMessageColAttachmentSize); 614326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(attachment == 1 && size == 0) { 6158b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, attachment size reported as: " + size 6168b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 6178b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; /* Ensure we indicate we have attachments in the size, if the 618326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde message has attachments, in case the e-mail client do not 619326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde report a size */ 620326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 6215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 6225a60e47497f21f64e6d79420dc4c56c1907df22akschulz int attachment = c.getInt(fi.mMessageColAttachment); 6235a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = c.getInt(fi.mMessageColAttachmentSize); 6245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(attachment == 1 && size == 0) { 6255a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = 1; /* Ensure we indicate we have attachments in the size, it the 6265a60e47497f21f64e6d79420dc4c56c1907df22akschulz message has attachments, in case the e-mail client do not 6275a60e47497f21f64e6d79420dc4c56c1907df22akschulz report a size */ 6285a60e47497f21f64e6d79420dc4c56c1907df22akschulz attachmentMimeTypes = c.getString(fi.mMessageColAttachmentMime); 6295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 63070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 6315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setAttachmentSize: " + size + "\n" + 6325a60e47497f21f64e6d79420dc4c56c1907df22akschulz "setAttachmentMimeTypes: " + attachmentMimeTypes ); 633fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setAttachmentSize(size); 6345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 6355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if( (mMsgListingVersion > BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V10) 6365a60e47497f21f64e6d79420dc4c56c1907df22akschulz && ((ap.getParameterMask() & MASK_ATTACHMENT_MIME) != 0) ){ 6375a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setAttachmentMimeTypes(attachmentMimeTypes); 6385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 639fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 640fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 641fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 642fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setText(BluetoothMapMessageListingElement e, Cursor c, 643326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 644fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_TEXT) != 0) { 645fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String hasText = ""; 646326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 647fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 648326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 649326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int textOnly = c.getInt(fi.mMmsColTextOnly); 650fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (textOnly == 1) { 651fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 652fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 653326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 6545a60e47497f21f64e6d79420dc4c56c1907df22akschulz String text = getTextPartsMms(mResolver, id); 655fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (text != null && text.length() > 0) { 656fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "yes"; 657fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 658fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie hasText = "no"; 659fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 660fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 6615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 6625a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 663326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde hasText = "yes"; 664fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 665326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setText: " + hasText); 666fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setText(hasText); 667fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 668fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 669fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 670fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setReceptionStatus(BluetoothMapMessageListingElement e, Cursor c, 671fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 672fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECEPTION_STATUS) != 0) { 673fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String status = "complete"; 674326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setReceptionStatus: " + status); 675fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setReceptionStatus(status); 676fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 677fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 678fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 6795a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setDeliveryStatus(BluetoothMapMessageListingElement e, Cursor c, 6805a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 6815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_DELIVERY_STATUS) != 0) { 6825a60e47497f21f64e6d79420dc4c56c1907df22akschulz String deliveryStatus = "delivered"; 6835a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Should be handled for SMS and MMS as well 6845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 6855a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 6865a60e47497f21f64e6d79420dc4c56c1907df22akschulz deliveryStatus = c.getString(fi.mMessageColDelivery); 6875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setDeliveryStatus: " + deliveryStatus); 6895a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setDeliveryStatus(deliveryStatus); 6905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 693fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSize(BluetoothMapMessageListingElement e, Cursor c, 694fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 695fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SIZE) != 0) { 696fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int size = 0; 697326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 698326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String subject = c.getString(fi.mSmsColSubject); 699fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie size = subject.length(); 700326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 701326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde size = c.getInt(fi.mMmsColSize); 702cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //MMS complete size = attachment_size + subject length 703cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String subject = e.getSubject(); 704cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (subject == null || subject.length() == 0 ) { 705cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // Handle setSubject if not done case 706cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta setSubject(e, c, fi, ap); 707cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 708cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (subject != null && subject.length() != 0 ) 709cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta size += subject.length(); 7105a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 7115a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 7125a60e47497f21f64e6d79420dc4c56c1907df22akschulz size = c.getInt(fi.mMessageColSize); 713fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 7148b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if(size <= 0) { 7158b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // A message cannot have size 0 7168b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Hence the size in the database must be wrong. 7178b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde // Set size to 1 to indicate to the client, that the message has content. 7188b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde if (D) Log.d(TAG, "Error in message database, size reported as: " + size 7198b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde + " Changing size to 1"); 7208b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde size = 1; 7218b17c7f2f98bbea105a41a0bb962a4581b7cce5cCasper Bonde } 722326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSize: " + size); 723fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSize(size); 724fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 725fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 726fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 7275a60e47497f21f64e6d79420dc4c56c1907df22akschulz private TYPE getType(Cursor c, FilterInfo fi) { 7285a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE type = null; 7292e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (V) Log.d(TAG, "getType: for filterMsgType" + fi.mMsgType); 7305a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 7312e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (V) Log.d(TAG, "getType: phoneType for SMS " + fi.mPhoneType); 7322e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (fi.mPhoneType == TelephonyManager.PHONE_TYPE_CDMA) { 7335a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.SMS_CDMA; 7342e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else { 7352e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta type = TYPE.SMS_GSM; 7365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 7385a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.MMS; 7395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 7405a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.EMAIL; 7415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 7425a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = TYPE.IM; 7435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "getType: " + type); 7455a60e47497f21f64e6d79420dc4c56c1907df22akschulz 7465a60e47497f21f64e6d79420dc4c56c1907df22akschulz return type; 7475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7485a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setFolderType(BluetoothMapMessageListingElement e, Cursor c, 7495a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 7505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getParameterMask() & MASK_FOLDER_TYPE) != 0) { 7515a60e47497f21f64e6d79420dc4c56c1907df22akschulz String folderType = null; 7525a60e47497f21f64e6d79420dc4c56c1907df22akschulz int folderId = 0; 753326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 7545a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = c.getInt(fi.mSmsColFolder); 7555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId == 1) 7565a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_INBOX; 7575a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 2) 7585a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_SENT; 7595a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 3) 7605a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DRAFT; 7615a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 4 || folderId == 5 || folderId == 6) 7625a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OUTBOX; 7635a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 7645a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DELETED; 765326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 7665a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = c.getInt(fi.mMmsColFolder); 7675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId == 1) 7685a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_INBOX; 7695a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 2) 7705a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_SENT; 7715a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 3) 7725a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DRAFT; 7735a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == 4) 7745a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OUTBOX; 7755a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 7765a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DELETED; 777326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 7785a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: need to find name from id and then set folder type 7795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 7805a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = c.getInt(fi.mMessageColFolder); 7815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId == BluetoothMapContract.FOLDER_ID_INBOX) 7825a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_INBOX; 7835a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_SENT) 7845a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_SENT; 7855a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_DRAFT) 7865a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DRAFT; 7875a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_OUTBOX) 7885a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OUTBOX; 7895a60e47497f21f64e6d79420dc4c56c1907df22akschulz else if (folderId == BluetoothMapContract.FOLDER_ID_DELETED) 7905a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_DELETED; 7915a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 7925a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderType = BluetoothMapContract.FOLDER_NAME_OTHER; 7935a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "setFolderType: " + folderType); 7955a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setFolderType(folderType); 7965a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7985a60e47497f21f64e6d79420dc4c56c1907df22akschulz 7995a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String getRecipientNameEmail(BluetoothMapMessageListingElement e, 8005a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c, 8015a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi) { 8025a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8035a60e47497f21f64e6d79420dc4c56c1907df22akschulz String toAddress, ccAddress, bccAddress; 8045a60e47497f21f64e6d79420dc4c56c1907df22akschulz toAddress = c.getString(fi.mMessageColToAddress); 8055a60e47497f21f64e6d79420dc4c56c1907df22akschulz ccAddress = c.getString(fi.mMessageColCcAddress); 8065a60e47497f21f64e6d79420dc4c56c1907df22akschulz bccAddress = c.getString(fi.mMessageColBccAddress); 8075a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8085a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder sb = new StringBuilder(); 8095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (toAddress != null) { 8105a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(toAddress); 8115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "toName count= " + tokens.length); 8135a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8145a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8155a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8165a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ToName = " + tokens[i].toString()); 8175a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 8185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8195a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(name); 8205a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8215a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8245a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (ccAddress != null) { 8265a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 8275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (ccAddress != null) { 8305a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(ccAddress); 8315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "ccName count= " + tokens.length); 8335a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8345a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8355a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8365a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ccName = " + tokens[i].toString()); 8375a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 8385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8395a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(name); 8405a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8415a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8425a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (bccAddress != null) { 8455a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 8465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (bccAddress != null) { 8495a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(bccAddress); 8505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "bccName count= " + tokens.length); 8525a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8535a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8545a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "bccName = " + tokens[i].toString()); 8565a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 8575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8585a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(name); 8595a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8605a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 862fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 863fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 8645a60e47497f21f64e6d79420dc4c56c1907df22akschulz return sb.toString(); 865fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 866fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 8675a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String getRecipientAddressingEmail(BluetoothMapMessageListingElement e, 8685a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c, 8695a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi) { 870326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String toAddress, ccAddress, bccAddress; 8715a60e47497f21f64e6d79420dc4c56c1907df22akschulz toAddress = c.getString(fi.mMessageColToAddress); 8725a60e47497f21f64e6d79420dc4c56c1907df22akschulz ccAddress = c.getString(fi.mMessageColCcAddress); 8735a60e47497f21f64e6d79420dc4c56c1907df22akschulz bccAddress = c.getString(fi.mMessageColBccAddress); 874326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 8755a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder sb = new StringBuilder(); 876326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (toAddress != null) { 8775a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(toAddress); 8785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8795a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "toAddress count= " + tokens.length); 8805a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 8815a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 8825a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 8835a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ToAddress = " + tokens[i].toString()); 8845a60e47497f21f64e6d79420dc4c56c1907df22akschulz String email = tokens[i].getAddress(); 8855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 8865a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(email); 8875a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 8885a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 8895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8915a60e47497f21f64e6d79420dc4c56c1907df22akschulz 892326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (ccAddress != null) { 8935a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 894326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 895326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 896326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (ccAddress != null) { 8975a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(ccAddress); 8985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 8995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "ccAddress count= " + tokens.length); 9005a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 9015a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 9025a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 9035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "ccAddress = " + tokens[i].toString()); 9045a60e47497f21f64e6d79420dc4c56c1907df22akschulz String email = tokens[i].getAddress(); 9055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 9065a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(email); 9075a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 9085a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 9095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9105a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 911326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (bccAddress != null) { 9125a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append("; "); 913326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 914326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 915326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (bccAddress != null) { 9165a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(bccAddress); 9175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 9185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "bccAddress count= " + tokens.length); 9195a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 9205a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 9215a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 9225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "bccAddress = " + tokens[i].toString()); 9235a60e47497f21f64e6d79420dc4c56c1907df22akschulz String email = tokens[i].getAddress(); 9245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) sb.append("; "); //Delimiter 9255a60e47497f21f64e6d79420dc4c56c1907df22akschulz sb.append(email); 9265a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 9275a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 9285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 930326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 9315a60e47497f21f64e6d79420dc4c56c1907df22akschulz return sb.toString(); 932326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 933326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 934fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRecipientAddressing(BluetoothMapMessageListingElement e, Cursor c, 935fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 936fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECIPIENT_ADDRESSING) != 0) { 937326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String address = null; 938326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 939326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 940cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (msgType == Sms.MESSAGE_TYPE_INBOX ) { 941326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = fi.mPhoneNum; 942fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 943fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie address = c.getString(c.getColumnIndex(Sms.ADDRESS)); 944fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 945cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if ((address == null) && msgType == Sms.MESSAGE_TYPE_DRAFT) { 946c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker // Fetch address for Drafts folder from "canonical_address" table 947cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta int threadIdInd = c.getColumnIndex(Sms.THREAD_ID); 948cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String threadIdStr = c.getString(threadIdInd); 949c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker // If a draft message has no recipient, it has no thread ID 950c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker // hence threadIdStr could possibly be null 951c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker if (threadIdStr != null) { 952c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker address = getCanonicalAddressSms(mResolver, Integer.valueOf(threadIdStr)); 953c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker } 954cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(V) Log.v(TAG, "threadId = " + threadIdStr + " adress:" + address +"\n"); 955cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 956326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 957fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 958fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie address = getAddressMms(mResolver, id, MMS_TO); 959326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 960326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Might be another way to handle addresses */ 961c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker address = getRecipientAddressingEmail(e, c, fi); 962fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 963326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setRecipientAddressing: " + address); 964326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null) 965326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = ""; 966fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setRecipientAddressing(address); 967fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 968fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 969fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 970fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setRecipientName(BluetoothMapMessageListingElement e, Cursor c, 971fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi, BluetoothMapAppParams ap) { 972fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_RECIPIENT_NAME) != 0) { 973326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = null; 974326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 975326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 976fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType != 1) { 977326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = c.getString(fi.mSmsColAddress); 978326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 9795a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 980fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 981326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = fi.mPhoneAlphaTag; 982fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 983326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 984326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 985326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone; 986326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(e.getRecipientAddressing() != null){ 987326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = getAddressMms(mResolver, id, MMS_TO); 988326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 989326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = e.getRecipientAddressing(); 990326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 991326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 9925a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 993326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 994326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Might be another way to handle address and names */ 9955a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getRecipientNameEmail(e,c,fi); 996fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 997326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setRecipientName: " + name); 998326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(name == null) 999326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = ""; 1000fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setRecipientName(name); 1001fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1002fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1003fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1004fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSenderAddressing(BluetoothMapMessageListingElement e, Cursor c, 1005326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1006fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENDER_ADDRESSING) != 0) { 10075a60e47497f21f64e6d79420dc4c56c1907df22akschulz String address = ""; 1008326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String tempAddress; 1009326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1010326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = c.getInt(fi.mSmsColType); 1011326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msgType == 1) { // INBOX 1012326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = c.getString(fi.mSmsColAddress); 1013fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1014326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = fi.mPhoneNum; 1015fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1016326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(tempAddress == null) { 1017326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* This can only happen on devices with no SIM - 1018326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde hence will typically not have any SMS messages. */ 1019326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1020326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = PhoneNumberUtils.extractNetworkPortion(tempAddress); 10215a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* extractNetworkPortion can return N if the number is a service "number" = 10225a60e47497f21f64e6d79420dc4c56c1907df22akschulz * a string with the a name in (i.e. "Some-Tele-company" would return N 10235a60e47497f21f64e6d79420dc4c56c1907df22akschulz * because of the N in compaNy) 1024326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Hence we need to check if the number is actually a string with alpha chars. 1025326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * */ 10265a60e47497f21f64e6d79420dc4c56c1907df22akschulz Boolean alpha = PhoneNumberUtils.stripSeparators(tempAddress).matches( 10275a60e47497f21f64e6d79420dc4c56c1907df22akschulz "[0-9]*[a-zA-Z]+[0-9]*"); 1028326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1029326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null || address.length() < 2 || alpha) { 1030326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = tempAddress; // if the number is a service acsii text just use it 1031326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1032326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1033326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1034326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 1035326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde tempAddress = getAddressMms(mResolver, id, MMS_FROM); 1036326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = PhoneNumberUtils.extractNetworkPortion(tempAddress); 1037326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null || address.length() < 1){ 1038326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = tempAddress; // if the number is a service acsii text just use it 1039326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 10405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL/* || 10415a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM*/) { 10425a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameEmail = c.getString(fi.mMessageColFromAddress); 10435a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(nameEmail); 10445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 10455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Originator count= " + tokens.length); 10465a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 10475a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 10485a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 10495a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "SenderAddress = " + tokens[i].toString()); 10505a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 10515a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 10525a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 10535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) address += "; "; //Delimiter 10545a60e47497f21f64e6d79420dc4c56c1907df22akschulz address += emails[0]; 10555a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 10565a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 10575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(fi.mMsgType == FilterInfo.TYPE_IM) { 10605a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: For IM we add the contact ID in the addressing 10615a60e47497f21f64e6d79420dc4c56c1907df22akschulz long contact_id = c.getLong(fi.mMessageColFromAddress); 10625a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: This is a BAD hack, that we map the contact ID to a conversation ID!!! 10635a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We need to reach a conclusion on what to do 10645a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contactsUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVOCONTACT); 10655a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor contacts = mResolver.query(contactsUri, 10665a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONTACT_PROJECTION, 10675a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CONVO_ID 10685a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " = " + contact_id, null, null); 10695a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 10705a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO this will not work for group-chats 10715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null && contacts.moveToFirst()){ 10725a60e47497f21f64e6d79420dc4c56c1907df22akschulz address = contacts.getString( 10735a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts.getColumnIndex( 10745a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.UCI)); 10755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 10775a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (contacts != null) contacts.close(); 10785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10795a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1080fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1081326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setSenderAddressing: " + address); 1082326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(address == null) 1083326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde address = ""; 1084fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSenderAddressing(address); 1085fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1086fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1087fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1088fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSenderName(BluetoothMapMessageListingElement e, Cursor c, 1089326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1090fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SENDER_NAME) != 0) { 10915a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = ""; 1092326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1093fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 1094fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 1095326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = c.getString(fi.mSmsColAddress); 1096326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty()) 10975a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 1098fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1099326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = fi.mPhoneAlphaTag; 1100fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1101326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1102326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 1103326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone; 1104326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(e.getSenderAddressing() != null){ 1105326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = getAddressMms(mResolver, id, MMS_FROM); 1106326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1107326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde phone = e.getSenderAddressing(); 1108326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1109326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (phone != null && !phone.isEmpty() ) 11105a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = getContactNameFromPhone(phone, mResolver); 11115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL/* || 11125a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM*/) { 11135a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameEmail = c.getString(fi.mMessageColFromAddress); 11145a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(nameEmail); 11155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 11165a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Originator count= " + tokens.length); 11175a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 11185a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean first = true; 11195a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 11205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "senderName = " + tokens[i].toString()); 11215a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 11225a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 11235a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameIn = tokens[i].getName(); 11245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!first) name += "; "; //Delimiter 11255a60e47497f21f64e6d79420dc4c56c1907df22akschulz name += nameIn; 11265a60e47497f21f64e6d79420dc4c56c1907df22akschulz first = false; 11275a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 11285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(fi.mMsgType == FilterInfo.TYPE_IM) { 11315a60e47497f21f64e6d79420dc4c56c1907df22akschulz // For IM we add the contact ID in the addressing 11325a60e47497f21f64e6d79420dc4c56c1907df22akschulz long contact_id = c.getLong(fi.mMessageColFromAddress); 11335a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contactsUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVOCONTACT); 11345a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor contacts = mResolver.query(contactsUri, 11355a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONTACT_PROJECTION, 11365a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CONVO_ID 11375a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " = " + contact_id, null, null); 11385a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 11395a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO this will not work for group-chats 11405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null && contacts.moveToFirst()){ 11415a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = contacts.getString( 11425a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts.getColumnIndex( 11435a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME)); 11445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 11465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (contacts != null) contacts.close(); 11475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1148fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1149326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "setSenderName: " + name); 1150326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(name == null) 1151326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde name = ""; 1152fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSenderName(name); 1153fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1154fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1155fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 11565a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11575a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11585a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1159fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setDateTime(BluetoothMapMessageListingElement e, Cursor c, 1160326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1161326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getParameterMask() & MASK_DATETIME) != 0) { 1162326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long date = 0; 1163326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1164326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde date = c.getLong(fi.mSmsColDate); 1165326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1166326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Use Mms.DATE for all messages. Although contract class states */ 1167326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Mms.DATE_SENT are for outgoing messages. But that is not working. */ 1168326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde date = c.getLong(fi.mMmsColDate) * 1000L; 1169326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1170326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* int msgBox = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); */ 1171326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* if (msgBox == Mms.MESSAGE_BOX_INBOX) { */ 1172326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* date = c.getLong(c.getColumnIndex(Mms.DATE)) * 1000L; */ 1173326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* } else { */ 1174326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* date = c.getLong(c.getColumnIndex(Mms.DATE_SENT)) * 1000L; */ 1175326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* } */ 11765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 11775a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 11785a60e47497f21f64e6d79420dc4c56c1907df22akschulz date = c.getLong(fi.mMessageColDate); 1179326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1180326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setDateTime(date); 1181fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1182fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1183fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 11845a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11855a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setLastActivity(BluetoothMapConvoListingElement e, Cursor c, 11865a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 11875a60e47497f21f64e6d79420dc4c56c1907df22akschulz long date = 0; 11885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS || 11895a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_MMS ) { 11905a60e47497f21f64e6d79420dc4c56c1907df22akschulz date = c.getLong(MMS_SMS_THREAD_COL_DATE); 11915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 11925a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 11935a60e47497f21f64e6d79420dc4c56c1907df22akschulz date = c.getLong(fi.mConvoColLastActivity); 11945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11955a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setLastActivity(date); 11965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG, "setDateTime: " + e.getLastActivityString()); 11975a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11985a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 12005a60e47497f21f64e6d79420dc4c56c1907df22akschulz static public String getTextPartsMms(ContentResolver r, long id) { 1201fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String text = ""; 1202fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = new String("mid=" + id); 1203326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/part"); 1204fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 1205326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // TODO: maybe use a projection with only "ct" and "text" 12065a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = r.query(uriAddress, null, selection, 12075a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null); 120828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 12095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 12105a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 12115a60e47497f21f64e6d79420dc4c56c1907df22akschulz String ct = c.getString(c.getColumnIndex("ct")); 12125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (ct.equals("text/plain")) { 12135a60e47497f21f64e6d79420dc4c56c1907df22akschulz String part = c.getString(c.getColumnIndex("text")); 12145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(part != null) { 12155a60e47497f21f64e6d79420dc4c56c1907df22akschulz text += part; 12165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1217326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 12185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 121928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 122028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 12215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1222fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 12235a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1224fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return text; 1225fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1226fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1227fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setSubject(BluetoothMapMessageListingElement e, Cursor c, 1228326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1229fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String subject = ""; 1230fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int subLength = ap.getSubjectLength(); 1231fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(subLength == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 1232fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie subLength = 256; 1233fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1234fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getParameterMask() & MASK_SUBJECT) != 0) { 1235326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1236326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = c.getString(fi.mSmsColSubject); 1237326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1238326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = c.getString(fi.mMmsColSubject); 1239fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (subject == null || subject.length() == 0) { 1240fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Get subject from mms text body parts - if any exists */ 1241326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long id = c.getLong(fi.mMmsColId); 12425a60e47497f21f64e6d79420dc4c56c1907df22akschulz subject = getTextPartsMms(mResolver, id); 1243fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 12445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 12455a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 12465a60e47497f21f64e6d79420dc4c56c1907df22akschulz subject = c.getString(fi.mMessageColSubject); 1247fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1248326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (subject != null && subject.length() > subLength) { 1249326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde subject = subject.substring(0, subLength); 1250aa852f71699b29af8353d596f2ddaba6cf2a1ae0Hemant Gupta } else if (subject == null ) { 1251aa852f71699b29af8353d596f2ddaba6cf2a1ae0Hemant Gupta subject = ""; 1252fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1253326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setSubject: " + subject); 1254fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie e.setSubject(subject); 1255fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1256fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1257fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1258fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setHandle(BluetoothMapMessageListingElement e, Cursor c, 1259326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1260326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long handle = -1; 1261326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1262326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = c.getLong(fi.mSmsColId); 1263326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1264326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = c.getLong(fi.mMmsColId); 12655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 12665a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 12675a60e47497f21f64e6d79420dc4c56c1907df22akschulz handle = c.getLong(fi.mMessageColId); 1268326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1269326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, "setHandle: " + handle ); 1270326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setHandle(handle); 1271fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1272fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1273fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private BluetoothMapMessageListingElement element(Cursor c, FilterInfo fi, 1274326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 1275fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BluetoothMapMessageListingElement e = new BluetoothMapMessageListingElement(); 1276fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setHandle(e, c, fi, ap); 1277fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setDateTime(e, c, fi, ap); 12785a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setType(getType(c, fi), ((ap.getParameterMask() & MASK_TYPE) != 0) ? true : false); 1279fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setRead(e, c, fi, ap); 1280326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // we set number and name for sender/recipient later 1281326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // they require lookup on contacts so no need to 1282326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // do it for all elements unless they are to be used. 1283326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde e.setCursorIndex(c.getPosition()); 1284fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return e; 1285fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1286fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 12875a60e47497f21f64e6d79420dc4c56c1907df22akschulz private BluetoothMapConvoListingElement createConvoElement(Cursor c, FilterInfo fi, 12885a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams ap) { 12895a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement e = new BluetoothMapConvoListingElement(); 12905a60e47497f21f64e6d79420dc4c56c1907df22akschulz setLastActivity(e, c, fi, ap); 12915a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setType(getType(c, fi)); 12925a60e47497f21f64e6d79420dc4c56c1907df22akschulz// setConvoRead(e, c, fi, ap); 12935a60e47497f21f64e6d79420dc4c56c1907df22akschulz e.setCursorIndex(c.getPosition()); 12945a60e47497f21f64e6d79420dc4c56c1907df22akschulz return e; 12955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 12965a60e47497f21f64e6d79420dc4c56c1907df22akschulz 12975a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* TODO: Change to use SmsMmsContacts.getContactNameFromPhone() with proper use of 12985a60e47497f21f64e6d79420dc4c56c1907df22akschulz * caching. */ 12995a60e47497f21f64e6d79420dc4c56c1907df22akschulz public static String getContactNameFromPhone(String phone, ContentResolver resolver) { 1300326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = null; 1301cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Handle possible exception for empty phone address 1302cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (TextUtils.isEmpty(phone)) { 1303cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta return name; 1304cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1305fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 13065006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai Uri uri = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, 13075006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai Uri.encode(phone)); 1308fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1309fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] projection = {Contacts._ID, Contacts.DISPLAY_NAME}; 1310fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = Contacts.IN_VISIBLE_GROUP + "=1"; 1311fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orderBy = Contacts.DISPLAY_NAME + " ASC"; 13125a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = null; 131328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 13145a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = resolver.query(uri, projection, selection, null, orderBy); 13155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) { 13165a60e47497f21f64e6d79420dc4c56c1907df22akschulz int colIndex = c.getColumnIndex(Contacts.DISPLAY_NAME); 13175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.getCount() >= 1) { 13185a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.moveToFirst(); 13195a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = c.getString(colIndex); 13205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 132228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 13235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 1324fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1325fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return name; 1326fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1327cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta /** 1328cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * Get SMS RecipientAddresses for DRAFT folder based on threadId 1329cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * 1330cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta */ 1331cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta static public String getCanonicalAddressSms(ContentResolver r, int threadId) { 1332cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String [] RECIPIENT_ID_PROJECTION = { Threads.RECIPIENT_IDS }; 1333cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta /* 1334cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 1. Get Recipient Ids from Threads.CONTENT_URI 1335cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 2. Get Recipient Address for corresponding Id from canonical-addresses table. 1336cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta */ 1337cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 1338cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Uri sAllCanonical = Uri.parse("content://mms-sms/canonical-addresses"); 1339cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Uri sAllCanonical = 1340cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta MmsSms.CONTENT_URI.buildUpon().appendPath("canonical-addresses").build(); 1341cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Uri sAllThreadsUri = 1342cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build(); 1343cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Cursor cr = null; 1344cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String recipientAddress = ""; 1345cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String recipientIds = null; 1346cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String whereClause = "_id="+threadId; 1347cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "whereClause is "+ whereClause); 1348cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta try { 1349cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr = r.query(sAllThreadsUri, RECIPIENT_ID_PROJECTION, whereClause, null, null); 1350cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (cr != null && cr.moveToFirst()) { 1351cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipientIds = cr.getString(0); 1352cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "cursor.getCount(): " + cr.getCount() + "recipientIds: " 1353cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta + recipientIds + "selection: "+ whereClause ); 1354cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1355cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } finally { 1356cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(cr != null) { 1357cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr.close(); 1358cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr = null; 1359cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1360cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1361cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "recipientIds with spaces: "+ recipientIds +"\n"); 1362cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(recipientIds != null) { 1363cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String recipients[] = null; 1364cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta whereClause = ""; 1365cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipients = recipientIds.split(" "); 1366cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta for (String id: recipients) { 1367cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(whereClause.length() != 0) 1368cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta whereClause +=" OR "; 1369cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta whereClause +="_id="+id; 1370cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1371cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (V) Log.v(TAG, "whereClause is "+ whereClause); 1372cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta try { 1373cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr = r.query(sAllCanonical , null, whereClause, null, null); 1374cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (cr != null && cr.moveToFirst()) { 1375cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta do { 1376cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //TODO: Multiple Recipeints are appended with ";" for now. 1377cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(recipientAddress.length() != 0 ) 1378cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipientAddress+=";"; 1379cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta recipientAddress += cr.getString( 1380cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr.getColumnIndex(CanonicalAddressesColumns.ADDRESS)); 1381cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } while(cr.moveToNext()); 1382cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1383cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } finally { 1384cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(cr != null) 1385cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta cr.close(); 1386cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1387cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1388cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 1389cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if(V) Log.v(TAG,"Final recipientAddress : "+ recipientAddress); 1390cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta return recipientAddress; 1391cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 1392fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1393fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static public String getAddressMms(ContentResolver r, long id, int type) { 1394fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = new String("msg_id=" + id + " AND type=" + type); 1395326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/addr"); 1396fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 1397fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String addr = null; 13985a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] projection = {Mms.Addr.ADDRESS}; 13995a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = null; 140028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 14015a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = r.query(uriAddress, projection, selection, null, null); // TODO: Add projection 14025a60e47497f21f64e6d79420dc4c56c1907df22akschulz int colIndex = c.getColumnIndex(Mms.Addr.ADDRESS); 14035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 14045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c.moveToFirst()) { 14055a60e47497f21f64e6d79420dc4c56c1907df22akschulz addr = c.getString(colIndex); 14065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addr.equals(INSERT_ADDRES_TOKEN)) { 14075a60e47497f21f64e6d79420dc4c56c1907df22akschulz addr = ""; 14085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 14095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 141028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 141128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 14125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1413fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1414fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return addr; 1415fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1416fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1417326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1418326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Matching functions for originator and recipient for MMS 1419326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return true if found a match 1420326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1421fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipientMms(Cursor c, FilterInfo fi, String recip) { 1422fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1423fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 1424fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = getAddressMms(mResolver, id, MMS_TO); 1425fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 1426fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(recip)) { 1427326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientMms: match recipient phone = " + phone); 1428fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1429fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 14305a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1431fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(recip)) { 1432326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientMms: match recipient name = " + name); 1433fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1434fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1435fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1436fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1437fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1438fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1439fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1440fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1441fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1442fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1443fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1444fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipientSms(Cursor c, FilterInfo fi, String recip) { 1445fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1446fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 1447fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 1448326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = fi.mPhoneNum; 1449326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = fi.mPhoneAlphaTag; 1450fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0 && phone.matches(recip)) { 1451326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient phone = " + phone); 1452fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1453fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (name != null && name.length() > 0 && name.matches(recip)) { 1454326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient name = " + name); 1455fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1456fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1457fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1458fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1459326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1460fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 1461fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 1462fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(recip)) { 1463326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient phone = " + phone); 1464fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1465fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 14665a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1467fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(recip)) { 1468326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchRecipientSms: match recipient name = " + name); 1469fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1470fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1471fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1472fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1473fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1474fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1475fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1476fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1477fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1478fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1479fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1480fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1481fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchRecipient(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 1482fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1483fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String recip = ap.getFilterRecipient(); 1484fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (recip != null && recip.length() > 0) { 1485fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie recip = recip.replace("*", ".*"); 1486fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie recip = ".*" + recip + ".*"; 1487326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1488fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchRecipientSms(c, fi, recip); 1489326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1490fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchRecipientMms(c, fi, recip); 1491fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1492326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "matchRecipient: Unknown msg type: " + fi.mMsgType); 1493fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1494fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1495fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1496fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1497fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1498fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1499fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1500fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1501fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginatorMms(Cursor c, FilterInfo fi, String orig) { 1502fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1503fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = c.getLong(c.getColumnIndex(BaseColumns._ID)); 1504fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = getAddressMms(mResolver, id, MMS_FROM); 1505fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0) { 1506fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(orig)) { 1507326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorMms: match originator phone = " + phone); 1508fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1509fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 15105a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1511fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(orig)) { 1512326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorMms: match originator name = " + name); 1513fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1514fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1515fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1516fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1517fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1518fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1519fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1520fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1521fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1522fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1523fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1524fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginatorSms(Cursor c, FilterInfo fi, String orig) { 1525fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1526fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = c.getInt(c.getColumnIndex(Sms.TYPE)); 1527fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgType == 1) { 1528fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 1529fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone !=null && phone.length() > 0) { 1530fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone.matches(orig)) { 1531326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator phone = " + phone); 1532fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1533fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 15345a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = getContactNameFromPhone(phone, mResolver); 1535fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (name != null && name.length() > 0 && name.matches(orig)) { 1536326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator name = " + name); 1537fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1538fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1539fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1540fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1541fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1542fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1543fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1544fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1545326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1546326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = fi.mPhoneNum; 1547326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String name = fi.mPhoneAlphaTag; 1548fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (phone != null && phone.length() > 0 && phone.matches(orig)) { 1549326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator phone = " + phone); 1550fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1551fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (name != null && name.length() > 0 && name.matches(orig)) { 1552326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "matchOriginatorSms: match originator name = " + name); 1553fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1554fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1555fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1556fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1557fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1558fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1559fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1560fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1561fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchOriginator(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 1562fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res; 1563fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 1564fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 1565fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie orig = orig.replace("*", ".*"); 1566fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie orig = ".*" + orig + ".*"; 1567326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1568fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchOriginatorSms(c, fi, orig); 1569326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1570fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = matchOriginatorMms(c, fi, orig); 1571fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1572326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "matchOriginator: Unknown msg type: " + fi.mMsgType); 1573fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = false; 1574fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1575fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1576fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie res = true; 1577fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1578fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 1579fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1580fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1581fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean matchAddresses(Cursor c, FilterInfo fi, BluetoothMapAppParams ap) { 1582fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (matchOriginator(c, fi, ap) && matchRecipient(c, fi, ap)) { 1583fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1584fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 1585fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1586fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1587fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1588fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1589326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* 1590326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Where filter functions 1591326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * */ 1592fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterFolderTypeSms(String folder) { 1593fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1594326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (BluetoothMapContract.FOLDER_NAME_INBOX.equalsIgnoreCase(folder)) { 1595326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 1 AND " + Sms.THREAD_ID + " <> -1"; 1596326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_OUTBOX.equalsIgnoreCase(folder)) { 1597326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = "(" + Sms.TYPE + " = 4 OR " + Sms.TYPE + " = 5 OR " 1598326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + Sms.TYPE + " = 6) AND " + Sms.THREAD_ID + " <> -1"; 1599326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_SENT.equalsIgnoreCase(folder)) { 1600326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.TYPE + " = 2 AND " + Sms.THREAD_ID + " <> -1"; 1601326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DRAFT.equalsIgnoreCase(folder)) { 1602c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker where = Sms.TYPE + " = 3 AND " + 1603c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker "(" + Sms.THREAD_ID + " IS NULL OR " + Sms.THREAD_ID + " <> -1 )"; 1604326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DELETED.equalsIgnoreCase(folder)) { 1605326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Sms.THREAD_ID + " = -1"; 1606fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1607fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1608fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1609fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1610fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1611fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterFolderTypeMms(String folder) { 1612fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1613326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (BluetoothMapContract.FOLDER_NAME_INBOX.equalsIgnoreCase(folder)) { 1614326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 1 AND " + Mms.THREAD_ID + " <> -1"; 1615326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_OUTBOX.equalsIgnoreCase(folder)) { 1616326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 4 AND " + Mms.THREAD_ID + " <> -1"; 1617326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_SENT.equalsIgnoreCase(folder)) { 1618326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.MESSAGE_BOX + " = 2 AND " + Mms.THREAD_ID + " <> -1"; 1619326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DRAFT.equalsIgnoreCase(folder)) { 1620c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker where = Mms.MESSAGE_BOX + " = 3 AND " + 1621c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker "(" + Mms.THREAD_ID + " IS NULL OR " + Mms.THREAD_ID + " <> -1 )"; 1622326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (BluetoothMapContract.FOLDER_NAME_DELETED.equalsIgnoreCase(folder)) { 1623326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = Mms.THREAD_ID + " = -1"; 1624fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1625fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1626fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1627fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1628fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1629326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterFolderTypeEmail(long folderId) { 1630fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1631326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (folderId >= 0) { 1632326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + folderId; 1633326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1634326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.e(TAG, "setWhereFilterFolderTypeEmail: not valid!" ); 1635326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("Invalid folder ID"); 1636fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1637326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return where; 1638326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1639fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 16405a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterFolderTypeIm(long folderId) { 1641326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = ""; 16425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId > BluetoothMapContract.FOLDER_ID_OTHER) { 16435a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + folderId; 16445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 16455a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.e(TAG, "setWhereFilterFolderTypeIm: not valid!" ); 16465a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("Invalid folder ID"); 16475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 16485a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 16495a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 16505a60e47497f21f64e6d79420dc4c56c1907df22akschulz 16515a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterFolderType(BluetoothMapFolderElement folderElement, 16525a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi) { 1653046debbf8704ce4a0e0e318567cddcba76b026e6Ajay Panicker String where = "1=1"; 1654046debbf8704ce4a0e0e318567cddcba76b026e6Ajay Panicker if (!folderElement.shouldIgnore()) { 16555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 16565a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeSms(folderElement.getName()); 16575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 16585a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeMms(folderElement.getName()); 16595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 16605a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeEmail(folderElement.getFolderId()); 16615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_IM) { 16625a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = setWhereFilterFolderTypeIm(folderElement.getFolderId()); 16635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1664326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1665046debbf8704ce4a0e0e318567cddcba76b026e6Ajay Panicker 1666fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1667fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1668fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1669326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterReadStatus(BluetoothMapAppParams ap, FilterInfo fi) { 1670fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1671fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (ap.getFilterReadStatus() != -1) { 1672326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 1673326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 1674326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Sms.READ + "= 0"; 1675326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1676fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1677326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 1678326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Sms.READ + "= 1"; 1679326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1680326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1681326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 1682326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.READ + "= 0"; 1683326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1684326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1685326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 1686326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.READ + "= 1"; 1687326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 16885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 16895a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 1690326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x01) != 0) { 1691326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "= 0"; 1692326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1693326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ((ap.getFilterReadStatus() & 0x02) != 0) { 1694326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "= 1"; 1695326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1696fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1697fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1698fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1699fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1700fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1701fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String setWhereFilterPeriod(BluetoothMapAppParams ap, FilterInfo fi) { 1702fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 17035a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1704fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getFilterPeriodBegin() != -1)) { 1705326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 17065a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms.DATE + " >= " + ap.getFilterPeriodBegin(); 1707326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1708326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND " + Mms.DATE + " >= " + (ap.getFilterPeriodBegin() / 1000L); 17095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 17105a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 17115a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.DATE + 17125a60e47497f21f64e6d79420dc4c56c1907df22akschulz " >= " + (ap.getFilterPeriodBegin()); 1713fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1714fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1715fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1716fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if ((ap.getFilterPeriodEnd() != -1)) { 1717326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_SMS) { 17185a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + Sms.DATE + " < " + ap.getFilterPeriodEnd(); 1719326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 1720326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Mms.DATE + " < " + (ap.getFilterPeriodEnd() / 1000L); 17215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 17225a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 17235a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.DATE + 17245a60e47497f21f64e6d79420dc4c56c1907df22akschulz " < " + (ap.getFilterPeriodEnd()); 17255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17275a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 17285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17295a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterLastActivity(BluetoothMapAppParams ap, FilterInfo fi) { 17305a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = ""; 17315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityBegin() != -1)) { 17325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 17335a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms.DATE + " >= " + ap.getFilterLastActivityBegin(); 17345a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 17355a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Mms.DATE + " >= " + (ap.getFilterLastActivityBegin() / 1000L); 17365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL|| 17375a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM ) { 17385a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY + 17395a60e47497f21f64e6d79420dc4c56c1907df22akschulz " >= " + (ap.getFilterPeriodBegin()); 17405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityEnd() != -1)) { 17435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 17445a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + Sms.DATE + " < " + ap.getFilterLastActivityEnd(); 17455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 17465a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + Mms.DATE + " < " + (ap.getFilterPeriodEnd() / 1000L); 17475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL||fi.mMsgType == FilterInfo.TYPE_IM) { 17485a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY 17495a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " < " + (ap.getFilterLastActivityEnd()); 1750fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1751fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1752fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1753fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1754fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1755326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1756326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterOriginatorEmail(BluetoothMapAppParams ap) { 1757fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1758fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 1759fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1760326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1761fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 1762326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde orig = orig.replace("*", "%"); 17635a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.FROM_LIST 17645a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " LIKE '%" + orig + "%'"; 1765fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1766fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1767fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1768fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 17695a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterOriginatorIM(BluetoothMapAppParams ap) { 1770fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1771fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orig = ap.getFilterOriginator(); 1772fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1773326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1774fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (orig != null && orig.length() > 0) { 1775326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde orig = orig.replace("*", "%"); 17765a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.FROM_LIST 17775a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " LIKE '%" + orig + "%'"; 1778fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1779fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1780fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 17815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 178214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz private String setWhereFilterPriority(BluetoothMapAppParams ap, FilterInfo fi) { 178314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz String where = ""; 178414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz int pri = ap.getFilterPriority(); 178514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz /*only MMS have priority info */ 1786326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(fi.mMsgType == FilterInfo.TYPE_MMS) 178714f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz { 178814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz if(pri == 0x0002) 178914f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz { 179014f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz where += " AND " + Mms.PRIORITY + "<=" + 179114f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz Integer.toString(PduHeaders.PRIORITY_NORMAL); 179214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz }else if(pri == 0x0001) { 179314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz where += " AND " + Mms.PRIORITY + "=" + 179414f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz Integer.toString(PduHeaders.PRIORITY_HIGH); 179514f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 179614f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 17975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(fi.mMsgType == FilterInfo.TYPE_EMAIL || 17985a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) 17995a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 18005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(pri == 0x0002) 18015a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 18025a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY + "!=1"; 18035a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else if(pri == 0x0001) { 18045a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY + "=1"; 18055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18075a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: no priority filtering in IM 180814f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz return where; 180914f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 1810fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1811326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilterRecipientEmail(BluetoothMapAppParams ap) { 1812fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1813fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String recip = ap.getFilterRecipient(); 1814fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1815326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Be aware of wild cards in the beginning of string, may not be valid? */ 1816fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (recip != null && recip.length() > 0) { 1817326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde recip = recip.replace("*", "%"); 1818326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where = " AND (" 1819326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.TO_LIST + " LIKE '%" + recip + "%' OR " 1820326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.CC_LIST + " LIKE '%" + recip + "%' OR " 1821326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + BluetoothMapContract.MessageColumns.BCC_LIST + " LIKE '%" + recip + "%' )"; 1822fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1823fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1824fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1825fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 18265a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterMessageHandle(BluetoothMapAppParams ap, FilterInfo fi) { 1827fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 18285a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = -1; 18295a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgHandle = ap.getFilterMsgHandleString(); 18305a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msgHandle != null) { 18315a60e47497f21f64e6d79420dc4c56c1907df22akschulz id = BluetoothMapUtils.getCpHandle(msgHandle); 18325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG,"id: " + id); 18335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(id != -1) { 18355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 18365a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms._ID + " = " + id; 18375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 18385a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Mms._ID + " = " + id; 18395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 18405a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 18415a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns._ID + " = " + id; 1842326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1843326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 18445a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 18455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18465a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18475a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setWhereFilterThreadId(BluetoothMapAppParams ap, FilterInfo fi) { 18485a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = ""; 18495a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = -1; 18505a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgHandle = ap.getFilterConvoIdString(); 18515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msgHandle != null) { 18525a60e47497f21f64e6d79420dc4c56c1907df22akschulz id = BluetoothMapUtils.getMsgHandleAsLong(msgHandle); 18535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG,"id: " + id); 18545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(id > 0) { 18565a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_SMS) { 18575a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Sms.THREAD_ID + " = " + id; 18585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_MMS) { 18595a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + Mms.THREAD_ID + " = " + id; 18605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (fi.mMsgType == FilterInfo.TYPE_EMAIL || 18615a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType == FilterInfo.TYPE_IM) { 18625a60e47497f21f64e6d79420dc4c56c1907df22akschulz where = " AND " + BluetoothMapContract.MessageColumns.THREAD_ID + " = " + id; 18635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18655a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18665a60e47497f21f64e6d79420dc4c56c1907df22akschulz return where; 18675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18685a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1869326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String setWhereFilter(BluetoothMapFolderElement folderElement, 1870326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FilterInfo fi, BluetoothMapAppParams ap) { 1871fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = ""; 1872326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterFolderType(folderElement, fi); 18735a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18745a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgHandleWhere = setWhereFilterMessageHandle(ap, fi); 18755a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* if message handle filter is available, the other filters should be ignored */ 18765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msgHandleWhere.isEmpty()) { 1877326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterReadStatus(ap, fi); 1878326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterPriority(ap,fi); 18795a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterPeriod(ap, fi); 1880326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (fi.mMsgType == FilterInfo.TYPE_EMAIL) { 1881326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterOriginatorEmail(ap); 1882326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterRecipientEmail(ap); 1883326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 18845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fi.mMsgType == FilterInfo.TYPE_IM) { 18855a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterOriginatorIM(ap); 18865a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: set 'where' filer recipient? 18875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18885a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterThreadId(ap, fi); 18895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 18905a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += msgHandleWhere; 1891326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1892fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1893fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return where; 1894fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1895fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 18965a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18975a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Used only for SMS/MMS */ 18985a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setConvoWhereFilterSmsMms(StringBuilder selection, ArrayList<String> selectionArgs, 18995a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi, BluetoothMapAppParams ap) { 19005a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsSelected(fi, ap) || mmsSelected(ap)) { 19025a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19035a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Filter Read Status 19045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterReadStatus() != BluetoothMapAppParams.INVALID_VALUE_PARAMETER) { 19055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterReadStatus() & FILTER_READ_STATUS_UNREAD_ONLY) != 0) { 19065a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.READ).append(" = 0"); 19075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterReadStatus() & FILTER_READ_STATUS_READ_ONLY) != 0) { 19095a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.READ).append(" = 1"); 19105a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19125a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19135a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Filter time 19145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityBegin() != BluetoothMapAppParams.INVALID_VALUE_PARAMETER)){ 19155a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.DATE).append(" >= ") 19165a60e47497f21f64e6d79420dc4c56c1907df22akschulz .append(ap.getFilterLastActivityBegin()); 19175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((ap.getFilterLastActivityEnd() != BluetoothMapAppParams.INVALID_VALUE_PARAMETER)) { 19195a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads.DATE).append(" <= ") 19205a60e47497f21f64e6d79420dc4c56c1907df22akschulz .append(ap.getFilterLastActivityEnd()); 19215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19235a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Filter ConvoId 19245a60e47497f21f64e6d79420dc4c56c1907df22akschulz long convoId = -1; 19255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterConvoId() != null) { 19265a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoId = ap.getFilterConvoId().getLeastSignificantBits(); 19275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoId > 0) { 19295a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append(" AND ").append(Threads._ID).append(" = ") 19305a60e47497f21f64e6d79420dc4c56c1907df22akschulz .append(Long.toString(convoId)); 19315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19325a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19355a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1937326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1938326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if sms should be included. 1939326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1940326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1941326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 1942326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return boolean true if sms is selected, false if not 1943326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1944fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean smsSelected(FilterInfo fi, BluetoothMapAppParams ap) { 1945fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = ap.getFilterMessageType(); 1946326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int phoneType = fi.mPhoneType; 1947326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1948326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "smsSelected msgType: " + msgType); 1949fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 1951fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1952326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 19535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & (BluetoothMapAppParams.FILTER_NO_SMS_CDMA 19545a60e47497f21f64e6d79420dc4c56c1907df22akschulz |BluetoothMapAppParams.FILTER_NO_SMS_GSM)) == 0) 1955fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1956fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (((msgType & BluetoothMapAppParams.FILTER_NO_SMS_GSM) == 0) 19585a60e47497f21f64e6d79420dc4c56c1907df22akschulz && (phoneType == TelephonyManager.PHONE_TYPE_GSM)) 1959fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1960fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19615a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (((msgType & BluetoothMapAppParams.FILTER_NO_SMS_CDMA) == 0) 19625a60e47497f21f64e6d79420dc4c56c1907df22akschulz && (phoneType == TelephonyManager.PHONE_TYPE_CDMA)) 1963fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1964fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1965fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1966fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1967fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1968326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1969326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if mms should be included. 1970326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1971326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1972326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 19735a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return boolean true if mms is selected, false if not 1974326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 19755a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean mmsSelected(BluetoothMapAppParams ap) { 1976fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgType = ap.getFilterMessageType(); 1977fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1978326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "mmsSelected msgType: " + msgType); 1979326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 19805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 1981fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1982fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 19835a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & BluetoothMapAppParams.FILTER_NO_MMS) == 0) 1984fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return true; 1985fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1986fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return false; 1987fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1988fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1989326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 1990326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Determine from application parameter if email should be included. 1991326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The filter mask is set for message types not selected 1992326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param fi 1993326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap 19945a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return boolean true if email is selected, false if not 1995326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 19965a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean emailSelected(BluetoothMapAppParams ap) { 1997326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int msgType = ap.getFilterMessageType(); 1998326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1999326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "emailSelected msgType: " + msgType); 2000326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 20015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 20025a60e47497f21f64e6d79420dc4c56c1907df22akschulz return true; 20035a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & BluetoothMapAppParams.FILTER_NO_EMAIL) == 0) 20055a60e47497f21f64e6d79420dc4c56c1907df22akschulz return true; 20065a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20075a60e47497f21f64e6d79420dc4c56c1907df22akschulz return false; 20085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20095a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20105a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 20115a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Determine from application parameter if IM should be included. 20125a60e47497f21f64e6d79420dc4c56c1907df22akschulz * The filter mask is set for message types not selected 20135a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param fi 20145a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap 20155a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return boolean true if im is selected, false if not 20165a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 20175a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean imSelected(BluetoothMapAppParams ap) { 20185a60e47497f21f64e6d79420dc4c56c1907df22akschulz int msgType = ap.getFilterMessageType(); 20195a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "imSelected msgType: " + msgType); 20215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgType == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) 2023326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 2024326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 20255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ((msgType & BluetoothMapAppParams.FILTER_NO_IM) == 0) 2026326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 2027326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2028326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return false; 2029326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2030326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2031fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void setFilterInfo(FilterInfo fi) { 20327769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde TelephonyManager tm = 20335a60e47497f21f64e6d79420dc4c56c1907df22akschulz (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 2034fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (tm != null) { 2035326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneType = tm.getPhoneType(); 2036326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneNum = tm.getLine1Number(); 2037326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mPhoneAlphaTag = tm.getLine1AlphaTag(); 2038326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "phone type = " + fi.mPhoneType + 2039326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " phone num = " + fi.mPhoneNum + 2040326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " phone alpha tag = " + fi.mPhoneAlphaTag); 2041fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2042fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2043fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2044326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 2045326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Get a listing of message in folder after applying filter. 2046326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param folder Must contain a valid folder string != null 2047326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap Parameters specifying message content and filters 2048326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return Listing object containing requested messages 2049326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 2050326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public BluetoothMapMessageListing msgListing(BluetoothMapFolderElement folderElement, 2051326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 20525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgListing: messageType = " + ap.getFilterMessageType() ); 2053326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 20545a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMessageListing bmList = new BluetoothMapMessageListing(); 2055fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 20560053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz /* We overwrite the parameter mask here if it is 0 or not present, as this 20570053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz * should cause all parameters to be included in the message list. */ 20580053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz if(ap.getParameterMask() == BluetoothMapAppParams.INVALID_VALUE_PARAMETER || 20590053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz ap.getParameterMask() == 0) { 2060281a499162f86d2ce148b5020bfcfc277b84c5b9Hemant Gupta ap.setParameterMask(PARAMETER_MASK_ALL_ENABLED); 2061326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "msgListing(): appParameterMask is zero or not present, " + 2062281a499162f86d2ce148b5020bfcfc277b84c5b9Hemant Gupta "changing to all enabled by default: " + ap.getParameterMask()); 20630053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz } 20645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG, "folderElement hasSmsMmsContent = " + folderElement.hasSmsMmsContent() + 20655a60e47497f21f64e6d79420dc4c56c1907df22akschulz " folderElement.hasEmailContent = " + folderElement.hasEmailContent() + 20665a60e47497f21f64e6d79420dc4c56c1907df22akschulz " folderElement.hasImContent = " + folderElement.hasImContent()); 20670053efa4b58c3e5815a500bd719c5018e7e87852Kim Schulz 2068fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Cache some info used throughout filtering */ 2069fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi = new FilterInfo(); 2070fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setFilterInfo(fi); 2071326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor smsCursor = null; 2072326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor mmsCursor = null; 2073326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor emailCursor = null; 20745a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor imCursor = null; 20755a60e47497f21f64e6d79420dc4c56c1907df22akschulz String limit = ""; 20765a60e47497f21f64e6d79420dc4c56c1907df22akschulz int countNum = ap.getMaxListCount(); 20775a60e47497f21f64e6d79420dc4c56c1907df22akschulz int offsetNum = ap.getStartOffset(); 20785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getMaxListCount()>0){ 20795a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit=" LIMIT "+ (ap.getMaxListCount()+ap.getStartOffset()); 20805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20815a60e47497f21f64e6d79420dc4c56c1907df22akschulz try{ 208228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 208328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 208428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_MMS| 20855a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 20865a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)|| 208728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 208828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_MMS| 20895a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 20905a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)){ 20915a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 20925a60e47497f21f64e6d79420dc4c56c1907df22akschulz // (only if offset/limit is used) 209328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 209428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "SMS Limit => "+limit); 209528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 209628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 209728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_SMS; 209828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterPriority() != 1){ /*SMS cannot have high priority*/ 209928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String where = setWhereFilter(folderElement, fi, ap); 21005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 21015a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsCursor = mResolver.query(Sms.CONTENT_URI, 21025a60e47497f21f64e6d79420dc4c56c1907df22akschulz SMS_PROJECTION, where, null, Sms.DATE + " DESC" + limit); 21035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsCursor != null) { 21045a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMessageListingElement e = null; 21055a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we dont have to look them up anymore (optimization) 21065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + smsCursor.getCount() + " sms messages."); 21075a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setSmsColumns(smsCursor); 21085a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (smsCursor.moveToNext()) { 21095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (matchAddresses(smsCursor, fi, ap)) { 21105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) BluetoothMapUtils.printCursor(smsCursor); 21115a60e47497f21f64e6d79420dc4c56c1907df22akschulz e = element(smsCursor, fi, ap); 21125a60e47497f21f64e6d79420dc4c56c1907df22akschulz bmList.add(e); 211328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 211428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 211528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 211628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 211728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 211828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 21195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mmsSelected(ap) && folderElement.hasSmsMmsContent()) { 212028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_EMAIL| 212128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 21225a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 21235a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)){ 21245a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 21255a60e47497f21f64e6d79420dc4c56c1907df22akschulz //(only if offset/limit is used) 212628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 212728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "MMS Limit => "+limit); 212828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 212928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 213028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_MMS; 2131326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 21321ce48531cb795d2ca180e3d92c044d3fac72e022Hemant Gupta where += " AND " + INTERESTED_MESSAGE_TYPE_CLAUSE; 2133326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(!where.isEmpty()) { 21345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 213528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz mmsCursor = mResolver.query(Mms.CONTENT_URI, 213628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz MMS_PROJECTION, where, null, Mms.DATE + " DESC" + limit); 213728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (mmsCursor != null) { 2138326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapMessageListingElement e = null; 2139326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // store column index so we dont have to look them up anymore (optimization) 214028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.setMmsColumns(mmsCursor); 214128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Found " + mmsCursor.getCount() + " mms messages."); 214228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (mmsCursor.moveToNext()) { 214328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (matchAddresses(mmsCursor, fi, ap)) { 21445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) BluetoothMapUtils.printCursor(mmsCursor); 214528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz e = element(mmsCursor, fi, ap); 2146326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde bmList.add(e); 2147326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2148326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2149326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2150326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2151326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 215214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz 21535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) && folderElement.hasEmailContent()) { 215428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_MMS| 215528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 21565a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 21575a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_IM)){ 21585a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 21595a60e47497f21f64e6d79420dc4c56c1907df22akschulz //(only if offset/limit is used) 216028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 216128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(D) Log.d(TAG, "Email Limit => "+limit); 216228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz offsetNum = 0; 216328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 216428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 216528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String where = setWhereFilter(folderElement, fi, ap); 216628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 216728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(!where.isEmpty()) { 21685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 21695a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 21705a60e47497f21f64e6d79420dc4c56c1907df22akschulz emailCursor = mResolver.query(contentUri, 21715a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_MESSAGE_PROJECTION, where, null, 21725a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DATE + " DESC" + limit); 217328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (emailCursor != null) { 217428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapMessageListingElement e = null; 217528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // store column index so we dont have to look them up anymore (optimization) 21765a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setEmailMessageColumns(emailCursor); 217728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int cnt = 0; 21785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + emailCursor.getCount() + " email messages."); 217928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz while (emailCursor.moveToNext()) { 21805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) BluetoothMapUtils.printCursor(emailCursor); 218128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz e = element(emailCursor, fi, ap); 218214f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz bmList.add(e); 218314f1f53e829b1d00f6c27618e878b1ebb18df8cckschulz } 218428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz // emailCursor.close(); 2185fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2186fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2187fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2188fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 21895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imSelected(ap) && folderElement.hasImContent()) { 21905a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterMessageType() == (BluetoothMapAppParams.FILTER_NO_MMS| 21915a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA| 21925a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_GSM| 21935a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_EMAIL)){ 21945a60e47497f21f64e6d79420dc4c56c1907df22akschulz //set real limit and offset if only this type is used 21955a60e47497f21f64e6d79420dc4c56c1907df22akschulz //(only if offset/limit is used) 21965a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit = " LIMIT " + ap.getMaxListCount() + " OFFSET "+ ap.getStartOffset(); 21975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "IM Limit => "+limit); 21985a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = 0; 21995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22005a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 22015a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = setWhereFilter(folderElement, fi, ap); 22025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType + " where: " + where); 22035a60e47497f21f64e6d79420dc4c56c1907df22akschulz 22045a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 22055a60e47497f21f64e6d79420dc4c56c1907df22akschulz imCursor = mResolver.query(contentUri, 22065a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_INSTANT_MESSAGE_PROJECTION, 22075a60e47497f21f64e6d79420dc4c56c1907df22akschulz where, null, BluetoothMapContract.MessageColumns.DATE + " DESC" + limit); 22085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imCursor != null) { 22095a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMessageListingElement e = null; 22105a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we dont have to look them up anymore (optimization) 22115a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setImMessageColumns(imCursor); 22125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "Found " + imCursor.getCount() + " im messages."); 22135a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (imCursor.moveToNext()) { 22145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) BluetoothMapUtils.printCursor(imCursor); 22155a60e47497f21f64e6d79420dc4c56c1907df22akschulz e = element(imCursor, fi, ap); 22165a60e47497f21f64e6d79420dc4c56c1907df22akschulz bmList.add(e); 22175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 22205a60e47497f21f64e6d79420dc4c56c1907df22akschulz 222128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Enable this if post sorting and segmenting needed */ 222228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz bmList.sort(); 222328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz bmList.segment(ap.getMaxListCount(), offsetNum); 222428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz List<BluetoothMapMessageListingElement> list = bmList.getList(); 222528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int listSize = list.size(); 222628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor tmpCursor = null; 22275a60e47497f21f64e6d79420dc4c56c1907df22akschulz for(int x=0;x<listSize;x++){ 222828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz BluetoothMapMessageListingElement ele = list.get(x); 22292e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta /* If OBEX "GET" request header includes "ParameterMask" with 'Type' NOT set, 22302e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta * then ele.getType() returns "null" even for a valid cursor. 22312e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta * Avoid NullPointerException in equals() check when 'mType' value is "null" */ 22322e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta TYPE tmpType = ele.getType(); 22332e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (smsCursor!= null && 22342e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta ((TYPE.SMS_GSM).equals(tmpType) || (TYPE.SMS_CDMA).equals(tmpType))) { 223528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = smsCursor; 223628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_SMS; 22372e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else if(mmsCursor != null && (TYPE.MMS).equals(tmpType)) { 223828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = mmsCursor; 223928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_MMS; 22402e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else if(emailCursor != null && ((TYPE.EMAIL).equals(tmpType))) { 224128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz tmpCursor = emailCursor; 224228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 22432e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else if(imCursor != null && ((TYPE.IM).equals(tmpType))) { 22445a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = imCursor; 22455a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 224628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 22475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(tmpCursor != null){ 22485a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor.moveToPosition(ele.getCursorIndex()); 224928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSenderAddressing(ele, tmpCursor, fi, ap); 225028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSenderName(ele, tmpCursor, fi, ap); 225128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setRecipientAddressing(ele, tmpCursor, fi, ap); 225228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setRecipientName(ele, tmpCursor, fi, ap); 225328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSubject(ele, tmpCursor, fi, ap); 225428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSize(ele, tmpCursor, fi, ap); 225528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setText(ele, tmpCursor, fi, ap); 225628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setPriority(ele, tmpCursor, fi, ap); 225728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setSent(ele, tmpCursor, fi, ap); 225828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz setProtected(ele, tmpCursor, fi, ap); 22595a60e47497f21f64e6d79420dc4c56c1907df22akschulz setReceptionStatus(ele, tmpCursor, fi, ap); 22605a60e47497f21f64e6d79420dc4c56c1907df22akschulz setAttachment(ele, tmpCursor, fi, ap); 22615a60e47497f21f64e6d79420dc4c56c1907df22akschulz 22625a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mMsgListingVersion > BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V10 ){ 22635a60e47497f21f64e6d79420dc4c56c1907df22akschulz setDeliveryStatus(ele, tmpCursor, fi, ap); 22645a60e47497f21f64e6d79420dc4c56c1907df22akschulz setThreadId(ele, tmpCursor, fi, ap); 22655a60e47497f21f64e6d79420dc4c56c1907df22akschulz setThreadName(ele, tmpCursor, fi, ap); 22665a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFolderType(ele, tmpCursor, fi, ap); 22675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2268fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2269fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 227028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 22715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(emailCursor != null)emailCursor.close(); 22725a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(smsCursor != null)smsCursor.close(); 22735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mmsCursor != null)mmsCursor.close(); 22745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(imCursor != null)imCursor.close(); 2275fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2276fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 22775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 22785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "messagelisting end"); 2279fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return bmList; 2280fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2281fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2282326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 2283326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * Get the size of the message listing 2284326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param folder Must contain a valid folder string != null 2285326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param ap Parameters specifying message content and filters 2286326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return Integer equal to message listing size 2287326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 2288326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int msgListingSize(BluetoothMapFolderElement folderElement, 2289326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 2290326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgListingSize: folder = " + folderElement.getName()); 2291fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int cnt = 0; 2292fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2293fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Cache some info used throughout filtering */ 2294fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie FilterInfo fi = new FilterInfo(); 2295fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie setFilterInfo(fi); 2296fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 229728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 2298326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_SMS; 2299326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 2300fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Sms.CONTENT_URI, 2301326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SMS_PROJECTION, where, null, Sms.DATE + " DESC"); 23025a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23045a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt = c.getCount(); 23055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2309fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 231070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 23115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mmsSelected(ap) && folderElement.hasSmsMmsContent()) { 2312326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_MMS; 2313326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 231470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Mms.CONTENT_URI, 2315326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde MMS_PROJECTION, where, null, Mms.DATE + " DESC"); 23165a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23185a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 23195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 232370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 232470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 23255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) && folderElement.hasEmailContent()) { 2326326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_EMAIL; 2327326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilter(folderElement, fi, ap); 23285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!where.isEmpty()) { 23295a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 2330326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, 2331326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 23325a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23345a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 23355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23375a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23415a60e47497f21f64e6d79420dc4c56c1907df22akschulz 23425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imSelected(ap) && folderElement.hasImContent()) { 23435a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 23445a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = setWhereFilter(folderElement, fi, ap); 23455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!where.isEmpty()) { 23465a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 23475a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, 23485a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_INSTANT_MESSAGE_PROJECTION, 23495a60e47497f21f64e6d79420dc4c56c1907df22akschulz where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 23505a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23525a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 23535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2357326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2358326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2359326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 236070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if (D) Log.d(TAG, "msgListingSize: size = " + cnt); 2361fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return cnt; 2362fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2363326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 236470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 236570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * Return true if there are unread messages in the requested list of messages 236670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param folder folder where the message listing should come from 236770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param ap application parameter object 236870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return true if unread messages are in the list, else false 236970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 2370326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public boolean msgListingHasUnread(BluetoothMapFolderElement folderElement, 2371326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap) { 2372326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "msgListingHasUnread: folder = " + folderElement.getName()); 237370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz int cnt = 0; 237470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 237570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /* Cache some info used throughout filtering */ 237670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz FilterInfo fi = new FilterInfo(); 237770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz setFilterInfo(fi); 237870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 2379326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (smsSelected(fi, ap) && folderElement.hasSmsMmsContent()) { 2380326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_SMS; 2381326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 2382326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Sms.READ + "=0 "; 238370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz where += setWhereFilterPeriod(ap, fi); 238470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Sms.CONTENT_URI, 2385326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SMS_PROJECTION, where, null, Sms.DATE + " DESC"); 23865a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 23875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 23885a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt = c.getCount(); 23895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 23915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 23925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 239370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 239470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 23955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mmsSelected(ap) && folderElement.hasSmsMmsContent()) { 2396326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_MMS; 2397326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 2398326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + Mms.READ + "=0 "; 239970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz where += setWhereFilterPeriod(ap, fi); 240070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Cursor c = mResolver.query(Mms.CONTENT_URI, 2401326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde MMS_PROJECTION, where, null, Sms.DATE + " DESC"); 24025a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 24035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 24045a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 24055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 24075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 24085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 240970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 241070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 2411326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 24125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) && folderElement.getFolderId() != -1) { 2413326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fi.mMsgType = FilterInfo.TYPE_EMAIL; 2414326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String where = setWhereFilterFolderType(folderElement, fi); 2415326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(!where.isEmpty()) { 2416326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "=0 "; 2417326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where += setWhereFilterPeriod(ap, fi); 24185a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 2419326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, 2420326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 24215a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 24225a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 24235a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 24245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 24265a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 24275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24315a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imSelected(ap) && folderElement.hasImContent()) { 24325a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 24335a60e47497f21f64e6d79420dc4c56c1907df22akschulz String where = setWhereFilter(folderElement, fi, ap); 24345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!where.isEmpty()) { 24355a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += " AND " + BluetoothMapContract.MessageColumns.FLAG_READ + "=0 "; 24365a60e47497f21f64e6d79420dc4c56c1907df22akschulz where += setWhereFilterPeriod(ap, fi); 24375a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 24385a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, 24395a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_INSTANT_MESSAGE_PROJECTION, 24405a60e47497f21f64e6d79420dc4c56c1907df22akschulz where, null, BluetoothMapContract.MessageColumns.DATE + " DESC"); 24415a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 24425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) { 24435a60e47497f21f64e6d79420dc4c56c1907df22akschulz cnt += c.getCount(); 24445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 24465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 24475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2448326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2449326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2450326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 245170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz if (D) Log.d(TAG, "msgListingHasUnread: numUnread = " + cnt); 245270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return (cnt>0)?true:false; 245370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 2454fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2455fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /** 24565a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Build the conversation listing. 24575a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap The Application Parameters 24585a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param sizeOnly TRUE: don't populate the list members, only build the list to get the size. 24595a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 24605a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 24615a60e47497f21f64e6d79420dc4c56c1907df22akschulz public BluetoothMapConvoListing convoListing(BluetoothMapAppParams ap, boolean sizeOnly) { 24625a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "convoListing: " + " messageType = " + ap.getFilterMessageType() ); 24645a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListing convoList = new BluetoothMapConvoListing(); 24655a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24665a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We overwrite the parameter mask here if it is 0 or not present, as this 24675a60e47497f21f64e6d79420dc4c56c1907df22akschulz * should cause all parameters to be included in the message list. */ 24685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getConvoParameterMask() == BluetoothMapAppParams.INVALID_VALUE_PARAMETER || 24695a60e47497f21f64e6d79420dc4c56c1907df22akschulz ap.getConvoParameterMask() == 0) { 24705a60e47497f21f64e6d79420dc4c56c1907df22akschulz ap.setConvoParameterMask(CONVO_PARAMETER_MASK_DEFAULT); 24715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.v(TAG, "convoListing(): appParameterMask is zero or not present, " + 24725a60e47497f21f64e6d79420dc4c56c1907df22akschulz "changing to default: " + ap.getConvoParameterMask()); 24735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 24745a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24755a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Possible filters: 24765a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Recipient name (contacts DB) or id (for SMS/MMS this is the thread-id contact-id) 24775a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Activity start/begin 24785a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Read status 24795a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Thread_id 24805a60e47497f21f64e6d79420dc4c56c1907df22akschulz * The strategy for SMS/MMS 24815a60e47497f21f64e6d79420dc4c56c1907df22akschulz * With no filter on name - use limit and offset. 24825a60e47497f21f64e6d79420dc4c56c1907df22akschulz * With a filter on name - build the complete list of conversations and create a filter 24835a60e47497f21f64e6d79420dc4c56c1907df22akschulz * mechanism 24845a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 24855a60e47497f21f64e6d79420dc4c56c1907df22akschulz * The strategy for IM: 24865a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Join the conversation table with the contacts table in a way that makes it possible to 24875a60e47497f21f64e6d79420dc4c56c1907df22akschulz * get the data needed in a single query. 24885a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Manually handle limit/offset 24895a60e47497f21f64e6d79420dc4c56c1907df22akschulz * */ 24905a60e47497f21f64e6d79420dc4c56c1907df22akschulz 24915a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Cache some info used throughout filtering */ 24925a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi = new FilterInfo(); 24935a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFilterInfo(fi); 24945a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor smsMmsCursor = null; 24955a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor imEmailCursor = null; 24965a60e47497f21f64e6d79420dc4c56c1907df22akschulz int offsetNum; 24975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly) { 24985a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = 0; 24995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 25005a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = ap.getStartOffset(); 25015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25025a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Inverse meaning - hence a 1 is include. 25035a60e47497f21f64e6d79420dc4c56c1907df22akschulz int msgTypesInclude = ((~ap.getFilterMessageType()) 25045a60e47497f21f64e6d79420dc4c56c1907df22akschulz & BluetoothMapAppParams.FILTER_MSG_TYPE_MASK); 25055a60e47497f21f64e6d79420dc4c56c1907df22akschulz int maxThreads = ap.getMaxListCount()+ap.getStartOffset(); 25065a60e47497f21f64e6d79420dc4c56c1907df22akschulz 25075a60e47497f21f64e6d79420dc4c56c1907df22akschulz 25085a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 25095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsSelected(fi, ap) || mmsSelected(ap)) { 25105a60e47497f21f64e6d79420dc4c56c1907df22akschulz String limit = ""; 25115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((sizeOnly == false) && (ap.getMaxListCount()>0) && 25125a60e47497f21f64e6d79420dc4c56c1907df22akschulz (ap.getFilterRecipient()==null)){ 25135a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We can only use limit if we do not have a contacts filter */ 25145a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit=" LIMIT " + maxThreads; 25155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25165a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder sortOrder = new StringBuilder(Threads.DATE + " DESC"); 25175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((sizeOnly == false) && 25185a60e47497f21f64e6d79420dc4c56c1907df22akschulz ((msgTypesInclude & ~(BluetoothMapAppParams.FILTER_NO_SMS_GSM | 25195a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_SMS_CDMA) | 25205a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams.FILTER_NO_MMS) == 0) 25215a60e47497f21f64e6d79420dc4c56c1907df22akschulz && ap.getFilterRecipient() == null){ 25225a60e47497f21f64e6d79420dc4c56c1907df22akschulz // SMS/MMS messages only and no recipient filter - use optimization. 25235a60e47497f21f64e6d79420dc4c56c1907df22akschulz limit = " LIMIT " + ap.getMaxListCount()+" OFFSET "+ ap.getStartOffset(); 25245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "SMS Limit => "+limit); 25255a60e47497f21f64e6d79420dc4c56c1907df22akschulz offsetNum = 0; 25265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25275a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder selection = new StringBuilder(120); // This covers most cases 25285a60e47497f21f64e6d79420dc4c56c1907df22akschulz ArrayList<String> selectionArgs = new ArrayList<String>(12); // Covers all cases 25295a60e47497f21f64e6d79420dc4c56c1907df22akschulz selection.append("1=1 "); // just to simplify building the where-clause 25305a60e47497f21f64e6d79420dc4c56c1907df22akschulz setConvoWhereFilterSmsMms(selection, selectionArgs, fi, ap); 25315a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] args = null; 25325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(selectionArgs.size() > 0) { 25335a60e47497f21f64e6d79420dc4c56c1907df22akschulz args = new String[selectionArgs.size()]; 25345a60e47497f21f64e6d79420dc4c56c1907df22akschulz selectionArgs.toArray(args); 25355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25365a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Threads.CONTENT_URI.buildUpon() 25375a60e47497f21f64e6d79420dc4c56c1907df22akschulz .appendQueryParameter("simple", "true").build(); 25385a60e47497f21f64e6d79420dc4c56c1907df22akschulz sortOrder.append(limit); 25395a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Query using selection: " + selection.toString() + 25405a60e47497f21f64e6d79420dc4c56c1907df22akschulz " - sortOrder: " + sortOrder.toString()); 25415a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Optimize: Reduce projection based on convo parameter mask 25425a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor = mResolver.query(uri, MMS_SMS_THREAD_PROJECTION, selection.toString(), 25435a60e47497f21f64e6d79420dc4c56c1907df22akschulz args, sortOrder.toString()); 25445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (smsMmsCursor != null) { 25455a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 25465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + smsMmsCursor.getCount() 25475a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " sms/mms conversations."); 25485a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = null; 25495a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.moveToPosition(-1); 25505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterRecipient() == null) { 25515a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 25525a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We have no Recipient filter, add contacts after the list is reduced 25535a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (smsMmsCursor.moveToNext()) { 25545a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = createConvoElement(smsMmsCursor, fi, ap); 25555a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.add(convoElement); 25565a60e47497f21f64e6d79420dc4c56c1907df22akschulz count++; 25575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly == false && count >= maxThreads) { 25585a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 25595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 25625a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We must be able to filter on recipient, add contacts now 25635a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts = new SmsMmsContacts(); 25645a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (smsMmsCursor.moveToNext()) { 25655a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 25665a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = createConvoElement(smsMmsCursor, fi, ap); 25675a60e47497f21f64e6d79420dc4c56c1907df22akschulz String idsStr = 25685a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.getString(MMS_SMS_THREAD_COL_RECIPIENT_IDS); 25695a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Add elements only if we do find a contact - if not we cannot apply 25705a60e47497f21f64e6d79420dc4c56c1907df22akschulz // the filter, hence the item is irrelevant 25715a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Perhaps the spec. should be changes to be able to search on 25725a60e47497f21f64e6d79420dc4c56c1907df22akschulz // phone number as well? 25735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addSmsMmsContacts(convoElement, contacts, idsStr, 25745a60e47497f21f64e6d79420dc4c56c1907df22akschulz ap.getFilterRecipient(), ap)) { 25755a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.add(convoElement); 25765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly == false && count >= maxThreads) { 25775a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 25785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25815a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25825a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25845a60e47497f21f64e6d79420dc4c56c1907df22akschulz 25855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (emailSelected(ap) || imSelected(ap)) { 25865a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 25875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(emailSelected(ap)) { 25885a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 25895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(imSelected(ap)) { 25905a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 25915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 25925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "msgType: " + fi.mMsgType); 25935a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVERSATION); 25945a60e47497f21f64e6d79420dc4c56c1907df22akschulz 25955a60e47497f21f64e6d79420dc4c56c1907df22akschulz contentUri = appendConvoListQueryParameters(ap, contentUri); 25965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG, "URI with parameters: " + contentUri.toString()); 25975a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Optimize: Reduce projection based on convo parameter mask 25985a60e47497f21f64e6d79420dc4c56c1907df22akschulz imEmailCursor = mResolver.query(contentUri, 25995a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONVERSATION_PROJECTION, 26005a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null, BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY 26015a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " DESC, " + BluetoothMapContract.ConversationColumns.THREAD_ID 26025a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " ASC"); 26035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imEmailCursor != null) { 26045a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement e = null; 26055a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 26065a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Here we rely on only a single account-based message type for each MAS. 26075a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setEmailImConvoColumns(imEmailCursor); 26085a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean isValid = imEmailCursor.moveToNext(); 26095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + imEmailCursor.getCount() 26105a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " EMAIL/IM conversations. isValid = " + isValid); 26115a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (isValid && ((sizeOnly == true) || (count < maxThreads))) { 26125a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId = imEmailCursor.getLong(fi.mConvoColConvoId); 26135a60e47497f21f64e6d79420dc4c56c1907df22akschulz long nextThreadId; 26145a60e47497f21f64e6d79420dc4c56c1907df22akschulz count ++; 26155a60e47497f21f64e6d79420dc4c56c1907df22akschulz e = createConvoElement(imEmailCursor, fi, ap); 26165a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.add(e); 26175a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26185a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 26195a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId = imEmailCursor.getLong(fi.mConvoColConvoId); 26205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.i(TAG, " threadId = " + threadId + " newThreadId = " + 26215a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId); 26225a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: This seems rather inefficient in the case where we do not need 26235a60e47497f21f64e6d79420dc4c56c1907df22akschulz // to reduce the list. 26245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while ((nextThreadId == threadId) && 26255a60e47497f21f64e6d79420dc4c56c1907df22akschulz (isValid = imEmailCursor.moveToNext() == true)); 26265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26295a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26305a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Done adding conversations - list size:" + 26315a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.getCount()); 26325a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26335a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If sizeOnly - we are all done here - return the list as is - no need to populate the 26345a60e47497f21f64e6d79420dc4c56c1907df22akschulz // list. 26355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(sizeOnly) { 26365a60e47497f21f64e6d79420dc4c56c1907df22akschulz return convoList; 26375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26385a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26395a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Enable this if post sorting and segmenting needed */ 26405a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* This is too early */ 26415a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.sort(); 26425a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoList.segment(ap.getMaxListCount(), offsetNum); 26435a60e47497f21f64e6d79420dc4c56c1907df22akschulz List<BluetoothMapConvoListingElement> list = convoList.getList(); 26445a60e47497f21f64e6d79420dc4c56c1907df22akschulz int listSize = list.size(); 26455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.i(TAG, "List Size:" + listSize); 26465a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor tmpCursor = null; 26475a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts = new SmsMmsContacts(); 26485a60e47497f21f64e6d79420dc4c56c1907df22akschulz for(int x=0;x<listSize;x++){ 26495a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement ele = list.get(x); 26505a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE type = ele.getType(); 26515a60e47497f21f64e6d79420dc4c56c1907df22akschulz switch(type) { 26525a60e47497f21f64e6d79420dc4c56c1907df22akschulz case SMS_CDMA: 26535a60e47497f21f64e6d79420dc4c56c1907df22akschulz case SMS_GSM: 26545a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS: { 26555a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = null; // SMS/MMS needs special treatment 26565a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(smsMmsCursor != null) { 26575a60e47497f21f64e6d79420dc4c56c1907df22akschulz populateSmsMmsConvoElement(ele, smsMmsCursor, ap, contacts); 26585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) fi.mMsgType = FilterInfo.TYPE_IM; 26605a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26625a60e47497f21f64e6d79420dc4c56c1907df22akschulz case EMAIL: 26635a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = imEmailCursor; 26645a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_EMAIL; 26655a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26665a60e47497f21f64e6d79420dc4c56c1907df22akschulz case IM: 26675a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = imEmailCursor; 26685a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.mMsgType = FilterInfo.TYPE_IM; 26695a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26705a60e47497f21f64e6d79420dc4c56c1907df22akschulz default: 26715a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor = null; 26725a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 26735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26745a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26755a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Working on cursor of type " + fi.mMsgType); 26765a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26775a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(tmpCursor != null){ 26785a60e47497f21f64e6d79420dc4c56c1907df22akschulz populateImEmailConvoElement(ele, tmpCursor, ap, fi); 26795a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else { 26805a60e47497f21f64e6d79420dc4c56c1907df22akschulz // No, it will be for SMS/MMS at the moment 26815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "tmpCursor is Null - something is wrong - or the message is" + 26825a60e47497f21f64e6d79420dc4c56c1907df22akschulz " of type SMS/MMS"); 26835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26855a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 26865a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(imEmailCursor != null)imEmailCursor.close(); 26875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(smsMmsCursor != null)smsMmsCursor.close(); 26885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "conversation end"); 26895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26905a60e47497f21f64e6d79420dc4c56c1907df22akschulz return convoList; 26915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 26925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26945a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 26955a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Refreshes the entire list of SMS/MMS conversation version counters. Use it to generate a 26965a60e47497f21f64e6d79420dc4c56c1907df22akschulz * new ConvoListVersinoCounter in mSmsMmsConvoListVersion 26975a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 26985a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 26995a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* package */ 27005a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean refreshSmsMmsConvoVersions() { 27015a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 27025a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor cursor = null; 27035a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Threads.CONTENT_URI.buildUpon() 27045a60e47497f21f64e6d79420dc4c56c1907df22akschulz .appendQueryParameter("simple", "true").build(); 27055a60e47497f21f64e6d79420dc4c56c1907df22akschulz cursor = mResolver.query(uri, MMS_SMS_THREAD_PROJECTION, null, 27065a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, Threads.DATE + " DESC"); 27075a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 27085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (cursor != null) { 27095a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 27105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Found " + cursor.getCount() 27115a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " sms/mms conversations."); 27125a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = null; 27135a60e47497f21f64e6d79420dc4c56c1907df22akschulz cursor.moveToPosition(-1); 27145a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized (getSmsMmsConvoList()) { 27155a60e47497f21f64e6d79420dc4c56c1907df22akschulz int size = Math.max(getSmsMmsConvoList().size(), cursor.getCount()); 27165a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> newList = 27175a60e47497f21f64e6d79420dc4c56c1907df22akschulz new HashMap<Long,BluetoothMapConvoListingElement>(size); 27185a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (cursor.moveToNext()) { 27195a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Extract to function, that can be called at listing, which returns 27205a60e47497f21f64e6d79420dc4c56c1907df22akschulz // the versionCounter(existing or new). 27215a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 27225a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long id = cursor.getLong(MMS_SMS_THREAD_COL_ID); 27235a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = getSmsMmsConvoList().remove(id); 27245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 27255a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 27265a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 27275a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_SMS_MMS, id); 27285a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27295a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 27305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27315a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Currently we only need to compare name, last_activity and read_status, and 27325a60e47497f21f64e6d79420dc4c56c1907df22akschulz // name is not used for SMS/MMS. 27335a60e47497f21f64e6d79420dc4c56c1907df22akschulz // msg delete will be handled by update folderVersionCounter(). 27345a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = cursor.getLong(MMS_SMS_THREAD_COL_DATE); 27355a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (cursor.getInt(MMS_SMS_THREAD_COL_READ) == 1) ? 27365a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 27375a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 27395a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 27405a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 27415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27425a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 27445a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 27455a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 27465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27475a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27485a60e47497f21f64e6d79420dc4c56c1907df22akschulz String idsStr = cursor.getString(MMS_SMS_THREAD_COL_RECIPIENT_IDS); 27495a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!idsStr.equals(convoElement.getSmsMmsContacts())) { 27505a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This should not trigger a change in conversationVersionCounter only the 27515a60e47497f21f64e6d79420dc4c56c1907df22akschulz // ConvoListVersionCounter. 27525a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27535a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setSmsMmsContacts(idsStr); 27545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27555a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27565a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 27575a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27585a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 27595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27605a60e47497f21f64e6d79420dc4c56c1907df22akschulz newList.put(id, convoElement); 27615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27625a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If we still have items on the old list, something was deleted 27635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(getSmsMmsConvoList().size() != 0) { 27645a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 27655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27665a60e47497f21f64e6d79420dc4c56c1907df22akschulz setSmsMmsConvoList(newList); 27675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27685a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 27705a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateSmsMmsConvoListVersionCounter(); 27715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 27745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(cursor != null) { 27755a60e47497f21f64e6d79420dc4c56c1907df22akschulz cursor.close(); 27765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27775a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27785a60e47497f21f64e6d79420dc4c56c1907df22akschulz return listChangeDetected; 27795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27805a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27815a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 27825a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Refreshes the entire list of SMS/MMS conversation version counters. Use it to generate a 27835a60e47497f21f64e6d79420dc4c56c1907df22akschulz * new ConvoListVersinoCounter in mSmsMmsConvoListVersion 27845a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 27855a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 27865a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* package */ 27875a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean refreshImEmailConvoVersions() { 27885a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 27895a60e47497f21f64e6d79420dc4c56c1907df22akschulz FilterInfo fi = new FilterInfo(); 27905a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27915a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVERSATION); 27925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 27935a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG, "URI with parameters: " + contentUri.toString()); 27945a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor imEmailCursor = mResolver.query(contentUri, 27955a60e47497f21f64e6d79420dc4c56c1907df22akschulz CONVO_VERSION_PROJECTION, 27965a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null, BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY 27975a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " DESC, " + BluetoothMapContract.ConversationColumns.THREAD_ID 27985a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " ASC"); 27995a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 28005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (imEmailCursor != null) { 28015a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = null; 28025a60e47497f21f64e6d79420dc4c56c1907df22akschulz // store column index so we don't have to look them up anymore (optimization) 28035a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Here we rely on only a single account-based message type for each MAS. 28045a60e47497f21f64e6d79420dc4c56c1907df22akschulz fi.setEmailImConvoColumns(imEmailCursor); 28055a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean isValid = imEmailCursor.moveToNext(); 28065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Found " + imEmailCursor.getCount() 28075a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " EMAIL/IM conversations. isValid = " + isValid); 28085a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized (getImEmailConvoList()) { 28095a60e47497f21f64e6d79420dc4c56c1907df22akschulz int size = Math.max(getImEmailConvoList().size(), imEmailCursor.getCount()); 28105a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 28115a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> newList = 28125a60e47497f21f64e6d79420dc4c56c1907df22akschulz new HashMap<Long,BluetoothMapConvoListingElement>(size); 28135a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (isValid) { 28145a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = imEmailCursor.getLong(fi.mConvoColConvoId); 28155a60e47497f21f64e6d79420dc4c56c1907df22akschulz long nextThreadId; 28165a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = getImEmailConvoList().remove(id); 28175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 28185a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 28195a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 28205a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_EMAIL_IM, id); 28215a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 28225a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 28235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28245a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = imEmailCursor.getString(fi.mConvoColName); 28255a60e47497f21f64e6d79420dc4c56c1907df22akschulz String summary = imEmailCursor.getString(fi.mConvoColSummary); 28265a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = imEmailCursor.getLong(fi.mConvoColLastActivity); 28275a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (imEmailCursor.getInt(fi.mConvoColRead) == 1) ? 28285a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 28295a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28305a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 28315a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28325a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 28335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 28365a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28375a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 28385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28395a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name != null && !name.equals(convoElement.getName())) { 28415a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28425a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setName(name); 28435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28445a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(summary != null && !summary.equals(convoElement.getFullSummary())) { 28465a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 28475a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setSummary(summary); 28485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28495a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* If the query returned one row for each contact, skip all the dublicates */ 28505a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 28515a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId = imEmailCursor.getLong(fi.mConvoColConvoId); 28525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.i(TAG, " threadId = " + id + " newThreadId = " + 28535a60e47497f21f64e6d79420dc4c56c1907df22akschulz nextThreadId); 28545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while ((nextThreadId == id) && 28555a60e47497f21f64e6d79420dc4c56c1907df22akschulz (isValid = imEmailCursor.moveToNext() == true)); 28565a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 28585a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 28595a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 28605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28615a60e47497f21f64e6d79420dc4c56c1907df22akschulz newList.put(id, convoElement); 28625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28635a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If we still have items on the old list, something was deleted 28645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(getImEmailConvoList().size() != 0) { 28655a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 28665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28675a60e47497f21f64e6d79420dc4c56c1907df22akschulz setImEmailConvoList(newList); 28685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28705a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 28715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(imEmailCursor != null) { 28725a60e47497f21f64e6d79420dc4c56c1907df22akschulz imEmailCursor.close(); 28735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28745a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28755a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 28775a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateImEmailConvoListVersionCounter(); 28785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28795a60e47497f21f64e6d79420dc4c56c1907df22akschulz return listChangeDetected; 28805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 28815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 28825a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 28835a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Update the convoVersionCounter within the element passed as parameter. 28845a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function has the side effect to update the ConvoListVersionCounter if needed. 28855a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function ignores changes to contacts as this shall not change the convoVersionCounter, 28865a60e47497f21f64e6d79420dc4c56c1907df22akschulz * only the convoListVersion counter, which will be updated upon request. 28875a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele Element to update shall not be null. 28885a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 28895a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void updateSmsMmsConvoVersion(Cursor cursor, BluetoothMapConvoListingElement ele) { 28905a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = ele.getCpConvoId(); 28915a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = getSmsMmsConvoList().get(id); 28925a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 28935a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 28945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 28955a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 28965a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 28975a60e47497f21f64e6d79420dc4c56c1907df22akschulz getSmsMmsConvoList().put(id, convoElement); 28985a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_SMS_MMS, id); 28995a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 29005a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 29015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29025a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = cursor.getLong(MMS_SMS_THREAD_COL_DATE); 29035a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (cursor.getInt(MMS_SMS_THREAD_COL_READ) == 1) ? 29045a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 29055a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 29075a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29085a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 29095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29105a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 29125a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29135a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 29145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29155a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29165a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 29175a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 29185a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 29195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 29215a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateSmsMmsConvoListVersionCounter(); 29225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29235a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setVersionCounter(convoElement.getVersionCounter()); 29245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29265a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 29275a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Update the convoVersionCounter within the element passed as parameter. 29285a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function has the side effect to update the ConvoListVersionCounter if needed. 29295a60e47497f21f64e6d79420dc4c56c1907df22akschulz * This function ignores changes to contacts as this shall not change the convoVersionCounter, 29305a60e47497f21f64e6d79420dc4c56c1907df22akschulz * only the convoListVersion counter, which will be updated upon request. 29315a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele Element to update shall not be null. 29325a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 29335a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void updateImEmailConvoVersion(Cursor cursor, FilterInfo fi, 29345a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement ele) { 29355a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = ele.getCpConvoId(); 29365a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoListingElement convoElement = getImEmailConvoList().get(id); 29375a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChangeDetected = false; 29385a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean convoChanged = false; 29395a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoElement == null) { 29405a60e47497f21f64e6d79420dc4c56c1907df22akschulz // New conversation added 29415a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Added new conversation with ID = " + id); 29425a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement = new BluetoothMapConvoListingElement(); 29435a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_EMAIL_IM, id); 29445a60e47497f21f64e6d79420dc4c56c1907df22akschulz getImEmailConvoList().put(id, convoElement); 29455a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 29465a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setVersionCounter(0); 29475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29485a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = cursor.getString(fi.mConvoColName); 29495a60e47497f21f64e6d79420dc4c56c1907df22akschulz long last_activity = cursor.getLong(fi.mConvoColLastActivity); 29505a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (cursor.getInt(fi.mConvoColRead) == 1) ? 29515a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 29525a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(last_activity != convoElement.getLastActivity()) { 29545a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29555a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setLastActivity(last_activity); 29565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29575a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != convoElement.getReadBool()) { 29595a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29605a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setRead(read, false); 29615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29625a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name != null && !name.equals(convoElement.getName())) { 29645a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoChanged = true; 29655a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.setName(name); 29665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoChanged) { 29695a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChangeDetected = true; 29705a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "conversation with ID = " + id + " changed"); 29715a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.incrementVersionCounter(); 29725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(listChangeDetected) { 29745a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateImEmailConvoListVersionCounter(); 29755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29765a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setVersionCounter(convoElement.getVersionCounter()); 29775a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 29785a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29795a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 29805a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele 29815a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param smsMmsCursor 29825a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap 29835a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contacts 29845a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 29855a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void populateSmsMmsConvoElement(BluetoothMapConvoListingElement ele, 29865a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor smsMmsCursor, BluetoothMapAppParams ap, 29875a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts) { 29885a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.moveToPosition(ele.getCursorIndex()); 29895a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: If we ever get beyond 31 bit, change to long 29905a60e47497f21f64e6d79420dc4c56c1907df22akschulz int parameterMask = (int) ap.getConvoParameterMask(); // We always set a default value 29915a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29925a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: How to determine whether the convo-IDs can be used across message 29935a60e47497f21f64e6d79420dc4c56c1907df22akschulz // types? 29945a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_SMS_MMS, 29955a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.getLong(MMS_SMS_THREAD_COL_ID)); 29965a60e47497f21f64e6d79420dc4c56c1907df22akschulz 29975a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean read = (smsMmsCursor.getInt(MMS_SMS_THREAD_COL_READ) == 1) ? 29985a60e47497f21f64e6d79420dc4c56c1907df22akschulz true : false; 29995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_READ_STATUS) != 0) { 30005a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setRead(read, true); 30015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 30025a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setRead(read, false); 30035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30045a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_LAST_ACTIVITY) != 0) { 30065a60e47497f21f64e6d79420dc4c56c1907df22akschulz long timeStamp = smsMmsCursor.getLong(MMS_SMS_THREAD_COL_DATE); 30075a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(timeStamp); 30085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 30095a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We need to delete the time stamp, if it was added for multi msg-type 30105a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(-1); 30115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30125a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_VERSION_COUNTER) != 0) { 30145a60e47497f21f64e6d79420dc4c56c1907df22akschulz updateSmsMmsConvoVersion(smsMmsCursor, ele); 30155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30165a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_NAME) != 0) { 30185a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setName(""); // We never have a thread name for SMS/MMS 30195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30205a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_SUMMARY) != 0) { 30225a60e47497f21f64e6d79420dc4c56c1907df22akschulz String summary = smsMmsCursor.getString(MMS_SMS_THREAD_COL_SNIPPET); 30235a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cs = smsMmsCursor.getString(MMS_SMS_THREAD_COL_SNIPPET_CS); 30245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(summary != null && cs != null && !cs.equals("UTF-8")) { 30255a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 30265a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Not sure this is how to convert to UTF-8 30275a60e47497f21f64e6d79420dc4c56c1907df22akschulz summary = new String(summary.getBytes(cs),"UTF-8"); 30285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (UnsupportedEncodingException e){/*Cannot happen*/} 30295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30305a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setSummary(summary); 30315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30325a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PARTTICIPANTS) != 0) { 30345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterRecipient() == null) { 30355a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Add contacts only if not already added 30365a60e47497f21f64e6d79420dc4c56c1907df22akschulz String idsStr = 30375a60e47497f21f64e6d79420dc4c56c1907df22akschulz smsMmsCursor.getString(MMS_SMS_THREAD_COL_RECIPIENT_IDS); 30385a60e47497f21f64e6d79420dc4c56c1907df22akschulz addSmsMmsContacts(ele, contacts, idsStr, null, ap); 30395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30425a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30435a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 30445a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ele 30455a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param tmpCursor 30465a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param fi 30475a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 30485a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void populateImEmailConvoElement( BluetoothMapConvoListingElement ele, 30495a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor tmpCursor, BluetoothMapAppParams ap, FilterInfo fi) { 30505a60e47497f21f64e6d79420dc4c56c1907df22akschulz tmpCursor.moveToPosition(ele.getCursorIndex()); 30515a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: If we ever get beyond 31 bit, change to long 30525a60e47497f21f64e6d79420dc4c56c1907df22akschulz int parameterMask = (int) ap.getConvoParameterMask(); // We always set a default value 30535a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId = tmpCursor.getLong(fi.mConvoColConvoId); 30545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30555a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Mandatory field 30565a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setConvoId(BluetoothMapUtils.CONVO_ID_TYPE_EMAIL_IM, threadId); 30575a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_NAME) != 0) { 30595a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setName(tmpCursor.getString(fi.mConvoColName)); 30605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30615a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30625a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean reportRead = false; 30635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_READ_STATUS) != 0) { 30645a60e47497f21f64e6d79420dc4c56c1907df22akschulz reportRead = true; 30655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30665a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setRead(((1==tmpCursor.getInt(fi.mConvoColRead))?true:false), reportRead); 30675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30685a60e47497f21f64e6d79420dc4c56c1907df22akschulz long timestamp = tmpCursor.getLong(fi.mConvoColLastActivity); 30695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_LAST_ACTIVITY) != 0) { 30705a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(timestamp); 30715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 30725a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We need to delete the time stamp, if it was added for multi msg-type 30735a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setLastActivity(-1); 30745a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30755a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30765a60e47497f21f64e6d79420dc4c56c1907df22akschulz 30775a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_VERSION_COUNTER) != 0) { 30785a60e47497f21f64e6d79420dc4c56c1907df22akschulz updateImEmailConvoVersion(tmpCursor, fi, ele); 30795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_CONVO_SUMMARY) != 0) { 30815a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.setSummary(tmpCursor.getString(fi.mConvoColSummary)); 30825a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30835a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: For optimization, we could avoid joining the contact and convo tables 30845a60e47497f21f64e6d79420dc4c56c1907df22akschulz // if we have no filter nor this bit is set. 30855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PARTTICIPANTS) != 0) { 30865a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 30875a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement c = new BluetoothMapConvoContactElement(); 30885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_X_BT_UID) != 0) { 30895a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setBtUid(new SignedLongLong(tmpCursor.getLong(fi.mContactColBtUid),0)); 30905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_CHAT_STATE) != 0) { 30925a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setChatState(tmpCursor.getInt(fi.mContactColChatState)); 30935a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_PRESENCE) != 0) { 30955a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setPresenceAvailability(tmpCursor.getInt(fi.mContactColPresenceState)); 30965a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 30975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_PRESENCE_TEXT) != 0) { 30985a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setPresenceStatus(tmpCursor.getString(fi.mContactColPresenceText)); 30995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_PRIORITY) != 0) { 31015a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setPriority(tmpCursor.getInt(fi.mContactColPriority)); 31025a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_DISP_NAME) != 0) { 31045a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setDisplayName(tmpCursor.getString(fi.mContactColNickname)); 31055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_UCI) != 0) { 31075a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setContactId(tmpCursor.getString(fi.mContactColContactUci)); 31085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_LAST_ACTIVITY) != 0) { 31105a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setLastActivity(tmpCursor.getLong(fi.mContactColLastActive)); 31115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_NAME) != 0) { 31135a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.setName(tmpCursor.getString(fi.mContactColName)); 31145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31155a60e47497f21f64e6d79420dc4c56c1907df22akschulz ele.addContact(c); 31165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (tmpCursor.moveToNext() == true 31175a60e47497f21f64e6d79420dc4c56c1907df22akschulz && tmpCursor.getLong(fi.mConvoColConvoId) == threadId); 31185a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31205a60e47497f21f64e6d79420dc4c56c1907df22akschulz 31215a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 31225a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Extract the ConvoList parameters from appParams and build the matching URI with 31235a60e47497f21f64e6d79420dc4c56c1907df22akschulz * query parameters. 31245a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param ap the appParams from the request 31255a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contentUri the URI to append parameters to 31265a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return the new URI with the appended parameters (if any) 31275a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 31285a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Uri appendConvoListQueryParameters(BluetoothMapAppParams ap, 31295a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri) { 31305a60e47497f21f64e6d79420dc4c56c1907df22akschulz Builder newUri = contentUri.buildUpon(); 31315a60e47497f21f64e6d79420dc4c56c1907df22akschulz String str = ap.getFilterRecipient(); 31325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(str != null) { 31335a60e47497f21f64e6d79420dc4c56c1907df22akschulz str = str.trim(); 31345a60e47497f21f64e6d79420dc4c56c1907df22akschulz str = str.replace("*", "%"); 31355a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_ORIGINATOR_SUBSTRING, str); 31365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31375a60e47497f21f64e6d79420dc4c56c1907df22akschulz long time = ap.getFilterLastActivityBegin(); 31385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(time > 0) { 31395a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_PERIOD_BEGIN, 31405a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long.toString(time)); 31415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31425a60e47497f21f64e6d79420dc4c56c1907df22akschulz time = ap.getFilterLastActivityEnd(); 31435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(time > 0) { 31445a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_PERIOD_END, 31455a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long.toString(time)); 31465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31475a60e47497f21f64e6d79420dc4c56c1907df22akschulz int readStatus = ap.getFilterReadStatus(); 31485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(readStatus > 0) { 31495a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(readStatus == 1) { 31505a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Conversations with Unread messages only 31515a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_READ_STATUS, 31525a60e47497f21f64e6d79420dc4c56c1907df22akschulz "false"); 31535a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else if(readStatus == 2) { 31545a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Conversations with all read messages only 31555a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_READ_STATUS, 31565a60e47497f21f64e6d79420dc4c56c1907df22akschulz "true"); 31575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31585a60e47497f21f64e6d79420dc4c56c1907df22akschulz // if both are set it will be the same as requesting an empty list, but 31595a60e47497f21f64e6d79420dc4c56c1907df22akschulz // as it makes no sense with such a structure in a bit mask, we treat 31605a60e47497f21f64e6d79420dc4c56c1907df22akschulz // requesting both the same as no filtering. 31615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31625a60e47497f21f64e6d79420dc4c56c1907df22akschulz long convoId = -1; 31635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(ap.getFilterConvoId() != null) { 31645a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoId = ap.getFilterConvoId().getLeastSignificantBits(); 31655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31665a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(convoId > 0) { 31675a60e47497f21f64e6d79420dc4c56c1907df22akschulz newUri.appendQueryParameter(BluetoothMapContract.FILTER_THREAD_ID, 31685a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long.toString(convoId)); 31695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31705a60e47497f21f64e6d79420dc4c56c1907df22akschulz return newUri.build(); 31715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31725a60e47497f21f64e6d79420dc4c56c1907df22akschulz 31735a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 31745a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Procedure if we have a filter: 31755a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - loop through all ids to examine if there is a match (this will build the cache) 31765a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - If there is a match loop again to add all contacts. 31775a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 31785a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Procedure if we don't have a filter 31795a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - Add all contacts 31805a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 31815a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param convoElement 31825a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contacts 31835a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param idsStr 31845a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param recipientFilter 31855a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return 31865a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 31875a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean addSmsMmsContacts( BluetoothMapConvoListingElement convoElement, 31885a60e47497f21f64e6d79420dc4c56c1907df22akschulz SmsMmsContacts contacts, String idsStr, String recipientFilter, 31895a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams ap) { 31905a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement contactElement; 31915a60e47497f21f64e6d79420dc4c56c1907df22akschulz int parameterMask = (int) ap.getConvoParameterMask(); // We always set a default value 31925a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean foundContact = false; 31935a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] ids = idsStr.split(" "); 31945a60e47497f21f64e6d79420dc4c56c1907df22akschulz long[] longIds = new long[ids.length]; 31955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(recipientFilter != null) { 31965a60e47497f21f64e6d79420dc4c56c1907df22akschulz recipientFilter = recipientFilter.trim(); 31975a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 31985a60e47497f21f64e6d79420dc4c56c1907df22akschulz 31995a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (int i = 0; i < ids.length; i++) { 32005a60e47497f21f64e6d79420dc4c56c1907df22akschulz long longId; 32015a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 32025a60e47497f21f64e6d79420dc4c56c1907df22akschulz longId = Long.parseLong(ids[i]); 32035a60e47497f21f64e6d79420dc4c56c1907df22akschulz longIds[i] = longId; 32045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(recipientFilter == null) { 32055a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If there is not filter, all we need to do is to parse the ids 32065a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = true; 32075a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32095a60e47497f21f64e6d79420dc4c56c1907df22akschulz String addr = contacts.getPhoneNumber(mResolver, longId); 32105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addr == null) { 32115a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This can only happen if all messages from a contact is deleted while 32125a60e47497f21f64e6d79420dc4c56c1907df22akschulz // performing the query. 32135a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32155a60e47497f21f64e6d79420dc4c56c1907df22akschulz MapContact contact = 32165a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts.getContactNameFromPhone(addr, mResolver, recipientFilter); 32175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) { 32185a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG, " id " + longId + ": " + addr); 32195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contact != null) { 32205a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG," contact name: " + contact.getName() + " X-BT-UID: " 32215a60e47497f21f64e6d79420dc4c56c1907df22akschulz + contact.getXBtUid()); 32225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contact == null) { 32255a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32275a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = true; 32285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NumberFormatException ex) { 32295a60e47497f21f64e6d79420dc4c56c1907df22akschulz // skip this id 32305a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32325a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32335a60e47497f21f64e6d79420dc4c56c1907df22akschulz 32345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(foundContact == true) { 32355a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = false; 32365a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (long id : longIds) { 32375a60e47497f21f64e6d79420dc4c56c1907df22akschulz String addr = contacts.getPhoneNumber(mResolver, id); 32385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(addr == null) { 32395a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This can only happen if all messages from a contact is deleted while 32405a60e47497f21f64e6d79420dc4c56c1907df22akschulz // performing the query. 32415a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 32425a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32435a60e47497f21f64e6d79420dc4c56c1907df22akschulz foundContact = true; 32445a60e47497f21f64e6d79420dc4c56c1907df22akschulz MapContact contact = contacts.getContactNameFromPhone(addr, mResolver); 32455a60e47497f21f64e6d79420dc4c56c1907df22akschulz 32465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contact == null) { 32475a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We do not have a contact, we need to manually add one 32485a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement = new BluetoothMapConvoContactElement(); 32495a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_NAME) != 0) { 32505a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setName(addr); // Use the phone number as name 32515a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_UCI) != 0) { 32535a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setContactId(addr); 32545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32555a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 32565a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement = BluetoothMapConvoContactElement 32575a60e47497f21f64e6d79420dc4c56c1907df22akschulz .createFromMapContact(contact, addr); 32585a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Remove the parameters not to be reported 32595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_UCI) == 0) { 32605a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setContactId(null); 32615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32625a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_X_BT_UID) == 0) { 32635a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setBtUid(null); 32645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32655a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((parameterMask & CONVO_PARAM_MASK_PART_DISP_NAME) == 0) { 32665a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactElement.setDisplayName(null); 32675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32695a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoElement.addContact(contactElement); 32705a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32725a60e47497f21f64e6d79420dc4c56c1907df22akschulz return foundContact; 32735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 32745a60e47497f21f64e6d79420dc4c56c1907df22akschulz 32755a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 3276fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * Get the folder name of an SMS message or MMS message. 3277fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @param c the cursor pointing at the message 3278fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * @return the folder name. 3279fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie */ 3280fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private String getFolderName(int type, int threadId) { 3281fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3282fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if(threadId == -1) 3283326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_DELETED; 3284fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3285fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie switch(type) { 3286fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 1: 3287326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_INBOX; 3288fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 2: 3289326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_SENT; 3290fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 3: 3291326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_DRAFT; 3292fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 4: // Just name outbox, failed and queued "outbox" 3293fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 5: 3294fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case 6: 3295326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return BluetoothMapContract.FOLDER_NAME_OUTBOX; 3296fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3297fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return ""; 3298fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3299fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3300326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public byte[] getMessage(String handle, BluetoothMapAppParams appParams, 33015a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement folderElement, String version) 33025a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws UnsupportedEncodingException{ 3303fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TYPE type = BluetoothMapUtils.getMsgTypeFromHandle(handle); 33045a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMessageVersion = version; 3305fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id = BluetoothMapUtils.getCpHandle(handle); 3306326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(appParams.getFractionRequest() == BluetoothMapAppParams.FRACTION_REQUEST_NEXT) { 3307326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("FRACTION_REQUEST_NEXT does not make sence as" + 3308326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde " we always return the full message."); 3309326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3310fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie switch(type) { 3311fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case SMS_GSM: 3312fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case SMS_CDMA: 331370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return getSmsMessage(id, appParams.getCharset()); 3314fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case MMS: 331570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz return getMmsMessage(id, appParams); 3316fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie case EMAIL: 3317326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return getEmailMessage(id, appParams, folderElement); 33185a60e47497f21f64e6d79420dc4c56c1907df22akschulz case IM: 33195a60e47497f21f64e6d79420dc4c56c1907df22akschulz return getIMMessage(id, appParams, folderElement); 3320fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3321fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie throw new IllegalArgumentException("Invalid message handle."); 3322fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3323fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 33245a60e47497f21f64e6d79420dc4c56c1907df22akschulz private String setVCardFromPhoneNumber(BluetoothMapbMessage message, 3325cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta String phone, boolean incoming) { 3326fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String contactId = null, contactName = null; 33277769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde String[] phoneNumbers = new String[1]; 3328cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Handle possible exception for empty phone address 3329cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (TextUtils.isEmpty(phone)) { 3330cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta return contactName; 3331cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 33327769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // 33337769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // Use only actual phone number, because the MCE cannot know which 33347769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // number the message is from. 33357769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // 33367769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde phoneNumbers[0] = phone; 3337fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] emailAddresses = null; 33385a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor p; 3339fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 33405006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai Uri uri = Uri 33415006c8597521a7652eafa89a6fb5483b5cb567b6Ricky Wai .withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, 3342fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri.encode(phone)); 3343fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3344fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String[] projection = {Contacts._ID, Contacts.DISPLAY_NAME}; 3345fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String selection = Contacts.IN_VISIBLE_GROUP + "=1"; 3346fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String orderBy = Contacts._ID + " ASC"; 3347fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3348fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // Get the contact _ID and name 33495a60e47497f21f64e6d79420dc4c56c1907df22akschulz p = mResolver.query(uri, projection, selection, null, orderBy); 335028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 33517769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde if (p != null && p.moveToFirst()) { 335228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz contactId = p.getString(p.getColumnIndex(Contacts._ID)); 335328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz contactName = p.getString(p.getColumnIndex(Contacts.DISPLAY_NAME)); 335428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 33555a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 33567769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde close(p); 33575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 33585a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Bail out if we are unable to find a contact, based on the phone number 33597769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde if (contactId != null) { 33607769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde Cursor q = null; 33617769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde // Fetch the contact e-mail addresses 33625a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 33637769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde q = mResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 33647769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 33657769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde new String[]{contactId}, 33667769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde null); 33677769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde if (q != null && q.moveToFirst()) { 33687769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde int i = 0; 33697769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde emailAddresses = new String[q.getCount()]; 33707769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde do { 33717769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde String emailAddress = q.getString(q.getColumnIndex( 33727769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde ContactsContract.CommonDataKinds.Email.ADDRESS)); 33737769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde emailAddresses[i++] = emailAddress; 33747769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde } while (q != null && q.moveToNext()); 3375fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 33765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 33777769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde close(q); 3378fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3379fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 33807769a12fc51ed9ac3c61b60ea0df26706561bcb0Casper Bonde 338128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (incoming == true) { 3382326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Adding originator for phone:" + phone); 33835a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Use version 3.0 as we only have a formatted name 33845a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(contactName, contactName, phoneNumbers, emailAddresses,null,null); 3385326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 3386326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.d(TAG, "Adding recipient for phone:" + phone); 33875a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Use version 3.0 as we only have a formatted name 33885a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(contactName, contactName, phoneNumbers, emailAddresses,null,null); 3389326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3390326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return contactName; 3391fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3392fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3393fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MAP_MESSAGE_CHARSET_NATIVE = 0; 3394fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MAP_MESSAGE_CHARSET_UTF8 = 1; 3395fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3396fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public byte[] getSmsMessage(long id, int charset) throws UnsupportedEncodingException{ 3397fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int type, threadId; 3398fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long time = -1; 3399fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String msgBody; 3400fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie BluetoothMapbMessageSms message = new BluetoothMapbMessageSms(); 3401fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 340228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 3403fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Sms.CONTENT_URI, SMS_PROJECTION, "_ID = " + id, null, null); 340428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c == null || !c.moveToFirst()) { 340528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz throw new IllegalArgumentException("SMS handle not found"); 340628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 3407fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 34085a60e47497f21f64e6d79420dc4c56c1907df22akschulz try{ 34095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) 34105a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 34115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG,"c.count: " + c.getCount()); 3412fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 34135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) { 34145a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.SMS_GSM); 34155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) { 34165a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.SMS_CDMA); 34175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 34185a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 34195a60e47497f21f64e6d79420dc4c56c1907df22akschulz String read = c.getString(c.getColumnIndex(Sms.READ)); 34205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read.equalsIgnoreCase("1")) 34215a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 3422fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie else 34235a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 34245a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34255a60e47497f21f64e6d79420dc4c56c1907df22akschulz type = c.getInt(c.getColumnIndex(Sms.TYPE)); 34265a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 34275a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setFolder(getFolderName(type, threadId)); 34285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34295a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgBody = c.getString(c.getColumnIndex(Sms.BODY)); 34305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34315a60e47497f21f64e6d79420dc4c56c1907df22akschulz String phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 3432cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if ((phone == null) && type == Sms.MESSAGE_TYPE_DRAFT) { 3433cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta //Fetch address for Drafts folder from "canonical_address" table 3434cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta phone = getCanonicalAddressSms(mResolver, threadId); 3435cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 34365a60e47497f21f64e6d79420dc4c56c1907df22akschulz time = c.getLong(c.getColumnIndex(Sms.DATE)); 34375a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(type == 1) // Inbox message needs to set the vCard as originator 34385a60e47497f21f64e6d79420dc4c56c1907df22akschulz setVCardFromPhoneNumber(message, phone, true); 34395a60e47497f21f64e6d79420dc4c56c1907df22akschulz else // Other messages sets the vCard as the recipient 34405a60e47497f21f64e6d79420dc4c56c1907df22akschulz setVCardFromPhoneNumber(message, phone, false); 34415a60e47497f21f64e6d79420dc4c56c1907df22akschulz 34425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(charset == MAP_MESSAGE_CHARSET_NATIVE) { 34435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(type == 1) //Inbox 34445a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSmsBodyPdus(BluetoothMapSmsPdu.getDeliverPdus(msgBody, 34455a60e47497f21f64e6d79420dc4c56c1907df22akschulz phone, time)); 34465a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 34475a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSmsBodyPdus(BluetoothMapSmsPdu.getSubmitPdus(msgBody, phone)); 34485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else /*if (charset == MAP_MESSAGE_CHARSET_UTF8)*/ { 34495a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSmsBody(msgBody); 34505a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 34515a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 3452fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 345328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 34545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3455fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 345628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 345728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return message.encode(); 3458fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3459fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 34605a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void extractMmsAddresses(long id, BluetoothMapbMessageMime message) { 3461fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie final String[] projection = null; 3462326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String selection = new String(Mms.Addr.MSG_ID + "=" + id); 3463326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/" + id + "/addr"); 3464fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 3465326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String contactName = null; 346628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 3467326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query( uriAddress, projection, selection, null, null); 346828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 34695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.moveToFirst()) { 34705a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 34715a60e47497f21f64e6d79420dc4c56c1907df22akschulz String address = c.getString(c.getColumnIndex(Mms.Addr.ADDRESS)); 34725a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(address.equals(INSERT_ADDRES_TOKEN)) 34735a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 34745a60e47497f21f64e6d79420dc4c56c1907df22akschulz Integer type = c.getInt(c.getColumnIndex(Mms.Addr.TYPE)); 34755a60e47497f21f64e6d79420dc4c56c1907df22akschulz switch(type) { 34765a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_FROM: 34775a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, true); 34785a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addFrom(contactName, address); 34795a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34805a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_TO: 34815a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, false); 34825a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addTo(contactName, address); 34835a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34845a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_CC: 34855a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, false); 34865a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addCc(contactName, address); 34875a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34885a60e47497f21f64e6d79420dc4c56c1907df22akschulz case MMS_BCC: 34895a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactName = setVCardFromPhoneNumber(message, address, false); 34905a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addBcc(contactName, address); 34915a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34925a60e47497f21f64e6d79420dc4c56c1907df22akschulz default: 34935a60e47497f21f64e6d79420dc4c56c1907df22akschulz break; 34945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 34955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 349628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 349728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 34985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3499fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3500fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3501fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 35025a60e47497f21f64e6d79420dc4c56c1907df22akschulz 350370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 35045a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Read out a mime data part and return the data in a byte array. 35055a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contentPartUri TODO 35065a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param partid the content provider id of the Mime Part. 350770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return 350870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 35095a60e47497f21f64e6d79420dc4c56c1907df22akschulz private byte[] readRawDataPart(Uri contentPartUri, long partid) { 35105a60e47497f21f64e6d79420dc4c56c1907df22akschulz String uriStr = new String(contentPartUri+"/"+ partid); 3511fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 3512fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie InputStream is = null; 3513fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ByteArrayOutputStream os = new ByteArrayOutputStream(); 3514fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int bufferSize = 8192; 3515fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie byte[] buffer = new byte[bufferSize]; 3516fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie byte[] retVal = null; 3517fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3518fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 3519fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie is = mResolver.openInputStream(uriAddress); 3520fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int len = 0; 3521fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie while ((len = is.read(buffer)) != -1) { 3522fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie os.write(buffer, 0, len); // We need to specify the len, as it can be != bufferSize 3523fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3524fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie retVal = os.toByteArray(); 3525fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 3526fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // do nothing for now 3527fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.w(TAG,"Error reading part data",e); 3528fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } finally { 352928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(os); 353028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz close(is); 3531fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3532fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return retVal; 3533fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3534fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 353570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 353670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * Read out the mms parts and update the bMessage object provided i {@linkplain message} 353770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param id the content provider ID of the message 353870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param message the bMessage object to add the information to 353970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 35405a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void extractMmsParts(long id, BluetoothMapbMessageMime message) 3541fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie { 3542326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Handling of filtering out non-text parts for exclude 3543326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * attachments is handled within the bMessage object. */ 3544fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie final String[] projection = null; 3545326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String selection = new String(Mms.Part.MSG_ID + "=" + id); 3546326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr = new String(Mms.CONTENT_URI + "/"+ id + "/part"); 3547fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uriAddress = Uri.parse(uriStr); 35485a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime.MimePart part; 354928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Cursor c = mResolver.query(uriAddress, projection, selection, null, null); 355028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 35515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.moveToFirst()) { 35525a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 35535a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long partId = c.getLong(c.getColumnIndex(BaseColumns._ID)); 35545a60e47497f21f64e6d79420dc4c56c1907df22akschulz String contentType = c.getString(c.getColumnIndex(Mms.Part.CONTENT_TYPE)); 35555a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = c.getString(c.getColumnIndex(Mms.Part.NAME)); 35565a60e47497f21f64e6d79420dc4c56c1907df22akschulz String charset = c.getString(c.getColumnIndex(Mms.Part.CHARSET)); 35575a60e47497f21f64e6d79420dc4c56c1907df22akschulz String filename = c.getString(c.getColumnIndex(Mms.Part.FILENAME)); 35585a60e47497f21f64e6d79420dc4c56c1907df22akschulz String text = c.getString(c.getColumnIndex(Mms.Part.TEXT)); 35595a60e47497f21f64e6d79420dc4c56c1907df22akschulz Integer fd = c.getInt(c.getColumnIndex(Mms.Part._DATA)); 35605a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cid = c.getString(c.getColumnIndex(Mms.Part.CONTENT_ID)); 35615a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cl = c.getString(c.getColumnIndex(Mms.Part.CONTENT_LOCATION)); 35625a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cdisp = c.getString(c.getColumnIndex(Mms.Part.CONTENT_DISPOSITION)); 35635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 35645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, " _id : " + partId + 35655a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n ct : " + contentType + 35665a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n partname : " + name + 35675a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n charset : " + charset + 35685a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n filename : " + filename + 35695a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n text : " + text + 35705a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n fd : " + fd + 35715a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cid : " + cid + 35725a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cl : " + cl + 35735a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cdisp : " + cdisp); 35745a60e47497f21f64e6d79420dc4c56c1907df22akschulz 35755a60e47497f21f64e6d79420dc4c56c1907df22akschulz part = message.addMimePart(); 35765a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentType = contentType; 35775a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mPartName = name; 35785a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentId = cid; 35795a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentLocation = cl; 35805a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentDisposition = cdisp; 35815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 35825a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 35835a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(text != null) { 35845a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = text.getBytes("UTF-8"); 35855a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = "utf-8"; 35865a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 35875a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = 35885a60e47497f21f64e6d79420dc4c56c1907df22akschulz readRawDataPart(Uri.parse(Mms.CONTENT_URI+"/part"), partId); 35895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(charset != null) { 35905a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = 35915a60e47497f21f64e6d79420dc4c56c1907df22akschulz CharacterSets.getMimeName(Integer.parseInt(charset)); 35925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 35935a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 35945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NumberFormatException e) { 35955a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractMmsParts",e); 35965a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 35975a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 35985a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (UnsupportedEncodingException e) { 35995a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractMmsParts",e); 36005a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 36015a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 36025a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 36035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 36045a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mFileName = filename; 36055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 36065a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.updateCharset(); 36075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 360870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 36095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 36105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 36115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 36125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 36135a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 36145a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Read out the mms parts and update the bMessage object provided i {@linkplain message} 36155a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param id the content provider ID of the message 36165a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param message the bMessage object to add the information to 36175a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 36185a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void extractIMParts(long id, BluetoothMapbMessageMime message) 36195a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 36205a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Handling of filtering out non-text parts for exclude 36215a60e47497f21f64e6d79420dc4c56c1907df22akschulz * attachments is handled within the bMessage object. */ 36225a60e47497f21f64e6d79420dc4c56c1907df22akschulz final String[] projection = null; 36235a60e47497f21f64e6d79420dc4c56c1907df22akschulz String selection = new String(BluetoothMapContract.MessageColumns._ID + "=" + id); 36245a60e47497f21f64e6d79420dc4c56c1907df22akschulz String uriStr = new String(mBaseUri 36255a60e47497f21f64e6d79420dc4c56c1907df22akschulz + BluetoothMapContract.TABLE_MESSAGE + "/"+ id + "/part"); 36265a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uriAddress = Uri.parse(uriStr); 36275a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime.MimePart part; 36285a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(uriAddress, projection, selection, null, null); 36295a60e47497f21f64e6d79420dc4c56c1907df22akschulz try{ 36305a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.moveToFirst()) { 36315a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 36325a60e47497f21f64e6d79420dc4c56c1907df22akschulz Long partId = c.getLong( 36335a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns._ID)); 36345a60e47497f21f64e6d79420dc4c56c1907df22akschulz String charset = c.getString( 36355a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.CHARSET)); 36365a60e47497f21f64e6d79420dc4c56c1907df22akschulz String filename = c.getString( 36375a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.FILENAME)); 36385a60e47497f21f64e6d79420dc4c56c1907df22akschulz String text = c.getString( 36395a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.TEXT)); 36405a60e47497f21f64e6d79420dc4c56c1907df22akschulz String body = c.getString( 36415a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.RAW_DATA)); 36425a60e47497f21f64e6d79420dc4c56c1907df22akschulz String cid = c.getString( 36435a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessagePartColumns.CONTENT_ID)); 36445a60e47497f21f64e6d79420dc4c56c1907df22akschulz 36455a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, " _id : " + partId + 36465a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n charset : " + charset + 36475a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n filename : " + filename + 36485a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n text : " + text + 36495a60e47497f21f64e6d79420dc4c56c1907df22akschulz "\n cid : " + cid); 36505a60e47497f21f64e6d79420dc4c56c1907df22akschulz 36515a60e47497f21f64e6d79420dc4c56c1907df22akschulz part = message.addMimePart(); 36525a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentId = cid; 36535a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 36545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(text.equalsIgnoreCase("yes")) { 36555a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = body.getBytes("UTF-8"); 36565a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = "utf-8"; 36575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 36585a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = readRawDataPart(Uri.parse(mBaseUri 36595a60e47497f21f64e6d79420dc4c56c1907df22akschulz + BluetoothMapContract.TABLE_MESSAGE_PART) , partId); 36605a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(charset != null) 36615a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = CharacterSets.getMimeName( 36625a60e47497f21f64e6d79420dc4c56c1907df22akschulz Integer.parseInt(charset)); 36635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 36645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NumberFormatException e) { 36655a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractIMParts",e); 36665a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 36675a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 36685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (UnsupportedEncodingException e) { 36695a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG,"extractIMParts",e); 36705a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = null; 36715a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = null; 36725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 3673fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 36745a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mFileName = filename; 36755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while(c.moveToNext()); 367628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 367728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 36785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 3679fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 368028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 3681fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie message.updateCharset(); 3682fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3683fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 368470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /** 368570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * 368670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param id the content provider id for the message to fetch. 368770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @param appParams The application parameter object received from the client. 368870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 368970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * @throws UnsupportedEncodingException if UTF-8 is not supported, 369070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz * which is guaranteed to be supported on an android device 369170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz */ 36925a60e47497f21f64e6d79420dc4c56c1907df22akschulz public byte[] getMmsMessage(long id,BluetoothMapAppParams appParams) 36935a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws UnsupportedEncodingException { 3694fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int msgBox, threadId; 3695326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 36965a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("MMS charset native not allowed for MMS" 36975a60e47497f21f64e6d79420dc4c56c1907df22akschulz +" - must be utf-8"); 3698326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 36995a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime message = new BluetoothMapbMessageMime(); 3700fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(Mms.CONTENT_URI, MMS_PROJECTION, "_ID = " + id, null, null); 370128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 37025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) 37035a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 37045a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.MMS); 37055a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 37065a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37075a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The MMS info: 37085a60e47497f21f64e6d79420dc4c56c1907df22akschulz String read = c.getString(c.getColumnIndex(Mms.READ)); 37095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read.equalsIgnoreCase("1")) 37105a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 37115a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 37125a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 37135a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37145a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgBox = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); 37155a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 37165a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setFolder(getFolderName(msgBox, threadId)); 37175a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSubject(c.getString(c.getColumnIndex(Mms.SUBJECT))); 37185a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setMessageId(c.getString(c.getColumnIndex(Mms.MESSAGE_ID))); 37195a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setContentType(c.getString(c.getColumnIndex(Mms.CONTENT_TYPE))); 37205a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setDate(c.getLong(c.getColumnIndex(Mms.DATE)) * 1000L); 37215a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setTextOnly(c.getInt(c.getColumnIndex(Mms.TEXT_ONLY)) == 0 ? false : true); 37225a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setIncludeAttachments(appParams.getAttachment() == 0 ? false : true); 37235a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getLong(c.getColumnIndex(Mms.DATE_SENT)); - this is never used 37245a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getInt(c.getColumnIndex(Mms.STATUS)); - don't know what this is 37255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37265a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The parts 37275a60e47497f21f64e6d79420dc4c56c1907df22akschulz extractMmsParts(id, message); 37285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37295a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The addresses 37305a60e47497f21f64e6d79420dc4c56c1907df22akschulz extractMmsAddresses(id, message); 37315a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37325a60e47497f21f64e6d79420dc4c56c1907df22akschulz 37335a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 37345a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 373528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 37365a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3737fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3738fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 373928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return message.encode(); 3740fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3741fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3742326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 3743326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * 3744326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param id the content provider id for the message to fetch. 3745326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param appParams The application parameter object received from the client. 3746326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 3747326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @throws UnsupportedEncodingException if UTF-8 is not supported, 3748326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * which is guaranteed to be supported on an android device 3749326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 3750326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public byte[] getEmailMessage(long id, BluetoothMapAppParams appParams, 3751326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement currentFolder) throws UnsupportedEncodingException { 3752326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Log print out of application parameters set 3753326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D && appParams != null) { 3754326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG,"TYPE_MESSAGE (GET): Attachment = " + appParams.getAttachment() + 3755326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ", Charset = " + appParams.getCharset() + 3756326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ", FractionRequest = " + appParams.getFractionRequest()); 3757326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3758326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3759326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Throw exception if requester NATIVE charset for Email 3760326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Exception is caught by MapObexServer sendGetMessageResp 3761326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 3762326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new IllegalArgumentException("EMAIL charset not UTF-8"); 3763326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3764326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapbMessageEmail message = new BluetoothMapbMessageEmail(); 37655a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 37665a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, BluetoothMapContract.BT_MESSAGE_PROJECTION, "_ID = " 37675a60e47497f21f64e6d79420dc4c56c1907df22akschulz + id, null, null); 376828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 37695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) 37705a60e47497f21f64e6d79420dc4c56c1907df22akschulz { 37715a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement folderElement; 37725a60e47497f21f64e6d79420dc4c56c1907df22akschulz FileInputStream is = null; 37735a60e47497f21f64e6d79420dc4c56c1907df22akschulz ParcelFileDescriptor fd = null; 37745a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 37755a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Handle fraction requests 37765a60e47497f21f64e6d79420dc4c56c1907df22akschulz int fractionRequest = appParams.getFractionRequest(); 37775a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (fractionRequest != BluetoothMapAppParams.INVALID_VALUE_PARAMETER) { 37785a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Fraction requested 37795a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) { 37805a60e47497f21f64e6d79420dc4c56c1907df22akschulz String fractionStr = (fractionRequest == 0) ? "FIRST" : "NEXT"; 37815a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.v(TAG, "getEmailMessage - FractionRequest " + fractionStr 37825a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " - send compete message" ); 37835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 37845a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Check if message is complete and if not - request message from server 37855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c.getString(c.getColumnIndex( 37865a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.RECEPTION_STATE)).equalsIgnoreCase( 37875a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.RECEPTION_STATE_COMPLETE) == false) { 37885a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: request message from server 37895a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, "getEmailMessage - receptionState not COMPLETE - Not Implemented!" ); 37905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 37915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 37925a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set read status: 37935a60e47497f21f64e6d79420dc4c56c1907df22akschulz String read = c.getString( 37945a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_READ)); 37955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read != null && read.equalsIgnoreCase("1")) 37965a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 37975a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 37985a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 37995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38005a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set message type: 38015a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.EMAIL); 38025a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 38035a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set folder: 38045a60e47497f21f64e6d79420dc4c56c1907df22akschulz long folderId = c.getLong( 38055a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.FOLDER_ID)); 38065a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderElement = currentFolder.getFolderById(folderId); 38075a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setCompleteFolder(folderElement.getFullPath()); 38085a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38095a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set recipient: 38105a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nameEmail = c.getString( 38115a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.TO_LIST)); 38125a60e47497f21f64e6d79420dc4c56c1907df22akschulz Rfc822Token tokens[] = Rfc822Tokenizer.tokenize(nameEmail); 38135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 38145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Recipient count= " + tokens.length); 38155a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 38165a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 38175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Recipient = " + tokens[i].toString()); 38185a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 38195a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 38205a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 38215a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(name, name, null, emails, null, null); 38225a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 38235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38265a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set originator: 38275a60e47497f21f64e6d79420dc4c56c1907df22akschulz nameEmail = c.getString(c.getColumnIndex(BluetoothMapContract.MessageColumns.FROM_LIST)); 38285a60e47497f21f64e6d79420dc4c56c1907df22akschulz tokens = Rfc822Tokenizer.tokenize(nameEmail); 38295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tokens.length != 0) { 38305a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Originator count= " + tokens.length); 38315a60e47497f21f64e6d79420dc4c56c1907df22akschulz int i = 0; 38325a60e47497f21f64e6d79420dc4c56c1907df22akschulz while (i < tokens.length) { 38335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Originator = " + tokens[i].toString()); 38345a60e47497f21f64e6d79420dc4c56c1907df22akschulz String[] emails = new String[1]; 38355a60e47497f21f64e6d79420dc4c56c1907df22akschulz emails[0] = tokens[i].getAddress(); 38365a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = tokens[i].getName(); 38375a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(name, name, null, emails, null, null); 38385a60e47497f21f64e6d79420dc4c56c1907df22akschulz i++; 38395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 38425a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 3843326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 38445a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Find out if we get attachments 38455a60e47497f21f64e6d79420dc4c56c1907df22akschulz String attStr = (appParams.getAttachment() == 0) ? 38465a60e47497f21f64e6d79420dc4c56c1907df22akschulz "/" + BluetoothMapContract.FILE_MSG_NO_ATTACHMENTS : ""; 38475a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Uri.parse(contentUri + "/" + id + attStr); 38485a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38495a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Get email message body content 38505a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 38515a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 38525a60e47497f21f64e6d79420dc4c56c1907df22akschulz fd = mResolver.openFileDescriptor(uri, "r"); 38535a60e47497f21f64e6d79420dc4c56c1907df22akschulz is = new FileInputStream(fd.getFileDescriptor()); 38545a60e47497f21f64e6d79420dc4c56c1907df22akschulz StringBuilder email = new StringBuilder(""); 38555a60e47497f21f64e6d79420dc4c56c1907df22akschulz byte[] buffer = new byte[1024]; 38565a60e47497f21f64e6d79420dc4c56c1907df22akschulz while((count = is.read(buffer)) != -1) { 38575a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Handle breaks within a UTF8 character 38585a60e47497f21f64e6d79420dc4c56c1907df22akschulz email.append(new String(buffer,0,count)); 38595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "Email part = " 38605a60e47497f21f64e6d79420dc4c56c1907df22akschulz + new String(buffer,0,count) 38615a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " count=" + count); 38625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38635a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Set email message body: 38645a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setEmailBody(email.toString()); 38655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (FileNotFoundException e) { 38665a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, e); 38675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (NullPointerException e) { 38685a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, e); 38695a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (IOException e) { 38705a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, e); 38715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 38725a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 38735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(is != null) is.close(); 38745a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (IOException e) {} 38755a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 38765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(fd != null) fd.close(); 38775a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (IOException e) {} 3878326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 38795a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 3880326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 38815a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 38825a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 38835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38845a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("EMAIL handle not found"); 38855a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 38865a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 38875a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 38885a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param id the content provider id for the message to fetch. 38895a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param appParams The application parameter object received from the client. 38905a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return a byte[] containing the UTF-8 encoded bMessage to send to the client. 38915a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @throws UnsupportedEncodingException if UTF-8 is not supported, 38925a60e47497f21f64e6d79420dc4c56c1907df22akschulz * which is guaranteed to be supported on an android device 38935a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 38945a60e47497f21f64e6d79420dc4c56c1907df22akschulz 38955a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 38965a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 38975a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param id the content provider id for the message to fetch. 38985a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param appParams The application parameter object received from the client. 38995a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return a byte[] containing the utf-8 encoded bMessage to send to the client. 39005a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @throws UnsupportedEncodingException if UTF-8 is not supported, 39015a60e47497f21f64e6d79420dc4c56c1907df22akschulz * which is guaranteed to be supported on an android device 39025a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 39035a60e47497f21f64e6d79420dc4c56c1907df22akschulz public byte[] getIMMessage(long id, 39045a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAppParams appParams, 39055a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement folderElement) 39065a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws UnsupportedEncodingException { 39075a60e47497f21f64e6d79420dc4c56c1907df22akschulz long threadId, folderId; 3908326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 39095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (appParams.getCharset() == MAP_MESSAGE_CHARSET_NATIVE) 39105a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException( 39115a60e47497f21f64e6d79420dc4c56c1907df22akschulz "IM charset native not allowed for IM - must be utf-8"); 39125a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39135a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapbMessageMime message = new BluetoothMapbMessageMime(); 39145a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contentUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_MESSAGE); 39155a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(contentUri, 39165a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_MESSAGE_PROJECTION, "_ID = " + id, null, null); 39175a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor contacts = null; 39185a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 39195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null && c.moveToFirst()) { 39205a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setType(TYPE.IM); 39215a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setVersionString(mMessageVersion); 39225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39235a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The IM message info: 39245a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = 39255a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getInt(c.getColumnIndex(BluetoothMapContract.MessageColumns.FLAG_READ)); 39265a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (read == 1) 39275a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(true); 39285a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 39295a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setStatus(false); 39305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39315a60e47497f21f64e6d79420dc4c56c1907df22akschulz threadId = 39325a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getInt(c.getColumnIndex(BluetoothMapContract.MessageColumns.THREAD_ID)); 39335a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = 39345a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getLong(c.getColumnIndex(BluetoothMapContract.MessageColumns.FOLDER_ID)); 39355a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderElement = folderElement.getFolderById(folderId); 39365a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setCompleteFolder(folderElement.getFullPath()); 39375a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setSubject(c.getString( 39385a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.SUBJECT))); 39395a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setMessageId(c.getString( 39405a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns._ID))); 39415a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setDate(c.getLong( 39425a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getColumnIndex(BluetoothMapContract.MessageColumns.DATE))); 39435a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setTextOnly(c.getInt(c.getColumnIndex( 39445a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.ATTACHMENT_SIZE)) != 0 ? false : true); 39455a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39465a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.setIncludeAttachments(appParams.getAttachment() == 0 ? false : true); 39475a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39485a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getLong(c.getColumnIndex(Mms.DATE_SENT)); - this is never used 39495a60e47497f21f64e6d79420dc4c56c1907df22akschulz // c.getInt(c.getColumnIndex(Mms.STATUS)); - don't know what this is 39505a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39515a60e47497f21f64e6d79420dc4c56c1907df22akschulz // The parts 39525a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39535a60e47497f21f64e6d79420dc4c56c1907df22akschulz //FIXME use the parts when ready - until then use the body column for text-only 39545a60e47497f21f64e6d79420dc4c56c1907df22akschulz // extractIMParts(id, message); 39555a60e47497f21f64e6d79420dc4c56c1907df22akschulz //FIXME next few lines are temporary code 39565a60e47497f21f64e6d79420dc4c56c1907df22akschulz MimePart part = message.addMimePart(); 39575a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mData = c.getString((c.getColumnIndex( 39585a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.BODY))).getBytes("UTF-8"); 39595a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mCharsetName = "utf-8"; 39605a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentId = "0"; 39615a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentType = "text/plain"; 39625a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.updateCharset(); 39635a60e47497f21f64e6d79420dc4c56c1907df22akschulz // FIXME end temp code 39645a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39655a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri contactsUri = Uri.parse(mBaseUri + BluetoothMapContract.TABLE_CONVOCONTACT); 39665a60e47497f21f64e6d79420dc4c56c1907df22akschulz contacts = mResolver.query(contactsUri, 39675a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONTACT_PROJECTION, 39685a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CONVO_ID 39695a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " = " + threadId, null, null); 39705a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO this will not work for group-chats 39715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null && contacts.moveToFirst()){ 39725a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = contacts.getString(contacts.getColumnIndex( 39735a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME)); 39745a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btUid[] = new String[1]; 39755a60e47497f21f64e6d79420dc4c56c1907df22akschulz btUid[0]= contacts.getString(contacts.getColumnIndex( 39765a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.X_BT_UID)); 39775a60e47497f21f64e6d79420dc4c56c1907df22akschulz String nickname = contacts.getString(contacts.getColumnIndex( 39785a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NICKNAME)); 39795a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btUci[] = new String[1]; 39805a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btOwnUci[] = new String[1]; 39815a60e47497f21f64e6d79420dc4c56c1907df22akschulz btOwnUci[0] = mAccount.getUciFull(); 39825a60e47497f21f64e6d79420dc4c56c1907df22akschulz btUci[0] = contacts.getString(contacts.getColumnIndex( 39835a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.UCI)); 39845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(folderId == BluetoothMapContract.FOLDER_ID_SENT 39855a60e47497f21f64e6d79420dc4c56c1907df22akschulz || folderId == BluetoothMapContract.FOLDER_ID_OUTBOX) { 39865a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(nickname,name,null, null, btUid, btUci); 39875a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(null, btOwnUci); 39885a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39895a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else { 39905a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addOriginator(nickname,name,null, null, btUid, btUci); 39915a60e47497f21f64e6d79420dc4c56c1907df22akschulz message.addRecipient(null, btOwnUci); 39925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 39935a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3994326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 39955a60e47497f21f64e6d79420dc4c56c1907df22akschulz return message.encode(); 3996326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 399728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 39985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c != null) c.close(); 39995a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(contacts != null) contacts.close(); 4000326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 400128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 40025a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("IM handle not found"); 4003326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 40045a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40055a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setRemoteFeatureMask(int featureMask){ 40065a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mRemoteFeatureMask = featureMask; 40075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "setRemoteFeatureMask"); 40085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((this.mRemoteFeatureMask & BluetoothMapUtils.MAP_FEATURE_MESSAGE_LISTING_FORMAT_V11_BIT) 40095a60e47497f21f64e6d79420dc4c56c1907df22akschulz == BluetoothMapUtils.MAP_FEATURE_MESSAGE_LISTING_FORMAT_V11_BIT) { 40105a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.d(TAG, "setRemoteFeatureMask MAP_MESSAGE_LISTING_FORMAT_V11"); 40115a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mMsgListingVersion = BluetoothMapUtils.MAP_MESSAGE_LISTING_FORMAT_V11; 40125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40135a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40145a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40155a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int getRemoteFeatureMask(){ 40165a60e47497f21f64e6d79420dc4c56c1907df22akschulz return this.mRemoteFeatureMask; 40175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40185a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40195a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> getSmsMmsConvoList() { 40205a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mMasInstance.getSmsMmsConvoList(); 40215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40235a60e47497f21f64e6d79420dc4c56c1907df22akschulz void setSmsMmsConvoList(HashMap<Long,BluetoothMapConvoListingElement> smsMmsConvoList) { 40245a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setSmsMmsConvoList(smsMmsConvoList); 40255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40265a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40275a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long,BluetoothMapConvoListingElement> getImEmailConvoList() { 40285a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mMasInstance.getImEmailConvoList(); 40295a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 40305a60e47497f21f64e6d79420dc4c56c1907df22akschulz 40315a60e47497f21f64e6d79420dc4c56c1907df22akschulz void setImEmailConvoList(HashMap<Long,BluetoothMapConvoListingElement> imEmailConvoList) { 40325a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setImEmailConvoList(imEmailConvoList); 40335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4034fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie} 4035