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 "multimodal_input_connect_manager.h"
17
18 #include <chrono>
19 #include <thread>
20
21 #include "iservice_registry.h"
22 #include "system_ability_definition.h"
23
24 #include "mmi_log.h"
25 #include "multimodal_input_connect_death_recipient.h"
26 #include "multimodal_input_connect_define.h"
27 #include "util.h"
28
29 namespace OHOS {
30 namespace MMI {
31 namespace {
32 std::shared_ptr<MultimodalInputConnectManager> g_instance = nullptr;
33 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "MultimodalInputConnectManager"};
34 } // namespace
35
GetInstance()36 std::shared_ptr<MultimodalInputConnectManager> MultimodalInputConnectManager::GetInstance()
37 {
38 static std::once_flag flag;
39 std::call_once(flag, [&]() {
40 g_instance.reset(new (std::nothrow) MultimodalInputConnectManager());
41 });
42
43 CHKPP(g_instance);
44 if (g_instance != nullptr) {
45 g_instance->ConnectMultimodalInputService();
46 }
47 return g_instance;
48 }
49
AllocSocketPair(const int32_t moduleType)50 int32_t MultimodalInputConnectManager::AllocSocketPair(const int32_t moduleType)
51 {
52 CALL_DEBUG_ENTER;
53 std::lock_guard<std::mutex> guard(lock_);
54 if (multimodalInputConnectService_ == nullptr) {
55 MMI_HILOGE("Client has not connect server");
56 return RET_ERR;
57 }
58
59 const std::string programName(GetProgramName());
60 int32_t result = multimodalInputConnectService_->AllocSocketFd(programName, moduleType, socketFd_, tokenType_);
61 if (result != RET_OK) {
62 MMI_HILOGE("AllocSocketFd has error:%{public}d", result);
63 return RET_ERR;
64 }
65
66 MMI_HILOGI("AllocSocketPair success. socketFd_:%{public}d tokenType_:%{public}d", socketFd_, tokenType_);
67 return RET_OK;
68 }
69
GetClientSocketFdOfAllocedSocketPair() const70 int32_t MultimodalInputConnectManager::GetClientSocketFdOfAllocedSocketPair() const
71 {
72 CALL_DEBUG_ENTER;
73 return socketFd_;
74 }
75
AddInputEventFilter(sptr<IEventFilter> filter)76 int32_t MultimodalInputConnectManager::AddInputEventFilter(sptr<IEventFilter> filter)
77 {
78 std::lock_guard<std::mutex> guard(lock_);
79 if (multimodalInputConnectService_ == nullptr) {
80 MMI_HILOGE("The multimodalInputConnectService_ is nullptr");
81 return RET_ERR;
82 }
83 return multimodalInputConnectService_->AddInputEventFilter(filter);
84 }
85
SetPointerVisible(bool visible)86 int32_t MultimodalInputConnectManager::SetPointerVisible(bool visible)
87 {
88 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
89 return multimodalInputConnectService_->SetPointerVisible(visible);
90 }
91
IsPointerVisible(bool & visible)92 int32_t MultimodalInputConnectManager::IsPointerVisible(bool &visible)
93 {
94 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
95 return multimodalInputConnectService_->IsPointerVisible(visible);
96 }
97
SetPointerSpeed(int32_t speed)98 int32_t MultimodalInputConnectManager::SetPointerSpeed(int32_t speed)
99 {
100 CHKPR(multimodalInputConnectService_, RET_ERR);
101 return multimodalInputConnectService_->SetPointerSpeed(speed);
102 }
103
GetPointerSpeed(int32_t & speed)104 int32_t MultimodalInputConnectManager::GetPointerSpeed(int32_t &speed)
105 {
106 CHKPR(multimodalInputConnectService_, RET_ERR);
107 return multimodalInputConnectService_->GetPointerSpeed(speed);
108 }
109
SetPointerStyle(int32_t windowId,int32_t pointerStyle)110 int32_t MultimodalInputConnectManager::SetPointerStyle(int32_t windowId, int32_t pointerStyle)
111 {
112 CHKPR(multimodalInputConnectService_, RET_ERR);
113 return multimodalInputConnectService_->SetPointerStyle(windowId, pointerStyle);
114 }
115
GetPointerStyle(int32_t windowId,int32_t & pointerStyle)116 int32_t MultimodalInputConnectManager::GetPointerStyle(int32_t windowId, int32_t &pointerStyle)
117 {
118 CHKPR(multimodalInputConnectService_, RET_ERR);
119 return multimodalInputConnectService_->GetPointerStyle(windowId, pointerStyle);
120 }
121
RegisterDevListener()122 int32_t MultimodalInputConnectManager::RegisterDevListener()
123 {
124 CHKPR(multimodalInputConnectService_, RET_ERR);
125 return multimodalInputConnectService_->RegisterDevListener();
126 }
127
UnregisterDevListener()128 int32_t MultimodalInputConnectManager::UnregisterDevListener()
129 {
130 CHKPR(multimodalInputConnectService_, RET_ERR);
131 return multimodalInputConnectService_->UnregisterDevListener();
132 }
133
SupportKeys(int32_t userData,int32_t deviceId,std::vector<int32_t> & keys)134 int32_t MultimodalInputConnectManager::SupportKeys(int32_t userData, int32_t deviceId, std::vector<int32_t> &keys)
135 {
136 CHKPR(multimodalInputConnectService_, RET_ERR);
137 return multimodalInputConnectService_->SupportKeys(userData, deviceId, keys);
138 }
139
GetDeviceIds(int32_t userData)140 int32_t MultimodalInputConnectManager::GetDeviceIds(int32_t userData)
141 {
142 CHKPR(multimodalInputConnectService_, RET_ERR);
143 return multimodalInputConnectService_->GetDeviceIds(userData);
144 }
145
GetDevice(int32_t userData,int32_t id)146 int32_t MultimodalInputConnectManager::GetDevice(int32_t userData, int32_t id)
147 {
148 CHKPR(multimodalInputConnectService_, RET_ERR);
149 return multimodalInputConnectService_->GetDevice(userData, id);
150 }
151
GetKeyboardType(int32_t userData,int32_t deviceId)152 int32_t MultimodalInputConnectManager::GetKeyboardType(int32_t userData, int32_t deviceId)
153 {
154 CHKPR(multimodalInputConnectService_, RET_ERR);
155 return multimodalInputConnectService_->GetKeyboardType(userData, deviceId);
156 }
157
AddInputHandler(InputHandlerType handlerType,HandleEventType eventType)158 int32_t MultimodalInputConnectManager::AddInputHandler(InputHandlerType handlerType, HandleEventType eventType)
159 {
160 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
161 return multimodalInputConnectService_->AddInputHandler(handlerType, eventType);
162 }
163
RemoveInputHandler(InputHandlerType handlerType,HandleEventType eventType)164 int32_t MultimodalInputConnectManager::RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType)
165 {
166 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
167 return multimodalInputConnectService_->RemoveInputHandler(handlerType, eventType);
168 }
169
MarkEventConsumed(int32_t eventId)170 int32_t MultimodalInputConnectManager::MarkEventConsumed(int32_t eventId)
171 {
172 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
173 return multimodalInputConnectService_->MarkEventConsumed(eventId);
174 }
175
SubscribeKeyEvent(int32_t subscribeId,const std::shared_ptr<KeyOption> option)176 int32_t MultimodalInputConnectManager::SubscribeKeyEvent(int32_t subscribeId, const std::shared_ptr<KeyOption> option)
177 {
178 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
179 return multimodalInputConnectService_->SubscribeKeyEvent(subscribeId, option);
180 }
181
UnsubscribeKeyEvent(int32_t subscribeId)182 int32_t MultimodalInputConnectManager::UnsubscribeKeyEvent(int32_t subscribeId)
183 {
184 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
185 return multimodalInputConnectService_->UnsubscribeKeyEvent(subscribeId);
186 }
187
MoveMouseEvent(int32_t offsetX,int32_t offsetY)188 int32_t MultimodalInputConnectManager::MoveMouseEvent(int32_t offsetX, int32_t offsetY)
189 {
190 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
191 return multimodalInputConnectService_->MoveMouseEvent(offsetX, offsetY);
192 }
193
InjectKeyEvent(const std::shared_ptr<KeyEvent> event)194 int32_t MultimodalInputConnectManager::InjectKeyEvent(const std::shared_ptr<KeyEvent> event)
195 {
196 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
197 return multimodalInputConnectService_->InjectKeyEvent(event);
198 }
199
InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)200 int32_t MultimodalInputConnectManager::InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)
201 {
202 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
203 return multimodalInputConnectService_->InjectPointerEvent(pointerEvent);
204 }
205
SetAnrObserver()206 int32_t MultimodalInputConnectManager::SetAnrObserver()
207 {
208 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
209 return multimodalInputConnectService_->SetAnrObserver();
210 }
211
RegisterCooperateListener()212 int32_t MultimodalInputConnectManager::RegisterCooperateListener()
213 {
214 CHKPR(multimodalInputConnectService_, RET_ERR);
215 return multimodalInputConnectService_->RegisterCooperateListener();
216 }
217
UnregisterCooperateListener()218 int32_t MultimodalInputConnectManager::UnregisterCooperateListener()
219 {
220 CHKPR(multimodalInputConnectService_, RET_ERR);
221 return multimodalInputConnectService_->UnregisterCooperateListener();
222 }
223
EnableInputDeviceCooperate(int32_t userData,bool enabled)224 int32_t MultimodalInputConnectManager::EnableInputDeviceCooperate(int32_t userData, bool enabled)
225 {
226 CHKPR(multimodalInputConnectService_, RET_ERR);
227 return multimodalInputConnectService_->EnableInputDeviceCooperate(userData, enabled);
228 }
229
StartInputDeviceCooperate(int32_t userData,const std::string & sinkDeviceId,int32_t srcInputDeviceId)230 int32_t MultimodalInputConnectManager::StartInputDeviceCooperate(int32_t userData,
231 const std::string &sinkDeviceId, int32_t srcInputDeviceId)
232 {
233 CHKPR(multimodalInputConnectService_, RET_ERR);
234 return multimodalInputConnectService_->StartInputDeviceCooperate(userData, sinkDeviceId, srcInputDeviceId);
235 }
236
StopDeviceCooperate(int32_t userData)237 int32_t MultimodalInputConnectManager::StopDeviceCooperate(int32_t userData)
238 {
239 CHKPR(multimodalInputConnectService_, RET_ERR);
240 return multimodalInputConnectService_->StopDeviceCooperate(userData);
241 }
242
GetInputDeviceCooperateState(int32_t userData,const std::string & deviceId)243 int32_t MultimodalInputConnectManager::GetInputDeviceCooperateState(int32_t userData, const std::string &deviceId)
244 {
245 CHKPR(multimodalInputConnectService_, RET_ERR);
246 return multimodalInputConnectService_->GetInputDeviceCooperateState(userData, deviceId);
247 }
248
SetInputDevice(const std::string & dhid,const std::string & screenId)249 int32_t MultimodalInputConnectManager::SetInputDevice(const std::string& dhid, const std::string& screenId)
250 {
251 CHKPR(multimodalInputConnectService_, RET_ERR);
252 return multimodalInputConnectService_->SetInputDevice(dhid, screenId);
253 }
254
GetFunctionKeyState(int32_t funcKey,bool & state)255 int32_t MultimodalInputConnectManager::GetFunctionKeyState(int32_t funcKey, bool &state)
256 {
257 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
258 return multimodalInputConnectService_->GetFunctionKeyState(funcKey, state);
259 }
260
SetFunctionKeyState(int32_t funcKey,bool enable)261 int32_t MultimodalInputConnectManager::SetFunctionKeyState(int32_t funcKey, bool enable)
262 {
263 CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID);
264 return multimodalInputConnectService_->SetFunctionKeyState(funcKey, enable);
265 }
266
ConnectMultimodalInputService()267 bool MultimodalInputConnectManager::ConnectMultimodalInputService()
268 {
269 CALL_DEBUG_ENTER;
270 std::lock_guard<std::mutex> guard(lock_);
271 if (multimodalInputConnectService_ != nullptr) {
272 return true;
273 }
274 auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
275 if (sm == nullptr) {
276 MMI_HILOGE("Get system ability manager failed");
277 return false;
278 }
279 auto sa = sm->GetSystemAbility(IMultimodalInputConnect::MULTIMODAL_INPUT_CONNECT_SERVICE_ID);
280 if (sa == nullptr) {
281 MMI_HILOGE("Get sa failed");
282 return false;
283 }
284
285 std::weak_ptr<MultimodalInputConnectManager> weakPtr = shared_from_this();
286 auto deathCallback = [weakPtr](const wptr<IRemoteObject> &object) {
287 auto sharedPtr = weakPtr.lock();
288 if (sharedPtr != nullptr) {
289 sharedPtr->OnDeath();
290 }
291 };
292
293 multimodalInputConnectRecipient_ = new (std::nothrow) MultimodalInputConnectDeathRecipient(deathCallback);
294 CHKPF(multimodalInputConnectRecipient_);
295 sa->AddDeathRecipient(multimodalInputConnectRecipient_);
296 multimodalInputConnectService_ = iface_cast<IMultimodalInputConnect>(sa);
297 if (multimodalInputConnectService_ == nullptr) {
298 MMI_HILOGE("Get multimodalinput service failed");
299 return false;
300 }
301 MMI_HILOGI("Get multimodalinput service successful");
302 return true;
303 }
304
OnDeath()305 void MultimodalInputConnectManager::OnDeath()
306 {
307 CALL_DEBUG_ENTER;
308 Clean();
309 NotifyDeath();
310 }
311
Clean()312 void MultimodalInputConnectManager::Clean()
313 {
314 CALL_DEBUG_ENTER;
315 std::lock_guard<std::mutex> guard(lock_);
316 if (multimodalInputConnectService_ != nullptr) {
317 multimodalInputConnectService_.clear();
318 multimodalInputConnectService_ = nullptr;
319 }
320
321 if (multimodalInputConnectRecipient_ != nullptr) {
322 multimodalInputConnectRecipient_.clear();
323 multimodalInputConnectRecipient_ = nullptr;
324 }
325 }
326
NotifyDeath()327 void MultimodalInputConnectManager::NotifyDeath()
328 {
329 CALL_DEBUG_ENTER;
330
331 int32_t retryCount = 50;
332 do {
333 std::this_thread::sleep_for(std::chrono::seconds(1));
334 if (ConnectMultimodalInputService()) {
335 MMI_HILOGD("Connect multimodalinput service successful");
336 return;
337 }
338 } while (--retryCount > 0);
339 }
340 } // namespace MMI
341 } // namespace OHOS
342