From d6b10d559f345eab2dd3dd89b07cfc3fd79c59bc Mon Sep 17 00:00:00 2001 From: wangqi Date: Thu, 12 Apr 2018 14:44:06 -0700 Subject: 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 --- java/com/android/incallui/RttCallPresenter.java | 22 ++++++++++------- java/com/android/incallui/call/CallList.java | 1 + java/com/android/incallui/call/DialerCall.java | 28 ++++++++++++++++++++++ .../android/incallui/rtt/impl/RttChatFragment.java | 3 +++ .../rtt/protocol/RttCallScreenDelegate.java | 2 ++ 5 files changed, 48 insertions(+), 8 deletions(-) (limited to 'java/com/android/incallui') diff --git a/java/com/android/incallui/RttCallPresenter.java b/java/com/android/incallui/RttCallPresenter.java index 5e8390793..21e28cee4 100644 --- a/java/com/android/incallui/RttCallPresenter.java +++ b/java/com/android/incallui/RttCallPresenter.java @@ -63,28 +63,34 @@ public class RttCallPresenter implements RttCallScreenDelegate, InCallStateListe 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 @@ public class RttCallPresenter implements RttCallScreenDelegate, InCallStateListe } 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 eccdceeca..04e02c45b 100644 --- a/java/com/android/incallui/call/CallList.java +++ b/java/com/android/incallui/call/CallList.java @@ -745,6 +745,7 @@ public class CallList implements DialerCallDelegate { 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 3372c0329..5d32f46ad 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.CallIntentParser; 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.DialerImpression; 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.duo.DuoVideoTech; 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 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa 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 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 15baa8cfa..2d70b6b12 100644 --- a/java/com/android/incallui/rtt/impl/RttChatFragment.java +++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java @@ -462,6 +462,9 @@ public class RttChatFragment extends Fragment } 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 8c484a844..990c0759e 100644 --- a/java/com/android/incallui/rtt/protocol/RttCallScreenDelegate.java +++ b/java/com/android/incallui/rtt/protocol/RttCallScreenDelegate.java @@ -26,4 +26,6 @@ public interface RttCallScreenDelegate { void onRttCallScreenUiUnready(); void onLocalMessage(String message); + + void onSaveRttTranscript(); } -- cgit v1.2.3