1 /*
2  * Copyright (c) 2024 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_ACCESSIBILITY_NATIVE_INTERFACE_ACCESSIBILITY_IMPL_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_ACCESSIBILITY_NATIVE_INTERFACE_ACCESSIBILITY_IMPL_H
18 
19 #include <list>
20 #include <map>
21 #include <mutex>
22 #include <string>
23 #include <unordered_set>
24 #include <vector>
25 
26 #include "interfaces/native/native_interface_accessibility.h"
27 
28 #include "base/utils/singleton.h"
29 
30 struct ArkUI_AccessibilityElementInfo {
31     explicit ArkUI_AccessibilityElementInfo();
SetPageIdArkUI_AccessibilityElementInfo32     void SetPageId(int32_t pageId)
33     {
34         this->pageId = pageId;
35     }
36 
GetPageIdArkUI_AccessibilityElementInfo37     int32_t GetPageId() const
38     {
39         return pageId;
40     }
41 
SetParentIdArkUI_AccessibilityElementInfo42     void SetParentId(int64_t parentId)
43     {
44         this->parentId = parentId;
45     }
46 
GetParentIdArkUI_AccessibilityElementInfo47     int64_t GetParentId() const
48     {
49         return parentId;
50     }
51 
GetElementIdArkUI_AccessibilityElementInfo52     int32_t GetElementId() const
53     {
54         return elementId;
55     }
56 
SetElementIdArkUI_AccessibilityElementInfo57     void SetElementId(int64_t elementId)
58     {
59         this->elementId = elementId;
60     }
61 
SetTextBeginSelectedArkUI_AccessibilityElementInfo62     void SetTextBeginSelected(int32_t textBeginSelected)
63     {
64         this->textBeginSelected = textBeginSelected;
65     }
66 
GetTextBeginSelectedArkUI_AccessibilityElementInfo67     int32_t GetTextBeginSelected() const
68     {
69         return textBeginSelected;
70     }
71 
SetTextEndSelectedArkUI_AccessibilityElementInfo72     void SetTextEndSelected(int32_t textEndSelected)
73     {
74         this->textEndSelected = textEndSelected;
75     }
76 
GetTextEndSelectedArkUI_AccessibilityElementInfo77     int32_t GetTextEndSelected() const
78     {
79         return textEndSelected;
80     }
81 
SetCurrentIndexArkUI_AccessibilityElementInfo82     void SetCurrentIndex(int32_t currentIndex)
83     {
84         this->currentIndex = currentIndex;
85     }
86 
GetCurrentIndexArkUI_AccessibilityElementInfo87     int32_t GetCurrentIndex() const
88     {
89         return currentIndex;
90     }
91 
SetBeginIndexArkUI_AccessibilityElementInfo92     void SetBeginIndex(int32_t beginIndex)
93     {
94         this->beginIndex = beginIndex;
95     }
96 
GetBeginIndexArkUI_AccessibilityElementInfo97     int32_t GetBeginIndex() const
98     {
99         return beginIndex;
100     }
101 
SetEndIndexArkUI_AccessibilityElementInfo102     void SetEndIndex(int32_t endIndex)
103     {
104         this->endIndex = endIndex;
105     }
106 
GetEndIndexArkUI_AccessibilityElementInfo107     int32_t GetEndIndex() const
108     {
109         return endIndex;
110     }
111 
SetItemCountArkUI_AccessibilityElementInfo112     void SetItemCount(int32_t itemCount)
113     {
114         this->itemCount = itemCount;
115     }
116 
GetItemCountArkUI_AccessibilityElementInfo117     int32_t GetItemCount() const
118     {
119         return itemCount;
120     }
121 
SetOffsetArkUI_AccessibilityElementInfo122     void SetOffset(int32_t offset)
123     {
124         this->offset = offset;
125     }
126 
GetOffsetArkUI_AccessibilityElementInfo127     int32_t GetOffset() const
128     {
129         return offset;
130     }
131 
SetZIndexArkUI_AccessibilityElementInfo132     void SetZIndex(int32_t zIndex)
133     {
134         this->zIndex = zIndex;
135     }
136 
GetZIndexArkUI_AccessibilityElementInfo137     int32_t GetZIndex() const
138     {
139         return zIndex;
140     }
141 
SetOpacityArkUI_AccessibilityElementInfo142     void SetOpacity(float opacity)
143     {
144         this->opacity = opacity;
145     }
146 
GetOpacityArkUI_AccessibilityElementInfo147     float GetOpacity() const
148     {
149         return opacity;
150     }
151 
SetCheckableArkUI_AccessibilityElementInfo152     void SetCheckable(bool checkable)
153     {
154         this->checkable = checkable;
155     }
156 
IsCheckableArkUI_AccessibilityElementInfo157     bool IsCheckable() const
158     {
159         return checkable;
160     }
161 
SetCheckedArkUI_AccessibilityElementInfo162     void SetChecked(bool checked)
163     {
164         this->checked = checked;
165     }
166 
IsCheckedArkUI_AccessibilityElementInfo167     bool IsChecked() const
168     {
169         return checked;
170     }
171 
SetFocusableArkUI_AccessibilityElementInfo172     void SetFocusable(bool focusable)
173     {
174         this->focusable = focusable;
175     }
176 
IsFocusableArkUI_AccessibilityElementInfo177     bool IsFocusable() const
178     {
179         return focusable;
180     }
181 
SetFocusedArkUI_AccessibilityElementInfo182     void SetFocused(bool focused)
183     {
184         this->focused = focused;
185     }
186 
IsFocusedArkUI_AccessibilityElementInfo187     bool IsFocused() const
188     {
189         return focused;
190     }
191 
SetVisibleArkUI_AccessibilityElementInfo192     void SetVisible(bool visible)
193     {
194         this->visible = visible;
195     }
196 
IsVisibleArkUI_AccessibilityElementInfo197     bool IsVisible() const
198     {
199         return visible;
200     }
201 
SetAccessibilityFocusedArkUI_AccessibilityElementInfo202     void SetAccessibilityFocused(bool accessibilityFocused)
203     {
204         this->accessibilityFocused = accessibilityFocused;
205     }
206 
IsAccessibilityFocusedArkUI_AccessibilityElementInfo207     bool IsAccessibilityFocused() const
208     {
209         return accessibilityFocused;
210     }
211 
SetSelectedArkUI_AccessibilityElementInfo212     void SetSelected(bool selected)
213     {
214         this->selected = selected;
215     }
216 
IsSelectedArkUI_AccessibilityElementInfo217     bool IsSelected() const
218     {
219         return selected;
220     }
221 
SetClickableArkUI_AccessibilityElementInfo222     void SetClickable(bool clickable)
223     {
224         this->clickable = clickable;
225     }
226 
IsClickableArkUI_AccessibilityElementInfo227     bool IsClickable() const
228     {
229         return clickable;
230     }
231 
SetLongClickableArkUI_AccessibilityElementInfo232     void SetLongClickable(bool longClickable)
233     {
234         this->longClickable = longClickable;
235     }
236 
IsLongClickableArkUI_AccessibilityElementInfo237     bool IsLongClickable() const
238     {
239         return longClickable;
240     }
241 
SetEnabledArkUI_AccessibilityElementInfo242     void SetEnabled(bool enabled)
243     {
244         this->enabled = enabled;
245     }
246 
IsEnabledArkUI_AccessibilityElementInfo247     bool IsEnabled() const
248     {
249         return enabled;
250     }
251 
SetPasswordArkUI_AccessibilityElementInfo252     void SetPassword(bool isPassword)
253     {
254         this->password = isPassword;
255     }
256 
IsPasswordArkUI_AccessibilityElementInfo257     bool IsPassword() const
258     {
259         return password;
260     }
261 
SetScrollableArkUI_AccessibilityElementInfo262     void SetScrollable(bool scrollable)
263     {
264         this->scrollable = scrollable;
265     }
266 
IsScrollableArkUI_AccessibilityElementInfo267     bool IsScrollable() const
268     {
269         return scrollable;
270     }
271 
SetEditableArkUI_AccessibilityElementInfo272     void SetEditable(bool editable)
273     {
274         this->editable = editable;
275     }
276 
IsEditableArkUI_AccessibilityElementInfo277     bool IsEditable() const
278     {
279         return editable;
280     }
281 
SetHintArkUI_AccessibilityElementInfo282     void SetHint(bool hint)
283     {
284         this->hint = hint;
285     }
286 
IsHintArkUI_AccessibilityElementInfo287     bool IsHint() const
288     {
289         return hint;
290     }
291 
SetAccessibilityGroupArkUI_AccessibilityElementInfo292     void SetAccessibilityGroup(bool accessibilityGroup)
293     {
294         this->accessibilityGroup = accessibilityGroup;
295     }
296 
GetAccessibilityGroupArkUI_AccessibilityElementInfo297     bool GetAccessibilityGroup() const
298     {
299         return accessibilityGroup;
300     }
301 
302     void SetRect(const ArkUI_AccessibleRect& rect);
GetScreenRectArkUI_AccessibilityElementInfo303     ArkUI_AccessibleRect GetScreenRect() const
304     {
305         return screenRect;
306     }
307 
308     void SetRangeInfo(const ArkUI_AccessibleRangeInfo& rangeInfo);
GetRangeInfoArkUI_AccessibilityElementInfo309     ArkUI_AccessibleRangeInfo GetRangeInfo() const
310     {
311         return rangeInfo;
312     }
313 
314     void SetGridInfo(const ArkUI_AccessibleGridInfo& gridInfo);
GetGridInfoArkUI_AccessibilityElementInfo315     ArkUI_AccessibleGridInfo GetGridInfo() const
316     {
317         return grid;
318     }
319 
320     void SetGridItemInfo(const ArkUI_AccessibleGridItemInfo& gridItemInfo);
GetGridItemInfoArkUI_AccessibilityElementInfo321     ArkUI_AccessibleGridItemInfo GetGridItemInfo() const
322     {
323         return gridItem;
324     }
325 
326     void ClearChildNodeIds();
327     void AddChildNodeId(int64_t childNodeId);
GetChildNodeIdsArkUI_AccessibilityElementInfo328     const std::vector<int64_t>& GetChildNodeIds() const
329     {
330         return childNodeIds;
331     }
332 
333     void ClearOperationActions();
334     void AddOperationAction(const ArkUI_AccessibleAction& action);
GetOperationActionsArkUI_AccessibilityElementInfo335     const std::vector<ArkUI_AccessibleAction>& GetOperationActions() const
336     {
337         return operationActions;
338     }
339 
SetComponentTypeArkUI_AccessibilityElementInfo340     void SetComponentType(const std::string& componentType)
341     {
342         this->componentType = componentType;
343     }
344 
GetComponentTypeArkUI_AccessibilityElementInfo345     std::string GetComponentType() const
346     {
347         return componentType;
348     }
349 
SetContentsArkUI_AccessibilityElementInfo350     void SetContents(const std::string& contents)
351     {
352         this->contents = contents;
353     }
354 
GetContentsArkUI_AccessibilityElementInfo355     std::string GetContents() const
356     {
357         return contents;
358     }
359 
SetHintTextArkUI_AccessibilityElementInfo360     void SetHintText(const std::string& hintText)
361     {
362         this->hintText = hintText;
363     }
364 
GetHintTextArkUI_AccessibilityElementInfo365     std::string GetHintText() const
366     {
367         return hintText;
368     }
369 
SetAccessibilityTextArkUI_AccessibilityElementInfo370     void SetAccessibilityText(const std::string& accessibilityText)
371     {
372         this->accessibilityText = accessibilityText;
373     }
374 
GetAccessibilityTextArkUI_AccessibilityElementInfo375     std::string GetAccessibilityText() const
376     {
377         return accessibilityText;
378     }
379 
SetAccessibilityDescriptionArkUI_AccessibilityElementInfo380     void SetAccessibilityDescription(const std::string& accessibilityDescription)
381     {
382         this->accessibilityDescription = accessibilityDescription;
383     }
384 
GetAccessibilityDescriptionArkUI_AccessibilityElementInfo385     std::string GetAccessibilityDescription() const
386     {
387         return accessibilityDescription;
388     }
389 
SetAccessibilityLevelArkUI_AccessibilityElementInfo390     void SetAccessibilityLevel(const std::string& accessibilityLevel)
391     {
392         this->accessibilityLevel = accessibilityLevel;
393     }
394 
GetAccessibilityLevelArkUI_AccessibilityElementInfo395     std::string GetAccessibilityLevel() const
396     {
397         return accessibilityLevel;
398     }
399 
SetBackgroundColorArkUI_AccessibilityElementInfo400     void SetBackgroundColor(const std::string& backgroundColor)
401     {
402         this->backgroundColor = backgroundColor;
403     }
404 
GetBackgroundColorArkUI_AccessibilityElementInfo405     std::string GetBackgroundColor() const
406     {
407         return backgroundColor;
408     }
409 
SetBackgroundImageArkUI_AccessibilityElementInfo410     void SetBackgroundImage(const std::string& backgroundImage)
411     {
412         this->backgroundImage = backgroundImage;
413     }
414 
GetBackgroundImageArkUI_AccessibilityElementInfo415     std::string GetBackgroundImage() const
416     {
417         return backgroundImage;
418     }
419 
SetBlurArkUI_AccessibilityElementInfo420     void SetBlur(const std::string& blur)
421     {
422         this->blur = blur;
423     }
424 
GetBlurArkUI_AccessibilityElementInfo425     std::string GetBlur() const
426     {
427         return blur;
428     }
429 
SetHitTestBehaviorArkUI_AccessibilityElementInfo430     void SetHitTestBehavior(const std::string& hitTestBehavior)
431     {
432         this->hitTestBehavior = hitTestBehavior;
433     }
434 
GetHitTestBehaviorArkUI_AccessibilityElementInfo435     std::string GetHitTestBehavior() const
436     {
437         return hitTestBehavior;
438     }
439 
440 private:
441     int32_t pageId = 0;
442     int32_t textBeginSelected = 0;
443     int32_t textEndSelected = 0;
444     int32_t currentIndex = 0;
445     int32_t beginIndex = 0;
446     int32_t endIndex = 0;
447     int32_t itemCount = 0;
448     int32_t offset = 0;
449     int32_t zIndex = 0;
450     float opacity = 0.0f;
451 
452     int64_t parentId = 0;
453     int32_t elementId = 0;
454 
455     bool checkable = false;
456     bool checked = false;
457     bool focusable = false;
458     bool focused = false;
459     bool visible = false;
460     bool accessibilityFocused = false;
461     bool selected = false;
462     bool clickable = false;
463     bool longClickable = false;
464     bool enabled = false;
465     bool password = false;
466     bool scrollable = false;
467     bool editable = false;
468     bool hint = false;
469     bool accessibilityGroup = false;
470 
471     ArkUI_AccessibleRect screenRect;
472     ArkUI_AccessibleRangeInfo rangeInfo;
473     ArkUI_AccessibleGridInfo grid;
474     ArkUI_AccessibleGridItemInfo gridItem;
475 
476     std::vector<int64_t> childNodeIds;
477     std::vector<ArkUI_AccessibleAction> operationActions;
478 
479     std::string componentType;
480     std::string contents;
481     std::string hintText;
482     std::string accessibilityText;
483     std::string accessibilityDescription;
484 
485     std::string accessibilityLevel;
486     std::string backgroundColor;
487     std::string backgroundImage;
488     std::string blur;
489     std::string hitTestBehavior;
490 };
491 
492 struct ArkUI_AccessibilityEventInfo {
493 public:
494     ArkUI_AccessibilityEventInfo() = default;
495 
GetEventTypeArkUI_AccessibilityEventInfo496     ArkUI_AccessibilityEventType GetEventType() const
497     {
498         return eventType;
499     }
500 
SetEventTypeArkUI_AccessibilityEventInfo501     void SetEventType(ArkUI_AccessibilityEventType eventType_)
502     {
503         eventType = eventType_;
504     }
505 
GetPageIdArkUI_AccessibilityEventInfo506     int32_t GetPageId() const
507     {
508         return pageId;
509     }
510 
SetPageIdArkUI_AccessibilityEventInfo511     void SetPageId(int32_t pageId)
512     {
513         this->pageId = pageId;
514     }
515 
GetRequestFocusIdArkUI_AccessibilityEventInfo516     int32_t GetRequestFocusId() const
517     {
518         return requestFocusId;
519     }
520 
SetRequestFocusIdArkUI_AccessibilityEventInfo521     void SetRequestFocusId(int32_t requestFocusId)
522     {
523         this->requestFocusId = requestFocusId;
524     }
525 
GetElementInfoArkUI_AccessibilityEventInfo526     ArkUI_AccessibilityElementInfo* GetElementInfo() const
527     {
528         return elementInfo;
529     }
530 
SetElementInfoArkUI_AccessibilityEventInfo531     void SetElementInfo(ArkUI_AccessibilityElementInfo* elementInfo)
532     {
533         this->elementInfo = elementInfo;
534     }
535 
GetTextAnnouncedForAccessibilityArkUI_AccessibilityEventInfo536     std::string GetTextAnnouncedForAccessibility() const
537     {
538         return textAnnouncedForAccessibility;
539     }
540 
SetTextAnnouncedForAccessibilityArkUI_AccessibilityEventInfo541     void SetTextAnnouncedForAccessibility(const std::string& textAnnouncedForAccessibility)
542     {
543         this->textAnnouncedForAccessibility = textAnnouncedForAccessibility;
544     }
545 
546 private:
547     ArkUI_AccessibilityEventType eventType = ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_INVALID;
548     int32_t pageId = 0;
549     int32_t requestFocusId = 0;
550     ArkUI_AccessibilityElementInfo* elementInfo = nullptr;
551     std::string textAnnouncedForAccessibility;
552 };
553 
554 // suport multithreads
555 struct ArkUI_AccessibilityElementInfoList {
556 public:
557     ArkUI_AccessibilityElementInfoList() = default;
558     ArkUI_AccessibilityElementInfo* AddAndGetElementInfo();
559     bool CopyAccessibilityElementInfo(std::vector<ArkUI_AccessibilityElementInfo>& infos);
560 
561 private:
562     std::mutex mutex_;
563     std::list<ArkUI_AccessibilityElementInfo> elementInfos_;
564 };
565 
566 struct ArkUI_AccessibilityActionArguments {
567 public:
ArkUI_AccessibilityActionArgumentsArkUI_AccessibilityActionArguments568     ArkUI_AccessibilityActionArguments(std::map<std::string, std::string> actionArguments)
569     {
570         actionArguments_.swap(actionArguments);
571     }
572     const char* FindValueByKey(const char* key);
573 
574 private:
575     std::map<std::string, std::string> actionArguments_;
576 };
577 
578 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_ACCESSIBILITY_NATIVE_INTERFACE_ACCESSIBILITY_IMPL_H