Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12e30319 authored by Christine Hallstrom's avatar Christine Hallstrom Committed by David Duarte
Browse files

Don't send MAP SMS/MMS messages older than one year

If SMS or MMS message is greater than one year old, skip sending the
message event. Switch Mms.DATE field to milliseconds since it is stored
by telephony in seconds: https://source.corp.google.com/tm-dev/packages/services/Mms/src/com/android/mms/service/MmsService.java;l=810?q=mms.date%20seconds

Bug: 196731316
Bug: 264913373
Test: QA, manual send and receive SMS and MMS messages on carkit
Change-Id: I811089b5546e4b2c51399b2e94cf7aa75377fb2e
(cherry picked from commit aae20216)
parent c3ac3a67
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -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 {
@@ -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 = "";
@@ -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) {
@@ -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 */
@@ -1681,6 +1695,7 @@ public class BluetoothMapContentObserver {
                                evt = new Event(EVENT_TYPE_NEW, id, getMmsFolderName(type), null,
                                        TYPE.MMS);
                            }
                            listChanged = true;

                            sendEvent(evt);
                        } else {
+15 −0
Original line number Diff line number Diff line
@@ -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) {
+67 −7
Original line number Diff line number Diff line
@@ -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)
@@ -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;
@@ -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<>();
@@ -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<>();
@@ -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());
@@ -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());
@@ -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,
@@ -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());

@@ -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());

@@ -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,