Loading android/app/src/com/android/bluetooth/mapclient/MapClientContent.java +7 −6 Original line number Original line Diff line number Diff line Loading @@ -186,25 +186,25 @@ class MapClientContent { * Store a message in database with the associated handle and timestamp. * Store a message in database with the associated handle and timestamp. * The handle is used to associate the local message with the remote message. * The handle is used to associate the local message with the remote message. */ */ void storeMessage(Bmessage message, String handle, Long timestamp) { void storeMessage(Bmessage message, String handle, Long timestamp, boolean seen) { logI("storeMessage(device=" + Utils.getLoggableAddress(mDevice) + ", time=" + timestamp logI("storeMessage(device=" + Utils.getLoggableAddress(mDevice) + ", time=" + timestamp + ", handle=" + handle + ", type=" + message.getType() + ", handle=" + handle + ", type=" + message.getType() + ", folder=" + message.getFolder()); + ", folder=" + message.getFolder()); switch (message.getType()) { switch (message.getType()) { case MMS: case MMS: storeMms(message, handle, timestamp); storeMms(message, handle, timestamp, seen); return; return; case SMS_CDMA: case SMS_CDMA: case SMS_GSM: case SMS_GSM: storeSms(message, handle, timestamp); storeSms(message, handle, timestamp, seen); return; return; default: default: logD("Request to store unsupported message type: " + message.getType()); logD("Request to store unsupported message type: " + message.getType()); } } } } private void storeSms(Bmessage message, String handle, Long timestamp) { private void storeSms(Bmessage message, String handle, Long timestamp, boolean seen) { logD("storeSms"); logD("storeSms"); logV(message.toString()); logV(message.toString()); VCardEntry originator = message.getOriginator(); VCardEntry originator = message.getOriginator(); Loading Loading @@ -233,6 +233,7 @@ class MapClientContent { values.put(Sms.SUBSCRIPTION_ID, mSubscriptionId); values.put(Sms.SUBSCRIPTION_ID, mSubscriptionId); values.put(Sms.DATE, timestamp); values.put(Sms.DATE, timestamp); values.put(Sms.READ, readStatus); values.put(Sms.READ, readStatus); values.put(Sms.SEEN, seen); Uri results = mResolver.insert(contentUri, values); Uri results = mResolver.insert(contentUri, values); mHandleToUriMap.put(handle, results); mHandleToUriMap.put(handle, results); Loading Loading @@ -301,7 +302,7 @@ class MapClientContent { } } } } private void storeMms(Bmessage message, String handle, Long timestamp) { private void storeMms(Bmessage message, String handle, Long timestamp, boolean seen) { logD("storeMms"); logD("storeMms"); logV(message.toString()); logV(message.toString()); try { try { Loading @@ -326,7 +327,7 @@ class MapClientContent { values.put(Mms.TEXT_ONLY, true); values.put(Mms.TEXT_ONLY, true); values.put(Mms.MESSAGE_BOX, messageBox); values.put(Mms.MESSAGE_BOX, messageBox); values.put(Mms.READ, read); values.put(Mms.READ, read); values.put(Mms.SEEN, 0); values.put(Mms.SEEN, seen); values.put(Mms.MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ); values.put(Mms.MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ); values.put(Mms.MMS_VERSION, PduHeaders.CURRENT_MMS_VERSION); values.put(Mms.MMS_VERSION, PduHeaders.CURRENT_MMS_VERSION); values.put(Mms.PRIORITY, PduHeaders.PRIORITY_NORMAL); values.put(Mms.PRIORITY, PduHeaders.PRIORITY_NORMAL); Loading android/app/src/com/android/bluetooth/mapclient/MceStateMachine.java +25 −8 Original line number Original line Diff line number Diff line Loading @@ -116,6 +116,10 @@ class MceStateMachine extends StateMachine { private static final int MSG_DISCONNECT = 2; private static final int MSG_DISCONNECT = 2; private static final int MSG_CONNECTING_TIMEOUT = 3; private static final int MSG_CONNECTING_TIMEOUT = 3; private static final int MSG_DISCONNECTING_TIMEOUT = 4; private static final int MSG_DISCONNECTING_TIMEOUT = 4; private static final boolean MESSAGE_SEEN = true; private static final boolean MESSAGE_NOT_SEEN = false; // Folder names as defined in Bluetooth.org MAP spec V10 // Folder names as defined in Bluetooth.org MAP spec V10 private static final String FOLDER_TELECOM = "telecom"; private static final String FOLDER_TELECOM = "telecom"; private static final String FOLDER_MSG = "msg"; private static final String FOLDER_MSG = "msg"; Loading Loading @@ -162,11 +166,13 @@ class MceStateMachine extends StateMachine { private final String mHandle; private final String mHandle; private final Long mTimestamp; private final Long mTimestamp; private boolean mRead; private boolean mRead; private boolean mSeen; MessageMetadata(String handle, Long timestamp, boolean read) { MessageMetadata(String handle, Long timestamp, boolean read, boolean seen) { mHandle = handle; mHandle = handle; mTimestamp = timestamp; mTimestamp = timestamp; mRead = read; mRead = read; mSeen = seen; } } public String getHandle() { public String getHandle() { Loading @@ -184,6 +190,11 @@ class MceStateMachine extends StateMachine { public synchronized void setRead(boolean read) { public synchronized void setRead(boolean read) { mRead = read; mRead = read; } } public synchronized boolean getSeen() { return mSeen; } } } // Map each message to its metadata via the handle // Map each message to its metadata via the handle Loading @@ -191,14 +202,16 @@ class MceStateMachine extends StateMachine { new ConcurrentHashMap<String, MessageMetadata>(); new ConcurrentHashMap<String, MessageMetadata>(); MceStateMachine(MapClientService service, BluetoothDevice device) { MceStateMachine(MapClientService service, BluetoothDevice device) { this(service, device, null); this(service, device, null, null); } } @VisibleForTesting @VisibleForTesting MceStateMachine(MapClientService service, BluetoothDevice device, MasClient masClient) { MceStateMachine(MapClientService service, BluetoothDevice device, MasClient masClient, MapClientContent database) { super(TAG); super(TAG); mMasClient = masClient; mMasClient = masClient; mService = service; mService = service; mDatabase = database; mPreviousState = BluetoothProfile.STATE_DISCONNECTED; mPreviousState = BluetoothProfile.STATE_DISCONNECTED; Loading Loading @@ -543,7 +556,10 @@ class MceStateMachine extends StateMachine { setMessageStatus(handle, status); setMessageStatus(handle, status); } } }; }; // Keeps mock database from being overwritten in tests if (mDatabase == null) { mDatabase = new MapClientContent(mService, callbacks, mDevice); mDatabase = new MapClientContent(mService, callbacks, mDevice); } onConnectionStateChanged(mPreviousState, BluetoothProfile.STATE_CONNECTED); onConnectionStateChanged(mPreviousState, BluetoothProfile.STATE_CONNECTED); if (Utils.isPtsTestMode()) return; if (Utils.isPtsTestMode()) return; Loading Loading @@ -638,7 +654,7 @@ class MceStateMachine extends StateMachine { if (messageHandle != null && messageHandle.length() > 2) { if (messageHandle != null && messageHandle.length() > 2) { if (SAVE_OUTBOUND_MESSAGES) { if (SAVE_OUTBOUND_MESSAGES) { mDatabase.storeMessage(requestPushMessage.getBMsg(), messageHandle, mDatabase.storeMessage(requestPushMessage.getBMsg(), messageHandle, System.currentTimeMillis()); System.currentTimeMillis(), MESSAGE_SEEN); } } mSentMessageLog.put(messageHandle.substring(2), mSentMessageLog.put(messageHandle.substring(2), requestPushMessage.getBMsg()); requestPushMessage.getBMsg()); Loading Loading @@ -721,7 +737,7 @@ class MceStateMachine extends StateMachine { if (!mMessages.containsKey(event.getHandle())) { if (!mMessages.containsKey(event.getHandle())) { Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance(); MessageMetadata metadata = new MessageMetadata(event.getHandle(), MessageMetadata metadata = new MessageMetadata(event.getHandle(), calendar.getTime().getTime(), false); calendar.getTime().getTime(), false, MESSAGE_NOT_SEEN); mMessages.put(event.getHandle(), metadata); mMessages.put(event.getHandle(), metadata); } } mMasClient.makeRequest(new RequestGetMessage(event.getHandle(), mMasClient.makeRequest(new RequestGetMessage(event.getHandle(), Loading Loading @@ -782,7 +798,7 @@ class MceStateMachine extends StateMachine { } } // A message listing coming from the server should always have up to date data // A message listing coming from the server should always have up to date data mMessages.put(msg.getHandle(), new MessageMetadata(msg.getHandle(), mMessages.put(msg.getHandle(), new MessageMetadata(msg.getHandle(), msg.getDateTime().getTime(), msg.isRead())); msg.getDateTime().getTime(), msg.isRead(), MESSAGE_SEEN)); getMessage(msg.getHandle()); getMessage(msg.getHandle()); } } } } Loading Loading @@ -896,7 +912,8 @@ class MceStateMachine extends StateMachine { return; return; } } mDatabase.storeMessage(message, request.getHandle(), mDatabase.storeMessage(message, request.getHandle(), mMessages.get(request.getHandle()).getTimestamp()); mMessages.get(request.getHandle()).getTimestamp(), mMessages.get(request.getHandle()).getSeen()); if (!INBOX_PATH.equalsIgnoreCase(message.getFolder())) { if (!INBOX_PATH.equalsIgnoreCase(message.getFolder())) { if (DBG) { if (DBG) { Log.d(TAG, "Ignoring message received in " + message.getFolder() + "."); Log.d(TAG, "Ignoring message received in " + message.getFolder() + "."); Loading android/app/src/com/android/bluetooth/mapclient/obex/EventReport.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.bluetooth.mapclient; import android.util.Log; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import org.json.JSONException; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONObject; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser; Loading @@ -43,7 +45,8 @@ public class EventReport { private final String mOldFolder; private final String mOldFolder; private final Bmessage.Type mMsgType; private final Bmessage.Type mMsgType; private EventReport(HashMap<String, String> attrs) throws IllegalArgumentException { @VisibleForTesting EventReport(HashMap<String, String> attrs) throws IllegalArgumentException { mType = parseType(attrs.get("type")); mType = parseType(attrs.get("type")); if (mType != Type.MEMORY_FULL && mType != Type.MEMORY_AVAILABLE) { if (mType != Type.MEMORY_FULL && mType != Type.MEMORY_AVAILABLE) { Loading android/app/src/com/android/bluetooth/mapclient/obex/RequestGetMessage.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets; final class RequestGetMessage extends Request { class RequestGetMessage extends Request { private static final String TAG = "RequestGetMessage"; private static final String TAG = "RequestGetMessage"; Loading android/app/src/com/android/bluetooth/mapclient/obex/RequestGetMessagesListing.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.Date; /* Get a listing of messages in directory. */ /* Get a listing of messages in directory. */ final class RequestGetMessagesListing extends Request { class RequestGetMessagesListing extends Request { private static final String TYPE = "x-bt/MAP-msg-listing"; private static final String TYPE = "x-bt/MAP-msg-listing"; Loading Loading
android/app/src/com/android/bluetooth/mapclient/MapClientContent.java +7 −6 Original line number Original line Diff line number Diff line Loading @@ -186,25 +186,25 @@ class MapClientContent { * Store a message in database with the associated handle and timestamp. * Store a message in database with the associated handle and timestamp. * The handle is used to associate the local message with the remote message. * The handle is used to associate the local message with the remote message. */ */ void storeMessage(Bmessage message, String handle, Long timestamp) { void storeMessage(Bmessage message, String handle, Long timestamp, boolean seen) { logI("storeMessage(device=" + Utils.getLoggableAddress(mDevice) + ", time=" + timestamp logI("storeMessage(device=" + Utils.getLoggableAddress(mDevice) + ", time=" + timestamp + ", handle=" + handle + ", type=" + message.getType() + ", handle=" + handle + ", type=" + message.getType() + ", folder=" + message.getFolder()); + ", folder=" + message.getFolder()); switch (message.getType()) { switch (message.getType()) { case MMS: case MMS: storeMms(message, handle, timestamp); storeMms(message, handle, timestamp, seen); return; return; case SMS_CDMA: case SMS_CDMA: case SMS_GSM: case SMS_GSM: storeSms(message, handle, timestamp); storeSms(message, handle, timestamp, seen); return; return; default: default: logD("Request to store unsupported message type: " + message.getType()); logD("Request to store unsupported message type: " + message.getType()); } } } } private void storeSms(Bmessage message, String handle, Long timestamp) { private void storeSms(Bmessage message, String handle, Long timestamp, boolean seen) { logD("storeSms"); logD("storeSms"); logV(message.toString()); logV(message.toString()); VCardEntry originator = message.getOriginator(); VCardEntry originator = message.getOriginator(); Loading Loading @@ -233,6 +233,7 @@ class MapClientContent { values.put(Sms.SUBSCRIPTION_ID, mSubscriptionId); values.put(Sms.SUBSCRIPTION_ID, mSubscriptionId); values.put(Sms.DATE, timestamp); values.put(Sms.DATE, timestamp); values.put(Sms.READ, readStatus); values.put(Sms.READ, readStatus); values.put(Sms.SEEN, seen); Uri results = mResolver.insert(contentUri, values); Uri results = mResolver.insert(contentUri, values); mHandleToUriMap.put(handle, results); mHandleToUriMap.put(handle, results); Loading Loading @@ -301,7 +302,7 @@ class MapClientContent { } } } } private void storeMms(Bmessage message, String handle, Long timestamp) { private void storeMms(Bmessage message, String handle, Long timestamp, boolean seen) { logD("storeMms"); logD("storeMms"); logV(message.toString()); logV(message.toString()); try { try { Loading @@ -326,7 +327,7 @@ class MapClientContent { values.put(Mms.TEXT_ONLY, true); values.put(Mms.TEXT_ONLY, true); values.put(Mms.MESSAGE_BOX, messageBox); values.put(Mms.MESSAGE_BOX, messageBox); values.put(Mms.READ, read); values.put(Mms.READ, read); values.put(Mms.SEEN, 0); values.put(Mms.SEEN, seen); values.put(Mms.MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ); values.put(Mms.MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_SEND_REQ); values.put(Mms.MMS_VERSION, PduHeaders.CURRENT_MMS_VERSION); values.put(Mms.MMS_VERSION, PduHeaders.CURRENT_MMS_VERSION); values.put(Mms.PRIORITY, PduHeaders.PRIORITY_NORMAL); values.put(Mms.PRIORITY, PduHeaders.PRIORITY_NORMAL); Loading
android/app/src/com/android/bluetooth/mapclient/MceStateMachine.java +25 −8 Original line number Original line Diff line number Diff line Loading @@ -116,6 +116,10 @@ class MceStateMachine extends StateMachine { private static final int MSG_DISCONNECT = 2; private static final int MSG_DISCONNECT = 2; private static final int MSG_CONNECTING_TIMEOUT = 3; private static final int MSG_CONNECTING_TIMEOUT = 3; private static final int MSG_DISCONNECTING_TIMEOUT = 4; private static final int MSG_DISCONNECTING_TIMEOUT = 4; private static final boolean MESSAGE_SEEN = true; private static final boolean MESSAGE_NOT_SEEN = false; // Folder names as defined in Bluetooth.org MAP spec V10 // Folder names as defined in Bluetooth.org MAP spec V10 private static final String FOLDER_TELECOM = "telecom"; private static final String FOLDER_TELECOM = "telecom"; private static final String FOLDER_MSG = "msg"; private static final String FOLDER_MSG = "msg"; Loading Loading @@ -162,11 +166,13 @@ class MceStateMachine extends StateMachine { private final String mHandle; private final String mHandle; private final Long mTimestamp; private final Long mTimestamp; private boolean mRead; private boolean mRead; private boolean mSeen; MessageMetadata(String handle, Long timestamp, boolean read) { MessageMetadata(String handle, Long timestamp, boolean read, boolean seen) { mHandle = handle; mHandle = handle; mTimestamp = timestamp; mTimestamp = timestamp; mRead = read; mRead = read; mSeen = seen; } } public String getHandle() { public String getHandle() { Loading @@ -184,6 +190,11 @@ class MceStateMachine extends StateMachine { public synchronized void setRead(boolean read) { public synchronized void setRead(boolean read) { mRead = read; mRead = read; } } public synchronized boolean getSeen() { return mSeen; } } } // Map each message to its metadata via the handle // Map each message to its metadata via the handle Loading @@ -191,14 +202,16 @@ class MceStateMachine extends StateMachine { new ConcurrentHashMap<String, MessageMetadata>(); new ConcurrentHashMap<String, MessageMetadata>(); MceStateMachine(MapClientService service, BluetoothDevice device) { MceStateMachine(MapClientService service, BluetoothDevice device) { this(service, device, null); this(service, device, null, null); } } @VisibleForTesting @VisibleForTesting MceStateMachine(MapClientService service, BluetoothDevice device, MasClient masClient) { MceStateMachine(MapClientService service, BluetoothDevice device, MasClient masClient, MapClientContent database) { super(TAG); super(TAG); mMasClient = masClient; mMasClient = masClient; mService = service; mService = service; mDatabase = database; mPreviousState = BluetoothProfile.STATE_DISCONNECTED; mPreviousState = BluetoothProfile.STATE_DISCONNECTED; Loading Loading @@ -543,7 +556,10 @@ class MceStateMachine extends StateMachine { setMessageStatus(handle, status); setMessageStatus(handle, status); } } }; }; // Keeps mock database from being overwritten in tests if (mDatabase == null) { mDatabase = new MapClientContent(mService, callbacks, mDevice); mDatabase = new MapClientContent(mService, callbacks, mDevice); } onConnectionStateChanged(mPreviousState, BluetoothProfile.STATE_CONNECTED); onConnectionStateChanged(mPreviousState, BluetoothProfile.STATE_CONNECTED); if (Utils.isPtsTestMode()) return; if (Utils.isPtsTestMode()) return; Loading Loading @@ -638,7 +654,7 @@ class MceStateMachine extends StateMachine { if (messageHandle != null && messageHandle.length() > 2) { if (messageHandle != null && messageHandle.length() > 2) { if (SAVE_OUTBOUND_MESSAGES) { if (SAVE_OUTBOUND_MESSAGES) { mDatabase.storeMessage(requestPushMessage.getBMsg(), messageHandle, mDatabase.storeMessage(requestPushMessage.getBMsg(), messageHandle, System.currentTimeMillis()); System.currentTimeMillis(), MESSAGE_SEEN); } } mSentMessageLog.put(messageHandle.substring(2), mSentMessageLog.put(messageHandle.substring(2), requestPushMessage.getBMsg()); requestPushMessage.getBMsg()); Loading Loading @@ -721,7 +737,7 @@ class MceStateMachine extends StateMachine { if (!mMessages.containsKey(event.getHandle())) { if (!mMessages.containsKey(event.getHandle())) { Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance(); MessageMetadata metadata = new MessageMetadata(event.getHandle(), MessageMetadata metadata = new MessageMetadata(event.getHandle(), calendar.getTime().getTime(), false); calendar.getTime().getTime(), false, MESSAGE_NOT_SEEN); mMessages.put(event.getHandle(), metadata); mMessages.put(event.getHandle(), metadata); } } mMasClient.makeRequest(new RequestGetMessage(event.getHandle(), mMasClient.makeRequest(new RequestGetMessage(event.getHandle(), Loading Loading @@ -782,7 +798,7 @@ class MceStateMachine extends StateMachine { } } // A message listing coming from the server should always have up to date data // A message listing coming from the server should always have up to date data mMessages.put(msg.getHandle(), new MessageMetadata(msg.getHandle(), mMessages.put(msg.getHandle(), new MessageMetadata(msg.getHandle(), msg.getDateTime().getTime(), msg.isRead())); msg.getDateTime().getTime(), msg.isRead(), MESSAGE_SEEN)); getMessage(msg.getHandle()); getMessage(msg.getHandle()); } } } } Loading Loading @@ -896,7 +912,8 @@ class MceStateMachine extends StateMachine { return; return; } } mDatabase.storeMessage(message, request.getHandle(), mDatabase.storeMessage(message, request.getHandle(), mMessages.get(request.getHandle()).getTimestamp()); mMessages.get(request.getHandle()).getTimestamp(), mMessages.get(request.getHandle()).getSeen()); if (!INBOX_PATH.equalsIgnoreCase(message.getFolder())) { if (!INBOX_PATH.equalsIgnoreCase(message.getFolder())) { if (DBG) { if (DBG) { Log.d(TAG, "Ignoring message received in " + message.getFolder() + "."); Log.d(TAG, "Ignoring message received in " + message.getFolder() + "."); Loading
android/app/src/com/android/bluetooth/mapclient/obex/EventReport.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.bluetooth.mapclient; import android.util.Log; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import org.json.JSONException; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONObject; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser; Loading @@ -43,7 +45,8 @@ public class EventReport { private final String mOldFolder; private final String mOldFolder; private final Bmessage.Type mMsgType; private final Bmessage.Type mMsgType; private EventReport(HashMap<String, String> attrs) throws IllegalArgumentException { @VisibleForTesting EventReport(HashMap<String, String> attrs) throws IllegalArgumentException { mType = parseType(attrs.get("type")); mType = parseType(attrs.get("type")); if (mType != Type.MEMORY_FULL && mType != Type.MEMORY_AVAILABLE) { if (mType != Type.MEMORY_FULL && mType != Type.MEMORY_AVAILABLE) { Loading
android/app/src/com/android/bluetooth/mapclient/obex/RequestGetMessage.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets; final class RequestGetMessage extends Request { class RequestGetMessage extends Request { private static final String TAG = "RequestGetMessage"; private static final String TAG = "RequestGetMessage"; Loading
android/app/src/com/android/bluetooth/mapclient/obex/RequestGetMessagesListing.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.Date; /* Get a listing of messages in directory. */ /* Get a listing of messages in directory. */ final class RequestGetMessagesListing extends Request { class RequestGetMessagesListing extends Request { private static final String TYPE = "x-bt/MAP-msg-listing"; private static final String TYPE = "x-bt/MAP-msg-listing"; Loading