Loading android/app/src/com/android/bluetooth/map/BluetoothMapContentObserver.java +20 −5 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; @TargetApi(19) public class BluetoothMapContentObserver { Loading Loading @@ -1467,8 +1468,14 @@ public class BluetoothMapContentObserver { if (mTransmitEvents && // extract contact details only if needed mMapEventReportVersion > BluetoothMapUtils.MAP_EVENT_REPORT_V10) { String date = BluetoothMapUtils.getDateTimeString( c.getLong(c.getColumnIndex(Sms.DATE))); long timestamp = c.getLong(c.getColumnIndex(Sms.DATE)); String date = BluetoothMapUtils.getDateTimeString(timestamp); if (BluetoothMapUtils.isDateTimeOlderThanOneYear(timestamp)) { // Skip sending message events older than one year listChanged = false; msgListSms.remove(id); continue; } String subject = c.getString(c.getColumnIndex(Sms.BODY)); if (subject == null) { subject = ""; Loading Loading @@ -1627,7 +1634,6 @@ public class BluetoothMapContentObserver { if (msg == null) { /* New message - only notify on retrieve conf */ listChanged = true; if (getMmsFolderName(type).equalsIgnoreCase( BluetoothMapContract.FOLDER_NAME_INBOX) && mtype != MESSAGE_TYPE_RETRIEVE_CONF) { Loading @@ -1639,8 +1645,16 @@ public class BluetoothMapContentObserver { if (mTransmitEvents && // extract contact details only if needed mMapEventReportVersion != BluetoothMapUtils.MAP_EVENT_REPORT_V10) { String date = BluetoothMapUtils.getDateTimeString( // MMS date field is in seconds long timestamp = TimeUnit.SECONDS.toMillis( c.getLong(c.getColumnIndex(Mms.DATE))); String date = BluetoothMapUtils.getDateTimeString(timestamp); if (BluetoothMapUtils.isDateTimeOlderThanOneYear(timestamp)) { // Skip sending new message events older than one year msgListMms.remove(id); continue; } String subject = c.getString(c.getColumnIndex(Mms.SUBJECT)); if (subject == null || subject.length() == 0) { /* Get subject from mms text body parts - if any exists */ Loading Loading @@ -1681,6 +1695,7 @@ public class BluetoothMapContentObserver { evt = new Event(EVENT_TYPE_NEW, id, getMmsFolderName(type), null, TYPE.MMS); } listChanged = true; sendEvent(evt); } else { Loading android/app/src/com/android/bluetooth/map/BluetoothMapUtils.java +15 −0 Original line number Diff line number Diff line Loading @@ -677,6 +677,21 @@ public class BluetoothMapUtils { return format.format(cal.getTime()); } static boolean isDateTimeOlderThanOneYear(long timestamp) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(timestamp); Calendar oneYearAgo = Calendar.getInstance(); oneYearAgo.add(Calendar.YEAR, -1); if (cal.before(oneYearAgo)) { if (V) { Log.v(TAG, "isDateTimeOlderThanOneYear " + cal.getTimeInMillis() + " oneYearAgo: " + oneYearAgo.getTimeInMillis()); } return true; } return false; } static void savePeerSupportUtcTimeStamp(int remoteFeatureMask) { if ((remoteFeatureMask & MAP_FEATURE_DEFINED_TIMESTAMP_FORMAT_BIT) == MAP_FEATURE_DEFINED_TIMESTAMP_FORMAT_BIT) { Loading android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentObserverTest.java +67 −7 Original line number Diff line number Diff line Loading @@ -64,9 +64,11 @@ import org.mockito.Spy; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.concurrent.TimeUnit; @MediumTest @RunWith(AndroidJUnit4.class) Loading @@ -89,7 +91,8 @@ public class BluetoothMapContentObserverTest { static final long TEST_OLD_FOLDER_ID = 6; static final int TEST_READ_FLAG_ONE = 1; static final int TEST_READ_FLAG_ZERO = 0; static final long TEST_DATE = 1; static final long TEST_DATE_MS = Calendar.getInstance().getTimeInMillis(); static final long TEST_DATE_SEC = TimeUnit.MILLISECONDS.toSeconds(TEST_DATE_MS); static final String TEST_SUBJECT = "subject"; static final int TEST_MMS_MTYPE = 1; static final int TEST_MMS_TYPE_ALL = Telephony.BaseMmsColumns.MESSAGE_BOX_ALL; Loading Loading @@ -943,7 +946,7 @@ public class BluetoothMapContentObserverTest { BluetoothMapContract.MessageColumns.FROM_LIST, BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_INBOX_FOLDER_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_ADDRESS, 1}); TEST_DATE_MS, TEST_SUBJECT, TEST_ADDRESS, 1}); when(mProviderClient.query(any(), any(), any(), any(), any())).thenReturn(cursor); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); Loading Loading @@ -981,7 +984,7 @@ public class BluetoothMapContentObserverTest { BluetoothMapContract.MessageColumns.THREAD_ID, BluetoothMapContract.MessageColumns.THREAD_NAME}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_INBOX_FOLDER_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_ADDRESS, 1, 1, "threadName"}); TEST_DATE_MS, TEST_SUBJECT, TEST_ADDRESS, 1, 1, "threadName"}); when(mProviderClient.query(any(), any(), any(), any(), any())).thenReturn(cursor); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); Loading Loading @@ -1174,7 +1177,7 @@ public class BluetoothMapContentObserverTest { Mms.MESSAGE_TYPE, Mms.THREAD_ID, Mms.READ, Mms.DATE, Mms.SUBJECT, Mms.PRIORITY, Mms.Addr.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_MMS_TYPE_ALL, TEST_MMS_MTYPE, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE_SEC, TEST_SUBJECT, PduHeaders.PRIORITY_HIGH, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading Loading @@ -1204,7 +1207,7 @@ public class BluetoothMapContentObserverTest { Mms.MESSAGE_TYPE, Mms.THREAD_ID, Mms.READ, Mms.DATE, Mms.SUBJECT, Mms.PRIORITY, Mms.Addr.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_MMS_TYPE_ALL, TEST_MMS_MTYPE, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE_SEC, TEST_SUBJECT, PduHeaders.PRIORITY_HIGH, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading @@ -1228,6 +1231,36 @@ public class BluetoothMapContentObserverTest { TEST_READ_FLAG_ONE); } @Test public void handleMsgListChangesMms_withNonExistingOldMessage_andVersion12() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -1); cal.add(Calendar.DATE, -1); long timestampSec = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis()); MatrixCursor cursor = new MatrixCursor(new String[] {Mms._ID, Mms.MESSAGE_BOX, Mms.MESSAGE_TYPE, Mms.THREAD_ID, Mms.READ, Mms.DATE, Mms.SUBJECT, Mms.PRIORITY, Mms.Addr.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_MMS_TYPE_ALL, TEST_MMS_MTYPE, TEST_THREAD_ID, TEST_READ_FLAG_ONE, timestampSec, TEST_SUBJECT, PduHeaders.PRIORITY_HIGH, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); // Giving a different handle for msg below and cursor above makes handleMsgListChangesMms() // function for a non-existing message BluetoothMapContentObserver.Msg msg = new BluetoothMapContentObserver.Msg(TEST_HANDLE_TWO, TEST_INBOX_FOLDER_ID, TEST_READ_FLAG_ONE); map.put(TEST_HANDLE_TWO, msg); mObserver.setMsgListMms(map, true); mObserver.mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V12; mObserver.handleMsgListChangesMms(); Assert.assertEquals(mObserver.getMsgListMms().get(TEST_HANDLE_ONE), null); } @Test public void handleMsgListChangesMms_withNonExistingMessage_andVersion10() { MatrixCursor cursor = new MatrixCursor(new String[] {Mms._ID, Mms.MESSAGE_BOX, Loading Loading @@ -1378,7 +1411,7 @@ public class BluetoothMapContentObserverTest { MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Sms.READ, Sms.DATE, Sms.BODY, Sms.ADDRESS, ContactsContract.Contacts.DISPLAY_NAME}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_SMS_TYPE_INBOX, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_ADDRESS, null}); TEST_READ_FLAG_ONE, TEST_DATE_MS, TEST_SUBJECT, TEST_ADDRESS, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading Loading @@ -1407,7 +1440,7 @@ public class BluetoothMapContentObserverTest { MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Sms.READ, Sms.DATE, Sms.BODY, Sms.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_SMS_TYPE_ALL, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, "", null}); TEST_READ_FLAG_ONE, TEST_DATE_MS, "", null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading @@ -1431,6 +1464,33 @@ public class BluetoothMapContentObserverTest { TEST_READ_FLAG_ONE); } @Test public void handleMsgListChangesSms_withNonExistingOldMessage_andVersion12() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -1); cal.add(Calendar.DATE, -1); MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Sms.READ, Sms.DATE, Sms.BODY, Sms.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_SMS_TYPE_ALL, TEST_THREAD_ID, TEST_READ_FLAG_ONE, cal.getTimeInMillis(), "", null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); // Giving a different handle for msg below and cursor above makes handleMsgListChangesMms() // function for a non-existing message BluetoothMapContentObserver.Msg msg = new BluetoothMapContentObserver.Msg(TEST_HANDLE_TWO, TEST_SMS_TYPE_INBOX, TEST_READ_FLAG_ONE); map.put(TEST_HANDLE_TWO, msg); mObserver.setMsgListSms(map, true); mObserver.mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V12; mObserver.handleMsgListChangesSms(); Assert.assertEquals(mObserver.getMsgListSms().get(TEST_HANDLE_ONE), null); } @Test public void handleMsgListChangesSms_withNonExistingMessage_andVersion10() { MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Loading Loading
android/app/src/com/android/bluetooth/map/BluetoothMapContentObserver.java +20 −5 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; @TargetApi(19) public class BluetoothMapContentObserver { Loading Loading @@ -1467,8 +1468,14 @@ public class BluetoothMapContentObserver { if (mTransmitEvents && // extract contact details only if needed mMapEventReportVersion > BluetoothMapUtils.MAP_EVENT_REPORT_V10) { String date = BluetoothMapUtils.getDateTimeString( c.getLong(c.getColumnIndex(Sms.DATE))); long timestamp = c.getLong(c.getColumnIndex(Sms.DATE)); String date = BluetoothMapUtils.getDateTimeString(timestamp); if (BluetoothMapUtils.isDateTimeOlderThanOneYear(timestamp)) { // Skip sending message events older than one year listChanged = false; msgListSms.remove(id); continue; } String subject = c.getString(c.getColumnIndex(Sms.BODY)); if (subject == null) { subject = ""; Loading Loading @@ -1627,7 +1634,6 @@ public class BluetoothMapContentObserver { if (msg == null) { /* New message - only notify on retrieve conf */ listChanged = true; if (getMmsFolderName(type).equalsIgnoreCase( BluetoothMapContract.FOLDER_NAME_INBOX) && mtype != MESSAGE_TYPE_RETRIEVE_CONF) { Loading @@ -1639,8 +1645,16 @@ public class BluetoothMapContentObserver { if (mTransmitEvents && // extract contact details only if needed mMapEventReportVersion != BluetoothMapUtils.MAP_EVENT_REPORT_V10) { String date = BluetoothMapUtils.getDateTimeString( // MMS date field is in seconds long timestamp = TimeUnit.SECONDS.toMillis( c.getLong(c.getColumnIndex(Mms.DATE))); String date = BluetoothMapUtils.getDateTimeString(timestamp); if (BluetoothMapUtils.isDateTimeOlderThanOneYear(timestamp)) { // Skip sending new message events older than one year msgListMms.remove(id); continue; } String subject = c.getString(c.getColumnIndex(Mms.SUBJECT)); if (subject == null || subject.length() == 0) { /* Get subject from mms text body parts - if any exists */ Loading Loading @@ -1681,6 +1695,7 @@ public class BluetoothMapContentObserver { evt = new Event(EVENT_TYPE_NEW, id, getMmsFolderName(type), null, TYPE.MMS); } listChanged = true; sendEvent(evt); } else { Loading
android/app/src/com/android/bluetooth/map/BluetoothMapUtils.java +15 −0 Original line number Diff line number Diff line Loading @@ -677,6 +677,21 @@ public class BluetoothMapUtils { return format.format(cal.getTime()); } static boolean isDateTimeOlderThanOneYear(long timestamp) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(timestamp); Calendar oneYearAgo = Calendar.getInstance(); oneYearAgo.add(Calendar.YEAR, -1); if (cal.before(oneYearAgo)) { if (V) { Log.v(TAG, "isDateTimeOlderThanOneYear " + cal.getTimeInMillis() + " oneYearAgo: " + oneYearAgo.getTimeInMillis()); } return true; } return false; } static void savePeerSupportUtcTimeStamp(int remoteFeatureMask) { if ((remoteFeatureMask & MAP_FEATURE_DEFINED_TIMESTAMP_FORMAT_BIT) == MAP_FEATURE_DEFINED_TIMESTAMP_FORMAT_BIT) { Loading
android/app/tests/unit/src/com/android/bluetooth/map/BluetoothMapContentObserverTest.java +67 −7 Original line number Diff line number Diff line Loading @@ -64,9 +64,11 @@ import org.mockito.Spy; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.concurrent.TimeUnit; @MediumTest @RunWith(AndroidJUnit4.class) Loading @@ -89,7 +91,8 @@ public class BluetoothMapContentObserverTest { static final long TEST_OLD_FOLDER_ID = 6; static final int TEST_READ_FLAG_ONE = 1; static final int TEST_READ_FLAG_ZERO = 0; static final long TEST_DATE = 1; static final long TEST_DATE_MS = Calendar.getInstance().getTimeInMillis(); static final long TEST_DATE_SEC = TimeUnit.MILLISECONDS.toSeconds(TEST_DATE_MS); static final String TEST_SUBJECT = "subject"; static final int TEST_MMS_MTYPE = 1; static final int TEST_MMS_TYPE_ALL = Telephony.BaseMmsColumns.MESSAGE_BOX_ALL; Loading Loading @@ -943,7 +946,7 @@ public class BluetoothMapContentObserverTest { BluetoothMapContract.MessageColumns.FROM_LIST, BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_INBOX_FOLDER_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_ADDRESS, 1}); TEST_DATE_MS, TEST_SUBJECT, TEST_ADDRESS, 1}); when(mProviderClient.query(any(), any(), any(), any(), any())).thenReturn(cursor); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); Loading Loading @@ -981,7 +984,7 @@ public class BluetoothMapContentObserverTest { BluetoothMapContract.MessageColumns.THREAD_ID, BluetoothMapContract.MessageColumns.THREAD_NAME}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_INBOX_FOLDER_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_ADDRESS, 1, 1, "threadName"}); TEST_DATE_MS, TEST_SUBJECT, TEST_ADDRESS, 1, 1, "threadName"}); when(mProviderClient.query(any(), any(), any(), any(), any())).thenReturn(cursor); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); Loading Loading @@ -1174,7 +1177,7 @@ public class BluetoothMapContentObserverTest { Mms.MESSAGE_TYPE, Mms.THREAD_ID, Mms.READ, Mms.DATE, Mms.SUBJECT, Mms.PRIORITY, Mms.Addr.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_MMS_TYPE_ALL, TEST_MMS_MTYPE, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE_SEC, TEST_SUBJECT, PduHeaders.PRIORITY_HIGH, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading Loading @@ -1204,7 +1207,7 @@ public class BluetoothMapContentObserverTest { Mms.MESSAGE_TYPE, Mms.THREAD_ID, Mms.READ, Mms.DATE, Mms.SUBJECT, Mms.PRIORITY, Mms.Addr.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_MMS_TYPE_ALL, TEST_MMS_MTYPE, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE_SEC, TEST_SUBJECT, PduHeaders.PRIORITY_HIGH, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading @@ -1228,6 +1231,36 @@ public class BluetoothMapContentObserverTest { TEST_READ_FLAG_ONE); } @Test public void handleMsgListChangesMms_withNonExistingOldMessage_andVersion12() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -1); cal.add(Calendar.DATE, -1); long timestampSec = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis()); MatrixCursor cursor = new MatrixCursor(new String[] {Mms._ID, Mms.MESSAGE_BOX, Mms.MESSAGE_TYPE, Mms.THREAD_ID, Mms.READ, Mms.DATE, Mms.SUBJECT, Mms.PRIORITY, Mms.Addr.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_MMS_TYPE_ALL, TEST_MMS_MTYPE, TEST_THREAD_ID, TEST_READ_FLAG_ONE, timestampSec, TEST_SUBJECT, PduHeaders.PRIORITY_HIGH, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); // Giving a different handle for msg below and cursor above makes handleMsgListChangesMms() // function for a non-existing message BluetoothMapContentObserver.Msg msg = new BluetoothMapContentObserver.Msg(TEST_HANDLE_TWO, TEST_INBOX_FOLDER_ID, TEST_READ_FLAG_ONE); map.put(TEST_HANDLE_TWO, msg); mObserver.setMsgListMms(map, true); mObserver.mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V12; mObserver.handleMsgListChangesMms(); Assert.assertEquals(mObserver.getMsgListMms().get(TEST_HANDLE_ONE), null); } @Test public void handleMsgListChangesMms_withNonExistingMessage_andVersion10() { MatrixCursor cursor = new MatrixCursor(new String[] {Mms._ID, Mms.MESSAGE_BOX, Loading Loading @@ -1378,7 +1411,7 @@ public class BluetoothMapContentObserverTest { MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Sms.READ, Sms.DATE, Sms.BODY, Sms.ADDRESS, ContactsContract.Contacts.DISPLAY_NAME}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_SMS_TYPE_INBOX, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, TEST_SUBJECT, TEST_ADDRESS, null}); TEST_READ_FLAG_ONE, TEST_DATE_MS, TEST_SUBJECT, TEST_ADDRESS, null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading Loading @@ -1407,7 +1440,7 @@ public class BluetoothMapContentObserverTest { MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Sms.READ, Sms.DATE, Sms.BODY, Sms.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_SMS_TYPE_ALL, TEST_THREAD_ID, TEST_READ_FLAG_ONE, TEST_DATE, "", null}); TEST_READ_FLAG_ONE, TEST_DATE_MS, "", null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Loading @@ -1431,6 +1464,33 @@ public class BluetoothMapContentObserverTest { TEST_READ_FLAG_ONE); } @Test public void handleMsgListChangesSms_withNonExistingOldMessage_andVersion12() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -1); cal.add(Calendar.DATE, -1); MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Sms.READ, Sms.DATE, Sms.BODY, Sms.ADDRESS}); cursor.addRow(new Object[] {TEST_HANDLE_ONE, TEST_SMS_TYPE_ALL, TEST_THREAD_ID, TEST_READ_FLAG_ONE, cal.getTimeInMillis(), "", null}); doReturn(cursor).when(mMapMethodProxy).contentResolverQuery(any(), any(), any(), any(), any(), any()); Map<Long, BluetoothMapContentObserver.Msg> map = new HashMap<>(); // Giving a different handle for msg below and cursor above makes handleMsgListChangesMms() // function for a non-existing message BluetoothMapContentObserver.Msg msg = new BluetoothMapContentObserver.Msg(TEST_HANDLE_TWO, TEST_SMS_TYPE_INBOX, TEST_READ_FLAG_ONE); map.put(TEST_HANDLE_TWO, msg); mObserver.setMsgListSms(map, true); mObserver.mMapEventReportVersion = BluetoothMapUtils.MAP_EVENT_REPORT_V12; mObserver.handleMsgListChangesSms(); Assert.assertEquals(mObserver.getMsgListSms().get(TEST_HANDLE_ONE), null); } @Test public void handleMsgListChangesSms_withNonExistingMessage_andVersion10() { MatrixCursor cursor = new MatrixCursor(new String[] {Sms._ID, Sms.TYPE, Sms.THREAD_ID, Loading