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