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_client.h"
17
18 #include <memory>
19
20 #include "call_manager_proxy.h"
21 #include "parameter.h"
22 #include "telephony_errors.h"
23
24 namespace OHOS {
25 namespace Telephony {
26 std::shared_ptr<CallManagerProxy> g_callManagerProxy = nullptr;
27
28 const std::string KEY_VOICECALL_CAP = "const.telephony.voice.capable";
29 const int32_t VOICECALL_CAP_VAL_LEN = 6;
30
CallManagerClient()31 CallManagerClient::CallManagerClient() {}
32
~CallManagerClient()33 CallManagerClient::~CallManagerClient() {}
34
Init(int32_t systemAbilityId)35 void CallManagerClient::Init(int32_t systemAbilityId)
36 {
37 if (g_callManagerProxy == nullptr) {
38 g_callManagerProxy = DelayedSingleton<CallManagerProxy>::GetInstance();
39 if (g_callManagerProxy == nullptr) {
40 TELEPHONY_LOGE("g_callManagerProxy is nullptr");
41 return;
42 }
43 g_callManagerProxy->Init(systemAbilityId);
44 }
45 TELEPHONY_LOGI("CallManagerClient init success!");
46 }
47
UnInit()48 void CallManagerClient::UnInit()
49 {
50 if (g_callManagerProxy != nullptr) {
51 g_callManagerProxy->UnInit();
52 } else {
53 TELEPHONY_LOGE("init first please!");
54 }
55 }
56
RegisterCallBack(std::unique_ptr<CallManagerCallback> callback)57 int32_t CallManagerClient::RegisterCallBack(std::unique_ptr<CallManagerCallback> callback)
58 {
59 if (g_callManagerProxy != nullptr) {
60 return g_callManagerProxy->RegisterCallBack(std::move(callback));
61 } else {
62 TELEPHONY_LOGE("init first please!");
63 return TELEPHONY_ERR_UNINIT;
64 }
65 }
66
UnRegisterCallBack()67 int32_t CallManagerClient::UnRegisterCallBack()
68 {
69 if (g_callManagerProxy != nullptr) {
70 return g_callManagerProxy->UnRegisterCallBack();
71 } else {
72 TELEPHONY_LOGE("init first please!");
73 return TELEPHONY_ERR_UNINIT;
74 }
75 }
76
DialCall(std::u16string number,AppExecFwk::PacMap & extras)77 int32_t CallManagerClient::DialCall(std::u16string number, AppExecFwk::PacMap &extras)
78 {
79 if (g_callManagerProxy != nullptr) {
80 return g_callManagerProxy->DialCall(number, extras);
81 } else {
82 TELEPHONY_LOGE("init first please!");
83 return TELEPHONY_ERR_UNINIT;
84 }
85 }
86
AnswerCall(int32_t callId,int32_t videoState)87 int32_t CallManagerClient::AnswerCall(int32_t callId, int32_t videoState)
88 {
89 if (g_callManagerProxy != nullptr) {
90 return g_callManagerProxy->AnswerCall(callId, videoState);
91 } else {
92 TELEPHONY_LOGE("init first please!");
93 return TELEPHONY_ERR_UNINIT;
94 }
95 }
96
RejectCall(int32_t callId,bool isSendSms,std::u16string content)97 int32_t CallManagerClient::RejectCall(int32_t callId, bool isSendSms, std::u16string content)
98 {
99 if (g_callManagerProxy != nullptr) {
100 return g_callManagerProxy->RejectCall(callId, isSendSms, content);
101 } else {
102 TELEPHONY_LOGE("init first please!");
103 return TELEPHONY_ERR_UNINIT;
104 }
105 }
106
HangUpCall(int32_t callId)107 int32_t CallManagerClient::HangUpCall(int32_t callId)
108 {
109 if (g_callManagerProxy != nullptr) {
110 return g_callManagerProxy->HangUpCall(callId);
111 } else {
112 TELEPHONY_LOGE("init first please!");
113 return TELEPHONY_ERR_UNINIT;
114 }
115 }
116
GetCallState()117 int32_t CallManagerClient::GetCallState()
118 {
119 if (g_callManagerProxy != nullptr) {
120 return g_callManagerProxy->GetCallState();
121 } else {
122 TELEPHONY_LOGE("init first please!");
123 return TELEPHONY_ERR_UNINIT;
124 }
125 }
126
HoldCall(int32_t callId)127 int32_t CallManagerClient::HoldCall(int32_t callId)
128 {
129 if (g_callManagerProxy != nullptr) {
130 return g_callManagerProxy->HoldCall(callId);
131 } else {
132 TELEPHONY_LOGE("init first please!");
133 return TELEPHONY_ERR_UNINIT;
134 }
135 }
136
UnHoldCall(int32_t callId)137 int32_t CallManagerClient::UnHoldCall(int32_t callId)
138 {
139 if (g_callManagerProxy != nullptr) {
140 return g_callManagerProxy->UnHoldCall(callId);
141 } else {
142 TELEPHONY_LOGE("init first please!");
143 return TELEPHONY_ERR_UNINIT;
144 }
145 }
146
SwitchCall(int32_t callId)147 int32_t CallManagerClient::SwitchCall(int32_t callId)
148 {
149 if (g_callManagerProxy != nullptr) {
150 return g_callManagerProxy->SwitchCall(callId);
151 } else {
152 TELEPHONY_LOGE("init first please!");
153 return TELEPHONY_ERR_UNINIT;
154 }
155 }
156
CombineConference(int32_t callId)157 int32_t CallManagerClient::CombineConference(int32_t callId)
158 {
159 if (g_callManagerProxy != nullptr) {
160 return g_callManagerProxy->CombineConference(callId);
161 } else {
162 TELEPHONY_LOGE("init first please!");
163 return TELEPHONY_ERR_UNINIT;
164 }
165 }
166
SeparateConference(int32_t callId)167 int32_t CallManagerClient::SeparateConference(int32_t callId)
168 {
169 if (g_callManagerProxy != nullptr) {
170 return g_callManagerProxy->SeparateConference(callId);
171 } else {
172 TELEPHONY_LOGE("init first please!");
173 return TELEPHONY_ERR_UNINIT;
174 }
175 }
176
GetMainCallId(int32_t & callId,int32_t & mainCallId)177 int32_t CallManagerClient::GetMainCallId(int32_t &callId, int32_t &mainCallId)
178 {
179 if (g_callManagerProxy != nullptr) {
180 return g_callManagerProxy->GetMainCallId(callId, mainCallId);
181 } else {
182 TELEPHONY_LOGE("init first please!");
183 return TELEPHONY_ERR_UNINIT;
184 }
185 }
186
GetSubCallIdList(int32_t callId,std::vector<std::u16string> & callIdList)187 int32_t CallManagerClient::GetSubCallIdList(int32_t callId, std::vector<std::u16string> &callIdList)
188 {
189 if (g_callManagerProxy != nullptr) {
190 return g_callManagerProxy->GetSubCallIdList(callId, callIdList);
191 } else {
192 TELEPHONY_LOGE("init first please!");
193 callIdList.clear();
194 return TELEPHONY_ERR_UNINIT;
195 }
196 }
197
GetCallIdListForConference(int32_t callId,std::vector<std::u16string> & callIdList)198 int32_t CallManagerClient::GetCallIdListForConference(int32_t callId, std::vector<std::u16string> &callIdList)
199 {
200 if (g_callManagerProxy != nullptr) {
201 return g_callManagerProxy->GetCallIdListForConference(callId, callIdList);
202 } else {
203 TELEPHONY_LOGE("init first please!");
204 callIdList.clear();
205 return TELEPHONY_ERR_UNINIT;
206 }
207 }
208
GetCallWaiting(int32_t slotId)209 int32_t CallManagerClient::GetCallWaiting(int32_t slotId)
210 {
211 if (g_callManagerProxy != nullptr) {
212 return g_callManagerProxy->GetCallWaiting(slotId);
213 } else {
214 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
215 return TELEPHONY_ERR_UNINIT;
216 }
217 }
218
SetCallWaiting(int32_t slotId,bool activate)219 int32_t CallManagerClient::SetCallWaiting(int32_t slotId, bool activate)
220 {
221 if (g_callManagerProxy != nullptr) {
222 return g_callManagerProxy->SetCallWaiting(slotId, activate);
223 } else {
224 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
225 return TELEPHONY_ERR_UNINIT;
226 }
227 }
228
GetCallRestriction(int32_t slotId,CallRestrictionType type)229 int32_t CallManagerClient::GetCallRestriction(int32_t slotId, CallRestrictionType type)
230 {
231 if (g_callManagerProxy != nullptr) {
232 return g_callManagerProxy->GetCallRestriction(slotId, type);
233 } else {
234 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
235 return TELEPHONY_ERR_UNINIT;
236 }
237 }
238
SetCallRestriction(int32_t slotId,CallRestrictionInfo & info)239 int32_t CallManagerClient::SetCallRestriction(int32_t slotId, CallRestrictionInfo &info)
240 {
241 if (g_callManagerProxy != nullptr) {
242 return g_callManagerProxy->SetCallRestriction(slotId, info);
243 } else {
244 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
245 return TELEPHONY_ERR_UNINIT;
246 }
247 }
248
GetCallTransferInfo(int32_t slotId,CallTransferType type)249 int32_t CallManagerClient::GetCallTransferInfo(int32_t slotId, CallTransferType type)
250 {
251 if (g_callManagerProxy != nullptr) {
252 return g_callManagerProxy->GetCallTransferInfo(slotId, type);
253 } else {
254 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
255 return TELEPHONY_ERR_UNINIT;
256 }
257 }
258
SetCallTransferInfo(int32_t slotId,CallTransferInfo & info)259 int32_t CallManagerClient::SetCallTransferInfo(int32_t slotId, CallTransferInfo &info)
260 {
261 if (g_callManagerProxy != nullptr) {
262 return g_callManagerProxy->SetCallTransferInfo(slotId, info);
263 } else {
264 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
265 return TELEPHONY_ERR_UNINIT;
266 }
267 }
268
SetCallPreferenceMode(int32_t slotId,int32_t mode)269 int32_t CallManagerClient::SetCallPreferenceMode(int32_t slotId, int32_t mode)
270 {
271 if (g_callManagerProxy != nullptr) {
272 return g_callManagerProxy->SetCallPreferenceMode(slotId, mode);
273 } else {
274 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
275 return TELEPHONY_ERR_UNINIT;
276 }
277 }
278
StartDtmf(int32_t callId,char str)279 int32_t CallManagerClient::StartDtmf(int32_t callId, char str)
280 {
281 if (g_callManagerProxy != nullptr) {
282 return g_callManagerProxy->StartDtmf(callId, str);
283 } else {
284 TELEPHONY_LOGE("init first please!");
285 return TELEPHONY_ERR_UNINIT;
286 }
287 }
288
StopDtmf(int32_t callId)289 int32_t CallManagerClient::StopDtmf(int32_t callId)
290 {
291 if (g_callManagerProxy != nullptr) {
292 return g_callManagerProxy->StopDtmf(callId);
293 } else {
294 TELEPHONY_LOGE("init first please!");
295 return TELEPHONY_ERR_UNINIT;
296 }
297 }
298
IsRinging(bool & enabled)299 int32_t CallManagerClient::IsRinging(bool &enabled)
300 {
301 if (g_callManagerProxy != nullptr) {
302 return g_callManagerProxy->IsRinging(enabled);
303 } else {
304 TELEPHONY_LOGE("init first please!");
305 return TELEPHONY_ERR_UNINIT;
306 }
307 }
308
HasCall()309 bool CallManagerClient::HasCall()
310 {
311 if (g_callManagerProxy != nullptr) {
312 return g_callManagerProxy->HasCall();
313 } else {
314 TELEPHONY_LOGE("init first please!");
315 return false;
316 }
317 }
318
IsNewCallAllowed(bool & enabled)319 int32_t CallManagerClient::IsNewCallAllowed(bool &enabled)
320 {
321 if (g_callManagerProxy != nullptr) {
322 return g_callManagerProxy->IsNewCallAllowed(enabled);
323 } else {
324 TELEPHONY_LOGE("init first please!");
325 return TELEPHONY_ERR_UNINIT;
326 }
327 }
328
IsInEmergencyCall(bool & enabled)329 int32_t CallManagerClient::IsInEmergencyCall(bool &enabled)
330 {
331 if (g_callManagerProxy != nullptr) {
332 return g_callManagerProxy->IsInEmergencyCall(enabled);
333 } else {
334 TELEPHONY_LOGE("init first please!");
335 return TELEPHONY_ERR_UNINIT;
336 }
337 }
338
IsEmergencyPhoneNumber(std::u16string & number,int32_t slotId,bool & enabled)339 int32_t CallManagerClient::IsEmergencyPhoneNumber(std::u16string &number, int32_t slotId, bool &enabled)
340 {
341 if (g_callManagerProxy != nullptr) {
342 return g_callManagerProxy->IsEmergencyPhoneNumber(number, slotId, enabled);
343 } else {
344 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
345 return TELEPHONY_ERR_UNINIT;
346 }
347 }
348
FormatPhoneNumber(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)349 int32_t CallManagerClient::FormatPhoneNumber(
350 std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
351 {
352 if (g_callManagerProxy != nullptr) {
353 return g_callManagerProxy->FormatPhoneNumber(number, countryCode, formatNumber);
354 } else {
355 TELEPHONY_LOGE("init first please!");
356 return TELEPHONY_ERR_UNINIT;
357 }
358 }
359
FormatPhoneNumberToE164(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)360 int32_t CallManagerClient::FormatPhoneNumberToE164(
361 std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
362 {
363 if (g_callManagerProxy != nullptr) {
364 return g_callManagerProxy->FormatPhoneNumberToE164(number, countryCode, formatNumber);
365 } else {
366 TELEPHONY_LOGE("init first please!");
367 return TELEPHONY_ERR_UNINIT;
368 }
369 }
370
SetMuted(bool isMute)371 int32_t CallManagerClient::SetMuted(bool isMute)
372 {
373 if (g_callManagerProxy != nullptr) {
374 return g_callManagerProxy->SetMuted(isMute);
375 } else {
376 TELEPHONY_LOGE("init first please!");
377 return TELEPHONY_ERR_UNINIT;
378 }
379 }
380
MuteRinger()381 int32_t CallManagerClient::MuteRinger()
382 {
383 if (g_callManagerProxy != nullptr) {
384 return g_callManagerProxy->MuteRinger();
385 } else {
386 TELEPHONY_LOGE("init first please!");
387 return TELEPHONY_ERR_UNINIT;
388 }
389 }
390
SetAudioDevice(AudioDevice deviceType,const std::string & bluetoothAddress)391 int32_t CallManagerClient::SetAudioDevice(AudioDevice deviceType, const std::string &bluetoothAddress)
392 {
393 if (g_callManagerProxy != nullptr) {
394 return g_callManagerProxy->SetAudioDevice(deviceType, bluetoothAddress);
395 } else {
396 TELEPHONY_LOGE("init first please!");
397 return TELEPHONY_ERR_UNINIT;
398 }
399 }
400
ControlCamera(std::u16string cameraId)401 int32_t CallManagerClient::ControlCamera(std::u16string cameraId)
402 {
403 if (g_callManagerProxy != nullptr) {
404 return g_callManagerProxy->ControlCamera(cameraId);
405 } else {
406 TELEPHONY_LOGE("init first please!");
407 return TELEPHONY_ERR_UNINIT;
408 }
409 }
410
SetPreviewWindow(VideoWindow & window)411 int32_t CallManagerClient::SetPreviewWindow(VideoWindow &window)
412 {
413 if (g_callManagerProxy != nullptr) {
414 return g_callManagerProxy->SetPreviewWindow(window);
415 } else {
416 TELEPHONY_LOGE("init first please!");
417 return TELEPHONY_ERR_UNINIT;
418 }
419 }
420
SetDisplayWindow(VideoWindow & window)421 int32_t CallManagerClient::SetDisplayWindow(VideoWindow &window)
422 {
423 if (g_callManagerProxy != nullptr) {
424 return g_callManagerProxy->SetDisplayWindow(window);
425 } else {
426 TELEPHONY_LOGE("init first please!");
427 return TELEPHONY_ERR_UNINIT;
428 }
429 }
430
SetCameraZoom(float zoomRatio)431 int32_t CallManagerClient::SetCameraZoom(float zoomRatio)
432 {
433 if (g_callManagerProxy != nullptr) {
434 return g_callManagerProxy->SetCameraZoom(zoomRatio);
435 } else {
436 TELEPHONY_LOGE("init first please!");
437 return TELEPHONY_ERR_UNINIT;
438 }
439 }
440
SetPausePicture(std::u16string path)441 int32_t CallManagerClient::SetPausePicture(std::u16string path)
442 {
443 if (g_callManagerProxy != nullptr) {
444 return g_callManagerProxy->SetPausePicture(path);
445 } else {
446 TELEPHONY_LOGE("init first please!");
447 return TELEPHONY_ERR_UNINIT;
448 }
449 }
450
SetDeviceDirection(int32_t rotation)451 int32_t CallManagerClient::SetDeviceDirection(int32_t rotation)
452 {
453 if (g_callManagerProxy != nullptr) {
454 return g_callManagerProxy->SetDeviceDirection(rotation);
455 } else {
456 TELEPHONY_LOGE("init first please!");
457 return TELEPHONY_ERR_UNINIT;
458 }
459 }
460
GetImsConfig(int32_t slotId,ImsConfigItem item)461 int32_t CallManagerClient::GetImsConfig(int32_t slotId, ImsConfigItem item)
462 {
463 if (g_callManagerProxy != nullptr) {
464 return g_callManagerProxy->GetImsConfig(slotId, item);
465 } else {
466 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
467 return TELEPHONY_ERR_UNINIT;
468 }
469 }
470
SetImsConfig(int32_t slotId,ImsConfigItem item,std::u16string & value)471 int32_t CallManagerClient::SetImsConfig(int32_t slotId, ImsConfigItem item, std::u16string &value)
472 {
473 if (g_callManagerProxy != nullptr) {
474 return g_callManagerProxy->SetImsConfig(slotId, item, value);
475 } else {
476 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
477 return TELEPHONY_ERR_UNINIT;
478 }
479 }
480
GetImsFeatureValue(int32_t slotId,FeatureType type)481 int32_t CallManagerClient::GetImsFeatureValue(int32_t slotId, FeatureType type)
482 {
483 if (g_callManagerProxy != nullptr) {
484 return g_callManagerProxy->GetImsFeatureValue(slotId, type);
485 } else {
486 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
487 return TELEPHONY_ERR_UNINIT;
488 }
489 }
490
SetImsFeatureValue(int32_t slotId,FeatureType type,int32_t value)491 int32_t CallManagerClient::SetImsFeatureValue(int32_t slotId, FeatureType type, int32_t value)
492 {
493 if (g_callManagerProxy != nullptr) {
494 return g_callManagerProxy->SetImsFeatureValue(slotId, type, value);
495 } else {
496 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
497 return TELEPHONY_ERR_UNINIT;
498 }
499 }
500
UpdateImsCallMode(int32_t callId,ImsCallMode mode)501 int32_t CallManagerClient::UpdateImsCallMode(int32_t callId, ImsCallMode mode)
502 {
503 if (g_callManagerProxy != nullptr) {
504 return g_callManagerProxy->UpdateImsCallMode(callId, mode);
505 } else {
506 TELEPHONY_LOGE("init first please!");
507 return TELEPHONY_ERR_UNINIT;
508 }
509 }
510
EnableImsSwitch(int32_t slotId)511 int32_t CallManagerClient::EnableImsSwitch(int32_t slotId)
512 {
513 if (g_callManagerProxy != nullptr) {
514 return g_callManagerProxy->EnableImsSwitch(slotId);
515 } else {
516 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
517 return TELEPHONY_ERR_UNINIT;
518 }
519 }
520
DisableImsSwitch(int32_t slotId)521 int32_t CallManagerClient::DisableImsSwitch(int32_t slotId)
522 {
523 if (g_callManagerProxy != nullptr) {
524 return g_callManagerProxy->DisableImsSwitch(slotId);
525 } else {
526 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
527 return TELEPHONY_ERR_UNINIT;
528 }
529 }
530
IsImsSwitchEnabled(int32_t slotId,bool & enabled)531 int32_t CallManagerClient::IsImsSwitchEnabled(int32_t slotId, bool &enabled)
532 {
533 if (g_callManagerProxy != nullptr) {
534 return g_callManagerProxy->IsImsSwitchEnabled(slotId, enabled);
535 } else {
536 TELEPHONY_LOGE("[slot%{public}d] init first please!", slotId);
537 return TELEPHONY_ERR_UNINIT;
538 }
539 }
540
StartRtt(int32_t callId,std::u16string & msg)541 int32_t CallManagerClient::StartRtt(int32_t callId, std::u16string &msg)
542 {
543 if (g_callManagerProxy != nullptr) {
544 return g_callManagerProxy->StartRtt(callId, msg);
545 } else {
546 TELEPHONY_LOGE("init first please!");
547 return TELEPHONY_ERR_UNINIT;
548 }
549 }
550
StopRtt(int32_t callId)551 int32_t CallManagerClient::StopRtt(int32_t callId)
552 {
553 if (g_callManagerProxy != nullptr) {
554 return g_callManagerProxy->StopRtt(callId);
555 } else {
556 TELEPHONY_LOGE("init first please!");
557 return TELEPHONY_ERR_UNINIT;
558 }
559 }
560
JoinConference(int32_t callId,std::vector<std::u16string> & numberList)561 int32_t CallManagerClient::JoinConference(int32_t callId, std::vector<std::u16string> &numberList)
562 {
563 if (g_callManagerProxy != nullptr) {
564 return g_callManagerProxy->JoinConference(callId, numberList);
565 } else {
566 TELEPHONY_LOGE("init first please!");
567 return TELEPHONY_ERR_UNINIT;
568 }
569 }
570
ReportOttCallDetailsInfo(std::vector<OttCallDetailsInfo> & ottVec)571 int32_t CallManagerClient::ReportOttCallDetailsInfo(std::vector<OttCallDetailsInfo> &ottVec)
572 {
573 if (g_callManagerProxy != nullptr) {
574 return g_callManagerProxy->ReportOttCallDetailsInfo(ottVec);
575 } else {
576 TELEPHONY_LOGE("init first please!");
577 return TELEPHONY_ERR_UNINIT;
578 }
579 }
580
ReportOttCallEventInfo(OttCallEventInfo & eventInfo)581 int32_t CallManagerClient::ReportOttCallEventInfo(OttCallEventInfo &eventInfo)
582 {
583 if (g_callManagerProxy != nullptr) {
584 return g_callManagerProxy->ReportOttCallEventInfo(eventInfo);
585 } else {
586 TELEPHONY_LOGE("init first please!");
587 return TELEPHONY_ERR_UNINIT;
588 }
589 }
590
HasVoiceCapability()591 bool CallManagerClient::HasVoiceCapability()
592 {
593 char retValue[VOICECALL_CAP_VAL_LEN + 1] = {"true"};
594 int retLen = GetParameter(KEY_VOICECALL_CAP.c_str(), "true", retValue, VOICECALL_CAP_VAL_LEN);
595 TELEPHONY_LOGI("HasVoiceCapability retValue %{public}s, retLen %{public}d", retValue, retLen);
596 if (strcmp(retValue, "false") == 0) {
597 return false;
598 }
599 return true;
600 }
601 } // namespace Telephony
602 } // namespace OHOS
603