1 /* 2 * Copyright (c) 2022 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_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H 18 19 #include <unordered_map> 20 #include <unordered_set> 21 #include <vector> 22 23 #include "accessibility_config.h" 24 #include "accessibility_element_operator.h" 25 #include "accessibility_event_info.h" 26 #include "accessibility_state_event.h" 27 28 #include "core/accessibility/accessibility_manager.h" 29 #include "core/accessibility/accessibility_utils.h" 30 #include "frameworks/bridge/common/accessibility/accessibility_node_manager.h" 31 32 namespace OHOS::Ace::Framework { 33 34 class JsAccessibilityManager : public AccessibilityNodeManager { 35 DECLARE_ACE_TYPE(JsAccessibilityManager, AccessibilityNodeManager); 36 37 public: 38 JsAccessibilityManager() = default; 39 ~JsAccessibilityManager() override; 40 41 // JsAccessibilityManager overrides functions. 42 void InitializeCallback() override; 43 void SendAccessibilityAsyncEvent(const AccessibilityEvent& accessibilityEvent) override; 44 void SetCardViewParams(const std::string& key, bool focus) override; 45 void HandleComponentPostBinding() override; 46 47 void UpdateViewScale(); 48 GetScaleX()49 float GetScaleX() const 50 { 51 return scaleX_; 52 } 53 GetScaleY()54 float GetScaleY() const 55 { 56 return scaleY_; 57 } 58 GetWindowId()59 int GetWindowId() const 60 { 61 return windowId_; 62 } 63 SetWindowId(const int windowId)64 void SetWindowId(const int windowId) 65 { 66 windowId_ = windowId; 67 } 68 69 bool IsRegister(); 70 void Register(bool state); 71 virtual bool SubscribeToastObserver(); 72 virtual bool UnsubscribeToastObserver(); 73 virtual bool SubscribeStateObserver(const int eventType); 74 virtual bool UnsubscribeStateObserver(const int eventType); 75 virtual int RegisterInteractionOperation(const int windowId); 76 virtual void DeregisterInteractionOperation(); 77 virtual bool SendAccessibilitySyncEvent( 78 const AccessibilityEvent& accessibilityEvent, Accessibility::AccessibilityEventInfo eventInfo); 79 80 void SearchElementInfoByAccessibilityId(const int32_t elementId, const int32_t requestId, 81 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode); 82 void SearchElementInfosByText(const int32_t elementId, const std::string& text, const int32_t requestId, 83 Accessibility::AccessibilityElementOperatorCallback& callback); 84 void FindFocusedElementInfo(const int32_t elementId, const int32_t focusType, const int32_t requestId, 85 Accessibility::AccessibilityElementOperatorCallback& callback); 86 void FocusMoveSearch(const int32_t elementId, const int32_t direction, const int32_t requestId, 87 Accessibility::AccessibilityElementOperatorCallback& callback); 88 void ExecuteAction(const int32_t accessibilityId, const Accessibility::ActionType& action, 89 const std::map<std::string, std::string> actionArguments, const int32_t requestId, 90 Accessibility::AccessibilityElementOperatorCallback& callback); 91 bool ClearCurrentFocus(); 92 void UpdateNodeChildIds(const RefPtr<AccessibilityNode>& node); 93 void SendActionEvent(const Accessibility::ActionType& action, NodeId nodeId); 94 95 std::string GetPagePath(); 96 97 protected: 98 void DumpHandleEvent(const std::vector<std::string>& params) override; 99 void DumpProperty(const std::vector<std::string>& params) override; 100 void DumpTree(int32_t depth, NodeId nodeID) override; 101 102 private: 103 class JsInteractionOperation : public Accessibility::AccessibilityElementOperator { 104 public: 105 virtual ~JsInteractionOperation() = default; 106 // Accessibility override. 107 void SearchElementInfoByAccessibilityId(const int32_t elementId, const int32_t requestId, 108 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode) override; 109 void SearchElementInfosByText(const int32_t elementId, const std::string& text, const int32_t requestId, 110 Accessibility::AccessibilityElementOperatorCallback& callback) override; 111 void FindFocusedElementInfo(const int32_t elementId, const int32_t focusType, const int32_t requestId, 112 Accessibility::AccessibilityElementOperatorCallback& callback) override; 113 void FocusMoveSearch(const int32_t elementId, const int32_t direction, const int32_t requestId, 114 Accessibility::AccessibilityElementOperatorCallback& callback) override; 115 void ExecuteAction(const int32_t elementId, const int32_t action, 116 const std::map<std::string, std::string> &actionArguments, const int32_t requestId, 117 Accessibility::AccessibilityElementOperatorCallback& callback) override; 118 void ClearFocus() override; 119 void OutsideTouch() override; 120 SetHandler(const WeakPtr<JsAccessibilityManager> & js)121 void SetHandler(const WeakPtr<JsAccessibilityManager>& js) 122 { 123 js_ = js; 124 } 125 GetHandler()126 const WeakPtr<JsAccessibilityManager>& GetHandler() const 127 { 128 return js_; 129 } 130 131 private: 132 WeakPtr<JsAccessibilityManager> js_; 133 }; 134 class ToastAccessibilityConfigObserver : public AccessibilityConfig::AccessibilityConfigObserver { 135 public: 136 ToastAccessibilityConfigObserver() = default; 137 void OnConfigChanged( 138 const AccessibilityConfig::CONFIG_ID id, const AccessibilityConfig::ConfigValue& value) override; 139 }; 140 141 class JsAccessibilityStateObserver : public Accessibility::AccessibilityStateObserver { 142 public: 143 void OnStateChanged(const bool state) override; SetHandler(const WeakPtr<JsAccessibilityManager> & js)144 void SetHandler(const WeakPtr<JsAccessibilityManager>& js) 145 { 146 js_ = js; 147 } 148 GetHandler()149 const WeakPtr<JsAccessibilityManager>& GetHandler() const 150 { 151 return js_; 152 } 153 154 private: 155 WeakPtr<JsAccessibilityManager> js_; 156 }; 157 158 bool AccessibilityActionEvent(const Accessibility::ActionType& action, 159 const std::map<std::string, std::string> actionArguments, const RefPtr<AccessibilityNode>& node, 160 const RefPtr<PipelineContext>& context); 161 bool RequestAccessibilityFocus(const RefPtr<AccessibilityNode>& node); 162 163 bool ClearAccessibilityFocus(const RefPtr<AccessibilityNode>& node); 164 165 void AddFocusableNode(std::list<RefPtr<AccessibilityNode>>& nodeList, const RefPtr<AccessibilityNode>& node); 166 bool CanAccessibilityFocused(const RefPtr<AccessibilityNode>& node); 167 RefPtr<AccessibilityNode> FindNodeInRelativeDirection( 168 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction); 169 RefPtr<AccessibilityNode> FindNodeInAbsoluteDirection( 170 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction); 171 RefPtr<AccessibilityNode> GetNextFocusableNode( 172 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node); 173 RefPtr<AccessibilityNode> GetPreviousFocusableNode( 174 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node); 175 176 void SearchElementInfoByAccessibilityIdNG( 177 int32_t elementId, int32_t mode, std::list<Accessibility::AccessibilityElementInfo>& infos); 178 179 void SearchElementInfosByTextNG( 180 int32_t elementId, const std::string& text, std::list<Accessibility::AccessibilityElementInfo>& infos); 181 182 void FindFocusedElementInfoNG(int32_t elementId, int32_t focusType, Accessibility::AccessibilityElementInfo& info); 183 184 void FocusMoveSearchNG(int32_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info); 185 186 bool ExecuteActionNG(int32_t elementId, Accessibility::ActionType action); 187 188 void SetSearchElementInfoByAccessibilityIdResult(Accessibility::AccessibilityElementOperatorCallback& callback, 189 const std::list<Accessibility::AccessibilityElementInfo>& infos, const int32_t requestId); 190 191 void SetSearchElementInfoByTextResult(Accessibility::AccessibilityElementOperatorCallback& callback, 192 const std::list<Accessibility::AccessibilityElementInfo>& infos, const int32_t requestId); 193 194 void SetFindFocusedElementInfoResult(Accessibility::AccessibilityElementOperatorCallback& callback, 195 const Accessibility::AccessibilityElementInfo& info, const int32_t requestId); 196 197 void SetFocusMoveSearchResult(Accessibility::AccessibilityElementOperatorCallback& callback, 198 const Accessibility::AccessibilityElementInfo& info, const int32_t requestId); 199 200 void SetExecuteActionResult( 201 Accessibility::AccessibilityElementOperatorCallback& callback, const bool succeeded, const int32_t requestId); 202 203 std::string callbackKey_; 204 int windowId_ = 0; 205 bool isReg_ = false; 206 std::shared_ptr<JsAccessibilityStateObserver> stateObserver_ = nullptr; 207 std::shared_ptr<ToastAccessibilityConfigObserver> toastObserver_ = nullptr; 208 std::shared_ptr<JsInteractionOperation> interactionOperation_ = nullptr; 209 float scaleX_ = 1.0f; 210 float scaleY_ = 1.0f; 211 NodeId currentFocusNodeId_ = -1; 212 }; 213 214 } // namespace OHOS::Ace::Framework 215 216 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H 217