summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSekine Yasuaki <yasuaki.sekine@sony.com>2017-07-07 17:01:56 +0900
committerMichael Bestas <mkbestas@lineageos.org>2020-05-24 20:09:50 +0300
commitd1341b4f02d3ce4b4b996895d3da8e6a841bf934 (patch)
tree9c73919defb95791c8402f0ca1d6116d91705378
parenta0c5bdd1a071cc593e7d67f3a48274ab5f852c8b (diff)
downloadandroid_packages_apps_Dialer-d1341b4f02d3ce4b4b996895d3da8e6a841bf934.tar.gz
android_packages_apps_Dialer-d1341b4f02d3ce4b4b996895d3da8e6a841bf934.tar.bz2
android_packages_apps_Dialer-d1341b4f02d3ce4b4b996895d3da8e6a841bf934.zip
Fix error case which session change request failed when pausing video
When a user clicks the pause video button, the camera close request and the session modify request are executed at the same time. However, the session modify request fails occasionally by a limitation of the Network side. In that case, the video session is continued with the camera closed state and a user cannot open the camera again due to pause video button disabled. Remove camera close request triggered by the pause video button clicked because it is handled appropriately according to the result of the session modify request. Also, enable the pause video button and show error message to a user if receiving the error result of the session modify request. Test: manual Bug: 69235524 Change-Id: I9a2dde755a6c28edfb0ce962b55ac8a6e907ca97
-rw-r--r--java/com/android/incallui/CallButtonPresenter.java51
-rw-r--r--java/com/android/incallui/contactgrid/TopRow.java2
-rw-r--r--java/com/android/incallui/contactgrid/res/values/strings.xml3
-rw-r--r--java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java42
-rw-r--r--java/com/android/incallui/videotech/ims/ImsVideoTech.java1
5 files changed, 79 insertions, 20 deletions
diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java
index 5c9a31e78..269d93e8c 100644
--- a/java/com/android/incallui/CallButtonPresenter.java
+++ b/java/com/android/incallui/CallButtonPresenter.java
@@ -47,6 +47,7 @@ import com.android.incallui.call.CallList;
import com.android.incallui.call.CallRecorder;
import com.android.incallui.call.DialerCall;
import com.android.incallui.call.DialerCall.CameraDirection;
+import com.android.incallui.call.DialerCallListener;
import com.android.incallui.call.TelecomAdapter;
import com.android.incallui.call.state.DialerCallState;
import com.android.incallui.incall.protocol.InCallButtonIds;
@@ -63,7 +64,8 @@ public class CallButtonPresenter
InCallDetailsListener,
CanAddCallListener,
Listener,
- InCallButtonUiDelegate {
+ InCallButtonUiDelegate,
+ DialerCallListener {
private static final String KEY_AUTOMATICALLY_MUTED_BY_ADD_CALL =
"incall_key_automatically_muted_by_add_call";
@@ -139,11 +141,18 @@ public class CallButtonPresenter
recorder.removeRecordingProgressListener(recordingProgressListener);
isInCallButtonUiReady = false;
+
+ if (call != null) {
+ call.removeListener(this);
+ }
}
@Override
public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
Trace.beginSection("CallButtonPresenter.onStateChange");
+ if (call != null) {
+ call.removeListener(this);
+ }
if (newState == InCallState.OUTGOING) {
call = callList.getOutgoingCall();
} else if (newState == InCallState.INCALL) {
@@ -166,6 +175,10 @@ public class CallButtonPresenter
} else {
call = null;
}
+
+ if (call != null) {
+ call.addListener(this);
+ }
updateUi(newState, call);
Trace.endSection();
}
@@ -472,7 +485,6 @@ public class CallButtonPresenter
call.getTimeAddedMs());
if (pause) {
- call.getVideoTech().setCamera(null);
call.getVideoTech().stopTransmission();
} else {
updateCamera(
@@ -668,6 +680,41 @@ public class CallButtonPresenter
}
@Override
+ public void onDialerCallSessionModificationStateChange() {
+ if (inCallButtonUi != null && call != null) {
+ inCallButtonUi.enableButton(InCallButtonIds.BUTTON_PAUSE_VIDEO, true);
+ updateButtonsState(call);
+ }
+ }
+
+ @Override
+ public void onDialerCallDisconnect() {}
+
+ @Override
+ public void onDialerCallUpdate() {}
+
+ @Override
+ public void onDialerCallChildNumberChange() {}
+
+ @Override
+ public void onDialerCallLastForwardedNumberChange() {}
+
+ @Override
+ public void onDialerCallUpgradeToVideo() {}
+
+ @Override
+ public void onWiFiToLteHandover() {}
+
+ @Override
+ public void onHandoverToWifiFailure() {}
+
+ @Override
+ public void onInternationalCallOnWifi() {}
+
+ @Override
+ public void onEnrichedCallSessionUpdate() {}
+
+ @Override
public Context getContext() {
return context;
}
diff --git a/java/com/android/incallui/contactgrid/TopRow.java b/java/com/android/incallui/contactgrid/TopRow.java
index d242c3a14..213a3c6af 100644
--- a/java/com/android/incallui/contactgrid/TopRow.java
+++ b/java/com/android/incallui/contactgrid/TopRow.java
@@ -92,6 +92,8 @@ public class TopRow {
} else if (VideoUtils.hasSentVideoUpgradeRequest(state.sessionModificationState())
|| VideoUtils.hasReceivedVideoUpgradeRequest(state.sessionModificationState())) {
label = getLabelForVideoRequest(context, state);
+ } else if (state.sessionModificationState() == SessionModificationState.REQUEST_FAILED) {
+ label = context.getString(R.string.incall_video_call_operation_failed);
} else if (state.state() == DialerCallState.PULLING) {
label = context.getString(R.string.incall_transferring);
} else if (state.state() == DialerCallState.DIALING
diff --git a/java/com/android/incallui/contactgrid/res/values/strings.xml b/java/com/android/incallui/contactgrid/res/values/strings.xml
index 9ee10c327..e8592b234 100644
--- a/java/com/android/incallui/contactgrid/res/values/strings.xml
+++ b/java/com/android/incallui/contactgrid/res/values/strings.xml
@@ -65,6 +65,9 @@
requests and we timed out. -->
<string name="incall_video_call_request_timed_out">Call timed out</string>
+ <!-- Displayed above the contact name when the user's operation for video calling is failed due to an unknown reason. -->
+ <string name="incall_video_call_operation_failed">Unable to operate</string>
+
<!-- In-call screen: status label for a call that's in the process of hanging up
[CHAR LIMIT=25] -->
<string name="incall_hanging_up">Hanging up</string>
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java b/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
index d254d6df6..3e6f4417b 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
@@ -103,8 +103,6 @@ public class ImsVideoCallCallback extends VideoCall.Callback {
if (videoTech.getSessionModificationState()
== SessionModificationState.WAITING_FOR_UPGRADE_TO_VIDEO_RESPONSE) {
- handler.removeCallbacksAndMessages(null); // Clear everything
-
final int newSessionModificationState = getSessionModificationStateFromTelecomStatus(status);
if (status == VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS) {
// Telecom manages audio route for us
@@ -114,31 +112,21 @@ public class ImsVideoCallCallback extends VideoCall.Callback {
videoTech.setSessionModificationState(newSessionModificationState);
}
- // Wait for 4 seconds and then clean the session modification state. This allows the video UI
- // to stay up so that the user can read the error message.
- //
// If the other person accepted the upgrade request then this will keep the video UI up until
// the call's video state change. Without this we would switch to the voice call and then
// switch back to video UI.
- handler.postDelayed(
- () -> {
- if (videoTech.getSessionModificationState() == newSessionModificationState) {
- LogUtil.i("ImsVideoCallCallback.onSessionModifyResponseReceived", "clearing state");
- videoTech.setSessionModificationState(SessionModificationState.NO_REQUEST);
- } else {
- LogUtil.i(
- "ImsVideoCallCallback.onSessionModifyResponseReceived",
- "session modification state has changed, not clearing state");
- }
- },
- CLEAR_FAILED_REQUEST_TIMEOUT_MILLIS);
+ clearFailedResponseState(newSessionModificationState);
} else if (videoTech.getSessionModificationState()
== SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
requestedVideoState = VideoProfile.STATE_AUDIO_ONLY;
videoTech.setSessionModificationState(SessionModificationState.NO_REQUEST);
} else if (videoTech.getSessionModificationState()
== SessionModificationState.WAITING_FOR_RESPONSE) {
- videoTech.setSessionModificationState(getSessionModificationStateFromTelecomStatus(status));
+ final int newSessionModificationState = getSessionModificationStateFromTelecomStatus(status);
+ videoTech.setSessionModificationState(newSessionModificationState);
+ if (status != VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS) {
+ clearFailedResponseState(newSessionModificationState);
+ }
} else {
LogUtil.i(
"ImsVideoCallCallback.onSessionModifyResponseReceived",
@@ -146,6 +134,24 @@ public class ImsVideoCallCallback extends VideoCall.Callback {
}
}
+ private void clearFailedResponseState(final int newSessionModificationState) {
+ handler.removeCallbacksAndMessages(null); // Clear everything
+ // Wait for 4 seconds and then clean the session modification state. This allows the video UI
+ // to stay up so that the user can read the error message.
+ handler.postDelayed(
+ () -> {
+ if (videoTech.getSessionModificationState() == newSessionModificationState) {
+ LogUtil.i("ImsVideoCallCallback.onSessionModifyResponseReceived", "clearing state");
+ videoTech.setSessionModificationState(SessionModificationState.NO_REQUEST);
+ } else {
+ LogUtil.i(
+ "ImsVideoCallCallback.onSessionModifyResponseReceived",
+ "session modification state has changed, not clearing state");
+ }
+ },
+ CLEAR_FAILED_REQUEST_TIMEOUT_MILLIS);
+ }
+
@SessionModificationState
private int getSessionModificationStateFromTelecomStatus(int telecomStatus) {
switch (telecomStatus) {
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoTech.java b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
index 5b733d612..1d4fe769a 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoTech.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
@@ -227,6 +227,7 @@ public class ImsVideoTech implements VideoTech {
call.getVideoCall()
.sendSessionModifyRequest(
new VideoProfile(unpausedVideoState & ~VideoProfile.STATE_TX_ENABLED));
+ setSessionModificationState(SessionModificationState.WAITING_FOR_RESPONSE);
}
@Override