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