diff options
Diffstat (limited to 'java/com/android/incallui/videotech/ims/ImsVideoTech.java')
-rw-r--r-- | java/com/android/incallui/videotech/ims/ImsVideoTech.java | 56 |
1 files changed, 48 insertions, 8 deletions
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoTech.java b/java/com/android/incallui/videotech/ims/ImsVideoTech.java index 01e4bb84c..8fa983ac6 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; @@ -41,6 +43,12 @@ public class ImsVideoTech implements VideoTech { private int previousVideoState = VideoProfile.STATE_AUDIO_ONLY; private 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; this.listener = listener; @@ -53,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; + } - return call.getVideoCall() != null - && (hasCapabilities || VideoProfile.isVideo(call.getDetails().getVideoState())); + // 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; + } + + // 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 +147,9 @@ public class ImsVideoTech implements VideoTech { } @Override + public void onRemovedFromCallList() {} + + @Override public int getSessionModificationState() { return sessionModificationState; } @@ -183,7 +213,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 +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( @@ -208,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( @@ -224,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( @@ -235,7 +275,7 @@ public class ImsVideoTech implements VideoTech { } @Override - public void setCamera(String cameraId) { + public void setCamera(@Nullable String cameraId) { call.getVideoCall().setCamera(cameraId); call.getVideoCall().requestCameraCapabilities(); } @@ -248,7 +288,7 @@ public class ImsVideoTech implements VideoTech { private boolean canPause() { return call.getDetails().can(Details.CAPABILITY_CAN_PAUSE_VIDEO) && call.getState() == Call.STATE_ACTIVE - && isTransmitting(); + && isTransmittingOrReceiving(); } static int getUnpausedVideoState(int videoState) { |