Add RTT transcript to call details.

1. Save RTT transcript when call is destroyed
2. Show RTT transcript link when it's available

Bug: 67596257,77717594
Test: manual
PiperOrigin-RevId: 192673172
Change-Id: If541ad9137c965166548d2fb449e835b95566727
diff --git a/java/com/android/incallui/RttCallPresenter.java b/java/com/android/incallui/RttCallPresenter.java
index 5e83907..21e28ce 100644
--- a/java/com/android/incallui/RttCallPresenter.java
+++ b/java/com/android/incallui/RttCallPresenter.java
@@ -63,28 +63,34 @@
     LogUtil.enterBlock("RttCallPresenter.onRttCallScreenUiReady");
     InCallPresenter.getInstance().addListener(this);
     startListenOnRemoteMessage();
-    DialerCall call = CallList.getInstance().getActiveCall();
+    DialerCall call = CallList.getInstance().getCallById(rttCallScreen.getCallId());
     if (call != null) {
       rttCallScreen.onRestoreRttChat(call.getRttTranscript());
     }
   }
 
   @Override
+  public void onSaveRttTranscript() {
+    LogUtil.enterBlock("RttCallPresenter.onSaveRttTranscript");
+    DialerCall call = CallList.getInstance().getCallById(rttCallScreen.getCallId());
+    if (call != null) {
+      saveTranscript(call);
+    }
+  }
+
+  @Override
   public void onRttCallScreenUiUnready() {
     LogUtil.enterBlock("RttCallPresenter.onRttCallScreenUiUnready");
     InCallPresenter.getInstance().removeListener(this);
     stopListenOnRemoteMessage();
-    DialerCall call = CallList.getInstance().getActiveCall();
-    if (call != null) {
-      saveTranscript(call);
-    }
+    onSaveRttTranscript();
   }
 
   private void saveTranscript(DialerCall dialerCall) {
     LogUtil.enterBlock("RttCallPresenter.saveTranscript");
     RttTranscript.Builder builder = RttTranscript.newBuilder();
     builder
-        .setId(dialerCall.getNumber() + dialerCall.getCreationTimeMillis())
+        .setId(String.valueOf(dialerCall.getCreationTimeMillis()))
         .setTimestamp(dialerCall.getCreationTimeMillis())
         .setNumber(dialerCall.getNumber())
         .addAllMessages(rttCallScreen.getRttTranscriptMessageList());
@@ -100,9 +106,9 @@
   }
 
   private void startListenOnRemoteMessage() {
-    DialerCall call = CallList.getInstance().getActiveCall();
+    DialerCall call = CallList.getInstance().getCallById(rttCallScreen.getCallId());
     if (call == null) {
-      LogUtil.i("RttCallPresenter.startListenOnRemoteMessage", "call is not active yet");
+      LogUtil.i("RttCallPresenter.startListenOnRemoteMessage", "call does not exist");
       return;
     }
     rttCall = call.getRttCall();
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index eccdcee..04e02c4 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -745,6 +745,7 @@
     call.setState(DialerCall.State.IDLE);
     updateCallInMap(call);
     notifyGenericListeners();
+    call.onDestroy();
   }
 
   /**
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 3372c03..5d32f46 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -57,6 +57,8 @@
 import com.android.dialer.callintent.CallSpecificAppData;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DefaultFutureCallback;
+import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.duo.DuoComponent;
@@ -74,6 +76,7 @@
 import com.android.dialer.logging.Logger;
 import com.android.dialer.preferredsim.PreferredAccountRecorder;
 import com.android.dialer.rtt.RttTranscript;
+import com.android.dialer.rtt.RttTranscriptUtil;
 import com.android.dialer.telecom.TelecomCallUtil;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.theme.R;
@@ -86,6 +89,9 @@
 import com.android.incallui.videotech.empty.EmptyVideoTech;
 import com.android.incallui.videotech.ims.ImsVideoTech;
 import com.android.incallui.videotech.utils.VideoUtils;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -536,6 +542,28 @@
     return countryIso;
   }
 
+  /**
+   * Called when call is disconnected and removed from {@link CallList}, UI may already be destroyed
+   * at this point. This is last chance to do something for the call.
+   */
+  public void onDestroy() {
+    LogUtil.enterBlock("DialerCall.onDestroy");
+    if (rttTranscript != null) {
+      RttTranscript rttTranscriptToSave = rttTranscript;
+      ListenableFuture<Void> future =
+          DialerExecutorComponent.get(context)
+              .backgroundExecutor()
+              .submit(
+                  () -> {
+                    new RttTranscriptUtil(context).saveRttTranscript(rttTranscriptToSave);
+                    return null;
+                  });
+      Futures.addCallback(future, new DefaultFutureCallback<>(), MoreExecutors.directExecutor());
+      // Sets to null so it won't be saved again when called multiple times.
+      rttTranscript = null;
+    }
+  }
+
   private void updateIsVoiceMailNumber() {
     if (getHandle() != null && PhoneAccount.SCHEME_VOICEMAIL.equals(getHandle().getScheme())) {
       isVoicemailNumber = true;
diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java
index 15baa8c..2d70b6b 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -462,6 +462,9 @@
     } else {
       hideWaitingForJoinBanner();
     }
+    if (primaryCallState.state() == State.DISCONNECTED) {
+      rttCallScreenDelegate.onSaveRttTranscript();
+    }
   }
 
   private void showWaitingForJoinBanner() {
diff --git a/java/com/android/incallui/rtt/protocol/RttCallScreenDelegate.java b/java/com/android/incallui/rtt/protocol/RttCallScreenDelegate.java
index 8c484a8..990c075 100644
--- a/java/com/android/incallui/rtt/protocol/RttCallScreenDelegate.java
+++ b/java/com/android/incallui/rtt/protocol/RttCallScreenDelegate.java
@@ -26,4 +26,6 @@
   void onRttCallScreenUiUnready();
 
   void onLocalMessage(String message);
+
+  void onSaveRttTranscript();
 }