1e1c44949Sopenharmony_ci/* 2e1c44949Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 3e1c44949Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e1c44949Sopenharmony_ci * you may not use this file except in compliance with the License. 5e1c44949Sopenharmony_ci * You may obtain a copy of the License at 6e1c44949Sopenharmony_ci * 7e1c44949Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e1c44949Sopenharmony_ci * 9e1c44949Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e1c44949Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e1c44949Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e1c44949Sopenharmony_ci * See the License for the specific language governing permissions and 13e1c44949Sopenharmony_ci * limitations under the License. 14e1c44949Sopenharmony_ci */ 15e1c44949Sopenharmony_ci 16e1c44949Sopenharmony_ci#include "ims_call.h" 17e1c44949Sopenharmony_ci 18e1c44949Sopenharmony_ci#include "call_control_manager.h" 19e1c44949Sopenharmony_ci#include "call_object_manager.h" 20e1c44949Sopenharmony_ci#include "call_manager_errors.h" 21e1c44949Sopenharmony_ci#include "telephony_log_wrapper.h" 22e1c44949Sopenharmony_ci#include "ims_conference.h" 23e1c44949Sopenharmony_ci#include "video_control_manager.h" 24e1c44949Sopenharmony_ci 25e1c44949Sopenharmony_ci#include "cellular_call_connection.h" 26e1c44949Sopenharmony_ci 27e1c44949Sopenharmony_cinamespace OHOS { 28e1c44949Sopenharmony_cinamespace Telephony { 29e1c44949Sopenharmony_ciIMSCall::IMSCall(DialParaInfo &info) : CarrierCall(info), videoCallState_(nullptr), isInitialized_(false) {} 30e1c44949Sopenharmony_ci 31e1c44949Sopenharmony_ciIMSCall::IMSCall(DialParaInfo &info, AppExecFwk::PacMap &extras) 32e1c44949Sopenharmony_ci : CarrierCall(info, extras), videoCallState_(nullptr), isInitialized_(false) 33e1c44949Sopenharmony_ci{} 34e1c44949Sopenharmony_ci 35e1c44949Sopenharmony_ciIMSCall::~IMSCall() {} 36e1c44949Sopenharmony_ci 37e1c44949Sopenharmony_ciint32_t IMSCall::InitVideoCall() 38e1c44949Sopenharmony_ci{ 39e1c44949Sopenharmony_ci if (isInitialized_) { 40e1c44949Sopenharmony_ci VideoStateType videoStateType = GetVideoStateType(); 41e1c44949Sopenharmony_ci AssignVideoCallState(videoStateType); 42e1c44949Sopenharmony_ci TELEPHONY_LOGI("video call initialize ok!"); 43e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 44e1c44949Sopenharmony_ci } 45e1c44949Sopenharmony_ci sptr<VideoCallState> state = (std::make_unique<AudioOnlyState>(this)).release(); 46e1c44949Sopenharmony_ci if (state == nullptr) { 47e1c44949Sopenharmony_ci TELEPHONY_LOGE("null pointer"); 48e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 49e1c44949Sopenharmony_ci } 50e1c44949Sopenharmony_ci videoStateMap_[ImsCallMode::CALL_MODE_AUDIO_ONLY] = state; 51e1c44949Sopenharmony_ci state = (std::make_unique<VideoSendState>(this)).release(); 52e1c44949Sopenharmony_ci if (state == nullptr) { 53e1c44949Sopenharmony_ci TELEPHONY_LOGE("null pointer"); 54e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 55e1c44949Sopenharmony_ci } 56e1c44949Sopenharmony_ci videoStateMap_[ImsCallMode::CALL_MODE_SEND_ONLY] = state; 57e1c44949Sopenharmony_ci state = (std::make_unique<VideoReceiveState>(this)).release(); 58e1c44949Sopenharmony_ci if (state == nullptr) { 59e1c44949Sopenharmony_ci TELEPHONY_LOGE("null pointer"); 60e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 61e1c44949Sopenharmony_ci } 62e1c44949Sopenharmony_ci videoStateMap_[ImsCallMode::CALL_MODE_RECEIVE_ONLY] = state; 63e1c44949Sopenharmony_ci state = (std::make_unique<VideoSendReceiveState>(this)).release(); 64e1c44949Sopenharmony_ci if (state == nullptr) { 65e1c44949Sopenharmony_ci TELEPHONY_LOGE("null pointer"); 66e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 67e1c44949Sopenharmony_ci } 68e1c44949Sopenharmony_ci videoStateMap_[ImsCallMode::CALL_MODE_SEND_RECEIVE] = state; 69e1c44949Sopenharmony_ci state = (std::make_unique<VideoPauseState>(this)).release(); 70e1c44949Sopenharmony_ci if (state == nullptr) { 71e1c44949Sopenharmony_ci TELEPHONY_LOGE("null pointer"); 72e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 73e1c44949Sopenharmony_ci } 74e1c44949Sopenharmony_ci videoStateMap_[ImsCallMode::CALL_MODE_VIDEO_PAUSED] = state; 75e1c44949Sopenharmony_ci VideoStateType videoStateType = GetVideoStateType(); 76e1c44949Sopenharmony_ci AssignVideoCallState(videoStateType); 77e1c44949Sopenharmony_ci isInitialized_ = true; 78e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 79e1c44949Sopenharmony_ci} 80e1c44949Sopenharmony_ci 81e1c44949Sopenharmony_civoid IMSCall::AssignVideoCallState(VideoStateType videoStateType) 82e1c44949Sopenharmony_ci{ 83e1c44949Sopenharmony_ci switch (videoStateType) { 84e1c44949Sopenharmony_ci case VideoStateType::TYPE_VOICE: 85e1c44949Sopenharmony_ci videoCallState_ = videoStateMap_[ImsCallMode::CALL_MODE_AUDIO_ONLY]; 86e1c44949Sopenharmony_ci break; 87e1c44949Sopenharmony_ci case VideoStateType::TYPE_SEND_ONLY: 88e1c44949Sopenharmony_ci videoCallState_ = videoStateMap_[ImsCallMode::CALL_MODE_SEND_ONLY]; 89e1c44949Sopenharmony_ci break; 90e1c44949Sopenharmony_ci case VideoStateType::TYPE_RECEIVE_ONLY: 91e1c44949Sopenharmony_ci videoCallState_ = videoStateMap_[ImsCallMode::CALL_MODE_RECEIVE_ONLY]; 92e1c44949Sopenharmony_ci break; 93e1c44949Sopenharmony_ci case VideoStateType::TYPE_VIDEO: 94e1c44949Sopenharmony_ci videoCallState_ = videoStateMap_[ImsCallMode::CALL_MODE_SEND_RECEIVE]; 95e1c44949Sopenharmony_ci break; 96e1c44949Sopenharmony_ci default: 97e1c44949Sopenharmony_ci videoCallState_ = videoStateMap_[ImsCallMode::CALL_MODE_AUDIO_ONLY]; 98e1c44949Sopenharmony_ci break; 99e1c44949Sopenharmony_ci } 100e1c44949Sopenharmony_ci} 101e1c44949Sopenharmony_ci 102e1c44949Sopenharmony_ciint32_t IMSCall::DialingProcess() 103e1c44949Sopenharmony_ci{ 104e1c44949Sopenharmony_ci return CarrierDialingProcess(); 105e1c44949Sopenharmony_ci} 106e1c44949Sopenharmony_ci 107e1c44949Sopenharmony_ciint32_t IMSCall::AnswerCall(int32_t videoState) 108e1c44949Sopenharmony_ci{ 109e1c44949Sopenharmony_ci return CarrierAnswerCall(videoState); 110e1c44949Sopenharmony_ci} 111e1c44949Sopenharmony_ci 112e1c44949Sopenharmony_ciint32_t IMSCall::RejectCall() 113e1c44949Sopenharmony_ci{ 114e1c44949Sopenharmony_ci return CarrierRejectCall(); 115e1c44949Sopenharmony_ci} 116e1c44949Sopenharmony_ci 117e1c44949Sopenharmony_ciint32_t IMSCall::HangUpCall() 118e1c44949Sopenharmony_ci{ 119e1c44949Sopenharmony_ci return CarrierHangUpCall(); 120e1c44949Sopenharmony_ci} 121e1c44949Sopenharmony_ci 122e1c44949Sopenharmony_ciint32_t IMSCall::HoldCall() 123e1c44949Sopenharmony_ci{ 124e1c44949Sopenharmony_ci return CarrierHoldCall(); 125e1c44949Sopenharmony_ci} 126e1c44949Sopenharmony_ci 127e1c44949Sopenharmony_ciint32_t IMSCall::UnHoldCall() 128e1c44949Sopenharmony_ci{ 129e1c44949Sopenharmony_ci return CarrierUnHoldCall(); 130e1c44949Sopenharmony_ci} 131e1c44949Sopenharmony_ci 132e1c44949Sopenharmony_ciint32_t IMSCall::SwitchCall() 133e1c44949Sopenharmony_ci{ 134e1c44949Sopenharmony_ci return CarrierSwitchCall(); 135e1c44949Sopenharmony_ci} 136e1c44949Sopenharmony_ci 137e1c44949Sopenharmony_ciint32_t IMSCall::StartRtt(std::u16string &msg) 138e1c44949Sopenharmony_ci{ 139e1c44949Sopenharmony_ci CellularCallInfo callInfo; 140e1c44949Sopenharmony_ci int32_t ret = PackCellularCallInfo(callInfo); 141e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 142e1c44949Sopenharmony_ci TELEPHONY_LOGW("PackCellularCallInfo failed!"); 143e1c44949Sopenharmony_ci return ret; 144e1c44949Sopenharmony_ci } 145e1c44949Sopenharmony_ci ret = DelayedSingleton<CellularCallConnection>::GetInstance()->StartRtt(callInfo, msg); 146e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 147e1c44949Sopenharmony_ci TELEPHONY_LOGE("StartRtt failed!"); 148e1c44949Sopenharmony_ci return CALL_ERR_STARTRTT_FAILED; 149e1c44949Sopenharmony_ci } 150e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 151e1c44949Sopenharmony_ci} 152e1c44949Sopenharmony_ci 153e1c44949Sopenharmony_ciint32_t IMSCall::StopRtt() 154e1c44949Sopenharmony_ci{ 155e1c44949Sopenharmony_ci CellularCallInfo callInfo; 156e1c44949Sopenharmony_ci int32_t ret = PackCellularCallInfo(callInfo); 157e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 158e1c44949Sopenharmony_ci TELEPHONY_LOGW("PackCellularCallInfo failed!"); 159e1c44949Sopenharmony_ci return ret; 160e1c44949Sopenharmony_ci } 161e1c44949Sopenharmony_ci ret = DelayedSingleton<CellularCallConnection>::GetInstance()->StopRtt(callInfo); 162e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 163e1c44949Sopenharmony_ci TELEPHONY_LOGE("StopRtt failed!"); 164e1c44949Sopenharmony_ci return CALL_ERR_STOPRTT_FAILED; 165e1c44949Sopenharmony_ci } 166e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 167e1c44949Sopenharmony_ci} 168e1c44949Sopenharmony_ci 169e1c44949Sopenharmony_ciint32_t IMSCall::SetMute(int32_t mute, int32_t slotId) 170e1c44949Sopenharmony_ci{ 171e1c44949Sopenharmony_ci return CarrierSetMute(mute, slotId); 172e1c44949Sopenharmony_ci} 173e1c44949Sopenharmony_ci 174e1c44949Sopenharmony_civoid IMSCall::GetCallAttributeInfo(CallAttributeInfo &info) 175e1c44949Sopenharmony_ci{ 176e1c44949Sopenharmony_ci GetCallAttributeCarrierInfo(info); 177e1c44949Sopenharmony_ci} 178e1c44949Sopenharmony_ci 179e1c44949Sopenharmony_ciint32_t IMSCall::CombineConference() 180e1c44949Sopenharmony_ci{ 181e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->SetMainCall(GetCallID()); 182e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 183e1c44949Sopenharmony_ci TELEPHONY_LOGE("SetMainCall failed, error%{public}d", ret); 184e1c44949Sopenharmony_ci return ret; 185e1c44949Sopenharmony_ci } 186e1c44949Sopenharmony_ci ConferenceState currentState = DelayedSingleton<ImsConference>::GetInstance()->GetConferenceState(); 187e1c44949Sopenharmony_ci if (currentState == ConferenceState::CONFERENCE_STATE_CREATING) { 188e1c44949Sopenharmony_ci TELEPHONY_LOGE("skip combine, a process of combine already exsists"); 189e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 190e1c44949Sopenharmony_ci } 191e1c44949Sopenharmony_ci DelayedSingleton<ImsConference>::GetInstance()->SetConferenceState(ConferenceState::CONFERENCE_STATE_CREATING); 192e1c44949Sopenharmony_ci return CarrierCombineConference(); 193e1c44949Sopenharmony_ci} 194e1c44949Sopenharmony_ci 195e1c44949Sopenharmony_civoid IMSCall::HandleCombineConferenceFailEvent() 196e1c44949Sopenharmony_ci{ 197e1c44949Sopenharmony_ci std::set<std::int32_t> subCallIdList = DelayedSingleton<ImsConference>::GetInstance()->GetSubCallIdList(); 198e1c44949Sopenharmony_ci if (subCallIdList.empty()) { 199e1c44949Sopenharmony_ci DelayedSingleton<ImsConference>::GetInstance()->SetMainCall(ERR_ID); 200e1c44949Sopenharmony_ci } else { 201e1c44949Sopenharmony_ci DelayedSingleton<ImsConference>::GetInstance()->SetMainCall(*subCallIdList.begin()); 202e1c44949Sopenharmony_ci } 203e1c44949Sopenharmony_ci ConferenceState oldState = DelayedSingleton<ImsConference>::GetInstance()->GetOldConferenceState(); 204e1c44949Sopenharmony_ci DelayedSingleton<ImsConference>::GetInstance()->SetConferenceState(oldState); 205e1c44949Sopenharmony_ci} 206e1c44949Sopenharmony_ci 207e1c44949Sopenharmony_ciint32_t IMSCall::SeparateConference() 208e1c44949Sopenharmony_ci{ 209e1c44949Sopenharmony_ci return CarrierSeparateConference(); 210e1c44949Sopenharmony_ci} 211e1c44949Sopenharmony_ci 212e1c44949Sopenharmony_ciint32_t IMSCall::KickOutFromConference() 213e1c44949Sopenharmony_ci{ 214e1c44949Sopenharmony_ci return CarrierKickOutFromConference(); 215e1c44949Sopenharmony_ci} 216e1c44949Sopenharmony_ci 217e1c44949Sopenharmony_ciint32_t IMSCall::CanCombineConference() 218e1c44949Sopenharmony_ci{ 219e1c44949Sopenharmony_ci int32_t ret = IsSupportConferenceable(); 220e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 221e1c44949Sopenharmony_ci TELEPHONY_LOGE("call unsupported conference, error%{public}d", ret); 222e1c44949Sopenharmony_ci return ret; 223e1c44949Sopenharmony_ci } 224e1c44949Sopenharmony_ci return DelayedSingleton<ImsConference>::GetInstance()->CanCombineConference(); 225e1c44949Sopenharmony_ci} 226e1c44949Sopenharmony_ci 227e1c44949Sopenharmony_ciint32_t IMSCall::CanSeparateConference() 228e1c44949Sopenharmony_ci{ 229e1c44949Sopenharmony_ci return DelayedSingleton<ImsConference>::GetInstance()->CanSeparateConference(); 230e1c44949Sopenharmony_ci} 231e1c44949Sopenharmony_ci 232e1c44949Sopenharmony_ciint32_t IMSCall::CanKickOutFromConference() 233e1c44949Sopenharmony_ci{ 234e1c44949Sopenharmony_ci return DelayedSingleton<ImsConference>::GetInstance()->CanKickOutFromConference(); 235e1c44949Sopenharmony_ci} 236e1c44949Sopenharmony_ci 237e1c44949Sopenharmony_ciint32_t IMSCall::GetMainCallId(int32_t &mainCallId) 238e1c44949Sopenharmony_ci{ 239e1c44949Sopenharmony_ci mainCallId = DelayedSingleton<ImsConference>::GetInstance()->GetMainCall(); 240e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 241e1c44949Sopenharmony_ci} 242e1c44949Sopenharmony_ci 243e1c44949Sopenharmony_ciint32_t IMSCall::LaunchConference() 244e1c44949Sopenharmony_ci{ 245e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->JoinToConference(GetCallID()); 246e1c44949Sopenharmony_ci if (ret == TELEPHONY_SUCCESS) { 247e1c44949Sopenharmony_ci SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_ACTIVE); 248e1c44949Sopenharmony_ci } 249e1c44949Sopenharmony_ci return ret; 250e1c44949Sopenharmony_ci} 251e1c44949Sopenharmony_ci 252e1c44949Sopenharmony_ciint32_t IMSCall::ExitConference() 253e1c44949Sopenharmony_ci{ 254e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->LeaveFromConference(GetCallID()); 255e1c44949Sopenharmony_ci if (ret == TELEPHONY_SUCCESS) { 256e1c44949Sopenharmony_ci SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_IDLE); 257e1c44949Sopenharmony_ci } 258e1c44949Sopenharmony_ci return ret; 259e1c44949Sopenharmony_ci} 260e1c44949Sopenharmony_ci 261e1c44949Sopenharmony_ciint32_t IMSCall::HoldConference() 262e1c44949Sopenharmony_ci{ 263e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->HoldConference(GetCallID()); 264e1c44949Sopenharmony_ci if (ret == TELEPHONY_SUCCESS) { 265e1c44949Sopenharmony_ci SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_HOLDING); 266e1c44949Sopenharmony_ci } 267e1c44949Sopenharmony_ci return ret; 268e1c44949Sopenharmony_ci} 269e1c44949Sopenharmony_ci 270e1c44949Sopenharmony_ciint32_t IMSCall::GetSubCallIdList(std::vector<std::u16string> &callIdList) 271e1c44949Sopenharmony_ci{ 272e1c44949Sopenharmony_ci return DelayedSingleton<ImsConference>::GetInstance()->GetSubCallIdList(GetCallID(), callIdList); 273e1c44949Sopenharmony_ci} 274e1c44949Sopenharmony_ci 275e1c44949Sopenharmony_ciint32_t IMSCall::GetCallIdListForConference(std::vector<std::u16string> &callIdList) 276e1c44949Sopenharmony_ci{ 277e1c44949Sopenharmony_ci return DelayedSingleton<ImsConference>::GetInstance()->GetCallIdListForConference(GetCallID(), callIdList); 278e1c44949Sopenharmony_ci} 279e1c44949Sopenharmony_ci 280e1c44949Sopenharmony_ciint32_t IMSCall::IsSupportConferenceable() 281e1c44949Sopenharmony_ci{ 282e1c44949Sopenharmony_ci#ifdef ABILIT_CONFIG_SUPPORT 283e1c44949Sopenharmony_ci bool carrierSupport = GetCarrierConfig(IMS_SUPPORT_CONFERENCE); 284e1c44949Sopenharmony_ci if (!carrierSupport) { 285e1c44949Sopenharmony_ci return TELEPHONY_CONFERENCE_CARRIER_NOT_SUPPORT; 286e1c44949Sopenharmony_ci } 287e1c44949Sopenharmony_ci if (isVideoCall()) { 288e1c44949Sopenharmony_ci carrierSupport = GetCarrierConfig(IMS_VIDEO_SUPPORT_CONFERENCE) 289e1c44949Sopenharmony_ci } 290e1c44949Sopenharmony_ci if (!carrierSupport) { 291e1c44949Sopenharmony_ci return TELEPHONY_CONFERENCE_VIDEO_CALL_NOT_SUPPORT; 292e1c44949Sopenharmony_ci } 293e1c44949Sopenharmony_ci#endif 294e1c44949Sopenharmony_ci return CarrierCall::IsSupportConferenceable(); 295e1c44949Sopenharmony_ci} 296e1c44949Sopenharmony_ci 297e1c44949Sopenharmony_ciint32_t IMSCall::UpdateImsCallMode(ImsCallMode mode) 298e1c44949Sopenharmony_ci{ 299e1c44949Sopenharmony_ci std::lock_guard<std::mutex> lock(videoUpdateMutex_); 300e1c44949Sopenharmony_ci int32_t ret = TELEPHONY_SUCCESS; 301e1c44949Sopenharmony_ci if (GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) { 302e1c44949Sopenharmony_ci TELEPHONY_LOGE("call state is not active"); 303e1c44949Sopenharmony_ci return CALL_ERR_CALL_STATE; 304e1c44949Sopenharmony_ci } 305e1c44949Sopenharmony_ci if (videoCallState_ == nullptr) { 306e1c44949Sopenharmony_ci TELEPHONY_LOGE("unexpected null pointer"); 307e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 308e1c44949Sopenharmony_ci } 309e1c44949Sopenharmony_ci VideoUpdateStatus status = videoCallState_->GetVideoUpdateStatus(); 310e1c44949Sopenharmony_ci if (VideoUpdateStatus::STATUS_NONE == status) { 311e1c44949Sopenharmony_ci ret = videoCallState_->SendUpdateCallMediaModeRequest(mode); 312e1c44949Sopenharmony_ci } else if (VideoUpdateStatus::STATUS_RECV_REQUEST == status) { 313e1c44949Sopenharmony_ci ret = videoCallState_->SendUpdateCallMediaModeResponse(mode); 314e1c44949Sopenharmony_ci } 315e1c44949Sopenharmony_ci return ret; 316e1c44949Sopenharmony_ci} 317e1c44949Sopenharmony_ci 318e1c44949Sopenharmony_ciint32_t IMSCall::ReportImsCallModeInfo(CallMediaModeInfo &imsCallModeInfo) 319e1c44949Sopenharmony_ci{ 320e1c44949Sopenharmony_ci TELEPHONY_LOGI("callMode:%{public}d", imsCallModeInfo.callMode); 321e1c44949Sopenharmony_ci return DelayedSingleton<VideoControlManager>::GetInstance()->ReportImsCallModeInfo(imsCallModeInfo); 322e1c44949Sopenharmony_ci} 323e1c44949Sopenharmony_ci 324e1c44949Sopenharmony_ciint32_t IMSCall::SendUpdateCallMediaModeRequest(ImsCallMode mode) 325e1c44949Sopenharmony_ci{ 326e1c44949Sopenharmony_ci CellularCallInfo callInfo; 327e1c44949Sopenharmony_ci int32_t ret = PackCellularCallInfo(callInfo); 328e1c44949Sopenharmony_ci TELEPHONY_LOGI("SendUpdateCallMediaModeRequest callMode:%{public}d", mode); 329e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 330e1c44949Sopenharmony_ci TELEPHONY_LOGW("PackCellularCallInfo failed!"); 331e1c44949Sopenharmony_ci return ret; 332e1c44949Sopenharmony_ci } 333e1c44949Sopenharmony_ci ret = DelayedSingleton<CellularCallConnection>::GetInstance()->SendUpdateCallMediaModeRequest(callInfo, mode); 334e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 335e1c44949Sopenharmony_ci TELEPHONY_LOGE("send update media failed, errno:%{public}d!", ret); 336e1c44949Sopenharmony_ci return ret; 337e1c44949Sopenharmony_ci } 338e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 339e1c44949Sopenharmony_ci} 340e1c44949Sopenharmony_ci 341e1c44949Sopenharmony_ciint32_t IMSCall::SendUpdateCallMediaModeResponse(ImsCallMode mode) 342e1c44949Sopenharmony_ci{ 343e1c44949Sopenharmony_ci CellularCallInfo callInfo; 344e1c44949Sopenharmony_ci int32_t ret = PackCellularCallInfo(callInfo); 345e1c44949Sopenharmony_ci TELEPHONY_LOGI("SendUpdateCallMediaModeResponse callMode:%{public}d", mode); 346e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 347e1c44949Sopenharmony_ci TELEPHONY_LOGW("PackCellularCallInfo failed!"); 348e1c44949Sopenharmony_ci return ret; 349e1c44949Sopenharmony_ci } 350e1c44949Sopenharmony_ci ret = DelayedSingleton<CellularCallConnection>::GetInstance()->SendUpdateCallMediaModeResponse(callInfo, mode); 351e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 352e1c44949Sopenharmony_ci TELEPHONY_LOGE("send update media failed, errno:%{public}d!", ret); 353e1c44949Sopenharmony_ci return ret; 354e1c44949Sopenharmony_ci } 355e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 356e1c44949Sopenharmony_ci} 357e1c44949Sopenharmony_ci 358e1c44949Sopenharmony_ciint32_t IMSCall::RecieveUpdateCallMediaModeRequest(CallModeReportInfo &response) 359e1c44949Sopenharmony_ci{ 360e1c44949Sopenharmony_ci std::lock_guard<std::mutex> lock(videoUpdateMutex_); 361e1c44949Sopenharmony_ci if (videoCallState_ == nullptr) { 362e1c44949Sopenharmony_ci TELEPHONY_LOGE("unexpected null pointer"); 363e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 364e1c44949Sopenharmony_ci } 365e1c44949Sopenharmony_ci CallMediaModeInfo callModeInfo; 366e1c44949Sopenharmony_ci callModeInfo.callId = GetCallID(); 367e1c44949Sopenharmony_ci callModeInfo.result = response.result; 368e1c44949Sopenharmony_ci callModeInfo.callMode = response.callMode; 369e1c44949Sopenharmony_ci callModeInfo.isRequestInfo = true; 370e1c44949Sopenharmony_ci TELEPHONY_LOGI("RecieveUpdateCallMediaModeRequest callMode:%{public}d", callModeInfo.callMode); 371e1c44949Sopenharmony_ci return videoCallState_->RecieveUpdateCallMediaModeRequest(callModeInfo); 372e1c44949Sopenharmony_ci} 373e1c44949Sopenharmony_ci 374e1c44949Sopenharmony_ciint32_t IMSCall::ReceiveUpdateCallMediaModeResponse(CallModeReportInfo &response) 375e1c44949Sopenharmony_ci{ 376e1c44949Sopenharmony_ci std::lock_guard<std::mutex> lock(videoUpdateMutex_); 377e1c44949Sopenharmony_ci if (videoCallState_ == nullptr) { 378e1c44949Sopenharmony_ci TELEPHONY_LOGE("unexpected null pointer"); 379e1c44949Sopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 380e1c44949Sopenharmony_ci } 381e1c44949Sopenharmony_ci CallMediaModeInfo callModeInfo; 382e1c44949Sopenharmony_ci callModeInfo.callId = GetCallID(); 383e1c44949Sopenharmony_ci callModeInfo.result = response.result; 384e1c44949Sopenharmony_ci callModeInfo.callMode = response.callMode; 385e1c44949Sopenharmony_ci callModeInfo.isRequestInfo = false; 386e1c44949Sopenharmony_ci TELEPHONY_LOGI("ReceiveUpdateCallMediaModeResponse callMode:%{public}d", callModeInfo.callMode); 387e1c44949Sopenharmony_ci if (response.result == VideoRequestResultType::TYPE_REQUEST_SUCCESS) { 388e1c44949Sopenharmony_ci return videoCallState_->ReceiveUpdateCallMediaModeResponse(callModeInfo); 389e1c44949Sopenharmony_ci } 390e1c44949Sopenharmony_ci callModeInfo.callMode = ImsCallMode::CALL_MODE_AUDIO_ONLY; 391e1c44949Sopenharmony_ci return videoCallState_->ReceiveUpdateCallMediaModeResponse(callModeInfo); 392e1c44949Sopenharmony_ci} 393e1c44949Sopenharmony_ci 394e1c44949Sopenharmony_ciint32_t IMSCall::ControlCamera(std::string &cameraId, int32_t callingUid, int32_t callingPid) 395e1c44949Sopenharmony_ci{ 396e1c44949Sopenharmony_ci TELEPHONY_LOGI("cameraId:%{public}s", cameraId.c_str()); 397e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<CellularCallConnection>::GetInstance()->ControlCamera( 398e1c44949Sopenharmony_ci GetSlotId(), GetCallIndex(), cameraId, callingUid, callingPid); 399e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 400e1c44949Sopenharmony_ci TELEPHONY_LOGE("CancelCallUpgrade failed!"); 401e1c44949Sopenharmony_ci return ret; 402e1c44949Sopenharmony_ci } 403e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 404e1c44949Sopenharmony_ci} 405e1c44949Sopenharmony_ci 406e1c44949Sopenharmony_ciint32_t IMSCall::SetPreviewWindow(std::string &surfaceId, sptr<Surface> surface) 407e1c44949Sopenharmony_ci{ 408e1c44949Sopenharmony_ci TELEPHONY_LOGI("surfaceId:%{public}s", surfaceId.c_str()); 409e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<CellularCallConnection>::GetInstance()->SetPreviewWindow( 410e1c44949Sopenharmony_ci GetSlotId(), GetCallIndex(), surfaceId, surface); 411e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 412e1c44949Sopenharmony_ci TELEPHONY_LOGE("CancelCallUpgrade failed!"); 413e1c44949Sopenharmony_ci return ret; 414e1c44949Sopenharmony_ci } 415e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 416e1c44949Sopenharmony_ci} 417e1c44949Sopenharmony_ci 418e1c44949Sopenharmony_ciint32_t IMSCall::SetDisplayWindow(std::string &surfaceId, sptr<Surface> surface) 419e1c44949Sopenharmony_ci{ 420e1c44949Sopenharmony_ci TELEPHONY_LOGI("surfaceId:%{public}s", surfaceId.c_str()); 421e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<CellularCallConnection>::GetInstance()->SetDisplayWindow( 422e1c44949Sopenharmony_ci GetSlotId(), GetCallIndex(), surfaceId, surface); 423e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 424e1c44949Sopenharmony_ci TELEPHONY_LOGE("CancelCallUpgrade failed!"); 425e1c44949Sopenharmony_ci return ret; 426e1c44949Sopenharmony_ci } 427e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 428e1c44949Sopenharmony_ci} 429e1c44949Sopenharmony_ci 430e1c44949Sopenharmony_ciint32_t IMSCall::SetPausePicture(std::string &path) 431e1c44949Sopenharmony_ci{ 432e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<CellularCallConnection>::GetInstance()->SetPausePicture( 433e1c44949Sopenharmony_ci GetSlotId(), GetCallIndex(), path); 434e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 435e1c44949Sopenharmony_ci TELEPHONY_LOGE("CancelCallUpgrade failed!"); 436e1c44949Sopenharmony_ci return ret; 437e1c44949Sopenharmony_ci } 438e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 439e1c44949Sopenharmony_ci} 440e1c44949Sopenharmony_ci 441e1c44949Sopenharmony_ciint32_t IMSCall::SetDeviceDirection(int32_t rotation) 442e1c44949Sopenharmony_ci{ 443e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<CellularCallConnection>::GetInstance()->SetDeviceDirection( 444e1c44949Sopenharmony_ci GetSlotId(), GetCallIndex(), rotation); 445e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 446e1c44949Sopenharmony_ci TELEPHONY_LOGE("CancelCallUpgrade failed!"); 447e1c44949Sopenharmony_ci return ret; 448e1c44949Sopenharmony_ci } 449e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 450e1c44949Sopenharmony_ci} 451e1c44949Sopenharmony_ci 452e1c44949Sopenharmony_ciint32_t IMSCall::RequestCameraCapabilities() 453e1c44949Sopenharmony_ci{ 454e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<CellularCallConnection>::GetInstance()->RequestCameraCapabilities( 455e1c44949Sopenharmony_ci GetSlotId(), GetCallIndex()); 456e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 457e1c44949Sopenharmony_ci TELEPHONY_LOGE("CancelCallUpgrade failed!"); 458e1c44949Sopenharmony_ci return ret; 459e1c44949Sopenharmony_ci } 460e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 461e1c44949Sopenharmony_ci} 462e1c44949Sopenharmony_ci 463e1c44949Sopenharmony_ciint32_t IMSCall::CancelCallUpgrade() 464e1c44949Sopenharmony_ci{ 465e1c44949Sopenharmony_ci int32_t ret = DelayedSingleton<CellularCallConnection>::GetInstance()->CancelCallUpgrade( 466e1c44949Sopenharmony_ci GetSlotId(), GetCallIndex()); 467e1c44949Sopenharmony_ci if (ret != TELEPHONY_SUCCESS) { 468e1c44949Sopenharmony_ci TELEPHONY_LOGE("CancelCallUpgrade failed!"); 469e1c44949Sopenharmony_ci return ret; 470e1c44949Sopenharmony_ci } 471e1c44949Sopenharmony_ci return TELEPHONY_SUCCESS; 472e1c44949Sopenharmony_ci} 473e1c44949Sopenharmony_ci 474e1c44949Sopenharmony_civoid IMSCall::SwitchVideoState(ImsCallMode mode) 475e1c44949Sopenharmony_ci{ 476e1c44949Sopenharmony_ci // save old state. 477e1c44949Sopenharmony_ci TELEPHONY_LOGI("SwitchVideoState call %{public}d switch to state %{public}d", GetCallID(), mode); 478e1c44949Sopenharmony_ci if (videoStateMap_.find(mode) != videoStateMap_.end()) { 479e1c44949Sopenharmony_ci videoCallState_ = videoStateMap_[mode]; 480e1c44949Sopenharmony_ci } else { 481e1c44949Sopenharmony_ci videoCallState_ = videoStateMap_[ImsCallMode::CALL_MODE_AUDIO_ONLY]; 482e1c44949Sopenharmony_ci } 483e1c44949Sopenharmony_ci return; 484e1c44949Sopenharmony_ci} 485e1c44949Sopenharmony_ci 486e1c44949Sopenharmony_cibool IMSCall::IsSupportVideoCall() 487e1c44949Sopenharmony_ci{ 488e1c44949Sopenharmony_ci bool isSupportVideoCall = true; 489e1c44949Sopenharmony_ci#ifdef ABILITY_CONFIG_SUPPORT 490e1c44949Sopenharmony_ci isSupportVideoCall = GetCarrierConfig(ITEM_VIDEO_CALL); 491e1c44949Sopenharmony_ci#endif 492e1c44949Sopenharmony_ci if (GetTelCallState() == TelCallState::CALL_STATUS_INCOMING) { 493e1c44949Sopenharmony_ci TELEPHONY_LOGW("incoming call not support video upgrade"); 494e1c44949Sopenharmony_ci isSupportVideoCall = false; 495e1c44949Sopenharmony_ci } 496e1c44949Sopenharmony_ci if (GetEmergencyState()) { 497e1c44949Sopenharmony_ci TELEPHONY_LOGW("emergency call not support video upgrade"); 498e1c44949Sopenharmony_ci isSupportVideoCall = false; 499e1c44949Sopenharmony_ci } 500e1c44949Sopenharmony_ci return isSupportVideoCall; 501e1c44949Sopenharmony_ci} 502e1c44949Sopenharmony_ci 503e1c44949Sopenharmony_cisptr<VideoCallState> IMSCall::GetCallVideoState(ImsCallMode mode) 504e1c44949Sopenharmony_ci{ 505e1c44949Sopenharmony_ci TELEPHONY_LOGI("get call video state %{public}d", mode); 506e1c44949Sopenharmony_ci if (videoStateMap_.find(mode) != videoStateMap_.end()) { 507e1c44949Sopenharmony_ci return videoStateMap_[mode]; 508e1c44949Sopenharmony_ci } else { 509e1c44949Sopenharmony_ci return nullptr; 510e1c44949Sopenharmony_ci } 511e1c44949Sopenharmony_ci} 512e1c44949Sopenharmony_ci 513e1c44949Sopenharmony_cibool IMSCall::IsVoiceModifyToVideo() 514e1c44949Sopenharmony_ci{ 515e1c44949Sopenharmony_ci if (videoCallState_ != nullptr && 516e1c44949Sopenharmony_ci VideoUpdateStatus::STATUS_SEND_REQUEST == videoCallState_->GetVideoUpdateStatus()) { 517e1c44949Sopenharmony_ci return true; 518e1c44949Sopenharmony_ci } 519e1c44949Sopenharmony_ci return false; 520e1c44949Sopenharmony_ci} 521e1c44949Sopenharmony_ci} // namespace Telephony 522e1c44949Sopenharmony_ci} // namespace OHOS 523