Loading android/app/src/com/android/bluetooth/mapclient/MapClientContent.java +51 −13 Original line number Diff line number Diff line Loading @@ -96,7 +96,7 @@ class MapClientContent { mSubscriptionManager = (SubscriptionManager) mContext .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); mSubscriptionManager .addSubscriptionInfoRecord(device.getAddress(), /*device.getName()*/"TEST", 0, .addSubscriptionInfoRecord(mDevice.getAddress(), mDevice.getName(), 0, SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM); SubscriptionInfo info = mSubscriptionManager .getActiveSubscriptionInfoForIcc(mDevice.getAddress()); Loading Loading @@ -156,7 +156,7 @@ class MapClientContent { ArrayList<VCardEntry> recipients = message.getRecipients(); if (recipients != null && !recipients.isEmpty()) { mPhoneNumber = PhoneNumberUtils.extractNetworkPortion( recipients.get(0).getPhoneList().get(0).getNumber()); getFirstRecipientNumber(message)); } } else { mPhoneNumber = PhoneNumberUtils.extractNetworkPortion(getOriginatorNumber(message)); Loading Loading @@ -192,7 +192,11 @@ class MapClientContent { if (INBOX_PATH.equals(message.getFolder())) { recipients = getOriginatorNumber(message); } else { recipients = message.getRecipients().get(0).getPhoneList().get(0).getNumber(); recipients = getFirstRecipientNumber(message); if (recipients == null) { logD("invalid recipients"); return; } } logV("Received SMS from Number " + recipients); String messageContent; Loading Loading @@ -379,11 +383,22 @@ class MapClientContent { return mResolver.insert(Mms.CONTENT_URI, mmsValues); } /** * cleanUp * clear the subscription info and content on shutdown */ void cleanUp() { clearMessages(); mSubscriptionManager.removeSubscriptionInfoRecord(mDevice.getAddress(), SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM); } /** * clearMessages * clean up the content provider on startup and shutdown * clean up the content provider on startup */ void clearMessages() { private void clearMessages() { mResolver.unregisterContentObserver(mContentObserver); mResolver.delete(Sms.CONTENT_URI, Sms.SUBSCRIPTION_ID + " =? ", new String[]{Integer.toString(mSubscriptionId)}); Loading @@ -403,8 +418,14 @@ class MapClientContent { messageContacts.add(originator); } getRecipientsFromMessage(message, messageContacts); // If there is only one contact don't remove it. if (messageContacts.isEmpty()) { return Telephony.Threads.COMMON_THREAD; } else if (messageContacts.size() > 1) { messageContacts.removeIf(number -> (PhoneNumberUtils.compareLoosely(number, mPhoneNumber))); } messageContacts.removeIf(number -> (PhoneNumberUtils.compareLoosely(number, mPhoneNumber))); logV("Contacts = " + messageContacts.toString()); return Telephony.Threads.getOrCreateThreadId(mContext, messageContacts); } Loading @@ -413,7 +434,7 @@ class MapClientContent { List<VCardEntry> recipients = message.getRecipients(); for (VCardEntry recipient : recipients) { List<VCardEntry.PhoneData> phoneData = recipient.getPhoneList(); if (phoneData != null && phoneData.size() > 0) { if (phoneData != null && !phoneData.isEmpty()) { messageContacts .add(PhoneNumberUtils.extractNetworkPortion(phoneData.get(0).getNumber())); } Loading @@ -422,15 +443,32 @@ class MapClientContent { private String getOriginatorNumber(Bmessage message) { VCardEntry originator = message.getOriginator(); if (originator != null) { if (originator == null) { return null; } List<VCardEntry.PhoneData> phoneData = originator.getPhoneList(); if (phoneData != null && phoneData.size() > 0) { if (phoneData == null || phoneData.isEmpty()) { return null; } return PhoneNumberUtils.extractNetworkPortion(phoneData.get(0).getNumber()); } private String getFirstRecipientNumber(Bmessage message) { List<VCardEntry> recipients = message.getRecipients(); if (recipients == null || recipients.isEmpty()) { return null; } List<VCardEntry.PhoneData> phoneData = recipients.get(0).getPhoneList(); if (phoneData == null || phoneData.isEmpty()) { return null; } return phoneData.get(0).getNumber(); } /** * addThreadContactToEntries * utilizing the thread id fill in the appropriate fields of bmsg with the intended recipients Loading android/app/src/com/android/bluetooth/mapclient/MceStateMachine.java +3 −2 Original line number Diff line number Diff line Loading @@ -287,7 +287,8 @@ class MceStateMachine extends StateMachine { Log.d(TAG, "Scheme " + contact.getScheme()); } if (PhoneAccount.SCHEME_TEL.equals(contact.getScheme())) { if (contact.getPath().contains(Telephony.Threads.CONTENT_URI.toString())) { String path = contact.getPath(); if (path != null && path.contains(Telephony.Threads.CONTENT_URI.toString())) { mDatabase.addThreadContactsToEntries(bmsg, contact.getLastPathSegment()); } else { VCardEntry destEntry = new VCardEntry(); Loading Loading @@ -623,7 +624,7 @@ class MceStateMachine extends StateMachine { @Override public void exit() { mDatabase.clearMessages(); mDatabase.cleanUp(); mPreviousState = BluetoothProfile.STATE_CONNECTED; } Loading android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientContentTest.java +23 −4 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ public class MapClientContentTest { Assert.assertEquals(2, mMockSmsContentProvider.mContentValues.size()); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockSmsContentProvider.mContentValues.size()); } Loading @@ -191,7 +191,7 @@ public class MapClientContentTest { mMapClientContent.storeMessage(mTestMessage2, mTestMessage1Handle, mTestMessage1Timestamp); Assert.assertEquals(2, mMockMmsContentProvider.mContentValues.size()); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); } Loading @@ -209,7 +209,7 @@ public class MapClientContentTest { mMapClientContent.storeMessage(mTestMessage2, mTestMessage2Handle, mTestMessage1Timestamp); Assert.assertEquals(2, mMockMmsContentProvider.mContentValues.size()); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); } Loading @@ -229,7 +229,7 @@ public class MapClientContentTest { mMapClientContent.markRead(mTestMessage1Handle); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); } Loading Loading @@ -305,6 +305,25 @@ public class MapClientContentTest { Assert.assertEquals("5551212", mMapClientContent.mPhoneNumber); } /** * Test to validate that some poorly formatted messages don't crash. */ @Test public void testStoreBadMessage() { mMapClientContent = new MapClientContent(mMockContext, mCallbacks, mTestDevice); mTestMessage1 = new Bmessage(); mTestMessage1.setBodyContent("HelloWorld"); mTestMessage1.setType(Bmessage.Type.SMS_GSM); mTestMessage1.setFolder("telecom/msg/sent"); mMapClientContent.storeMessage(mTestMessage1, mTestMessage1Handle, mTestMessage1Timestamp); mTestMessage2 = new Bmessage(); mTestMessage2.setBodyContent("HelloWorld"); mTestMessage2.setType(Bmessage.Type.MMS); mTestMessage2.setFolder("telecom/msg/inbox"); mMapClientContent.storeMessage(mTestMessage2, mTestMessage2Handle, mTestMessage1Timestamp); } void createTestMessages() { mOriginator = new VCardEntry(); VCardProperty property = new VCardProperty(); Loading Loading
android/app/src/com/android/bluetooth/mapclient/MapClientContent.java +51 −13 Original line number Diff line number Diff line Loading @@ -96,7 +96,7 @@ class MapClientContent { mSubscriptionManager = (SubscriptionManager) mContext .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); mSubscriptionManager .addSubscriptionInfoRecord(device.getAddress(), /*device.getName()*/"TEST", 0, .addSubscriptionInfoRecord(mDevice.getAddress(), mDevice.getName(), 0, SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM); SubscriptionInfo info = mSubscriptionManager .getActiveSubscriptionInfoForIcc(mDevice.getAddress()); Loading Loading @@ -156,7 +156,7 @@ class MapClientContent { ArrayList<VCardEntry> recipients = message.getRecipients(); if (recipients != null && !recipients.isEmpty()) { mPhoneNumber = PhoneNumberUtils.extractNetworkPortion( recipients.get(0).getPhoneList().get(0).getNumber()); getFirstRecipientNumber(message)); } } else { mPhoneNumber = PhoneNumberUtils.extractNetworkPortion(getOriginatorNumber(message)); Loading Loading @@ -192,7 +192,11 @@ class MapClientContent { if (INBOX_PATH.equals(message.getFolder())) { recipients = getOriginatorNumber(message); } else { recipients = message.getRecipients().get(0).getPhoneList().get(0).getNumber(); recipients = getFirstRecipientNumber(message); if (recipients == null) { logD("invalid recipients"); return; } } logV("Received SMS from Number " + recipients); String messageContent; Loading Loading @@ -379,11 +383,22 @@ class MapClientContent { return mResolver.insert(Mms.CONTENT_URI, mmsValues); } /** * cleanUp * clear the subscription info and content on shutdown */ void cleanUp() { clearMessages(); mSubscriptionManager.removeSubscriptionInfoRecord(mDevice.getAddress(), SubscriptionManager.SUBSCRIPTION_TYPE_REMOTE_SIM); } /** * clearMessages * clean up the content provider on startup and shutdown * clean up the content provider on startup */ void clearMessages() { private void clearMessages() { mResolver.unregisterContentObserver(mContentObserver); mResolver.delete(Sms.CONTENT_URI, Sms.SUBSCRIPTION_ID + " =? ", new String[]{Integer.toString(mSubscriptionId)}); Loading @@ -403,8 +418,14 @@ class MapClientContent { messageContacts.add(originator); } getRecipientsFromMessage(message, messageContacts); // If there is only one contact don't remove it. if (messageContacts.isEmpty()) { return Telephony.Threads.COMMON_THREAD; } else if (messageContacts.size() > 1) { messageContacts.removeIf(number -> (PhoneNumberUtils.compareLoosely(number, mPhoneNumber))); } messageContacts.removeIf(number -> (PhoneNumberUtils.compareLoosely(number, mPhoneNumber))); logV("Contacts = " + messageContacts.toString()); return Telephony.Threads.getOrCreateThreadId(mContext, messageContacts); } Loading @@ -413,7 +434,7 @@ class MapClientContent { List<VCardEntry> recipients = message.getRecipients(); for (VCardEntry recipient : recipients) { List<VCardEntry.PhoneData> phoneData = recipient.getPhoneList(); if (phoneData != null && phoneData.size() > 0) { if (phoneData != null && !phoneData.isEmpty()) { messageContacts .add(PhoneNumberUtils.extractNetworkPortion(phoneData.get(0).getNumber())); } Loading @@ -422,15 +443,32 @@ class MapClientContent { private String getOriginatorNumber(Bmessage message) { VCardEntry originator = message.getOriginator(); if (originator != null) { if (originator == null) { return null; } List<VCardEntry.PhoneData> phoneData = originator.getPhoneList(); if (phoneData != null && phoneData.size() > 0) { if (phoneData == null || phoneData.isEmpty()) { return null; } return PhoneNumberUtils.extractNetworkPortion(phoneData.get(0).getNumber()); } private String getFirstRecipientNumber(Bmessage message) { List<VCardEntry> recipients = message.getRecipients(); if (recipients == null || recipients.isEmpty()) { return null; } List<VCardEntry.PhoneData> phoneData = recipients.get(0).getPhoneList(); if (phoneData == null || phoneData.isEmpty()) { return null; } return phoneData.get(0).getNumber(); } /** * addThreadContactToEntries * utilizing the thread id fill in the appropriate fields of bmsg with the intended recipients Loading
android/app/src/com/android/bluetooth/mapclient/MceStateMachine.java +3 −2 Original line number Diff line number Diff line Loading @@ -287,7 +287,8 @@ class MceStateMachine extends StateMachine { Log.d(TAG, "Scheme " + contact.getScheme()); } if (PhoneAccount.SCHEME_TEL.equals(contact.getScheme())) { if (contact.getPath().contains(Telephony.Threads.CONTENT_URI.toString())) { String path = contact.getPath(); if (path != null && path.contains(Telephony.Threads.CONTENT_URI.toString())) { mDatabase.addThreadContactsToEntries(bmsg, contact.getLastPathSegment()); } else { VCardEntry destEntry = new VCardEntry(); Loading Loading @@ -623,7 +624,7 @@ class MceStateMachine extends StateMachine { @Override public void exit() { mDatabase.clearMessages(); mDatabase.cleanUp(); mPreviousState = BluetoothProfile.STATE_CONNECTED; } Loading
android/app/tests/unit/src/com/android/bluetooth/mapclient/MapClientContentTest.java +23 −4 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ public class MapClientContentTest { Assert.assertEquals(2, mMockSmsContentProvider.mContentValues.size()); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockSmsContentProvider.mContentValues.size()); } Loading @@ -191,7 +191,7 @@ public class MapClientContentTest { mMapClientContent.storeMessage(mTestMessage2, mTestMessage1Handle, mTestMessage1Timestamp); Assert.assertEquals(2, mMockMmsContentProvider.mContentValues.size()); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); } Loading @@ -209,7 +209,7 @@ public class MapClientContentTest { mMapClientContent.storeMessage(mTestMessage2, mTestMessage2Handle, mTestMessage1Timestamp); Assert.assertEquals(2, mMockMmsContentProvider.mContentValues.size()); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); } Loading @@ -229,7 +229,7 @@ public class MapClientContentTest { mMapClientContent.markRead(mTestMessage1Handle); mMapClientContent.clearMessages(); mMapClientContent.cleanUp(); Assert.assertEquals(0, mMockMmsContentProvider.mContentValues.size()); } Loading Loading @@ -305,6 +305,25 @@ public class MapClientContentTest { Assert.assertEquals("5551212", mMapClientContent.mPhoneNumber); } /** * Test to validate that some poorly formatted messages don't crash. */ @Test public void testStoreBadMessage() { mMapClientContent = new MapClientContent(mMockContext, mCallbacks, mTestDevice); mTestMessage1 = new Bmessage(); mTestMessage1.setBodyContent("HelloWorld"); mTestMessage1.setType(Bmessage.Type.SMS_GSM); mTestMessage1.setFolder("telecom/msg/sent"); mMapClientContent.storeMessage(mTestMessage1, mTestMessage1Handle, mTestMessage1Timestamp); mTestMessage2 = new Bmessage(); mTestMessage2.setBodyContent("HelloWorld"); mTestMessage2.setType(Bmessage.Type.MMS); mTestMessage2.setFolder("telecom/msg/inbox"); mMapClientContent.storeMessage(mTestMessage2, mTestMessage2Handle, mTestMessage1Timestamp); } void createTestMessages() { mOriginator = new VCardEntry(); VCardProperty property = new VCardProperty(); Loading