Merge "Differentiate between message read on the phone, and on the car." into pi-car-dev am: 2e3cbea03b
am: 4a6a99f171

Change-Id: Id42fbe3be5f94d1011832f61750805d7ac79ea5d
diff --git a/src/com/android/car/messenger/MapMessage.java b/src/com/android/car/messenger/MapMessage.java
index 4eee956..b4b7aee 100644
--- a/src/com/android/car/messenger/MapMessage.java
+++ b/src/com/android/car/messenger/MapMessage.java
@@ -33,7 +33,8 @@
     private String mSenderContactUri;
     private String mMessageText;
     private long mReceiveTime;
-    private boolean mIsRead;
+    private boolean mIsReadOnPhone;
+    private boolean mIsReadOnCar;
 
     /**
      * Constructs a {@link MapMessage} from {@code intent} that was received from MAP service via
@@ -99,7 +100,7 @@
         mSenderContactUri = senderContactUri;
         mSenderName = senderName;
         mReceiveTime = receiveTime;
-        mIsRead = isRead;
+        mIsReadOnPhone = isRead;
     }
 
     /**
@@ -151,14 +152,21 @@
     }
 
     public void markMessageAsRead() {
-        mIsRead = true;
+        mIsReadOnCar = true;
     }
 
     /**
-     * Returns the read status of the message.
+     * Returns {@code true} if message was read on the phone before it was received on the car.
      */
-    public boolean isRead() {
-        return mIsRead;
+    public boolean isReadOnPhone() {
+        return mIsReadOnPhone;
+    }
+
+    /**
+     * Returns {@code true} if message was read on the car.
+     */
+    public boolean isReadOnCar() {
+        return mIsReadOnCar;
     }
 
     @Override
@@ -169,8 +177,9 @@
                 ", mMessageText='" + mMessageText + '\'' +
                 ", mSenderContactUri='" + mSenderContactUri + '\'' +
                 ", mSenderName='" + mSenderName + '\'' +
-                ", mReceiveTime=" + mReceiveTime +
-                ", mIsRead= " + mIsRead +
+                ", mReceiveTime=" + mReceiveTime + '\'' +
+                ", mIsReadOnPhone= " + mIsReadOnPhone + '\'' +
+                ", mIsReadOnCar= " + mIsReadOnCar +
                 "}";
     }
 }
diff --git a/src/com/android/car/messenger/MessengerDelegate.java b/src/com/android/car/messenger/MessengerDelegate.java
index 8c7b382..28eeeee 100644
--- a/src/com/android/car/messenger/MessengerDelegate.java
+++ b/src/com/android/car/messenger/MessengerDelegate.java
@@ -219,7 +219,7 @@
         NotificationInfo info = mNotificationInfos.get(senderKey);
         for (MessageKey key : info.mMessageKeys) {
             MapMessage message = mMessages.get(key);
-            if (!message.isRead()) {
+            if (!message.isReadOnCar()) {
                 message.markMessageAsRead();
                 mSmsDatabaseHandler.addOrUpdate(message);
             }
@@ -359,7 +359,7 @@
                 .setUri(notificationInfo.mSenderContactUri)
                 .build();
         notificationInfo.mMessageKeys.stream().map(mMessages::get).forEachOrdered(message -> {
-            if (!message.isRead()) {
+            if (!message.isReadOnCar()) {
                 messagingStyle.addMessage(
                         message.getMessageText(),
                         message.getReceiveTime(),
diff --git a/src/com/android/car/messenger/SmsDatabaseHandler.java b/src/com/android/car/messenger/SmsDatabaseHandler.java
index b672354..333d8d7 100644
--- a/src/com/android/car/messenger/SmsDatabaseHandler.java
+++ b/src/com/android/car/messenger/SmsDatabaseHandler.java
@@ -168,7 +168,7 @@
         newMessage.put(Telephony.Sms.PERSON,
                 getContactId(mContentResolver,
                         message.getSenderContactUri()));
-        newMessage.put(Telephony.Sms.READ, message.isRead());
+        newMessage.put(Telephony.Sms.READ, (message.isReadOnPhone() || message.isReadOnCar()));
         return newMessage;
     }
 
diff --git a/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java b/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java
index 6e730f0..cf04da3 100644
--- a/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java
+++ b/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java
@@ -94,7 +94,8 @@
         long deviceConnectionTimestamp =
                 mMessengerDelegate.mBTDeviceAddressToConnectionTimestamp.get(BLUETOOTH_ADDRESS_TWO);
 
-        assertThat(deviceConnectionTimestamp).isEqualTo(timestamp);
+        // Sometimes there is slight flakiness in the timestamps.
+        assertThat(deviceConnectionTimestamp-timestamp).isLessThan(5L);
     }
 
     @Test
@@ -195,14 +196,30 @@
         MessengerDelegate.NotificationInfo info = mMessengerDelegate.mNotificationInfos.get(
                 mSenderKey);
         MessengerDelegate.MessageKey key = info.mMessageKeys.get(0);
-        assertThat(mMessengerDelegate.mMessages.get(key).isRead()).isTrue();
+        assertThat(mMessengerDelegate.mMessages.get(key).isReadOnCar()).isTrue();
+    }
+
+    @Test
+    public void testMessageReadOnPhone() {
+        Intent readMessageIntent = createMessageIntent(mMockBluetoothDeviceOne, "mockHandle",
+                "510-111-2222", "testSender",
+                "Hello", /* timestamp= */ System.currentTimeMillis() + 10000L,
+                /* isReadOnPhone */ true);
+        mMessengerDelegate.onMessageReceived(readMessageIntent);
+
+        MessengerDelegate.NotificationInfo info = mMessengerDelegate.mNotificationInfos.get(
+                mSenderKey);
+        MessengerDelegate.MessageKey key = info.mMessageKeys.get(0);
+        assertThat(mMessengerDelegate.mMessages.get(key).isReadOnCar()).isFalse();
+        assertThat(mMessengerDelegate.mMessages.get(key).isReadOnPhone()).isTrue();
     }
 
     @Test
     public void testNotificationsNotShownForExistingMessages() {
         Intent existingMessageIntent = createMessageIntent(mMockBluetoothDeviceTwo, "mockHandle",
                 "510-111-2222", "testSender",
-                "Hello", /* timestamp= */ System.currentTimeMillis() - 10000L);
+                "Hello", /* timestamp= */ System.currentTimeMillis() - 10000L,
+                /* isReadOnPhone */ false);
         mMessengerDelegate.onDeviceConnected(mMockBluetoothDeviceTwo);
 
         mMessengerDelegate.onMessageReceived(existingMessageIntent);
@@ -212,13 +229,14 @@
     }
 
     private Intent createMessageIntent(BluetoothDevice device, String handle, String senderUri,
-            String senderName, String messageText, Long timestamp) {
+            String senderName, String messageText, Long timestamp, boolean isReadOnPhone) {
         Intent intent = new Intent();
         intent.setAction(BluetoothMapClient.ACTION_MESSAGE_RECEIVED);
         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
         intent.putExtra(BluetoothMapClient.EXTRA_MESSAGE_HANDLE, handle);
         intent.putExtra(BluetoothMapClient.EXTRA_SENDER_CONTACT_URI, senderUri);
         intent.putExtra(BluetoothMapClient.EXTRA_SENDER_CONTACT_NAME, senderName);
+        intent.putExtra(BluetoothMapClient.EXTRA_MESSAGE_READ_STATUS, isReadOnPhone);
         intent.putExtra(android.content.Intent.EXTRA_TEXT, messageText);
         if (timestamp != null) {
             intent.putExtra(BluetoothMapClient.EXTRA_MESSAGE_TIMESTAMP, timestamp);
@@ -240,7 +258,7 @@
     private void createMockMessages() {
         mMessageOneIntent= createMessageIntent(mMockBluetoothDeviceOne, "mockHandle",
                 "510-111-2222", "testSender",
-                "Hello", /* timestamp= */ null);
+                "Hello", /* timestamp= */ null, /* isReadOnPhone */ false);
         mMessageOne = MapMessage.parseFrom(mMessageOneIntent);
         mMessageOneKey = new MessengerDelegate.MessageKey(mMessageOne);
         mSenderKey = new MessengerDelegate.SenderKey(mMessageOne);