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 enum class AccessibilityCallbackEventId : uint32_t {
78     ON_LOAD_PAGE = 0,
79     ON_SHOW = 1,
80     ON_HIDE = 2,
81     ON_SEND_ELEMENT_INFO_CHANGE = 3,
82 };
83 
84 struct AccessibilityCallbackEvent {
85     AccessibilityCallbackEventId eventId;
86     int64_t parameter;
AccessibilityCallbackEventAccessibilityCallbackEvent87     AccessibilityCallbackEvent(AccessibilityCallbackEventId id, int64_t para) : eventId(id), parameter(para) {}
88     bool operator < (const AccessibilityCallbackEvent& other) const
89     {
90         return std::tie(eventId, parameter) < std::tie(other.eventId, other.parameter);
91     }
92 };
93 
94 class AccessibilitySAObserverCallback {
95 public:
AccessibilitySAObserverCallback(int64_t accessibilityId)96     explicit AccessibilitySAObserverCallback(int64_t accessibilityId) : accessibilityId_(accessibilityId)
97     {}
98     virtual ~AccessibilitySAObserverCallback() = default;
99     virtual bool OnState(bool state) = 0;
100 
GetAccessibilityId()101     int64_t GetAccessibilityId() const
102     {
103         return accessibilityId_;
104     }
105 private:
106     int64_t accessibilityId_ = -1;
107 };
108 
109 class AccessibilityChildTreeCallback {
110 public:
AccessibilityChildTreeCallback(int64_t accessibilityId)111     explicit AccessibilityChildTreeCallback(int64_t accessibilityId) : accessibilityId_(accessibilityId)
112     {}
113     virtual ~AccessibilityChildTreeCallback() = default;
114     virtual bool OnRegister(uint32_t windowId, int32_t treeId) = 0;
115     virtual bool OnDeregister() = 0;
116     virtual bool OnSetChildTree(int32_t childWindowId, int32_t childTreeId) = 0;
117     virtual bool OnDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info) = 0;
118     virtual void OnClearRegisterFlag() = 0;
GetChildTreeId()119     int32_t GetChildTreeId() const
120     {
121         return childTreeId_;
122     }
SetChildTreeId(int32_t childTreeId)123     void SetChildTreeId(int32_t childTreeId)
124     {
125         childTreeId_ = childTreeId;
126     }
GetAccessibilityId()127     int64_t GetAccessibilityId() const
128     {
129         return accessibilityId_;
130     }
131 
132 private:
133     int32_t childTreeId_ = 0;
134     int64_t accessibilityId_ = -1;
135 };
136 
137 using VisibleRatioCallback = std::function<void(bool, double)>;
138 class AccessibilityManager : public AceType {
139     DECLARE_ACE_TYPE(AccessibilityManager, AceType);
140 
141 public:
142     AccessibilityManager() = default;
143     ~AccessibilityManager() override = default;
144 
145     virtual void SendAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent) = 0;
SendWebAccessibilityAsyncEvent(const AccessibilityEvent & accessibilityEvent,const RefPtr<NG::WebPattern> & webPattern)146     virtual void SendWebAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent,
147         const RefPtr<NG::WebPattern>& webPattern) {}
148     virtual void UpdateVirtualNodeFocus() = 0;
149     virtual int64_t GenerateNextAccessibilityId() = 0;
150     virtual RefPtr<AccessibilityNode> CreateSpecializedNode(
151         const std::string& tag, int32_t nodeId, int32_t parentNodeId) = 0;
152     virtual RefPtr<AccessibilityNode> CreateAccessibilityNode(
153         const std::string& tag, int32_t nodeId, int32_t parentNodeId, int32_t itemIndex) = 0;
154     virtual RefPtr<AccessibilityNode> GetAccessibilityNodeById(NodeId nodeId) const = 0;
155     virtual std::string GetInspectorNodeById(NodeId nodeId) const = 0;
156     virtual void RemoveAccessibilityNodes(RefPtr<AccessibilityNode>& node) = 0;
157     virtual void RemoveAccessibilityNodeById(NodeId nodeId) = 0;
158     virtual void ClearPageAccessibilityNodes(int32_t pageId) = 0;
159     virtual void SetRootNodeId(int32_t nodeId) = 0;
160     virtual void TrySaveTargetAndIdNode(
161         const std::string& id, const std::string& target, const RefPtr<AccessibilityNode>& node) = 0;
162     virtual void HandleComponentPostBinding() = 0;
163     virtual void OnDumpInfo(const std::vector<std::string>& params) = 0;
164     virtual void OnDumpInfoNG(const std::vector<std::string>& params, uint32_t windowId) = 0;
165     virtual void SetCardViewPosition(int id, float offsetX, float offsetY) = 0;
166     virtual void SetCardViewParams(const std::string& key, bool focus) = 0;
167     virtual void SetSupportAction(uint32_t action, bool isEnable) = 0;
168     virtual void ClearNodeRectInfo(RefPtr<AccessibilityNode>& node, bool isPopDialog) = 0;
169     virtual void AddComposedElement(const std::string& key, const RefPtr<ComposedElement>& node) = 0;
170     virtual void RemoveComposedElementById(const std::string& key) = 0;
171     virtual WeakPtr<ComposedElement> GetComposedElementFromPage(NodeId nodeId) = 0;
172     virtual void TriggerVisibleChangeEvent() = 0;
173     virtual void AddVisibleChangeNode(NodeId nodeId, double ratio, VisibleRatioCallback callback) = 0;
174     virtual void RemoveVisibleChangeNode(NodeId nodeId) = 0;
175     virtual bool IsVisibleChangeNodeExists(NodeId nodeId) = 0;
176     virtual void UpdateEventTarget(NodeId id, BaseEventInfo& info) = 0;
177     virtual void SetWindowPos(int32_t left, int32_t top, int32_t windowId) = 0;
178 #ifdef WINDOW_SCENE_SUPPORTED
179     virtual void SearchElementInfoByAccessibilityIdNG(int64_t elementId, int32_t mode,
180         std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
181         int64_t uiExtensionOffset) = 0;
182     virtual void SearchElementInfosByTextNG(int64_t elementId, const std::string& text,
183         std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context,
184         const int64_t uiExtensionOffset = 0) = 0;
185     virtual void FindFocusedElementInfoNG(int64_t elementId, int32_t focusType,
186         Accessibility::AccessibilityElementInfo& info, const RefPtr<PipelineBase>& context,
187         const int64_t uiExtensionOffset = 0) = 0;
188     virtual void FocusMoveSearchNG(int64_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info,
189         const RefPtr<PipelineBase>& context, const int64_t uiExtensionOffset = 0) = 0;
190     virtual bool ExecuteExtensionActionNG(int64_t elementId, const std::map<std::string, std::string>& actionArguments,
191         int32_t action, const RefPtr<PipelineBase>& context, int64_t uiExtensionOffset) = 0;
TransferAccessibilityAsyncEvent(const Accessibility::AccessibilityEventInfo & eventInfo,int64_t uiExtensionOffset)192     virtual bool TransferAccessibilityAsyncEvent(
193         const Accessibility::AccessibilityEventInfo& eventInfo, int64_t uiExtensionOffset)
194     {
195         return false;
196     }
SendExtensionAccessibilityEvent(const Accessibility::AccessibilityEventInfo & eventInfo,int64_t uiExtensionOffset)197     virtual void SendExtensionAccessibilityEvent(
198         const Accessibility::AccessibilityEventInfo& eventInfo, int64_t uiExtensionOffset) {}
199 #endif
200 #ifdef WEB_SUPPORTED
RegisterWebInteractionOperationAsChildTree(int64_t accessibilityId,const WeakPtr<NG::WebPattern> & webPattern)201     virtual bool RegisterWebInteractionOperationAsChildTree(int64_t accessibilityId,
202         const WeakPtr<NG::WebPattern>& webPattern)
203     {
204         return false;
205     }
DeregisterWebInteractionOperationAsChildTree(int32_t treeId)206     virtual bool DeregisterWebInteractionOperationAsChildTree(int32_t treeId)
207     {
208         return false;
209     }
210 #endif
SetVersion(AccessibilityVersion version)211     void SetVersion(AccessibilityVersion version)
212     {
213         version_ = version;
214     }
GetVersion()215     AccessibilityVersion GetVersion()
216     {
217         return version_;
218     }
219 
RegisterAccessibilityChildTreeCallback(int64_t elementId,const std::shared_ptr<AccessibilityChildTreeCallback> & callback)220     virtual void RegisterAccessibilityChildTreeCallback(
221         int64_t elementId, const std::shared_ptr<AccessibilityChildTreeCallback> &callback) {};
222 
DeregisterAccessibilityChildTreeCallback(int64_t elementId)223     virtual void DeregisterAccessibilityChildTreeCallback(int64_t elementId) {};
224 
RegisterInteractionOperationAsChildTree(uint32_t parentWindowId,int32_t parentTreeId,int64_t parentElementId)225     virtual void RegisterInteractionOperationAsChildTree(
226         uint32_t parentWindowId, int32_t parentTreeId, int64_t parentElementId) {};
SetAccessibilityGetParentRectHandler(std::function<void (int32_t &,int32_t &)> && callback)227     virtual void SetAccessibilityGetParentRectHandler(std::function<void(int32_t &, int32_t &)> &&callback) {};
DeregisterInteractionOperationAsChildTree()228     virtual void DeregisterInteractionOperationAsChildTree() {};
SendEventToAccessibilityWithNode(const AccessibilityEvent & accessibilityEvent,const RefPtr<AceType> & node,const RefPtr<PipelineBase> & context)229     virtual void SendEventToAccessibilityWithNode(const AccessibilityEvent& accessibilityEvent,
230         const RefPtr<AceType>& node, const RefPtr<PipelineBase>& context) {};
231 
RegisterAccessibilitySAObserverCallback(int64_t elementId,const std::shared_ptr<AccessibilitySAObserverCallback> & callback)232     virtual void RegisterAccessibilitySAObserverCallback(
233         int64_t elementId, const std::shared_ptr<AccessibilitySAObserverCallback> &callback) {};
234 
DeregisterAccessibilitySAObserverCallback(int64_t elementId)235     virtual void DeregisterAccessibilitySAObserverCallback(int64_t elementId) {};
236 
RegisterInteractionOperationAsChildTree(const Registration & registration)237     virtual bool RegisterInteractionOperationAsChildTree(
238         const Registration& registration) { return false; };
DeregisterInteractionOperationAsChildTree(uint32_t windowId,int32_t treeId)239     virtual bool DeregisterInteractionOperationAsChildTree(
240         uint32_t windowId, int32_t treeId) { return false; };
241 
TransferThirdProviderHoverEvent(const WeakPtr<NG::FrameNode> & hostNode,const NG::PointF & point,SourceType source,NG::AccessibilityHoverEventType eventType,TimeStamp time)242     virtual void TransferThirdProviderHoverEvent(
243         const WeakPtr<NG::FrameNode>& hostNode, const NG::PointF &point, SourceType source,
244         NG::AccessibilityHoverEventType eventType, TimeStamp time) {};
245 
OnDumpChildInfoForThird(int64_t hostElementId,const std::vector<std::string> & params,std::vector<std::string> & info)246     virtual bool OnDumpChildInfoForThird(
247         int64_t hostElementId, const std::vector<std::string> &params, std::vector<std::string> &info)
248     {
249         return false;
250     }
251 
FireAccessibilityEventCallback(uint32_t eventId,int64_t parameter)252     virtual void FireAccessibilityEventCallback(uint32_t eventId, int64_t parameter) {}
253 
IsRegister()254     bool IsRegister()
255     {
256         return isReg_;
257     }
258 
Register(bool state)259     void Register(bool state)
260     {
261         isReg_ = state;
262     }
263 
GetTreeId()264     int32_t GetTreeId() const
265     {
266         return treeId_;
267     }
268 
SetUiextensionId(int64_t uiExtensionId)269     void SetUiextensionId(int64_t uiExtensionId)
270     {
271         uiExtensionId_  = uiExtensionId;
272     }
273 
GetUiextensionId()274     int64_t GetUiextensionId() const
275     {
276         return uiExtensionId_;
277     }
278 
279 protected:
280     int32_t treeId_ = 0;
281 
282 private:
283     AccessibilityVersion version_ = AccessibilityVersion::JS_VERSION;
284     bool isReg_ = false;
285     int64_t uiExtensionId_ = 0;
286 };
287 
288 } // namespace OHOS::Ace
289 
290 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_ACCESSIBILITY_ACCESSIBILITY_MANAGER_H
291