1 /*
2  * Copyright (C) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "call_manager_service.h"
17 
18 #include "accesstoken_kit.h"
19 #include "audio_device_manager.h"
20 #include "audio_proxy.h"
21 #include "bluetooth_call_service.h"
22 #include "call_ability_report_proxy.h"
23 #include "call_manager_dump_helper.h"
24 #include "call_manager_errors.h"
25 #include "call_manager_hisysevent.h"
26 #include "call_records_manager.h"
27 #include "cellular_call_connection.h"
28 #include "common_type.h"
29 #include "core_manager_inner.h"
30 #include "hitrace_meter.h"
31 #include "ipc_skeleton.h"
32 #include "privacy_kit.h"
33 #include "report_call_info_handler.h"
34 #include "telephony_log_wrapper.h"
35 #include "telephony_permission.h"
36 #include "distributed_call_manager.h"
37 #include "video_control_manager.h"
38 #include "voip_call_connection.h"
39 #include "call_earthquake_alarm_subscriber.h"
40 
41 namespace OHOS {
42 namespace Telephony {
43 using namespace Security::AccessToken;
44 static constexpr const char *OHOS_PERMISSION_SET_TELEPHONY_STATE = "ohos.permission.SET_TELEPHONY_STATE";
45 static constexpr const char *OHOS_PERMISSION_GET_TELEPHONY_STATE = "ohos.permission.GET_TELEPHONY_STATE";
46 static constexpr const char *OHOS_PERMISSION_PLACE_CALL = "ohos.permission.PLACE_CALL";
47 static constexpr const char *OHOS_PERMISSION_ANSWER_CALL = "ohos.permission.ANSWER_CALL";
48 static constexpr const char *OHOS_PERMISSION_READ_CALL_LOG = "ohos.permission.READ_CALL_LOG";
49 static constexpr const char *OHOS_PERMISSION_WRITE_CALL_LOG = "ohos.permission.WRITE_CALL_LOG";
50 static constexpr const char *SLOT_ID = "accountId";
51 static constexpr const char *CALL_TYPE = "callType";
52 static constexpr const char *VIDEO_STATE = "videoState";
53 static constexpr int32_t CLEAR_VOICE_MAIL_COUNT = 0;
54 static constexpr int32_t IS_CELIA_CALL = 1;
55 
56 const bool g_registerResult =
57     SystemAbility::MakeAndRegisterAbility(DelayedSingleton<CallManagerService>::GetInstance().get());
58 
CallManagerService()59 CallManagerService::CallManagerService()
60     : SystemAbility(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID, true), callControlManagerPtr_(nullptr)
61 {}
62 
~CallManagerService()63 CallManagerService::~CallManagerService()
64 {
65     UnInit();
66 }
67 
Init()68 bool CallManagerService::Init()
69 {
70     if (!DelayedSingleton<CallControlManager>::GetInstance()->Init()) {
71         TELEPHONY_LOGE("CallControlManager init failed!");
72         return false;
73     }
74     callControlManagerPtr_ = DelayedSingleton<CallControlManager>::GetInstance();
75     if (callControlManagerPtr_ == nullptr) {
76         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
77         return false;
78     }
79     DelayedSingleton<ReportCallInfoHandler>::GetInstance()->Init();
80     DelayedSingleton<CellularCallConnection>::GetInstance()->Init(TELEPHONY_CELLULAR_CALL_SYS_ABILITY_ID);
81     DelayedSingleton<CallRecordsManager>::GetInstance()->Init();
82     DelayedSingleton<BluetoothConnection>::GetInstance()->Init();
83     DelayedSingleton<DistributedCallManager>::GetInstance()->Init();
84     AddSystemAbilityListener(AUDIO_POLICY_SERVICE_ID);
85     return true;
86 }
87 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)88 void CallManagerService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
89 {
90     TELEPHONY_LOGI("OnAddSystemAbility : %{public}d", systemAbilityId);
91     switch (systemAbilityId) {
92         case AUDIO_POLICY_SERVICE_ID:
93             DelayedSingleton<AudioProxy>::GetInstance()->SetAudioMicStateChangeCallback();
94             DelayedSingleton<AudioProxy>::GetInstance()->SetAudioDeviceChangeCallback();
95             DelayedSingleton<AudioProxy>::GetInstance()->SetAudioPreferDeviceChangeCallback();
96             break;
97         default:
98             TELEPHONY_LOGE("OnAddSystemAbility unhandle id : %{public}d", systemAbilityId);
99             break;
100     }
101 }
102 
UnInit()103 void CallManagerService::UnInit()
104 {
105     DelayedSingleton<CellularCallConnection>::GetInstance()->UnInit();
106     callControlManagerPtr_ = nullptr;
107 }
108 
OnStart()109 void CallManagerService::OnStart()
110 {
111     using namespace std::chrono;
112     time_point<high_resolution_clock> beginTime = high_resolution_clock::now();
113     std::lock_guard<std::mutex> guard(lock_);
114     if (state_ == ServiceRunningState::STATE_RUNNING) {
115         return;
116     }
117 
118     if (!Init()) {
119         TELEPHONY_LOGE("Leave, init failed!");
120         return;
121     }
122 
123     bool ret = SystemAbility::Publish(DelayedSingleton<CallManagerService>::GetInstance().get());
124     if (!ret) {
125         TELEPHONY_LOGE("Leave, publishing CallManagerService failed!");
126         return;
127     }
128     TELEPHONY_LOGI("Publish CallManagerService SUCCESS");
129 
130     state_ = ServiceRunningState::STATE_RUNNING;
131     struct tm *timeNow = nullptr;
132     struct tm nowTime = { 0 };
133     time_t second = time(0);
134     if (second < 0) {
135         return;
136     }
137     timeNow = localtime_r(&second, &nowTime);
138     if (timeNow != nullptr) {
139         spendTime_ = duration_cast<std::chrono::milliseconds>(high_resolution_clock::now() - beginTime).count();
140         TELEPHONY_LOGI(
141             "CallManagerService start time:%{public}d-%{public}d-%{public}d %{public}d:%{public}d:%{public}d",
142             timeNow->tm_year + startTime_, timeNow->tm_mon + extraMonth_, timeNow->tm_mday, timeNow->tm_hour,
143             timeNow->tm_min, timeNow->tm_sec);
144         TELEPHONY_LOGI("CallManagerService start service cost time:%{public}d(milliseconds)", spendTime_);
145     }
146     LocationSystemAbilityListener::SystemAbilitySubscriber();
147     LocationSubscriber::Subscriber();
148 }
149 
OnStop()150 void CallManagerService::OnStop()
151 {
152     std::lock_guard<std::mutex> guard(lock_);
153     struct tm *timeNow = nullptr;
154     struct tm nowTime = { 0 };
155     time_t second = time(0);
156     if (second < 0) {
157         return;
158     }
159     timeNow = localtime_r(&second, &nowTime);
160     if (timeNow != nullptr) {
161         TELEPHONY_LOGI(
162             "CallManagerService dump time:%{public}d-%{public}d-%{public}d %{public}d:%{public}d:%{public}d",
163             timeNow->tm_year + startTime_, timeNow->tm_mon + extraMonth_, timeNow->tm_mday, timeNow->tm_hour,
164             timeNow->tm_min, timeNow->tm_sec);
165     }
166     DelayedSingleton<CellularCallConnection>::GetInstance()->UnInit();
167     state_ = ServiceRunningState::STATE_STOPPED;
168 }
169 
GetServiceRunningState()170 int32_t CallManagerService::GetServiceRunningState()
171 {
172     return static_cast<int32_t>(state_);
173 }
174 
Dump(std::int32_t fd,const std::vector<std::u16string> & args)175 int32_t CallManagerService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
176 {
177     if (fd < 0) {
178         TELEPHONY_LOGE("dump fd invalid");
179         return TELEPHONY_ERR_ARGUMENT_INVALID;
180     }
181     std::vector<std::string> argsInStr;
182     for (const auto &arg : args) {
183         TELEPHONY_LOGI("Dump args: %s", Str16ToStr8(arg).c_str());
184         argsInStr.emplace_back(Str16ToStr8(arg));
185     }
186     std::string result;
187     CallManagerDumpHelper dumpHelper;
188     if (dumpHelper.Dump(argsInStr, result)) {
189         TELEPHONY_LOGI("%s", result.c_str());
190         std::int32_t ret = dprintf(fd, "%s", result.c_str());
191         if (ret < 0) {
192             TELEPHONY_LOGE("dprintf to dump fd failed");
193             return CALL_ERR_SERVICE_DUMP_FAILED;
194         }
195         return TELEPHONY_SUCCESS;
196     }
197     TELEPHONY_LOGW("dumpHelper failed");
198     return CALL_ERR_SERVICE_DUMP_FAILED;
199 }
200 
GetBindTime()201 std::string CallManagerService::GetBindTime()
202 {
203     bindTime_ =
204         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
205             .count();
206     std::ostringstream oss;
207     oss << bindTime_;
208     return oss.str();
209 }
210 
GetStartServiceSpent()211 std::string CallManagerService::GetStartServiceSpent()
212 {
213     std::ostringstream oss;
214     oss << spendTime_;
215     return oss.str();
216 }
217 
RegisterCallBack(const sptr<ICallAbilityCallback> & callback)218 int32_t CallManagerService::RegisterCallBack(const sptr<ICallAbilityCallback> &callback)
219 {
220     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
221         TELEPHONY_LOGE("Non-system applications use system APIs!");
222         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
223     }
224     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE) &&
225         !TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
226         TELEPHONY_LOGD("Permission denied.");
227         return TELEPHONY_ERR_PERMISSION_ERR;
228     }
229     return DelayedSingleton<CallAbilityReportProxy>::GetInstance()->RegisterCallBack(callback, GetBundleInfo());
230 }
231 
UnRegisterCallBack()232 int32_t CallManagerService::UnRegisterCallBack()
233 {
234     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
235         TELEPHONY_LOGE("Non-system applications use system APIs!");
236         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
237     }
238     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
239         TELEPHONY_LOGE("Permission denied!");
240         return TELEPHONY_ERR_PERMISSION_ERR;
241     }
242     return DelayedSingleton<CallAbilityReportProxy>::GetInstance()->UnRegisterCallBack(GetBundleInfo());
243 }
244 
ObserverOnCallDetailsChange()245 int32_t CallManagerService::ObserverOnCallDetailsChange()
246 {
247     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
248         TELEPHONY_LOGE("Non-system applications use system APIs!");
249         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
250     }
251     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE) &&
252         !TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
253         TELEPHONY_LOGE("Permission denied!");
254         return TELEPHONY_ERR_PERMISSION_ERR;
255     }
256 
257     std::vector<CallAttributeInfo> callAttributeInfo = CallObjectManager::GetAllCallInfoList();
258     for (auto info : callAttributeInfo) {
259         DelayedSingleton<CallAbilityReportProxy>::GetInstance()->ReportCallStateInfo(info, GetBundleInfo());
260     }
261     return TELEPHONY_SUCCESS;
262 }
263 
DialCall(std::u16string number,AppExecFwk::PacMap & extras)264 int32_t CallManagerService::DialCall(std::u16string number, AppExecFwk::PacMap &extras)
265 {
266     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
267         TELEPHONY_LOGE("Non-system applications use system APIs!");
268         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
269     }
270     DelayedSingleton<CallManagerHisysevent>::GetInstance()->SetDialStartTime();
271     StartAsyncTrace(HITRACE_TAG_OHOS, "DialCall", getpid());
272     int32_t uid = IPCSkeleton::GetCallingUid();
273     std::string bundleName = "";
274     TelephonyPermission::GetBundleNameByUid(uid, bundleName);
275     extras.PutStringValue("bundleName", bundleName);
276     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_PLACE_CALL)) {
277         TELEPHONY_LOGE("Permission denied!");
278         CallManagerHisysevent::WriteDialCallFaultEvent(extras.GetIntValue(SLOT_ID), extras.GetIntValue(CALL_TYPE),
279             extras.GetIntValue(VIDEO_STATE), TELEPHONY_ERR_PERMISSION_ERR, OHOS_PERMISSION_PLACE_CALL);
280         FinishAsyncTrace(HITRACE_TAG_OHOS, "DialCall", getpid());
281         return TELEPHONY_ERR_PERMISSION_ERR;
282     }
283     if (callControlManagerPtr_ != nullptr) {
284         int32_t ret = callControlManagerPtr_->DialCall(number, extras);
285         if (ret == TELEPHONY_SUCCESS) {
286             std::u16string voiceMailNumber;
287             CoreManagerInner::GetInstance().GetVoiceMailNumber(extras.GetIntValue(SLOT_ID), voiceMailNumber);
288             if (voiceMailNumber == number) {
289                 CoreManagerInner::GetInstance().SetVoiceMailCount(extras.GetIntValue(SLOT_ID), CLEAR_VOICE_MAIL_COUNT);
290             }
291         } else {
292             std::string errordesc = "";
293             DelayedSingleton<CallManagerHisysevent>::GetInstance()->GetErrorDescription(ret, errordesc);
294             CallManagerHisysevent::WriteDialCallFaultEvent(extras.GetIntValue(SLOT_ID), extras.GetIntValue(CALL_TYPE),
295                 extras.GetIntValue(VIDEO_STATE), ret, errordesc);
296             FinishAsyncTrace(HITRACE_TAG_OHOS, "DialCall", getpid());
297         }
298         return ret;
299     } else {
300         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
301         FinishAsyncTrace(HITRACE_TAG_OHOS, "DialCall", getpid());
302         return TELEPHONY_ERR_LOCAL_PTR_NULL;
303     }
304 }
305 
MakeCall(std::string number)306 int32_t CallManagerService::MakeCall(std::string number)
307 {
308     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
309         TELEPHONY_LOGE("Non-system applications use system APIs!");
310         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
311     }
312     std::string identity = IPCSkeleton::ResetCallingIdentity();
313     AAFwk::Want want;
314     AppExecFwk::ElementName element("", "com.ohos.contacts", "com.ohos.contacts.MainAbility");
315     want.SetElement(element);
316     AAFwk::WantParams wantParams;
317     wantParams.SetParam("phoneNumber", AAFwk::String::Box(number));
318     wantParams.SetParam("pageFlag", AAFwk::String::Box("page_flag_edit_before_calling"));
319     want.SetParams(wantParams);
320     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want);
321     IPCSkeleton::SetCallingIdentity(identity);
322     if (err != ERR_OK) {
323         TELEPHONY_LOGE("Fail to make call, err:%{public}d", err);
324         return TELEPHONY_ERR_UNINIT;
325     }
326     return TELEPHONY_SUCCESS;
327 }
328 
AnswerCall(int32_t callId,int32_t videoState)329 int32_t CallManagerService::AnswerCall(int32_t callId, int32_t videoState)
330 {
331     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
332         TELEPHONY_LOGE("Non-system applications use system APIs!");
333         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
334     }
335     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_ANSWER_CALL)) {
336         TELEPHONY_LOGE("Permission denied!");
337         return TELEPHONY_ERR_PERMISSION_ERR;
338     }
339     DelayedSingleton<CallManagerHisysevent>::GetInstance()->SetAnswerStartTime();
340     if (callControlManagerPtr_ != nullptr) {
341         return callControlManagerPtr_->AnswerCall(callId, videoState);
342     } else {
343         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
344         return TELEPHONY_ERR_LOCAL_PTR_NULL;
345     }
346 }
347 
RejectCall(int32_t callId,bool rejectWithMessage,std::u16string textMessage)348 int32_t CallManagerService::RejectCall(int32_t callId, bool rejectWithMessage, std::u16string textMessage)
349 {
350     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
351         TELEPHONY_LOGE("Non-system applications use system APIs!");
352         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
353     }
354     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_ANSWER_CALL)) {
355         TELEPHONY_LOGE("Permission denied!");
356         return TELEPHONY_ERR_PERMISSION_ERR;
357     }
358     if (callControlManagerPtr_ != nullptr) {
359         return callControlManagerPtr_->RejectCall(callId, rejectWithMessage, textMessage);
360     } else {
361         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
362         return TELEPHONY_ERR_LOCAL_PTR_NULL;
363     }
364 }
365 
HangUpCall(int32_t callId)366 int32_t CallManagerService::HangUpCall(int32_t callId)
367 {
368     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
369         TELEPHONY_LOGE("Non-system applications use system APIs!");
370         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
371     }
372     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_ANSWER_CALL) &&
373         !TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
374         TELEPHONY_LOGE("Permission denied!");
375         return TELEPHONY_ERR_PERMISSION_ERR;
376     }
377     if (callControlManagerPtr_ != nullptr) {
378         return callControlManagerPtr_->HangUpCall(callId);
379     } else {
380         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
381         return TELEPHONY_ERR_LOCAL_PTR_NULL;
382     }
383 }
384 
GetCallState()385 int32_t CallManagerService::GetCallState()
386 {
387     if (callControlManagerPtr_ != nullptr) {
388         return callControlManagerPtr_->GetCallState();
389     } else {
390         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
391         return TELEPHONY_ERR_LOCAL_PTR_NULL;
392     }
393 }
394 
HoldCall(int32_t callId)395 int32_t CallManagerService::HoldCall(int32_t callId)
396 {
397     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
398         TELEPHONY_LOGE("Non-system applications use system APIs!");
399         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
400     }
401     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_ANSWER_CALL)) {
402         TELEPHONY_LOGE("Permission denied!");
403         return TELEPHONY_ERR_PERMISSION_ERR;
404     }
405     if (callControlManagerPtr_ != nullptr) {
406         return callControlManagerPtr_->HoldCall(callId);
407     } else {
408         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
409         return TELEPHONY_ERR_LOCAL_PTR_NULL;
410     }
411 }
412 
UnHoldCall(int32_t callId)413 int32_t CallManagerService::UnHoldCall(int32_t callId)
414 {
415     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
416         TELEPHONY_LOGE("Non-system applications use system APIs!");
417         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
418     }
419     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_ANSWER_CALL)) {
420         TELEPHONY_LOGE("Permission denied!");
421         return TELEPHONY_ERR_PERMISSION_ERR;
422     }
423     if (callControlManagerPtr_ != nullptr) {
424         return callControlManagerPtr_->UnHoldCall(callId);
425     } else {
426         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
427         return TELEPHONY_ERR_LOCAL_PTR_NULL;
428     }
429 }
430 
SwitchCall(int32_t callId)431 int32_t CallManagerService::SwitchCall(int32_t callId)
432 {
433     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
434         TELEPHONY_LOGE("Non-system applications use system APIs!");
435         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
436     }
437     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_ANSWER_CALL)) {
438         TELEPHONY_LOGE("Permission denied!");
439         return TELEPHONY_ERR_PERMISSION_ERR;
440     }
441     if (callControlManagerPtr_ != nullptr) {
442         return callControlManagerPtr_->SwitchCall(callId);
443     } else {
444         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
445         return TELEPHONY_ERR_LOCAL_PTR_NULL;
446     }
447 }
448 
HasCall()449 bool CallManagerService::HasCall()
450 {
451     if (callControlManagerPtr_ != nullptr) {
452         return callControlManagerPtr_->HasCall();
453     } else {
454         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
455         return false;
456     }
457 }
458 
IsNewCallAllowed(bool & enabled)459 int32_t CallManagerService::IsNewCallAllowed(bool &enabled)
460 {
461     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
462         TELEPHONY_LOGE("Non-system applications use system APIs!");
463         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
464     }
465     if (callControlManagerPtr_ != nullptr) {
466         return callControlManagerPtr_->IsNewCallAllowed(enabled);
467     } else {
468         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
469         return TELEPHONY_ERR_LOCAL_PTR_NULL;
470     }
471 }
472 
RegisterVoipCallManagerCallback()473 int32_t CallManagerService::RegisterVoipCallManagerCallback()
474 {
475     std::lock_guard<std::mutex> guard(lock_);
476     DelayedSingleton<VoipCallConnection>::GetInstance()->Init(TELEPHONY_VOIP_CALL_MANAGER_SYS_ABILITY_ID);
477     voipCallCallbackPtr_ = (std::make_unique<CallStatusCallback>()).release();
478     if (voipCallCallbackPtr_ == nullptr) {
479         TELEPHONY_LOGE("voipCallCallbackPtr_ is nullptr!");
480         return TELEPHONY_ERR_LOCAL_PTR_NULL;
481     }
482     DelayedSingleton<VoipCallConnection>::GetInstance()->RegisterCallManagerCallBack(voipCallCallbackPtr_);
483     return 0;
484 }
485 
UnRegisterVoipCallManagerCallback()486 int32_t CallManagerService::UnRegisterVoipCallManagerCallback()
487 {
488     std::lock_guard<std::mutex> guard(lock_);
489     return DelayedSingleton<VoipCallConnection>::GetInstance()->UnRegisterCallManagerCallBack();
490 }
491 
IsRinging(bool & enabled)492 int32_t CallManagerService::IsRinging(bool &enabled)
493 {
494     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
495         TELEPHONY_LOGE("Non-system applications use system APIs!");
496         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
497     }
498     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
499         TELEPHONY_LOGE("Permission denied!");
500         return TELEPHONY_ERR_PERMISSION_ERR;
501     }
502     if (callControlManagerPtr_ != nullptr) {
503         return callControlManagerPtr_->IsRinging(enabled);
504     } else {
505         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
506         return TELEPHONY_ERR_LOCAL_PTR_NULL;
507     }
508 }
509 
IsInEmergencyCall(bool & enabled)510 int32_t CallManagerService::IsInEmergencyCall(bool &enabled)
511 {
512     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
513         TELEPHONY_LOGE("Non-system applications use system APIs!");
514         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
515     }
516     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
517         TELEPHONY_LOGE("Permission denied!");
518         return TELEPHONY_ERR_PERMISSION_ERR;
519     }
520     if (callControlManagerPtr_ != nullptr) {
521         return callControlManagerPtr_->HasEmergency(enabled);
522     } else {
523         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
524         return TELEPHONY_ERR_LOCAL_PTR_NULL;
525     }
526 }
527 
StartDtmf(int32_t callId,char str)528 int32_t CallManagerService::StartDtmf(int32_t callId, char str)
529 {
530     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
531         TELEPHONY_LOGE("Non-system applications use system APIs!");
532         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
533     }
534     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
535         TELEPHONY_LOGE("Permission denied!");
536         return TELEPHONY_ERR_PERMISSION_ERR;
537     }
538     if (callControlManagerPtr_ != nullptr) {
539         return callControlManagerPtr_->StartDtmf(callId, str);
540     } else {
541         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
542         return TELEPHONY_ERR_LOCAL_PTR_NULL;
543     }
544 }
545 
StopDtmf(int32_t callId)546 int32_t CallManagerService::StopDtmf(int32_t callId)
547 {
548     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
549         TELEPHONY_LOGE("Non-system applications use system APIs!");
550         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
551     }
552     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
553         TELEPHONY_LOGE("Permission denied!");
554         return TELEPHONY_ERR_PERMISSION_ERR;
555     }
556     if (callControlManagerPtr_ != nullptr) {
557         return callControlManagerPtr_->StopDtmf(callId);
558     } else {
559         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
560         return TELEPHONY_ERR_LOCAL_PTR_NULL;
561     }
562 }
563 
PostDialProceed(int32_t callId,bool proceed)564 int32_t CallManagerService::PostDialProceed(int32_t callId, bool proceed)
565 {
566     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
567         TELEPHONY_LOGE("Non-system applications use system APIs!");
568         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
569     }
570     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
571         TELEPHONY_LOGE("Permission denied!");
572         return TELEPHONY_ERR_PERMISSION_ERR;
573     }
574     if (callControlManagerPtr_ != nullptr) {
575         return callControlManagerPtr_->PostDialProceed(callId, proceed);
576     } else {
577         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
578         return TELEPHONY_ERR_LOCAL_PTR_NULL;
579     }
580 }
581 
GetCallWaiting(int32_t slotId)582 int32_t CallManagerService::GetCallWaiting(int32_t slotId)
583 {
584     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
585         TELEPHONY_LOGE("Non-system applications use system APIs!");
586         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
587     }
588     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
589         TELEPHONY_LOGE("Permission denied!");
590         return TELEPHONY_ERR_PERMISSION_ERR;
591     }
592     if (callControlManagerPtr_ != nullptr) {
593         return callControlManagerPtr_->GetCallWaiting(slotId);
594     } else {
595         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
596         return TELEPHONY_ERR_LOCAL_PTR_NULL;
597     }
598 }
599 
SetCallWaiting(int32_t slotId,bool activate)600 int32_t CallManagerService::SetCallWaiting(int32_t slotId, bool activate)
601 {
602     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
603         TELEPHONY_LOGE("Non-system applications use system APIs!");
604         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
605     }
606     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
607         TELEPHONY_LOGE("Permission denied!");
608         return TELEPHONY_ERR_PERMISSION_ERR;
609     }
610     if (callControlManagerPtr_ != nullptr) {
611         return callControlManagerPtr_->SetCallWaiting(slotId, activate);
612     } else {
613         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
614         return TELEPHONY_ERR_LOCAL_PTR_NULL;
615     }
616 }
617 
GetCallRestriction(int32_t slotId,CallRestrictionType type)618 int32_t CallManagerService::GetCallRestriction(int32_t slotId, CallRestrictionType type)
619 {
620     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
621         TELEPHONY_LOGE("Non-system applications use system APIs!");
622         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
623     }
624     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
625         TELEPHONY_LOGE("Permission denied!");
626         return TELEPHONY_ERR_PERMISSION_ERR;
627     }
628     if (callControlManagerPtr_ != nullptr) {
629         return callControlManagerPtr_->GetCallRestriction(slotId, type);
630     } else {
631         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
632         return TELEPHONY_ERR_LOCAL_PTR_NULL;
633     }
634 }
635 
SetCallRestriction(int32_t slotId,CallRestrictionInfo & info)636 int32_t CallManagerService::SetCallRestriction(int32_t slotId, CallRestrictionInfo &info)
637 {
638     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
639         TELEPHONY_LOGE("Non-system applications use system APIs!");
640         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
641     }
642     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
643         TELEPHONY_LOGE("Permission denied!");
644         return TELEPHONY_ERR_PERMISSION_ERR;
645     }
646     if (callControlManagerPtr_ != nullptr) {
647         return callControlManagerPtr_->SetCallRestriction(slotId, info);
648     } else {
649         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
650         return TELEPHONY_ERR_LOCAL_PTR_NULL;
651     }
652 }
653 
SetCallRestrictionPassword(int32_t slotId,CallRestrictionType fac,const char * oldPassword,const char * newPassword)654 int32_t CallManagerService::SetCallRestrictionPassword(
655     int32_t slotId, CallRestrictionType fac, const char *oldPassword, const char *newPassword)
656 {
657     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
658         TELEPHONY_LOGE("Non-system applications use system APIs!");
659         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
660     }
661     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
662         TELEPHONY_LOGE("Permission denied!");
663         return TELEPHONY_ERR_PERMISSION_ERR;
664     }
665     if (callControlManagerPtr_ != nullptr) {
666         return callControlManagerPtr_->SetCallRestrictionPassword(slotId, fac, oldPassword, newPassword);
667     } else {
668         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
669         return TELEPHONY_ERR_LOCAL_PTR_NULL;
670     }
671 }
672 
GetCallTransferInfo(int32_t slotId,CallTransferType type)673 int32_t CallManagerService::GetCallTransferInfo(int32_t slotId, CallTransferType type)
674 {
675     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
676         TELEPHONY_LOGE("Non-system applications use system APIs!");
677         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
678     }
679     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
680         TELEPHONY_LOGE("Permission denied!");
681         return TELEPHONY_ERR_PERMISSION_ERR;
682     }
683     if (callControlManagerPtr_ != nullptr) {
684         return callControlManagerPtr_->GetCallTransferInfo(slotId, type);
685     } else {
686         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
687         return TELEPHONY_ERR_LOCAL_PTR_NULL;
688     }
689 }
690 
SetCallTransferInfo(int32_t slotId,CallTransferInfo & info)691 int32_t CallManagerService::SetCallTransferInfo(int32_t slotId, CallTransferInfo &info)
692 {
693     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
694         TELEPHONY_LOGE("Non-system applications use system APIs!");
695         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
696     }
697     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
698         TELEPHONY_LOGE("Permission denied!");
699         return TELEPHONY_ERR_PERMISSION_ERR;
700     }
701     if (callControlManagerPtr_ != nullptr) {
702         return callControlManagerPtr_->SetCallTransferInfo(slotId, info);
703     } else {
704         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
705         return TELEPHONY_ERR_LOCAL_PTR_NULL;
706     }
707 }
708 
CanSetCallTransferTime(int32_t slotId,bool & result)709 int32_t CallManagerService::CanSetCallTransferTime(int32_t slotId, bool &result)
710 {
711     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
712         TELEPHONY_LOGE("Non-system applications use system APIs!");
713         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
714     }
715     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
716         TELEPHONY_LOGE("Permission denied!");
717         return TELEPHONY_ERR_PERMISSION_ERR;
718     }
719     if (callControlManagerPtr_ != nullptr) {
720         return callControlManagerPtr_->CanSetCallTransferTime(slotId, result);
721     } else {
722         TELEPHONY_LOGE("[slot%{public}d] callControlManagerPtr_ is nullptr!", slotId);
723         return TELEPHONY_ERR_LOCAL_PTR_NULL;
724     }
725 }
726 
SetCallPreferenceMode(int32_t slotId,int32_t mode)727 int32_t CallManagerService::SetCallPreferenceMode(int32_t slotId, int32_t mode)
728 {
729     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
730         TELEPHONY_LOGE("Permission denied!");
731         return TELEPHONY_ERR_PERMISSION_ERR;
732     }
733     if (callControlManagerPtr_ != nullptr) {
734         return callControlManagerPtr_->SetCallPreferenceMode(slotId, mode);
735     } else {
736         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
737         return TELEPHONY_ERR_LOCAL_PTR_NULL;
738     }
739 }
740 
StartRtt(int32_t callId,std::u16string & msg)741 int32_t CallManagerService::StartRtt(int32_t callId, std::u16string &msg)
742 {
743     if (callControlManagerPtr_ != nullptr) {
744         return callControlManagerPtr_->StartRtt(callId, msg);
745     } else {
746         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
747         return TELEPHONY_ERR_LOCAL_PTR_NULL;
748     }
749 }
750 
StopRtt(int32_t callId)751 int32_t CallManagerService::StopRtt(int32_t callId)
752 {
753     if (callControlManagerPtr_ != nullptr) {
754         return callControlManagerPtr_->StopRtt(callId);
755     } else {
756         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
757         return TELEPHONY_ERR_LOCAL_PTR_NULL;
758     }
759 }
760 
CombineConference(int32_t mainCallId)761 int32_t CallManagerService::CombineConference(int32_t mainCallId)
762 {
763     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
764         TELEPHONY_LOGE("Non-system applications use system APIs!");
765         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
766     }
767     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
768         TELEPHONY_LOGE("Permission denied!");
769         return TELEPHONY_ERR_PERMISSION_ERR;
770     }
771     if (callControlManagerPtr_ != nullptr) {
772         return callControlManagerPtr_->CombineConference(mainCallId);
773     } else {
774         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
775         return TELEPHONY_ERR_LOCAL_PTR_NULL;
776     }
777 }
778 
SeparateConference(int32_t callId)779 int32_t CallManagerService::SeparateConference(int32_t callId)
780 {
781     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
782         TELEPHONY_LOGE("Non-system applications use system APIs!");
783         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
784     }
785     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
786         TELEPHONY_LOGE("Permission denied!");
787         return TELEPHONY_ERR_PERMISSION_ERR;
788     }
789     if (callControlManagerPtr_ != nullptr) {
790         return callControlManagerPtr_->SeparateConference(callId);
791     } else {
792         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
793         return TELEPHONY_ERR_LOCAL_PTR_NULL;
794     }
795 }
796 
KickOutFromConference(int32_t callId)797 int32_t CallManagerService::KickOutFromConference(int32_t callId)
798 {
799     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
800         TELEPHONY_LOGE("Non-system applications use system APIs!");
801         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
802     }
803     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_PLACE_CALL)) {
804         TELEPHONY_LOGE("Permission denied!");
805         return TELEPHONY_ERR_PERMISSION_ERR;
806     }
807     if (callControlManagerPtr_ != nullptr) {
808         return callControlManagerPtr_->KickOutFromConference(callId);
809     } else {
810         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
811         return TELEPHONY_ERR_LOCAL_PTR_NULL;
812     }
813 }
814 
SetMuted(bool isMute)815 int32_t CallManagerService::SetMuted(bool isMute)
816 {
817     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
818         TELEPHONY_LOGE("Non-system applications use system APIs!");
819         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
820     }
821     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
822         TELEPHONY_LOGE("Permission denied!");
823         return TELEPHONY_ERR_PERMISSION_ERR;
824     }
825     if (callControlManagerPtr_ != nullptr) {
826         return callControlManagerPtr_->SetMuted(isMute);
827     } else {
828         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
829         return TELEPHONY_ERR_LOCAL_PTR_NULL;
830     }
831 }
832 
MuteRinger()833 int32_t CallManagerService::MuteRinger()
834 {
835     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
836         TELEPHONY_LOGE("Non-system applications use system APIs!");
837         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
838     }
839     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
840         TELEPHONY_LOGE("Permission denied!");
841         return TELEPHONY_ERR_PERMISSION_ERR;
842     }
843     if (callControlManagerPtr_ != nullptr) {
844         return callControlManagerPtr_->MuteRinger();
845     } else {
846         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
847         return TELEPHONY_ERR_LOCAL_PTR_NULL;
848     }
849 }
850 
SetAudioDevice(const AudioDevice & audioDevice)851 int32_t CallManagerService::SetAudioDevice(const AudioDevice &audioDevice)
852 {
853     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
854         TELEPHONY_LOGE("Non-system applications use system APIs!");
855         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
856     }
857     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
858         TELEPHONY_LOGE("Permission denied!");
859         return TELEPHONY_ERR_PERMISSION_ERR;
860     }
861     if (callControlManagerPtr_ != nullptr) {
862         if (callControlManagerPtr_->SetAudioDevice(audioDevice) == TELEPHONY_SUCCESS) {
863             return TELEPHONY_SUCCESS;
864         }
865         TELEPHONY_LOGE("SetAudioDevice failed!");
866         return CALL_ERR_SETTING_AUDIO_DEVICE_FAILED;
867     } else {
868         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
869         return TELEPHONY_ERR_LOCAL_PTR_NULL;
870     }
871 }
872 
ControlCamera(int32_t callId,std::u16string & cameraId)873 int32_t CallManagerService::ControlCamera(int32_t callId, std::u16string &cameraId)
874 {
875     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
876         TELEPHONY_LOGE("Non-system applications use system APIs!");
877         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
878     }
879     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
880         TELEPHONY_LOGE("Permission denied!");
881         return TELEPHONY_ERR_PERMISSION_ERR;
882     }
883     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
884     if (videoControlManager != nullptr) {
885         return videoControlManager->ControlCamera(
886             callId, cameraId, IPCSkeleton::GetCallingUid(), IPCSkeleton::GetCallingPid());
887     }  else {
888         TELEPHONY_LOGE("videoControlManager is nullptr!");
889         return TELEPHONY_ERR_LOCAL_PTR_NULL;
890     }
891 }
892 
SetPreviewWindow(int32_t callId,std::string & surfaceId,sptr<Surface> surface)893 int32_t CallManagerService::SetPreviewWindow(int32_t callId, std::string &surfaceId, sptr<Surface> surface)
894 {
895     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
896         TELEPHONY_LOGE("Non-system applications use system APIs!");
897         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
898     }
899     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
900         TELEPHONY_LOGE("Permission denied!");
901         return TELEPHONY_ERR_PERMISSION_ERR;
902     }
903     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
904     if (videoControlManager != nullptr) {
905         uint32_t callerToken = IPCSkeleton::GetCallingTokenID();
906         if (surface == nullptr) {
907             PrivacyKit::StopUsingPermission(callerToken, "ohos.permission.CAMERA");
908         } else {
909             sptr<CallBase> call = CallObjectManager::GetOneCallObjectByIndex(callId);
910             if (call == nullptr || call->GetVideoStateType() != VideoStateType::TYPE_RECEIVE_ONLY) {
911                 PrivacyKit::AddPermissionUsedRecord(callerToken, "ohos.permission.CAMERA", 1, 0);
912                 PrivacyKit::StartUsingPermission(callerToken, "ohos.permission.CAMERA");
913             }
914         }
915         return videoControlManager->SetPreviewWindow(callId, surfaceId, surface);
916     } else {
917         TELEPHONY_LOGE("videoControlManager is nullptr!");
918         return TELEPHONY_ERR_LOCAL_PTR_NULL;
919     }
920 }
921 
SetDisplayWindow(int32_t callId,std::string & surfaceId,sptr<Surface> surface)922 int32_t CallManagerService::SetDisplayWindow(int32_t callId, std::string &surfaceId, sptr<Surface> surface)
923 {
924     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
925         TELEPHONY_LOGE("Non-system applications use system APIs!");
926         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
927     }
928     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
929         TELEPHONY_LOGE("Permission denied!");
930         return TELEPHONY_ERR_PERMISSION_ERR;
931     }
932     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
933     if (videoControlManager != nullptr) {
934         return videoControlManager->SetDisplayWindow(callId, surfaceId, surface);
935     } else {
936         TELEPHONY_LOGE("videoControlManager is nullptr!");
937         return TELEPHONY_ERR_LOCAL_PTR_NULL;
938     }
939 }
940 
SetCameraZoom(float zoomRatio)941 int32_t CallManagerService::SetCameraZoom(float zoomRatio)
942 {
943     if (callControlManagerPtr_ != nullptr) {
944         return callControlManagerPtr_->SetCameraZoom(zoomRatio);
945     } else {
946         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
947         return TELEPHONY_ERR_LOCAL_PTR_NULL;
948     }
949 }
950 
SetPausePicture(int32_t callId,std::u16string & path)951 int32_t CallManagerService::SetPausePicture(int32_t callId, std::u16string &path)
952 {
953     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
954         TELEPHONY_LOGE("Non-system applications use system APIs!");
955         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
956     }
957     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
958         TELEPHONY_LOGE("Permission denied!");
959         return TELEPHONY_ERR_PERMISSION_ERR;
960     }
961     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
962     if (videoControlManager != nullptr) {
963         return videoControlManager->SetPausePicture(callId, path);
964     } else {
965         TELEPHONY_LOGE("videoControlManager is nullptr!");
966         return TELEPHONY_ERR_LOCAL_PTR_NULL;
967     }
968 }
969 
SetDeviceDirection(int32_t callId,int32_t rotation)970 int32_t CallManagerService::SetDeviceDirection(int32_t callId, int32_t rotation)
971 {
972     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
973         TELEPHONY_LOGE("Non-system applications use system APIs!");
974         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
975     }
976     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
977         TELEPHONY_LOGE("Permission denied!");
978         return TELEPHONY_ERR_PERMISSION_ERR;
979     }
980     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
981     if (videoControlManager != nullptr) {
982         return videoControlManager->SetDeviceDirection(callId, rotation);
983     } else {
984         TELEPHONY_LOGE("videoControlManager is nullptr!");
985         return TELEPHONY_ERR_LOCAL_PTR_NULL;
986     }
987 }
988 
IsEmergencyPhoneNumber(std::u16string & number,int32_t slotId,bool & enabled)989 int32_t CallManagerService::IsEmergencyPhoneNumber(std::u16string &number, int32_t slotId, bool &enabled)
990 {
991     if (callControlManagerPtr_ != nullptr) {
992         return callControlManagerPtr_->IsEmergencyPhoneNumber(number, slotId, enabled);
993     } else {
994         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
995         return TELEPHONY_ERR_LOCAL_PTR_NULL;
996     }
997 }
998 
FormatPhoneNumber(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)999 int32_t CallManagerService::FormatPhoneNumber(
1000     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
1001 {
1002     if (callControlManagerPtr_ != nullptr) {
1003         return callControlManagerPtr_->FormatPhoneNumber(number, countryCode, formatNumber);
1004     } else {
1005         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1006         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1007     }
1008 }
1009 
FormatPhoneNumberToE164(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)1010 int32_t CallManagerService::FormatPhoneNumberToE164(
1011     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
1012 {
1013     if (callControlManagerPtr_ != nullptr) {
1014         return callControlManagerPtr_->FormatPhoneNumberToE164(number, countryCode, formatNumber);
1015     } else {
1016         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1017         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1018     }
1019 }
1020 
GetMainCallId(int32_t callId,int32_t & mainCallId)1021 int32_t CallManagerService::GetMainCallId(int32_t callId, int32_t &mainCallId)
1022 {
1023     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1024         TELEPHONY_LOGE("Non-system applications use system APIs!");
1025         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1026     }
1027     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
1028         TELEPHONY_LOGE("Permission denied!");
1029         return TELEPHONY_ERR_PERMISSION_ERR;
1030     }
1031     if (callControlManagerPtr_ != nullptr) {
1032         return callControlManagerPtr_->GetMainCallId(callId, mainCallId);
1033     } else {
1034         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1035         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1036     }
1037 }
1038 
GetSubCallIdList(int32_t callId,std::vector<std::u16string> & callIdList)1039 int32_t CallManagerService::GetSubCallIdList(int32_t callId, std::vector<std::u16string> &callIdList)
1040 {
1041     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1042         TELEPHONY_LOGE("Non-system applications use system APIs!");
1043         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1044     }
1045     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
1046         TELEPHONY_LOGE("Permission denied!");
1047         return TELEPHONY_ERR_PERMISSION_ERR;
1048     }
1049     if (callControlManagerPtr_ != nullptr) {
1050         return callControlManagerPtr_->GetSubCallIdList(callId, callIdList);
1051     }
1052     callIdList.clear();
1053     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1054 }
1055 
GetCallIdListForConference(int32_t callId,std::vector<std::u16string> & callIdList)1056 int32_t CallManagerService::GetCallIdListForConference(int32_t callId, std::vector<std::u16string> &callIdList)
1057 {
1058     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1059         TELEPHONY_LOGE("Non-system applications use system APIs!");
1060         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1061     }
1062     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
1063         TELEPHONY_LOGE("Permission denied!");
1064         return TELEPHONY_ERR_PERMISSION_ERR;
1065     }
1066     if (callControlManagerPtr_ != nullptr) {
1067         return callControlManagerPtr_->GetCallIdListForConference(callId, callIdList);
1068     }
1069     callIdList.clear();
1070     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1071 }
1072 
GetImsConfig(int32_t slotId,ImsConfigItem item)1073 int32_t CallManagerService::GetImsConfig(int32_t slotId, ImsConfigItem item)
1074 {
1075     if (callControlManagerPtr_ != nullptr) {
1076         return callControlManagerPtr_->GetImsConfig(slotId, item);
1077     } else {
1078         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1079         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1080     }
1081 }
1082 
SetImsConfig(int32_t slotId,ImsConfigItem item,std::u16string & value)1083 int32_t CallManagerService::SetImsConfig(int32_t slotId, ImsConfigItem item, std::u16string &value)
1084 {
1085     if (callControlManagerPtr_ != nullptr) {
1086         return callControlManagerPtr_->SetImsConfig(slotId, item, value);
1087     } else {
1088         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1089         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1090     }
1091 }
1092 
GetImsFeatureValue(int32_t slotId,FeatureType type)1093 int32_t CallManagerService::GetImsFeatureValue(int32_t slotId, FeatureType type)
1094 {
1095     if (callControlManagerPtr_ != nullptr) {
1096         return callControlManagerPtr_->GetImsFeatureValue(slotId, type);
1097     } else {
1098         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1099         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1100     }
1101 }
1102 
SetImsFeatureValue(int32_t slotId,FeatureType type,int32_t value)1103 int32_t CallManagerService::SetImsFeatureValue(int32_t slotId, FeatureType type, int32_t value)
1104 {
1105     if (callControlManagerPtr_ != nullptr) {
1106         return callControlManagerPtr_->SetImsFeatureValue(slotId, type, value);
1107     } else {
1108         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1109         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1110     }
1111 }
1112 
UpdateImsCallMode(int32_t callId,ImsCallMode mode)1113 int32_t CallManagerService::UpdateImsCallMode(int32_t callId, ImsCallMode mode)
1114 {
1115     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1116         TELEPHONY_LOGE("Non-system applications use system APIs!");
1117         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1118     }
1119     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
1120         TELEPHONY_LOGE("Permission denied!");
1121         return TELEPHONY_ERR_PERMISSION_ERR;
1122     }
1123     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
1124     if (videoControlManager != nullptr) {
1125         return videoControlManager->UpdateImsCallMode(callId, mode);
1126     } else {
1127         TELEPHONY_LOGE("videoControlManager is nullptr!");
1128         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1129     }
1130 }
1131 
EnableImsSwitch(int32_t slotId)1132 int32_t CallManagerService::EnableImsSwitch(int32_t slotId)
1133 {
1134     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1135         TELEPHONY_LOGE("Non-system applications use system APIs!");
1136         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1137     }
1138     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
1139         TELEPHONY_LOGE("Permission denied!");
1140         return TELEPHONY_ERR_PERMISSION_ERR;
1141     }
1142     if (callControlManagerPtr_ != nullptr) {
1143         return callControlManagerPtr_->EnableImsSwitch(slotId);
1144     } else {
1145         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1146         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1147     }
1148 }
1149 
DisableImsSwitch(int32_t slotId)1150 int32_t CallManagerService::DisableImsSwitch(int32_t slotId)
1151 {
1152     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1153         TELEPHONY_LOGE("Non-system applications use system APIs!");
1154         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1155     }
1156     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
1157         TELEPHONY_LOGE("Permission denied!");
1158         return TELEPHONY_ERR_PERMISSION_ERR;
1159     }
1160     if (callControlManagerPtr_ != nullptr) {
1161         return callControlManagerPtr_->DisableImsSwitch(slotId);
1162     } else {
1163         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1164         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1165     }
1166 }
1167 
IsImsSwitchEnabled(int32_t slotId,bool & enabled)1168 int32_t CallManagerService::IsImsSwitchEnabled(int32_t slotId, bool &enabled)
1169 {
1170     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1171         TELEPHONY_LOGE("Non-system applications use system APIs!");
1172         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1173     }
1174     if (callControlManagerPtr_ != nullptr) {
1175         return callControlManagerPtr_->IsImsSwitchEnabled(slotId, enabled);
1176     } else {
1177         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1178         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1179     }
1180 }
1181 
SetVoNRState(int32_t slotId,int32_t state)1182 int32_t CallManagerService::SetVoNRState(int32_t slotId, int32_t state)
1183 {
1184     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1185         TELEPHONY_LOGE("Non-system applications use system APIs!");
1186         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1187     }
1188     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
1189         TELEPHONY_LOGE("Permission denied!");
1190         return TELEPHONY_ERR_PERMISSION_ERR;
1191     }
1192     if (callControlManagerPtr_ != nullptr) {
1193         return callControlManagerPtr_->SetVoNRState(slotId, state);
1194     } else {
1195         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1196         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1197     }
1198 }
1199 
GetVoNRState(int32_t slotId,int32_t & state)1200 int32_t CallManagerService::GetVoNRState(int32_t slotId, int32_t &state)
1201 {
1202     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1203         TELEPHONY_LOGE("Non-system applications use system APIs!");
1204         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1205     }
1206     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
1207         TELEPHONY_LOGE("Permission denied!");
1208         return TELEPHONY_ERR_PERMISSION_ERR;
1209     }
1210     if (callControlManagerPtr_ != nullptr) {
1211         return callControlManagerPtr_->GetVoNRState(slotId, state);
1212     } else {
1213         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1214         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1215     }
1216 }
1217 
JoinConference(int32_t callId,std::vector<std::u16string> & numberList)1218 int32_t CallManagerService::JoinConference(int32_t callId, std::vector<std::u16string> &numberList)
1219 {
1220     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1221         TELEPHONY_LOGE("Non-system applications use system APIs!");
1222         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1223     }
1224     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_PLACE_CALL)) {
1225         TELEPHONY_LOGE("Permission denied!");
1226         return TELEPHONY_ERR_PERMISSION_ERR;
1227     }
1228     if (callControlManagerPtr_ != nullptr) {
1229         return callControlManagerPtr_->JoinConference(callId, numberList);
1230     }
1231     TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1232     return TELEPHONY_ERR_LOCAL_PTR_NULL;
1233 }
1234 
ReportOttCallDetailsInfo(std::vector<OttCallDetailsInfo> & ottVec)1235 int32_t CallManagerService::ReportOttCallDetailsInfo(std::vector<OttCallDetailsInfo> &ottVec)
1236 {
1237     if (ottVec.empty()) {
1238         TELEPHONY_LOGE("ottVec is empty!");
1239         return TELEPHONY_ERR_ARGUMENT_INVALID;
1240     }
1241     CallDetailsInfo detailsInfo;
1242     CallDetailInfo detailInfo;
1243     detailsInfo.slotId = ERR_ID;
1244     (void)memcpy_s(detailsInfo.bundleName, kMaxBundleNameLen, ottVec[0].bundleName, kMaxBundleNameLen);
1245     detailInfo.callType = CallType::TYPE_OTT;
1246     detailInfo.accountId = ERR_ID;
1247     detailInfo.index = ERR_ID;
1248     detailInfo.voiceDomain = ERR_ID;
1249     std::vector<OttCallDetailsInfo>::iterator it = ottVec.begin();
1250     for (; it != ottVec.end(); ++it) {
1251         detailInfo.callMode = (*it).videoState;
1252         detailInfo.state = (*it).callState;
1253         (void)memcpy_s(detailInfo.phoneNum, kMaxNumberLen, (*it).phoneNum, kMaxNumberLen);
1254         (void)memcpy_s(detailInfo.bundleName, kMaxBundleNameLen, (*it).bundleName, kMaxBundleNameLen);
1255         detailsInfo.callVec.push_back(detailInfo);
1256     }
1257     int32_t ret = DelayedSingleton<ReportCallInfoHandler>::GetInstance()->UpdateCallsReportInfo(detailsInfo);
1258     if (ret != TELEPHONY_SUCCESS) {
1259         TELEPHONY_LOGE("UpdateCallsReportInfo failed! errCode:%{public}d", ret);
1260     } else {
1261         TELEPHONY_LOGI("UpdateCallsReportInfo success!");
1262     }
1263     return ret;
1264 }
1265 
ReportOttCallEventInfo(OttCallEventInfo & eventInfo)1266 int32_t CallManagerService::ReportOttCallEventInfo(OttCallEventInfo &eventInfo)
1267 {
1268     int32_t ret = DelayedSingleton<ReportCallInfoHandler>::GetInstance()->UpdateOttEventInfo(eventInfo);
1269     if (ret != TELEPHONY_SUCCESS) {
1270         TELEPHONY_LOGE("UpdateOttEventInfo failed! errCode:%{public}d", ret);
1271     } else {
1272         TELEPHONY_LOGI("UpdateOttEventInfo success!");
1273     }
1274     return ret;
1275 }
1276 
CloseUnFinishedUssd(int32_t slotId)1277 int32_t CallManagerService::CloseUnFinishedUssd(int32_t slotId)
1278 {
1279     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1280         TELEPHONY_LOGE("Non system applications use system APIs!");
1281         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1282     }
1283     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
1284         TELEPHONY_LOGE("Permission denied!");
1285         return TELEPHONY_ERR_PERMISSION_ERR;
1286     }
1287     if (callControlManagerPtr_ != nullptr) {
1288         return callControlManagerPtr_->CloseUnFinishedUssd(slotId);
1289     } else {
1290         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1291         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1292     }
1293 }
1294 
InputDialerSpecialCode(const std::string & specialCode)1295 int32_t CallManagerService::InputDialerSpecialCode(const std::string &specialCode)
1296 {
1297     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1298         TELEPHONY_LOGE("Non system applications use system APIs!");
1299         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1300     }
1301     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_PLACE_CALL)) {
1302         TELEPHONY_LOGE("Permission denied!");
1303         return TELEPHONY_ERR_PERMISSION_ERR;
1304     }
1305 
1306     auto it = find(supportSpecialCode_.begin(), supportSpecialCode_.end(), specialCode);
1307     if (it == supportSpecialCode_.end()) {
1308         TELEPHONY_LOGE("specialCode is not support");
1309         return TELEPHONY_ERR_ARGUMENT_INVALID;
1310     }
1311     AAFwk::Want want;
1312     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SPECIAL_CODE);
1313     EventFwk::CommonEventData commonEventData;
1314     commonEventData.SetWant(want);
1315     commonEventData.SetData(specialCode);
1316     EventFwk::CommonEventPublishInfo publishInfo;
1317     if (!EventFwk::CommonEventManager::PublishCommonEvent(commonEventData, publishInfo, nullptr)) {
1318         TELEPHONY_LOGE("PublishCommonEvent fail");
1319         return TELEPHONY_ERR_PUBLISH_BROADCAST_FAIL;
1320     }
1321     return TELEPHONY_SUCCESS;
1322 }
1323 
RemoveMissedIncomingCallNotification()1324 int32_t CallManagerService::RemoveMissedIncomingCallNotification()
1325 {
1326     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1327         TELEPHONY_LOGE("Non-system applications use system APIs!");
1328         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1329     }
1330     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE) ||
1331         !TelephonyPermission::CheckPermission(OHOS_PERMISSION_READ_CALL_LOG) ||
1332         !TelephonyPermission::CheckPermission(OHOS_PERMISSION_WRITE_CALL_LOG)) {
1333         TELEPHONY_LOGE("Permission denied!");
1334         return TELEPHONY_ERR_PERMISSION_ERR;
1335     }
1336     if (callControlManagerPtr_ == nullptr) {
1337         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1338         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1339     }
1340     return callControlManagerPtr_->RemoveMissedIncomingCallNotification();
1341 }
1342 
SetVoIPCallState(int32_t state)1343 int32_t CallManagerService::SetVoIPCallState(int32_t state)
1344 {
1345     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1346         TELEPHONY_LOGE("Non-system applications use system APIs!");
1347         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1348     }
1349     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE) &&
1350         !TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
1351         TELEPHONY_LOGE("Permission denied!");
1352         return TELEPHONY_ERR_PERMISSION_ERR;
1353     }
1354     if (callControlManagerPtr_ != nullptr) {
1355         return callControlManagerPtr_->SetVoIPCallState(state);
1356     } else {
1357         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1358         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1359     }
1360 }
1361 
GetVoIPCallState(int32_t & state)1362 int32_t CallManagerService::GetVoIPCallState(int32_t &state)
1363 {
1364     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1365         TELEPHONY_LOGE("Non-system applications use system APIs!");
1366         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1367     }
1368     if (callControlManagerPtr_ != nullptr) {
1369         return callControlManagerPtr_->GetVoIPCallState(state);
1370     } else {
1371         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
1372         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1373     }
1374 }
1375 
GetProxyObjectPtr(CallManagerProxyType proxyType)1376 sptr<IRemoteObject> CallManagerService::GetProxyObjectPtr(CallManagerProxyType proxyType)
1377 {
1378     std::lock_guard<std::mutex> guard(lock_);
1379     auto it = proxyObjectPtrMap_.find(static_cast<uint32_t>(proxyType));
1380     if (it != proxyObjectPtrMap_.end()) {
1381         TELEPHONY_LOGI("GetProxyObjectPtr success! proxyType:%{public}d", proxyType);
1382         return it->second;
1383     } else {
1384         switch (proxyType) {
1385             case PROXY_BLUETOOTH_CALL: {
1386                 sptr<BluetoothCallService> ptr = new (std::nothrow) BluetoothCallService();
1387                 if (ptr == nullptr) {
1388                     TELEPHONY_LOGE("create BluetoothCallService object failed!");
1389                     return nullptr;
1390                 }
1391                 proxyObjectPtrMap_[proxyType] = ptr->AsObject().GetRefPtr();
1392                 TELEPHONY_LOGI("create BluetoothCallService object success! proxyType:%{public}d", proxyType);
1393                 return ptr->AsObject().GetRefPtr();
1394             }
1395             default:
1396                 TELEPHONY_LOGE("invalid proxyType!");
1397                 break;
1398         }
1399     }
1400     TELEPHONY_LOGE("GetProxyObjectPtr failed! proxyType:%{public}d", proxyType);
1401     return nullptr;
1402 }
1403 
GetBundleInfo()1404 std::string CallManagerService::GetBundleInfo()
1405 {
1406     int32_t uid = IPCSkeleton::GetCallingUid();
1407     std::string bundleName = "";
1408     TelephonyPermission::GetBundleNameByUid(uid, bundleName);
1409     if (bundleName.empty()) {
1410         bundleName.append(std::to_string(uid));
1411         bundleName.append(std::to_string(IPCSkeleton::GetCallingPid()));
1412     }
1413     std::string bundleInfo = "";
1414     bundleInfo.append(bundleName);
1415     bundleInfo.append(":");
1416     bundleInfo.append(std::to_string(IPCSkeleton::GetCallingPid()));
1417     return bundleInfo;
1418 }
1419 
ReportAudioDeviceInfo()1420 int32_t CallManagerService::ReportAudioDeviceInfo()
1421 {
1422     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
1423         TELEPHONY_LOGE("Permission denied!");
1424         return TELEPHONY_ERR_PERMISSION_ERR;
1425     }
1426     AudioDevice device = {
1427         .deviceType = AudioDeviceType::DEVICE_UNKNOWN,
1428         .address = { 0 },
1429     };
1430     return DelayedSingleton<AudioDeviceManager>::GetInstance()->ReportAudioDeviceChange(device);
1431 }
1432 
CancelCallUpgrade(int32_t callId)1433 int32_t CallManagerService::CancelCallUpgrade(int32_t callId)
1434 {
1435     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1436         TELEPHONY_LOGE("Non-system applications use system APIs!");
1437         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1438     }
1439     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_PLACE_CALL)) {
1440         TELEPHONY_LOGE("Permission denied!");
1441         return TELEPHONY_ERR_PERMISSION_ERR;
1442     }
1443     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
1444     if (videoControlManager != nullptr) {
1445         return DelayedSingleton<VideoControlManager>::GetInstance()->CancelCallUpgrade(callId);
1446     } else {
1447         TELEPHONY_LOGE("videoControlManager is nullptr!");
1448         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1449     }
1450 }
1451 
RequestCameraCapabilities(int32_t callId)1452 int32_t CallManagerService::RequestCameraCapabilities(int32_t callId)
1453 {
1454     if (!TelephonyPermission::CheckCallerIsSystemApp()) {
1455         TELEPHONY_LOGE("Non-system applications use system APIs!");
1456         return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
1457     }
1458     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_GET_TELEPHONY_STATE)) {
1459         TELEPHONY_LOGE("Permission denied!");
1460         return TELEPHONY_ERR_PERMISSION_ERR;
1461     }
1462     auto videoControlManager = DelayedSingleton<VideoControlManager>::GetInstance();
1463     if (videoControlManager != nullptr) {
1464         return DelayedSingleton<VideoControlManager>::GetInstance()->RequestCameraCapabilities(callId);
1465     } else {
1466         TELEPHONY_LOGE("videoControlManager is nullptr!");
1467         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1468     }
1469 }
1470 
SendCallUiEvent(int32_t callId,std::string & eventName)1471 int32_t CallManagerService::SendCallUiEvent(int32_t callId, std::string &eventName)
1472 {
1473     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
1474         TELEPHONY_LOGE("Permission denied!");
1475         return TELEPHONY_ERR_PERMISSION_ERR;
1476     }
1477     if (eventName == "EVENT_IS_CELIA_CALL") {
1478         sptr<CallBase> callPtr = CallObjectManager::GetOneCallObject(callId);
1479         if (callPtr == nullptr) {
1480             TELEPHONY_LOGI("the call object is nullptr!");
1481             return TELEPHONY_ERR_LOCAL_PTR_NULL;
1482         }
1483         callPtr->SetCeliaCallType(IS_CELIA_CALL);
1484         TELEPHONY_LOGI("set celia call type!");
1485     }
1486     return TELEPHONY_SUCCESS;
1487 }
1488 } // namespace Telephony
1489 } // namespace OHOS
1490