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