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 }