Fix incoming chat session

- Added branch param in BYE
- Added missing required headers in INVITE response
- Save the local sdp for an incoming session
- Added SIP and CPIM logs

Bug: 181276359
Bug: 181347346
Test: manual
Change-Id: I523802c8f33336428cbabba2d698f085cfb7005a
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 7605fb5..13fa53a 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
@@ -54,6 +54,7 @@
 import javax.sip.address.SipURI;
 import javax.sip.address.URI;
 import javax.sip.header.ContactHeader;
+import javax.sip.header.Header;
 import javax.sip.header.HeaderFactory;
 import javax.sip.header.ViaHeader;
 import javax.sip.message.Request;
@@ -262,6 +263,7 @@
 
         Via via = (Via) invite.getTopmostVia().clone();
         via.removeParameter("branch");
+        via.setBranch(Utils.getInstance().generateBranchId());
         request.addHeader(via);
         request.addHeader(
                 sHeaderFactory.createFromHeader(invite.getFrom().getAddress(),
@@ -290,6 +292,27 @@
         if (code == Response.OK) {
             response.setMessageContent(SDP_CONTENT_TYPE, SDP_CONTENT_SUB_TYPE, sdp.encode());
         }
+        response.setToTag(Utils.getInstance().generateTag());
+
+        // Set a Contact header.
+        response.setHeader(generateContactHeader(configuration));
+
+        // Set Conversation-ID and Contribution-ID
+        Header conversationIdHeader = invite.getHeader(CONVERSATION_ID_HEADER_NAME);
+        if (conversationIdHeader != null) {
+            response.setHeader((Header) conversationIdHeader.clone());
+        }
+        Header contributionIdHeader = invite.getHeader(CONTRIBUTION_ID_HEADER_NAME);
+        if (conversationIdHeader != null) {
+            response.setHeader((Header) contributionIdHeader.clone());
+        }
+
+        // Set P-Preferred-Identity
+        List<String> associatedUris = configuration.getAssociatedUris();
+        String preferredUri = Iterables.getFirst(associatedUris,
+                configuration.getPublicUserIdentity());
+        response.setHeader(
+                sHeaderFactory.createHeader(PPreferredIdentityHeader.NAME, preferredUri));
 
         // Set PANI and PLANI if exists
         if (configuration.getPaniHeader() != null) {
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/MinimalCpmChatService.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/MinimalCpmChatService.java
index b204de6..4b913f7 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/MinimalCpmChatService.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/service/chat/MinimalCpmChatService.java
@@ -54,7 +54,7 @@
 public class MinimalCpmChatService implements ImsService {
     public static final String CPM_SESSION_TAG =
             "+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.session\"";
-    private static final String TAG = SimpleChatSession.class.getSimpleName();
+    private static final String TAG = MinimalCpmChatService.class.getSimpleName();
     private final Map<String, SimpleChatSession> mTransactions = new HashMap<>();
     private final Map<String, SimpleChatSession> mDialogs = new HashMap<>();
 
@@ -112,7 +112,7 @@
     }
 
     ListenableFuture<Boolean> sendSipRequest(SIPRequest msg, SimpleChatSession session) {
-        Log.i(TAG, "sendSipRequest");
+        Log.i(TAG, "sendSipRequest:\r\n" + msg);
         if (!TextUtils.equals(msg.getMethod(), Request.ACK)) {
             mTransactions.put(msg.getTransactionId(), session);
         }
@@ -126,7 +126,7 @@
     }
 
     ListenableFuture<Boolean> sendSipResponse(SIPResponse msg, SimpleChatSession session) {
-        Log.i(TAG, "sendSipRequest");
+        Log.i(TAG, "sendSipResponse:\r\n" + msg);
         if (TextUtils.equals(msg.getCSeq().getMethod(), Request.BYE)) {
             mDialogs.remove(msg.getDialogId(/* isServer= */ true));
         } else if (TextUtils.equals(msg.getCSeq().getMethod(), Request.INVITE)
@@ -139,6 +139,7 @@
     }
 
     private void handleRequest(SIPRequest request) {
+        Log.i(TAG, "handleRequest:\r\n" + request);
         String dialogId = request.getDialogId(/* isServer= */ true);
         if (mDialogs.containsKey(dialogId)) {
             SimpleChatSession session = mDialogs.get(dialogId);
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 f66e230..4cc474c 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
@@ -167,8 +167,10 @@
         mStartFuture = future;
         mRemoteUri = SipUtils.createUri(telUriContact);
         try {
-            SipSessionConfiguration configuration = mContext.getSipSession().getSessionConfiguration();
-            SimpleSdpMessage sdp = SdpUtils.createSdpForMsrp(configuration.getLocalIpAddress(), false);
+            SipSessionConfiguration configuration =
+                    mContext.getSipSession().getSessionConfiguration();
+            SimpleSdpMessage sdp = SdpUtils.createSdpForMsrp(configuration.getLocalIpAddress(),
+                    false);
             SIPRequest invite =
                     SipUtils.buildInvite(
                             mContext.getSipSession().getSessionConfiguration(),
@@ -229,6 +231,7 @@
         try {
             SIPResponse response = SipUtils.buildInviteResponse(configuration, invite, statusCode,
                     sdp);
+            mLocalSdp = sdp;
             return Futures.transform(
                     mService.sendSipResponse(response, this), result -> null,
                     MoreExecutors.directExecutor());
@@ -467,6 +470,7 @@
 
         String contentType = contentTypeHeader.value();
         if ("message/cpim".equals(contentType)) {
+            Log.d(TAG, "Received CPIM: " + new String(chunk.content(), UTF_8));
             try {
                 SimpleCpimMessage cpim = SimpleCpimMessage.parse(chunk.content());
                 if (mListener != null) {