1 /*
2 * Copyright (c) 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 #include "intell_voice_service.h"
16
17 #include <malloc.h>
18 #include <fcntl.h>
19 #include <cstdio>
20 #include <unistd.h>
21 #include "idevmgr_hdi.h"
22 #include "audio_system_manager.h"
23 #include "intell_voice_log.h"
24 #include "ipc_skeleton.h"
25 #include "system_ability_definition.h"
26 #include "intell_voice_service_manager.h"
27 #include "common_event_manager.h"
28 #include "common_event_support.h"
29 #include "update_state.h"
30 #include "engine_host_manager.h"
31 #include "intell_voice_util.h"
32
33 #define LOG_TAG "IntellVoiceService"
34
35 using namespace std;
36 using namespace OHOS::AppExecFwk;
37 using namespace OHOS::EventFwk;
38 using namespace OHOS::AudioStandard;
39 using namespace OHOS::IntellVoiceUtils;
40 using OHOS::HDI::DeviceManager::V1_0::IDeviceManager;
41
42 namespace OHOS {
43 namespace IntellVoiceEngine {
44 REGISTER_SYSTEM_ABILITY_BY_ID(IntellVoiceService, INTELL_VOICE_SERVICE_ID, true);
45 const std::string OHOS_PERMISSION_INTELL_VOICE = "ohos.permission.MANAGE_INTELLIGENT_VOICE";
46
IntellVoiceService(int32_t systemAbilityId,bool runOnCreate)47 IntellVoiceService::IntellVoiceService(int32_t systemAbilityId, bool runOnCreate)
48 : SystemAbility(INTELL_VOICE_SERVICE_ID, true)
49 {
50 systemAbilityChangeMap_[COMMON_EVENT_SERVICE_ID] = [this](bool isAdded) {
51 this->OnCommonEventServiceChange(isAdded);
52 };
53 systemAbilityChangeMap_[DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID] = [this](bool isAdded) {
54 this->OnDistributedKvDataServiceChange(isAdded);
55 };
56 #ifdef SUPPORT_TELEPHONY_SERVICE
57 systemAbilityChangeMap_[TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID] = [this](bool isAdded) {
58 this->OnTelephonyStateRegistryServiceChange(isAdded);
59 };
60 #endif
61 systemAbilityChangeMap_[AUDIO_DISTRIBUTED_SERVICE_ID] = [this](bool isAdded) {
62 this->OnAudioDistributedServiceChange(isAdded);
63 };
64 systemAbilityChangeMap_[AUDIO_POLICY_SERVICE_ID] = [this](bool isAdded) {
65 this->OnAudioPolicyServiceChange(isAdded);
66 };
67 systemAbilityChangeMap_[POWER_MANAGER_SERVICE_ID] = [this](bool isAdded) {
68 this->OnPowerManagerServiceChange(isAdded);
69 };
70 }
71
~IntellVoiceService()72 IntellVoiceService::~IntellVoiceService()
73 {
74 }
75
CreateIntellVoiceEngine(IntellVoiceEngineType type,sptr<IIntellVoiceEngine> & inst)76 int32_t IntellVoiceService::CreateIntellVoiceEngine(IntellVoiceEngineType type, sptr<IIntellVoiceEngine> &inst)
77 {
78 INTELL_VOICE_LOG_INFO("enter, type: %{public}d", type);
79 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
80 INTELL_VOICE_LOG_WARN("verify permission denied");
81 return -1;
82 }
83
84 auto &mgr = IntellVoiceServiceManager::GetInstance();
85 if (mgr == nullptr) {
86 INTELL_VOICE_LOG_ERROR("mgr is nullptr");
87 return -1;
88 }
89
90 inst = mgr->HandleCreateEngine(type);
91 if (inst == nullptr) {
92 INTELL_VOICE_LOG_ERROR("engine is nullptr");
93 return -1;
94 }
95 INTELL_VOICE_LOG_INFO("create engine ok");
96 return 0;
97 }
98
ReleaseIntellVoiceEngine(IntellVoiceEngineType type)99 int32_t IntellVoiceService::ReleaseIntellVoiceEngine(IntellVoiceEngineType type)
100 {
101 INTELL_VOICE_LOG_INFO("enter, type: %{public}d", type);
102 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
103 INTELL_VOICE_LOG_WARN("verify permission denied");
104 return -1;
105 }
106 auto &mgr = IntellVoiceServiceManager::GetInstance();
107 if (mgr == nullptr) {
108 INTELL_VOICE_LOG_ERROR("mgr is nullptr");
109 return -1;
110 }
111 return mgr->HandleReleaseEngine(type);
112 }
113
OnStart(const SystemAbilityOnDemandReason & startReason)114 void IntellVoiceService::OnStart(const SystemAbilityOnDemandReason &startReason)
115 {
116 INTELL_VOICE_LOG_INFO("enter, reason id:%{public}d", startReason.GetId());
117 reasonId_ = static_cast<int32_t>(startReason.GetId());
118 LoadIntellVoiceHost();
119
120 bool ret = Publish(this);
121 if (!ret) {
122 INTELL_VOICE_LOG_ERROR("publish failed!");
123 UnloadIntellVoiceHost();
124 return;
125 }
126 CreateSystemEventObserver();
127 AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
128 AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
129 AddSystemAbilityListener(TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID);
130 AddSystemAbilityListener(AUDIO_DISTRIBUTED_SERVICE_ID);
131 AddSystemAbilityListener(AUDIO_POLICY_SERVICE_ID);
132 AddSystemAbilityListener(POWER_MANAGER_SERVICE_ID);
133 RegisterPermissionCallback(OHOS_PERMISSION_INTELL_VOICE);
134 INTELL_VOICE_LOG_INFO("publish ok");
135 }
136
OnStop(void)137 void IntellVoiceService::OnStop(void)
138 {
139 INTELL_VOICE_LOG_INFO("enter");
140
141 const auto &manager = IntellVoiceServiceManager::GetInstance();
142 if (manager != nullptr) {
143 manager->HandleServiceStop();
144 manager->StopThread();
145 manager->ReleaseSwitchProvider();
146 }
147
148 auto triggerMgr = IntellVoiceTrigger::TriggerManager::GetInstance();
149 if (triggerMgr != nullptr) {
150 #ifdef SUPPORT_TELEPHONY_SERVICE
151 triggerMgr->DetachTelephonyObserver();
152 #endif
153 triggerMgr->DetachAudioCaptureListener();
154 triggerMgr->DetachAudioRendererEventListener();
155 triggerMgr->DetachHibernateObserver();
156 }
157
158 if (systemEventObserver_ != nullptr) {
159 systemEventObserver_->Unsubscribe();
160 }
161
162 UnloadIntellVoiceHost();
163 }
164
OnIdle(const SystemAbilityOnDemandReason & idleReason)165 int32_t IntellVoiceService::OnIdle(const SystemAbilityOnDemandReason &idleReason)
166 {
167 INTELL_VOICE_LOG_INFO("enter");
168 const auto &manager = IntellVoiceServiceManager::GetInstance();
169 if (manager == nullptr) {
170 INTELL_VOICE_LOG_ERROR("manager is nullptr");
171 return 0;
172 }
173
174 if (!manager->HandleOnIdle()) {
175 INTELL_VOICE_LOG_INFO("reject to unload service");
176 return -1;
177 }
178
179 return 0;
180 }
181
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)182 void IntellVoiceService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
183 {
184 INTELL_VOICE_LOG_INFO("add systemAbilityId:%{public}d", systemAbilityId);
185 auto iter = systemAbilityChangeMap_.find(systemAbilityId);
186 if (iter == systemAbilityChangeMap_.end()) {
187 INTELL_VOICE_LOG_WARN("unhandled sysabilityId");
188 return;
189 }
190
191 if (iter->second == nullptr) {
192 INTELL_VOICE_LOG_WARN("func is nullptr");
193 return;
194 }
195
196 iter->second(true);
197 }
198
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)199 void IntellVoiceService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
200 {}
201
CreateSystemEventObserver()202 void IntellVoiceService::CreateSystemEventObserver()
203 {
204 std::shared_ptr<EventRunner> runner = EventRunner::Create("service");
205 if (runner == nullptr) {
206 INTELL_VOICE_LOG_ERROR("runner is null");
207 return;
208 }
209
210 std::shared_ptr<EventHandler> handler = std::make_shared<EventHandler>(runner);
211 if (handler == nullptr) {
212 INTELL_VOICE_LOG_ERROR("handler is null");
213 return;
214 }
215
216 OHOS::EventFwk::MatchingSkills matchingSkills;
217 matchingSkills.AddEvent(OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
218 matchingSkills.AddEvent(OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF);
219 matchingSkills.AddEvent(OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_DATA_CLEARED);
220 matchingSkills.AddEvent(OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REPLACED);
221 matchingSkills.AddEvent(OHOS::EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
222 OHOS::EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
223 systemEventObserver_ = SystemEventObserver::Create(subscribeInfo);
224 if (systemEventObserver_ == nullptr) {
225 INTELL_VOICE_LOG_ERROR("systemEventObserver_ is nullptr");
226 return;
227 }
228 systemEventObserver_->SetEventHandler(handler);
229 INTELL_VOICE_LOG_INFO("create system event observer successfully");
230 }
231
LoadIntellVoiceHost()232 void IntellVoiceService::LoadIntellVoiceHost()
233 {
234 auto devmgr = IDeviceManager::Get();
235 if (devmgr == nullptr) {
236 INTELL_VOICE_LOG_ERROR("Get devmgr failed");
237 return;
238 }
239 INTELL_VOICE_LOG_INFO("Get devmgr success");
240 devmgr->UnloadDevice("intell_voice_engine_manager_service");
241 devmgr->LoadDevice("intell_voice_engine_manager_service");
242
243 if (!EngineHostManager::GetInstance().Init()) {
244 INTELL_VOICE_LOG_ERROR("init engine host failed");
245 return;
246 }
247
248 EngineHostManager::GetInstance().RegisterEngineHDIDeathRecipient();
249 EngineHostManager::GetInstance().SetDataOprCallback();
250 }
251
UnloadIntellVoiceHost()252 void IntellVoiceService::UnloadIntellVoiceHost()
253 {
254 auto devmgr = IDeviceManager::Get();
255 if (devmgr != nullptr) {
256 INTELL_VOICE_LOG_INFO("Get devmgr success");
257 EngineHostManager::GetInstance().DeregisterEngineHDIDeathRecipient();
258 devmgr->UnloadDevice("intell_voice_engine_manager_service");
259 } else {
260 INTELL_VOICE_LOG_ERROR("Get devmgr failed");
261 }
262 }
263
RegisterPermissionCallback(const std::string & permissionName)264 void IntellVoiceService::RegisterPermissionCallback(const std::string &permissionName)
265 {
266 INTELL_VOICE_LOG_INFO("enter");
267 Security::AccessToken::PermStateChangeScope scopeInfo;
268 scopeInfo.permList = {permissionName};
269 auto callbackPtr = std::make_shared<PerStateChangeCbCustomizeCallback>(scopeInfo);
270 int32_t res = Security::AccessToken::AccessTokenKit::RegisterPermStateChangeCallback(callbackPtr);
271 if (res < 0) {
272 INTELL_VOICE_LOG_ERROR("fail to call RegisterPermStateChangeCallback.");
273 }
274 }
275
PermStateChangeCallback(Security::AccessToken::PermStateChangeInfo & result)276 void IntellVoiceService::PerStateChangeCbCustomizeCallback::PermStateChangeCallback(
277 Security::AccessToken::PermStateChangeInfo &result)
278 {
279 INTELL_VOICE_LOG_INFO("enter, permStateChangeType: %{public}d", result.permStateChangeType);
280 if (result.permStateChangeType == 0) {
281 INTELL_VOICE_LOG_ERROR("The permission is canceled.");
282 }
283 }
284
OnCommonEventServiceChange(bool isAdded)285 void IntellVoiceService::OnCommonEventServiceChange(bool isAdded)
286 {
287 if (isAdded) {
288 INTELL_VOICE_LOG_INFO("comment event service is added");
289 if (systemEventObserver_ != nullptr) {
290 systemEventObserver_->Subscribe();
291 }
292 } else {
293 INTELL_VOICE_LOG_INFO("comment event service is removed");
294 }
295 }
296
OnDistributedKvDataServiceChange(bool isAdded)297 void IntellVoiceService::OnDistributedKvDataServiceChange(bool isAdded)
298 {
299 if (isAdded) {
300 INTELL_VOICE_LOG_INFO("distributed kv data service is added");
301 const auto &manager = IntellVoiceServiceManager::GetInstance();
302 if (manager == nullptr) {
303 INTELL_VOICE_LOG_INFO("manager is nullptr");
304 return;
305 }
306 manager->CreateSwitchProvider();
307 manager->ProcBreathModel();
308 manager->HandleSilenceUpdate();
309
310 if (reasonId_ == static_cast<int32_t>(OHOS::OnDemandReasonId::COMMON_EVENT)) {
311 INTELL_VOICE_LOG_INFO("power on start");
312 manager->HandleSwitchOn(true, VOICE_WAKEUP_MODEL_UUID, false);
313 manager->HandleSwitchOn(true, PROXIMAL_WAKEUP_MODEL_UUID, false);
314 manager->HandleUnloadIntellVoiceService(true);
315 } else if (reasonId_ == static_cast<int32_t>(OHOS::OnDemandReasonId::INTERFACE_CALL)) {
316 INTELL_VOICE_LOG_INFO("interface call start");
317 manager->HandleSwitchOn(true, VOICE_WAKEUP_MODEL_UUID, false);
318 manager->HandleSwitchOn(true, PROXIMAL_WAKEUP_MODEL_UUID, false);
319 } else {
320 INTELL_VOICE_LOG_INFO("no need to process, reason id:%{public}d", reasonId_);
321 }
322 reasonId_ = -1;
323 } else {
324 INTELL_VOICE_LOG_INFO("distributed kv data service is removed");
325 }
326 }
327
328 #ifdef SUPPORT_TELEPHONY_SERVICE
OnTelephonyStateRegistryServiceChange(bool isAdded)329 void IntellVoiceService::OnTelephonyStateRegistryServiceChange(bool isAdded)
330 {
331 if (isAdded) {
332 INTELL_VOICE_LOG_INFO("telephony state registry service is added");
333 auto triggerMgr = IntellVoiceTrigger::TriggerManager::GetInstance();
334 if (triggerMgr != nullptr) {
335 triggerMgr->AttachTelephonyObserver();
336 }
337 } else {
338 INTELL_VOICE_LOG_INFO("telephony state registry service is removed");
339 }
340 }
341 #endif
342
OnAudioDistributedServiceChange(bool isAdded)343 void IntellVoiceService::OnAudioDistributedServiceChange(bool isAdded)
344 {
345 if (isAdded) {
346 INTELL_VOICE_LOG_INFO("audio distributed service is added");
347 auto triggerMgr = IntellVoiceTrigger::TriggerManager::GetInstance();
348 if (triggerMgr != nullptr) {
349 triggerMgr->AttachAudioCaptureListener();
350 }
351 } else {
352 INTELL_VOICE_LOG_INFO("audio distributed service is removed");
353 }
354 }
355
OnAudioPolicyServiceChange(bool isAdded)356 void IntellVoiceService::OnAudioPolicyServiceChange(bool isAdded)
357 {
358 if (isAdded) {
359 INTELL_VOICE_LOG_INFO("audio policy service is added");
360 auto triggerMgr = IntellVoiceTrigger::TriggerManager::GetInstance();
361 if (triggerMgr != nullptr) {
362 triggerMgr->AttachAudioRendererEventListener();
363 }
364 } else {
365 INTELL_VOICE_LOG_INFO("audio policy service is removed");
366 }
367 }
368
OnPowerManagerServiceChange(bool isAdded)369 void IntellVoiceService::OnPowerManagerServiceChange(bool isAdded)
370 {
371 if (isAdded) {
372 INTELL_VOICE_LOG_INFO("power manager service is added");
373 auto triggerMgr = IntellVoiceTrigger::TriggerManager::GetInstance();
374 if (triggerMgr != nullptr) {
375 triggerMgr->AttachHibernateObserver();
376 }
377 } else {
378 INTELL_VOICE_LOG_INFO("power manager service is removed");
379 }
380 }
381
RegisterDeathRecipient(IntellVoiceEngineType type,const sptr<IRemoteObject> & object)382 bool IntellVoiceService::RegisterDeathRecipient(IntellVoiceEngineType type, const sptr<IRemoteObject> &object)
383 {
384 if (object == nullptr) {
385 INTELL_VOICE_LOG_ERROR("object is nullptr");
386 return false;
387 }
388
389 if ((type < INTELL_VOICE_ENROLL) || (type > INTELL_VOICE_WAKEUP)) {
390 INTELL_VOICE_LOG_ERROR("invalid type:%{public}d", type);
391 return false;
392 }
393
394 const auto &manager = IntellVoiceServiceManager::GetInstance();
395 if (manager == nullptr) {
396 INTELL_VOICE_LOG_ERROR("manager is nullptr");
397 return false;
398 }
399 return manager->RegisterProxyDeathRecipient(type, object);
400 }
401
DeregisterDeathRecipient(IntellVoiceEngineType type)402 bool IntellVoiceService::DeregisterDeathRecipient(IntellVoiceEngineType type)
403 {
404 if ((type < INTELL_VOICE_ENROLL) || (type > INTELL_VOICE_WAKEUP)) {
405 INTELL_VOICE_LOG_ERROR("invalid type:%{public}d", type);
406 return false;
407 }
408
409 const auto &manager = IntellVoiceServiceManager::GetInstance();
410 if (manager == nullptr) {
411 INTELL_VOICE_LOG_INFO("manager is nullptr");
412 return false;
413 }
414 return manager->DeregisterProxyDeathRecipient(type);
415 }
416
GetUploadFiles(int numMax,std::vector<UploadHdiFile> & files)417 int32_t IntellVoiceService::GetUploadFiles(int numMax, std::vector<UploadHdiFile> &files)
418 {
419 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
420 INTELL_VOICE_LOG_WARN("verify permission denied");
421 return -1;
422 }
423
424 INTELL_VOICE_LOG_INFO("get upload files enter, numMax: %{public}d", numMax);
425 return EngineHostManager::GetInstance().GetUploadFiles(numMax, files);
426 }
427
GetParameter(const std::string & key)428 std::string IntellVoiceService::GetParameter(const std::string &key)
429 {
430 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
431 INTELL_VOICE_LOG_WARN("verify permission denied");
432 return "";
433 }
434
435 const auto &manager = IntellVoiceServiceManager::GetInstance();
436 if (manager == nullptr) {
437 INTELL_VOICE_LOG_INFO("manager is nullptr");
438 return "";
439 }
440 return manager->GetParameter(key);
441 }
442
SetParameter(const std::string & keyValueList)443 int32_t IntellVoiceService::SetParameter(const std::string &keyValueList)
444 {
445 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
446 INTELL_VOICE_LOG_WARN("verify permission denied");
447 return -1;
448 }
449
450 const auto &manager = IntellVoiceServiceManager::GetInstance();
451 if (manager == nullptr) {
452 INTELL_VOICE_LOG_INFO("manager is nullptr");
453 return -1;
454 }
455 return manager->SetParameter(keyValueList);
456 }
457
GetWakeupSourceFilesList(std::vector<std::string> & cloneFiles)458 int32_t IntellVoiceService::GetWakeupSourceFilesList(std::vector<std::string>& cloneFiles)
459 {
460 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
461 INTELL_VOICE_LOG_WARN("verify permission");
462 return -1;
463 }
464
465 INTELL_VOICE_LOG_INFO("get clone file list");
466 std::unique_ptr<IntellVoiceServiceManager> &mgr = IntellVoiceServiceManager::GetInstance();
467 if (mgr == nullptr) {
468 INTELL_VOICE_LOG_ERROR("mgr is nullptr");
469 return -1;
470 }
471
472 return mgr->GetWakeupSourceFilesList(cloneFiles);
473 }
474
GetWakeupSourceFile(const std::string & filePath,std::vector<uint8_t> & buffer)475 int32_t IntellVoiceService::GetWakeupSourceFile(const std::string &filePath, std::vector<uint8_t> &buffer)
476 {
477 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
478 INTELL_VOICE_LOG_WARN("verify permission");
479 return -1;
480 }
481
482 INTELL_VOICE_LOG_INFO("get clone file");
483 std::unique_ptr<IntellVoiceServiceManager> &mgr = IntellVoiceServiceManager::GetInstance();
484 if (mgr == nullptr) {
485 INTELL_VOICE_LOG_ERROR("mgr is nullptr");
486 return -1;
487 }
488
489 return mgr->GetWakeupSourceFile(filePath, buffer);
490 }
491
SendWakeupFile(const std::string & filePath,const std::vector<uint8_t> & buffer)492 int32_t IntellVoiceService::SendWakeupFile(const std::string &filePath, const std::vector<uint8_t> &buffer)
493 {
494 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
495 INTELL_VOICE_LOG_WARN("verify permission");
496 return -1;
497 }
498
499 INTELL_VOICE_LOG_INFO("send clone file");
500 std::unique_ptr<IntellVoiceServiceManager> &mgr = IntellVoiceServiceManager::GetInstance();
501 if (mgr == nullptr) {
502 INTELL_VOICE_LOG_ERROR("mgr is nullptr");
503 return -1;
504 }
505
506 return mgr->SendWakeupFile(filePath, buffer);
507 }
508
EnrollWithWakeupFilesForResult(const std::string & wakeupInfo,const sptr<IRemoteObject> object)509 int32_t IntellVoiceService::EnrollWithWakeupFilesForResult(const std::string &wakeupInfo,
510 const sptr<IRemoteObject> object)
511 {
512 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
513 INTELL_VOICE_LOG_WARN("verify permission");
514 return -1;
515 }
516
517 INTELL_VOICE_LOG_INFO("enter");
518 if (object == nullptr) {
519 INTELL_VOICE_LOG_ERROR("object is nullptr");
520 return -1;
521 }
522
523 auto &mgr = IntellVoiceServiceManager::GetInstance();
524 if (mgr == nullptr) {
525 INTELL_VOICE_LOG_ERROR("mgr is nullptr");
526 return -1;
527 }
528
529 return mgr->HandleCloneUpdate(wakeupInfo, object);
530 }
531
ClearUserData()532 int32_t IntellVoiceService::ClearUserData()
533 {
534 if (!IntellVoiceUtil::VerifySystemPermission(OHOS_PERMISSION_INTELL_VOICE)) {
535 INTELL_VOICE_LOG_WARN("verify permission");
536 return -1;
537 }
538
539 auto &mgr = IntellVoiceServiceManager::GetInstance();
540 if (mgr == nullptr) {
541 INTELL_VOICE_LOG_ERROR("mgr is nullptr");
542 return -1;
543 }
544
545 return mgr->ClearUserData();
546 }
547 } // namespace IntellVoiceEngine
548 } // namespace OHOS
549