summaryrefslogtreecommitdiff
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.java122
1 files changed, 98 insertions, 24 deletions
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoTech.java b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
index 01e4bb84c..fec05dc55 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoTech.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
@@ -18,6 +18,7 @@ package com.android.incallui.videotech.ims;
import android.content.Context;
import android.os.Build;
+import android.support.annotation.Nullable;
import android.telecom.Call;
import android.telecom.Call.Details;
import android.telecom.VideoProfile;
@@ -25,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;
@@ -40,6 +42,13 @@ public class ImsVideoTech implements VideoTech {
SessionModificationState.NO_REQUEST;
private int previousVideoState = VideoProfile.STATE_AUDIO_ONLY;
private boolean paused = false;
+ private String savedCameraId;
+
+ // 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;
@@ -53,12 +62,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
@@ -120,6 +148,9 @@ public class ImsVideoTech implements VideoTech {
}
@Override
+ public void onRemovedFromCallList() {}
+
+ @Override
public int getSessionModificationState() {
return sessionModificationState;
}
@@ -183,7 +214,7 @@ public class ImsVideoTech implements VideoTech {
public void stopTransmission() {
LogUtil.enterBlock("ImsVideoTech.stopTransmission");
- setCamera(null);
+ transmissionStopped = true;
int unpausedVideoState = getUnpausedVideoState(call.getDetails().getVideoState());
call.getVideoCall()
@@ -195,6 +226,8 @@ public class ImsVideoTech implements VideoTech {
public void resumeTransmission() {
LogUtil.enterBlock("ImsVideoTech.resumeTransmission");
+ transmissionStopped = false;
+
int unpausedVideoState = getUnpausedVideoState(call.getDetails().getVideoState());
call.getVideoCall()
.sendSessionModifyRequest(
@@ -204,38 +237,75 @@ public class ImsVideoTech implements VideoTech {
@Override
public void pause() {
- if (canPause() && !paused) {
+ if (call.getState() != Call.STATE_ACTIVE) {
+ LogUtil.i("ImsVideoTech.pause", "not pausing because call is not active");
+ return;
+ }
+
+ if (!isTransmittingOrReceiving()) {
+ LogUtil.i("ImsVideoTech.pause", "not pausing because this is not a video call");
+ return;
+ }
+
+ if (paused) {
+ LogUtil.i("ImsVideoTech.pause", "already paused");
+ return;
+ }
+
+ paused = true;
+
+ if (canPause()) {
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(
- "ImsVideoTech.pause",
- "not sending request: canPause: %b, paused: %b",
- canPause(),
- paused);
+ // This video call does not support pause so we fall back to disabling the camera
+ LogUtil.i("ImsVideoTech.pause", "disabling camera");
+ call.getVideoCall().setCamera(null);
}
}
@Override
public void unpause() {
- if (canPause() && paused) {
+ if (call.getState() != Call.STATE_ACTIVE) {
+ LogUtil.i("ImsVideoTech.unpause", "not unpausing because call is not active");
+ return;
+ }
+
+ if (!isTransmittingOrReceiving()) {
+ LogUtil.i("ImsVideoTech.unpause", "not unpausing because this is not a video call");
+ return;
+ }
+
+ if (!paused) {
+ LogUtil.i("ImsVideoTech.unpause", "already unpaused");
+ return;
+ }
+
+ paused = false;
+
+ if (canPause()) {
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(
- "ImsVideoTech.unpause",
- "not sending request: canPause: %b, paused: %b",
- canPause(),
- paused);
+ // This video call does not support pause so we fall back to re-enabling the camera
+ LogUtil.i("ImsVideoTech.pause", "re-enabling camera");
+ setCamera(savedCameraId);
}
}
@Override
- public void setCamera(String cameraId) {
+ public void setCamera(@Nullable String cameraId) {
+ savedCameraId = cameraId;
call.getVideoCall().setCamera(cameraId);
call.getVideoCall().requestCameraCapabilities();
}
@@ -245,10 +315,14 @@ public class ImsVideoTech implements VideoTech {
call.getVideoCall().setDeviceOrientation(rotation);
}
+ @Override
+ public void becomePrimary() {
+ listener.onImpressionLoggingNeeded(
+ DialerImpression.Type.UPGRADE_TO_VIDEO_CALL_BUTTON_SHOWN_FOR_IMS);
+ }
+
private boolean canPause() {
- return call.getDetails().can(Details.CAPABILITY_CAN_PAUSE_VIDEO)
- && call.getState() == Call.STATE_ACTIVE
- && isTransmitting();
+ return call.getDetails().can(Details.CAPABILITY_CAN_PAUSE_VIDEO);
}
static int getUnpausedVideoState(int videoState) {