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 "trigger_host_manager.h"
16
17 #include "iproxy_broker.h"
18 #include "intell_voice_log.h"
19 #include "intell_voice_util.h"
20 #include "intell_voice_death_recipient.h"
21
22 #define LOG_TAG "TriggerHostManager"
23
24 using namespace OHOS::IntellVoiceUtils;
25
26 namespace OHOS {
27 namespace IntellVoiceTrigger {
TriggerHostManager()28 TriggerHostManager::TriggerHostManager()
29 {
30 }
31
~TriggerHostManager()32 TriggerHostManager::~TriggerHostManager()
33 {
34 adapter_ = nullptr;
35 adapterV1_1_ = nullptr;
36 }
37
Init()38 bool TriggerHostManager::Init()
39 {
40 if (triggerHostProxy_ != nullptr) {
41 INTELL_VOICE_LOG_INFO("already init");
42 return true;
43 }
44
45 triggerHostProxy_ = OHOS::HDI::IntelligentVoice::Trigger::V1_0::IIntellVoiceTriggerManager::Get();
46 if (triggerHostProxy_ == nullptr) {
47 INTELL_VOICE_LOG_WARN("can not get intell voice trigger manager");
48 return false;
49 }
50
51 uint32_t majorVer = 0;
52 uint32_t minorVer = 0;
53 triggerHostProxy_->GetVersion(majorVer, minorVer);
54
55 if (IntellVoiceUtil::GetHdiVersionId(majorVer, minorVer) == IntellVoiceUtil::GetHdiVersionId(1, 1)) {
56 INTELL_VOICE_LOG_INFO("version is 1.1");
57 auto castResult_V1_1 =
58 OHOS::HDI::IntelligentVoice::Trigger::V1_1::IIntellVoiceTriggerManager::CastFrom(triggerHostProxy_);
59 if (castResult_V1_1 != nullptr) {
60 triggerHostProxyV1_1_ = castResult_V1_1;
61 }
62 }
63
64 return true;
65 }
66
RegisterTriggerHDIDeathRecipient()67 bool TriggerHostManager::RegisterTriggerHDIDeathRecipient()
68 {
69 INTELL_VOICE_LOG_INFO("enter");
70 if (triggerHostProxy_ == nullptr) {
71 INTELL_VOICE_LOG_ERROR("trigger host proxy is nullptr");
72 return false;
73 }
74
75 sptr<IRemoteObject> object = OHOS::HDI::hdi_objcast<
76 OHOS::HDI::IntelligentVoice::Trigger::V1_0::IIntellVoiceTriggerManager>(triggerHostProxy_);
77 if (object == nullptr) {
78 INTELL_VOICE_LOG_ERROR("object is nullptr");
79 return false;
80 }
81
82 sptr<IntellVoiceDeathRecipient> recipient = new (std::nothrow) IntellVoiceDeathRecipient(
83 std::bind(&TriggerHostManager::OnTriggerHDIDiedCallback));
84 if (recipient == nullptr) {
85 INTELL_VOICE_LOG_ERROR("create death recipient failed");
86 return false;
87 }
88
89 return object->AddDeathRecipient(recipient);
90 }
91
LoadTriggerAdapter(const IntellVoiceTriggerAdapterDsecriptor & desc)92 bool TriggerHostManager::LoadTriggerAdapter(const IntellVoiceTriggerAdapterDsecriptor &desc)
93 {
94 if (triggerHostProxy_ == nullptr) {
95 INTELL_VOICE_LOG_ERROR("trigger proxy is nullptr");
96 return false;
97 }
98
99 if (triggerHostProxyV1_1_ != nullptr) {
100 triggerHostProxyV1_1_->LoadAdapter_V1_1(desc, adapterV1_1_);
101 if (adapterV1_1_ == nullptr) {
102 INTELL_VOICE_LOG_ERROR("load adapterV1_1_ failed");
103 return false;
104 }
105 adapter_ = adapterV1_1_;
106 return true;
107 }
108
109 triggerHostProxy_->LoadAdapter(desc, adapter_);
110 if (adapter_ == nullptr) {
111 INTELL_VOICE_LOG_ERROR("load adapter_ failed");
112 return false;
113 }
114 return true;
115 }
116
UnloadTriggerAdapter(const IntellVoiceTriggerAdapterDsecriptor & desc)117 void TriggerHostManager::UnloadTriggerAdapter(const IntellVoiceTriggerAdapterDsecriptor &desc)
118 {
119 if (triggerHostProxy_ != nullptr) {
120 triggerHostProxy_->UnloadAdapter(desc);
121 }
122 adapter_ = nullptr;
123 adapterV1_1_ = nullptr;
124 }
125
OnTriggerHDIDiedCallback()126 void TriggerHostManager::OnTriggerHDIDiedCallback()
127 {
128 INTELL_VOICE_LOG_INFO("receive trigger hdi death recipient, restart sa");
129 _Exit(0);
130 }
131 }
132 }
133