• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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_ACCESSIBILITY_MANAGER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H
18 
19 #include "base/geometry/ng/point_t.h"
20 #include "base/memory/ace_type.h"
21 #include "core/accessibility/accessibility_node.h"
22 #include "core/accessibility/accessibility_constants.h"
23 #include "core/accessibility/accessibility_provider.h"
24 #include "core/accessibility/accessibility_utils.h"
25 #include "core/pipeline/base/base_composed_component.h"
26 
27 namespace OHOS::Accessibility {
28 class AccessibilityElementInfo;
29 class AccessibilityEventInfo;
30 class AccessibilityElementOperator;
31 } // namespace OHOS::Accessibility
32 
33 namespace OHOS::Ace::NG {
34 class WebPattern;
35 } // namespace OHOS::Ace::NG
36 
37 namespace OHOS::Ace {
38 
39 struct AccessibilityEvent {
40     int64_t nodeId = 0;
41     int64_t stackNodeId = -1;
42     uint32_t windowId = 0;
43     WindowsContentChangeTypes windowContentChangeTypes = CONTENT_CHANGE_TYPE_INVALID;
44     WindowUpdateType windowChangeTypes = WINDOW_UPDATE_INVALID;
45     std::string eventType;
46     std::string componentType;
47     std::string beforeText;
48     std::string latestContent;
49     std::string textAnnouncedForAccessibility;
50     double currentItemIndex = 0.0;
51     double itemCount = 0.0;
52     AccessibilityEventType type = AccessibilityEventType::UNKNOWN;
53 };
54 
55 enum class OperatorType {
56     UNDEFINE = 1,
57     JS_UIEXTENSION,
58     JS_WEB,
59     JS_THIRD_PROVIDER,
60 };
61 
62 struct Registration {
63     uint32_t windowId = 0;
64     uint32_t parentWindowId = 0;
65     int32_t parentTreeId = 0;
66     int64_t elementId = 0;
67     OperatorType operatorType = OperatorType::UNDEFINE;
68     WeakPtr<NG::FrameNode> hostNode;
69     WeakPtr<AccessibilityProvider> accessibilityProvider;
70 };
71 
72 enum class AccessibilityVersion {
73     JS_VERSION = 1,
74     JS_DECLARATIVE_VERSION,
75 };
76 
77 struct AccessibilityParentRectInfo {
78     int32_t left = 0;
79     int32_t top = 0;
80     float scaleX = 1.0f;       // scale of parent interface
81     float scaleY = 1.0f;       // scale of parent interface
82     int32_t centerX = 0;       // center X of parent interface relative to real window
83     int32_t centerY = 0;       // center Y scale of parent interface relative to real window
84     int32_t rotateDegree = 0;  // final rotate degree of parent interface
85     bool isChanged = false;    // only for uiextension, true means uec transfered translate params to uiextension
86 };
87 
88 struct AccessibilityWindowInfo {
89     int32_t left = 0;
90     int32_t top = 0;
91     int32_t innerWindowId = -1;
92     float_t scaleX = 1.0f;
93     float_t scaleY = 1.0f;
94 };
95 
96 struct AccessibilityWorkMode {
97     bool isTouchExplorationEnabled = true;
98 };
99 
100 enum class AccessibilityCallbackEventId : uint32_t {
101     ON_LOAD_PAGE = 0,
102     ON_SHOW = 1,
103     ON_HIDE = 2,
104     ON_SEND_ELEMENT_INFO_CHANGE = 3,
105 };
106 
107 struct AccessibilityCallbackEvent {
108     AccessibilityCallbackEventId eventId;
109     int64_t parameter;
AccessibilityCallbackEventAccessibilityCallbackEvent110     AccessibilityCallbackEvent(AccessibilityCallbackEventId id, int64_t para) : eventId(id), parameter(para) {}
111     bool operator < (const AccessibilityCallbackEvent& other) const
112     {
113         return std::tie(eventId, parameter) < std::tie(other.eventId, other.parameter);
114     }
115 };
116 
117 class AccessibilitySAObserverCallback {
118 public:
AccessibilitySAObserverCallback(int64_t accessibilityId)119     explicit AccessibilitySAObserverCallback(int64_t accessibilityId) : accessibilityId_(accessibilityId)
120     {}
121     virtual ~AccessibilitySAObserverCallback() = default;
122     virtual bool OnState(bool state) = 0;
123 
GetAccessibilityId()124     int64_t GetAccessibilityId() const
125     {
126         return accessibilityId_;
127     }
128 private:
129     int64_t accessibilityId_ = -1;
130 };
131 
132 class AccessibilityChildTreeCallback {
133 public:
AccessibilityChildTreeCallback(int64_t accessibilityId)134     explicit AccessibilityChildTreeCallback(int64_t accessibilityId) : accessibilityId_(accessibilityId)
135     {}
136     virtual ~AccessibilityChildTreeCallback() = default;
137     virtual bool OnRegister(uint32_t windowId, int32_t treeId) = 0;
138     virtual bool OnDeregister() = 0;
139     virtual bool OnSetChildTree(int32_t childWindowId, int32_t childTreeId) = 0;
140     virtual bool OnDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info) = 0;
141     virtual void OnClearRegisterFlag() = 0;
GetChildTreeId()142     int32_t GetChildTreeId() const
143     {
144         return childTreeId_;
145     }
SetChildTreeId(int32_t childTreeId)146     void SetChildTreeId(int32_t childTreeId)
147     {
148         childTreeId_ = childTreeId;
149     }
GetAccessibilityId()150     int64_t GetAccessibilityId() const
151     {
152         return accessibilityId_;
153     }
154 
155 private:
156     int32_t childTreeId_ = 0;
157     int64_t accessibilityId_ = -1;
158 };
159 
160 using VisibleRatioCallback = std::function<void(bool, double)>;
161 class AccessibilityManager : public AceType {
162     DECLARE_ACE_TYPE(AccessibilityManager, AceType);
163 
164 public:
165     AccessibilityManager() = default;
166     ~AccessibilityManager() override = default;
167 
168     virtual void SendAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent) = 0;
SendWebAccessibilityAsyncEvent(const AccessibilityEvent & accessibilityEvent,const RefPtr<NG::WebPattern> & webPattern)169     virtual void SendWebAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent,
170         const RefPtr<NG::WebPattern>& webPattern) {}
IsScreenReaderEnabled()171     virtual bool IsScreenReaderEnabled()
172     {
173         return false;
174     }
175     virtual void UpdateVirtualNodeFocus() = 0;
176     virtual int64_t GenerateNextAccessibilityId() = 0;
177     virtual RefPtr<AccessibilityNode> CreateSpecializedNode(
178         const std::string& tag, int32_t nodeId, int32_t parentNodeId) = 0;
179     virtual RefPtr<AccessibilityNode> CreateAccessibilityNode(
180         const std::string& tag, int32_t nodeId, int32_t parentNodeId, int32_t itemIndex) = 0;
181     virtual RefPtr<AccessibilityNode> GetAccessibilityNodeById(NodeId nodeId) const = 0;
182     virtual std::string GetInspectorNodeById(NodeId nodeId) const = 0;
183     virtual void RemoveAccessibilityNodes(RefPtr<AccessibilityNode>& node) = 0;
184     virtual void RemoveAccessibilityNodeById(NodeId nodeId) = 0;
185     virtual void ClearPageAccessibilityNodes(int32_t pageId) = 0;
186     virtual void SetRootNodeId(int32_t nodeId) = 0;
187     virtual void TrySaveTargetAndIdNode(
188         const std::string& id, const std::string& target, const RefPtr<AccessibilityNode>& node) = 0;
189     virtual void HandleComponentPostBinding() = 0;
190     virtual void OnDumpInfo(const std::vector<std::string>& params) = 0;
191     virtual void OnDumpInfoNG(const std::vector<std::string>& params, uint32_t windowId) = 0;
192     virtual void SetCardViewPosition(int id, float offsetX, float offsetY) = 0;
193     virtual void SetCardViewParams(const std::string& key, bool focus) = 0;
194     virtual void SetSupportAction(uint32_t action, bool isEnable) = 0;
195     virtual void ClearNodeRectInfo(RefPtr<AccessibilityNode>& node, bool isPopDialog) = 0;
196     virtual void AddComposedElement(const std::string& key, const RefPtr<ComposedElement>& node) = 0;
197     virtual void RemoveComposedElementById(const std::string& key) = 0;
198     virtual WeakPtr<ComposedElement> GetComposedElementFromPage(NodeId nodeId) = 0;
199     virtual void TriggerVisibleChangeEvent() = 0;
200     virtual void AddVisibleChangeNode(NodeId nodeId, double ratio, VisibleRatioCallback callback) = 0;
201     virtual void RemoveVisibleChangeNode(NodeId nodeId) = 0;
202     virtual bool IsVisibleChangeNodeExists(NodeId nodeId) = 0;
203     virtual void UpdateEventTarget(NodeId id, BaseEventInfo& info) = 0;
204     virtual void SetWindowPos(int32_t left, int32_t top, int32_t windowId) = 0;
205 #ifdef WINDOW_SCENE_SUPPORTED
206     virtual void SearchElementInfoByAccessibilityIdNG(int64_t elementId, int32_t mode,
207         std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
208         int64_t uiExtensionOffset) = 0;
209     virtual void SearchElementInfosByTextNG(int64_t elementId, const std::string& text,
210         std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
211         const int64_t uiExtensionOffset = 0) = 0;
212     virtual void FindFocusedElementInfoNG(int64_t elementId, int32_t focusType,
213         Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context,
214         const int64_t uiExtensionOffset = 0) = 0;
215     virtual void FocusMoveSearchNG(int64_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info,
216         const RefPtr<PipelineBase>& context, const int64_t uiExtensionOffset = 0) = 0;
217     virtual bool ExecuteExtensionActionNG(int64_t elementId, const std::map<std::string, std::string>& actionArguments,
218         int32_t action, const RefPtr<PipelineBase>& context, int64_t uiExtensionOffset) = 0;
TransferAccessibilityAsyncEvent(const Accessibility::AccessibilityEventInfo & eventInfo,int64_t uiExtensionOffset)219     virtual bool TransferAccessibilityAsyncEvent(
220         const Accessibility::AccessibilityEventInfo& eventInfo, int64_t uiExtensionOffset)
221     {
222         return false;
223     }
SendExtensionAccessibilityEvent(const Accessibility::AccessibilityEventInfo & eventInfo,int64_t uiExtensionOffset)224     virtual void SendExtensionAccessibilityEvent(
225         const Accessibility::AccessibilityEventInfo& eventInfo, int64_t uiExtensionOffset) {}
226 #endif
227 #ifdef WEB_SUPPORTED
RegisterWebInteractionOperationAsChildTree(int64_t accessibilityId,const WeakPtr<NG::WebPattern> & webPattern)228     virtual bool RegisterWebInteractionOperationAsChildTree(int64_t accessibilityId,
229         const WeakPtr<NG::WebPattern>& webPattern)
230     {
231         return false;
232     }
DeregisterWebInteractionOperationAsChildTree(int32_t treeId)233     virtual bool DeregisterWebInteractionOperationAsChildTree(int32_t treeId)
234     {
235         return false;
236     }
237 #endif
SetVersion(AccessibilityVersion version)238     void SetVersion(AccessibilityVersion version)
239     {
240         version_ = version;
241     }
GetVersion()242     AccessibilityVersion GetVersion()
243     {
244         return version_;
245     }
246 
RegisterAccessibilityChildTreeCallback(int64_t elementId,const std::shared_ptr<AccessibilityChildTreeCallback> & callback)247     virtual void RegisterAccessibilityChildTreeCallback(
248         int64_t elementId, const std::shared_ptr<AccessibilityChildTreeCallback> &callback) {};
249 
DeregisterAccessibilityChildTreeCallback(int64_t elementId)250     virtual void DeregisterAccessibilityChildTreeCallback(int64_t elementId) {};
251 
RegisterInteractionOperationAsChildTree(uint32_t parentWindowId,int32_t parentTreeId,int64_t parentElementId)252     virtual void RegisterInteractionOperationAsChildTree(
253         uint32_t parentWindowId, int32_t parentTreeId, int64_t parentElementId) {};
SetAccessibilityGetParentRectHandler(std::function<void (int32_t &,int32_t &)> && callback)254     virtual void SetAccessibilityGetParentRectHandler(std::function<void(int32_t &, int32_t &)> &&callback) {};
SetAccessibilityGetParentRectHandler(std::function<void (AccessibilityParentRectInfo &)> && callback)255     virtual void SetAccessibilityGetParentRectHandler(
256         std::function<void(AccessibilityParentRectInfo &)> &&callback) {};
DeregisterInteractionOperationAsChildTree()257     virtual void DeregisterInteractionOperationAsChildTree() {};
SendEventToAccessibilityWithNode(const AccessibilityEvent & accessibilityEvent,const RefPtr<AceType> & node,const RefPtr<PipelineBase> & context)258     virtual void SendEventToAccessibilityWithNode(const AccessibilityEvent& accessibilityEvent,
259         const RefPtr<AceType>& node, const RefPtr<PipelineBase>& context) {};
260 
RegisterAccessibilitySAObserverCallback(int64_t elementId,const std::shared_ptr<AccessibilitySAObserverCallback> & callback)261     virtual void RegisterAccessibilitySAObserverCallback(
262         int64_t elementId, const std::shared_ptr<AccessibilitySAObserverCallback> &callback) {};
263 
DeregisterAccessibilitySAObserverCallback(int64_t elementId)264     virtual void DeregisterAccessibilitySAObserverCallback(int64_t elementId) {};
265 
RegisterInteractionOperationAsChildTree(const Registration & registration)266     virtual bool RegisterInteractionOperationAsChildTree(
267         const Registration& registration) { return false; };
DeregisterInteractionOperationAsChildTree(uint32_t windowId,int32_t treeId)268     virtual bool DeregisterInteractionOperationAsChildTree(
269         uint32_t windowId, int32_t treeId) { return false; };
270 
TransferThirdProviderHoverEvent(const WeakPtr<NG::FrameNode> & hostNode,const NG::PointF & point,SourceType source,NG::AccessibilityHoverEventType eventType,TimeStamp time)271     virtual void TransferThirdProviderHoverEvent(
272         const WeakPtr<NG::FrameNode>& hostNode, const NG::PointF &point, SourceType source,
273         NG::AccessibilityHoverEventType eventType, TimeStamp time) {};
274 
OnDumpChildInfoForThird(int64_t hostElementId,const std::vector<std::string> & params,std::vector<std::string> & info)275     virtual bool OnDumpChildInfoForThird(
276         int64_t hostElementId, const std::vector<std::string> &params, std::vector<std::string> &info)
277     {
278         return false;
279     }
280 
FireAccessibilityEventCallback(uint32_t eventId,int64_t parameter)281     virtual void FireAccessibilityEventCallback(uint32_t eventId, int64_t parameter) {}
282 
IsRegister()283     bool IsRegister()
284     {
285         return isReg_;
286     }
287 
Register(bool state)288     void Register(bool state)
289     {
290         isReg_ = state;
291     }
292 
GetTreeId()293     int32_t GetTreeId() const
294     {
295         return treeId_;
296     }
297 
SetUiextensionId(int64_t uiExtensionId)298     void SetUiextensionId(int64_t uiExtensionId)
299     {
300         uiExtensionId_  = uiExtensionId;
301     }
302 
GetUiextensionId()303     int64_t GetUiextensionId() const
304     {
305         return uiExtensionId_;
306     }
307 
GenerateWindowInfo(const RefPtr<NG::FrameNode> & node,const RefPtr<PipelineBase> & context)308     virtual AccessibilityWindowInfo GenerateWindowInfo(const RefPtr<NG::FrameNode>& node,
309         const RefPtr<PipelineBase>& context)
310     {
311         return AccessibilityWindowInfo();
312     }
313 
UpdateWindowInfo(AccessibilityWindowInfo & windowInfo,const RefPtr<PipelineBase> & context)314     virtual void UpdateWindowInfo(AccessibilityWindowInfo& windowInfo, const RefPtr<PipelineBase>& context) {}
315 
GenerateAccessibilityWorkMode()316     virtual AccessibilityWorkMode GenerateAccessibilityWorkMode()
317     {
318         return AccessibilityWorkMode();
319     }
320 
321 protected:
322     int32_t treeId_ = 0;
323 
324 private:
325     AccessibilityVersion version_ = AccessibilityVersion::JS_VERSION;
326     bool isReg_ = false;
327     int64_t uiExtensionId_ = 0;
328 };
329 
330 } // namespace OHOS::Ace
331 
332 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H
333