summaryrefslogtreecommitdiff
path: root/InCallUI/src/com/android/incallui/VideoCallPresenter.java
diff options
context:
space:
mode:
authorVinit Deshpande <vinitd@google.com>2015-04-15 00:29:47 -0700
committerVinit Deshpande <vinitd@google.com>2015-04-15 00:29:47 -0700
commit01ad85125dd7cbe1107c679dcc362b9487700b9a (patch)
treef7b9a01c7e24f699fbc6fb806607478a207b563f /InCallUI/src/com/android/incallui/VideoCallPresenter.java
parent7fd5e5b73e2279d07eed498c46565e7bb170a3b0 (diff)
parent9e0d3a386a48d5f32dacb45bab96f0ea5752be36 (diff)
am b04d61a..697f674 from mirror-m-wireless-internal-release
697f674 Fix orientation of preview surface when device rotated. 17de502 Merge "Always allow landscape mode if video call is the primary call" into m-wireless-dev 3692e77 Always allow landscape mode if video call is the primary call a77ad8d Video calling landscape changes to match specs cb74fc0 Merge "Simplify and rewire in-call buttons" into m-wireless-dev ed0775d Simplify and rewire in-call buttons 80a1aad Hide incoming video until call is connected. 4f2a70b Merge "Cleanup AnswerFragment glowpad UI" into m-wireless-dev 6591f05 Merge "Initial refactoring for call buttons" into m-wireless-dev c70a63c Initial refactoring for call buttons 4a63afd Hide end call button when video upgrade glowpad is showing 7ba13e9 Cleanup AnswerFragment glowpad UI 6b2b8df Show progress spinner when upgrading to video c02794b Merge "Cleanup of Video Call pause functionality." into m-wireless-dev bec5807 Standardize fragment layout names bc65cbc Adding video call icon in secondary call info.
Diffstat (limited to 'InCallUI/src/com/android/incallui/VideoCallPresenter.java')
-rw-r--r--InCallUI/src/com/android/incallui/VideoCallPresenter.java95
1 files changed, 67 insertions, 28 deletions
diff --git a/InCallUI/src/com/android/incallui/VideoCallPresenter.java b/InCallUI/src/com/android/incallui/VideoCallPresenter.java
index 43eef4b50..56f312f63 100644
--- a/InCallUI/src/com/android/incallui/VideoCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/VideoCallPresenter.java
@@ -65,7 +65,7 @@ import android.os.SystemProperties;
* When downgrading to an audio-only video state, the {@code VideoCallPresenter} nulls both
* surfaces.
*/
-public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi> implements
+public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi> implements
IncomingCallListener, InCallOrientationListener, InCallStateListener,
InCallDetailsListener, SurfaceChangeListener, VideoEventListener,
InCallVideoCallListenerNotifier.SessionModificationListener {
@@ -167,7 +167,6 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
*/
private int mCurrentCallSubstate;
-
/** Handler which resets request state to NO_REQUEST after an interval. */
private Handler mSessionModificationResetHandler;
private static final long SESSION_MODIFICATION_RESET_DELAY_MS = 3000;
@@ -339,11 +338,11 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
toggleFullScreen();
}
-
/**
* Handles incoming calls.
*
- * @param state The in call state.
+ * @param oldState The old in call state.
+ * @param newState The new in call state.
* @param call The call.
*/
@Override
@@ -414,12 +413,14 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
+ " hasVideoStateChanged=" +
hasVideoStateChanged + " isVideoMode=" + isVideoMode());
- if (!hasVideoStateChanged) { return;}
+ if (!hasVideoStateChanged) {
+ return;
+ }
updateCameraSelection(call);
if (isVideoCall) {
- enterVideoMode(call.getVideoCall(), call.getVideoState());
+ enterVideoMode(call);
} else if (isVideoMode()) {
exitVideoMode();
}
@@ -447,6 +448,9 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
if (!Objects.equals(prevCameraId, newCameraId) && CallUtils.isActiveVideoCall(call)) {
enableCamera(call.getVideoCall(), true);
}
+
+ // Make sure we hide or show the video UI if needed.
+ showVideoUi(call.getVideoState(), call.getState());
}
private void checkForCallSubstateChange(Call call) {
@@ -487,7 +491,7 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
Log.d(this, "onPrimaryCallChanged: Entering video mode...");
updateCameraSelection(newPrimaryCall);
- enterVideoMode(newPrimaryCall.getVideoCall(), newPrimaryCall.getVideoState());
+ enterVideoMode(newPrimaryCall);
}
}
@@ -538,6 +542,11 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
checkForVideoCallChange(call);
checkForVideoStateChange(call);
checkForCallStateChange(call);
+ checkForOrientationAllowedChange(call);
+ }
+
+ private void checkForOrientationAllowedChange(Call call) {
+ InCallPresenter.getInstance().setInCallAllowsOrientationChange(CallUtils.isVideoCall(call));
}
/**
@@ -577,7 +586,7 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
}
if (CallUtils.isVideoCall(call) && hasChanged) {
- enterVideoMode(call.getVideoCall(), call.getVideoState());
+ enterVideoMode(call);
}
}
@@ -594,7 +603,10 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
* Enters video mode by showing the video surfaces and making other adjustments (eg. audio).
* TODO(vt): Need to adjust size and orientation of preview surface here.
*/
- private void enterVideoMode(VideoCall videoCall, int newVideoState) {
+ private void enterVideoMode(Call call) {
+ VideoCall videoCall = call.getVideoCall();
+ int newVideoState = call.getVideoState();
+
Log.d(this, "enterVideoMode videoCall= " + videoCall + " videoState: " + newVideoState);
VideoCallUi ui = getUi();
if (ui == null) {
@@ -602,8 +614,7 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
return;
}
- showVideoUi(newVideoState);
- InCallPresenter.getInstance().setInCallAllowsOrientationChange(true);
+ showVideoUi(newVideoState, call.getState());
// Communicate the current camera to telephony and make a request for the camera
// capabilities.
@@ -693,9 +704,7 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
private void exitVideoMode() {
Log.d(this, "exitVideoMode");
- InCallPresenter.getInstance().setInCallAllowsOrientationChange(false);
-
- showVideoUi(VideoProfile.VideoState.AUDIO_ONLY);
+ showVideoUi(VideoProfile.VideoState.AUDIO_ONLY, Call.State.ACTIVE);
enableCamera(mVideoCall, false);
Log.d(this, "exitVideoMode mIsFullScreen: " + mIsFullScreen);
@@ -707,21 +716,28 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
}
/**
- * Show video Ui depends on video state.
+ * Based on the current {@link VideoProfile.VideoState} and {@code CallState}, show or hide the
+ * incoming and outgoing video surfaces. The outgoing video surface is shown any time video
+ * is transmitting. The incoming video surface is shown whenever the video is un-paused and
+ * active.
+ *
+ * @param videoState The video state.
+ * @param callState The call state.
*/
- private void showVideoUi(int videoState) {
+ private void showVideoUi(int videoState, int callState) {
VideoCallUi ui = getUi();
if (ui == null) {
Log.e(this, "showVideoUi, VideoCallUi is null returning");
return;
}
-
+ boolean isPaused = VideoProfile.VideoState.isPaused(videoState);
+ boolean isCallActive = callState == Call.State.ACTIVE;
if (VideoProfile.VideoState.isBidirectional(videoState)) {
- ui.showVideoViews(true, true);
+ ui.showVideoViews(true, !isPaused && isCallActive);
} else if (VideoProfile.VideoState.isTransmissionEnabled(videoState)) {
ui.showVideoViews(true, false);
} else if (VideoProfile.VideoState.isReceptionEnabled(videoState)) {
- ui.showVideoViews(false, true);
+ ui.showVideoViews(false, !isPaused && isCallActive);
} else {
ui.hideVideoUi();
}
@@ -818,6 +834,29 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
}
mPreviewSurfaceState = PreviewSurfaceState.CAPABILITIES_RECEIVED;
+ changePreviewDimensions(width, height);
+
+ // Check if the preview surface is ready yet; if it is, set it on the {@code VideoCall}.
+ // If it not yet ready, it will be set when when creation completes.
+ if (ui.isPreviewVideoSurfaceCreated()) {
+ mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
+ mVideoCall.setPreviewSurface(ui.getPreviewVideoSurface());
+ }
+ }
+
+ /**
+ * Changes the dimensions of the preview surface.
+ *
+ * @param width The new width.
+ * @param height The new height.
+ */
+ private void changePreviewDimensions(int width, int height) {
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ // Resize the surface used to display the preview video
ui.setPreviewSurfaceSize(width, height);
// Configure the preview surface to the correct aspect ratio.
@@ -825,14 +864,10 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
if (width > 0 && height > 0) {
aspectRatio = (float) width / (float) height;
}
- setPreviewSize(mDeviceOrientation, aspectRatio);
- // Check if the preview surface is ready yet; if it is, set it on the {@code VideoCall}.
- // If it not yet ready, it will be set when when creation completes.
- if (ui.isPreviewVideoSurfaceCreated()) {
- mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
- mVideoCall.setPreviewSurface(ui.getPreviewVideoSurface());
- }
+ // Resize the textureview housing the preview video and rotate it appropriately based on
+ // the device orientation
+ setPreviewSize(mDeviceOrientation, aspectRatio);
}
/**
@@ -874,8 +909,11 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
*/
@Override
public void onDeviceOrientationChanged(int orientation) {
- Log.d(this, "onDeviceOrientationChanged: orientation=" + orientation);
mDeviceOrientation = orientation;
+ Point previewDimensions = getUi().getPreviewSize();
+ Log.d(this, "onDeviceOrientationChanged: orientation=" + orientation + " size: "
+ + previewDimensions);
+ changePreviewDimensions(previewDimensions.x, previewDimensions.y);
}
@Override
@@ -939,6 +977,7 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
@Override
public void onDowngradeToAudio(Call call) {
+ call.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
// exit video mode
exitVideoMode();
}
@@ -1102,8 +1141,8 @@ public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi
void setCallDataUsage(Context context, long dataUsage);
void displayCallSessionEvent(int event);
Point getScreenSize();
+ Point getPreviewSize();
void cleanupSurfaces();
- boolean isActivityRestart();
void showCallSubstateChanged(int callSubstate);
}
}