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> ¶ms, 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