• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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