BluetoothMapContentObserver.java revision 29cab6e8ea1014179fd15fb067e621ae4b066085
1fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie/* 25a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Copyright (C) 2014 Samsung System LSI 35a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Licensed under the Apache License, Version 2.0 (the "License"); 45a60e47497f21f64e6d79420dc4c56c1907df22akschulz * you may not use this file except in compliance with the License. 55a60e47497f21f64e6d79420dc4c56c1907df22akschulz * You may obtain a copy of the License at 65a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 75a60e47497f21f64e6d79420dc4c56c1907df22akschulz * http://www.apache.org/licenses/LICENSE-2.0 85a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 95a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Unless required by applicable law or agreed to in writing, software 105a60e47497f21f64e6d79420dc4c56c1907df22akschulz * distributed under the License is distributed on an "AS IS" BASIS, 115a60e47497f21f64e6d79420dc4c56c1907df22akschulz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 125a60e47497f21f64e6d79420dc4c56c1907df22akschulz * See the License for the specific language governing permissions and 135a60e47497f21f64e6d79420dc4c56c1907df22akschulz * limitations under the License. 145a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 15fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xiepackage com.android.bluetooth.map; 16fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 175a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.annotation.TargetApi; 18fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.app.Activity; 19fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.app.PendingIntent; 20fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.BroadcastReceiver; 21326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.content.ContentProviderClient; 22fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.ContentResolver; 23fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.ContentUris; 24fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.ContentValues; 25fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.Context; 26fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.Intent; 27fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.content.IntentFilter; 28326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.content.IntentFilter.MalformedMimeTypeException; 29edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chouimport android.content.pm.PackageManager; 30fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.database.ContentObserver; 31fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.database.Cursor; 32fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.net.Uri; 33edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chouimport android.os.Binder; 34fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.os.Handler; 355a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.os.Looper; 36326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.os.Message; 37326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.os.ParcelFileDescriptor; 38edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chouimport android.os.Process; 39326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.os.RemoteException; 40db8d8ae565b3db6a5e3187170dcb7b281a79f9daAjay Panickerimport android.os.UserManager; 41fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony; 42fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.Mms; 43fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.MmsSms; 44fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.Sms; 45fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.provider.Telephony.Sms.Inbox; 46fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.telephony.PhoneStateListener; 47fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.telephony.ServiceState; 48fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.telephony.SmsManager; 49fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.telephony.SmsMessage; 50fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.telephony.TelephonyManager; 51326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bondeimport android.text.format.DateUtils; 52fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.util.Log; 53fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport android.util.Xml; 54cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Guptaimport android.text.TextUtils; 555a60e47497f21f64e6d79420dc4c56c1907df22akschulz 565a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport org.xmlpull.v1.XmlSerializer; 57fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 58fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.android.bluetooth.map.BluetoothMapUtils.TYPE; 595a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapbMessageMime.MimePart; 605a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract; 615a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract.MessageColumns; 62fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xieimport com.google.android.mms.pdu.PduHeaders; 63fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 645a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.FileNotFoundException; 655a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.FileOutputStream; 665a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.IOException; 675a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.OutputStream; 685a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.StringWriter; 695a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.UnsupportedEncodingException; 705a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.ArrayList; 715a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.Arrays; 725a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.Calendar; 735a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.Collections; 745a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.HashMap; 755a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.HashSet; 765a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.Map; 775a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.Set; 785a60e47497f21f64e6d79420dc4c56c1907df22akschulz 795a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport javax.obex.ResponseCodes; 805a60e47497f21f64e6d79420dc4c56c1907df22akschulz 815a60e47497f21f64e6d79420dc4c56c1907df22akschulz@TargetApi(19) 82fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xiepublic class BluetoothMapContentObserver { 83fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private static final String TAG = "BluetoothMapContentObserver"; 84fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 85326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean D = BluetoothMapService.DEBUG; 86326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final boolean V = BluetoothMapService.VERBOSE; 87326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 885a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_NEW = "NewMessage"; 895a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_DELETE = "MessageDeleted"; 905a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_REMOVED = "MessageRemoved"; 915a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_SHIFT = "MessageShift"; 92326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final String EVENT_TYPE_DELEVERY_SUCCESS = "DeliverySuccess"; 93326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final String EVENT_TYPE_SENDING_SUCCESS = "SendingSuccess"; 94326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final String EVENT_TYPE_SENDING_FAILURE = "SendingFailure"; 95326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final String EVENT_TYPE_DELIVERY_FAILURE = "DeliveryFailure"; 965a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_READ_STATUS = "ReadStatusChanged"; 975a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_CONVERSATION = "ConversationChanged"; 985a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_PRESENCE = "ParticipantPresenceChanged"; 995a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final String EVENT_TYPE_CHAT_STATE = "ParticipantChatStateChanged"; 1005a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1015a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_NEW_MESSAGE = 1L; 1025a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_MESSAGE_DELETED = 1L<<1; 1035a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_MESSAGE_SHIFT = 1L<<2; 1045a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_SENDING_SUCCESS = 1L<<3; 1055a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_SENDING_FAILED = 1L<<4; 1065a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_DELIVERY_SUCCESS = 1L<<5; 1075a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_DELIVERY_FAILED = 1L<<6; 1085a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_MEMORY_FULL = 1L<<7; // Unused 1095a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_MEMORY_AVAILABLE = 1L<<8; // Unused 1105a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_READ_STATUS_CHANGED = 1L<<9; 1115a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_CONVERSATION_CHANGED = 1L<<10; 1125a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_PARTICIPANT_PRESENCE_CHANGED = 1L<<11; 1135a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_PARTICIPANT_CHATSTATE_CHANGED= 1L<<12; 1145a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final long EVENT_FILTER_MESSAGE_REMOVED = 1L<<13; 1155a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1165a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: If we are requesting a large message from the network, on a slow connection 1175a60e47497f21f64e6d79420dc4c56c1907df22akschulz // 20 seconds might not be enough... But then again 20 seconds is long for other 1185a60e47497f21f64e6d79420dc4c56c1907df22akschulz // cases. 119326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS; 120fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 121fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private Context mContext; 122fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private ContentResolver mResolver; 123326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private ContentProviderClient mProviderClient = null; 124fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private BluetoothMnsObexClient mMnsClient; 125326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private BluetoothMapMasInstance mMasInstance = null; 126fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private int mMasId; 127326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private boolean mEnableSmsMms = false; 128326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private boolean mObserverRegistered = false; 1295a60e47497f21f64e6d79420dc4c56c1907df22akschulz private BluetoothMapAccountItem mAccount; 130326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private String mAuthority = null; 131326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1325a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Default supported feature bit mask is 0x1f 1335a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mMapSupportedFeatures = BluetoothMapUtils.MAP_FEATURE_DEFAULT_BITMASK; 1345a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Default event report version is 1.0 1355a60e47497f21f64e6d79420dc4c56c1907df22akschulz private int mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V10; 1365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 137326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private BluetoothMapFolderElement mFolders = 138326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde new BluetoothMapFolderElement("DUMMY", null); // Will be set by the MAS when generated. 139326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private Uri mMessageUri = null; 1405a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Uri mContactUri = null; 1415a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1425a60e47497f21f64e6d79420dc4c56c1907df22akschulz private boolean mTransmitEvents = true; 1435a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1445a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* To make the filter update atomic, we declare it volatile. 1455a60e47497f21f64e6d79420dc4c56c1907df22akschulz * To avoid a penalty when using it, copy the value to a local 1465a60e47497f21f64e6d79420dc4c56c1907df22akschulz * non-volatile variable when used more than once. 1475a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Actually we only ever use the lower 4 bytes of this variable, 1485a60e47497f21f64e6d79420dc4c56c1907df22akschulz * hence we could manage without the volatile keyword, but as 1495a60e47497f21f64e6d79420dc4c56c1907df22akschulz * we tend to copy ways of doing things, we better do it right:-) */ 1505a60e47497f21f64e6d79420dc4c56c1907df22akschulz private volatile long mEventFilter = 0xFFFFFFFFL; 151fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 152fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int DELETED_THREAD_ID = -1; 153fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 154326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // X-Mms-Message-Type field types. These are from PduHeaders.java 155fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public static final int MESSAGE_TYPE_RETRIEVE_CONF = 0x84; 156fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 157326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Text only MMS converted to SMS if sms parts less than or equal to defined count 158326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private static final int CONVERT_MMS_TO_SMS_PART_COUNT = 10; 159326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 160fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private TYPE mSmsType; 161fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 162ed70219e41ba68196798dcbf75b782d13fb88603kschulz private static final String ACTION_MESSAGE_DELIVERY = 163ed70219e41ba68196798dcbf75b782d13fb88603kschulz "com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY"; 164ed70219e41ba68196798dcbf75b782d13fb88603kschulz /*package*/ static final String ACTION_MESSAGE_SENT = 165ed70219e41ba68196798dcbf75b782d13fb88603kschulz "com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_SENT"; 166ed70219e41ba68196798dcbf75b782d13fb88603kschulz 167ed70219e41ba68196798dcbf75b782d13fb88603kschulz public static final String EXTRA_MESSAGE_SENT_HANDLE = "HANDLE"; 168ed70219e41ba68196798dcbf75b782d13fb88603kschulz public static final String EXTRA_MESSAGE_SENT_RESULT = "result"; 169ed70219e41ba68196798dcbf75b782d13fb88603kschulz public static final String EXTRA_MESSAGE_SENT_MSG_TYPE = "type"; 170ed70219e41ba68196798dcbf75b782d13fb88603kschulz public static final String EXTRA_MESSAGE_SENT_URI = "uri"; 171ed70219e41ba68196798dcbf75b782d13fb88603kschulz public static final String EXTRA_MESSAGE_SENT_RETRY = "retry"; 172ed70219e41ba68196798dcbf75b782d13fb88603kschulz public static final String EXTRA_MESSAGE_SENT_TRANSPARENT = "transparent"; 173ed70219e41ba68196798dcbf75b782d13fb88603kschulz public static final String EXTRA_MESSAGE_SENT_TIMESTAMP = "timestamp"; 174ed70219e41ba68196798dcbf75b782d13fb88603kschulz 175ed70219e41ba68196798dcbf75b782d13fb88603kschulz private SmsBroadcastReceiver mSmsBroadcastReceiver = new SmsBroadcastReceiver(); 176ed70219e41ba68196798dcbf75b782d13fb88603kschulz 177ed70219e41ba68196798dcbf75b782d13fb88603kschulz private boolean mInitialized = false; 178ed70219e41ba68196798dcbf75b782d13fb88603kschulz 179ed70219e41ba68196798dcbf75b782d13fb88603kschulz 180fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie static final String[] SMS_PROJECTION = new String[] { 181326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms._ID, 182fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.THREAD_ID, 183fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.ADDRESS, 184fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.BODY, 185fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.DATE, 186fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.READ, 187fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.TYPE, 188fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.STATUS, 189fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Sms.LOCKED, 190326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms.ERROR_CODE 191fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 192fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 193326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde static final String[] SMS_PROJECTION_SHORT = new String[] { 194326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms._ID, 195326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms.THREAD_ID, 1965a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.TYPE, 1975a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.READ 1985a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 1995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2005a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] SMS_PROJECTION_SHORT_EXT = new String[] { 2015a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms._ID, 2025a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.THREAD_ID, 2035a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.ADDRESS, 2045a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.BODY, 2055a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.DATE, 2065a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.READ, 2075a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.TYPE, 208326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde }; 209326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 210326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde static final String[] MMS_PROJECTION_SHORT = new String[] { 211326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Mms._ID, 212fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.THREAD_ID, 213fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Mms.MESSAGE_TYPE, 2145a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_BOX, 2155a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.READ 2165a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 2175a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2185a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] MMS_PROJECTION_SHORT_EXT = new String[] { 2195a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms._ID, 2205a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.THREAD_ID, 2215a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_TYPE, 2225a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.MESSAGE_BOX, 2235a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.READ, 2245a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.DATE, 2255a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.SUBJECT, 2265a60e47497f21f64e6d79420dc4c56c1907df22akschulz Mms.PRIORITY 227fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 228fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2295a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] MSG_PROJECTION_SHORT = new String[] { 230326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapContract.MessageColumns._ID, 231326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapContract.MessageColumns.FOLDER_ID, 232326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapContract.MessageColumns.FLAG_READ 233326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde }; 234326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2355a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] MSG_PROJECTION_SHORT_EXT = new String[] { 2365a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns._ID, 2375a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FOLDER_ID, 2385a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_READ, 2395a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DATE, 2405a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.SUBJECT, 2415a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FROM_LIST, 2425a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY 2435a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 2445a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2455a60e47497f21f64e6d79420dc4c56c1907df22akschulz static final String[] MSG_PROJECTION_SHORT_EXT2 = new String[] { 2465a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns._ID, 2475a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FOLDER_ID, 2485a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_READ, 2495a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DATE, 2505a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.SUBJECT, 2515a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FROM_LIST, 2525a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY, 2535a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_ID, 2545a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_NAME 2555a60e47497f21f64e6d79420dc4c56c1907df22akschulz }; 256326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 257326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public BluetoothMapContentObserver(final Context context, 2585a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMnsObexClient mnsClient, 2595a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapMasInstance masInstance, 2605a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapAccountItem account, 2615a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean enableSmsMms) throws RemoteException { 262fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mContext = context; 263fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mResolver = mContext.getContentResolver(); 264326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mAccount = account; 265326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMasInstance = masInstance; 266326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMasId = mMasInstance.getMasId(); 2675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2685a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMapSupportedFeatures = mMasInstance.getRemoteFeatureMask(); 2695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "BluetoothMapContentObserver: Supported features " + 2705a60e47497f21f64e6d79420dc4c56c1907df22akschulz Integer.toHexString(mMapSupportedFeatures) ) ; 2715a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2725a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((BluetoothMapUtils.MAP_FEATURE_EXTENDED_EVENT_REPORT_11_BIT 2735a60e47497f21f64e6d79420dc4c56c1907df22akschulz & mMapSupportedFeatures) != 0){ 2745a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V11; 2755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2765a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Make sure support for all formats result in latest version returned 2775a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((BluetoothMapUtils.MAP_FEATURE_EVENT_REPORT_V12_BIT 2785a60e47497f21f64e6d79420dc4c56c1907df22akschulz & mMapSupportedFeatures) != 0){ 2795a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V12; 2805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 282326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(account != null) { 283326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mAuthority = Uri.parse(account.mBase_uri).getAuthority(); 284326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMessageUri = Uri.parse(account.mBase_uri + "/" + BluetoothMapContract.TABLE_MESSAGE); 2855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mAccount.getType() == TYPE.IM) { 2865a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactUri = Uri.parse(account.mBase_uri + "/" 2875a60e47497f21f64e6d79420dc4c56c1907df22akschulz + BluetoothMapContract.TABLE_CONVOCONTACT); 2885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2895a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: We need to release this again! 290326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mProviderClient = mResolver.acquireUnstableContentProviderClient(mAuthority); 291326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (mProviderClient == null) { 292326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new RemoteException("Failed to acquire provider for " + mAuthority); 293326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 294326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mProviderClient.setDetectNotResponding(PROVIDER_ANR_TIMEOUT); 2955a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactList = mMasInstance.getContactList(); 2965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mContactList == null) { 2975a60e47497f21f64e6d79420dc4c56c1907df22akschulz setContactList(new HashMap<String, BluetoothMapConvoContactElement>(), false); 2985a60e47497f21f64e6d79420dc4c56c1907df22akschulz initContactsList(); 2995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 300326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 301326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mEnableSmsMms = enableSmsMms; 302fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mSmsType = getSmsType(); 303326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMnsClient = mnsClient; 3045a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Get the cached list - if any, else create */ 3055a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMsgListSms = mMasInstance.getMsgListSms(); 3065a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean doInit = false; 3075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mEnableSmsMms) { 3085a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mMsgListSms == null) { 3095a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListSms(new HashMap<Long, Msg>(), false); 3105a60e47497f21f64e6d79420dc4c56c1907df22akschulz doInit = true; 3115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3125a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMsgListMms = mMasInstance.getMsgListMms(); 3135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mMsgListMms == null) { 3145a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListMms(new HashMap<Long, Msg>(), false); 3155a60e47497f21f64e6d79420dc4c56c1907df22akschulz doInit = true; 3165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mAccount != null) { 3195a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMsgListMsg = mMasInstance.getMsgListMsg(); 3205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mMsgListMsg == null) { 3215a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListMsg(new HashMap<Long, Msg>(), false); 3225a60e47497f21f64e6d79420dc4c56c1907df22akschulz doInit = true; 3235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(doInit) { 3265a60e47497f21f64e6d79420dc4c56c1907df22akschulz initMsgList(); 3275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3295a60e47497f21f64e6d79420dc4c56c1907df22akschulz 330fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala public int getObserverRemoteFeatureMask() { 331fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if (V) Log.v(TAG, "getObserverRemoteFeatureMask : " + mMapEventReportVersion 332fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala + " mMapSupportedFeatures: " + mMapSupportedFeatures); 333fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala return mMapSupportedFeatures; 334fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 335fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala 336fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala public void setObserverRemoteFeatureMask(int remoteSupportedFeatures) { 337fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala mMapSupportedFeatures = remoteSupportedFeatures; 338fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if ((BluetoothMapUtils.MAP_FEATURE_EXTENDED_EVENT_REPORT_11_BIT 339fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala & mMapSupportedFeatures) != 0) { 340fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V11; 341fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 342fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala // Make sure support for all formats result in latest version returned 343fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if ((BluetoothMapUtils.MAP_FEATURE_EVENT_REPORT_V12_BIT 344fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala & mMapSupportedFeatures) != 0) { 345fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V12; 346fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 347fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if (V) Log.d(TAG, "setObserverRemoteFeatureMask : " + mMapEventReportVersion 348fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala + " mMapSupportedFeatures : " + mMapSupportedFeatures); 349fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 3505a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3515a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<Long, Msg> getMsgListSms() { 3525a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mMsgListSms; 3535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3555a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setMsgListSms(Map<Long, Msg> msgListSms, boolean changesDetected) { 3565a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMsgListSms = msgListSms; 3575a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(changesDetected) { 3585a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateFolderVersionCounter(); 3595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3605a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setMsgListSms(msgListSms); 3615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3625a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3635a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3645a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<Long, Msg> getMsgListMms() { 3655a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mMsgListMms; 3665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3685a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3695a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setMsgListMms(Map<Long, Msg> msgListMms, boolean changesDetected) { 3705a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMsgListMms = msgListMms; 3715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(changesDetected) { 3725a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateFolderVersionCounter(); 3735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3745a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setMsgListMms(msgListMms); 375326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 376326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3785a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<Long, Msg> getMsgListMsg() { 3795a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mMsgListMsg; 3805a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3825a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3835a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setMsgListMsg(Map<Long, Msg> msgListMsg, boolean changesDetected) { 3845a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMsgListMsg = msgListMsg; 3855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(changesDetected) { 3865a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateFolderVersionCounter(); 3875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3885a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setMsgListMsg(msgListMsg); 3895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3905a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3915a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<String, BluetoothMapConvoContactElement> getContactList() { 3925a60e47497f21f64e6d79420dc4c56c1907df22akschulz return mContactList; 3935a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 3945a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3955a60e47497f21f64e6d79420dc4c56c1907df22akschulz 396326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 3975a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Currently we only have data for IM / email contacts 3985a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param contactList 3995a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param changesDetected that is not chat state changed nor presence state changed. 400326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 4015a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setContactList(Map<String, BluetoothMapConvoContactElement> contactList, 4025a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean changesDetected) { 4035a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactList = contactList; 4045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(changesDetected) { 4055a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.updateImEmailConvoListVersionCounter(); 4065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4075a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.setContactList(contactList); 4085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4095a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4105a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventNewMessage(long eventFilter) { 4115a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_NEW_MESSAGE) > 0); 4125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4135a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4145a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventMessageDeleted(long eventFilter) { 4155a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_MESSAGE_DELETED) > 0); 4165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4175a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4185a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventMessageShift(long eventFilter) { 4195a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_MESSAGE_SHIFT) > 0); 4205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4225a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventSendingSuccess(long eventFilter) { 4235a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_SENDING_SUCCESS) > 0); 4245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4265a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventSendingFailed(long eventFilter) { 4275a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_SENDING_FAILED) > 0); 4285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4295a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4305a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventDeliverySuccess(long eventFilter) { 4315a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_DELIVERY_SUCCESS) > 0); 4325a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4335a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4345a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventDeliveryFailed(long eventFilter) { 4355a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_DELIVERY_FAILED) > 0); 4365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4375a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4385a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventReadStatusChanged(long eventFilter) { 4395a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_READ_STATUS_CHANGED) > 0); 4405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4415a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4425a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventConversationChanged(long eventFilter) { 4435a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_CONVERSATION_CHANGED) > 0); 4445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4455a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4465a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventParticipantPresenceChanged(long eventFilter) { 4475a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_PARTICIPANT_PRESENCE_CHANGED) > 0); 4485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4495a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4505a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventParticipantChatstateChanged(long eventFilter) { 4515a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_PARTICIPANT_CHATSTATE_CHANGED) > 0); 4525a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 4535a60e47497f21f64e6d79420dc4c56c1907df22akschulz 4545a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static boolean sendEventMessageRemoved(long eventFilter) { 4555a60e47497f21f64e6d79420dc4c56c1907df22akschulz return ((eventFilter & EVENT_FILTER_MESSAGE_REMOVED) > 0); 456fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 457fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 458fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private TYPE getSmsType() { 459fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TYPE smsType = null; 4605a60e47497f21f64e6d79420dc4c56c1907df22akschulz TelephonyManager tm = (TelephonyManager) mContext.getSystemService( 4615a60e47497f21f64e6d79420dc4c56c1907df22akschulz Context.TELEPHONY_SERVICE); 462fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4632e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) { 464fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie smsType = TYPE.SMS_CDMA; 4652e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } else { 4662e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta smsType = TYPE.SMS_GSM; 467fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 468fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 469fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return smsType; 470fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 471fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4721ff5a0a6b42eff4c5728f0327440c127f8d3bb1cHemant Gupta private final ContentObserver mObserver = new ContentObserver(new Handler()) { 473fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie @Override 474fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void onChange(boolean selfChange) { 475fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie onChange(selfChange, null); 476fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 477fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 478fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie @Override 479fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void onChange(boolean selfChange, Uri uri) { 4805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(uri == null) { 4815a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, "onChange() with URI == null - not handled."); 4825a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 4835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 484fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (V) Log.d(TAG, "onChange on thread: " + Thread.currentThread().getId() 4855a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " Uri: " + uri.toString() + " selfchange: " + selfChange); 486fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(uri.toString().contains(BluetoothMapContract.TABLE_CONVOCONTACT)) 4885a60e47497f21f64e6d79420dc4c56c1907df22akschulz handleContactListChanges(uri); 4895a60e47497f21f64e6d79420dc4c56c1907df22akschulz else 4905a60e47497f21f64e6d79420dc4c56c1907df22akschulz handleMsgListChanges(uri); 491fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 492fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 493fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 4945a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final HashMap<Integer, String> FOLDER_SMS_MAP; 4955a60e47497f21f64e6d79420dc4c56c1907df22akschulz static { 4965a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_SMS_MAP = new HashMap<Integer, String>(); 4975a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_SMS_MAP.put(Sms.MESSAGE_TYPE_INBOX, BluetoothMapContract.FOLDER_NAME_INBOX); 4985a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_SMS_MAP.put(Sms.MESSAGE_TYPE_SENT, BluetoothMapContract.FOLDER_NAME_SENT); 4995a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_SMS_MAP.put(Sms.MESSAGE_TYPE_DRAFT, BluetoothMapContract.FOLDER_NAME_DRAFT); 5005a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_SMS_MAP.put(Sms.MESSAGE_TYPE_OUTBOX, BluetoothMapContract.FOLDER_NAME_OUTBOX); 5015a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_SMS_MAP.put(Sms.MESSAGE_TYPE_FAILED, BluetoothMapContract.FOLDER_NAME_OUTBOX); 5025a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_SMS_MAP.put(Sms.MESSAGE_TYPE_QUEUED, BluetoothMapContract.FOLDER_NAME_OUTBOX); 5035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 504fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 5055a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static String getSmsFolderName(int type) { 5065a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = FOLDER_SMS_MAP.get(type); 5075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name != null) { 5085a60e47497f21f64e6d79420dc4c56c1907df22akschulz return name; 5095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5105a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.e(TAG, "New SMS mailbox types have been introduced, without an update in BT..."); 5115a60e47497f21f64e6d79420dc4c56c1907df22akschulz return "Unknown"; 5125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5135a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5145a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5155a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static final HashMap<Integer, String> FOLDER_MMS_MAP; 5165a60e47497f21f64e6d79420dc4c56c1907df22akschulz static { 5175a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_MMS_MAP = new HashMap<Integer, String>(); 5185a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_MMS_MAP.put(Mms.MESSAGE_BOX_INBOX, BluetoothMapContract.FOLDER_NAME_INBOX); 5195a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_MMS_MAP.put(Mms.MESSAGE_BOX_SENT, BluetoothMapContract.FOLDER_NAME_SENT); 5205a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_MMS_MAP.put(Mms.MESSAGE_BOX_DRAFTS, BluetoothMapContract.FOLDER_NAME_DRAFT); 5215a60e47497f21f64e6d79420dc4c56c1907df22akschulz FOLDER_MMS_MAP.put(Mms.MESSAGE_BOX_OUTBOX, BluetoothMapContract.FOLDER_NAME_OUTBOX); 5225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5235a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5245a60e47497f21f64e6d79420dc4c56c1907df22akschulz private static String getMmsFolderName(int mailbox) { 5255a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = FOLDER_MMS_MAP.get(mailbox); 5265a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name != null) { 5275a60e47497f21f64e6d79420dc4c56c1907df22akschulz return name; 5285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5295a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.e(TAG, "New MMS mailboxes have been introduced, without an update in BT..."); 5305a60e47497f21f64e6d79420dc4c56c1907df22akschulz return "Unknown"; 5315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5325a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5335a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 5345a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Set the folder structure to be used for this instance. 5355a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param folderStructure 5365a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 5375a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setFolderStructure(BluetoothMapFolderElement folderStructure) { 5385a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.mFolders = folderStructure; 5395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5405a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5415a60e47497f21f64e6d79420dc4c56c1907df22akschulz private class ConvoContactInfo { 5425a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColConvoId = -1; 5435a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColLastActivity = -1; 5445a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mConvoColName = -1; 5455a60e47497f21f64e6d79420dc4c56c1907df22akschulz // public int mConvoColRead = -1; 5465a60e47497f21f64e6d79420dc4c56c1907df22akschulz // public int mConvoColVersionCounter = -1; 5475a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColUci = -1; 5485a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColConvoId = -1; 5495a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColName = -1; 5505a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColNickname = -1; 5515a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColBtUid = -1; 5525a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColChatState = -1; 5535a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColContactId = -1; 5545a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColLastActive = -1; 5555a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPresenceState = -1; 5565a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPresenceText = -1; 5575a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColPriority = -1; 5585a60e47497f21f64e6d79420dc4c56c1907df22akschulz public int mContactColLastOnline = -1; 5595a60e47497f21f64e6d79420dc4c56c1907df22akschulz 5605a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void setConvoColunms(Cursor c) { 5615a60e47497f21f64e6d79420dc4c56c1907df22akschulz // mConvoColConvoId = c.getColumnIndex( 5625a60e47497f21f64e6d79420dc4c56c1907df22akschulz // BluetoothMapContract.ConversationColumns.THREAD_ID); 5635a60e47497f21f64e6d79420dc4c56c1907df22akschulz // mConvoColLastActivity = c.getColumnIndex( 5645a60e47497f21f64e6d79420dc4c56c1907df22akschulz // BluetoothMapContract.ConversationColumns.LAST_THREAD_ACTIVITY); 5655a60e47497f21f64e6d79420dc4c56c1907df22akschulz // mConvoColName = c.getColumnIndex( 5665a60e47497f21f64e6d79420dc4c56c1907df22akschulz // BluetoothMapContract.ConversationColumns.THREAD_NAME); 5675a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColConvoId = c.getColumnIndex( 5685a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CONVO_ID); 5695a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColName = c.getColumnIndex( 5705a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME); 5715a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColNickname = c.getColumnIndex( 5725a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NICKNAME); 5735a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColBtUid = c.getColumnIndex( 5745a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.X_BT_UID); 5755a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColChatState = c.getColumnIndex( 5765a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.CHAT_STATE); 5775a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColUci = c.getColumnIndex( 5785a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.UCI); 5795a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColNickname = c.getColumnIndex( 5805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NICKNAME); 5815a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColLastActive = c.getColumnIndex( 5825a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.LAST_ACTIVE); 5835a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColName = c.getColumnIndex( 5845a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.NAME); 5855a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPresenceState = c.getColumnIndex( 5865a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.PRESENCE_STATE); 5875a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPresenceText = c.getColumnIndex( 5885a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.STATUS_TEXT); 5895a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColPriority = c.getColumnIndex( 5905a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.PRIORITY); 5915a60e47497f21f64e6d79420dc4c56c1907df22akschulz mContactColLastOnline = c.getColumnIndex( 5925a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.ConvoContactColumns.LAST_ONLINE); 5935a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 5945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 595fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 596fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private class Event { 597fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String eventType; 598fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long handle; 5995a60e47497f21f64e6d79420dc4c56c1907df22akschulz String folder = null; 6005a60e47497f21f64e6d79420dc4c56c1907df22akschulz String oldFolder = null; 601fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie TYPE msgType; 6025a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Extended event parameters in MAP Event version 1.1 */ 6035a60e47497f21f64e6d79420dc4c56c1907df22akschulz String datetime = null; // OBEX time "YYYYMMDDTHHMMSS" 6045a60e47497f21f64e6d79420dc4c56c1907df22akschulz String uci = null; 6055a60e47497f21f64e6d79420dc4c56c1907df22akschulz String subject = null; 6065a60e47497f21f64e6d79420dc4c56c1907df22akschulz String senderName = null; 6075a60e47497f21f64e6d79420dc4c56c1907df22akschulz String priority = null; 6085a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Event parameters in MAP Event version 1.2 */ 6095a60e47497f21f64e6d79420dc4c56c1907df22akschulz String conversationName = null; 6105a60e47497f21f64e6d79420dc4c56c1907df22akschulz long conversationID = -1; 6115a60e47497f21f64e6d79420dc4c56c1907df22akschulz int presenceState = BluetoothMapContract.PresenceState.UNKNOWN; 6125a60e47497f21f64e6d79420dc4c56c1907df22akschulz String presenceStatus = null; 6135a60e47497f21f64e6d79420dc4c56c1907df22akschulz int chatState = BluetoothMapContract.ChatState.UNKNOWN; 614fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 615326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde final static String PATH = "telecom/msg/"; 616326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 6175a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void setFolderPath(String name, TYPE type) { 6185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (name != null) { 6195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(type == TYPE.EMAIL || type == TYPE.IM) { 6205a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.folder = name; 621326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 6225a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.folder = PATH + name; 623326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 624fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 625fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.folder = null; 626fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 6275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 6295a60e47497f21f64e6d79420dc4c56c1907df22akschulz public Event(String eventType, long handle, String folder, 6305a60e47497f21f64e6d79420dc4c56c1907df22akschulz String oldFolder, TYPE msgType) { 6315a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.eventType = eventType; 6325a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.handle = handle; 6335a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFolderPath(folder, msgType); 634fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (oldFolder != null) { 6355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msgType == TYPE.EMAIL || msgType == TYPE.IM) { 636326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.oldFolder = oldFolder; 637326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 638326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.oldFolder = PATH + oldFolder; 639326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 640fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 641fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.oldFolder = null; 642fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 643fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.msgType = msgType; 644fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 645fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 6465a60e47497f21f64e6d79420dc4c56c1907df22akschulz public Event(String eventType, long handle, String folder, TYPE msgType) { 6475a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.eventType = eventType; 6485a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.handle = handle; 6495a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFolderPath(folder, msgType); 6505a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.msgType = msgType; 6515a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6525a60e47497f21f64e6d79420dc4c56c1907df22akschulz 6535a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* extended event type 1.1 */ 6545a60e47497f21f64e6d79420dc4c56c1907df22akschulz public Event(String eventType, long handle, String folder, TYPE msgType, 6555a60e47497f21f64e6d79420dc4c56c1907df22akschulz String datetime, String subject, String senderName, String priority) { 6565a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.eventType = eventType; 6575a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.handle = handle; 6585a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFolderPath(folder, msgType); 6595a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.msgType = msgType; 6605a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.datetime = datetime; 6615a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (subject != null) { 6625a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.subject = BluetoothMapUtils.stripInvalidChars(subject); 6635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (senderName != null) { 6655a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.senderName = BluetoothMapUtils.stripInvalidChars(senderName); 6665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6675a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.priority = priority; 6685a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6695a60e47497f21f64e6d79420dc4c56c1907df22akschulz 6705a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* extended event type 1.2 message events */ 6715a60e47497f21f64e6d79420dc4c56c1907df22akschulz public Event(String eventType, long handle, String folder, TYPE msgType, 6725a60e47497f21f64e6d79420dc4c56c1907df22akschulz String datetime, String subject, String senderName, String priority, 6735a60e47497f21f64e6d79420dc4c56c1907df22akschulz long conversationID, String conversationName) { 6745a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.eventType = eventType; 6755a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.handle = handle; 6765a60e47497f21f64e6d79420dc4c56c1907df22akschulz setFolderPath(folder, msgType); 6775a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.msgType = msgType; 6785a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.datetime = datetime; 6795a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (subject != null) { 6805a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.subject = BluetoothMapUtils.stripInvalidChars(subject); 6815a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6825a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (senderName != null) { 6835a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.senderName = BluetoothMapUtils.stripInvalidChars(senderName); 6845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6855a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (conversationID != 0) { 6865a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.conversationID = conversationID; 6875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (conversationName != null) { 6895a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.conversationName = BluetoothMapUtils.stripInvalidChars(conversationName); 6905a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6915a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.priority = priority; 6925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 6935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 6945a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* extended event type 1.2 for conversation, presence or chat state changed events */ 6955a60e47497f21f64e6d79420dc4c56c1907df22akschulz public Event(String eventType, String uci, TYPE msgType, String name, String priority, 6965a60e47497f21f64e6d79420dc4c56c1907df22akschulz String lastActivity, long conversationID, String conversationName, 6975a60e47497f21f64e6d79420dc4c56c1907df22akschulz int presenceState, String presenceStatus, int chatState) { 6985a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.eventType = eventType; 6995a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.uci = uci; 7005a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.msgType = msgType; 7015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (name != null) { 7025a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.senderName = BluetoothMapUtils.stripInvalidChars(name); 7035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7045a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.priority = priority; 7055a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.datetime = lastActivity; 7065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (conversationID != 0) { 7075a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.conversationID = conversationID; 7085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (conversationName != null) { 7105a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.conversationName = BluetoothMapUtils.stripInvalidChars(conversationName); 7115a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (presenceState != BluetoothMapContract.PresenceState.UNKNOWN) { 7135a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.presenceState = presenceState; 7145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (presenceStatus != null) { 7165a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.presenceStatus = BluetoothMapUtils.stripInvalidChars(presenceStatus); 7175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (chatState != BluetoothMapContract.ChatState.UNKNOWN) { 7195a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.chatState = chatState; 7205a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7225a60e47497f21f64e6d79420dc4c56c1907df22akschulz 723fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public byte[] encode() throws UnsupportedEncodingException { 724fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie StringWriter sw = new StringWriter(); 725fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie XmlSerializer xmlEvtReport = Xml.newSerializer(); 7265a60e47497f21f64e6d79420dc4c56c1907df22akschulz 727fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 728fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlEvtReport.setOutput(sw); 7295a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.startDocument("UTF-8", true); 730326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde xmlEvtReport.text("\r\n"); 73170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz xmlEvtReport.startTag("", "MAP-event-report"); 7325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion == BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 7335a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "version", BluetoothMapUtils.MAP_V10_STR); 7345a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (mMapEventReportVersion == BluetoothMapUtils.MAP_EVENT_REPORT_V11) { 7355a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "version", BluetoothMapUtils.MAP_V11_STR); 7365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 7375a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "version", BluetoothMapUtils.MAP_V12_STR); 7385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 739fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlEvtReport.startTag("", "event"); 740fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlEvtReport.attribute("", "type", eventType); 7415a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (eventType.equals(EVENT_TYPE_CONVERSATION) || 7425a60e47497f21f64e6d79420dc4c56c1907df22akschulz eventType.equals(EVENT_TYPE_PRESENCE) || 7435a60e47497f21f64e6d79420dc4c56c1907df22akschulz eventType.equals(EVENT_TYPE_CHAT_STATE)) { 7445a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "participant_uci", uci); 7455a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 7465a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "handle", 7475a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.getMapHandle(handle, msgType)); 7485a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7495a60e47497f21f64e6d79420dc4c56c1907df22akschulz 750fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (folder != null) { 751fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlEvtReport.attribute("", "folder", folder); 752fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 753fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (oldFolder != null) { 754fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlEvtReport.attribute("", "old_folder", oldFolder); 755fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 7562e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta /* Avoid possible NPE for "msgType" "null" value. "msgType" 7572e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta * is a implied attribute and will be set "null" for events 7582e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta * like "memory full" or "memory available" */ 7592e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta if (msgType != null) { 7602e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta xmlEvtReport.attribute("", "msg_type", msgType.name()); 7612e7dd83a6b3b4bf15e0dec6aad9ab826e6e2531bHemant Gupta } 7625a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* If MAP event report version is above 1.0 send 7635a60e47497f21f64e6d79420dc4c56c1907df22akschulz * extended event report parameters */ 7645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (datetime != null) { 7655a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "datetime", datetime); 7665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (subject != null) { 7685a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "subject", 7695a60e47497f21f64e6d79420dc4c56c1907df22akschulz subject.substring(0,subject.length() < 256 ? subject.length() : 256)); 7705a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7715a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (senderName != null) { 77269f86872f09052f9c2ff7f75e87e66134f65c91cAjay Panicker xmlEvtReport.attribute("", "sender_name", senderName); 7735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7745a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (priority != null) { 7755a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "priority", priority); 7765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 7785a60e47497f21f64e6d79420dc4c56c1907df22akschulz //} 7795a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Include conversation information from event version 1.2 */ 7805a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion > BluetoothMapUtils.MAP_EVENT_REPORT_V11 ) { 7815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (conversationName != null) { 7825a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "conversation_name", conversationName); 7835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (conversationID != -1) { 7855a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Convert provider conversation handle to string incl type 7865a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "conversation_id", 7875a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.getMapConvoHandle(conversationID, msgType)); 7885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (eventType.equals(EVENT_TYPE_PRESENCE)) { 7905a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (presenceState != 0) { 7915a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Convert provider conversation handle to string incl type 7925a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "presence_availability", 7935a60e47497f21f64e6d79420dc4c56c1907df22akschulz String.valueOf(presenceState)); 7945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 7955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (presenceStatus != null) { 7965a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Convert provider conversation handle to string incl type 7975a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "presence_status", 7985a60e47497f21f64e6d79420dc4c56c1907df22akschulz presenceStatus.substring( 7995a60e47497f21f64e6d79420dc4c56c1907df22akschulz 0,presenceStatus.length() < 256 ? subject.length() : 256)); 8005a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (eventType.equals(EVENT_TYPE_PRESENCE)) { 8035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (chatState != 0) { 8045a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Convert provider conversation handle to string incl type 8055a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.attribute("", "chat_state", String.valueOf(chatState)); 8065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8075a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8085a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8095a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 8105a60e47497f21f64e6d79420dc4c56c1907df22akschulz xmlEvtReport.endTag("", "event"); 81170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz xmlEvtReport.endTag("", "MAP-event-report"); 812fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie xmlEvtReport.endDocument(); 813fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IllegalArgumentException e) { 814326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.w(TAG,e); 815fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IllegalStateException e) { 816326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.w(TAG,e); 817fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 818326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.w(TAG,e); 819fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 820fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 821326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.d(TAG, sw.toString()); 822fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 823fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return sw.toString().getBytes("UTF-8"); 824fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 825fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 826fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 8275a60e47497f21f64e6d79420dc4c56c1907df22akschulz /*package*/ class Msg { 828fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id; 829326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int type; // Used as folder for SMS/MMS 830326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int threadId; // Used for SMS/MMS at delete 831326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long folderId = -1; // Email folder ID 832326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long oldFolderId = -1; // Used for email undelete 833326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean localInitiatedSend = false; // Used for MMS to filter out events 834326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean transparent = false; // Used for EMAIL to delete message sent with transparency 8355a60e47497f21f64e6d79420dc4c56c1907df22akschulz int flagRead = -1; // Message status read/unread 836326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 8375a60e47497f21f64e6d79420dc4c56c1907df22akschulz public Msg(long id, int type, int threadId, int readFlag) { 838fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.id = id; 839fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.type = type; 840326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.threadId = threadId; 8415a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.flagRead = readFlag; 842326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 8435a60e47497f21f64e6d79420dc4c56c1907df22akschulz public Msg(long id, long folderId, int readFlag) { 844326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.id = id; 845326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.folderId = folderId; 8465a60e47497f21f64e6d79420dc4c56c1907df22akschulz this.flagRead = readFlag; 847326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 848326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 849326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Eclipse generated hashCode() and equals() to make 850326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * hashMap lookup work independent of whether the obj 851326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * is used for email or SMS/MMS and whether or not the 852326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * oldFolder is set. */ 853326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde @Override 854326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int hashCode() { 855326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde final int prime = 31; 856326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int result = 1; 857326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde result = prime * result + (int) (id ^ (id >>> 32)); 858326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return result; 859fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 860fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 861326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde @Override 862326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public boolean equals(Object obj) { 863326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (this == obj) 864326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 865326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (obj == null) 866326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return false; 867326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (getClass() != obj.getClass()) 868326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return false; 869326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Msg other = (Msg) obj; 870326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (id != other.id) 871326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return false; 872326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return true; 873326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 874326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 875fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 8765a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<Long, Msg> mMsgListSms = null; 8775a60e47497f21f64e6d79420dc4c56c1907df22akschulz 8785a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<Long, Msg> mMsgListMms = null; 879326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 8805a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<Long, Msg> mMsgListMsg = null; 881326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 8825a60e47497f21f64e6d79420dc4c56c1907df22akschulz private Map<String, BluetoothMapConvoContactElement> mContactList = null; 883326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 884326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public int setNotificationRegistration(int notificationStatus) throws RemoteException { 885326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Forward the request to the MNS thread as a message - including the MAS instance ID. 886326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG,"setNotificationRegistration() enter"); 887fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if (mMnsClient == null) { 888fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala return ResponseCodes.OBEX_HTTP_UNAVAILABLE; 889fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 890326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Handler mns = mMnsClient.getMessageHandler(); 891fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if (mns != null) { 892326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Message msg = mns.obtainMessage(); 893fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if (mMnsClient.isValidMnsRecord()) { 894fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala msg.what = BluetoothMnsObexClient.MSG_MNS_NOTIFICATION_REGISTRATION; 895fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } else { 896fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala //Trigger SDP Search and notificaiton registration , if SDP record not found. 897fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala msg.what = BluetoothMnsObexClient.MSG_MNS_SDP_SEARCH_REGISTRATION; 898fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if (mMnsClient.mMnsLstRegRqst != null && 899fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala (mMnsClient.mMnsLstRegRqst.isSearchInProgress())) { 900fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala /* 1. Disallow next Notification ON Request : 901fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala * - Respond "Service Unavailable" as SDP Search and last notification 902fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala * registration ON request is already InProgress. 903fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala * - Next notification ON Request will be allowed ONLY after search 904fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala * and connect for last saved request [Replied with OK ] is processed. 905fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala */ 906fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if (notificationStatus == BluetoothMapAppParams.NOTIFICATION_STATUS_YES) { 907fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala return ResponseCodes.OBEX_HTTP_UNAVAILABLE; 908fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } else { 909fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala /* 2. Allow next Notification OFF Request: 910fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala * - Keep the SDP search still in progress. 911fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala * - Disconnect and Deregister the contentObserver. 912fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala */ 913fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala msg.what = BluetoothMnsObexClient.MSG_MNS_NOTIFICATION_REGISTRATION; 914fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 915fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 916fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala } 917326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msg.arg1 = mMasId; 918326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msg.arg2 = notificationStatus; 919326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mns.sendMessageDelayed(msg, 10); // Send message without forcing a context switch 920326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Some devices - e.g. PTS needs to get the unregister confirm before we actually 921326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * disconnect the MNS. */ 922fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala if(D) Log.d(TAG,"setNotificationRegistration() send : " + msg.what + " to MNS "); 923fc8dfd1e037cda063919d9160c9cdb604b9adfefAshwini Munigala return ResponseCodes.OBEX_HTTP_OK; 924326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 925326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // This should not happen except at shutdown. 926326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG,"setNotificationRegistration() Unable to send registration request"); 927326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return ResponseCodes.OBEX_HTTP_UNAVAILABLE; 928326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 929326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 930fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 9315a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean eventMaskContainsContacts(long mask) { 9325a60e47497f21f64e6d79420dc4c56c1907df22akschulz return sendEventParticipantPresenceChanged(mask); 9335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 9355a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean eventMaskContainsCovo(long mask) { 9365a60e47497f21f64e6d79420dc4c56c1907df22akschulz return (sendEventConversationChanged(mask) 9375a60e47497f21f64e6d79420dc4c56c1907df22akschulz || sendEventParticipantChatstateChanged(mask)); 9385a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9395a60e47497f21f64e6d79420dc4c56c1907df22akschulz 9405a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Overwrite the existing notification filter. Will register/deregister observers for 9415a60e47497f21f64e6d79420dc4c56c1907df22akschulz * the Contacts and Conversation table as needed. We keep the message observer 9425a60e47497f21f64e6d79420dc4c56c1907df22akschulz * at all times. */ 9435a60e47497f21f64e6d79420dc4c56c1907df22akschulz /*package*/ synchronized void setNotificationFilter(long newFilter) { 9445a60e47497f21f64e6d79420dc4c56c1907df22akschulz long oldFilter = mEventFilter; 9455a60e47497f21f64e6d79420dc4c56c1907df22akschulz mEventFilter = newFilter; 9465a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Contacts */ 9475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!eventMaskContainsContacts(oldFilter) && 9485a60e47497f21f64e6d79420dc4c56c1907df22akschulz eventMaskContainsContacts(newFilter)) { 9495a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: 9505a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Enable the observer 9515a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Reset the contacts list 9525a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9535a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Conversations */ 9545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!eventMaskContainsCovo(oldFilter) && 9555a60e47497f21f64e6d79420dc4c56c1907df22akschulz eventMaskContainsCovo(newFilter)) { 9565a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: 9575a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Enable the observer 9585a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Reset the conversations list 9595a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9605a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9615a60e47497f21f64e6d79420dc4c56c1907df22akschulz 962326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public void registerObserver() throws RemoteException{ 963fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (V) Log.d(TAG, "registerObserver"); 964326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 965326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (mObserverRegistered) 966326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return; 967326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 968326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(mAccount != null) { 969326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 970326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mProviderClient = mResolver.acquireUnstableContentProviderClient(mAuthority); 971326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (mProviderClient == null) { 972326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw new RemoteException("Failed to acquire provider for " + mAuthority); 973326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 974326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mProviderClient.setDetectNotResponding(PROVIDER_ANR_TIMEOUT); 975326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 9765a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If there is a change in the database before we init the lists we will be sending 9775a60e47497f21f64e6d79420dc4c56c1907df22akschulz // loads of events - hence init before register. 9785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mAccount.getType() == TYPE.IM) { 9795a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Further add contact list tracking 9805a60e47497f21f64e6d79420dc4c56c1907df22akschulz initContactsList(); 9815a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9825a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9835a60e47497f21f64e6d79420dc4c56c1907df22akschulz // If there is a change in the database before we init the lists we will be sending 9845a60e47497f21f64e6d79420dc4c56c1907df22akschulz // loads of events - hence init before register. 9855a60e47497f21f64e6d79420dc4c56c1907df22akschulz initMsgList(); 9865a60e47497f21f64e6d79420dc4c56c1907df22akschulz 9875a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Use MmsSms Uri since the Sms Uri is not notified on deletes */ 9885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mEnableSmsMms){ 9895a60e47497f21f64e6d79420dc4c56c1907df22akschulz //this is sms/mms 9905a60e47497f21f64e6d79420dc4c56c1907df22akschulz mResolver.registerContentObserver(MmsSms.CONTENT_URI, false, mObserver); 9915a60e47497f21f64e6d79420dc4c56c1907df22akschulz mObserverRegistered = true; 9925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 9935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 9945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mAccount != null) { 995326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* For URI's without account ID */ 9965a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Uri.parse(mAccount.mBase_uri_no_account + "/" 9975a60e47497f21f64e6d79420dc4c56c1907df22akschulz + BluetoothMapContract.TABLE_MESSAGE); 998326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "Registering observer for: " + uri); 999326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mResolver.registerContentObserver(uri, true, mObserver); 1000326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1001326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* For URI's with account ID - is handled the same way as without ID, but is 1002326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * only triggered for MAS instances with matching account ID. */ 1003326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = Uri.parse(mAccount.mBase_uri + "/" + BluetoothMapContract.TABLE_MESSAGE); 1004326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "Registering observer for: " + uri); 1005326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mResolver.registerContentObserver(uri, true, mObserver); 10065a60e47497f21f64e6d79420dc4c56c1907df22akschulz 10075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mAccount.getType() == TYPE.IM) { 10085a60e47497f21f64e6d79420dc4c56c1907df22akschulz 10095a60e47497f21f64e6d79420dc4c56c1907df22akschulz uri = Uri.parse(mAccount.mBase_uri_no_account + "/" 10105a60e47497f21f64e6d79420dc4c56c1907df22akschulz + BluetoothMapContract.TABLE_CONVOCONTACT); 10115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Registering observer for: " + uri); 10125a60e47497f21f64e6d79420dc4c56c1907df22akschulz mResolver.registerContentObserver(uri, true, mObserver); 10135a60e47497f21f64e6d79420dc4c56c1907df22akschulz 10145a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* For URI's with account ID - is handled the same way as without ID, but is 10155a60e47497f21f64e6d79420dc4c56c1907df22akschulz * only triggered for MAS instances with matching account ID. */ 10165a60e47497f21f64e6d79420dc4c56c1907df22akschulz uri = Uri.parse(mAccount.mBase_uri + "/" + BluetoothMapContract.TABLE_CONVOCONTACT); 10175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "Registering observer for: " + uri); 10185a60e47497f21f64e6d79420dc4c56c1907df22akschulz mResolver.registerContentObserver(uri, true, mObserver); 10195a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10205a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1021326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mObserverRegistered = true; 1022326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1023fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1024fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 10255a60e47497f21f64e6d79420dc4c56c1907df22akschulz public void unregisterObserver() { 10265a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "unregisterObserver"); 10275a60e47497f21f64e6d79420dc4c56c1907df22akschulz mResolver.unregisterContentObserver(mObserver); 10285a60e47497f21f64e6d79420dc4c56c1907df22akschulz mObserverRegistered = false; 10295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mProviderClient != null){ 10305a60e47497f21f64e6d79420dc4c56c1907df22akschulz mProviderClient.release(); 10315a60e47497f21f64e6d79420dc4c56c1907df22akschulz mProviderClient = null; 10325a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 10355a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 10365a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Per design it is only possible to call the refreshXxxx functions sequentially, hence it 10375a60e47497f21f64e6d79420dc4c56c1907df22akschulz * is safe to modify mTransmitEvents without synchronization. 10385a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 10395a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* package */ void refreshFolderVersionCounter() { 10405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mObserverRegistered) { 10415a60e47497f21f64e6d79420dc4c56c1907df22akschulz // As we have observers, we already keep the counter up-to-date. 10425a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 10435a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10445a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We need to perform the same functionality, as when we receive a notification change, 10455a60e47497f21f64e6d79420dc4c56c1907df22akschulz hence we: 10465a60e47497f21f64e6d79420dc4c56c1907df22akschulz - disable the event transmission 10475a60e47497f21f64e6d79420dc4c56c1907df22akschulz - triggers the code for updates 10485a60e47497f21f64e6d79420dc4c56c1907df22akschulz - enable the event transmission */ 10495a60e47497f21f64e6d79420dc4c56c1907df22akschulz mTransmitEvents = false; 10505a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 10515a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mEnableSmsMms) { 10525a60e47497f21f64e6d79420dc4c56c1907df22akschulz handleMsgListChangesSms(); 10535a60e47497f21f64e6d79420dc4c56c1907df22akschulz handleMsgListChangesMms(); 10545a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mAccount != null) { 10565a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 10575a60e47497f21f64e6d79420dc4c56c1907df22akschulz handleMsgListChangesMsg(mMessageUri); 10585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (RemoteException e) { 10595a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.e(TAG, "Unable to update FolderVersionCounter. - Not fatal, but can cause" + 10605a60e47497f21f64e6d79420dc4c56c1907df22akschulz " undesirable user experience!", e); 10615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 10645a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Ensure we always enable events again 10655a60e47497f21f64e6d79420dc4c56c1907df22akschulz mTransmitEvents = true; 10665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10685a60e47497f21f64e6d79420dc4c56c1907df22akschulz 10695a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* package */ void refreshConvoListVersionCounter() { 10705a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mObserverRegistered) { 10715a60e47497f21f64e6d79420dc4c56c1907df22akschulz // As we have observers, we already keep the counter up-to-date. 10725a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 10735a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10745a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We need to perform the same functionality, as when we receive a notification change, 10755a60e47497f21f64e6d79420dc4c56c1907df22akschulz hence we: 10765a60e47497f21f64e6d79420dc4c56c1907df22akschulz - disable event transmission 10775a60e47497f21f64e6d79420dc4c56c1907df22akschulz - triggers the code for updates 10785a60e47497f21f64e6d79420dc4c56c1907df22akschulz - enable event transmission */ 10795a60e47497f21f64e6d79420dc4c56c1907df22akschulz mTransmitEvents = false; 10805a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 10815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if((mAccount != null) && (mContactUri != null)) { 10825a60e47497f21f64e6d79420dc4c56c1907df22akschulz handleContactListChanges(mContactUri); 10835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 10855a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Ensure we always enable events again 10865a60e47497f21f64e6d79420dc4c56c1907df22akschulz mTransmitEvents = true; 1087326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1088fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1089fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1090fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void sendEvent(Event evt) { 10915a60e47497f21f64e6d79420dc4c56c1907df22akschulz 10925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mTransmitEvents == false) { 10935a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG, "mTransmitEvents == false - don't send event."); 10945a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 10955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 10965a60e47497f21f64e6d79420dc4c56c1907df22akschulz 10975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "sendEvent: " + evt.eventType + " " + evt.handle + " " + evt.folder + " " 10985a60e47497f21f64e6d79420dc4c56c1907df22akschulz + evt.oldFolder + " " + evt.msgType.name() + " " + evt.datetime + " " 10995a60e47497f21f64e6d79420dc4c56c1907df22akschulz + evt.subject + " " + evt.senderName + " " + evt.priority ); 1100fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 11010e7e149687b0b5e340991b20c9d8e5232e8d3e39Hemant Gupta if (mMnsClient == null || mMnsClient.isConnected() == false) { 11020e7e149687b0b5e340991b20c9d8e5232e8d3e39Hemant Gupta Log.d(TAG, "sendEvent: No MNS client registered or connected- don't send event"); 1103fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return; 1104fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1105fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 11065a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Enable use of the cache for checking the filter */ 11075a60e47497f21f64e6d79420dc4c56c1907df22akschulz long eventFilter = mEventFilter; 11085a60e47497f21f64e6d79420dc4c56c1907df22akschulz 11095a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* This should have been a switch on the string, but it is not allowed in Java 1.6 */ 11105a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* WARNING: Here we do pointer compare for the string to speed up things, that is. 11115a60e47497f21f64e6d79420dc4c56c1907df22akschulz * HENCE: always use the EVENT_TYPE_"defines" */ 11125a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(evt.eventType == EVENT_TYPE_NEW) { 11135a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventNewMessage(eventFilter)) { 11145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11155a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11175a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_DELETE) { 11185a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventMessageDeleted(eventFilter)) { 11195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11205a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_REMOVED) { 11235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventMessageRemoved(eventFilter)) { 11245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11255a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_SHIFT) { 11285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventMessageShift(eventFilter)) { 11295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11305a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11325a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_DELEVERY_SUCCESS) { 11335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventDeliverySuccess(eventFilter)) { 11345a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11355a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_SENDING_SUCCESS) { 11385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventSendingSuccess(eventFilter)) { 11395a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11405a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11425a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_SENDING_FAILURE) { 11435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventSendingFailed(eventFilter)) { 11445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11455a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11475a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_DELIVERY_FAILURE) { 11485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventDeliveryFailed(eventFilter)) { 11495a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11505a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11515a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11525a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_READ_STATUS) { 11535a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventReadStatusChanged(eventFilter)) { 11545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11555a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11565a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_CONVERSATION) { 11585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventConversationChanged(eventFilter)) { 11595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11605a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11625a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_PRESENCE) { 11635a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventParticipantPresenceChanged(eventFilter)) { 11645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11655a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(evt.eventType == EVENT_TYPE_CHAT_STATE) { 11685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!sendEventParticipantChatstateChanged(eventFilter)) { 11695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG, "Skip sending event of type: " + evt.eventType); 11705a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 11715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11725a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 11735a60e47497f21f64e6d79420dc4c56c1907df22akschulz 1174fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 1175fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mMnsClient.sendEvent(evt.encode(), mMasId); 1176fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (UnsupportedEncodingException ex) { 1177fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* do nothing */ 11785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.e(TAG, "Exception - should not happen: ",ex); 1179fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1180fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1181fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1182326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void initMsgList() throws RemoteException { 1183fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (V) Log.d(TAG, "initMsgList"); 1184db8d8ae565b3db6a5e3187170dcb7b281a79f9daAjay Panicker UserManager manager = UserManager.get(mContext); 118529cab6e8ea1014179fd15fb067e621ae4b066085Ajay Panicker if (manager == null || !manager.isUserUnlocked()) return; 1186fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1187db8d8ae565b3db6a5e3187170dcb7b281a79f9daAjay Panicker if (mEnableSmsMms) { 1188326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde HashMap<Long, Msg> msgListSms = new HashMap<Long, Msg>(); 1189fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1190326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(Sms.CONTENT_URI, 11915a60e47497f21f64e6d79420dc4c56c1907df22akschulz SMS_PROJECTION_SHORT, null, null, null); 119228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 11935a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 11945a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 11955a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex(Sms._ID)); 11965a60e47497f21f64e6d79420dc4c56c1907df22akschulz int type = c.getInt(c.getColumnIndex(Sms.TYPE)); 11975a60e47497f21f64e6d79420dc4c56c1907df22akschulz int threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 11985a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = c.getInt(c.getColumnIndex(Sms.READ)); 1199fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 12005a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = new Msg(id, type, threadId, read); 12015a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgListSms.put(id, msg); 12025a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 120328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 120428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 12055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1206326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 120728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 12085a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListSms()) { 12095a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListSms().clear(); 12105a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListSms(msgListSms, true); // Set initial folder version counter 1211326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1212fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1213326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde HashMap<Long, Msg> msgListMms = new HashMap<Long, Msg>(); 1214fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1215326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde c = mResolver.query(Mms.CONTENT_URI, MMS_PROJECTION_SHORT, null, null, null); 121628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 12175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 12185a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 12195a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex(Mms._ID)); 12205a60e47497f21f64e6d79420dc4c56c1907df22akschulz int type = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); 12215a60e47497f21f64e6d79420dc4c56c1907df22akschulz int threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 12225a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = c.getInt(c.getColumnIndex(Mms.READ)); 1223fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 12245a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = new Msg(id, type, threadId, read); 12255a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgListMms.put(id, msg); 12265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 122728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 122828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 12295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1230326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 123128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 12325a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMms()) { 12335a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListMms().clear(); 12345a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListMms(msgListMms, true); // Set initial folder version counter 1235326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1236fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1237fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1238326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(mAccount != null) { 12395a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long, Msg> msgList = new HashMap<Long, Msg>(); 1240326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uri = mMessageUri; 12415a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mProviderClient.query(uri, MSG_PROJECTION_SHORT, null, null, null); 1242326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 124328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 12445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 12455a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 12465a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex(MessageColumns._ID)); 12475a60e47497f21f64e6d79420dc4c56c1907df22akschulz long folderId = c.getInt(c.getColumnIndex( 12485a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FOLDER_ID)); 12495a60e47497f21f64e6d79420dc4c56c1907df22akschulz int readFlag = c.getInt(c.getColumnIndex( 12505a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_READ)); 12515a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = new Msg(id, folderId, readFlag); 12525a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgList.put(id, msg); 12535a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 125428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 125528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 12565a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 12575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 12585a60e47497f21f64e6d79420dc4c56c1907df22akschulz 12595a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMsg()) { 12605a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListMsg().clear(); 12615a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListMsg(msgList, true); 1262326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 12635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 12645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 126528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 12665a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void initContactsList() throws RemoteException { 12675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.d(TAG, "initContactsList"); 12685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(mContactUri == null) { 12695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "initContactsList() no mContactUri - nothing to init"); 12705a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 12715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 12725a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = mContactUri; 12735a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mProviderClient.query(uri, 12745a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.BT_CONTACT_CHATSTATE_PRESENCE_PROJECTION, 12755a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null, null); 12765a60e47497f21f64e6d79420dc4c56c1907df22akschulz Map<String, BluetoothMapConvoContactElement> contactList = 12775a60e47497f21f64e6d79420dc4c56c1907df22akschulz new HashMap<String, BluetoothMapConvoContactElement>(); 12785a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 12795a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 12805a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConvoContactInfo cInfo = new ConvoContactInfo(); 12815a60e47497f21f64e6d79420dc4c56c1907df22akschulz cInfo.setConvoColunms(c); 12825a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 12835a60e47497f21f64e6d79420dc4c56c1907df22akschulz long convoId = c.getLong(cInfo.mContactColConvoId); 12845a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (convoId == 0) 12855a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 12865a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) BluetoothMapUtils.printCursor(c); 12875a60e47497f21f64e6d79420dc4c56c1907df22akschulz String uci = c.getString(cInfo.mContactColUci); 12885a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = c.getString(cInfo.mContactColName); 12895a60e47497f21f64e6d79420dc4c56c1907df22akschulz String displayName = c.getString(cInfo.mContactColNickname); 12905a60e47497f21f64e6d79420dc4c56c1907df22akschulz String presenceStatus = c.getString(cInfo.mContactColPresenceText); 12915a60e47497f21f64e6d79420dc4c56c1907df22akschulz int presenceState = c.getInt(cInfo.mContactColPresenceState); 12925a60e47497f21f64e6d79420dc4c56c1907df22akschulz long lastActivity = c.getLong(cInfo.mContactColLastActive); 12935a60e47497f21f64e6d79420dc4c56c1907df22akschulz int chatState = c.getInt(cInfo.mContactColChatState); 12945a60e47497f21f64e6d79420dc4c56c1907df22akschulz int priority = c.getInt(cInfo.mContactColPriority); 12955a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btUid = c.getString(cInfo.mContactColBtUid); 12965a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement contact = 12975a60e47497f21f64e6d79420dc4c56c1907df22akschulz new BluetoothMapConvoContactElement(uci, name, displayName, 12985a60e47497f21f64e6d79420dc4c56c1907df22akschulz presenceStatus, presenceState, lastActivity, chatState, 12995a60e47497f21f64e6d79420dc4c56c1907df22akschulz priority, btUid); 13005a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactList.put(uci, contact); 13015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 1302326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 13035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 13045a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 13055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13065a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getContactList()) { 13075a60e47497f21f64e6d79420dc4c56c1907df22akschulz getContactList().clear(); 13085a60e47497f21f64e6d79420dc4c56c1907df22akschulz setContactList(contactList, true); 1309326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1310fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1311fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1312fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void handleMsgListChangesSms() { 1313fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (V) Log.d(TAG, "handleMsgListChangesSms"); 1314fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1315fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie HashMap<Long, Msg> msgListSms = new HashMap<Long, Msg>(); 13165a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChanged = false; 1317fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 13185a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c; 13195a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion == BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 13205a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mResolver.query(Sms.CONTENT_URI, 13215a60e47497f21f64e6d79420dc4c56c1907df22akschulz SMS_PROJECTION_SHORT, null, null, null); 13225a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 13235a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mResolver.query(Sms.CONTENT_URI, 13245a60e47497f21f64e6d79420dc4c56c1907df22akschulz SMS_PROJECTION_SHORT_EXT, null, null, null); 13255a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13265a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListSms()) { 132728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 13285a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 13295a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 13305a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex(Sms._ID)); 13315a60e47497f21f64e6d79420dc4c56c1907df22akschulz int type = c.getInt(c.getColumnIndex(Sms.TYPE)); 13325a60e47497f21f64e6d79420dc4c56c1907df22akschulz int threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 13335a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = c.getInt(c.getColumnIndex(Sms.READ)); 13345a60e47497f21f64e6d79420dc4c56c1907df22akschulz 13355a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListSms().remove(id); 13365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 13375a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We must filter out any actions made by the MCE, hence do not send e.g. 13385a60e47497f21f64e6d79420dc4c56c1907df22akschulz * a message deleted and/or MessageShift for messages deleted by the MCE. */ 13395a60e47497f21f64e6d79420dc4c56c1907df22akschulz 13405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msg == null) { 13415a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* New message */ 13425a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg = new Msg(id, type, threadId, read); 13435a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgListSms.put(id, msg); 13445a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 13455a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt; 13465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mTransmitEvents == true && // extract contact details only if needed 13475a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMapEventReportVersion > 13485a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 13495a60e47497f21f64e6d79420dc4c56c1907df22akschulz String date = BluetoothMapUtils.getDateTimeString( 13505a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getLong(c.getColumnIndex(Sms.DATE))); 13515a60e47497f21f64e6d79420dc4c56c1907df22akschulz String subject = c.getString(c.getColumnIndex(Sms.BODY)); 13525a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = ""; 13535a60e47497f21f64e6d79420dc4c56c1907df22akschulz String phone = ""; 13545a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (type == 1) { //inbox 13555a60e47497f21f64e6d79420dc4c56c1907df22akschulz phone = c.getString(c.getColumnIndex(Sms.ADDRESS)); 13565a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (phone != null && !phone.isEmpty()) { 13575a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = BluetoothMapContent.getContactNameFromPhone(phone, 13585a60e47497f21f64e6d79420dc4c56c1907df22akschulz mResolver); 13595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name == null || name.isEmpty()){ 13605a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = phone; 13615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13625a60e47497f21f64e6d79420dc4c56c1907df22akschulz }else{ 13635a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = phone; 13645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13655a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 13665a60e47497f21f64e6d79420dc4c56c1907df22akschulz TelephonyManager tm = 13675a60e47497f21f64e6d79420dc4c56c1907df22akschulz (TelephonyManager)mContext.getSystemService( 13685a60e47497f21f64e6d79420dc4c56c1907df22akschulz Context.TELEPHONY_SERVICE); 13695a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (tm != null) { 13705a60e47497f21f64e6d79420dc4c56c1907df22akschulz phone = tm.getLine1Number(); 13715a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = tm.getLine1AlphaTag(); 13725a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(name == null || name.isEmpty()){ 13735a60e47497f21f64e6d79420dc4c56c1907df22akschulz name = phone; 13745a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13755a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13775a60e47497f21f64e6d79420dc4c56c1907df22akschulz String priority = "no";// no priority for sms 13785a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Incoming message from the network */ 13795a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion == 13805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V11) { 13815a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, getSmsFolderName(type), 13825a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsType, date, subject, name, priority); 13835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 13845a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, getSmsFolderName(type), 13855a60e47497f21f64e6d79420dc4c56c1907df22akschulz mSmsType, date, subject, name, priority, 13865a60e47497f21f64e6d79420dc4c56c1907df22akschulz (long)threadId, null); 13875a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13885a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 13895a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Incoming message from the network */ 13905a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, getSmsFolderName(type), 13915a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, mSmsType); 13925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 13935a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 13945a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 13955a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Existing message */ 13965a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (type != msg.type) { 13975a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 13985a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG, "new type: " + type + " old type: " + msg.type); 13995a60e47497f21f64e6d79420dc4c56c1907df22akschulz String oldFolder = getSmsFolderName(msg.type); 14005a60e47497f21f64e6d79420dc4c56c1907df22akschulz String newFolder = getSmsFolderName(type); 14015a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Filter out the intermediate outbox steps 14025a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(!oldFolder.equalsIgnoreCase(newFolder)) { 14035a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_SHIFT, id, 14045a60e47497f21f64e6d79420dc4c56c1907df22akschulz getSmsFolderName(type), oldFolder, mSmsType); 14055a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 14065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 14075a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.type = type; 14085a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(threadId != msg.threadId) { 14095a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 14105a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG, "Message delete change: type: " + type 14115a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " old type: " + msg.type 14125a60e47497f21f64e6d79420dc4c56c1907df22akschulz + "\n threadId: " + threadId 14135a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " old threadId: " + msg.threadId); 14145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(threadId == DELETED_THREAD_ID) { // Message deleted 14155a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: 14165a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We shall only use the folder attribute, but can't remember 14175a60e47497f21f64e6d79420dc4c56c1907df22akschulz // wether to set it to "deleted" or the name of the folder 14185a60e47497f21f64e6d79420dc4c56c1907df22akschulz // from which the message have been deleted. 1419cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // "old_folder" used only for MessageShift event 14205a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_DELETE, id, 1421cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta getSmsFolderName(msg.type), null, mSmsType); 14225a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 14235a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.threadId = threadId; 14245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { // Undelete 14255a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_SHIFT, id, 14265a60e47497f21f64e6d79420dc4c56c1907df22akschulz getSmsFolderName(msg.type), 14275a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.FOLDER_NAME_DELETED, mSmsType); 14285a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 14295a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.threadId = threadId; 14305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1431326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 14325a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != msg.flagRead) { 14335a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 14345a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.flagRead = read; 14355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion > 14365a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 14375a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_READ_STATUS, id, 14385a60e47497f21f64e6d79420dc4c56c1907df22akschulz getSmsFolderName(msg.type), mSmsType); 14395a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 14405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1441326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 14425a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgListSms.put(id, msg); 1443fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 14445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 144528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 144628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 14475a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1448fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1449fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 14505a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (Msg msg : getMsgListSms().values()) { 1451cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // "old_folder" used only for MessageShift event 1452326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Event evt = new Event(EVENT_TYPE_DELETE, msg.id, 1453cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta getSmsFolderName(msg.type), null, mSmsType); 1454fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sendEvent(evt); 14555a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 1456fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1457fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 14585a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListSms(msgListSms, listChanged); 1459fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1460fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1461fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1462fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void handleMsgListChangesMms() { 1463fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (V) Log.d(TAG, "handleMsgListChangesMms"); 1464fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 1465fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie HashMap<Long, Msg> msgListMms = new HashMap<Long, Msg>(); 14665a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChanged = false; 14675a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c; 14685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion == BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 14695a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mResolver.query(Mms.CONTENT_URI, 14705a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_PROJECTION_SHORT, null, null, null); 14715a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 14725a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mResolver.query(Mms.CONTENT_URI, 14735a60e47497f21f64e6d79420dc4c56c1907df22akschulz MMS_PROJECTION_SHORT_EXT, null, null, null); 14745a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1475fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 14765a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMms()) { 14775a60e47497f21f64e6d79420dc4c56c1907df22akschulz try{ 14785a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 14795a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 14805a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex(Mms._ID)); 14815a60e47497f21f64e6d79420dc4c56c1907df22akschulz int type = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); 14825a60e47497f21f64e6d79420dc4c56c1907df22akschulz int mtype = c.getInt(c.getColumnIndex(Mms.MESSAGE_TYPE)); 14835a60e47497f21f64e6d79420dc4c56c1907df22akschulz int threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 14845a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Go through code to see if we have an issue with mismatch in types 14855a60e47497f21f64e6d79420dc4c56c1907df22akschulz // for threadId. Seems to be a long in DB?? 14865a60e47497f21f64e6d79420dc4c56c1907df22akschulz int read = c.getInt(c.getColumnIndex(Mms.READ)); 14875a60e47497f21f64e6d79420dc4c56c1907df22akschulz 14885a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListMms().remove(id); 14895a60e47497f21f64e6d79420dc4c56c1907df22akschulz 14905a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We must filter out any actions made by the MCE, hence do not send 14915a60e47497f21f64e6d79420dc4c56c1907df22akschulz * e.g. a message deleted and/or MessageShift for messages deleted by the 14925a60e47497f21f64e6d79420dc4c56c1907df22akschulz * MCE.*/ 14935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 14945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msg == null) { 14955a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* New message - only notify on retrieve conf */ 14965a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 14975a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (getMmsFolderName(type).equalsIgnoreCase( 14985a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.FOLDER_NAME_INBOX) && 14995a60e47497f21f64e6d79420dc4c56c1907df22akschulz mtype != MESSAGE_TYPE_RETRIEVE_CONF) { 1500fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie continue; 15015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 15025a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg = new Msg(id, type, threadId, read); 15035a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgListMms.put(id, msg); 1504326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Event evt; 15055a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mTransmitEvents == true && // extract contact details only if needed 15065a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMapEventReportVersion != 15075a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 15085a60e47497f21f64e6d79420dc4c56c1907df22akschulz String date = BluetoothMapUtils.getDateTimeString( 15095a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getLong(c.getColumnIndex(Mms.DATE))); 15105a60e47497f21f64e6d79420dc4c56c1907df22akschulz String subject = c.getString(c.getColumnIndex(Mms.SUBJECT)); 15115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (subject == null || subject.length() == 0) { 15125a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Get subject from mms text body parts - if any exists */ 15135a60e47497f21f64e6d79420dc4c56c1907df22akschulz subject = BluetoothMapContent.getTextPartsMms(mResolver, id); 15145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 15155a60e47497f21f64e6d79420dc4c56c1907df22akschulz int tmpPri = c.getInt(c.getColumnIndex(Mms.PRIORITY)); 15165a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG, "TEMP handleMsgListChangesMms, " + 15175a60e47497f21f64e6d79420dc4c56c1907df22akschulz "newMessage 'read' state: " + read + 15185a60e47497f21f64e6d79420dc4c56c1907df22akschulz "priority: " + tmpPri); 15195a60e47497f21f64e6d79420dc4c56c1907df22akschulz 15205a60e47497f21f64e6d79420dc4c56c1907df22akschulz String address = BluetoothMapContent.getAddressMms( 15215a60e47497f21f64e6d79420dc4c56c1907df22akschulz mResolver,id,BluetoothMapContent.MMS_FROM); 15225a60e47497f21f64e6d79420dc4c56c1907df22akschulz String priority = "no"; 15235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(tmpPri == PduHeaders.PRIORITY_HIGH) 15245a60e47497f21f64e6d79420dc4c56c1907df22akschulz priority = "yes"; 15255a60e47497f21f64e6d79420dc4c56c1907df22akschulz 15265a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Incoming message from the network */ 15275a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion == 15285a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V11) { 15295a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, getMmsFolderName(type), 15305a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE.MMS, date, subject, address, priority); 15315a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 15325a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, getMmsFolderName(type), 15335a60e47497f21f64e6d79420dc4c56c1907df22akschulz TYPE.MMS, date, subject, address, priority, 15345a60e47497f21f64e6d79420dc4c56c1907df22akschulz (long)threadId, null); 15355a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 15365a60e47497f21f64e6d79420dc4c56c1907df22akschulz 15375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 15385a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Incoming message from the network */ 15395a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, getMmsFolderName(type), 15405a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, TYPE.MMS); 1541326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 15425a60e47497f21f64e6d79420dc4c56c1907df22akschulz 15435a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 15445a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 15455a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Existing message */ 15465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (type != msg.type) { 15475a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG, "new type: " + type + " old type: " + msg.type); 15485a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt; 15495a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 15505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msg.localInitiatedSend == false) { 15515a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Only send events about local initiated changes 15525a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_SHIFT, id, getMmsFolderName(type), 15535a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMmsFolderName(msg.type), TYPE.MMS); 15545a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 15555a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 15565a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.type = type; 15575a60e47497f21f64e6d79420dc4c56c1907df22akschulz 15585a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (getMmsFolderName(type).equalsIgnoreCase( 15595a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.FOLDER_NAME_SENT) 15605a60e47497f21f64e6d79420dc4c56c1907df22akschulz && msg.localInitiatedSend == true) { 15615a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Stop tracking changes for this message 15625a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.localInitiatedSend = false; 15635a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_SENDING_SUCCESS, id, 15645a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMmsFolderName(type), null, TYPE.MMS); 15655a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 15665a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 15675a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(threadId != msg.threadId) { 15685a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.d(TAG, "Message delete change: type: " + type + " old type: " 15695a60e47497f21f64e6d79420dc4c56c1907df22akschulz + msg.type 15705a60e47497f21f64e6d79420dc4c56c1907df22akschulz + "\n threadId: " + threadId + " old threadId: " 15715a60e47497f21f64e6d79420dc4c56c1907df22akschulz + msg.threadId); 15725a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 15735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(threadId == DELETED_THREAD_ID) { // Message deleted 1574cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // "old_folder" used only for MessageShift event 15755a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_DELETE, id, 1576cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta getMmsFolderName(msg.type), null, TYPE.MMS); 15775a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 15785a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.threadId = threadId; 15795a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { // Undelete 15805a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_SHIFT, id, 15815a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMmsFolderName(msg.type), 15825a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.FOLDER_NAME_DELETED, TYPE.MMS); 15835a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 15845a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.threadId = threadId; 15855a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1586fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 15875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(read != msg.flagRead) { 15885a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 15895a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.flagRead = read; 15905a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion > 15915a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 15925a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_READ_STATUS, id, 15935a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMmsFolderName(msg.type), TYPE.MMS); 15945a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 15955a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1596326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 15975a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgListMms.put(id, msg); 1598fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 15995a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 16005a60e47497f21f64e6d79420dc4c56c1907df22akschulz 160128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 160228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 16035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1604fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 16055a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (Msg msg : getMsgListMms().values()) { 1606cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // "old_folder" used only for MessageShift event 1607326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Event evt = new Event(EVENT_TYPE_DELETE, msg.id, 1608cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta getMmsFolderName(msg.type), null, TYPE.MMS); 1609fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sendEvent(evt); 16105a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 1611fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 16125a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListMms(msgListMms, listChanged); 1613fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1614fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 1615fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 16165a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void handleMsgListChangesMsg(Uri uri) throws RemoteException{ 16175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG, "handleMsgListChangesMsg uri: " + uri.toString()); 1618326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1619326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // TODO: Change observer to handle accountId and message ID if present 1620326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 16215a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<Long, Msg> msgList = new HashMap<Long, Msg>(); 16225a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c; 16235a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChanged = false; 16245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion == BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 16255a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mProviderClient.query(mMessageUri, MSG_PROJECTION_SHORT, null, null, null); 16265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (mMapEventReportVersion == BluetoothMapUtils.MAP_EVENT_REPORT_V11) { 16275a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mProviderClient.query(mMessageUri, MSG_PROJECTION_SHORT_EXT, null, null, null); 16285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 16295a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mProviderClient.query(mMessageUri, MSG_PROJECTION_SHORT_EXT2, null, null, null); 16305a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 16315a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMsg()) { 163228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 16335a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 16345a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 16355a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex( 16365a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns._ID)); 16375a60e47497f21f64e6d79420dc4c56c1907df22akschulz int folderId = c.getInt(c.getColumnIndex( 16385a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FOLDER_ID)); 16395a60e47497f21f64e6d79420dc4c56c1907df22akschulz int readFlag = c.getInt(c.getColumnIndex( 16405a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_READ)); 16415a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListMsg().remove(id); 16425a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement folderElement = mFolders.getFolderById(folderId); 16435a60e47497f21f64e6d79420dc4c56c1907df22akschulz String newFolder; 16445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(folderElement != null) { 16455a60e47497f21f64e6d79420dc4c56c1907df22akschulz newFolder = folderElement.getFullPath(); 16465a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 16475a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This can happen if a new folder is created while connected 16485a60e47497f21f64e6d79420dc4c56c1907df22akschulz newFolder = "unknown"; 16495a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 16505a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We must filter out any actions made by the MCE, hence do not send e.g. 16515a60e47497f21f64e6d79420dc4c56c1907df22akschulz * a message deleted and/or MessageShift for messages deleted by the MCE. */ 16525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msg == null) { 16535a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 16545a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* New message - created with message unread */ 16555a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg = new Msg(id, folderId, 0, readFlag); 16565a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgList.put(id, msg); 16575a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt; 16585a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Incoming message from the network */ 16595a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion != BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 16605a60e47497f21f64e6d79420dc4c56c1907df22akschulz String date = BluetoothMapUtils.getDateTimeString( 16615a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.getLong(c.getColumnIndex( 16625a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.DATE))); 16635a60e47497f21f64e6d79420dc4c56c1907df22akschulz String subject = c.getString(c.getColumnIndex( 16645a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.SUBJECT)); 16655a60e47497f21f64e6d79420dc4c56c1907df22akschulz String address = c.getString(c.getColumnIndex( 16665a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FROM_LIST)); 16675a60e47497f21f64e6d79420dc4c56c1907df22akschulz String priority = "no"; 16685a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(c.getInt(c.getColumnIndex( 16695a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY)) 16705a60e47497f21f64e6d79420dc4c56c1907df22akschulz == 1) 16715a60e47497f21f64e6d79420dc4c56c1907df22akschulz priority = "yes"; 16725a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion == 16735a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V11) { 16745a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, newFolder, 16755a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount.getType(), date, subject, address, priority); 16765a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 16775a60e47497f21f64e6d79420dc4c56c1907df22akschulz long thread_id = c.getLong(c.getColumnIndex( 16785a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_ID)); 16795a60e47497f21f64e6d79420dc4c56c1907df22akschulz String thread_name = c.getString(c.getColumnIndex( 16805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.MessageColumns.THREAD_NAME)); 16815a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, newFolder, 16825a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount.getType(), date, subject, address, priority, 16835a60e47497f21f64e6d79420dc4c56c1907df22akschulz thread_id, thread_name); 16845a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 1685326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 16865a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event(EVENT_TYPE_NEW, id, newFolder, null, TYPE.EMAIL); 1687326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 16885a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 16895a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 16905a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Existing message */ 16915a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folderId != msg.folderId && msg.folderId != -1) { 16925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "new folderId: " + folderId + " old folderId: " 16935a60e47497f21f64e6d79420dc4c56c1907df22akschulz + msg.folderId); 16945a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement oldFolderElement = 16955a60e47497f21f64e6d79420dc4c56c1907df22akschulz mFolders.getFolderById(msg.folderId); 16965a60e47497f21f64e6d79420dc4c56c1907df22akschulz String oldFolder; 16975a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 16985a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(oldFolderElement != null) { 16995a60e47497f21f64e6d79420dc4c56c1907df22akschulz oldFolder = oldFolderElement.getFullPath(); 1700326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 17015a60e47497f21f64e6d79420dc4c56c1907df22akschulz // This can happen if a new folder is created while connected 17025a60e47497f21f64e6d79420dc4c56c1907df22akschulz oldFolder = "unknown"; 17035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17045a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement deletedFolder = 17055a60e47497f21f64e6d79420dc4c56c1907df22akschulz mFolders.getFolderByName( 17065a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.FOLDER_NAME_DELETED); 17075a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement sentFolder = 17085a60e47497f21f64e6d79420dc4c56c1907df22akschulz mFolders.getFolderByName( 17095a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.FOLDER_NAME_SENT); 17105a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* 17115a60e47497f21f64e6d79420dc4c56c1907df22akschulz * If the folder is now 'deleted', send a deleted-event in stead of 17125a60e47497f21f64e6d79420dc4c56c1907df22akschulz * a shift or if message is sent initiated by MAP Client, then send 17135a60e47497f21f64e6d79420dc4c56c1907df22akschulz * sending-success otherwise send folderShift 17145a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 17155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(deletedFolder != null && deletedFolder.getFolderId() 17165a60e47497f21f64e6d79420dc4c56c1907df22akschulz == folderId) { 1717cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // "old_folder" used only for MessageShift event 1718cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Event evt = new Event(EVENT_TYPE_DELETE, msg.id, oldFolder, 1719cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta null, mAccount.getType()); 17205a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 17215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if(sentFolder != null 17225a60e47497f21f64e6d79420dc4c56c1907df22akschulz && sentFolder.getFolderId() == folderId 17235a60e47497f21f64e6d79420dc4c56c1907df22akschulz && msg.localInitiatedSend == true) { 17245a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msg.transparent) { 17255a60e47497f21f64e6d79420dc4c56c1907df22akschulz mResolver.delete( 17265a60e47497f21f64e6d79420dc4c56c1907df22akschulz ContentUris.withAppendedId(mMessageUri, id), 17275a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null); 17285a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 17295a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.localInitiatedSend = false; 17305a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_SENDING_SUCCESS, msg.id, 17315a60e47497f21f64e6d79420dc4c56c1907df22akschulz oldFolder, null, mAccount.getType()); 17325a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 17335a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17345a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 17355a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (!oldFolder.equalsIgnoreCase("root")) { 17365a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_SHIFT, id, newFolder, 17375a60e47497f21f64e6d79420dc4c56c1907df22akschulz oldFolder, mAccount.getType()); 17385a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 17395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17415a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.folderId = folderId; 17425a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 17435a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(readFlag != msg.flagRead) { 17445a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 17455a60e47497f21f64e6d79420dc4c56c1907df22akschulz 17465a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion > 17475a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils.MAP_EVENT_REPORT_V10) { 17485a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_READ_STATUS, id, newFolder, 17495a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount.getType()); 1750326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde sendEvent(evt); 17515a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.flagRead = readFlag; 1752326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1753326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 17545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 17555a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgList.put(id, msg); 1756326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 17575a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 175828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 175928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 17605a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 1761326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1762326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // For all messages no longer in the database send a delete notification 17635a60e47497f21f64e6d79420dc4c56c1907df22akschulz for (Msg msg : getMsgListMsg().values()) { 17645a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement oldFolderElement = mFolders.getFolderById(msg.folderId); 1765326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String oldFolder; 17665a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 1767326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(oldFolderElement != null) { 1768326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde oldFolder = oldFolderElement.getFullPath(); 1769326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 1770326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde oldFolder = "unknown"; 1771326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 17725a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Some e-mail clients delete the message after sending, and creates a 17735a60e47497f21f64e6d79420dc4c56c1907df22akschulz * new message in sent. We cannot track the message anymore, hence send both a 17745a60e47497f21f64e6d79420dc4c56c1907df22akschulz * send success and delete message. 1775326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1776326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msg.localInitiatedSend == true) { 1777326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msg.localInitiatedSend = false; 1778326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // If message is send with transparency don't set folder as message is deleted 1779326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msg.transparent) 1780326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde oldFolder = null; 17815a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_SENDING_SUCCESS, msg.id, oldFolder, null, 17825a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount.getType()); 1783326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde sendEvent(evt); 1784326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1785326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* As this message deleted is only send on a real delete - don't set folder. 1786326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * - only send delete event if message is not sent with transparency 1787326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 1788326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (!msg.transparent) { 1789326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1790cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // "old_folder" used only for MessageShift event 1791cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Event evt = new Event(EVENT_TYPE_DELETE, msg.id, oldFolder, 1792cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta null, mAccount.getType()); 1793326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde sendEvent(evt); 1794326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1795326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 17965a60e47497f21f64e6d79420dc4c56c1907df22akschulz setMsgListMsg(msgList, listChanged); 1797326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1798326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1799326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 1800326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void handleMsgListChanges(Uri uri) { 1801326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(uri.getAuthority().equals(mAuthority)) { 1802326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde try { 18035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "handleMsgListChanges: account type = " 18045a60e47497f21f64e6d79420dc4c56c1907df22akschulz + mAccount.getType().toString()); 18055a60e47497f21f64e6d79420dc4c56c1907df22akschulz handleMsgListChangesMsg(uri); 18065a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch(RemoteException e) { 1807326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mMasInstance.restartObexServerSession(); 18085a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, "Problems contacting the ContentProvider in mas Instance " 18095a60e47497f21f64e6d79420dc4c56c1907df22akschulz + mMasId + " restaring ObexServerSession"); 1810326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1811326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 18125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18135a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: check to see if there could be problem with IM and SMS in one instance 18145a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mEnableSmsMms) { 1815326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handleMsgListChangesSms(); 1816326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handleMsgListChangesMms(); 1817326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1818326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 1819326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 18205a60e47497f21f64e6d79420dc4c56c1907df22akschulz private void handleContactListChanges(Uri uri) { 18215a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (uri.getAuthority().equals(mAuthority)) { 18225a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 18235a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG,"handleContactListChanges uri: " + uri.toString()); 18245a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = null; 18255a60e47497f21f64e6d79420dc4c56c1907df22akschulz boolean listChanged = false; 18265a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 18275a60e47497f21f64e6d79420dc4c56c1907df22akschulz ConvoContactInfo cInfo = new ConvoContactInfo(); 18285a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18295a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion != BluetoothMapUtils.MAP_EVENT_REPORT_V10 18305a60e47497f21f64e6d79420dc4c56c1907df22akschulz && mMapEventReportVersion != BluetoothMapUtils.MAP_EVENT_REPORT_V11) { 18315a60e47497f21f64e6d79420dc4c56c1907df22akschulz c = mProviderClient 18325a60e47497f21f64e6d79420dc4c56c1907df22akschulz .query(mContactUri, 18335a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract. 18345a60e47497f21f64e6d79420dc4c56c1907df22akschulz BT_CONTACT_CHATSTATE_PRESENCE_PROJECTION, 18355a60e47497f21f64e6d79420dc4c56c1907df22akschulz null, null, null); 18365a60e47497f21f64e6d79420dc4c56c1907df22akschulz cInfo.setConvoColunms(c); 18375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 18385a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG,"handleContactListChanges MAP version does not" + 18395a60e47497f21f64e6d79420dc4c56c1907df22akschulz "support convocontact notifications"); 18405a60e47497f21f64e6d79420dc4c56c1907df22akschulz return; 18415a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 18425a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18435a60e47497f21f64e6d79420dc4c56c1907df22akschulz HashMap<String, BluetoothMapConvoContactElement> contactList = 18445a60e47497f21f64e6d79420dc4c56c1907df22akschulz new HashMap<String, 18455a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement>(getContactList().size()); 18465a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18475a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized (getContactList()) { 18485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 18495a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 18505a60e47497f21f64e6d79420dc4c56c1907df22akschulz String uci = c.getString(cInfo.mContactColUci); 18515a60e47497f21f64e6d79420dc4c56c1907df22akschulz long convoId = c.getLong(cInfo.mContactColConvoId); 18525a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (convoId == 0) 18535a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 18545a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) BluetoothMapUtils.printCursor(c); 18565a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18575a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapConvoContactElement contact = 18585a60e47497f21f64e6d79420dc4c56c1907df22akschulz getContactList().remove(uci); 18595a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18605a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* 18615a60e47497f21f64e6d79420dc4c56c1907df22akschulz * We must filter out any actions made by the 18625a60e47497f21f64e6d79420dc4c56c1907df22akschulz * MCE, hence do not send e.g. a message deleted 18635a60e47497f21f64e6d79420dc4c56c1907df22akschulz * and/or MessageShift for messages deleted by 18645a60e47497f21f64e6d79420dc4c56c1907df22akschulz * the MCE. 18655a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 18665a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (contact == null) { 18675a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 18685a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* 18695a60e47497f21f64e6d79420dc4c56c1907df22akschulz * New contact - added to conversation and 18705a60e47497f21f64e6d79420dc4c56c1907df22akschulz * tracked here 18715a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 18725a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (mMapEventReportVersion 18735a60e47497f21f64e6d79420dc4c56c1907df22akschulz != BluetoothMapUtils.MAP_EVENT_REPORT_V10 18745a60e47497f21f64e6d79420dc4c56c1907df22akschulz && mMapEventReportVersion 18755a60e47497f21f64e6d79420dc4c56c1907df22akschulz != BluetoothMapUtils.MAP_EVENT_REPORT_V11) { 18765a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt; 18775a60e47497f21f64e6d79420dc4c56c1907df22akschulz String name = c 18785a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getString(cInfo.mContactColName); 18795a60e47497f21f64e6d79420dc4c56c1907df22akschulz String displayName = c 18805a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getString(cInfo.mContactColNickname); 18815a60e47497f21f64e6d79420dc4c56c1907df22akschulz String presenceStatus = c 18825a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getString(cInfo.mContactColPresenceText); 18835a60e47497f21f64e6d79420dc4c56c1907df22akschulz int presenceState = c 18845a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getInt(cInfo.mContactColPresenceState); 18855a60e47497f21f64e6d79420dc4c56c1907df22akschulz long lastActivity = c 18865a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getLong(cInfo.mContactColLastActive); 18875a60e47497f21f64e6d79420dc4c56c1907df22akschulz int chatState = c 18885a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getInt(cInfo.mContactColChatState); 18895a60e47497f21f64e6d79420dc4c56c1907df22akschulz int priority = c 18905a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getInt(cInfo.mContactColPriority); 18915a60e47497f21f64e6d79420dc4c56c1907df22akschulz String btUid = c 18925a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getString(cInfo.mContactColBtUid); 18935a60e47497f21f64e6d79420dc4c56c1907df22akschulz 18945a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Get Conversation information for 18955a60e47497f21f64e6d79420dc4c56c1907df22akschulz // event 18965a60e47497f21f64e6d79420dc4c56c1907df22akschulz// Uri convoUri = Uri 18975a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .parse(mAccount.mBase_uri 18985a60e47497f21f64e6d79420dc4c56c1907df22akschulz// + "/" 18995a60e47497f21f64e6d79420dc4c56c1907df22akschulz// + BluetoothMapContract.TABLE_CONVERSATION); 19005a60e47497f21f64e6d79420dc4c56c1907df22akschulz// String whereClause = "contacts._id = " 19015a60e47497f21f64e6d79420dc4c56c1907df22akschulz// + convoId; 19025a60e47497f21f64e6d79420dc4c56c1907df22akschulz// Cursor cConvo = mProviderClient 19035a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .query(convoUri, 19045a60e47497f21f64e6d79420dc4c56c1907df22akschulz// BluetoothMapContract.BT_CONVERSATION_PROJECTION, 19055a60e47497f21f64e6d79420dc4c56c1907df22akschulz// whereClause, null, null); 19065a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: will move out of the loop when merged with CB's 19075a60e47497f21f64e6d79420dc4c56c1907df22akschulz // changes make sure to look up col index out side loop 19085a60e47497f21f64e6d79420dc4c56c1907df22akschulz String convoName = null; 19095a60e47497f21f64e6d79420dc4c56c1907df22akschulz// if (cConvo != null 19105a60e47497f21f64e6d79420dc4c56c1907df22akschulz// && cConvo.moveToFirst()) { 19115a60e47497f21f64e6d79420dc4c56c1907df22akschulz// convoName = cConvo 19125a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .getString(cConvo 19135a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .getColumnIndex(BluetoothMapContract.ConvoContactColumns.NAME)); 19145a60e47497f21f64e6d79420dc4c56c1907df22akschulz// } 19155a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19165a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact = new BluetoothMapConvoContactElement( 19175a60e47497f21f64e6d79420dc4c56c1907df22akschulz uci, name, displayName, 19185a60e47497f21f64e6d79420dc4c56c1907df22akschulz presenceStatus, presenceState, 19195a60e47497f21f64e6d79420dc4c56c1907df22akschulz lastActivity, chatState, 19205a60e47497f21f64e6d79420dc4c56c1907df22akschulz priority, btUid); 19215a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19225a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactList.put(uci, contact); 19235a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19245a60e47497f21f64e6d79420dc4c56c1907df22akschulz evt = new Event( 19255a60e47497f21f64e6d79420dc4c56c1907df22akschulz EVENT_TYPE_CONVERSATION, 19265a60e47497f21f64e6d79420dc4c56c1907df22akschulz uci, 19275a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount.getType(), 19285a60e47497f21f64e6d79420dc4c56c1907df22akschulz name, 19295a60e47497f21f64e6d79420dc4c56c1907df22akschulz String.valueOf(priority), 19305a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils 19315a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getDateTimeString(lastActivity), 19325a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoId, convoName, 19335a60e47497f21f64e6d79420dc4c56c1907df22akschulz presenceState, presenceStatus, 19345a60e47497f21f64e6d79420dc4c56c1907df22akschulz chatState); 19355a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19365a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 19375a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19385a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19395a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 19405a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Not new - compare updated content 19415a60e47497f21f64e6d79420dc4c56c1907df22akschulz// Uri convoUri = Uri 19425a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .parse(mAccount.mBase_uri 19435a60e47497f21f64e6d79420dc4c56c1907df22akschulz// + "/" 19445a60e47497f21f64e6d79420dc4c56c1907df22akschulz// + BluetoothMapContract.TABLE_CONVERSATION); 19455a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: Should be changed to own provider interface name 19465a60e47497f21f64e6d79420dc4c56c1907df22akschulz// String whereClause = "contacts._id = " 19475a60e47497f21f64e6d79420dc4c56c1907df22akschulz// + convoId; 19485a60e47497f21f64e6d79420dc4c56c1907df22akschulz// Cursor cConvo = mProviderClient 19495a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .query(convoUri, 19505a60e47497f21f64e6d79420dc4c56c1907df22akschulz// BluetoothMapContract.BT_CONVERSATION_PROJECTION, 19515a60e47497f21f64e6d79420dc4c56c1907df22akschulz// whereClause, null, null); 19525a60e47497f21f64e6d79420dc4c56c1907df22akschulz// // TODO: will move out of the loop when merged with CB's 19535a60e47497f21f64e6d79420dc4c56c1907df22akschulz// // changes make sure to look up col index out side loop 19545a60e47497f21f64e6d79420dc4c56c1907df22akschulz String convoName = null; 19555a60e47497f21f64e6d79420dc4c56c1907df22akschulz// if (cConvo != null && cConvo.moveToFirst()) { 19565a60e47497f21f64e6d79420dc4c56c1907df22akschulz// convoName = cConvo 19575a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .getString(cConvo 19585a60e47497f21f64e6d79420dc4c56c1907df22akschulz// .getColumnIndex(BluetoothMapContract.ConvoContactColumns.NAME)); 19595a60e47497f21f64e6d79420dc4c56c1907df22akschulz// } 19605a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19615a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Check if presence is updated 19625a60e47497f21f64e6d79420dc4c56c1907df22akschulz int presenceState = c.getInt(cInfo.mContactColPresenceState); 19635a60e47497f21f64e6d79420dc4c56c1907df22akschulz String presenceStatus = c.getString( 19645a60e47497f21f64e6d79420dc4c56c1907df22akschulz cInfo.mContactColPresenceText); 19655a60e47497f21f64e6d79420dc4c56c1907df22akschulz String currentPresenceStatus = contact 19665a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getPresenceStatus(); 19675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (contact.getPresenceAvailability() != presenceState 19685a60e47497f21f64e6d79420dc4c56c1907df22akschulz || currentPresenceStatus != presenceStatus) { 19695a60e47497f21f64e6d79420dc4c56c1907df22akschulz long lastOnline = c 19705a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getLong(cInfo.mContactColLastOnline); 19715a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact.setPresenceAvailability(presenceState); 19725a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact.setLastActivity(lastOnline); 19735a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (currentPresenceStatus != null 19745a60e47497f21f64e6d79420dc4c56c1907df22akschulz && !currentPresenceStatus 19755a60e47497f21f64e6d79420dc4c56c1907df22akschulz .equals(presenceStatus)) { 19765a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact.setPresenceStatus(presenceStatus); 19775a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19785a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event( 19795a60e47497f21f64e6d79420dc4c56c1907df22akschulz EVENT_TYPE_PRESENCE, 19805a60e47497f21f64e6d79420dc4c56c1907df22akschulz uci, 19815a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount.getType(), 19825a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact.getName(), 19835a60e47497f21f64e6d79420dc4c56c1907df22akschulz String.valueOf(contact 19845a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getPriority()), 19855a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils 19865a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getDateTimeString(lastOnline), 19875a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoId, convoName, 19885a60e47497f21f64e6d79420dc4c56c1907df22akschulz presenceState, presenceStatus, 19895a60e47497f21f64e6d79420dc4c56c1907df22akschulz 0); 19905a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 19915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 19925a60e47497f21f64e6d79420dc4c56c1907df22akschulz 19935a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Check if chat state is updated 19945a60e47497f21f64e6d79420dc4c56c1907df22akschulz int chatState = c.getInt(cInfo.mContactColChatState); 19955a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (contact.getChatState() != chatState) { 19965a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Get DB timestamp 19975a60e47497f21f64e6d79420dc4c56c1907df22akschulz long lastActivity = c.getLong(cInfo.mContactColLastActive); 19985a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact.setLastActivity(lastActivity); 19995a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact.setChatState(chatState); 20005a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event( 20015a60e47497f21f64e6d79420dc4c56c1907df22akschulz EVENT_TYPE_CHAT_STATE, 20025a60e47497f21f64e6d79420dc4c56c1907df22akschulz uci, 20035a60e47497f21f64e6d79420dc4c56c1907df22akschulz mAccount.getType(), 20045a60e47497f21f64e6d79420dc4c56c1907df22akschulz contact.getName(), 20055a60e47497f21f64e6d79420dc4c56c1907df22akschulz String.valueOf(contact 20065a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getPriority()), 20075a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapUtils 20085a60e47497f21f64e6d79420dc4c56c1907df22akschulz .getDateTimeString(lastActivity), 20095a60e47497f21f64e6d79420dc4c56c1907df22akschulz convoId, convoName, 0, null, 20105a60e47497f21f64e6d79420dc4c56c1907df22akschulz chatState); 20115a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendEvent(evt); 20125a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20135a60e47497f21f64e6d79420dc4c56c1907df22akschulz contactList.put(uci, contact); 20145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 20165a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20175a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(getContactList().size() > 0) { 20185a60e47497f21f64e6d79420dc4c56c1907df22akschulz // one or more contacts were deleted, hence the conversation listing 20195a60e47497f21f64e6d79420dc4c56c1907df22akschulz // version counter should change. 20205a60e47497f21f64e6d79420dc4c56c1907df22akschulz listChanged = true; 20215a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20225a60e47497f21f64e6d79420dc4c56c1907df22akschulz setContactList(contactList, listChanged); 20235a60e47497f21f64e6d79420dc4c56c1907df22akschulz } // end synchronized 20245a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 20255a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 20265a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20275a60e47497f21f64e6d79420dc4c56c1907df22akschulz } catch (RemoteException e) { 20285a60e47497f21f64e6d79420dc4c56c1907df22akschulz mMasInstance.restartObexServerSession(); 20295a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG, 20305a60e47497f21f64e6d79420dc4c56c1907df22akschulz "Problems contacting the ContentProvider in mas Instance " 20315a60e47497f21f64e6d79420dc4c56c1907df22akschulz + mMasId + " restaring ObexServerSession"); 20325a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20335a60e47497f21f64e6d79420dc4c56c1907df22akschulz 20345a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20355a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: conversation contact updates if IM and SMS(MMS in one instance 20365a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 20375a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2038326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private boolean setEmailMessageStatusDelete(BluetoothMapFolderElement mCurrentFolder, 2039326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriStr, long handle, int status) { 2040326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean res = false; 2041326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uri = Uri.parse(uriStr + BluetoothMapContract.TABLE_MESSAGE); 2042326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2043326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int updateCount = 0; 2044326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ContentValues contentValues = new ContentValues(); 2045326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement deleteFolder = mFolders. 20465a60e47497f21f64e6d79420dc4c56c1907df22akschulz getFolderByName(BluetoothMapContract.FOLDER_NAME_DELETED); 2047326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(BluetoothMapContract.MessageColumns._ID, handle); 20485a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMsg()) { 20495a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListMsg().get(handle); 2050326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (status == BluetoothMapAppParams.STATUS_VALUE_YES) { 2051326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Set deleted folder id */ 2052326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long folderId = -1; 2053326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(deleteFolder != null) { 20545a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = deleteFolder.getFolderId(); 2055326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2056326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(BluetoothMapContract.MessageColumns.FOLDER_ID,folderId); 2057326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde updateCount = mResolver.update(uri, contentValues, null, null); 2058326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* The race between updating the value in our cached values and the database 2059326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * is handled by the synchronized statement. */ 2060326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(updateCount > 0) { 2061326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde res = true; 2062326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msg != null) { 2063326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msg.oldFolderId = msg.folderId; 20645a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Update the folder ID to avoid triggering an event for MCE 20655a60e47497f21f64e6d79420dc4c56c1907df22akschulz * initiated actions. */ 2066326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msg.folderId = folderId; 2067326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2068326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(D) Log.d(TAG, "Deleted MSG: " + handle + " from folderId: " + folderId); 2069326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2070326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, "Msg: " + handle + " - Set delete status " + status 2071326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + " failed for folderId " + folderId); 2072326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2073326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (status == BluetoothMapAppParams.STATUS_VALUE_NO) { 2074326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Undelete message. move to old folder if we know it, 2075326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * else move to inbox - as dictated by the spec. */ 2076326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msg != null && deleteFolder != null && 20775a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.folderId == deleteFolder.getFolderId()) { 2078326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Only modify messages in the 'Deleted' folder */ 2079326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long folderId = -1; 20805a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapFolderElement inboxFolder = mCurrentFolder. 20815a60e47497f21f64e6d79420dc4c56c1907df22akschulz getFolderByName(BluetoothMapContract.FOLDER_NAME_INBOX); 2082326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msg != null && msg.oldFolderId != -1) { 2083326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde folderId = msg.oldFolderId; 2084326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2085326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(inboxFolder != null) { 20865a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = inboxFolder.getFolderId(); 2087326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 20885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG,"We did not delete the message, hence the old folder " + 20895a60e47497f21f64e6d79420dc4c56c1907df22akschulz "is unknown. Moving to inbox."); 2090326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2091326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(BluetoothMapContract.MessageColumns.FOLDER_ID, folderId); 2092326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde updateCount = mResolver.update(uri, contentValues, null, null); 2093326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(updateCount > 0) { 2094326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde res = true; 20955a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Update the folder ID to avoid triggering an event for MCE 20965a60e47497f21f64e6d79420dc4c56c1907df22akschulz * initiated actions. */ 20975a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* UPDATE: Actually the BT-Spec. states that an undelete is a move of the 20985a60e47497f21f64e6d79420dc4c56c1907df22akschulz * message to INBOX - clearified in errata 5591. 20995a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Therefore we update the cache to INBOX-folderId - to trigger a message 21005a60e47497f21f64e6d79420dc4c56c1907df22akschulz * shift event to the old-folder. */ 21015a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(inboxFolder != null) { 21025a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.folderId = inboxFolder.getFolderId(); 21035a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 21045a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.folderId = folderId; 21055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2106326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 21075a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D)Log.d(TAG,"We did not delete the message, hence the old folder " + 21085a60e47497f21f64e6d79420dc4c56c1907df22akschulz "is unknown. Moving to inbox."); 2109326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2110326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2111326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2112326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) { 2113326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement folderElement; 2114326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String folderName = "unknown"; 2115326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msg != null) { 21165a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderElement = mCurrentFolder.getFolderById(msg.folderId); 2117326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(folderElement != null) { 2118326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde folderName = folderElement.getName(); 2119326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2120326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2121326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG,"setEmailMessageStatusDelete: " + handle + " from " + folderName 2122326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde + " status: " + status); 2123326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2124326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2125326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(res == false) { 2126326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, "Set delete status " + status + " failed."); 2127326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2128326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return res; 2129326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2130326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2131326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void updateThreadId(Uri uri, String valueString, long threadId) { 2132326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ContentValues contentValues = new ContentValues(); 2133326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(valueString, threadId); 2134326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mResolver.update(uri, contentValues, null, null); 2135fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2136fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2137fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean deleteMessageMms(long handle) { 2138fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res = false; 2139fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, handle); 2140fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(uri, null, null, null, null); 214128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 214228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 214328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Move to deleted folder, or delete if already in deleted folder */ 214428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 214528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (threadId != DELETED_THREAD_ID) { 214628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Set deleted thread id */ 21475a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMms()) { 21485a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListMms().get(handle); 214928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(msg != null) { // This will always be the case 215028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz msg.threadId = DELETED_THREAD_ID; 215128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 2152326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 215328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz updateThreadId(uri, Mms.THREAD_ID, DELETED_THREAD_ID); 215428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else { 215528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Delete from observer message list to avoid delete notifications */ 21565a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMms()) { 21575a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListMms().remove(handle); 215828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 215928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Delete message */ 216028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz mResolver.delete(uri, null, null); 2161326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 216228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz res = true; 2163fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 216428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 21655a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 2166fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 216728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 2168fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 2169fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2170fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2171fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean unDeleteMessageMms(long handle) { 2172fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res = false; 2173fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, handle); 2174fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(uri, null, null, null, null); 217528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 217628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 217728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 217828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (threadId == DELETED_THREAD_ID) { 217928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Restore thread id from address, or if no thread for address 21805a60e47497f21f64e6d79420dc4c56c1907df22akschulz * create new thread by insert and remove of fake message */ 218128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String address; 218228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz long id = c.getLong(c.getColumnIndex(Mms._ID)); 218328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int msgBox = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); 218428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (msgBox == Mms.MESSAGE_BOX_INBOX) { 218528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz address = BluetoothMapContent.getAddressMms(mResolver, id, 21865a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContent.MMS_FROM); 218728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else { 218828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz address = BluetoothMapContent.getAddressMms(mResolver, id, 21895a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContent.MMS_TO); 219028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 219128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Set<String> recipients = new HashSet<String>(); 219228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz recipients.addAll(Arrays.asList(address)); 219328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Long oldThreadId = Telephony.Threads.getOrCreateThreadId(mContext, recipients); 21945a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMms()) { 21955a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListMms().get(handle); 219628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(msg != null) { // This will always be the case 219728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz msg.threadId = oldThreadId.intValue(); 21985a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Spec. states that undelete shall shift the message to Inbox. 21995a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Hence we need to trigger a message shift from INBOX to old-folder 22005a60e47497f21f64e6d79420dc4c56c1907df22akschulz // after undelete. 22015a60e47497f21f64e6d79420dc4c56c1907df22akschulz // We do this by changing the cached folder value to being inbox - hence 22025a60e47497f21f64e6d79420dc4c56c1907df22akschulz // the event handler will se the update as the message have been shifted 22035a60e47497f21f64e6d79420dc4c56c1907df22akschulz // from INBOX to old-folder. (Errata 5591 clearifies this) 22045a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.type = Mms.MESSAGE_BOX_INBOX; 220528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 2206326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 220728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz updateThreadId(uri, Mms.THREAD_ID, oldThreadId); 220828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else { 220928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Log.d(TAG, "Message not in deleted folder: handle " + handle 22105a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " threadId " + threadId); 2211326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 221228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz res = true; 2213fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 221428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 22155a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 2216fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2217fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 2218fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2219fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2220fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean deleteMessageSms(long handle) { 2221fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res = false; 2222fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri = ContentUris.withAppendedId(Sms.CONTENT_URI, handle); 2223fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(uri, null, null, null, null); 222428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 222528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 222628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Move to deleted folder, or delete if already in deleted folder */ 222728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 222828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (threadId != DELETED_THREAD_ID) { 22295a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListSms()) { 22305a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListSms().get(handle); 223128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if(msg != null) { // This will always be the case 223228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz msg.threadId = DELETED_THREAD_ID; 223328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 2234326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 223528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Set deleted thread id */ 223628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz updateThreadId(uri, Sms.THREAD_ID, DELETED_THREAD_ID); 223728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else { 223828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Delete from observer message list to avoid delete notifications */ 22395a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListSms()) { 22405a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListSms().remove(handle); 224128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 224228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* Delete message */ 224328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz mResolver.delete(uri, null, null); 2244326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 224528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz res = true; 2246fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 224728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 22485a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 2249fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2250fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 2251fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2252fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2253fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private boolean unDeleteMessageSms(long handle) { 2254fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res = false; 2255fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri = ContentUris.withAppendedId(Sms.CONTENT_URI, handle); 2256fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor c = mResolver.query(uri, null, null, null, null); 225728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 225828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 225928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 226028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (threadId == DELETED_THREAD_ID) { 226128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz String address = c.getString(c.getColumnIndex(Sms.ADDRESS)); 226228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Set<String> recipients = new HashSet<String>(); 226328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz recipients.addAll(Arrays.asList(address)); 226428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Long oldThreadId = Telephony.Threads.getOrCreateThreadId(mContext, recipients); 22655a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListSms()) { 22665a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListSms().get(handle); 22675a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msg != null) { 22685a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.threadId = oldThreadId.intValue(); 22695a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* This will always be the case 22705a60e47497f21f64e6d79420dc4c56c1907df22akschulz * The threadId is specified as an int, so it is safe to truncate 22715a60e47497f21f64e6d79420dc4c56c1907df22akschulz * TODO: Test that this will trigger a message-shift from Inbox 22725a60e47497f21f64e6d79420dc4c56c1907df22akschulz * to old-folder 22735a60e47497f21f64e6d79420dc4c56c1907df22akschulz **/ 22745a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Spec. states that undelete shall shift the message to Inbox. 22755a60e47497f21f64e6d79420dc4c56c1907df22akschulz * Hence we need to trigger a message shift from INBOX to old-folder 22765a60e47497f21f64e6d79420dc4c56c1907df22akschulz * after undelete. 22775a60e47497f21f64e6d79420dc4c56c1907df22akschulz * We do this by changing the cached folder value to being inbox - hence 22785a60e47497f21f64e6d79420dc4c56c1907df22akschulz * the event handler will se the update as the message have been shifted 22795a60e47497f21f64e6d79420dc4c56c1907df22akschulz * from INBOX to old-folder. (Errata 5591 clearifies this) 22805a60e47497f21f64e6d79420dc4c56c1907df22akschulz * */ 22815a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.type = Sms.MESSAGE_TYPE_INBOX; 228228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 2283326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 228428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz updateThreadId(uri, Sms.THREAD_ID, oldThreadId); 228528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else { 228628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz Log.d(TAG, "Message not in deleted folder: handle " + handle 22875a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " threadId " + threadId); 2288326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 228928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz res = true; 2290fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 229128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 22925a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 2293fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2294fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 2295fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2296fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 22975a60e47497f21f64e6d79420dc4c56c1907df22akschulz /** 22985a60e47497f21f64e6d79420dc4c56c1907df22akschulz * 22995a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param handle 23005a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param type 23015a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param mCurrentFolder 23025a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param uriStr 23035a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @param statusValue 23045a60e47497f21f64e6d79420dc4c56c1907df22akschulz * @return true is success 23055a60e47497f21f64e6d79420dc4c56c1907df22akschulz */ 2306326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public boolean setMessageStatusDeleted(long handle, TYPE type, 2307326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapFolderElement mCurrentFolder, String uriStr, int statusValue) { 2308fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean res = false; 2309fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (D) Log.d(TAG, "setMessageStatusDeleted: handle " + handle 23105a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " type " + type + " value " + statusValue); 2311fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2312326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (type == TYPE.EMAIL) { 2313326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde res = setEmailMessageStatusDelete(mCurrentFolder, uriStr, handle, statusValue); 23145a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (type == TYPE.IM) { 23155a60e47497f21f64e6d79420dc4c56c1907df22akschulz // TODO: to do when deleting IM message 23165a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "setMessageStatusDeleted: IM not handled" ); 2317326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2318326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (statusValue == BluetoothMapAppParams.STATUS_VALUE_YES) { 2319326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (type == TYPE.SMS_GSM || type == TYPE.SMS_CDMA) { 2320326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde res = deleteMessageSms(handle); 2321326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (type == TYPE.MMS) { 2322326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde res = deleteMessageMms(handle); 2323326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2324326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (statusValue == BluetoothMapAppParams.STATUS_VALUE_NO) { 2325326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (type == TYPE.SMS_GSM || type == TYPE.SMS_CDMA) { 2326326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde res = unDeleteMessageSms(handle); 2327326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (type == TYPE.MMS) { 2328326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde res = unDeleteMessageMms(handle); 2329326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2330fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2331fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2332fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return res; 2333fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2334fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2335326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /** 2336326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * 2337326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param handle 2338326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param type 2339326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param uriStr 2340326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @param statusValue 2341326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * @return true at success 2342326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 23435a60e47497f21f64e6d79420dc4c56c1907df22akschulz public boolean setMessageStatusRead(long handle, TYPE type, String uriStr, int statusValue) 23445a60e47497f21f64e6d79420dc4c56c1907df22akschulz throws RemoteException{ 2345326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int count = 0; 2346fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2347fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (D) Log.d(TAG, "setMessageStatusRead: handle " + handle 23485a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " type " + type + " value " + statusValue); 2349fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 23505a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Approved MAP spec errata 3445 states that read status initiated 23515a60e47497f21f64e6d79420dc4c56c1907df22akschulz * by the MCE shall change the MSE read status. */ 2352fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (type == TYPE.SMS_GSM || type == TYPE.SMS_CDMA) { 2353cdf75c3f2b9e0e367ea2a4ce92018a6de662f4cdAjay Panicker Uri uri = ContentUris.withAppendedId(Sms.CONTENT_URI, handle); 2354fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ContentValues contentValues = new ContentValues(); 2355fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie contentValues.put(Sms.READ, statusValue); 2356326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(Sms.SEEN, statusValue); 2357326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String values = contentValues.toString(); 2358cdf75c3f2b9e0e367ea2a4ce92018a6de662f4cdAjay Panicker if (D) Log.d(TAG, " -> SMS Uri: " + uri.toString() + " values " + values); 23595a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListSms()) { 23605a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListSms().get(handle); 23615a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msg != null) { // This will always be the case 23625a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.flagRead = statusValue; 23635a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23645a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2365cdf75c3f2b9e0e367ea2a4ce92018a6de662f4cdAjay Panicker count = mResolver.update(uri, contentValues, null, null); 2366326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, " -> "+count +" rows updated!"); 236728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 2368fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else if (type == TYPE.MMS) { 2369fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, handle); 2370326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, " -> MMS Uri: " + uri.toString()); 2371fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ContentValues contentValues = new ContentValues(); 2372fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie contentValues.put(Mms.READ, statusValue); 23735a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMms()) { 23745a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListMms().get(handle); 23755a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msg != null) { // This will always be the case 23765a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.flagRead = statusValue; 23775a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23785a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2379326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde count = mResolver.update(uri, contentValues, null, null); 2380326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, " -> "+count +" rows updated!"); 23815a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (type == TYPE.EMAIL || 23825a60e47497f21f64e6d79420dc4c56c1907df22akschulz type == TYPE.IM) { 2383326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uri = mMessageUri; 2384326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ContentValues contentValues = new ContentValues(); 2385326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(BluetoothMapContract.MessageColumns.FLAG_READ, statusValue); 2386326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(BluetoothMapContract.MessageColumns._ID, handle); 23875a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMsg()) { 23885a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg msg = getMsgListMsg().get(handle); 23895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(msg != null) { // This will always be the case 23905a60e47497f21f64e6d79420dc4c56c1907df22akschulz msg.flagRead = statusValue; 23915a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 23925a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 2393326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde count = mProviderClient.update(uri, contentValues, null, null); 2394326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 239528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz 239628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz return (count > 0); 2397fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2398fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2399fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private class PushMsgInfo { 2400fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long id; 2401fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int transparent; 2402fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int retry; 2403fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String phone; 2404fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri uri; 2405326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long timestamp; 2406fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int parts; 2407fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int partsSent; 2408fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int partsDelivered; 2409fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie boolean resend; 2410326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean sendInProgress; 2411326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean failedSent; // Set to true if a single part sent fail is received. 2412326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int statusDelivered; // Set to != 0 if a single part deliver fail is received. 2413fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2414fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public PushMsgInfo(long id, int transparent, 24155a60e47497f21f64e6d79420dc4c56c1907df22akschulz int retry, String phone, Uri uri) { 2416fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.id = id; 2417fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.transparent = transparent; 2418fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.retry = retry; 2419fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.phone = phone; 2420fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.uri = uri; 2421fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie this.resend = false; 2422326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.sendInProgress = false; 2423326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.failedSent = false; 2424326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.statusDelivered = 0; /* Assume success */ 2425326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde this.timestamp = 0; 2426fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 2427fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2428fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2429fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private Map<Long, PushMsgInfo> mPushMsgList = 24305a60e47497f21f64e6d79420dc4c56c1907df22akschulz Collections.synchronizedMap(new HashMap<Long, PushMsgInfo>()); 2431fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2432326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public long pushMessage(BluetoothMapbMessage msg, BluetoothMapFolderElement folderElement, 2433326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde BluetoothMapAppParams ap, String emailBaseUri) 2434326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throws IllegalArgumentException, RemoteException, IOException { 2435fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (D) Log.d(TAG, "pushMessage"); 2436fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ArrayList<BluetoothMapbMessage.vCard> recipientList = msg.getRecipients(); 2437fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int transparent = (ap.getTransparent() == BluetoothMapAppParams.INVALID_VALUE_PARAMETER) ? 2438fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 0 : ap.getTransparent(); 2439fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int retry = ap.getRetry(); 2440fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int charset = ap.getCharset(); 2441fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long handle = -1; 2442326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long folderId = -1; 2443fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2444fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (recipientList == null) { 2445c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker if (folderElement.getName().equalsIgnoreCase(BluetoothMapContract.FOLDER_NAME_DRAFT)) { 2446c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker BluetoothMapbMessage.vCard empty = 2447c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker new BluetoothMapbMessage.vCard("", "", null, null, 0); 2448c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker recipientList = new ArrayList<BluetoothMapbMessage.vCard>(); 2449c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker recipientList.add(empty); 2450c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker Log.w(TAG, "Added empty recipient to draft message"); 2451c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker } else { 2452c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker Log.e(TAG, "Trying to send a message with no recipients"); 2453c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker return -1; 2454c06dad4b6c213f57da06fe74903a25733ef6579fAjay Panicker } 2455fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2456fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2457326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if ( msg.getType().equals(TYPE.EMAIL) ) { 2458326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Write the message to the database */ 2459326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String msgBody = ((BluetoothMapbMessageEmail) msg).getEmailBody(); 2460326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) { 2461326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int length = msgBody.length(); 2462326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.v(TAG, "pushMessage: message string length = " + length); 2463326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String messages[] = msgBody.split("\r\n"); 2464326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.v(TAG, "pushMessage: messages count=" + messages.length); 2465326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde for(int i = 0; i < messages.length; i++) { 2466326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.v(TAG, "part " + i + ":" + messages[i]); 2467326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2468326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2469326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde FileOutputStream os = null; 2470326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ParcelFileDescriptor fdOut = null; 2471326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uriInsert = Uri.parse(emailBaseUri + BluetoothMapContract.TABLE_MESSAGE); 2472326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "pushMessage - uriInsert= " + uriInsert.toString() + 24735a60e47497f21f64e6d79420dc4c56c1907df22akschulz ", intoFolder id=" + folderElement.getFolderId()); 2474326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 24755a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListMsg()) { 2476326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Now insert the empty message into folder 2477326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ContentValues values = new ContentValues(); 24785a60e47497f21f64e6d79420dc4c56c1907df22akschulz folderId = folderElement.getFolderId(); 2479326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(BluetoothMapContract.MessageColumns.FOLDER_ID, folderId); 2480326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uriNew = mProviderClient.insert(uriInsert, values); 2481326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "pushMessage - uriNew= " + uriNew.toString()); 2482326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = Long.parseLong(uriNew.getLastPathSegment()); 2483326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2484326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde try { 2485326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde fdOut = mProviderClient.openFile(uriNew, "w"); 2486326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde os = new FileOutputStream(fdOut.getFileDescriptor()); 2487326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Write Email to DB 2488326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde os.write(msgBody.getBytes(), 0, msgBody.getBytes().length); 2489326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (FileNotFoundException e) { 2490326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 2491326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw(new IOException("Unable to open file stream")); 2492326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (NullPointerException e) { 2493326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, e); 2494326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde throw(new IllegalArgumentException("Unable to parse message.")); 2495326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } finally { 2496326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde try { 2497326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(os != null) 2498326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde os.close(); 2499326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (IOException e) {Log.w(TAG, e);} 2500326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde try { 2501326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(fdOut != null) 25025a60e47497f21f64e6d79420dc4c56c1907df22akschulz fdOut.close(); 2503326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (IOException e) {Log.w(TAG, e);} 2504326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2505326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2506326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Extract the data for the inserted message, and store in local mirror, to 2507326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * avoid sending a NewMessage Event. */ 25085a60e47497f21f64e6d79420dc4c56c1907df22akschulz /*TODO: We need to add the new 1.1 parameter as well:-) e.g. read*/ 25095a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg newMsg = new Msg(handle, folderId, 1); // TODO: Create define for read-state 2510326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde newMsg.transparent = (transparent == 1) ? true : false; 25115a60e47497f21f64e6d79420dc4c56c1907df22akschulz if ( folderId == folderElement.getFolderByName( 25125a60e47497f21f64e6d79420dc4c56c1907df22akschulz BluetoothMapContract.FOLDER_NAME_OUTBOX).getFolderId() ) { 2513326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde newMsg.localInitiatedSend = true; 2514326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 25155a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListMsg().put(handle, newMsg); 2516326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2517326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { // type SMS_* of MMS 2518326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde for (BluetoothMapbMessage.vCard recipient : recipientList) { 25195a60e47497f21f64e6d79420dc4c56c1907df22akschulz // Only send the message to the top level recipient 25205a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(recipient.getEnvLevel() == 0) 2521326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde { 2522326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Only send to first address */ 2523326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String phone = recipient.getFirstPhoneNumber(); 2524326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String email = recipient.getFirstEmail(); 2525326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String folder = folderElement.getName(); 2526326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean read = false; 2527326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean deliveryReport = true; 2528326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String msgBody = null; 2529326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2530326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* If MMS contains text only and the size is less than ten SMS's 2531326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * then convert the MMS to type SMS and then proceed 2532326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde */ 2533326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msg.getType().equals(TYPE.MMS) && 25345a60e47497f21f64e6d79420dc4c56c1907df22akschulz (((BluetoothMapbMessageMime) msg).getTextOnly() == true)) { 25355a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgBody = ((BluetoothMapbMessageMime) msg).getMessageAsText(); 2536326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SmsManager smsMng = SmsManager.getDefault(); 2537326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ArrayList<String> parts = smsMng.divideMessage(msgBody); 2538326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int smsParts = parts.size(); 2539326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (smsParts <= CONVERT_MMS_TO_SMS_PART_COUNT ) { 25405a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "pushMessage - converting MMS to SMS, sms parts=" 25415a60e47497f21f64e6d79420dc4c56c1907df22akschulz + smsParts ); 2542326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msg.setType(mSmsType); 2543326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 25445a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "pushMessage - MMS text only but to big to " + 25455a60e47497f21f64e6d79420dc4c56c1907df22akschulz "convert to SMS"); 2546326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgBody = null; 2547326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2548326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2549fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2550326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2551326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msg.getType().equals(TYPE.MMS)) { 2552326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Send message if folder is outbox else just store in draft*/ 2553ed70219e41ba68196798dcbf75b782d13fb88603kschulz handle = sendMmsMessage(folder, phone, (BluetoothMapbMessageMime)msg, 2554ed70219e41ba68196798dcbf75b782d13fb88603kschulz transparent, retry); 2555326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else if (msg.getType().equals(TYPE.SMS_GSM) || 2556326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msg.getType().equals(TYPE.SMS_CDMA) ) { 2557fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Add the message to the database */ 2558326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msgBody == null) 2559326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgBody = ((BluetoothMapbMessageSms) msg).getSmsBody(); 2560326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2561cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (TextUtils.isEmpty(msgBody)) { 2562cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Log.d(TAG, "PushMsg: Empty msgBody "); 2563cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta /* not allowed to push empty message */ 2564cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta throw new IllegalArgumentException("push EMPTY message: Invalid Body"); 2565cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 25665a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* We need to lock the SMS list while updating the database, 25675a60e47497f21f64e6d79420dc4c56c1907df22akschulz * to avoid sending events on MCE initiated operation. */ 2568326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri contentUri = Uri.parse(Sms.CONTENT_URI+ "/" + folder); 2569326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uri; 25705a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized(getMsgListSms()) { 2571326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = Sms.addMessageToUri(mResolver, contentUri, phone, msgBody, 25725a60e47497f21f64e6d79420dc4c56c1907df22akschulz "", System.currentTimeMillis(), read, deliveryReport); 2573326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2574326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.v(TAG, "Sms.addMessageToUri() returned: " + uri); 2575326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (uri == null) { 25765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (D) Log.d(TAG, "pushMessage - failure on add to uri " 25775a60e47497f21f64e6d79420dc4c56c1907df22akschulz + contentUri); 2578326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return -1; 2579326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2580326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(uri, SMS_PROJECTION_SHORT, null, null, null); 25815a60e47497f21f64e6d79420dc4c56c1907df22akschulz 25825a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Extract the data for the inserted message, and store in local mirror, 25835a60e47497f21f64e6d79420dc4c56c1907df22akschulz * to avoid sending a NewMessage Event. */ 258428446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 258528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 258628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz long id = c.getLong(c.getColumnIndex(Sms._ID)); 258728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int type = c.getInt(c.getColumnIndex(Sms.TYPE)); 258828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int threadId = c.getInt(c.getColumnIndex(Sms.THREAD_ID)); 25895a60e47497f21f64e6d79420dc4c56c1907df22akschulz int readFlag = c.getInt(c.getColumnIndex(Sms.READ)); 25905a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG, "add message with id=" + id + 25915a60e47497f21f64e6d79420dc4c56c1907df22akschulz " type=" + type + " threadId=" + threadId + 25925a60e47497f21f64e6d79420dc4c56c1907df22akschulz " readFlag=" + readFlag + "to mMsgListSms"); 25935a60e47497f21f64e6d79420dc4c56c1907df22akschulz Msg newMsg = new Msg(id, type, threadId, readFlag); 25945a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListSms().put(id, newMsg); 25955a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.close(); 259628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } else { 25975a60e47497f21f64e6d79420dc4c56c1907df22akschulz Log.w(TAG,"Message: " + uri + " no longer exist!"); 25985a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* This can only happen, if the message is deleted 25995a60e47497f21f64e6d79420dc4c56c1907df22akschulz * just as it is added */ 26005a60e47497f21f64e6d79420dc4c56c1907df22akschulz return -1; 260128446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 260228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 26035a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 2604326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2605fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2606326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde handle = Long.parseLong(uri.getLastPathSegment()); 2607fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2608326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Send message if folder is outbox */ 26095a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (folder.equalsIgnoreCase(BluetoothMapContract.FOLDER_NAME_OUTBOX)) { 2610326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde PushMsgInfo msgInfo = new PushMsgInfo(handle, transparent, 26115a60e47497f21f64e6d79420dc4c56c1907df22akschulz retry, phone, uri); 2612326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mPushMsgList.put(handle, msgInfo); 2613326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde sendMessage(msgInfo, msgBody); 2614326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.v(TAG, "sendMessage returned..."); 26155a60e47497f21f64e6d79420dc4c56c1907df22akschulz } /* else just added to draft */ 26165a60e47497f21f64e6d79420dc4c56c1907df22akschulz 26175a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* sendMessage causes the message to be deleted and reinserted, 26185a60e47497f21f64e6d79420dc4c56c1907df22akschulz * hence we need to lock the list while this is happening. */ 2619fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2620326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2621326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (D) Log.d(TAG, "pushMessage - failure on type " ); 2622326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return -1; 2623fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2624fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2625fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2626fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2627fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2628fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* If multiple recipients return handle of last */ 2629fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return handle; 2630fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2631fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2632ed70219e41ba68196798dcbf75b782d13fb88603kschulz public long sendMmsMessage(String folder, String to_address, BluetoothMapbMessageMime msg, 2633ed70219e41ba68196798dcbf75b782d13fb88603kschulz int transparent, int retry) { 2634fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* 2635fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *strategy: 2636fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *1) parse message into parts 2637fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *if folder is outbox/drafts: 2638fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *2) push message to draft 2639fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *if folder is outbox: 2640fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *3) move message to outbox (to trigger the mms app to add msg to pending_messages list) 2641fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *4) send intent to mms app in order to wake it up. 2642fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *else if folder !outbox: 2643fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie *1) push message to folder 2644fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * */ 2645326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (folder != null && (folder.equalsIgnoreCase(BluetoothMapContract.FOLDER_NAME_OUTBOX) 2646326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde || folder.equalsIgnoreCase(BluetoothMapContract.FOLDER_NAME_DRAFT))) { 2647326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long handle = pushMmsToFolder(Mms.MESSAGE_BOX_DRAFTS, to_address, msg); 26485a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* if invalid handle (-1) then just return the handle 26495a60e47497f21f64e6d79420dc4c56c1907df22akschulz * - else continue sending (if folder is outbox) */ 26505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (BluetoothMapAppParams.INVALID_VALUE_PARAMETER != handle && 26515a60e47497f21f64e6d79420dc4c56c1907df22akschulz folder.equalsIgnoreCase(BluetoothMapContract.FOLDER_NAME_OUTBOX)) { 2652ed70219e41ba68196798dcbf75b782d13fb88603kschulz Uri btMmsUri = MmsFileProvider.CONTENT_URI.buildUpon() 2653ed70219e41ba68196798dcbf75b782d13fb88603kschulz .appendPath(Long.toString(handle)).build(); 2654ed70219e41ba68196798dcbf75b782d13fb88603kschulz Intent sentIntent = new Intent(ACTION_MESSAGE_SENT); 2655ed70219e41ba68196798dcbf75b782d13fb88603kschulz // TODO: update the mmsMsgList <- done in pushMmsToFolder() but check 2656ed70219e41ba68196798dcbf75b782d13fb88603kschulz sentIntent.setType("message/" + Long.toString(handle)); 2657ed70219e41ba68196798dcbf75b782d13fb88603kschulz sentIntent.putExtra(EXTRA_MESSAGE_SENT_MSG_TYPE, TYPE.MMS.ordinal()); 2658ed70219e41ba68196798dcbf75b782d13fb88603kschulz sentIntent.putExtra(EXTRA_MESSAGE_SENT_HANDLE, handle); // needed for notification 2659ed70219e41ba68196798dcbf75b782d13fb88603kschulz sentIntent.putExtra(EXTRA_MESSAGE_SENT_TRANSPARENT, transparent); 2660ed70219e41ba68196798dcbf75b782d13fb88603kschulz sentIntent.putExtra(EXTRA_MESSAGE_SENT_RETRY, retry); 2661ed70219e41ba68196798dcbf75b782d13fb88603kschulz //sentIntent.setDataAndNormalize(btMmsUri); 2662ed70219e41ba68196798dcbf75b782d13fb88603kschulz PendingIntent pendingSendIntent = PendingIntent.getBroadcast(mContext, 0, 2663ed70219e41ba68196798dcbf75b782d13fb88603kschulz sentIntent, 0); 2664ed70219e41ba68196798dcbf75b782d13fb88603kschulz SmsManager.getDefault().sendMultimediaMessage(mContext, 2665ed70219e41ba68196798dcbf75b782d13fb88603kschulz btMmsUri, null/*locationUrl*/, null/*configOverrides*/, 2666ed70219e41ba68196798dcbf75b782d13fb88603kschulz pendingSendIntent); 2667326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2668326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return handle; 2669326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2670326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* not allowed to push mms to anything but outbox/draft */ 26715a60e47497f21f64e6d79420dc4c56c1907df22akschulz throw new IllegalArgumentException("Cannot push message to other " + 26725a60e47497f21f64e6d79420dc4c56c1907df22akschulz "folders than outbox/draft"); 2673fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2674fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2675fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2676fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void moveDraftToOutbox(long handle) { 2677ed70219e41ba68196798dcbf75b782d13fb88603kschulz moveMmsToFolder(handle, mResolver, Mms.MESSAGE_BOX_OUTBOX); 2678ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 2679ed70219e41ba68196798dcbf75b782d13fb88603kschulz 2680ed70219e41ba68196798dcbf75b782d13fb88603kschulz /** 2681ed70219e41ba68196798dcbf75b782d13fb88603kschulz * Move a MMS to another folder. 2682ed70219e41ba68196798dcbf75b782d13fb88603kschulz * @param handle the CP handle of the message to move 2683ed70219e41ba68196798dcbf75b782d13fb88603kschulz * @param resolver the ContentResolver to use 2684ed70219e41ba68196798dcbf75b782d13fb88603kschulz * @param folder the destination folder - use Mms.MESSAGE_BOX_xxx 2685ed70219e41ba68196798dcbf75b782d13fb88603kschulz */ 2686ed70219e41ba68196798dcbf75b782d13fb88603kschulz private static void moveMmsToFolder(long handle, ContentResolver resolver, int folder) { 2687fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /*Move message by changing the msg_box value in the content provider database */ 26885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (handle != -1) { 26895a60e47497f21f64e6d79420dc4c56c1907df22akschulz String whereClause = " _id= " + handle; 26905a60e47497f21f64e6d79420dc4c56c1907df22akschulz Uri uri = Mms.CONTENT_URI; 2691ed70219e41ba68196798dcbf75b782d13fb88603kschulz Cursor queryResult = resolver.query(uri, null, whereClause, null, null); 26925a60e47497f21f64e6d79420dc4c56c1907df22akschulz try { 26935a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (queryResult != null) { 26945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (queryResult.getCount() > 0) { 26955a60e47497f21f64e6d79420dc4c56c1907df22akschulz queryResult.moveToFirst(); 26965a60e47497f21f64e6d79420dc4c56c1907df22akschulz ContentValues data = new ContentValues(); 26975a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* set folder to be outbox */ 2698ed70219e41ba68196798dcbf75b782d13fb88603kschulz data.put(Mms.MESSAGE_BOX, folder); 2699ed70219e41ba68196798dcbf75b782d13fb88603kschulz resolver.update(uri, data, whereClause, null); 2700ed70219e41ba68196798dcbf75b782d13fb88603kschulz if (D) Log.d(TAG, "moved MMS message to " + getMmsFolderName(folder)); 27015a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27025a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else { 2703ed70219e41ba68196798dcbf75b782d13fb88603kschulz Log.w(TAG, "Could not move MMS message to " + getMmsFolderName(folder)); 27045a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 27055a60e47497f21f64e6d79420dc4c56c1907df22akschulz } finally { 27065a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (queryResult != null) queryResult.close(); 2707fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2708fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2709fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 27105a60e47497f21f64e6d79420dc4c56c1907df22akschulz private long pushMmsToFolder(int folder, String to_address, BluetoothMapbMessageMime msg) { 2711fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /** 2712fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * strategy: 2713fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * 1) parse msg into parts + header 2714fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * 2) create thread id (abuse the ease of adding an SMS to get id for thread) 2715fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * 3) push parts into content://mms/parts/ table 2716fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie * 3) 2717fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie */ 2718fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2719fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ContentValues values = new ContentValues(); 2720326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.MESSAGE_BOX, folder); 2721326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.READ, 0); 2722326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.SEEN, 0); 2723326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msg.getSubject() != null) { 2724326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.SUBJECT, msg.getSubject()); 2725326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2726326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.SUBJECT, ""); 2727326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 272870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 2729326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msg.getSubject() != null && msg.getSubject().length() > 0) { 2730326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.SUBJECT_CHARSET, 106); 2731326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2732326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.CONTENT_TYPE, "application/vnd.wap.multipart.related"); 2733326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.EXPIRY, 604800); 2734326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.MESSAGE_CLASS, PduHeaders.MESSAGE_CLASS_PERSONAL_STR); 2735326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ); 2736326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.MMS_VERSION, PduHeaders.CURRENT_MMS_VERSION); 2737326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.PRIORITY, PduHeaders.PRIORITY_NORMAL); 2738326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.READ_REPORT, PduHeaders.VALUE_NO); 2739326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.TRANSACTION_ID, "T"+ Long.toHexString(System.currentTimeMillis())); 2740326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.DELIVERY_REPORT, PduHeaders.VALUE_NO); 2741326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.LOCKED, 0); 2742326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msg.getTextOnly() == true) 2743326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.TEXT_ONLY, true); 2744326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.MESSAGE_SIZE, msg.getSize()); 274570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz 2746326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Get thread id 2747fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Set<String> recipients = new HashSet<String>(); 2748fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie recipients.addAll(Arrays.asList(to_address)); 2749326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.THREAD_ID, Telephony.Threads.getOrCreateThreadId(mContext, recipients)); 2750326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uri = Mms.CONTENT_URI; 2751fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 27525a60e47497f21f64e6d79420dc4c56c1907df22akschulz synchronized (getMsgListMms()) { 27535a60e47497f21f64e6d79420dc4c56c1907df22akschulz 2754326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = mResolver.insert(uri, values); 2755326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2756326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (uri == null) { 2757326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // unable to insert MMS 2758326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.e(TAG, "Unabled to insert MMS " + values + "Uri: " + uri); 2759326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return -1; 2760326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2761326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* As we already have all the values we need, we could skip the query, but 2762326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde doing the query ensures we get any changes made by the content provider 2763326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde at insert. */ 2764326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Cursor c = mResolver.query(uri, MMS_PROJECTION_SHORT, null, null, null); 276528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 276628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz if (c != null && c.moveToFirst()) { 276728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz long id = c.getLong(c.getColumnIndex(Mms._ID)); 276828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int type = c.getInt(c.getColumnIndex(Mms.MESSAGE_BOX)); 276928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz int threadId = c.getInt(c.getColumnIndex(Mms.THREAD_ID)); 2770ed70219e41ba68196798dcbf75b782d13fb88603kschulz int readStatus = c.getInt(c.getColumnIndex(Mms.READ)); 2771326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 277228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz /* We must filter out any actions made by the MCE. Add the new message to 277328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz * the list of known messages. */ 2774326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2775ed70219e41ba68196798dcbf75b782d13fb88603kschulz Msg newMsg = new Msg(id, type, threadId, readStatus); 277628446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz newMsg.localInitiatedSend = true; 27775a60e47497f21f64e6d79420dc4c56c1907df22akschulz getMsgListMms().put(id, newMsg); 27785a60e47497f21f64e6d79420dc4c56c1907df22akschulz c.close(); 277928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 278028446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 27815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 2782326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2783326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } // Done adding changes, unlock access to mMsgListMms to allow sending MMS events again 2784fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2785fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie long handle = Long.parseLong(uri.getLastPathSegment()); 2786326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, " NEW URI " + uri.toString()); 2787326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2788fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 2789326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msg.getMimeParts() == null) { 27905a60e47497f21f64e6d79420dc4c56c1907df22akschulz /* Perhaps this message have been deleted, and no longer have any content, 27915a60e47497f21f64e6d79420dc4c56c1907df22akschulz * but only headers */ 2792326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, "No MMS parts present..."); 2793326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 27945a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(V) Log.v(TAG, "Adding " + msg.getMimeParts().size() 27955a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " parts to the data base."); 2796326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde for(MimePart part : msg.getMimeParts()) { 27975a60e47497f21f64e6d79420dc4c56c1907df22akschulz int count = 0; 27985a60e47497f21f64e6d79420dc4c56c1907df22akschulz count++; 2799326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.clear(); 28005a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(part.mContentType != null && 28015a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentType.toUpperCase().contains("TEXT")) { 2802326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_TYPE, "text/plain"); 2803326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CHARSET, 106); 2804326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mPartName != null) { 2805326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.FILENAME, part.mPartName); 2806326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.NAME, part.mPartName); 2807326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2808326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.FILENAME, "text_" + count +".txt"); 2809326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.NAME, "text_" + count +".txt"); 2810326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2811326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Ensure we have "ci" set 2812326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentId != null) { 2813326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, part.mContentId); 2814326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2815326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mPartName != null) { 2816326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, "<" + part.mPartName + ">"); 2817326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2818326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, "<text_" + count + ">"); 2819326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2820326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2821326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Ensure we have "cl" set 2822326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentLocation != null) { 2823326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, part.mContentLocation); 2824326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2825326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mPartName != null) { 2826326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, part.mPartName + ".txt"); 2827326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2828326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, "text_" + count + ".txt"); 2829326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2830326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2831326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2832326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentDisposition != null) { 2833326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_DISPOSITION, part.mContentDisposition); 2834326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2835326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.TEXT, part.getDataAsString()); 2836326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = Uri.parse(Mms.CONTENT_URI + "/" + handle + "/part"); 2837326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = mResolver.insert(uri, values); 2838326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(V) Log.v(TAG, "Added TEXT part"); 2839326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 28405a60e47497f21f64e6d79420dc4c56c1907df22akschulz } else if (part.mContentType != null && 28415a60e47497f21f64e6d79420dc4c56c1907df22akschulz part.mContentType.toUpperCase().contains("SMIL")){ 2842326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.SEQ, -1); 2843326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_TYPE, "application/smil"); 2844326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentId != null) { 2845326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, part.mContentId); 2846326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2847326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, "<smil_" + count + ">"); 2848326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2849326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentLocation != null) { 2850326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, part.mContentLocation); 2851326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2852326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, "smil_" + count + ".xml"); 2853326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2854326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2855326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentDisposition != null) 2856326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_DISPOSITION, part.mContentDisposition); 2857326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.FILENAME, "smil.xml"); 2858326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.NAME, "smil.xml"); 2859326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.TEXT, new String(part.mData, "UTF-8")); 2860326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2861326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = Uri.parse(Mms.CONTENT_URI+ "/" + handle + "/part"); 2862326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = mResolver.insert(uri, values); 2863326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "Added SMIL part"); 2864326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2865326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde }else /*VIDEO/AUDIO/IMAGE*/ { 2866326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde writeMmsDataPart(handle, part, count); 2867326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (V) Log.v(TAG, "Added OTHER part"); 2868326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2869326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (uri != null){ 28705a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (V) Log.v(TAG, "Added part with content-type: " + part.mContentType 28715a60e47497f21f64e6d79420dc4c56c1907df22akschulz + " to Uri: " + uri.toString()); 2872326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 287370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 2874fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2875fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (UnsupportedEncodingException e) { 287670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Log.w(TAG, e); 2877fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IOException e) { 287870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz Log.w(TAG, e); 2879fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2880fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2881fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie values.clear(); 2882326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.CONTACT_ID, "null"); 2883326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.ADDRESS, "insert-address-token"); 2884326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.TYPE, BluetoothMapContent.MMS_FROM); 2885326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.CHARSET, 106); 2886fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2887326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = Uri.parse(Mms.CONTENT_URI + "/" + handle + "/addr"); 2888326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = mResolver.insert(uri, values); 2889fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (uri != null && V){ 2890fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.v(TAG, " NEW URI " + uri.toString()); 2891fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2892fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2893fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie values.clear(); 2894326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.CONTACT_ID, "null"); 2895326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.ADDRESS, to_address); 2896326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.TYPE, BluetoothMapContent.MMS_TO); 2897326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Addr.CHARSET, 106); 2898fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2899326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = Uri.parse(Mms.CONTENT_URI + "/" + handle + "/addr"); 2900326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde uri = mResolver.insert(uri, values); 2901fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (uri != null && V){ 2902fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.v(TAG, " NEW URI " + uri.toString()); 2903fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2904fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return handle; 2905fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2906fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2907fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 290870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz private void writeMmsDataPart(long handle, MimePart part, int count) throws IOException{ 2909fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ContentValues values = new ContentValues(); 2910326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.MSG_ID, handle); 2911326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentType != null) { 2912326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_TYPE, part.mContentType); 2913326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2914326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, "MMS has no CONTENT_TYPE for part " + count); 2915326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2916326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentId != null) { 2917326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, part.mContentId); 2918326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2919326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mPartName != null) { 2920326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, "<" + part.mPartName + ">"); 2921326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2922326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_ID, "<part_" + count + ">"); 2923ed0c6ae1773ad1f4249fe3cf7447d7033195f222Ashwini Munigala } 2924ed0c6ae1773ad1f4249fe3cf7447d7033195f222Ashwini Munigala } 2925326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2926326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentLocation != null) { 2927326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, part.mContentLocation); 2928326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2929326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mPartName != null) { 2930326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, part.mPartName + ".dat"); 2931326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 2932326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_LOCATION, "part_" + count + ".dat"); 2933326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2934326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 2935326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mContentDisposition != null) 2936326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.CONTENT_DISPOSITION, part.mContentDisposition); 2937326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(part.mPartName != null) { 2938326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.FILENAME, part.mPartName); 2939326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.NAME, part.mPartName); 2940326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 294170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz /* We must set at least one part identifier */ 2942326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.FILENAME, "part_" + count + ".dat"); 2943326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde values.put(Mms.Part.NAME, "part_" + count + ".dat"); 294470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz } 2945326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri partUri = Uri.parse(Mms.CONTENT_URI + "/" + handle + "/part"); 2946fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri res = mResolver.insert(partUri, values); 2947fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2948fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie // Add data to part 2949fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie OutputStream os = mResolver.openOutputStream(res); 2950326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde os.write(part.mData); 2951fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie os.close(); 2952fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 2953fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2954fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2955fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void sendMessage(PushMsgInfo msgInfo, String msgBody) { 2956fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2957fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie SmsManager smsMng = SmsManager.getDefault(); 2958fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ArrayList<String> parts = smsMng.divideMessage(msgBody); 2959fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie msgInfo.parts = parts.size(); 2960326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // We add a time stamp to differentiate delivery reports from each other for resent messages 2961326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgInfo.timestamp = Calendar.getInstance().getTime().getTime(); 2962326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgInfo.partsDelivered = 0; 2963326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgInfo.partsSent = 0; 2964fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2965fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(msgInfo.parts); 2966fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(msgInfo.parts); 2967fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 2968326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* We handle the SENT intent in the MAP service, as this object 2969326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * is destroyed at disconnect, hence if a disconnect occur while sending 2970326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * a message, there is no intent handler to move the message from outbox 2971326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * to the correct folder. 2972326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * The correct solution would be to create a service that will start based on 2973326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde * the intent, if BT is turned off. */ 2974326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 2975cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta if (parts != null && parts.size() > 0) { 2976cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta for (int i = 0; i < msgInfo.parts; i++) { 2977cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Intent intentDelivery, intentSent; 2978cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 2979cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentDelivery = new Intent(ACTION_MESSAGE_DELIVERY, null); 2980cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta /* Add msgId and part number to ensure the intents are different, and we 2981cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * thereby get an intent for each msg part. 2982cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * setType is needed to create different intents for each message id/ time stamp, 2983cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * as the extras are not used when comparing. */ 2984cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentDelivery.setType("message/" + Long.toString(msgInfo.id) + 2985cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta msgInfo.timestamp + i); 2986cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentDelivery.putExtra(EXTRA_MESSAGE_SENT_HANDLE, msgInfo.id); 2987cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentDelivery.putExtra(EXTRA_MESSAGE_SENT_TIMESTAMP, msgInfo.timestamp); 2988cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta PendingIntent pendingIntentDelivery = PendingIntent.getBroadcast(mContext, 0, 2989cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentDelivery, PendingIntent.FLAG_UPDATE_CURRENT); 2990cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 2991cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentSent = new Intent(ACTION_MESSAGE_SENT, null); 2992cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta /* Add msgId and part number to ensure the intents are different, and we 2993cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * thereby get an intent for each msg part. 2994cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * setType is needed to create different intents for each message id/ time stamp, 2995cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta * as the extras are not used when comparing. */ 2996cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentSent.setType("message/" + Long.toString(msgInfo.id) + msgInfo.timestamp + i); 2997cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentSent.putExtra(EXTRA_MESSAGE_SENT_HANDLE, msgInfo.id); 2998cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentSent.putExtra(EXTRA_MESSAGE_SENT_URI, msgInfo.uri.toString()); 2999cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentSent.putExtra(EXTRA_MESSAGE_SENT_RETRY, msgInfo.retry); 3000cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentSent.putExtra(EXTRA_MESSAGE_SENT_TRANSPARENT, msgInfo.transparent); 3001cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 3002cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta PendingIntent pendingIntentSent = PendingIntent.getBroadcast(mContext, 0, 3003cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta intentSent, PendingIntent.FLAG_UPDATE_CURRENT); 3004cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 3005cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta // We use the same pending intent for all parts, but do not set the one shot flag. 3006cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta deliveryIntents.add(pendingIntentDelivery); 3007cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta sentIntents.add(pendingIntentSent); 3008cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 3009cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 3010cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta Log.d(TAG, "sendMessage to " + msgInfo.phone); 3011cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta 3012cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta smsMng.sendMultipartTextMessage(msgInfo.phone, null, parts, sentIntents, 3013cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta deliveryIntents); 3014cd72c4dfe4db77c6df24db94f8d9a04efff7ab1dHemant Gupta } 3015fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3016fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3017fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private class SmsBroadcastReceiver extends BroadcastReceiver { 3018fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private final String[] ID_PROJECTION = new String[] { Sms._ID }; 3019326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private final Uri UPDATE_STATUS_URI = Uri.withAppendedPath(Sms.CONTENT_URI, "/status"); 3020fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3021fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void register() { 3022400eaf8761223196a18b84247b066f0201226c3bHemant Gupta Handler handler = new Handler(Looper.getMainLooper()); 3023fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3024fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie IntentFilter intentFilter = new IntentFilter(); 3025fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie intentFilter.addAction(ACTION_MESSAGE_DELIVERY); 3026326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde try{ 3027326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde intentFilter.addDataType("message/*"); 3028326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } catch (MalformedMimeTypeException e) { 3029326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.e(TAG, "Wrong mime type!!!", e); 3030326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3031326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3032fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mContext.registerReceiver(this, intentFilter, null, handler); 3033fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3034fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3035fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void unregister() { 3036fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 3037fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mContext.unregisterReceiver(this); 3038fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } catch (IllegalArgumentException e) { 3039fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* do nothing */ 3040fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3041fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3042fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3043fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie @Override 3044fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void onReceive(Context context, Intent intent) { 3045fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String action = intent.getAction(); 3046326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long handle = intent.getLongExtra(EXTRA_MESSAGE_SENT_HANDLE, -1); 3047fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie PushMsgInfo msgInfo = mPushMsgList.get(handle); 3048fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3049fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.d(TAG, "onReceive: action" + action); 3050fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3051fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgInfo == null) { 3052fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.d(TAG, "onReceive: no msgInfo found for handle " + handle); 3053fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie return; 3054fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3055fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 30564f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (action.equals(ACTION_MESSAGE_SENT)) { 30574f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala int result = intent.getIntExtra(EXTRA_MESSAGE_SENT_RESULT, 30584f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Activity.RESULT_CANCELED); 30594f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala msgInfo.partsSent++; 30604f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if(result != Activity.RESULT_OK) { 30614f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala /* If just one of the parts in the message fails, we need to send the 30624f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala * entire message again 30634f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala */ 30644f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala msgInfo.failedSent = true; 30654f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 30664f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if(D) Log.d(TAG, "onReceive: msgInfo.partsSent = " + msgInfo.partsSent 30674f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala + ", msgInfo.parts = " + msgInfo.parts + " result = " + result); 30684f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 30694f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (msgInfo.partsSent == msgInfo.parts) { 30704f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala actionMessageSent(context, intent, msgInfo); 30714f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 30724f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } else if (action.equals(ACTION_MESSAGE_DELIVERY)) { 3073326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde long timestamp = intent.getLongExtra(EXTRA_MESSAGE_SENT_TIMESTAMP, 0); 3074326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int status = -1; 3075326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(msgInfo.timestamp == timestamp) { 3076326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgInfo.partsDelivered++; 3077326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde byte[] pdu = intent.getByteArrayExtra("pdu"); 3078326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String format = intent.getStringExtra("format"); 3079326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3080326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde SmsMessage message = SmsMessage.createFromPdu(pdu, format); 3081326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (message == null) { 3082326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG, "actionMessageDelivery: Can't get message from pdu"); 3083326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return; 3084326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3085326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde status = message.getStatus(); 3086326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(status != 0/*0 is success*/) { 3087326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgInfo.statusDelivered = status; 30885a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "msgInfo.statusDelivered = " + status); 30890ebd4e58920add6114b1f345b7d95e0709096fe3Ajay Panicker Sms.moveMessageToFolder(mContext, msgInfo.uri, Sms.MESSAGE_TYPE_FAILED, 0); 30900ebd4e58920add6114b1f345b7d95e0709096fe3Ajay Panicker } else { 30910ebd4e58920add6114b1f345b7d95e0709096fe3Ajay Panicker Sms.moveMessageToFolder(mContext, msgInfo.uri, Sms.MESSAGE_TYPE_SENT, 0); 3092326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3093326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3094fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (msgInfo.partsDelivered == msgInfo.parts) { 3095fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie actionMessageDelivery(context, intent, msgInfo); 3096fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3097fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 3098fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.d(TAG, "onReceive: Unknown action " + action); 3099fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3100fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3101fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 31024f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala private void actionMessageSent(Context context, Intent intent, PushMsgInfo msgInfo) { 31034f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala /* As the MESSAGE_SENT intent is forwarded from the MAP service, we use the intent 31044f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala * to carry the result, as getResult() will not return the correct value. 31054f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala */ 31064f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala boolean delete = false; 31074f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31084f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if(D) Log.d(TAG,"actionMessageSent(): msgInfo.failedSent = " + msgInfo.failedSent); 31094f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31104f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala msgInfo.sendInProgress = false; 31114f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31124f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (msgInfo.failedSent == false) { 31134f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if(D) Log.d(TAG, "actionMessageSent: result OK"); 31144f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (msgInfo.transparent == 0) { 31154f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (!Sms.moveMessageToFolder(context, msgInfo.uri, 31164f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Sms.MESSAGE_TYPE_SENT, 0)) { 31174f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Log.w(TAG, "Failed to move " + msgInfo.uri + " to SENT"); 31184f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31194f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } else { 31204f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala delete = true; 31214f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31224f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31234f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Event evt = new Event(EVENT_TYPE_SENDING_SUCCESS, msgInfo.id, 31244f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala getSmsFolderName(Sms.MESSAGE_TYPE_SENT), null, mSmsType); 31254f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala sendEvent(evt); 31264f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31274f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } else { 31284f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (msgInfo.retry == 1) { 31294f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala /* Notify failure, but keep message in outbox for resending */ 31304f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala msgInfo.resend = true; 31314f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala msgInfo.partsSent = 0; // Reset counter for the retry 31324f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala msgInfo.failedSent = false; 31334f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Event evt = new Event(EVENT_TYPE_SENDING_FAILURE, msgInfo.id, 31344f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala getSmsFolderName(Sms.MESSAGE_TYPE_OUTBOX), null, mSmsType); 31354f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala sendEvent(evt); 31364f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } else { 31374f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (msgInfo.transparent == 0) { 31384f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (!Sms.moveMessageToFolder(context, msgInfo.uri, 31394f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Sms.MESSAGE_TYPE_FAILED, 0)) { 31404f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Log.w(TAG, "Failed to move " + msgInfo.uri + " to FAILED"); 31414f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31424f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } else { 31434f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala delete = true; 31444f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31454f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31464f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala Event evt = new Event(EVENT_TYPE_SENDING_FAILURE, msgInfo.id, 31474f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala getSmsFolderName(Sms.MESSAGE_TYPE_FAILED), null, mSmsType); 31484f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala sendEvent(evt); 31494f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31504f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31514f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31524f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala if (delete == true) { 31534f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala /* Delete from Observer message list to avoid delete notifications */ 31544f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala synchronized(getMsgListSms()) { 31554f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala getMsgListSms().remove(msgInfo.id); 31564f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31574f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 31584f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala /* Delete from DB */ 31594f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala mResolver.delete(msgInfo.uri, null, null); 31604f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31614f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala } 31624f341a3ac7cdfd7c976a9eb59117542d50458398Ashwini Munigala 3163326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde private void actionMessageDelivery(Context context, Intent intent, PushMsgInfo msgInfo) { 3164fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri messageUri = intent.getData(); 3165326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde msgInfo.sendInProgress = false; 3166fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3167fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Cursor cursor = mResolver.query(msgInfo.uri, ID_PROJECTION, null, null, null); 3168fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3169fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie try { 3170fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (cursor.moveToFirst()) { 3171fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie int messageId = cursor.getInt(0); 3172fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3173fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Uri updateUri = ContentUris.withAppendedId(UPDATE_STATUS_URI, messageId); 3174fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 31755a60e47497f21f64e6d79420dc4c56c1907df22akschulz if(D) Log.d(TAG, "actionMessageDelivery: uri=" + messageUri + ", status=" 31765a60e47497f21f64e6d79420dc4c56c1907df22akschulz + msgInfo.statusDelivered); 3177fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3178fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie ContentValues contentValues = new ContentValues(2); 3179fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3180326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde contentValues.put(Sms.STATUS, msgInfo.statusDelivered); 3181fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie contentValues.put(Inbox.DATE_SENT, System.currentTimeMillis()); 3182fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mResolver.update(updateUri, contentValues, null, null); 3183fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 3184fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.d(TAG, "Can't find message for status update: " + messageUri); 3185fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3186fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } finally { 31875a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (cursor != null) cursor.close(); 3188fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3189fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3190326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (msgInfo.statusDelivered == 0) { 3191326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Event evt = new Event(EVENT_TYPE_DELEVERY_SUCCESS, msgInfo.id, 31925a60e47497f21f64e6d79420dc4c56c1907df22akschulz getSmsFolderName(Sms.MESSAGE_TYPE_SENT), null, mSmsType); 3193fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sendEvent(evt); 3194fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } else { 31955a60e47497f21f64e6d79420dc4c56c1907df22akschulz Event evt = new Event(EVENT_TYPE_DELIVERY_FAILURE, msgInfo.id, 31965a60e47497f21f64e6d79420dc4c56c1907df22akschulz getSmsFolderName(Sms.MESSAGE_TYPE_SENT), null, mSmsType); 3197fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie sendEvent(evt); 3198fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3199fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3200fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie mPushMsgList.remove(msgInfo.id); 3201fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3202fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3203fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3204ed70219e41ba68196798dcbf75b782d13fb88603kschulz /** 3205ed70219e41ba68196798dcbf75b782d13fb88603kschulz * Handle MMS sent intents in disconnected(MNS) state, where we do not need to send any 3206ed70219e41ba68196798dcbf75b782d13fb88603kschulz * notifications. 3207ed70219e41ba68196798dcbf75b782d13fb88603kschulz * @param context The context to use for provider operations 3208ed70219e41ba68196798dcbf75b782d13fb88603kschulz * @param intent The intent received 3209ed70219e41ba68196798dcbf75b782d13fb88603kschulz * @param result The result 3210ed70219e41ba68196798dcbf75b782d13fb88603kschulz */ 3211ed70219e41ba68196798dcbf75b782d13fb88603kschulz static public void actionMmsSent(Context context, Intent intent, int result, 3212ed70219e41ba68196798dcbf75b782d13fb88603kschulz Map<Long, Msg> mmsMsgList) { 3213ed70219e41ba68196798dcbf75b782d13fb88603kschulz /* 3214ed70219e41ba68196798dcbf75b782d13fb88603kschulz * if transparent: 3215ed70219e41ba68196798dcbf75b782d13fb88603kschulz * delete message and send notification(regardless of result) 3216ed70219e41ba68196798dcbf75b782d13fb88603kschulz * else 3217ed70219e41ba68196798dcbf75b782d13fb88603kschulz * Result == Success: 3218ed70219e41ba68196798dcbf75b782d13fb88603kschulz * move to sent folder (will trigger notification) 3219ed70219e41ba68196798dcbf75b782d13fb88603kschulz * Result == Fail: 3220ed70219e41ba68196798dcbf75b782d13fb88603kschulz * move to outbox (send delivery fail notification) 3221ed70219e41ba68196798dcbf75b782d13fb88603kschulz */ 3222ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(D) Log.d(TAG,"actionMmsSent()"); 3223ed70219e41ba68196798dcbf75b782d13fb88603kschulz int transparent = intent.getIntExtra(EXTRA_MESSAGE_SENT_TRANSPARENT, 0); 3224ed70219e41ba68196798dcbf75b782d13fb88603kschulz long handle = intent.getLongExtra(EXTRA_MESSAGE_SENT_HANDLE, -1); 3225ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(handle < 0) { 3226ed70219e41ba68196798dcbf75b782d13fb88603kschulz Log.w(TAG, "Intent received for an invalid handle"); 3227ed70219e41ba68196798dcbf75b782d13fb88603kschulz return; 3228ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3229ed70219e41ba68196798dcbf75b782d13fb88603kschulz ContentResolver resolver = context.getContentResolver(); 3230ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(transparent == 1) { 3231ed70219e41ba68196798dcbf75b782d13fb88603kschulz /* The specification is a bit unclear about the transparent flag. If it is set 3232ed70219e41ba68196798dcbf75b782d13fb88603kschulz * no copy of the message shall be kept in the send folder after the message 3233ed70219e41ba68196798dcbf75b782d13fb88603kschulz * was send, but in the case of a send error, it is unclear what to do. 3234ed70219e41ba68196798dcbf75b782d13fb88603kschulz * As it will not be transparent if we keep the message in any folder, 3235ed70219e41ba68196798dcbf75b782d13fb88603kschulz * we delete the message regardless of the result. 3236ed70219e41ba68196798dcbf75b782d13fb88603kschulz * If we however do have a MNS connection we need to send a notification. */ 3237ed70219e41ba68196798dcbf75b782d13fb88603kschulz Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, handle); 3238ed70219e41ba68196798dcbf75b782d13fb88603kschulz /* Delete from observer message list to avoid delete notifications */ 3239ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(mmsMsgList != null) { 3240ed70219e41ba68196798dcbf75b782d13fb88603kschulz synchronized(mmsMsgList) { 3241ed70219e41ba68196798dcbf75b782d13fb88603kschulz mmsMsgList.remove(handle); 3242ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3243ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3244ed70219e41ba68196798dcbf75b782d13fb88603kschulz /* Delete message */ 3245ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(D) Log.d(TAG,"Transparent in use - delete"); 3246ed70219e41ba68196798dcbf75b782d13fb88603kschulz resolver.delete(uri, null, null); 3247ed70219e41ba68196798dcbf75b782d13fb88603kschulz } else if (result == Activity.RESULT_OK) { 3248ed70219e41ba68196798dcbf75b782d13fb88603kschulz /* This will trigger a notification */ 3249ed70219e41ba68196798dcbf75b782d13fb88603kschulz moveMmsToFolder(handle, resolver, Mms.MESSAGE_BOX_SENT); 3250ed70219e41ba68196798dcbf75b782d13fb88603kschulz } else { 3251ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(mmsMsgList != null) { 3252ed70219e41ba68196798dcbf75b782d13fb88603kschulz synchronized(mmsMsgList) { 3253ed70219e41ba68196798dcbf75b782d13fb88603kschulz Msg msg = mmsMsgList.get(handle); 3254ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(msg != null) { 3255ed70219e41ba68196798dcbf75b782d13fb88603kschulz msg.type=Mms.MESSAGE_BOX_OUTBOX; 3256ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3257ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3258ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3259ed70219e41ba68196798dcbf75b782d13fb88603kschulz /* Hand further retries over to the MMS application */ 3260ed70219e41ba68196798dcbf75b782d13fb88603kschulz moveMmsToFolder(handle, resolver, Mms.MESSAGE_BOX_OUTBOX); 3261ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3262ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3263ed70219e41ba68196798dcbf75b782d13fb88603kschulz 3264326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde static public void actionMessageSentDisconnected(Context context, Intent intent, int result) { 3265ed70219e41ba68196798dcbf75b782d13fb88603kschulz TYPE type = TYPE.fromOrdinal( 3266ed70219e41ba68196798dcbf75b782d13fb88603kschulz intent.getIntExtra(EXTRA_MESSAGE_SENT_MSG_TYPE, TYPE.NONE.ordinal())); 3267ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(type == TYPE.MMS) { 3268edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou actionMmsSent(context, intent, result, null); 3269ed70219e41ba68196798dcbf75b782d13fb88603kschulz } else { 3270edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou actionSmsSentDisconnected(context, intent, result); 3271ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3272ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3273ed70219e41ba68196798dcbf75b782d13fb88603kschulz 3274ed70219e41ba68196798dcbf75b782d13fb88603kschulz static public void actionSmsSentDisconnected(Context context, Intent intent, int result) { 3275edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou /* Check permission for message deletion. */ 3276edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou if ((Binder.getCallingPid() != Process.myPid()) || 3277edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou (context.checkCallingOrSelfPermission("android.Manifest.permission.WRITE_SMS") 3278edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou != PackageManager.PERMISSION_GRANTED)) { 3279edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou Log.w(TAG, "actionSmsSentDisconnected: Not allowed to delete SMS/MMS messages"); 3280edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou return; 3281edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou } 3282edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou 3283326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde boolean delete = false; 3284326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde //int retry = intent.getIntExtra(EXTRA_MESSAGE_SENT_RETRY, 0); 3285326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde int transparent = intent.getIntExtra(EXTRA_MESSAGE_SENT_TRANSPARENT, 0); 3286326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde String uriString = intent.getStringExtra(EXTRA_MESSAGE_SENT_URI); 3287326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if(uriString == null) { 3288326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde // Nothing we can do about it, just bail out 3289326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return; 3290326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3291326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Uri uri = Uri.parse(uriString); 3292326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3293326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (result == Activity.RESULT_OK) { 3294326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG, "actionMessageSentDisconnected: result OK"); 3295326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (transparent == 0) { 3296326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (!Sms.moveMessageToFolder(context, uri, 3297326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms.MESSAGE_TYPE_SENT, 0)) { 3298326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG, "Failed to move " + uri + " to SENT"); 3299326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3300326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 3301326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde delete = true; 3302326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3303326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 3304326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /*if (retry == 1) { 3305326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde The retry feature only works while connected, else we fail the send, 33065a60e47497f21f64e6d79420dc4c56c1907df22akschulz * and move the message to failed, to let the user/app resend manually later. 3307326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else */{ 3308326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (transparent == 0) { 3309326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde if (!Sms.moveMessageToFolder(context, uri, 3310326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Sms.MESSAGE_TYPE_FAILED, 0)) { 3311326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.d(TAG, "Failed to move " + uri + " to FAILED"); 3312326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3313326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 3314326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde delete = true; 3315326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3316326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3317326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3318326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3319edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou if (delete) { 3320326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde /* Delete from DB */ 3321326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde ContentResolver resolver = context.getContentResolver(); 3322edb6da171b8b7a6f9d4aa5a773d734a464f1ec66Miao Chou if (resolver != null) { 3323326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde resolver.delete(uri, null, null); 3324326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } else { 3325326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde Log.w(TAG, "Unable to get resolver"); 3326326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3327326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3328326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3329326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3330fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void registerPhoneServiceStateListener() { 33315a60e47497f21f64e6d79420dc4c56c1907df22akschulz TelephonyManager tm = (TelephonyManager)mContext.getSystemService( 33325a60e47497f21f64e6d79420dc4c56c1907df22akschulz Context.TELEPHONY_SERVICE); 3333fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie tm.listen(mPhoneListener, PhoneStateListener.LISTEN_SERVICE_STATE); 3334fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3335fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3336fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void unRegisterPhoneServiceStateListener() { 33375a60e47497f21f64e6d79420dc4c56c1907df22akschulz TelephonyManager tm = (TelephonyManager)mContext.getSystemService( 33385a60e47497f21f64e6d79420dc4c56c1907df22akschulz Context.TELEPHONY_SERVICE); 3339fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie tm.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE); 3340fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3341fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3342fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void resendPendingMessages() { 3343fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Send pending messages in outbox */ 3344fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = "type = " + Sms.MESSAGE_TYPE_OUTBOX; 3345db8d8ae565b3db6a5e3187170dcb7b281a79f9daAjay Panicker UserManager manager = UserManager.get(mContext); 3346db8d8ae565b3db6a5e3187170dcb7b281a79f9daAjay Panicker if (manager == null || !manager.isUserUnlocked()) return; 33475a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(Sms.CONTENT_URI, SMS_PROJECTION, where, null, 33485a60e47497f21f64e6d79420dc4c56c1907df22akschulz null); 334928446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 33505a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 33515a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 33525a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex(Sms._ID)); 33535a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgBody = c.getString(c.getColumnIndex(Sms.BODY)); 33545a60e47497f21f64e6d79420dc4c56c1907df22akschulz PushMsgInfo msgInfo = mPushMsgList.get(id); 33555a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgInfo == null || msgInfo.resend == false || 33565a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgInfo.sendInProgress == true) { 33575a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 33585a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 33595a60e47497f21f64e6d79420dc4c56c1907df22akschulz msgInfo.sendInProgress = true; 33605a60e47497f21f64e6d79420dc4c56c1907df22akschulz sendMessage(msgInfo, msgBody); 33615a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 336228446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 336328446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 33645a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3365fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 33665a60e47497f21f64e6d79420dc4c56c1907df22akschulz 33675a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3368fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3369fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3370fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void failPendingMessages() { 3371fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Move pending messages from outbox to failed */ 3372fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie String where = "type = " + Sms.MESSAGE_TYPE_OUTBOX; 33735a60e47497f21f64e6d79420dc4c56c1907df22akschulz Cursor c = mResolver.query(Sms.CONTENT_URI, SMS_PROJECTION, where, null, 33745a60e47497f21f64e6d79420dc4c56c1907df22akschulz null); 337528446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz try { 33765a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null && c.moveToFirst()) { 33775a60e47497f21f64e6d79420dc4c56c1907df22akschulz do { 33785a60e47497f21f64e6d79420dc4c56c1907df22akschulz long id = c.getLong(c.getColumnIndex(Sms._ID)); 33795a60e47497f21f64e6d79420dc4c56c1907df22akschulz String msgBody = c.getString(c.getColumnIndex(Sms.BODY)); 33805a60e47497f21f64e6d79420dc4c56c1907df22akschulz PushMsgInfo msgInfo = mPushMsgList.get(id); 33815a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (msgInfo == null || msgInfo.resend == false) { 33825a60e47497f21f64e6d79420dc4c56c1907df22akschulz continue; 33835a60e47497f21f64e6d79420dc4c56c1907df22akschulz } 33845a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.moveMessageToFolder(mContext, msgInfo.uri, 33855a60e47497f21f64e6d79420dc4c56c1907df22akschulz Sms.MESSAGE_TYPE_FAILED, 0); 33865a60e47497f21f64e6d79420dc4c56c1907df22akschulz } while (c.moveToNext()); 338728446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } 338828446a56718e80574ba7b81901fc5a1368bf5839Kim Schulz } finally { 33895a60e47497f21f64e6d79420dc4c56c1907df22akschulz if (c != null) c.close(); 3390fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 33915a60e47497f21f64e6d79420dc4c56c1907df22akschulz 3392fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3393fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3394fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private void removeDeletedMessages() { 3395fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie /* Remove messages from virtual "deleted" folder (thread_id -1) */ 3396326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mResolver.delete(Sms.CONTENT_URI, 3397fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie "thread_id = " + DELETED_THREAD_ID, null); 3398fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3399fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3400fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie private PhoneStateListener mPhoneListener = new PhoneStateListener() { 3401fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie @Override 3402fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void onServiceStateChanged(ServiceState serviceState) { 3403fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie Log.d(TAG, "Phone service state change: " + serviceState.getState()); 3404fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) { 3405fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie resendPendingMessages(); 3406fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3407fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3408fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie }; 3409fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3410fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void init() { 34111ff5a0a6b42eff4c5728f0327440c127f8d3bb1cHemant Gupta if (mSmsBroadcastReceiver != null) { 34121ff5a0a6b42eff4c5728f0327440c127f8d3bb1cHemant Gupta mSmsBroadcastReceiver.register(); 34131ff5a0a6b42eff4c5728f0327440c127f8d3bb1cHemant Gupta } 3414fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie registerPhoneServiceStateListener(); 3415326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mInitialized = true; 3416fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3417fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie 3418fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie public void deinit() { 3419326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde mInitialized = false; 3420326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde unregisterObserver(); 34211ff5a0a6b42eff4c5728f0327440c127f8d3bb1cHemant Gupta if (mSmsBroadcastReceiver != null) { 34221ff5a0a6b42eff4c5728f0327440c127f8d3bb1cHemant Gupta mSmsBroadcastReceiver.unregister(); 34231ff5a0a6b42eff4c5728f0327440c127f8d3bb1cHemant Gupta } 3424fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie unRegisterPhoneServiceStateListener(); 3425fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie failPendingMessages(); 3426fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie removeDeletedMessages(); 3427fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie } 3428326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde 3429326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde public boolean handleSmsSendIntent(Context context, Intent intent){ 3430ed70219e41ba68196798dcbf75b782d13fb88603kschulz TYPE type = TYPE.fromOrdinal( 3431ed70219e41ba68196798dcbf75b782d13fb88603kschulz intent.getIntExtra(EXTRA_MESSAGE_SENT_MSG_TYPE, TYPE.NONE.ordinal())); 3432ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(type == TYPE.MMS) { 3433ed70219e41ba68196798dcbf75b782d13fb88603kschulz return handleMmsSendIntent(context, intent); 3434ed70219e41ba68196798dcbf75b782d13fb88603kschulz } else { 3435ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(mInitialized) { 3436ed70219e41ba68196798dcbf75b782d13fb88603kschulz mSmsBroadcastReceiver.onReceive(context, intent); 3437ed70219e41ba68196798dcbf75b782d13fb88603kschulz return true; 3438ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3439326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3440326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde return false; 3441326b5e610063ac24c0ba467ac585bd4c7f618a67Casper Bonde } 3442ed70219e41ba68196798dcbf75b782d13fb88603kschulz 3443ed70219e41ba68196798dcbf75b782d13fb88603kschulz public boolean handleMmsSendIntent(Context context, Intent intent){ 3444ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(D) Log.w(TAG, "handleMmsSendIntent()"); 3445ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(mMnsClient.isConnected() == false) { 3446ed70219e41ba68196798dcbf75b782d13fb88603kschulz // No need to handle notifications, just use default handling 3447ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(D) Log.w(TAG, "MNS not connected - use static handling"); 3448ed70219e41ba68196798dcbf75b782d13fb88603kschulz return false; 3449ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3450ed70219e41ba68196798dcbf75b782d13fb88603kschulz long handle = intent.getLongExtra(EXTRA_MESSAGE_SENT_HANDLE, -1); 3451ed70219e41ba68196798dcbf75b782d13fb88603kschulz int result = intent.getIntExtra(EXTRA_MESSAGE_SENT_RESULT, Activity.RESULT_CANCELED); 3452ed70219e41ba68196798dcbf75b782d13fb88603kschulz actionMmsSent(context, intent, result, getMsgListMms()); 3453ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(handle < 0) { 3454ed70219e41ba68196798dcbf75b782d13fb88603kschulz Log.w(TAG, "Intent received for an invalid handle"); 3455ed70219e41ba68196798dcbf75b782d13fb88603kschulz return true; 3456ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3457ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(result != Activity.RESULT_OK) { 3458ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(mObserverRegistered) { 3459ed70219e41ba68196798dcbf75b782d13fb88603kschulz Event evt = new Event(EVENT_TYPE_SENDING_FAILURE, handle, 3460ed70219e41ba68196798dcbf75b782d13fb88603kschulz getMmsFolderName(Mms.MESSAGE_BOX_OUTBOX), null, TYPE.MMS); 3461ed70219e41ba68196798dcbf75b782d13fb88603kschulz sendEvent(evt); 3462ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3463ed70219e41ba68196798dcbf75b782d13fb88603kschulz } else { 3464ed70219e41ba68196798dcbf75b782d13fb88603kschulz int transparent = intent.getIntExtra(EXTRA_MESSAGE_SENT_TRANSPARENT, 0); 3465ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(transparent != 0) { 3466ed70219e41ba68196798dcbf75b782d13fb88603kschulz if(mObserverRegistered) { 3467ed70219e41ba68196798dcbf75b782d13fb88603kschulz Event evt = new Event(EVENT_TYPE_SENDING_SUCCESS, handle, 3468ed70219e41ba68196798dcbf75b782d13fb88603kschulz getMmsFolderName(Mms.MESSAGE_BOX_OUTBOX), null, TYPE.MMS); 3469ed70219e41ba68196798dcbf75b782d13fb88603kschulz sendEvent(evt); 3470ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3471ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3472ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3473ed70219e41ba68196798dcbf75b782d13fb88603kschulz return true; 3474ed70219e41ba68196798dcbf75b782d13fb88603kschulz } 3475ed70219e41ba68196798dcbf75b782d13fb88603kschulz 3476fd6603b8bf9ed72dcc8bd59aaef3209251b6e17cMatthew Xie} 3477