blob: 06169c28534a79be5c9bbc15893828d55c1485e1 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.incallui.answer.impl;
import android.content.res.Configuration;
import android.graphics.Point;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.TextureView;
import android.view.View;
import com.android.dialer.common.Assert;
import com.android.dialer.common.FragmentUtils;
import com.android.dialer.common.LogUtil;
import com.android.incallui.call.DialerCall;
import com.android.incallui.video.protocol.VideoCallScreen;
import com.android.incallui.video.protocol.VideoCallScreenDelegate;
import com.android.incallui.video.protocol.VideoCallScreenDelegateFactory;
import com.android.incallui.videosurface.bindings.VideoSurfaceBindings;
import com.android.incallui.QtiCallUtils;
/** Shows a video preview for an incoming call. */
public class AnswerVideoCallScreen implements VideoCallScreen {
@NonNull private final String callId;
@NonNull private final Fragment fragment;
@NonNull private final TextureView textureView;
@NonNull private final VideoCallScreenDelegate delegate;
public AnswerVideoCallScreen(
@NonNull String callId, @NonNull Fragment fragment, @NonNull View view) {
this.callId = Assert.isNotNull(callId);
this.fragment = Assert.isNotNull(fragment);
textureView =
Assert.isNotNull((TextureView) view.findViewById(R.id.incoming_preview_texture_view));
View overlayView =
Assert.isNotNull(view.findViewById(R.id.incoming_preview_texture_view_overlay));
view.setBackgroundColor(0xff000000);
delegate =
FragmentUtils.getParentUnsafe(fragment, VideoCallScreenDelegateFactory.class)
.newVideoCallScreenDelegate(this);
delegate.initVideoCallScreenDelegate(fragment.getContext(), this);
textureView.setVisibility(View.VISIBLE);
overlayView.setVisibility(View.VISIBLE);
}
@Override
public void onVideoScreenStart() {
LogUtil.i("AnswerVideoCallScreen.onStart", null);
delegate.onVideoCallScreenUiReady(this);
DialerCall call = QtiCallUtils.getIncomingCall();
if (QtiCallUtils.isVideoCrs(call)) {
LogUtil.i("AnswerVideoCallScreen.onStart, video CRS, create remote surface", null);
delegate.getRemoteVideoSurfaceTexture().attachToTextureView(textureView);
} else {
LogUtil.i("AnswerVideoCallScreen.onStart, no video CRS, create local surface", null);
delegate.getLocalVideoSurfaceTexture().attachToTextureView(textureView);
}
}
@Override
public void onVideoScreenStop() {
LogUtil.i("AnswerVideoCallScreen.onStop", null);
delegate.onVideoCallScreenUiUnready();
}
@Override
public void showVideoViews(
boolean shouldShowPreview, boolean shouldShowRemote, boolean isRemotelyHeld) {
LogUtil.i(
"AnswerVideoCallScreen.showVideoViews",
"showPreview: %b, shouldShowRemote: %b",
shouldShowPreview,
shouldShowRemote);
}
@Override
public void onLocalVideoDimensionsChanged() {
LogUtil.i("AnswerVideoCallScreen.onLocalVideoDimensionsChanged", null);
updatePreviewVideoScaling();
}
@Override
public void onRemoteVideoDimensionsChanged() {}
@Override
public void onLocalVideoOrientationChanged() {
LogUtil.i("AnswerVideoCallScreen.onLocalVideoOrientationChanged", null);
updatePreviewVideoScaling();
}
@Override
public void updateFullscreenAndGreenScreenMode(
boolean shouldShowFullscreen, boolean shouldShowGreenScreen) {}
@Override
public Fragment getVideoCallScreenFragment() {
return fragment;
}
@Override
public void onRequestReadStoragePermission() {
}
@NonNull
@Override
public String getCallId() {
return callId;
}
@Override
public void onHandoverFromWiFiToLte() {}
private void updatePreviewVideoScaling() {
if (textureView.getWidth() == 0 || textureView.getHeight() == 0) {
LogUtil.i(
"AnswerVideoCallScreen.updatePreviewVideoScaling", "view layout hasn't finished yet");
return;
}
Point cameraDimensions = delegate.getLocalVideoSurfaceTexture().getSurfaceDimensions();
if (cameraDimensions == null) {
LogUtil.i("AnswerVideoCallScreen.updatePreviewVideoScaling", "camera dimensions not set");
return;
}
if (isLandscape()) {
VideoSurfaceBindings.scaleVideoAndFillView(
textureView, cameraDimensions.x, cameraDimensions.y, delegate.getDeviceOrientation());
} else {
// Landscape, so dimensions are swapped
//noinspection SuspiciousNameCombination
VideoSurfaceBindings.scaleVideoAndFillView(
textureView, cameraDimensions.y, cameraDimensions.x, delegate.getDeviceOrientation());
}
}
private boolean isLandscape() {
return fragment.getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE;
}
}