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