summaryrefslogtreecommitdiffstats
path: root/java/com/android/incallui/videotech/ims/ImsVideoTech.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/incallui/videotech/ims/ImsVideoTech.java')
-rw-r--r--java/com/android/incallui/videotech/ims/ImsVideoTech.java68
1 files changed, 43 insertions, 25 deletions
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoTech.java b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
index 3d73e4e7d..8fa983ac6 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoTech.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
@@ -19,7 +19,6 @@ package com.android.incallui.videotech.ims;
import android.content.Context;
import android.os.Build;
import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
import android.telecom.Call;
import android.telecom.Call.Details;
import android.telecom.VideoProfile;
@@ -27,6 +26,7 @@ import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.LoggingBindings;
+import com.android.dialer.util.CallUtil;
import com.android.incallui.video.protocol.VideoCallScreen;
import com.android.incallui.video.protocol.VideoCallScreenDelegate;
import com.android.incallui.videotech.VideoTech;
@@ -41,8 +41,13 @@ public class ImsVideoTech implements VideoTech {
private @SessionModificationState int sessionModificationState =
SessionModificationState.NO_REQUEST;
private int previousVideoState = VideoProfile.STATE_AUDIO_ONLY;
+ private boolean paused = false;
- @VisibleForTesting boolean paused = false;
+ // Hold onto a flag of whether or not stopTransmission was called but resumeTransmission has not
+ // been. This is needed because there is time between calling stopTransmission and
+ // call.getDetails().getVideoState() reflecting the change. During that time, pause() and
+ // unpause() will send the incorrect VideoProfile.
+ private boolean transmissionStopped = false;
public ImsVideoTech(LoggingBindings logger, VideoTechListener listener, Call call) {
this.logger = logger;
@@ -56,12 +61,31 @@ public class ImsVideoTech implements VideoTech {
return false;
}
- boolean hasCapabilities =
- call.getDetails().can(Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX)
- && call.getDetails().can(Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_RX);
+ if (call.getVideoCall() == null) {
+ return false;
+ }
+
+ // We are already in an IMS video call
+ if (VideoProfile.isVideo(call.getDetails().getVideoState())) {
+ return true;
+ }
+
+ // The user has disabled IMS video calling in system settings
+ if (!CallUtil.isVideoEnabled(context)) {
+ return false;
+ }
+
+ // The current call doesn't support transmitting video
+ if (!call.getDetails().can(Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX)) {
+ return false;
+ }
- return call.getVideoCall() != null
- && (hasCapabilities || VideoProfile.isVideo(call.getDetails().getVideoState()));
+ // The current call remote device doesn't support receiving video
+ if (!call.getDetails().can(Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_RX)) {
+ return false;
+ }
+
+ return true;
}
@Override
@@ -189,6 +213,8 @@ public class ImsVideoTech implements VideoTech {
public void stopTransmission() {
LogUtil.enterBlock("ImsVideoTech.stopTransmission");
+ transmissionStopped = true;
+
int unpausedVideoState = getUnpausedVideoState(call.getDetails().getVideoState());
call.getVideoCall()
.sendSessionModifyRequest(
@@ -199,6 +225,8 @@ public class ImsVideoTech implements VideoTech {
public void resumeTransmission() {
LogUtil.enterBlock("ImsVideoTech.resumeTransmission");
+ transmissionStopped = false;
+
int unpausedVideoState = getUnpausedVideoState(call.getDetails().getVideoState());
call.getVideoCall()
.sendSessionModifyRequest(
@@ -212,6 +240,10 @@ public class ImsVideoTech implements VideoTech {
LogUtil.i("ImsVideoTech.pause", "sending pause request");
paused = true;
int pausedVideoState = call.getDetails().getVideoState() | VideoProfile.STATE_PAUSED;
+ if (transmissionStopped && VideoProfile.isTransmissionEnabled(pausedVideoState)) {
+ LogUtil.i("ImsVideoTech.pause", "overriding TX to false due to user request");
+ pausedVideoState &= ~VideoProfile.STATE_TX_ENABLED;
+ }
call.getVideoCall().sendSessionModifyRequest(new VideoProfile(pausedVideoState));
} else {
LogUtil.i(
@@ -228,6 +260,10 @@ public class ImsVideoTech implements VideoTech {
LogUtil.i("ImsVideoTech.unpause", "sending unpause request");
paused = false;
int unpausedVideoState = getUnpausedVideoState(call.getDetails().getVideoState());
+ if (transmissionStopped && VideoProfile.isTransmissionEnabled(unpausedVideoState)) {
+ LogUtil.i("ImsVideoTech.unpause", "overriding TX to false due to user request");
+ unpausedVideoState &= ~VideoProfile.STATE_TX_ENABLED;
+ }
call.getVideoCall().sendSessionModifyRequest(new VideoProfile(unpausedVideoState));
} else {
LogUtil.i(
@@ -249,24 +285,6 @@ public class ImsVideoTech implements VideoTech {
call.getVideoCall().setDeviceOrientation(rotation);
}
- /**
- * Called when we receive an rx_pause from the IMS stack. Update our state so we know we are
- * currently paused. This is important in the cases where we swap calls since pause() and
- * unpause() are not called.
- */
- void onPausedEvent() {
- paused = true;
- }
-
- /**
- * Called when we receive an rx_resume from the IMS stack. Update our state so we know we are
- * currently not paused. This is important in the cases where we swap calls since pause() and
- * unpause() are not called.
- */
- void onResumedEvent() {
- paused = false;
- }
-
private boolean canPause() {
return call.getDetails().can(Details.CAPABILITY_CAN_PAUSE_VIDEO)
&& call.getState() == Call.STATE_ACTIVE