• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 "ipc_skeleton.h"
19 
20 #include "call_manager_errors.h"
21 #include "telephony_log_wrapper.h"
22 #include "telephony_permission.h"
23 
24 #include "bluetooth_call_service.h"
25 #include "call_ability_report_proxy.h"
26 #include "call_manager_dump_helper.h"
27 #include "report_call_info_handler.h"
28 #include "cellular_call_connection.h"
29 #include "call_records_manager.h"
30 #include "common_type.h"
31 
32 namespace OHOS {
33 namespace Telephony {
34 const std::string OHOS_PERMISSION_SET_TELEPHONY_STATE = "ohos.permission.SET_TELEPHONY_STATE";
35 const std::string OHOS_PERMISSION_PLACE_CALL = "ohos.permission.PLACE_CALL";
36 
37 const bool g_registerResult =
38     SystemAbility::MakeAndRegisterAbility(DelayedSingleton<CallManagerService>::GetInstance().get());
39 
CallManagerService()40 CallManagerService::CallManagerService()
41     : SystemAbility(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID, true), callControlManagerPtr_(nullptr)
42 {}
43 
~CallManagerService()44 CallManagerService::~CallManagerService()
45 {
46     UnInit();
47 }
48 
Init()49 bool CallManagerService::Init()
50 {
51     if (!DelayedSingleton<CallControlManager>::GetInstance()->Init()) {
52         TELEPHONY_LOGE("CallControlManager init failed!");
53         return false;
54     }
55     callControlManagerPtr_ = DelayedSingleton<CallControlManager>::GetInstance();
56     if (callControlManagerPtr_ == nullptr) {
57         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
58         return false;
59     }
60     DelayedSingleton<ReportCallInfoHandlerService>::GetInstance()->Start();
61     DelayedSingleton<CellularCallConnection>::GetInstance()->Init(TELEPHONY_CELLULAR_CALL_SYS_ABILITY_ID);
62     DelayedSingleton<CallRecordsManager>::GetInstance()->Init();
63     return true;
64 }
65 
UnInit()66 void CallManagerService::UnInit()
67 {
68     callControlManagerPtr_ = nullptr;
69 }
70 
OnStart()71 void CallManagerService::OnStart()
72 {
73     using namespace std::chrono;
74     time_point<high_resolution_clock> beginTime = high_resolution_clock::now();
75     std::lock_guard<std::mutex> guard(lock_);
76     if (state_ == ServiceRunningState::STATE_RUNNING) {
77         return;
78     }
79 
80     if (!Init()) {
81         TELEPHONY_LOGE("Leave, init failed!");
82         return;
83     }
84 
85     bool ret = SystemAbility::Publish(DelayedSingleton<CallManagerService>::GetInstance().get());
86     if (!ret) {
87         TELEPHONY_LOGE("Leave, publishing CallManagerService failed!");
88         return;
89     }
90     TELEPHONY_LOGI("Publish CallManagerService SUCCESS");
91 
92     state_ = ServiceRunningState::STATE_RUNNING;
93     struct tm *timeNow = nullptr;
94     time_t second = time(0);
95     if (second < 0) {
96         return;
97     }
98     timeNow = localtime(&second);
99     if (timeNow != nullptr) {
100         spendTime_ = duration_cast<std::chrono::milliseconds>(high_resolution_clock::now() - beginTime).count();
101         TELEPHONY_LOGI(
102             "CallManagerService start time:%{public}d-%{public}d-%{public}d %{public}d:%{public}d:%{public}d",
103             timeNow->tm_year + startTime_, timeNow->tm_mon + extraMonth_, timeNow->tm_mday, timeNow->tm_hour,
104             timeNow->tm_min, timeNow->tm_sec);
105         TELEPHONY_LOGI("CallManagerService start service cost time:%{public}d(milliseconds)", spendTime_);
106     }
107 }
108 
OnStop()109 void CallManagerService::OnStop()
110 {
111     std::lock_guard<std::mutex> guard(lock_);
112     struct tm *timeNow = nullptr;
113     time_t second = time(0);
114     if (second < 0) {
115         return;
116     }
117     timeNow = localtime(&second);
118     if (timeNow != nullptr) {
119         TELEPHONY_LOGI(
120             "CallManagerService dump time:%{public}d-%{public}d-%{public}d %{public}d:%{public}d:%{public}d",
121             timeNow->tm_year + startTime_, timeNow->tm_mon + extraMonth_, timeNow->tm_mday, timeNow->tm_hour,
122             timeNow->tm_min, timeNow->tm_sec);
123     }
124     state_ = ServiceRunningState::STATE_STOPPED;
125 }
126 
Dump(std::int32_t fd,const std::vector<std::u16string> & args)127 int32_t CallManagerService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
128 {
129     if (fd < 0) {
130         TELEPHONY_LOGE("dump fd invalid");
131         return TELEPHONY_ERR_ARGUMENT_INVALID;
132     }
133     std::vector<std::string> argsInStr;
134     for (const auto &arg : args) {
135         TELEPHONY_LOGI("Dump args: %s", Str16ToStr8(arg).c_str());
136         argsInStr.emplace_back(Str16ToStr8(arg));
137     }
138     std::string result;
139     CallManagerDumpHelper dumpHelper;
140     if (dumpHelper.Dump(argsInStr, result)) {
141         TELEPHONY_LOGI("%s", result.c_str());
142         std::int32_t ret = dprintf(fd, "%s", result.c_str());
143         if (ret < 0) {
144             TELEPHONY_LOGE("dprintf to dump fd failed");
145             return CALL_ERR_SERVICE_DUMP_FAILED;
146         }
147         return TELEPHONY_SUCCESS;
148     }
149     TELEPHONY_LOGW("dumpHelper failed");
150     return CALL_ERR_SERVICE_DUMP_FAILED;
151 }
152 
GetBindTime()153 std::string CallManagerService::GetBindTime()
154 {
155     bindTime_ =
156         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
157             .count();
158     std::ostringstream oss;
159     oss << bindTime_;
160     return oss.str();
161 }
162 
GetStartServiceSpent()163 std::string CallManagerService::GetStartServiceSpent()
164 {
165     std::ostringstream oss;
166     oss << spendTime_;
167     return oss.str();
168 }
169 
RegisterCallBack(const sptr<ICallAbilityCallback> & callback)170 int32_t CallManagerService::RegisterCallBack(const sptr<ICallAbilityCallback> &callback)
171 {
172     int32_t uid = IPCSkeleton::GetCallingUid();
173     std::string bundleName = "";
174     TelephonyPermission::GetBundleNameByUid(uid, bundleName);
175     if (bundleName.empty()) {
176         bundleName.append(std::to_string(uid));
177         bundleName.append(std::to_string(IPCSkeleton::GetCallingPid()));
178     } else {
179         if (CheckBundleName(bundleName) != TELEPHONY_SUCCESS) {
180             TELEPHONY_LOGE("%{public}s no permission to register callback", bundleName.c_str());
181             return TELEPHONY_ERR_PERMISSION_ERR;
182         }
183     }
184     return DelayedSingleton<CallAbilityReportProxy>::GetInstance()->RegisterCallBack(callback, bundleName);
185 }
186 
UnRegisterCallBack()187 int32_t CallManagerService::UnRegisterCallBack()
188 {
189     int32_t uid = IPCSkeleton::GetCallingUid();
190     std::string bundleName = "";
191     TelephonyPermission::GetBundleNameByUid(uid, bundleName);
192     if (bundleName.empty()) {
193         bundleName.append(std::to_string(uid));
194         bundleName.append(std::to_string(IPCSkeleton::GetCallingPid()));
195     }
196     return DelayedSingleton<CallAbilityReportProxy>::GetInstance()->UnRegisterCallBack(bundleName);
197 }
198 
DialCall(std::u16string number,AppExecFwk::PacMap & extras)199 int32_t CallManagerService::DialCall(std::u16string number, AppExecFwk::PacMap &extras)
200 {
201     int32_t uid = IPCSkeleton::GetCallingUid();
202     std::string bundleName = "";
203     TelephonyPermission::GetBundleNameByUid(uid, bundleName);
204     extras.PutStringValue("bundleName", bundleName);
205     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_PLACE_CALL)) {
206         TELEPHONY_LOGE("Permission denied!");
207         return TELEPHONY_ERR_PERMISSION_ERR;
208     }
209     if (callControlManagerPtr_ != nullptr) {
210         return callControlManagerPtr_->DialCall(number, extras);
211     } else {
212         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
213         return TELEPHONY_ERR_LOCAL_PTR_NULL;
214     }
215 }
216 
AnswerCall(int32_t callId,int32_t videoState)217 int32_t CallManagerService::AnswerCall(int32_t callId, int32_t videoState)
218 {
219     if (callControlManagerPtr_ != nullptr) {
220         return callControlManagerPtr_->AnswerCall(callId, videoState);
221     } else {
222         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
223         return TELEPHONY_ERR_LOCAL_PTR_NULL;
224     }
225 }
226 
RejectCall(int32_t callId,bool rejectWithMessage,std::u16string textMessage)227 int32_t CallManagerService::RejectCall(int32_t callId, bool rejectWithMessage, std::u16string textMessage)
228 {
229     if (callControlManagerPtr_ != nullptr) {
230         return callControlManagerPtr_->RejectCall(callId, rejectWithMessage, textMessage);
231     } else {
232         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
233         return TELEPHONY_ERR_LOCAL_PTR_NULL;
234     }
235 }
236 
HangUpCall(int32_t callId)237 int32_t CallManagerService::HangUpCall(int32_t callId)
238 {
239     if (callControlManagerPtr_ != nullptr) {
240         return callControlManagerPtr_->HangUpCall(callId);
241     } else {
242         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
243         return TELEPHONY_ERR_LOCAL_PTR_NULL;
244     }
245 }
246 
GetCallState()247 int32_t CallManagerService::GetCallState()
248 {
249     if (callControlManagerPtr_ != nullptr) {
250         return callControlManagerPtr_->GetCallState();
251     } else {
252         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
253         return TELEPHONY_ERR_LOCAL_PTR_NULL;
254     }
255 }
256 
HoldCall(int32_t callId)257 int32_t CallManagerService::HoldCall(int32_t callId)
258 {
259     if (callControlManagerPtr_ != nullptr) {
260         return callControlManagerPtr_->HoldCall(callId);
261     } else {
262         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
263         return TELEPHONY_ERR_LOCAL_PTR_NULL;
264     }
265 }
266 
UnHoldCall(int32_t callId)267 int32_t CallManagerService::UnHoldCall(int32_t callId)
268 {
269     if (callControlManagerPtr_ != nullptr) {
270         return callControlManagerPtr_->UnHoldCall(callId);
271     } else {
272         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
273         return TELEPHONY_ERR_LOCAL_PTR_NULL;
274     }
275 }
276 
SwitchCall(int32_t callId)277 int32_t CallManagerService::SwitchCall(int32_t callId)
278 {
279     if (callControlManagerPtr_ != nullptr) {
280         return callControlManagerPtr_->SwitchCall(callId);
281     } else {
282         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
283         return TELEPHONY_ERR_LOCAL_PTR_NULL;
284     }
285 }
286 
HasCall()287 bool CallManagerService::HasCall()
288 {
289     if (callControlManagerPtr_ != nullptr) {
290         return callControlManagerPtr_->HasCall();
291     } else {
292         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
293         return false;
294     }
295 }
296 
IsNewCallAllowed()297 bool CallManagerService::IsNewCallAllowed()
298 {
299     if (callControlManagerPtr_ != nullptr) {
300         return callControlManagerPtr_->IsNewCallAllowed();
301     } else {
302         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
303         return false;
304     }
305 }
306 
IsRinging()307 bool CallManagerService::IsRinging()
308 {
309     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
310         TELEPHONY_LOGE("Permission denied!");
311         return false;
312     }
313     if (callControlManagerPtr_ != nullptr) {
314         return callControlManagerPtr_->IsRinging();
315     } else {
316         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
317         return false;
318     }
319 }
320 
IsInEmergencyCall()321 bool CallManagerService::IsInEmergencyCall()
322 {
323     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
324         TELEPHONY_LOGE("Permission denied!");
325         return false;
326     }
327     if (callControlManagerPtr_ != nullptr) {
328         return callControlManagerPtr_->HasEmergency();
329     } else {
330         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
331         return false;
332     }
333 }
334 
StartDtmf(int32_t callId,char str)335 int32_t CallManagerService::StartDtmf(int32_t callId, char str)
336 {
337     if (callControlManagerPtr_ != nullptr) {
338         return callControlManagerPtr_->StartDtmf(callId, str);
339     } else {
340         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
341         return TELEPHONY_ERR_LOCAL_PTR_NULL;
342     }
343 }
344 
StopDtmf(int32_t callId)345 int32_t CallManagerService::StopDtmf(int32_t callId)
346 {
347     if (callControlManagerPtr_ != nullptr) {
348         return callControlManagerPtr_->StopDtmf(callId);
349     } else {
350         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
351         return TELEPHONY_ERR_LOCAL_PTR_NULL;
352     }
353 }
354 
GetCallWaiting(int32_t slotId)355 int32_t CallManagerService::GetCallWaiting(int32_t slotId)
356 {
357     if (callControlManagerPtr_ != nullptr) {
358         return callControlManagerPtr_->GetCallWaiting(slotId);
359     } else {
360         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
361         return TELEPHONY_ERR_LOCAL_PTR_NULL;
362     }
363 }
364 
SetCallWaiting(int32_t slotId,bool activate)365 int32_t CallManagerService::SetCallWaiting(int32_t slotId, bool activate)
366 {
367     if (callControlManagerPtr_ != nullptr) {
368         return callControlManagerPtr_->SetCallWaiting(slotId, activate);
369     } else {
370         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
371         return TELEPHONY_ERR_LOCAL_PTR_NULL;
372     }
373 }
374 
GetCallRestriction(int32_t slotId,CallRestrictionType type)375 int32_t CallManagerService::GetCallRestriction(int32_t slotId, CallRestrictionType type)
376 {
377     if (callControlManagerPtr_ != nullptr) {
378         return callControlManagerPtr_->GetCallRestriction(slotId, type);
379     } else {
380         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
381         return TELEPHONY_ERR_LOCAL_PTR_NULL;
382     }
383 }
384 
SetCallRestriction(int32_t slotId,CallRestrictionInfo & info)385 int32_t CallManagerService::SetCallRestriction(int32_t slotId, CallRestrictionInfo &info)
386 {
387     if (callControlManagerPtr_ != nullptr) {
388         return callControlManagerPtr_->SetCallRestriction(slotId, info);
389     } else {
390         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
391         return TELEPHONY_ERR_LOCAL_PTR_NULL;
392     }
393 }
394 
GetCallTransferInfo(int32_t slotId,CallTransferType type)395 int32_t CallManagerService::GetCallTransferInfo(int32_t slotId, CallTransferType type)
396 {
397     if (callControlManagerPtr_ != nullptr) {
398         return callControlManagerPtr_->GetCallTransferInfo(slotId, type);
399     } else {
400         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
401         return TELEPHONY_ERR_LOCAL_PTR_NULL;
402     }
403 }
404 
SetCallTransferInfo(int32_t slotId,CallTransferInfo & info)405 int32_t CallManagerService::SetCallTransferInfo(int32_t slotId, CallTransferInfo &info)
406 {
407     if (callControlManagerPtr_ != nullptr) {
408         return callControlManagerPtr_->SetCallTransferInfo(slotId, info);
409     } else {
410         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
411         return TELEPHONY_ERR_LOCAL_PTR_NULL;
412     }
413 }
414 
SetCallPreferenceMode(int32_t slotId,int32_t mode)415 int32_t CallManagerService::SetCallPreferenceMode(int32_t slotId, int32_t mode)
416 {
417     if (callControlManagerPtr_ != nullptr) {
418         return callControlManagerPtr_->SetCallPreferenceMode(slotId, mode);
419     } else {
420         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
421         return TELEPHONY_ERR_LOCAL_PTR_NULL;
422     }
423 }
424 
StartRtt(int32_t callId,std::u16string & msg)425 int32_t CallManagerService::StartRtt(int32_t callId, std::u16string &msg)
426 {
427     if (callControlManagerPtr_ != nullptr) {
428         return callControlManagerPtr_->StartRtt(callId, msg);
429     } else {
430         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
431         return TELEPHONY_ERR_LOCAL_PTR_NULL;
432     }
433 }
434 
StopRtt(int32_t callId)435 int32_t CallManagerService::StopRtt(int32_t callId)
436 {
437     if (callControlManagerPtr_ != nullptr) {
438         return callControlManagerPtr_->StopRtt(callId);
439     } else {
440         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
441         return TELEPHONY_ERR_LOCAL_PTR_NULL;
442     }
443 }
444 
CombineConference(int32_t mainCallId)445 int32_t CallManagerService::CombineConference(int32_t mainCallId)
446 {
447     if (callControlManagerPtr_ != nullptr) {
448         return callControlManagerPtr_->CombineConference(mainCallId);
449     } else {
450         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
451         return TELEPHONY_ERR_LOCAL_PTR_NULL;
452     }
453 }
454 
SeparateConference(int32_t callId)455 int32_t CallManagerService::SeparateConference(int32_t callId)
456 {
457     if (callControlManagerPtr_ != nullptr) {
458         return callControlManagerPtr_->SeparateConference(callId);
459     } else {
460         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
461         return TELEPHONY_ERR_LOCAL_PTR_NULL;
462     }
463 }
464 
SetMuted(bool isMute)465 int32_t CallManagerService::SetMuted(bool isMute)
466 {
467     if (callControlManagerPtr_ != nullptr) {
468         return callControlManagerPtr_->SetMuted(isMute);
469     } else {
470         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
471         return TELEPHONY_ERR_LOCAL_PTR_NULL;
472     }
473 }
474 
MuteRinger()475 int32_t CallManagerService::MuteRinger()
476 {
477     if (!TelephonyPermission::CheckPermission(OHOS_PERMISSION_SET_TELEPHONY_STATE)) {
478         TELEPHONY_LOGE("Permission denied!");
479         return TELEPHONY_ERR_PERMISSION_ERR;
480     }
481     if (callControlManagerPtr_ != nullptr) {
482         return callControlManagerPtr_->MuteRinger();
483     } else {
484         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
485         return TELEPHONY_ERR_LOCAL_PTR_NULL;
486     }
487 }
488 
SetAudioDevice(AudioDevice deviceType)489 int32_t CallManagerService::SetAudioDevice(AudioDevice deviceType)
490 {
491     if (callControlManagerPtr_ != nullptr) {
492         if (callControlManagerPtr_->SetAudioDevice(deviceType) == TELEPHONY_SUCCESS) {
493             return TELEPHONY_SUCCESS;
494         }
495         TELEPHONY_LOGE("SetAudioDevice failed!");
496         return CALL_ERR_SETTING_AUDIO_DEVICE_FAILED;
497     } else {
498         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
499         return TELEPHONY_ERR_LOCAL_PTR_NULL;
500     }
501 }
502 
ControlCamera(std::u16string cameraId)503 int32_t CallManagerService::ControlCamera(std::u16string cameraId)
504 {
505     if (callControlManagerPtr_ != nullptr) {
506         return callControlManagerPtr_->ControlCamera(
507             cameraId, IPCSkeleton::GetCallingUid(), IPCSkeleton::GetCallingPid());
508     } else {
509         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
510         return TELEPHONY_ERR_LOCAL_PTR_NULL;
511     }
512 }
513 
SetPreviewWindow(VideoWindow & window)514 int32_t CallManagerService::SetPreviewWindow(VideoWindow &window)
515 {
516     if (callControlManagerPtr_ != nullptr) {
517         return callControlManagerPtr_->SetPreviewWindow(window);
518     } else {
519         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
520         return TELEPHONY_ERR_LOCAL_PTR_NULL;
521     }
522 }
523 
SetDisplayWindow(VideoWindow & window)524 int32_t CallManagerService::SetDisplayWindow(VideoWindow &window)
525 {
526     if (callControlManagerPtr_ != nullptr) {
527         return callControlManagerPtr_->SetDisplayWindow(window);
528     } else {
529         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
530         return TELEPHONY_ERR_LOCAL_PTR_NULL;
531     }
532 }
533 
SetCameraZoom(float zoomRatio)534 int32_t CallManagerService::SetCameraZoom(float zoomRatio)
535 {
536     if (callControlManagerPtr_ != nullptr) {
537         return callControlManagerPtr_->SetCameraZoom(zoomRatio);
538     } else {
539         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
540         return TELEPHONY_ERR_LOCAL_PTR_NULL;
541     }
542 }
543 
SetPausePicture(std::u16string path)544 int32_t CallManagerService::SetPausePicture(std::u16string path)
545 {
546     if (callControlManagerPtr_ != nullptr) {
547         return callControlManagerPtr_->SetPausePicture(path);
548     } else {
549         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
550         return TELEPHONY_ERR_LOCAL_PTR_NULL;
551     }
552 }
553 
SetDeviceDirection(int32_t rotation)554 int32_t CallManagerService::SetDeviceDirection(int32_t rotation)
555 {
556     if (callControlManagerPtr_ != nullptr) {
557         return callControlManagerPtr_->SetDeviceDirection(rotation);
558     } else {
559         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
560         return TELEPHONY_ERR_LOCAL_PTR_NULL;
561     }
562 }
563 
IsEmergencyPhoneNumber(std::u16string & number,int32_t slotId,int32_t & errorCode)564 bool CallManagerService::IsEmergencyPhoneNumber(std::u16string &number, int32_t slotId, int32_t &errorCode)
565 {
566     if (callControlManagerPtr_ != nullptr) {
567         return callControlManagerPtr_->IsEmergencyPhoneNumber(number, slotId, errorCode);
568     } else {
569         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
570         return false;
571     }
572 }
573 
FormatPhoneNumber(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)574 int32_t CallManagerService::FormatPhoneNumber(
575     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
576 {
577     if (callControlManagerPtr_ != nullptr) {
578         return callControlManagerPtr_->FormatPhoneNumber(number, countryCode, formatNumber);
579     } else {
580         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
581         return TELEPHONY_ERR_LOCAL_PTR_NULL;
582     }
583 }
584 
FormatPhoneNumberToE164(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)585 int32_t CallManagerService::FormatPhoneNumberToE164(
586     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
587 {
588     if (callControlManagerPtr_ != nullptr) {
589         return callControlManagerPtr_->FormatPhoneNumberToE164(number, countryCode, formatNumber);
590     } else {
591         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
592         return TELEPHONY_ERR_LOCAL_PTR_NULL;
593     }
594 }
595 
GetMainCallId(int32_t callId)596 int32_t CallManagerService::GetMainCallId(int32_t callId)
597 {
598     if (callControlManagerPtr_ != nullptr) {
599         return callControlManagerPtr_->GetMainCallId(callId);
600     } else {
601         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
602         return TELEPHONY_ERR_LOCAL_PTR_NULL;
603     }
604 }
605 
GetSubCallIdList(int32_t callId)606 std::vector<std::u16string> CallManagerService::GetSubCallIdList(int32_t callId)
607 {
608     if (callControlManagerPtr_ != nullptr) {
609         return callControlManagerPtr_->GetSubCallIdList(callId);
610     }
611     std::vector<std::u16string> vec;
612     vec.clear();
613     return vec;
614 }
615 
GetCallIdListForConference(int32_t callId)616 std::vector<std::u16string> CallManagerService::GetCallIdListForConference(int32_t callId)
617 {
618     if (callControlManagerPtr_ != nullptr) {
619         return callControlManagerPtr_->GetCallIdListForConference(callId);
620     }
621     std::vector<std::u16string> vec;
622     vec.clear();
623     return vec;
624 }
625 
GetImsConfig(int32_t slotId,ImsConfigItem item)626 int32_t CallManagerService::GetImsConfig(int32_t slotId, ImsConfigItem item)
627 {
628     if (callControlManagerPtr_ != nullptr) {
629         return callControlManagerPtr_->GetImsConfig(slotId, item);
630     } else {
631         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
632         return TELEPHONY_ERR_LOCAL_PTR_NULL;
633     }
634 }
635 
SetImsConfig(int32_t slotId,ImsConfigItem item,std::u16string & value)636 int32_t CallManagerService::SetImsConfig(int32_t slotId, ImsConfigItem item, std::u16string &value)
637 {
638     if (callControlManagerPtr_ != nullptr) {
639         return callControlManagerPtr_->SetImsConfig(slotId, item, value);
640     } else {
641         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
642         return TELEPHONY_ERR_LOCAL_PTR_NULL;
643     }
644 }
645 
GetImsFeatureValue(int32_t slotId,FeatureType type)646 int32_t CallManagerService::GetImsFeatureValue(int32_t slotId, FeatureType type)
647 {
648     if (callControlManagerPtr_ != nullptr) {
649         return callControlManagerPtr_->GetImsFeatureValue(slotId, type);
650     } else {
651         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
652         return TELEPHONY_ERR_LOCAL_PTR_NULL;
653     }
654 }
655 
SetImsFeatureValue(int32_t slotId,FeatureType type,int32_t value)656 int32_t CallManagerService::SetImsFeatureValue(int32_t slotId, FeatureType type, int32_t value)
657 {
658     if (callControlManagerPtr_ != nullptr) {
659         return callControlManagerPtr_->SetImsFeatureValue(slotId, type, value);
660     } else {
661         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
662         return TELEPHONY_ERR_LOCAL_PTR_NULL;
663     }
664 }
665 
UpdateImsCallMode(int32_t callId,ImsCallMode mode)666 int32_t CallManagerService::UpdateImsCallMode(int32_t callId, ImsCallMode mode)
667 {
668     if (callControlManagerPtr_ != nullptr) {
669         return callControlManagerPtr_->UpdateImsCallMode(callId, mode);
670     } else {
671         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
672         return TELEPHONY_ERR_LOCAL_PTR_NULL;
673     }
674 }
675 
EnableImsSwitch(int32_t slotId)676 int32_t CallManagerService::EnableImsSwitch(int32_t slotId)
677 {
678     if (callControlManagerPtr_ != nullptr) {
679         return callControlManagerPtr_->EnableImsSwitch(slotId);
680     } else {
681         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
682         return TELEPHONY_ERR_LOCAL_PTR_NULL;
683     }
684 }
685 
DisableImsSwitch(int32_t slotId)686 int32_t CallManagerService::DisableImsSwitch(int32_t slotId)
687 {
688     if (callControlManagerPtr_ != nullptr) {
689         return callControlManagerPtr_->DisableImsSwitch(slotId);
690     } else {
691         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
692         return TELEPHONY_ERR_LOCAL_PTR_NULL;
693     }
694 }
695 
IsImsSwitchEnabled(int32_t slotId)696 int32_t CallManagerService::IsImsSwitchEnabled(int32_t slotId)
697 {
698     if (callControlManagerPtr_ != nullptr) {
699         return callControlManagerPtr_->IsImsSwitchEnabled(slotId);
700     } else {
701         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
702         return TELEPHONY_ERR_LOCAL_PTR_NULL;
703     }
704 }
705 
EnableLteEnhanceMode(int32_t slotId)706 int32_t CallManagerService::EnableLteEnhanceMode(int32_t slotId)
707 {
708     if (callControlManagerPtr_ != nullptr) {
709         return callControlManagerPtr_->SetLteEnhanceMode(slotId, true);
710     } else {
711         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
712         return TELEPHONY_ERR_LOCAL_PTR_NULL;
713     }
714 }
715 
DisableLteEnhanceMode(int32_t slotId)716 int32_t CallManagerService::DisableLteEnhanceMode(int32_t slotId)
717 {
718     if (callControlManagerPtr_ != nullptr) {
719         return callControlManagerPtr_->SetLteEnhanceMode(slotId, false);
720     } else {
721         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
722         return TELEPHONY_ERR_LOCAL_PTR_NULL;
723     }
724 }
725 
IsLteEnhanceModeEnabled(int32_t slotId)726 int32_t CallManagerService::IsLteEnhanceModeEnabled(int32_t slotId)
727 {
728     if (callControlManagerPtr_ != nullptr) {
729         return callControlManagerPtr_->GetLteEnhanceMode(slotId);
730     } else {
731         TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
732         return TELEPHONY_ERR_LOCAL_PTR_NULL;
733     }
734 }
735 
JoinConference(int32_t callId,std::vector<std::u16string> & numberList)736 int32_t CallManagerService::JoinConference(int32_t callId, std::vector<std::u16string> &numberList)
737 {
738     if (callControlManagerPtr_ != nullptr) {
739         return callControlManagerPtr_->JoinConference(callId, numberList);
740     }
741     TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
742     return TELEPHONY_ERR_LOCAL_PTR_NULL;
743 }
744 
ReportOttCallDetailsInfo(std::vector<OttCallDetailsInfo> & ottVec)745 int32_t CallManagerService::ReportOttCallDetailsInfo(std::vector<OttCallDetailsInfo> &ottVec)
746 {
747     if (ottVec.empty()) {
748         TELEPHONY_LOGE("ottVec is empty!");
749         return TELEPHONY_ERR_ARGUMENT_INVALID;
750     }
751     CallDetailsInfo detailsInfo;
752     CallDetailInfo detailInfo;
753     detailsInfo.slotId = ERR_ID;
754     (void)memcpy_s(detailsInfo.bundleName, kMaxBundleNameLen, ottVec[0].bundleName, kMaxBundleNameLen);
755     detailInfo.callType = CallType::TYPE_OTT;
756     detailInfo.accountId = ERR_ID;
757     detailInfo.index = ERR_ID;
758     detailInfo.voiceDomain = ERR_ID;
759     std::vector<OttCallDetailsInfo>::iterator it = ottVec.begin();
760     for (; it != ottVec.end(); ++it) {
761         detailInfo.callMode = (*it).videoState;
762         detailInfo.state = (*it).callState;
763         (void)memcpy_s(detailInfo.phoneNum, kMaxNumberLen, (*it).phoneNum, kMaxNumberLen);
764         (void)memcpy_s(detailInfo.bundleName, kMaxBundleNameLen, (*it).bundleName, kMaxBundleNameLen);
765         detailsInfo.callVec.push_back(detailInfo);
766     }
767     int32_t ret = DelayedSingleton<ReportCallInfoHandlerService>::GetInstance()->UpdateCallsReportInfo(detailsInfo);
768     if (ret != TELEPHONY_SUCCESS) {
769         TELEPHONY_LOGE("UpdateCallsReportInfo failed! errCode:%{public}d", ret);
770     } else {
771         TELEPHONY_LOGI("UpdateCallsReportInfo success!");
772     }
773     return ret;
774 }
775 
ReportOttCallEventInfo(OttCallEventInfo & eventInfo)776 int32_t CallManagerService::ReportOttCallEventInfo(OttCallEventInfo &eventInfo)
777 {
778     int32_t ret = DelayedSingleton<ReportCallInfoHandlerService>::GetInstance()->UpdateOttEventInfo(eventInfo);
779     if (ret != TELEPHONY_SUCCESS) {
780         TELEPHONY_LOGE("UpdateOttEventInfo failed! errCode:%{public}d", ret);
781     } else {
782         TELEPHONY_LOGI("UpdateOttEventInfo success!");
783     }
784     return ret;
785 }
786 
GetProxyObjectPtr(CallManagerProxyType proxyType)787 sptr<IRemoteObject> CallManagerService::GetProxyObjectPtr(CallManagerProxyType proxyType)
788 {
789     auto it = proxyObjectPtrMap_.find(static_cast<uint32_t>(proxyType));
790     if (it != proxyObjectPtrMap_.end()) {
791         TELEPHONY_LOGI("GetProxyObjectPtr success! proxyType:%{public}d", proxyType);
792         return it->second;
793     } else {
794         switch (proxyType) {
795             case PROXY_BLUETOOTH_CALL: {
796                 sptr<BluetoothCallService> ptr = (std::make_unique<BluetoothCallService>()).release();
797                 if (ptr == nullptr) {
798                     TELEPHONY_LOGE("create BluetoothCallService object failed!");
799                     return nullptr;
800                 }
801                 proxyObjectPtrMap_[proxyType] = ptr->AsObject().GetRefPtr();
802                 TELEPHONY_LOGI("create BluetoothCallService object success! proxyType:%{public}d", proxyType);
803                 return ptr->AsObject().GetRefPtr();
804             }
805             default:
806                 TELEPHONY_LOGE("invalid proxyType!");
807                 break;
808         }
809     }
810     TELEPHONY_LOGE("GetProxyObjectPtr failed! proxyType:%{public}d", proxyType);
811     return nullptr;
812 }
813 
CheckBundleName(std::string bundleName)814 int32_t CallManagerService::CheckBundleName(std::string bundleName)
815 {
816     std::string bundleNameList[] = {
817         "com.ohos.callui",
818     };
819     for (int32_t i = 0; i < end(bundleNameList) - begin(bundleNameList); i++) {
820         if (strcmp(bundleName.c_str(), bundleNameList[i].c_str()) == 0) {
821             return TELEPHONY_SUCCESS;
822         }
823     }
824     return TELEPHONY_ERROR;
825 }
826 } // namespace Telephony
827 } // namespace OHOS
828