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