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