[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>() {