• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-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 // Created on 2024/12/3.
17 // Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
18 // please include "napi/native_api.h".
19 
20 
21 #include <arkui/native_interface_accessibility.h>
22 #include <hilog/log.h>
23 #include "AccessibilityManagerTest.h"
24 #include <cassert>
25 #include <string>
26 const unsigned int LOG_PRINT_DOMAIN = 0xFF00;
27 static int NUMBER_100 = 100;
28 static int NUMBER_500 = 500;
29 static int NUMBER_800 = 800;
30 
31 class AccessibleObject {
32 public:
AccessibleObject(const std::string & name)33     AccessibleObject(const std::string &name) : name_(name), originName_(name) {}
SetFocus(bool focus)34     void SetFocus(bool focus) { focus_ = focus; }
SetName(const std::string & name)35     void SetName(const std::string &name) {name_ = name;}
Focused() const36     bool Focused() const { return focus_; }
Focusable() const37     virtual bool Focusable() const { return true; }
Name() const38     std::string Name() const { return name_; }
OriginName() const39     std::string OriginName() const { return originName_; }
40 
ObjectType() const41     virtual const char *ObjectType() const { return "object"; }
Hint() const42     virtual const char *Hint() const { return "It's object"; }
43 
onClick()44     virtual void onClick() {}
Clickable() const45     virtual bool Clickable() const { return false; }
46 
fillAccessibilityElement(ArkUI_AccessibilityElementInfo * element)47     void fillAccessibilityElement(ArkUI_AccessibilityElementInfo *element)
48     {
49         OH_ArkUI_AccessibilityElementInfoSetComponentType(element, ObjectType());
50         OH_ArkUI_AccessibilityElementInfoSetContents(element, Name().data());
51         OH_ArkUI_AccessibilityElementInfoSetHintText(element, Hint());
52         OH_ArkUI_AccessibilityElementInfoSetVisible(element, true);
53 
54         OH_ArkUI_AccessibilityElementInfoSetEnabled(element, true);
55 
56         OH_ArkUI_AccessibilityElementInfoSetFocusable(element, Focusable());
57         OH_ArkUI_AccessibilityElementInfoSetFocused(element, Focused());
58         OH_ArkUI_AccessibilityElementInfoSetAccessibilityLevel(element, "yes");
59         OH_ArkUI_AccessibilityElementInfoSetEditable(element, true);
60 
61         ArkUI_AccessibleAction actions[12];
62         int index = 0;
63         if (this->Clickable()) {
64             actions[index].actionType = ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_CLICK;
65             actions[index].description = "Click";
66             index++;
67         }
68 
69         if (this->Focusable()) {
70             actions[index].actionType = ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_GAIN_ACCESSIBILITY_FOCUS;
71             actions[index].description = "Focus";
72             index++;
73             actions[index].actionType = ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_CLEAR_ACCESSIBILITY_FOCUS;
74             actions[index].description = "ClearFocus";
75             index++;
76         }
77 
78         actions[index].actionType = ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_NEXT_HTML_ITEM;
79         actions[index].description = "Next FocusMove";
80         index++;
81         actions[index].actionType = ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_PREVIOUS_HTML_ITEM;
82         actions[index].description = "Previous FocusMove";
83         index++;
84 
85         if (index > 0) {
86             OH_ArkUI_AccessibilityElementInfoSetOperationActions(element, index, actions);
87         }
88     }
89 private:
90     bool focus_ = false;
91     std::string name_;
92     std::string originName_;
93 };
94 
95 class FakeButton : public AccessibleObject {
96 public:
FakeButton(const std::string & name)97     FakeButton(const std::string &name) : AccessibleObject(name) {}
Hint() const98     const char *Hint() const { return "It's a button"; }
ObjectType() const99     virtual const char *ObjectType() const { return "QButton"; }
onClick()100     virtual void onClick()
101     {
102         OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "AccessibleObject", "FakeButton onClick");
103     }
Clickable() const104     virtual bool Clickable() const { return true; }
105 };
106 
107 class FakeText : public AccessibleObject {
108 public:
FakeText(const std::string & name)109     FakeText(const std::string &name) : AccessibleObject(name) {}
110 
Hint() const111     const char *Hint() const { return "It's a text"; }
ObjectType() const112     virtual const char *ObjectType() const { return "QText"; }
onClick()113     virtual void onClick()
114     {
115         OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "AccessibleObject", "FakeText onClick");
116     }
Clickable() const117     virtual bool Clickable() const { return false; }
118 };
119 
120 
121 class FakeWidget : public AccessibleObject {
122 public:
instance()123     static FakeWidget &instance()
124     {
125         static FakeWidget w;
126         return w;
127     }
128 
getAllObjects(std::string instanceId) const129     const std::vector<AccessibleObject *> &getAllObjects(std::string instanceId) const
130     {
131         for (int i = 0; i < objects.size(); i++) {
132             objects[i]->SetName(objects[i]->OriginName() + instanceId);
133         }
134         return objects;
135     }
136 
getChild(int elementId) const137     AccessibleObject *getChild(int elementId) const
138     {
139         if (elementId <= 0) {
140             return nullptr;
141         }
142         if (elementId - 1 >= objects.size()) {
143             return nullptr;
144         }
145         return objects.at(elementId - 1);
146     }
147 
Focusable() const148     virtual bool Focusable() const { return false; }
Hint() const149     virtual const char *Hint() const { return "It's a widget"; }
ObjectType() const150     virtual const char *ObjectType() const { return "QWidget"; }
onClick()151     virtual void onClick()
152     {
153         OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "AccessibleObject", "FakeWidget onClick");
154     }
155 
156 private:
FakeWidget()157     FakeWidget() : AccessibleObject("fakeWidget")
158     {
159         this->AddButton();
160         this->AddButton();
161         this->AddButton();
162         this->AddText();
163         this->AddText();
164         this->AddText();
165     }
~FakeWidget()166     ~FakeWidget()
167     {
168         for (auto &obj : objects) {
169             delete obj;
170         }
171     }
172 
173 private:
AddButton()174     void AddButton()
175     {
176         static int i = 1;
177         objects.push_back(new FakeButton("button" + std::to_string(i)));
178         i++;
179     }
AddText()180     void AddText()
181     {
182         static int i = 1;
183         objects.push_back(new FakeText("text" + std::to_string(i)));
184         i++;
185     }
186 
187 private:
188     std::vector<AccessibleObject *> objects;
189 };
190 
191 const char *LOG_PRINT_TEXT = "AccessibilityManager";
192 
FillEvent(ArkUI_AccessibilityEventInfo * eventInfo,ArkUI_AccessibilityElementInfo * elementInfo,ArkUI_AccessibilityEventType eventType)193 void FillEvent(ArkUI_AccessibilityEventInfo *eventInfo, ArkUI_AccessibilityElementInfo *elementInfo,
194                ArkUI_AccessibilityEventType eventType)
195 {
196     if (eventInfo == nullptr) {
197         return;
198     }
199     if (elementInfo == nullptr) {
200         return;
201     }
202     OH_ArkUI_AccessibilityEventSetEventType(eventInfo, eventType);
203 
204     OH_ArkUI_AccessibilityEventSetElementInfo(eventInfo, elementInfo);
205 }
206 
207 
208 ArkUI_AccessibilityProvider *g_provider = nullptr;
209 
SendAccessibilityAsyncEvent(ArkUI_AccessibilityElementInfo * elementInfo,ArkUI_AccessibilityEventType eventType)210 void AccessibilityManager::SendAccessibilityAsyncEvent(ArkUI_AccessibilityElementInfo *elementInfo,
211                                                        ArkUI_AccessibilityEventType eventType)
212 {
213     auto eventInfo = OH_ArkUI_CreateAccessibilityEventInfo();
214 
215     // 1.填写event内容
216     FillEvent(eventInfo, elementInfo, eventType);
217     // 2.callback
218     auto callback = [](int32_t errorCode) {
219         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "result: %{public}d", errorCode);
220     };
221     // 3. 调用接口发送事件给OH侧
222     OH_ArkUI_SendAccessibilityAsyncEvent(g_provider, eventInfo, callback);
223 }
224 
AccessibilityManager()225 AccessibilityManager::AccessibilityManager()
226 {
227     accessibilityProviderCallbacksWithInstance_.findAccessibilityNodeInfosById = FindAccessibilityNodeInfosById;
228     accessibilityProviderCallbacksWithInstance_.findAccessibilityNodeInfosByText = FindAccessibilityNodeInfosByText;
229     accessibilityProviderCallbacksWithInstance_.findFocusedAccessibilityNode = FindFocusedAccessibilityNode;
230     accessibilityProviderCallbacksWithInstance_.findNextFocusAccessibilityNode = FindNextFocusAccessibilityNode;
231     accessibilityProviderCallbacksWithInstance_.executeAccessibilityAction = ExecuteAccessibilityAction;
232     accessibilityProviderCallbacksWithInstance_.clearFocusedFocusAccessibilityNode = ClearFocusedFocusAccessibilityNode;
233     accessibilityProviderCallbacksWithInstance_.getAccessibilityNodeCursorPosition = GetAccessibilityNodeCursorPosition;
234 }
235 
Initialize(const std::string & id,ArkUI_NodeHandle handle)236 void AccessibilityManager::Initialize(const std::string &id, ArkUI_NodeHandle handle)
237 {
238     provider = OH_ArkUI_AccessibilityProvider_Create(handle);
239     OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "wds get provider=%{public}p", provider);
240 
241     if (provider == nullptr) {
242         OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "wds get provider is null");
243         return;
244     }
245 
246     // 2.注册回调函数
247     auto ret = OH_ArkUI_AccessibilityProviderRegisterCallbackWithInstance(id.c_str(),
248                                                                           provider,
249                                                                           &accessibilityProviderCallbacksWithInstance_);
250     if (ret != 0) {
251         OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
252                      "InterfaceDesignTest OH_ArkUI_AccessibilityProviderRegisterCallback failed");
253         return;
254     }
255     g_provider = provider;
256 }
257 
FindAccessibilityNodeInfosById(const char * instanceId,int64_t elementId,ArkUI_AccessibilitySearchMode mode,int32_t requestId,ArkUI_AccessibilityElementInfoList * elementList)258 int32_t AccessibilityManager::FindAccessibilityNodeInfosById(const char* instanceId, int64_t elementId,
259                                                              ArkUI_AccessibilitySearchMode mode,
260                                                              int32_t requestId,
261                                                              ArkUI_AccessibilityElementInfoList *elementList)
262 {
263     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
264                  "FindAccessibilityNodeInfosById start,instanceId %{public}s elementId: %{public}ld, requestId: %{public}d, mode: %{public}d",
265                  instanceId, elementId, requestId, static_cast<int32_t>(mode));
266 
267     if (elementList == nullptr) {
268         OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
269                      "FindAccessibilityNodeInfosById elementList is null");
270         return OH_NATIVEXCOMPONENT_RESULT_FAILED;
271     }
272     int ret = 0;
273     const int parentOfRoot = -2100000;
274     if (elementId == -1) {
275         elementId = 0;
276     }
277 
278     if (mode == ARKUI_ACCESSIBILITY_NATIVE_SEARCH_MODE_PREFETCH_RECURSIVE_CHILDREN) {
279         // arkUi框架设计的特殊值,根节点必须设置parentId为这个值
280 
281         // fill some fake nodes
282         auto rootNode = OH_ArkUI_AddAndGetAccessibilityElementInfo(elementList);
283         assert(rootNode);
284 
285         OH_ArkUI_AccessibilityElementInfoSetElementId(rootNode, 0);
286         OH_ArkUI_AccessibilityElementInfoSetParentId(rootNode, parentOfRoot);
287         FakeWidget::instance().fillAccessibilityElement(rootNode);
288 
289         ArkUI_AccessibleRect rect;
290         rect.leftTopX = 0;
291         rect.leftTopY = 0;
292         rect.rightBottomX = NUMBER_800;
293         rect.rightBottomY = NUMBER_800;
294         ret = OH_ArkUI_AccessibilityElementInfoSetScreenRect(rootNode, &rect);
295         OH_ArkUI_AccessibilityElementInfoSetAccessibilityLevel(rootNode, "no");
296         auto objects = FakeWidget::instance().getAllObjects(instanceId);
297         int64_t childNodes[1024];
298         for (int i = 0; i < objects.size(); i++) {
299             int elementId = i + 1;
300 
301             childNodes[i] = elementId;
302         }
303 
304         for (int i = 0; i < objects.size(); i++) {
305             int elementId = i + 1;
306 
307             childNodes[i] = elementId;
308             auto child = OH_ArkUI_AddAndGetAccessibilityElementInfo(elementList);
309             OH_ArkUI_AccessibilityElementInfoSetElementId(child, elementId);
310             OH_ArkUI_AccessibilityElementInfoSetParentId(child, 0);
311             OH_ArkUI_AccessibilityElementInfoSetAccessibilityLevel(child, "yes");
312             objects[i]->fillAccessibilityElement(child);
313 
314             ArkUI_AccessibleRect rect;
315             rect.leftTopX = i * NUMBER_100;
316             rect.leftTopY = NUMBER_100;
317             rect.rightBottomX = i * NUMBER_100 + NUMBER_100;
318             rect.rightBottomY = NUMBER_500;
319             OH_ArkUI_AccessibilityElementInfoSetScreenRect(child, &rect);
320         }
321 
322         ret = OH_ArkUI_AccessibilityElementInfoSetChildNodeIds(rootNode, objects.size(), childNodes);
323         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
324                      "FindAccessibilityNodeInfosById child count: %{public}ld %{public}d",
325                      objects.size(), ret);
326     } else {
327         if (mode == ARKUI_ACCESSIBILITY_NATIVE_SEARCH_MODE_PREFETCH_CURRENT) {
328             auto &widget = FakeWidget::instance();
329             AccessibleObject *obj = nullptr;
330             if (elementId == 0) {
331                 obj = &widget;
332             } else {
333                 obj = widget.getChild(elementId);
334             }
335             if (obj) {
336                 auto node = OH_ArkUI_AddAndGetAccessibilityElementInfo(elementList);
337                 OH_ArkUI_AccessibilityElementInfoSetElementId(node, elementId);
338                 OH_ArkUI_AccessibilityElementInfoSetParentId(node, elementId == 0 ? parentOfRoot : 0);
339                 OH_ArkUI_AccessibilityElementInfoSetAccessibilityLevel(node, elementId == 0 ?  "no" : "yes");
340                 obj->fillAccessibilityElement(node);
341                 ArkUI_AccessibleRect rect;
342                 if (elementId == 0) {
343                     rect.leftTopX = 0;
344                     rect.leftTopY = 0;
345                     rect.rightBottomX = NUMBER_800;
346                     rect.rightBottomY = NUMBER_800;
347                 } else {
348                     int i = elementId - 1;
349                     rect.leftTopX = i * NUMBER_100;
350                     rect.leftTopY = NUMBER_100;
351                     rect.rightBottomX = i * NUMBER_100 + NUMBER_100;
352                     rect.rightBottomY = NUMBER_500;
353                 }
354 
355                 OH_ArkUI_AccessibilityElementInfoSetScreenRect(node, &rect);
356                 if (elementId == 0) {
357                     auto objects = FakeWidget::instance().getAllObjects(instanceId);
358                     int64_t childNodes[1024];
359 
360                     for (int i = 0; i < objects.size(); i++) {
361                         int elementId = i + 1;
362 
363                         childNodes[i] = elementId;
364                         auto child = OH_ArkUI_AddAndGetAccessibilityElementInfo(elementList);
365                         OH_ArkUI_AccessibilityElementInfoSetElementId(child, elementId);
366                         OH_ArkUI_AccessibilityElementInfoSetParentId(child, 0);
367 
368                         objects[i]->fillAccessibilityElement(child);
369 
370                         ArkUI_AccessibleRect rect;
371                         rect.leftTopX = i * NUMBER_100;
372                         rect.leftTopY = 0;
373                         rect.rightBottomX = i * NUMBER_100 + NUMBER_100;
374                         rect.rightBottomY = NUMBER_500;
375                         OH_ArkUI_AccessibilityElementInfoSetScreenRect(child, &rect);
376                     }
377 
378                     ret = OH_ArkUI_AccessibilityElementInfoSetChildNodeIds(node, objects.size(), childNodes);
379                     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
380                         "FindAccessibilityNodeInfosById child2 count: %{public}ld",
381                         objects.size());
382                 }
383             }
384         }
385     }
386 
387     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "FindAccessibilityNodeInfosById end");
388     return OH_NATIVEXCOMPONENT_RESULT_SUCCESS;
389 }
390 
FindAccessibilityNodeInfosByText(const char * instanceId,int64_t elementId,const char * text,int32_t requestId,ArkUI_AccessibilityElementInfoList * elementList)391 int32_t AccessibilityManager::FindAccessibilityNodeInfosByText(const char* instanceId, int64_t elementId,
392                                                                const char *text,
393                                                                int32_t requestId,
394                                                                ArkUI_AccessibilityElementInfoList *elementList)
395 {
396     return OH_NATIVEXCOMPONENT_RESULT_SUCCESS;
397 }
398 
FindFocusedAccessibilityNode(const char * instanceId,int64_t elementId,ArkUI_AccessibilityFocusType focusType,int32_t requestId,ArkUI_AccessibilityElementInfo * elementInfo)399 int32_t AccessibilityManager::FindFocusedAccessibilityNode(const char* instanceId, int64_t elementId,
400                                                            ArkUI_AccessibilityFocusType focusType,
401                                                            int32_t requestId,
402                                                            ArkUI_AccessibilityElementInfo *elementInfo)
403 {
404     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
405                  "FindFocusedAccessibilityNode elementId: %{public}ld, requestId: %{public}d, focusType: %{public}d",
406                  elementId, requestId, static_cast<int32_t>(focusType));
407 
408     return OH_NATIVEXCOMPONENT_RESULT_SUCCESS;
409 }
410 
FindNextFocusAccessibilityNode(const char * instanceId,int64_t elementId,ArkUI_AccessibilityFocusMoveDirection direction,int32_t requestId,ArkUI_AccessibilityElementInfo * elementInfo)411 int32_t AccessibilityManager::FindNextFocusAccessibilityNode(const char* instanceId, int64_t elementId,
412                                                              ArkUI_AccessibilityFocusMoveDirection direction,
413                                                              int32_t requestId,
414                                                              ArkUI_AccessibilityElementInfo *elementInfo)
415 {
416     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
417                  "zhk FindNextFocusAccessibilityNode instanceId %{public}s elementId: %{public}ld, requestId: %{public}d, direction: %{public}d",
418                  instanceId, elementId, requestId, static_cast<int32_t>(direction));
419 
420     auto objects = FakeWidget::instance().getAllObjects(instanceId);
421 
422     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
423                  "zhk objects.size() %{public}d", objects.size());
424     // object.size 不包含 root节点
425     if ((elementId < 0) || (elementId > objects.size())) {
426         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "zhk 1");
427         return OH_NATIVEXCOMPONENT_RESULT_FAILED;
428     }
429     int64_t nextElementId = -1;
430     if (direction == ARKUI_ACCESSIBILITY_NATIVE_DIRECTION_FORWARD) {
431         nextElementId = elementId + 1;
432     } else {
433         nextElementId = elementId - 1;
434     }
435 
436     // 屏幕朗读约束 如果是根节点 然后backward的话需要回到最后一个节点
437     if ((nextElementId == -1) && (direction == ARKUI_ACCESSIBILITY_NATIVE_DIRECTION_BACKWARD)) {
438         nextElementId = objects.size();
439     }
440 
441     if (nextElementId >  objects.size()) {
442         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "zhk 2");
443         return OH_NATIVEXCOMPONENT_RESULT_FAILED;
444     }
445 
446     if (nextElementId <=  0) {
447         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "zhk 3");
448         return OH_NATIVEXCOMPONENT_RESULT_FAILED;
449     }
450 
451     OH_ArkUI_AccessibilityElementInfoSetElementId(elementInfo, nextElementId);
452     OH_ArkUI_AccessibilityElementInfoSetParentId(elementInfo, 0);
453 
454     // id 比object索引大1
455     objects[nextElementId - 1]->fillAccessibilityElement(elementInfo);
456 
457     ArkUI_AccessibleRect rect;
458     rect.leftTopX = nextElementId * NUMBER_100;
459     rect.leftTopY = 0;
460     rect.rightBottomX = nextElementId * NUMBER_100 + NUMBER_100;
461     rect.rightBottomY = NUMBER_500;
462     OH_ArkUI_AccessibilityElementInfoSetScreenRect(elementInfo, &rect);
463 
464     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "zhk 4 %{public}ld", nextElementId);
465     return OH_NATIVEXCOMPONENT_RESULT_SUCCESS;
466 }
467 
getProvider()468 ArkUI_AccessibilityProvider* AccessibilityManager::getProvider()
469 {
470     return provider;
471 }
472 
ExecuteAccessibilityAction(const char * instanceId,int64_t elementId,ArkUI_Accessibility_ActionType action,ArkUI_AccessibilityActionArguments * actionArguments,int32_t requestId)473 int32_t AccessibilityManager::ExecuteAccessibilityAction(const char* instanceId, int64_t elementId,
474                                                          ArkUI_Accessibility_ActionType action,
475                                                          ArkUI_AccessibilityActionArguments *actionArguments,
476                                                          int32_t requestId)
477 {
478     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT,
479                  "ExecuteAccessibilityAction elementId: %{public}ld, requestId: %{public}ld,  action: %{public}d",
480                  elementId, requestId, action);
481     auto object = FakeWidget::instance().getChild(elementId);
482 
483     if (!object)
484         return 0;
485 
486     auto element = OH_ArkUI_CreateAccessibilityElementInfo();
487     OH_ArkUI_AccessibilityElementInfoSetElementId(element, elementId);
488 
489     switch (action) {
490     case ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_CLICK:
491         if (object) {
492             object->onClick();
493             object->fillAccessibilityElement(element);
494         }
495         break;
496     case ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_GAIN_ACCESSIBILITY_FOCUS:
497         if (object) {
498             object->SetFocus(true);
499 
500             object->fillAccessibilityElement(element);
501         }
502 
503         AccessibilityManager::SendAccessibilityAsyncEvent(element,
504                                                           ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ACCESSIBILITY_FOCUSED);
505 
506         break;
507     case ARKUI_ACCESSIBILITY_NATIVE_ACTION_TYPE_CLEAR_ACCESSIBILITY_FOCUS:
508         if (object) {
509             object->SetFocus(false);
510             object->fillAccessibilityElement(element);
511         }
512         AccessibilityManager::SendAccessibilityAsyncEvent(
513             element, ARKUI_ACCESSIBILITY_NATIVE_EVENT_TYPE_ACCESSIBILITY_FOCUS_CLEARED);
514         break;
515     }
516 
517     OH_ArkUI_DestoryAccessibilityElementInfo(element);
518     return OH_NATIVEXCOMPONENT_RESULT_SUCCESS;
519 }
520 
ClearFocusedFocusAccessibilityNode(const char * instanceId)521 int32_t AccessibilityManager::ClearFocusedFocusAccessibilityNode(const char* instanceId)
522 {
523     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "ClearFocusedFocusAccessibilityNode");
524     return OH_NATIVEXCOMPONENT_RESULT_SUCCESS;
525 }
526 
GetAccessibilityNodeCursorPosition(const char * instanceId,int64_t elementId,int32_t requestId,int32_t * index)527 int32_t AccessibilityManager::GetAccessibilityNodeCursorPosition(const char* instanceId, int64_t elementId,
528                                                                  int32_t requestId, int32_t *index)
529 {
530     OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, LOG_PRINT_TEXT, "GetAccessibilityNodeCursorPosition");
531     return OH_NATIVEXCOMPONENT_RESULT_SUCCESS;
532 }