blob: 1e951408cd144b269b7d64357b9d23a490d588ba [file] [log] [blame]
/*
* Copyright (C) 2017 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.videotech.rcs;
import android.support.annotation.NonNull;
import android.telecom.Call;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.enrichedcall.EnrichedCallCapabilities;
import com.android.dialer.enrichedcall.EnrichedCallManager;
import com.android.dialer.enrichedcall.EnrichedCallManager.CapabilitiesListener;
import com.android.dialer.enrichedcall.Session;
import com.android.dialer.enrichedcall.videoshare.VideoShareListener;
import com.android.incallui.videotech.VideoTech;
/** Allows the in-call UI to make video calls over RCS. */
public class RcsVideoShare implements VideoTech, CapabilitiesListener, VideoShareListener {
private final EnrichedCallManager enrichedCallManager;
private final VideoTechListener listener;
private final String callingNumber;
private int previousCallState = Call.STATE_NEW;
private long inviteSessionId = Session.NO_SESSION_ID;
private long transmittingSessionId = Session.NO_SESSION_ID;
private long receivingSessionId = Session.NO_SESSION_ID;
private @SessionModificationState int sessionModificationState =
VideoTech.SESSION_MODIFICATION_STATE_NO_REQUEST;
public RcsVideoShare(
@NonNull EnrichedCallManager enrichedCallManager,
@NonNull VideoTechListener listener,
@NonNull String callingNumber) {
this.enrichedCallManager = Assert.isNotNull(enrichedCallManager);
this.listener = Assert.isNotNull(listener);
this.callingNumber = Assert.isNotNull(callingNumber);
enrichedCallManager.registerCapabilitiesListener(this);
enrichedCallManager.registerVideoShareListener(this);
}
@Override
public boolean isAvailable() {
EnrichedCallCapabilities capabilities = enrichedCallManager.getCapabilities(callingNumber);
return capabilities != null && capabilities.supportsVideoShare();
}
@Override
public boolean isTransmittingOrReceiving() {
return transmittingSessionId != Session.NO_SESSION_ID
|| receivingSessionId != Session.NO_SESSION_ID;
}
@Override
public boolean isSelfManagedCamera() {
return true;
}
@Override
public void onCallStateChanged(int newState) {
if (newState == Call.STATE_DISCONNECTING) {
enrichedCallManager.unregisterVideoShareListener(this);
enrichedCallManager.unregisterCapabilitiesListener(this);
}
if (newState != previousCallState && newState == Call.STATE_ACTIVE) {
// Per spec, request capabilities when the call becomes active
enrichedCallManager.requestCapabilities(callingNumber);
}
previousCallState = newState;
}
@Override
public int getSessionModificationState() {
return sessionModificationState;
}
private void setSessionModificationState(@SessionModificationState int state) {
if (state != sessionModificationState) {
LogUtil.i(
"RcsVideoShare.setSessionModificationState", "%d -> %d", sessionModificationState, state);
sessionModificationState = state;
listener.onSessionModificationStateChanged();
}
}
@Override
public void upgradeToVideo() {
LogUtil.enterBlock("RcsVideoShare.upgradeToVideo");
transmittingSessionId = enrichedCallManager.startVideoShareSession(callingNumber);
if (transmittingSessionId != Session.NO_SESSION_ID) {
setSessionModificationState(
VideoTech.SESSION_MODIFICATION_STATE_WAITING_FOR_UPGRADE_TO_VIDEO_RESPONSE);
}
}
@Override
public void acceptVideoRequest() {
LogUtil.enterBlock("RcsVideoShare.acceptVideoRequest");
if (enrichedCallManager.acceptVideoShareSession(inviteSessionId)) {
receivingSessionId = inviteSessionId;
}
inviteSessionId = Session.NO_SESSION_ID;
setSessionModificationState(VideoTech.SESSION_MODIFICATION_STATE_NO_REQUEST);
}
@Override
public void acceptVideoRequestAsAudio() {
throw Assert.createUnsupportedOperationFailException();
}
@Override
public void declineVideoRequest() {
LogUtil.enterBlock("RcsVideoTech.declineUpgradeRequest");
enrichedCallManager.endVideoShareSession(
enrichedCallManager.getVideoShareInviteSessionId(callingNumber));
inviteSessionId = Session.NO_SESSION_ID;
setSessionModificationState(VideoTech.SESSION_MODIFICATION_STATE_NO_REQUEST);
}
@Override
public boolean isTransmitting() {
return transmittingSessionId != Session.NO_SESSION_ID;
}
@Override
public void stopTransmission() {
LogUtil.enterBlock("RcsVideoTech.stopTransmission");
}
@Override
public void resumeTransmission() {
LogUtil.enterBlock("RcsVideoTech.resumeTransmission");
}
@Override
public void pause() {}
@Override
public void unpause() {}
@Override
public void setCamera(String cameraId) {}
@Override
public void setDeviceOrientation(int rotation) {}
@Override
public void onCapabilitiesUpdated() {
listener.onVideoTechStateChanged();
}
@Override
public void onVideoShareChanged() {
long existingInviteSessionId = inviteSessionId;
inviteSessionId = enrichedCallManager.getVideoShareInviteSessionId(callingNumber);
if (inviteSessionId != Session.NO_SESSION_ID) {
if (existingInviteSessionId == Session.NO_SESSION_ID) {
// This is a new invite
setSessionModificationState(
VideoTech.SESSION_MODIFICATION_STATE_RECEIVED_UPGRADE_TO_VIDEO_REQUEST);
listener.onVideoUpgradeRequestReceived();
}
} else {
setSessionModificationState(VideoTech.SESSION_MODIFICATION_STATE_NO_REQUEST);
}
if (sessionIsClosed(transmittingSessionId)) {
LogUtil.i("RcsVideoShare.onSessionClosed", "transmitting session closed");
transmittingSessionId = Session.NO_SESSION_ID;
}
if (sessionIsClosed(receivingSessionId)) {
LogUtil.i("RcsVideoShare.onSessionClosed", "receiving session closed");
receivingSessionId = Session.NO_SESSION_ID;
}
listener.onVideoTechStateChanged();
}
private boolean sessionIsClosed(long sessionId) {
return sessionId != Session.NO_SESSION_ID
&& enrichedCallManager.getVideoShareSession(sessionId) == null;
}
}