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