[RCS]Set missing MSRP headers when sending a message.

Test: by manual
Bug: 179342541
Change-Id: If987aa72c506ffd539ce5c7ffdb5efbbc89b40db
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/javatests/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSessionTest.java b/testapps/TestRcsApp/aosp_test_rcsclient/javatests/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSessionTest.java
index a898189..5c2e995 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/javatests/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSessionTest.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/javatests/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSessionTest.java
@@ -52,7 +52,7 @@
     SipSessionConfiguration configuration =
             new SipSessionConfiguration() {
                 @Override
-                public int getVersion() {
+                public long getVersion() {
                     return 0;
                 }
 
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/cpim/CpimUtils.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/cpim/CpimUtils.java
index 74bcce8..b621257 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/cpim/CpimUtils.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/cpim/CpimUtils.java
@@ -23,6 +23,7 @@
 /** Collections of utility functions for CPIM */
 public class CpimUtils {
     private static final String ANONYMOUS_URI = "<sip:anonymous@anonymous.invalid>";
+    public static final String CPIM_CONTENT_TYPE = "message/cpim";
 
     private CpimUtils() {
     }
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpUtils.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpUtils.java
index 238ce37..c135bc0 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpUtils.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/msrp/MsrpUtils.java
@@ -17,10 +17,13 @@
 package com.android.libraries.rcs.simpleclient.protocol.msrp;
 
 import com.android.libraries.rcs.simpleclient.protocol.sip.SipUtils;
+import java.security.SecureRandom;
 
 /** Collections of utility functions for MSRP */
 public final class MsrpUtils {
 
+    private static final SecureRandom random = new SecureRandom();
+
     private MsrpUtils() {
     }
 
@@ -44,4 +47,14 @@
 
         return builder.toString();
     }
+
+    public static String generateRandomId() {
+        byte[] randomBytes = new byte[8];
+        random.nextBytes(randomBytes);
+        String hex = "";
+        for (byte b : randomBytes) {
+            hex = hex + String.format("%02x", b);
+        }
+        return hex;
+    }
 }
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sdp/SimpleSdpMessage.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sdp/SimpleSdpMessage.java
index 4308ecc..4abbf87 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sdp/SimpleSdpMessage.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sdp/SimpleSdpMessage.java
@@ -147,6 +147,14 @@
         return OptionalInt.of(media().get(0).port());
     }
 
+    public Optional<String> getPath() {
+        if (media().isEmpty()) {
+            return Optional.empty();
+        }
+
+        return Optional.ofNullable(media().get(0).attributes().get("path"));
+    }
+
     /** Encode the entire SDP fields as a string. */
     public String encode() {
         StringBuilder builder = new StringBuilder();
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sip/SipUtils.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sip/SipUtils.java
index 5ce8639..5d0b718 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sip/SipUtils.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/protocol/sip/SipUtils.java
@@ -19,8 +19,6 @@
 import static com.android.libraries.rcs.simpleclient.protocol.sdp.SdpUtils.SDP_CONTENT_SUB_TYPE;
 import static com.android.libraries.rcs.simpleclient.protocol.sdp.SdpUtils.SDP_CONTENT_TYPE;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
-
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -106,7 +104,10 @@
      * @param conversationId The id to be contained in Conversation-ID header.
      */
     public static SIPRequest buildInvite(
-            SipSessionConfiguration configuration, String targetUri, String conversationId)
+            SipSessionConfiguration configuration,
+            String targetUri,
+            String conversationId,
+            byte[] content)
             throws ParseException {
         String address = configuration.getLocalIpAddress();
         int port = configuration.getLocalPort();
@@ -196,13 +197,11 @@
         request.addHeader(
                 sHeaderFactory.createUserAgentHeader(ImmutableList.of(USER_AGENT_HEADER)));
 
-        SimpleSdpMessage sdp = SdpUtils.createSdpForMsrp(address, false);
-        request.setMessageContent(SDP_CONTENT_TYPE, SDP_CONTENT_SUB_TYPE,
-                sdp.encode().getBytes(UTF_8));
+        request.setMessageContent(SDP_CONTENT_TYPE, SDP_CONTENT_SUB_TYPE, content);
 
         if (viaHeader != null && Ascii.equalsIgnoreCase("udp", transport)) {
-            String newTransport = determineTransportBySize(configuration,
-                    request.encodeAsBytes("udp").length);
+            String newTransport =
+                    determineTransportBySize(configuration, request.encodeAsBytes("udp").length);
             if (!Ascii.equalsIgnoreCase(transport, newTransport)) {
                 viaHeader.setTransport(newTransport);
             }
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSession.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSession.java
index 0393063..74472d7 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSession.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/SimpleChatSession.java
@@ -16,6 +16,7 @@
 
 package com.android.libraries.rcs.simpleclient.service.chat;
 
+import static com.android.libraries.rcs.simpleclient.protocol.cpim.CpimUtils.CPIM_CONTENT_TYPE;
 import static com.android.libraries.rcs.simpleclient.service.chat.ChatServiceException.CODE_ERROR_UNSPECIFIED;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
@@ -29,9 +30,14 @@
 import com.android.libraries.rcs.simpleclient.protocol.cpim.CpimUtils;
 import com.android.libraries.rcs.simpleclient.protocol.cpim.SimpleCpimMessage;
 import com.android.libraries.rcs.simpleclient.protocol.msrp.MsrpChunk;
+import com.android.libraries.rcs.simpleclient.protocol.msrp.MsrpChunk.Continuation;
+import com.android.libraries.rcs.simpleclient.protocol.msrp.MsrpConstants;
 import com.android.libraries.rcs.simpleclient.protocol.msrp.MsrpManager;
 import com.android.libraries.rcs.simpleclient.protocol.msrp.MsrpSession;
+import com.android.libraries.rcs.simpleclient.protocol.msrp.MsrpUtils;
+import com.android.libraries.rcs.simpleclient.protocol.sdp.SdpUtils;
 import com.android.libraries.rcs.simpleclient.protocol.sdp.SimpleSdpMessage;
+import com.android.libraries.rcs.simpleclient.protocol.sip.SipSessionConfiguration;
 import com.android.libraries.rcs.simpleclient.protocol.sip.SipUtils;
 import com.android.libraries.rcs.simpleclient.service.chat.ChatServiceException.ErrorCode;
 
@@ -74,6 +80,8 @@
     @Nullable
     private SimpleSdpMessage mRemoteSdp;
     @Nullable
+    private SimpleSdpMessage mLocalSdp;
+    @Nullable
     private MsrpSession mMsrpSession;
     @Nullable
     private ChatSessionListener mListener;
@@ -94,16 +102,27 @@
     /** Send a text message via MSRP session associated with this session. */
     public void sendMessage(String msg) {
         MsrpSession session = mMsrpSession;
-        if (session == null) {
+        if (session == null || mRemoteSdp == null || mLocalSdp == null) {
+            Log.e(TAG, "Session is not established");
             return;
         }
 
         // Build a new CPIM message and send it out through the MSRP session.
         SimpleCpimMessage cpim = CpimUtils.createForText(msg);
+        byte[] content = cpim.encode().getBytes(UTF_8);
         MsrpChunk msrpChunk =
                 MsrpChunk.newBuilder()
                         .method(MsrpChunk.Method.SEND)
-                        .content(cpim.encode().getBytes(UTF_8))
+                        .transactionId(MsrpUtils.generateRandomId())
+                        .content(content)
+                        .continuation(Continuation.COMPLETE)
+                        .addHeader(MsrpConstants.HEADER_TO_PATH, mRemoteSdp.getPath().get())
+                        .addHeader(MsrpConstants.HEADER_FROM_PATH, mLocalSdp.getPath().get())
+                        .addHeader(
+                                MsrpConstants.HEADER_BYTE_RANGE,
+                                String.format("1-%d/%d", content.length, content.length))
+                        .addHeader(MsrpConstants.HEADER_MESSAGE_ID, MsrpUtils.generateRandomId())
+                        .addHeader(MsrpConstants.HEADER_CONTENT_TYPE, CPIM_CONTENT_TYPE)
                         .build();
         Futures.addCallback(
                 session.send(msrpChunk),
@@ -139,12 +158,16 @@
         mStartFuture = future;
         mRemoteUri = SipUtils.createUri(telUriContact);
         try {
+            SipSessionConfiguration configuration = mContext.getSipSession().getSessionConfiguration();
+            SimpleSdpMessage sdp = SdpUtils.createSdpForMsrp(configuration.getLocalIpAddress(), false);
             SIPRequest invite =
                     SipUtils.buildInvite(
-                            mContext.getSipSession().getSessionConfiguration(), telUriContact,
-                            mConversationId);
-            Log.i(TAG, "buildInvite done");
+                            mContext.getSipSession().getSessionConfiguration(),
+                            telUriContact,
+                            mConversationId,
+                            sdp.encode().getBytes(UTF_8));
             mInviteRequest = invite;
+            mLocalSdp = sdp;
             Futures.addCallback(
                     mService.sendSipRequest(invite, this),
                     new FutureCallback<Boolean>() {