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