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 "video_call_state.h"
17e1c44949Sopenharmony_ci
18e1c44949Sopenharmony_ci#include "telephony_errors.h"
19e1c44949Sopenharmony_ci#include "telephony_log_wrapper.h"
20e1c44949Sopenharmony_ci#include "call_manager_errors.h"
21e1c44949Sopenharmony_ci#include "ims_call.h"
22e1c44949Sopenharmony_ci
23e1c44949Sopenharmony_cinamespace OHOS {
24e1c44949Sopenharmony_cinamespace Telephony {
25e1c44949Sopenharmony_ciVideoCallState::VideoCallState(sptr<NetCallBase> callPtr)
26e1c44949Sopenharmony_ci    : call_(callPtr), updateStatus_(VideoUpdateStatus::STATUS_NONE)
27e1c44949Sopenharmony_ci{}
28e1c44949Sopenharmony_ci
29e1c44949Sopenharmony_cibool VideoCallState::IsCallSupportVideoCall()
30e1c44949Sopenharmony_ci{
31e1c44949Sopenharmony_ci    if (call_ == nullptr) {
32e1c44949Sopenharmony_ci        TELEPHONY_LOGE("unexpected null pointer.");
33e1c44949Sopenharmony_ci        return false;
34e1c44949Sopenharmony_ci    }
35e1c44949Sopenharmony_ci    sptr<IMSCall> netCall = static_cast<IMSCall *>(call_.GetRefPtr());
36e1c44949Sopenharmony_ci    return netCall->IsSupportVideoCall();
37e1c44949Sopenharmony_ci}
38e1c44949Sopenharmony_ci
39e1c44949Sopenharmony_civoid VideoCallState::SetVideoUpdateStatus(VideoUpdateStatus status)
40e1c44949Sopenharmony_ci{
41e1c44949Sopenharmony_ci    updateStatus_ = status;
42e1c44949Sopenharmony_ci}
43e1c44949Sopenharmony_ci
44e1c44949Sopenharmony_ciVideoUpdateStatus VideoCallState::GetVideoUpdateStatus()
45e1c44949Sopenharmony_ci{
46e1c44949Sopenharmony_ci    return updateStatus_;
47e1c44949Sopenharmony_ci}
48e1c44949Sopenharmony_ci
49e1c44949Sopenharmony_ciint32_t VideoCallState::SwitchCallVideoState(ImsCallMode mode)
50e1c44949Sopenharmony_ci{
51e1c44949Sopenharmony_ci    if (call_ == nullptr) {
52e1c44949Sopenharmony_ci        TELEPHONY_LOGE("unexpected null pointer.");
53e1c44949Sopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
54e1c44949Sopenharmony_ci    }
55e1c44949Sopenharmony_ci    sptr<IMSCall> netCall = static_cast<IMSCall *>(call_.GetRefPtr());
56e1c44949Sopenharmony_ci    netCall->SwitchVideoState(mode);
57e1c44949Sopenharmony_ci    return TELEPHONY_SUCCESS;
58e1c44949Sopenharmony_ci}
59e1c44949Sopenharmony_ci
60e1c44949Sopenharmony_ciint32_t VideoCallState::DispatchUpdateVideoRequest(ImsCallMode mode)
61e1c44949Sopenharmony_ci{
62e1c44949Sopenharmony_ci    if (call_ == nullptr) {
63e1c44949Sopenharmony_ci        TELEPHONY_LOGE("unexpected null pointer.");
64e1c44949Sopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
65e1c44949Sopenharmony_ci    }
66e1c44949Sopenharmony_ci    return call_->SendUpdateCallMediaModeRequest(mode);
67e1c44949Sopenharmony_ci}
68e1c44949Sopenharmony_ci
69e1c44949Sopenharmony_ciint32_t VideoCallState::DispatchUpdateVideoResponse(ImsCallMode mode)
70e1c44949Sopenharmony_ci{
71e1c44949Sopenharmony_ci    if (call_ == nullptr) {
72e1c44949Sopenharmony_ci        TELEPHONY_LOGE("unexpected null pointer.");
73e1c44949Sopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
74e1c44949Sopenharmony_ci    }
75e1c44949Sopenharmony_ci    return call_->SendUpdateCallMediaModeResponse(mode);
76e1c44949Sopenharmony_ci}
77e1c44949Sopenharmony_ci
78e1c44949Sopenharmony_ciint32_t VideoCallState::DispatchReportVideoCallInfo(CallMediaModeInfo &imsCallModeInfo)
79e1c44949Sopenharmony_ci{
80e1c44949Sopenharmony_ci    if (call_ == nullptr) {
81e1c44949Sopenharmony_ci        TELEPHONY_LOGE("unexpected null pointer.");
82e1c44949Sopenharmony_ci        return TELEPHONY_ERR_LOCAL_PTR_NULL;
83e1c44949Sopenharmony_ci    }
84e1c44949Sopenharmony_ci    return call_->ReportImsCallModeInfo(imsCallModeInfo);
85e1c44949Sopenharmony_ci}
86e1c44949Sopenharmony_ci
87e1c44949Sopenharmony_cisptr<VideoCallState> VideoCallState::GetCallVideoState(ImsCallMode mode)
88e1c44949Sopenharmony_ci{
89e1c44949Sopenharmony_ci    if (call_ == nullptr) {
90e1c44949Sopenharmony_ci        TELEPHONY_LOGE("unexpected null pointer.");
91e1c44949Sopenharmony_ci        return nullptr;
92e1c44949Sopenharmony_ci    }
93e1c44949Sopenharmony_ci    sptr<IMSCall> netCall = static_cast<IMSCall *>(call_.GetRefPtr());
94e1c44949Sopenharmony_ci    return netCall->GetCallVideoState(mode);
95e1c44949Sopenharmony_ci}
96e1c44949Sopenharmony_ci
97e1c44949Sopenharmony_ciAudioOnlyState::AudioOnlyState(sptr<NetCallBase> callPtr) : VideoCallState(callPtr) {}
98e1c44949Sopenharmony_ci
99e1c44949Sopenharmony_ciint32_t AudioOnlyState::SendUpdateCallMediaModeRequest(ImsCallMode mode)
100e1c44949Sopenharmony_ci{
101e1c44949Sopenharmony_ci    int ret = TELEPHONY_SUCCESS;
102e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
103e1c44949Sopenharmony_ci    TELEPHONY_LOGI("AudioOnlyState send update video request. mode:%{public}d, status %{public}d", mode, status);
104e1c44949Sopenharmony_ci    switch (mode) {
105e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
106e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
107e1c44949Sopenharmony_ci            break;
108e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
109e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
110e1c44949Sopenharmony_ci            TELEPHONY_LOGE("illegal media type.");
111e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
112e1c44949Sopenharmony_ci            break;
113e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
114e1c44949Sopenharmony_ci            if (!IsCallSupportVideoCall()) {
115e1c44949Sopenharmony_ci                TELEPHONY_LOGE("call not support video, end.");
116e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_NOT_SUPPORTED;
117e1c44949Sopenharmony_ci            }
118e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
119e1c44949Sopenharmony_ci                TELEPHONY_LOGE("update is in progress. no need");
120e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_IN_PROGRESS;
121e1c44949Sopenharmony_ci            }
122e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoRequest(mode);
123e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
124e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when send updateRequest to call");
125e1c44949Sopenharmony_ci                return ret;
126e1c44949Sopenharmony_ci            }
127e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_SEND_REQUEST);
128e1c44949Sopenharmony_ci            break;
129e1c44949Sopenharmony_ci        default:
130e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown call media type.");
131e1c44949Sopenharmony_ci            return CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
132e1c44949Sopenharmony_ci    }
133e1c44949Sopenharmony_ci    return ret;
134e1c44949Sopenharmony_ci}
135e1c44949Sopenharmony_ci
136e1c44949Sopenharmony_ciint32_t AudioOnlyState::RecieveUpdateCallMediaModeRequest(CallMediaModeInfo &imsCallModeInfo)
137e1c44949Sopenharmony_ci{
138e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
139e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
140e1c44949Sopenharmony_ci    TELEPHONY_LOGI("AudioOnlyState receive update video request. mode:%{public}d, status %{public}d",
141e1c44949Sopenharmony_ci        imsCallModeInfo.callMode, status);
142e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
143e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
144e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
145e1c44949Sopenharmony_ci            TELEPHONY_LOGI("invalid media state request.");
146e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
147e1c44949Sopenharmony_ci            break;
148e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
149e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
150e1c44949Sopenharmony_ci                TELEPHONY_LOGE("video update in progress");
151e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_IN_PROGRESS;
152e1c44949Sopenharmony_ci            }
153e1c44949Sopenharmony_ci            // notify app to accept or refuse, assume always accept here
154e1c44949Sopenharmony_ci            (void)DispatchReportVideoCallInfo(imsCallModeInfo);
155e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_RECV_REQUEST);
156e1c44949Sopenharmony_ci            break;
157e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
158e1c44949Sopenharmony_ci            TELEPHONY_LOGI("receive request.");
159e1c44949Sopenharmony_ci            break;
160e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
161e1c44949Sopenharmony_ci            if (!IsCallSupportVideoCall()) {
162e1c44949Sopenharmony_ci                TELEPHONY_LOGE("not support video, refuse");
163e1c44949Sopenharmony_ci                (void)DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_AUDIO_ONLY);
164e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
165e1c44949Sopenharmony_ci            }
166e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
167e1c44949Sopenharmony_ci                TELEPHONY_LOGE("video update in progress");
168e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_IN_PROGRESS;
169e1c44949Sopenharmony_ci            }
170e1c44949Sopenharmony_ci            // notify app to accept or refuse, assume always accept here
171e1c44949Sopenharmony_ci            (void)DispatchReportVideoCallInfo(imsCallModeInfo);
172e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_RECV_REQUEST);
173e1c44949Sopenharmony_ci            break;
174e1c44949Sopenharmony_ci        default:
175e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown call media type.");
176e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
177e1c44949Sopenharmony_ci            break;
178e1c44949Sopenharmony_ci    }
179e1c44949Sopenharmony_ci    return ret;
180e1c44949Sopenharmony_ci}
181e1c44949Sopenharmony_ci
182e1c44949Sopenharmony_ciint32_t AudioOnlyState::SendUpdateCallMediaModeResponse(ImsCallMode mode)
183e1c44949Sopenharmony_ci{
184e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
185e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
186e1c44949Sopenharmony_ci    TELEPHONY_LOGI("AudioOnlyState send update video response. mode:%{public}d, status %{public}d", mode, status);
187e1c44949Sopenharmony_ci    switch (mode) {
188e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
189e1c44949Sopenharmony_ci            if (!IsCallSupportVideoCall()) {
190e1c44949Sopenharmony_ci                TELEPHONY_LOGE("not support video, refuse");
191e1c44949Sopenharmony_ci                (void)DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_AUDIO_ONLY);
192e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
193e1c44949Sopenharmony_ci            }
194e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_RECV_REQUEST) {
195e1c44949Sopenharmony_ci                TELEPHONY_LOGE("video update in progress");
196e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_IN_PROGRESS;
197e1c44949Sopenharmony_ci            }
198e1c44949Sopenharmony_ci            // notify app to accept or refuse, assume always accept here
199e1c44949Sopenharmony_ci            (void)DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_AUDIO_ONLY);
200e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
201e1c44949Sopenharmony_ci            break;
202e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
203e1c44949Sopenharmony_ci            TELEPHONY_LOGI("invalid media state request.");
204e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
205e1c44949Sopenharmony_ci            break;
206e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
207e1c44949Sopenharmony_ci            TELEPHONY_LOGI("receive request.");
208e1c44949Sopenharmony_ci            break;
209e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
210e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
211e1c44949Sopenharmony_ci            if (!IsCallSupportVideoCall()) {
212e1c44949Sopenharmony_ci                TELEPHONY_LOGE("not support video, refuse");
213e1c44949Sopenharmony_ci                (void)DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_AUDIO_ONLY);
214e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
215e1c44949Sopenharmony_ci            }
216e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_RECV_REQUEST) {
217e1c44949Sopenharmony_ci                TELEPHONY_LOGE("video update in progress");
218e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_IN_PROGRESS;
219e1c44949Sopenharmony_ci            }
220e1c44949Sopenharmony_ci            // notify app to accept or refuse, assume always accept here
221e1c44949Sopenharmony_ci            (void)DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_SEND_RECEIVE);
222e1c44949Sopenharmony_ci            (void)SwitchCallVideoState(ImsCallMode::CALL_MODE_SEND_RECEIVE);
223e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
224e1c44949Sopenharmony_ci            break;
225e1c44949Sopenharmony_ci        default:
226e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown call media type.");
227e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
228e1c44949Sopenharmony_ci            break;
229e1c44949Sopenharmony_ci    }
230e1c44949Sopenharmony_ci    return ret;
231e1c44949Sopenharmony_ci}
232e1c44949Sopenharmony_ci
233e1c44949Sopenharmony_ciint32_t AudioOnlyState::ReceiveUpdateCallMediaModeResponse(CallMediaModeInfo &imsCallModeInfo)
234e1c44949Sopenharmony_ci{
235e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
236e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
237e1c44949Sopenharmony_ci    TELEPHONY_LOGI(
238e1c44949Sopenharmony_ci        "AudioOnlyState receive response, mode %{public}d, status %{public}d", imsCallModeInfo.callMode, status);
239e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
240e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
241e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_SEND_REQUEST) {
242e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
243e1c44949Sopenharmony_ci            }
244e1c44949Sopenharmony_ci            (void)SwitchCallVideoState(ImsCallMode::CALL_MODE_SEND_RECEIVE);
245e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
246e1c44949Sopenharmony_ci            // notify app to accept or refuse, assume always accept here
247e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
248e1c44949Sopenharmony_ci            break;
249e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
250e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
251e1c44949Sopenharmony_ci            // notify app to accept or refuse, assume always accept here
252e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
253e1c44949Sopenharmony_ci            break;
254e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
255e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_RECV_REQUEST) {
256e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
257e1c44949Sopenharmony_ci            }
258e1c44949Sopenharmony_ci            (void)SwitchCallVideoState(ImsCallMode::CALL_MODE_RECEIVE_ONLY);
259e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
260e1c44949Sopenharmony_ci            // notify app to accept or refuse, assume always accept here
261e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
262e1c44949Sopenharmony_ci            break;
263e1c44949Sopenharmony_ci        default:
264e1c44949Sopenharmony_ci            TELEPHONY_LOGI("other media type, ignored");
265e1c44949Sopenharmony_ci            break;
266e1c44949Sopenharmony_ci    }
267e1c44949Sopenharmony_ci    return ret;
268e1c44949Sopenharmony_ci}
269e1c44949Sopenharmony_ci
270e1c44949Sopenharmony_ciVideoSendState::VideoSendState(sptr<NetCallBase> callPtr) : VideoCallState(callPtr) {}
271e1c44949Sopenharmony_ci
272e1c44949Sopenharmony_ciint32_t VideoSendState::SendUpdateCallMediaModeRequest(ImsCallMode mode)
273e1c44949Sopenharmony_ci{
274e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendState send update video request. mode:%{public}d", mode);
275e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
276e1c44949Sopenharmony_ci    switch (mode) {
277e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
278e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
279e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoRequest(mode);
280e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
281e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when dispatch request");
282e1c44949Sopenharmony_ci                return ret;
283e1c44949Sopenharmony_ci            }
284e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(mode); // switch call video state
285e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
286e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when switch call state");
287e1c44949Sopenharmony_ci                return ret;
288e1c44949Sopenharmony_ci            }
289e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
290e1c44949Sopenharmony_ci            break;
291e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
292e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
293e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
294e1c44949Sopenharmony_ci            TELEPHONY_LOGE("already in progress.");
295e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_IN_PROGRESS;
296e1c44949Sopenharmony_ci            break;
297e1c44949Sopenharmony_ci        default:
298e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
299e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
300e1c44949Sopenharmony_ci            break;
301e1c44949Sopenharmony_ci    }
302e1c44949Sopenharmony_ci    return ret;
303e1c44949Sopenharmony_ci}
304e1c44949Sopenharmony_ci
305e1c44949Sopenharmony_ciint32_t VideoSendState::RecieveUpdateCallMediaModeRequest(CallMediaModeInfo &imsCallModeInfo)
306e1c44949Sopenharmony_ci{
307e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
308e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
309e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendState receive update video request. mode:%{public}d, status:%{public}d",
310e1c44949Sopenharmony_ci        imsCallModeInfo.callMode, status);
311e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
312e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
313e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
314e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode);
315e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
316e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when switch call state.");
317e1c44949Sopenharmony_ci                return ret;
318e1c44949Sopenharmony_ci            }
319e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
320e1c44949Sopenharmony_ci            break;
321e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
322e1c44949Sopenharmony_ci            TELEPHONY_LOGE("invalid media state request.");
323e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
324e1c44949Sopenharmony_ci            break;
325e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
326e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
327e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
328e1c44949Sopenharmony_ci                TELEPHONY_LOGE("already in progress.");
329e1c44949Sopenharmony_ci                ret = CALL_ERR_VIDEO_IN_PROGRESS;
330e1c44949Sopenharmony_ci            }
331e1c44949Sopenharmony_ci            break;
332e1c44949Sopenharmony_ci        default:
333e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
334e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
335e1c44949Sopenharmony_ci            break;
336e1c44949Sopenharmony_ci    }
337e1c44949Sopenharmony_ci    return ret;
338e1c44949Sopenharmony_ci}
339e1c44949Sopenharmony_ci
340e1c44949Sopenharmony_ciint32_t VideoSendState::SendUpdateCallMediaModeResponse(ImsCallMode mode)
341e1c44949Sopenharmony_ci{
342e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendState send response ignored. mode %{public}d", mode);
343e1c44949Sopenharmony_ci    return TELEPHONY_SUCCESS;
344e1c44949Sopenharmony_ci}
345e1c44949Sopenharmony_ci
346e1c44949Sopenharmony_ciint32_t VideoSendState::ReceiveUpdateCallMediaModeResponse(CallMediaModeInfo &imsCallModeInfo)
347e1c44949Sopenharmony_ci{
348e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
349e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
350e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendState receive update video response. mode:%{public}d, status:%{public}d",
351e1c44949Sopenharmony_ci        imsCallModeInfo.callMode, status);
352e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
353e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
354e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
355e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode);
356e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
357e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when switch call state");
358e1c44949Sopenharmony_ci                return ret;
359e1c44949Sopenharmony_ci            }
360e1c44949Sopenharmony_ci            // set previous state none
361e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
362e1c44949Sopenharmony_ci            break;
363e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
364e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
365e1c44949Sopenharmony_ci            if (status != TELEPHONY_SUCCESS) {
366e1c44949Sopenharmony_ci                TELEPHONY_LOGE("already in progress.");
367e1c44949Sopenharmony_ci                ret = CALL_ERR_VIDEO_IN_PROGRESS;
368e1c44949Sopenharmony_ci            }
369e1c44949Sopenharmony_ci            break;
370e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
371e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_SEND_RECEIVE);
372e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
373e1c44949Sopenharmony_ci                return ret;
374e1c44949Sopenharmony_ci            }
375e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode);
376e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
377e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when switch call");
378e1c44949Sopenharmony_ci                return ret;
379e1c44949Sopenharmony_ci            }
380e1c44949Sopenharmony_ci            if (GetCallVideoState(ImsCallMode::CALL_MODE_AUDIO_ONLY) != nullptr) {
381e1c44949Sopenharmony_ci                GetCallVideoState(ImsCallMode::CALL_MODE_AUDIO_ONLY)->
382e1c44949Sopenharmony_ci                    SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
383e1c44949Sopenharmony_ci                break;
384e1c44949Sopenharmony_ci            } else {
385e1c44949Sopenharmony_ci                TELEPHONY_LOGE("CALL_MODE_AUDIO_ONLY is nullptr");
386e1c44949Sopenharmony_ci                ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
387e1c44949Sopenharmony_ci                break;
388e1c44949Sopenharmony_ci            }
389e1c44949Sopenharmony_ci        default:
390e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
391e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
392e1c44949Sopenharmony_ci            break;
393e1c44949Sopenharmony_ci    }
394e1c44949Sopenharmony_ci    return ret;
395e1c44949Sopenharmony_ci}
396e1c44949Sopenharmony_ci
397e1c44949Sopenharmony_ciVideoReceiveState::VideoReceiveState(sptr<NetCallBase> callPtr) : VideoCallState(callPtr) {}
398e1c44949Sopenharmony_ci
399e1c44949Sopenharmony_ciint32_t VideoReceiveState::SendUpdateCallMediaModeRequest(ImsCallMode mode)
400e1c44949Sopenharmony_ci{
401e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
402e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
403e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoReceiveState send update video request. mode:%{public}d, status:%{public}d", mode, status);
404e1c44949Sopenharmony_ci    switch (mode) {
405e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
406e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
407e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoRequest(mode);
408e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
409e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when dispatch request");
410e1c44949Sopenharmony_ci                return ret;
411e1c44949Sopenharmony_ci            }
412e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(mode);
413e1c44949Sopenharmony_ci            if (ret) {
414e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when switch call state");
415e1c44949Sopenharmony_ci                return ret;
416e1c44949Sopenharmony_ci            }
417e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
418e1c44949Sopenharmony_ci            break;
419e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
420e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
421e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
422e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
423e1c44949Sopenharmony_ci                TELEPHONY_LOGE("already in progress.");
424e1c44949Sopenharmony_ci                ret = CALL_ERR_VIDEO_IN_PROGRESS;
425e1c44949Sopenharmony_ci            }
426e1c44949Sopenharmony_ci            break;
427e1c44949Sopenharmony_ci        default:
428e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
429e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
430e1c44949Sopenharmony_ci            break;
431e1c44949Sopenharmony_ci    }
432e1c44949Sopenharmony_ci    return ret;
433e1c44949Sopenharmony_ci}
434e1c44949Sopenharmony_ci
435e1c44949Sopenharmony_ciint32_t VideoReceiveState::RecieveUpdateCallMediaModeRequest(CallMediaModeInfo &imsCallModeInfo)
436e1c44949Sopenharmony_ci{
437e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
438e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
439e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoReceiveState receive update video request. mode:%{public}d, status:%{public}d",
440e1c44949Sopenharmony_ci        imsCallModeInfo.callMode, status);
441e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
442e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
443e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
444e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode);
445e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
446e1c44949Sopenharmony_ci                return ret;
447e1c44949Sopenharmony_ci            }
448e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
449e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
450e1c44949Sopenharmony_ci            break;
451e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
452e1c44949Sopenharmony_ci            break;
453e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
454e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
455e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
456e1c44949Sopenharmony_ci                TELEPHONY_LOGE("already in progress.");
457e1c44949Sopenharmony_ci                ret = CALL_ERR_VIDEO_IN_PROGRESS;
458e1c44949Sopenharmony_ci            }
459e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
460e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_RECV_REQUEST);
461e1c44949Sopenharmony_ci            break;
462e1c44949Sopenharmony_ci        default:
463e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
464e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
465e1c44949Sopenharmony_ci            break;
466e1c44949Sopenharmony_ci    }
467e1c44949Sopenharmony_ci    return ret;
468e1c44949Sopenharmony_ci}
469e1c44949Sopenharmony_ci
470e1c44949Sopenharmony_ciint32_t VideoReceiveState::SendUpdateCallMediaModeResponse(ImsCallMode mode)
471e1c44949Sopenharmony_ci{
472e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
473e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
474e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoReceiveState send update video response. mode:%{public}d, status:%{public}d", mode, status);
475e1c44949Sopenharmony_ci    switch (mode) {
476e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
477e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
478e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(mode);
479e1c44949Sopenharmony_ci            if (ret == TELEPHONY_SUCCESS) {
480e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when switch call state");
481e1c44949Sopenharmony_ci                return ret;
482e1c44949Sopenharmony_ci            }
483e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
484e1c44949Sopenharmony_ci            break;
485e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
486e1c44949Sopenharmony_ci            break;
487e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
488e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_RECV_REQUEST) {
489e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
490e1c44949Sopenharmony_ci            }
491e1c44949Sopenharmony_ci            DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_RECEIVE_ONLY);
492e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
493e1c44949Sopenharmony_ci            break;
494e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
495e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_RECV_REQUEST) {
496e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
497e1c44949Sopenharmony_ci            }
498e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
499e1c44949Sopenharmony_ci            DispatchUpdateVideoResponse(ImsCallMode::CALL_MODE_SEND_RECEIVE);
500e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(mode);
501e1c44949Sopenharmony_ci            if (ret) {
502e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when switch call state");
503e1c44949Sopenharmony_ci                return ret;
504e1c44949Sopenharmony_ci            }
505e1c44949Sopenharmony_ci            break;
506e1c44949Sopenharmony_ci        default:
507e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
508e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
509e1c44949Sopenharmony_ci            break;
510e1c44949Sopenharmony_ci    }
511e1c44949Sopenharmony_ci    return ret;
512e1c44949Sopenharmony_ci}
513e1c44949Sopenharmony_ci
514e1c44949Sopenharmony_ciint32_t VideoReceiveState::ReceiveUpdateCallMediaModeResponse(CallMediaModeInfo &imsCallModeInfo)
515e1c44949Sopenharmony_ci{
516e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoReceiveState receive update video response. mode:%{public}d", imsCallModeInfo.callMode);
517e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
518e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
519e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
520e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
521e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
522e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode);
523e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
524e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when switch call state");
525e1c44949Sopenharmony_ci                return ret;
526e1c44949Sopenharmony_ci            }
527e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
528e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
529e1c44949Sopenharmony_ci            break;
530e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
531e1c44949Sopenharmony_ci            break;
532e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
533e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
534e1c44949Sopenharmony_ci            if (GetVideoUpdateStatus() != VideoUpdateStatus::STATUS_NONE) {
535e1c44949Sopenharmony_ci                SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
536e1c44949Sopenharmony_ci            }
537e1c44949Sopenharmony_ci            break;
538e1c44949Sopenharmony_ci        default:
539e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
540e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
541e1c44949Sopenharmony_ci            break;
542e1c44949Sopenharmony_ci    }
543e1c44949Sopenharmony_ci    return ret;
544e1c44949Sopenharmony_ci}
545e1c44949Sopenharmony_ci
546e1c44949Sopenharmony_ciVideoSendReceiveState::VideoSendReceiveState(sptr<NetCallBase> callPtr) : VideoCallState(callPtr) {}
547e1c44949Sopenharmony_ci
548e1c44949Sopenharmony_ciint32_t VideoSendReceiveState::SendUpdateCallMediaModeRequest(ImsCallMode mode)
549e1c44949Sopenharmony_ci{
550e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendReceiveState send update video request. mode:%{public}d", mode);
551e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
552e1c44949Sopenharmony_ci    switch (mode) {
553e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
554e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
555e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoRequest(mode);
556e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
557e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when send updateRequest to call");
558e1c44949Sopenharmony_ci                return ret;
559e1c44949Sopenharmony_ci            }
560e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(mode);
561e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
562e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when switch call state");
563e1c44949Sopenharmony_ci                return ret;
564e1c44949Sopenharmony_ci            }
565e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
566e1c44949Sopenharmony_ci            break;
567e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
568e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
569e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoRequest(mode);
570e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
571e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when send updateRequest to call");
572e1c44949Sopenharmony_ci                return ret;
573e1c44949Sopenharmony_ci            }
574e1c44949Sopenharmony_ci            break;
575e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
576e1c44949Sopenharmony_ci            TELEPHONY_LOGE("illegal media type.");
577e1c44949Sopenharmony_ci            return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
578e1c44949Sopenharmony_ci        default:
579e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
580e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
581e1c44949Sopenharmony_ci            break;
582e1c44949Sopenharmony_ci    }
583e1c44949Sopenharmony_ci    return ret;
584e1c44949Sopenharmony_ci}
585e1c44949Sopenharmony_ci
586e1c44949Sopenharmony_ciint32_t VideoSendReceiveState::RecieveUpdateCallMediaModeRequest(CallMediaModeInfo &imsCallModeInfo)
587e1c44949Sopenharmony_ci{
588e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
589e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
590e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendReceiveState receive update video request. mode:%{public}d, status:%{public}d",
591e1c44949Sopenharmony_ci        imsCallModeInfo.callMode, status);
592e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
593e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
594e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode); // support send downgrade & pause video request
595e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
596e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when switch call state");
597e1c44949Sopenharmony_ci                return ret;
598e1c44949Sopenharmony_ci            }
599e1c44949Sopenharmony_ci            (void)DispatchReportVideoCallInfo(imsCallModeInfo);
600e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
601e1c44949Sopenharmony_ci                SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
602e1c44949Sopenharmony_ci            }
603e1c44949Sopenharmony_ci            break;
604e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
605e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
606e1c44949Sopenharmony_ci            TELEPHONY_LOGI("receive update video request");
607e1c44949Sopenharmony_ci            break;
608e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
609e1c44949Sopenharmony_ci            TELEPHONY_LOGI("receive update video request");
610e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_NONE) {
611e1c44949Sopenharmony_ci                TELEPHONY_LOGI("already in progress.");
612e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_IN_PROGRESS;
613e1c44949Sopenharmony_ci            }
614e1c44949Sopenharmony_ci            (void)DispatchReportVideoCallInfo(imsCallModeInfo);
615e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_RECV_REQUEST);
616e1c44949Sopenharmony_ci            break;
617e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
618e1c44949Sopenharmony_ci            (void)DispatchReportVideoCallInfo(imsCallModeInfo);
619e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_RECV_REQUEST);
620e1c44949Sopenharmony_ci            break;
621e1c44949Sopenharmony_ci        default:
622e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
623e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
624e1c44949Sopenharmony_ci            break;
625e1c44949Sopenharmony_ci    }
626e1c44949Sopenharmony_ci    return ret;
627e1c44949Sopenharmony_ci}
628e1c44949Sopenharmony_ci
629e1c44949Sopenharmony_ciint32_t VideoSendReceiveState::SendUpdateCallMediaModeResponse(ImsCallMode mode)
630e1c44949Sopenharmony_ci{
631e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendReceiveState ignore response");
632e1c44949Sopenharmony_ci    return TELEPHONY_SUCCESS;
633e1c44949Sopenharmony_ci}
634e1c44949Sopenharmony_ci
635e1c44949Sopenharmony_ciint32_t VideoSendReceiveState::ReceiveUpdateCallMediaModeResponse(CallMediaModeInfo &imsCallModeInfo)
636e1c44949Sopenharmony_ci{
637e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
638e1c44949Sopenharmony_ci    VideoUpdateStatus status = GetVideoUpdateStatus();
639e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoSendReceiveState receive update video response. mode:%{public}d, status:%{public}d",
640e1c44949Sopenharmony_ci        imsCallModeInfo.callMode, status);
641e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
642e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
643e1c44949Sopenharmony_ci            TELEPHONY_LOGI("receive update video response");
644e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_RECV_REQUEST) {
645e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
646e1c44949Sopenharmony_ci            }
647e1c44949Sopenharmony_ci            DispatchReportVideoCallInfo(imsCallModeInfo);
648e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode); // support send downgrade & pause video request
649e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
650e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occurs when switch call state");
651e1c44949Sopenharmony_ci                return ret;
652e1c44949Sopenharmony_ci            }
653e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
654e1c44949Sopenharmony_ci            break;
655e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
656e1c44949Sopenharmony_ci            if (status != VideoUpdateStatus::STATUS_RECV_REQUEST) {
657e1c44949Sopenharmony_ci                return CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
658e1c44949Sopenharmony_ci            }
659e1c44949Sopenharmony_ci            ret = DispatchReportVideoCallInfo(imsCallModeInfo);
660e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
661e1c44949Sopenharmony_ci            break;
662e1c44949Sopenharmony_ci        default:
663e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
664e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
665e1c44949Sopenharmony_ci            break;
666e1c44949Sopenharmony_ci    }
667e1c44949Sopenharmony_ci    return ret;
668e1c44949Sopenharmony_ci}
669e1c44949Sopenharmony_ci
670e1c44949Sopenharmony_ciVideoPauseState::VideoPauseState(sptr<NetCallBase> callPtr) : VideoCallState(callPtr) {}
671e1c44949Sopenharmony_ci
672e1c44949Sopenharmony_ciint32_t VideoPauseState::SendUpdateCallMediaModeRequest(ImsCallMode mode)
673e1c44949Sopenharmony_ci{
674e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoPauseState send update video request. mode:%{public}d", mode);
675e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
676e1c44949Sopenharmony_ci    switch (mode) {
677e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
678e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
679e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoRequest(mode);
680e1c44949Sopenharmony_ci            if (ret != TELEPHONY_SUCCESS) {
681e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when send updateRequest to call");
682e1c44949Sopenharmony_ci                return ret;
683e1c44949Sopenharmony_ci            }
684e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(mode);
685e1c44949Sopenharmony_ci            if (ret == TELEPHONY_SUCCESS) {
686e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when switch call state");
687e1c44949Sopenharmony_ci                return ret;
688e1c44949Sopenharmony_ci            }
689e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
690e1c44949Sopenharmony_ci            break;
691e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
692e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
693e1c44949Sopenharmony_ci            TELEPHONY_LOGI("send update video state");
694e1c44949Sopenharmony_ci            ret = DispatchUpdateVideoRequest(mode);
695e1c44949Sopenharmony_ci            break;
696e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
697e1c44949Sopenharmony_ci            TELEPHONY_LOGE("illegal media type.");
698e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
699e1c44949Sopenharmony_ci            break;
700e1c44949Sopenharmony_ci        default:
701e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
702e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
703e1c44949Sopenharmony_ci            break;
704e1c44949Sopenharmony_ci    }
705e1c44949Sopenharmony_ci    return ret;
706e1c44949Sopenharmony_ci}
707e1c44949Sopenharmony_ci
708e1c44949Sopenharmony_ciint32_t VideoPauseState::RecieveUpdateCallMediaModeRequest(CallMediaModeInfo &imsCallModeInfo)
709e1c44949Sopenharmony_ci{
710e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoPauseState receive update video request. mode:%{public}d", imsCallModeInfo.callMode);
711e1c44949Sopenharmony_ci    int32_t ret = TELEPHONY_SUCCESS;
712e1c44949Sopenharmony_ci    switch (imsCallModeInfo.callMode) {
713e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_AUDIO_ONLY:
714e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_RECEIVE:
715e1c44949Sopenharmony_ci            ret = SwitchCallVideoState(imsCallModeInfo.callMode);
716e1c44949Sopenharmony_ci            if (ret == TELEPHONY_SUCCESS) {
717e1c44949Sopenharmony_ci                TELEPHONY_LOGE("error occur when switch call state");
718e1c44949Sopenharmony_ci                return ret;
719e1c44949Sopenharmony_ci            }
720e1c44949Sopenharmony_ci            SetVideoUpdateStatus(VideoUpdateStatus::STATUS_NONE);
721e1c44949Sopenharmony_ci            break;
722e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_SEND_ONLY:
723e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_RECEIVE_ONLY:
724e1c44949Sopenharmony_ci            TELEPHONY_LOGI("receive update call media request");
725e1c44949Sopenharmony_ci            break;
726e1c44949Sopenharmony_ci        case ImsCallMode::CALL_MODE_VIDEO_PAUSED:
727e1c44949Sopenharmony_ci            TELEPHONY_LOGE("illegal media type.");
728e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEAGAL_SCENARIO;
729e1c44949Sopenharmony_ci            break;
730e1c44949Sopenharmony_ci        default:
731e1c44949Sopenharmony_ci            TELEPHONY_LOGE("unknown media type.");
732e1c44949Sopenharmony_ci            ret = CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE;
733e1c44949Sopenharmony_ci            break;
734e1c44949Sopenharmony_ci    }
735e1c44949Sopenharmony_ci    return ret;
736e1c44949Sopenharmony_ci}
737e1c44949Sopenharmony_ci
738e1c44949Sopenharmony_ciint32_t VideoPauseState::SendUpdateCallMediaModeResponse(ImsCallMode mode)
739e1c44949Sopenharmony_ci{
740e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoPauseState send update video response. mode:%{public}d", mode);
741e1c44949Sopenharmony_ci    return TELEPHONY_SUCCESS;
742e1c44949Sopenharmony_ci}
743e1c44949Sopenharmony_ci
744e1c44949Sopenharmony_ciint32_t VideoPauseState::ReceiveUpdateCallMediaModeResponse(CallMediaModeInfo &imsCallModeInfo)
745e1c44949Sopenharmony_ci{
746e1c44949Sopenharmony_ci    TELEPHONY_LOGI("VideoPauseState receive update video response. mode:%{public}d", imsCallModeInfo.callMode);
747e1c44949Sopenharmony_ci    return TELEPHONY_SUCCESS;
748e1c44949Sopenharmony_ci}
749e1c44949Sopenharmony_ci} // namespace Telephony
750e1c44949Sopenharmony_ci} // namespace OHOS
751