1 /*
2 * Copyright (C) 2025-2025 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 // LCOV_EXCL_START
17 #include "magnification_window_proxy.h"
18 #include <dlfcn.h>
19 #include <shared_mutex>
20 #include "ffrt.h"
21
22 namespace OHOS {
23 namespace Accessibility {
24 namespace {
25 const std::string windowLibName_ = "libaams_ext.z.so";
26 std::shared_ptr<MagnificationWindowProxy> g_Instance = nullptr;
27 ffrt::shared_mutex rwLock;
28 }
29
GetInstance()30 std::shared_ptr<MagnificationWindowProxy> MagnificationWindowProxy::GetInstance()
31 {
32 std::unique_lock<ffrt::shared_mutex> wLock(rwLock);
33 if (g_Instance == nullptr) {
34 g_Instance = std::make_shared<MagnificationWindowProxy>();
35 }
36 return g_Instance;
37 }
38
MagnificationWindowProxy()39 MagnificationWindowProxy::MagnificationWindowProxy()
40 {
41 handle_ = dlopen(windowLibName_.c_str(), RTLD_LAZY | RTLD_NOW);
42 if (!handle_) {
43 HILOG_ERROR("dlopen error: %{public}s", dlerror());
44 }
45 }
46
~MagnificationWindowProxy()47 MagnificationWindowProxy::~MagnificationWindowProxy()
48 {
49 std::unique_lock<ffrt::shared_mutex> wLock(rwLock);
50 if (!handle_) {
51 return;
52 }
53
54 int ret = dlclose(handle_);
55 HILOG_DEBUG("dlclose ret: %{public}d", ret);
56 char* error = dlerror();
57 if (error) {
58 HILOG_ERROR("dlclose error: %{public}s", error);
59 }
60 handle_ = nullptr;
61 }
62
GetFunc(const std::string & funcName)63 void* MagnificationWindowProxy::GetFunc(const std::string& funcName)
64 {
65 HILOG_DEBUG("Get func start, %{public}s", funcName.c_str());
66 void* func = dlsym(handle_, funcName.c_str());
67 char* error = dlerror();
68 if (error != nullptr) {
69 HILOG_ERROR(" %{public}s", error);
70 return nullptr;
71 }
72
73 HILOG_DEBUG("Get func end, %{public}s", funcName.c_str());
74 return func;
75 }
76
77 // common
EnableMagnification(uint32_t magnificationType,int32_t posX,int32_t posY)78 void MagnificationWindowProxy::EnableMagnification(uint32_t magnificationType, int32_t posX, int32_t posY)
79 {
80 if (!handle_) {
81 HILOG_ERROR("handle is null");
82 return;
83 }
84
85 using Enabel = void (*)(uint32_t magnificationType, int32_t posX, int32_t posY);
86 Enabel enabelFun = (Enabel)GetFunc("EnableMagnification");
87 if (!enabelFun) {
88 HILOG_ERROR("EnableMagnification func is null");
89 return;
90 }
91 enabelFun(magnificationType, posX, posY);
92 }
93
DisableMagnification(uint32_t magnificationType,bool needClear)94 void MagnificationWindowProxy::DisableMagnification(uint32_t magnificationType, bool needClear)
95 {
96 if (!handle_) {
97 HILOG_ERROR("handle is null");
98 return;
99 }
100
101 using Disable = void (*)(uint32_t magnificationType, bool needClear);
102 Disable disableFun = (Disable)GetFunc("DisableMagnification");
103 if (!disableFun) {
104 HILOG_ERROR("DisableMagnification func is null");
105 return;
106 }
107 disableFun(magnificationType, needClear);
108 }
109
SetScale(uint32_t magnificationType,float scaleSpan)110 void MagnificationWindowProxy::SetScale(uint32_t magnificationType, float scaleSpan)
111 {
112 if (!handle_) {
113 HILOG_ERROR("handle is null");
114 return;
115 }
116
117 using SetScale = void (*)(uint32_t magnificationType, float scaleSpan);
118 SetScale setScaleFun = (SetScale)GetFunc("SetScale");
119 if (!setScaleFun) {
120 HILOG_ERROR("SetScale func is null");
121 return;
122 }
123 setScaleFun(magnificationType, scaleSpan);
124 }
125
MoveMagnification(uint32_t magnificationType,int32_t deltaX,int32_t deltaY)126 void MagnificationWindowProxy::MoveMagnification(uint32_t magnificationType, int32_t deltaX, int32_t deltaY)
127 {
128 if (!handle_) {
129 HILOG_ERROR("handle is null");
130 return;
131 }
132
133 using MoveMagnification = void (*)(uint32_t magnificationType, int32_t deltaX, int32_t deltaY);
134 MoveMagnification moveFun = (MoveMagnification)GetFunc("MoveMagnification");
135 if (!moveFun) {
136 HILOG_ERROR("MoveMagnification func is null");
137 return;
138 }
139 moveFun(magnificationType, deltaX, deltaY);
140 }
141
GetSourceCenter()142 PointerPos MagnificationWindowProxy::GetSourceCenter()
143 {
144 PointerPos pos = {0, 0};
145 if (!handle_) {
146 HILOG_ERROR("handle is null");
147 return pos;
148 }
149
150 using GetSourceCenter = PointerPos (*)();
151 GetSourceCenter getSourceCenterFun = (GetSourceCenter)GetFunc("GetSourceCenter");
152 if (!getSourceCenterFun) {
153 HILOG_ERROR("GetSourceCenter func is null");
154 return pos;
155 }
156 return getSourceCenterFun();
157 }
158
FollowFocuseElement(uint32_t magnificationType,int32_t centerX,int32_t centerY)159 void MagnificationWindowProxy::FollowFocuseElement(uint32_t magnificationType, int32_t centerX, int32_t centerY)
160 {
161 if (!handle_) {
162 HILOG_ERROR("handle is null");
163 return;
164 }
165
166 using FollowFocuseElement = void (*)(uint32_t magnificationType, int32_t deltaX, int32_t deltaY);
167 FollowFocuseElement followFocuseElementFun = (FollowFocuseElement)GetFunc("FollowFocuseElement");
168 if (!followFocuseElementFun) {
169 HILOG_ERROR("FollowFocuseElement func is null");
170 return;
171 }
172 followFocuseElementFun(magnificationType, centerX, centerY);
173 }
174
InitMagnificationParam(float scale)175 void MagnificationWindowProxy::InitMagnificationParam(float scale)
176 {
177 if (!handle_) {
178 HILOG_ERROR("handle is null");
179 return;
180 }
181
182 using InitMagnificationParam = void (*)(float scale);
183 InitMagnificationParam initParamFun = (InitMagnificationParam)GetFunc("InitMagnificationParam");
184 if (!initParamFun) {
185 HILOG_ERROR("InitMagnificationParam func is null");
186 return;
187 }
188 initParamFun(scale);
189 }
190
GetScale()191 float MagnificationWindowProxy::GetScale()
192 {
193 if (!handle_) {
194 HILOG_ERROR("handle is null");
195 return DEFAULT_SCALE;
196 }
197
198 using GetScale = float (*)();
199 GetScale getScaleFun = (GetScale)GetFunc("GetScale");
200 if (!getScaleFun) {
201 HILOG_ERROR("GetScale func is null");
202 return DEFAULT_SCALE;
203 }
204 return getScaleFun();
205 }
206
ShowMagnification(uint32_t magnificationType)207 void MagnificationWindowProxy::ShowMagnification(uint32_t magnificationType)
208 {
209 if (!handle_) {
210 HILOG_ERROR("handle is null");
211 return;
212 }
213
214 using ShowMagnification = void (*)(uint32_t magnificationType);
215 ShowMagnification showFun = (ShowMagnification)GetFunc("ShowMagnification");
216 if (!showFun) {
217 HILOG_ERROR("ShowMagnification func is null");
218 return;
219 }
220 showFun(magnificationType);
221 }
222
RefreshWindowParam(uint32_t magnificationType,RotationType type)223 void MagnificationWindowProxy::RefreshWindowParam(uint32_t magnificationType, RotationType type)
224 {
225 if (!handle_) {
226 HILOG_ERROR("handle is null");
227 return;
228 }
229
230 using RefreshWindowParam = void (*)(uint32_t magnificationType, RotationType type);
231 RefreshWindowParam refreshWindowParamFun = (RefreshWindowParam)GetFunc("RefreshWindowParam");
232 if (!refreshWindowParamFun) {
233 HILOG_ERROR("RefreshWindowParam func is null");
234 return;
235 }
236 refreshWindowParamFun(magnificationType, type);
237 }
238
ConvertCoordinates(int32_t posX,int32_t posY)239 PointerPos MagnificationWindowProxy::ConvertCoordinates(int32_t posX, int32_t posY)
240 {
241 PointerPos pos = {posX, posY};
242 if (!handle_) {
243 HILOG_ERROR("handle is null");
244 return pos;
245 }
246
247 using ConvertCoordinates = PointerPos (*)(int32_t posX, int32_t posY);
248 ConvertCoordinates convertCoordinatesFun = (ConvertCoordinates)GetFunc("ConvertCoordinates");
249 if (!convertCoordinatesFun) {
250 HILOG_ERROR("ConvertCoordinates func is null");
251 return pos;
252 }
253 return convertCoordinatesFun(posX, posY);
254 }
255
IsMagnificationWindowShow(uint32_t magnificationType)256 bool MagnificationWindowProxy::IsMagnificationWindowShow(uint32_t magnificationType)
257 {
258 if (!handle_) {
259 HILOG_ERROR("handle is null");
260 return false;
261 }
262
263 using IsMagnificationWindowShow = bool (*)(uint32_t magnificationType);
264 IsMagnificationWindowShow isShowFun = (IsMagnificationWindowShow)GetFunc("IsMagnificationWindowShow");
265 if (!isShowFun) {
266 HILOG_ERROR("IsMagnificationWindowShow func is null");
267 return false;
268 }
269 return isShowFun(magnificationType);
270 }
271
272 // full magnification
ConvertGesture(uint32_t type,PointerPos coordinates)273 PointerPos MagnificationWindowProxy::ConvertGesture(uint32_t type, PointerPos coordinates)
274 {
275 if (!handle_) {
276 HILOG_ERROR("handle is null");
277 return coordinates;
278 }
279
280 using ConvertGesture = PointerPos (*)(uint32_t type, PointerPos coordinates);
281 ConvertGesture convertGestureFun = (ConvertGesture)GetFunc("ConvertGesture");
282 if (!convertGestureFun) {
283 HILOG_ERROR("ConvertGesture func is null");
284 return coordinates;
285 }
286 return convertGestureFun(type, coordinates);
287 }
288
CheckTapOnHotArea(int32_t posX,int32_t posY)289 uint32_t MagnificationWindowProxy::CheckTapOnHotArea(int32_t posX, int32_t posY)
290 {
291 if (!handle_) {
292 HILOG_ERROR("handle is null");
293 return INVALID_GESTURE_TYPE;
294 }
295
296 using CheckTapOnHotArea = uint32_t (*)(int32_t posX, int32_t posY);
297 CheckTapOnHotArea checkTapOnHotAreaFun = (CheckTapOnHotArea)GetFunc("CheckTapOnHotArea");
298 if (!checkTapOnHotAreaFun) {
299 HILOG_ERROR("CheckTapOnHotArea func is null");
300 return INVALID_GESTURE_TYPE;
301 }
302 return checkTapOnHotAreaFun(posX, posY);
303 }
304
305 // window magnification
IsTapOnHotArea(int32_t posX,int32_t posY)306 bool MagnificationWindowProxy::IsTapOnHotArea(int32_t posX, int32_t posY)
307 {
308 if (!handle_) {
309 HILOG_ERROR("handle is null");
310 return false;
311 }
312
313 using IsTapOnHotArea = bool (*)(int32_t posX, int32_t posY);
314 IsTapOnHotArea isTapOnHotAreaFun = (IsTapOnHotArea)GetFunc("IsTapOnHotArea");
315 if (!isTapOnHotAreaFun) {
316 HILOG_ERROR("IsTapOnHotArea func is null");
317 return false;
318 }
319 return isTapOnHotAreaFun(posX, posY);
320 }
321
IsTapOnMagnificationWindow(int32_t posX,int32_t posY)322 bool MagnificationWindowProxy::IsTapOnMagnificationWindow(int32_t posX, int32_t posY)
323 {
324 if (!handle_) {
325 HILOG_ERROR("handle is null");
326 return false;
327 }
328
329 using IsTapOnMagnificationWindow = bool (*)(int32_t posX, int32_t posY);
330 IsTapOnMagnificationWindow isTapOnMagnificationWindowFun =
331 (IsTapOnMagnificationWindow)GetFunc("IsTapOnMagnificationWindow");
332 if (!isTapOnMagnificationWindowFun) {
333 HILOG_ERROR("IsTapOnMagnificationWindow func is null");
334 return false;
335 }
336 return isTapOnMagnificationWindowFun(posX, posY);
337 }
338
FixSourceCenter(bool needFix)339 void MagnificationWindowProxy::FixSourceCenter(bool needFix)
340 {
341 if (!handle_) {
342 HILOG_ERROR("handle is null");
343 return;
344 }
345
346 using FixSourceCenter = void (*)(bool needFix);
347 FixSourceCenter fixSourceCenterFun = (FixSourceCenter)GetFunc("FixSourceCenter");
348 if (!fixSourceCenterFun) {
349 HILOG_ERROR("FixSourceCenter func is null");
350 return;
351 }
352 fixSourceCenterFun(needFix);
353 }
354
355 // menu
ShowMenuWindow(uint32_t mode)356 void MagnificationWindowProxy::ShowMenuWindow(uint32_t mode)
357 {
358 if (!handle_) {
359 HILOG_ERROR("handle is null");
360 return;
361 }
362
363 using ShowMenuWindow = void (*)(uint32_t mode);
364 ShowMenuWindow showMenuFun = (ShowMenuWindow)GetFunc("ShowMenuWindow");
365 if (!showMenuFun) {
366 HILOG_ERROR("ShowMenuWindow func is null");
367 return;
368 }
369 showMenuFun(mode);
370 }
371
DisableMenuWindow()372 void MagnificationWindowProxy::DisableMenuWindow()
373 {
374 if (!handle_) {
375 HILOG_ERROR("handle is null");
376 return;
377 }
378
379 using DisableMenuWindow = void (*)();
380 DisableMenuWindow disableMenuFun = (DisableMenuWindow)GetFunc("DisableMenuWindow");
381 if (!disableMenuFun) {
382 HILOG_ERROR("DisableMenuWindow func is null");
383 return;
384 }
385 disableMenuFun();
386 }
387
IsTapOnMenu(int32_t posX,int32_t posY)388 bool MagnificationWindowProxy::IsTapOnMenu(int32_t posX, int32_t posY)
389 {
390 if (!handle_) {
391 HILOG_ERROR("handle is null");
392 return false;
393 }
394
395 using IsTapOnMenu = bool (*)(int32_t posX, int32_t posY);
396 IsTapOnMenu isTapOnMenuFun = (IsTapOnMenu)GetFunc("IsTapOnMenu");
397 if (!isTapOnMenuFun) {
398 HILOG_ERROR("IsTapOnMenu func is null");
399 return false;
400 }
401 return isTapOnMenuFun(posX, posY);
402 }
403
MoveMenuWindow(int32_t deltaX,int32_t deltaY)404 void MagnificationWindowProxy::MoveMenuWindow(int32_t deltaX, int32_t deltaY)
405 {
406 if (!handle_) {
407 HILOG_ERROR("handle is null");
408 return;
409 }
410
411 using MoveMenuWindow = void (*)(int32_t deltaX, int32_t deltaY);
412 MoveMenuWindow moveMenuFun = (MoveMenuWindow)GetFunc("MoveMenuWindow");
413 if (!moveMenuFun) {
414 HILOG_ERROR("MoveMenuWindow func is null");
415 return;
416 }
417 moveMenuFun(deltaX, deltaY);
418 }
419
SetCurrentType(uint32_t type)420 void MagnificationWindowProxy::SetCurrentType(uint32_t type)
421 {
422 if (!handle_) {
423 HILOG_ERROR("handle is null");
424 return;
425 }
426
427 using SetCurrentType = void (*)(uint32_t type);
428 SetCurrentType setTypeFun = (SetCurrentType)GetFunc("SetCurrentType");
429 if (!setTypeFun) {
430 HILOG_ERROR("SetCurrentType func is null");
431 return;
432 }
433 setTypeFun(type);
434 }
435
AttachToEdge()436 void MagnificationWindowProxy::AttachToEdge()
437 {
438 if (!handle_) {
439 HILOG_ERROR("handle is null");
440 return;
441 }
442
443 using AttachToEdge = void (*)();
444 AttachToEdge attachToEdgeFun = (AttachToEdge)GetFunc("AttachToEdge");
445 if (!attachToEdgeFun) {
446 HILOG_ERROR("AttachToEdge func is null");
447 return;
448 }
449 attachToEdgeFun();
450 }
451
RefreshWindowParamMenu()452 void MagnificationWindowProxy::RefreshWindowParamMenu()
453 {
454 if (!handle_) {
455 HILOG_ERROR("handle is null");
456 return;
457 }
458
459 using RefreshWindowParamMenu = void (*)();
460 RefreshWindowParamMenu refreshMenuParamFun =
461 (RefreshWindowParamMenu)GetFunc("RefreshWindowParamMenu");
462 if (!refreshMenuParamFun) {
463 HILOG_ERROR("RefreshWindowParamMenu func is null");
464 return;
465 }
466 refreshMenuParamFun();
467 }
468
ChangeMode()469 uint32_t MagnificationWindowProxy::ChangeMode()
470 {
471 if (!handle_) {
472 HILOG_ERROR("handle is null");
473 return 0;
474 }
475
476 using ChangeMode = uint32_t (*)();
477 ChangeMode changeModeFun = (ChangeMode)GetFunc("ChangeMode");
478 if (!changeModeFun) {
479 HILOG_ERROR("ChangeMode func is null");
480 return 0;
481 }
482 return changeModeFun();
483 }
484
IsMenuShown()485 bool MagnificationWindowProxy::IsMenuShown()
486 {
487 if (!handle_) {
488 HILOG_ERROR("handle is null");
489 return false;
490 }
491
492 using IsMenuShown = bool (*)();
493 IsMenuShown isMenuShownFun = (IsMenuShown)GetFunc("IsMenuShown");
494 if (!isMenuShownFun) {
495 HILOG_ERROR("IsTapOnMenu func is null");
496 return false;
497 }
498 return isMenuShownFun();
499 }
500
PublishIgnoreRepeatClickReminder()501 int32_t MagnificationWindowProxy::PublishIgnoreRepeatClickReminder()
502 {
503 if (!handle_) {
504 HILOG_ERROR("handle is null");
505 return -1;
506 }
507
508 using PublishIgnoreRepeatClickReminderFunc = int32_t (*)();
509 PublishIgnoreRepeatClickReminderFunc func =
510 (PublishIgnoreRepeatClickReminderFunc)GetFunc("PublishIgnoreRepeatClickReminder");
511 if (!func) {
512 HILOG_ERROR("PublishIgnoreRepeatClickReminder func is null");
513 return -1;
514 }
515 return func();
516 }
517
CancelNotification()518 void MagnificationWindowProxy::CancelNotification()
519 {
520 if (!handle_) {
521 HILOG_ERROR("handle is null");
522 return;
523 }
524
525 using CancelNotificationFunc = void (*)();
526 CancelNotificationFunc func = (CancelNotificationFunc)GetFunc("CancelNotification");
527 if (!func) {
528 HILOG_ERROR("CancelNotification func is null");
529 return;
530 }
531 func();
532 }
533
RegisterTimers(uint64_t beginTime)534 int32_t MagnificationWindowProxy::RegisterTimers(uint64_t beginTime)
535 {
536 if (!handle_) {
537 HILOG_ERROR("handle is null");
538 return -1;
539 }
540
541 using RegisterTimersFunc = int32_t (*)(uint64_t beginTime);
542 RegisterTimersFunc func = (RegisterTimersFunc)GetFunc("RegisterTimers");
543 if (!func) {
544 HILOG_ERROR("RegisterTimers func is null");
545 return -1;
546 }
547 return func(beginTime);
548 }
DestoryTimers()549 void MagnificationWindowProxy::DestoryTimers()
550 {
551 if (!handle_) {
552 HILOG_ERROR("handle is null");
553 return;
554 }
555
556 using DestoryTimersFunc = void (*)();
557 DestoryTimersFunc func = (DestoryTimersFunc)GetFunc("DestoryTimers");
558 if (!func) {
559 HILOG_ERROR("DestoryTimers func is null");
560 return;
561 }
562 func();
563 }
GetWallTimeMs()564 int64_t MagnificationWindowProxy::GetWallTimeMs()
565 {
566 if (!handle_) {
567 HILOG_ERROR("handle is null");
568 return 0;
569 }
570
571 using GetWallTimeMsFunc = int64_t (*)();
572 GetWallTimeMsFunc func = (GetWallTimeMsFunc)GetFunc("GetWallTimeMs");
573 if (!func) {
574 HILOG_ERROR("GetWallTimeMs func is null");
575 return 0;
576 }
577 return func();
578 }
579 } // namespace Accessibility
580 } // namespace OHOS
581 // LCOV_EXCL_STOP