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 void RegisterSubWindowInteractionOperation(int windowId) override; 47 48 void UpdateViewScale(); 49 GetScaleX()50 float GetScaleX() const 51 { 52 return scaleX_; 53 } 54 GetScaleY()55 float GetScaleY() const 56 { 57 return scaleY_; 58 } 59 GetWindowId()60 uint32_t GetWindowId() const 61 { 62 return windowId_; 63 } 64 SetWindowId(uint32_t windowId)65 void SetWindowId(uint32_t windowId) 66 { 67 windowId_ = windowId; 68 } 69 70 bool IsRegister(); 71 void Register(bool state); 72 bool SubscribeToastObserver(); 73 bool UnsubscribeToastObserver(); 74 bool SubscribeStateObserver(int eventType); 75 bool UnsubscribeStateObserver(int eventType); 76 int RegisterInteractionOperation(int windowId); 77 void DeregisterInteractionOperation(); 78 bool SendAccessibilitySyncEvent( 79 const AccessibilityEvent& accessibilityEvent, Accessibility::AccessibilityEventInfo eventInfo); 80 81 void SearchElementInfoByAccessibilityId(const int32_t elementId, const int32_t requestId, 82 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode, const int32_t windowId); 83 void SearchElementInfosByText(const int32_t elementId, const std::string& text, const int32_t requestId, 84 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 85 void FindFocusedElementInfo(const int32_t elementId, const int32_t focusType, const int32_t requestId, 86 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 87 void FocusMoveSearch(const int32_t elementId, const int32_t direction, const int32_t requestId, 88 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 89 struct ActionParam { 90 Accessibility::ActionType action; 91 std::map<std::string, std::string> actionArguments; 92 }; 93 void ExecuteAction(const int32_t accessibilityId, const ActionParam& param, const int32_t requestId, 94 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t windowId); 95 bool ClearCurrentFocus(); 96 void UpdateNodeChildIds(const RefPtr<AccessibilityNode>& node); 97 void SendActionEvent(const Accessibility::ActionType& action, NodeId nodeId); 98 99 std::string GetPagePath(); 100 101 protected: 102 void DumpHandleEvent(const std::vector<std::string>& params) override; 103 void DumpProperty(const std::vector<std::string>& params) override; 104 void DumpTree(int32_t depth, NodeId nodeID) override; 105 106 private: 107 class JsInteractionOperation : public Accessibility::AccessibilityElementOperator { 108 public: JsInteractionOperation(int32_t windowId)109 explicit JsInteractionOperation(int32_t windowId) : windowId_(windowId) {} 110 virtual ~JsInteractionOperation() = default; 111 // Accessibility override. 112 void SearchElementInfoByAccessibilityId(const int32_t elementId, const int32_t requestId, 113 Accessibility::AccessibilityElementOperatorCallback& callback, const int32_t mode) override; 114 void SearchElementInfosByText(const int32_t elementId, const std::string& text, const int32_t requestId, 115 Accessibility::AccessibilityElementOperatorCallback& callback) override; 116 void FindFocusedElementInfo(const int32_t elementId, const int32_t focusType, const int32_t requestId, 117 Accessibility::AccessibilityElementOperatorCallback& callback) override; 118 void FocusMoveSearch(const int32_t elementId, const int32_t direction, const int32_t requestId, 119 Accessibility::AccessibilityElementOperatorCallback& callback) override; 120 void ExecuteAction(const int32_t elementId, const int32_t action, 121 const std::map<std::string, std::string>& actionArguments, const int32_t requestId, 122 Accessibility::AccessibilityElementOperatorCallback& callback) override; 123 void ClearFocus() override; 124 void OutsideTouch() override; 125 SetHandler(const WeakPtr<JsAccessibilityManager> & js)126 void SetHandler(const WeakPtr<JsAccessibilityManager>& js) 127 { 128 js_ = js; 129 } 130 GetHandler()131 const WeakPtr<JsAccessibilityManager>& GetHandler() const 132 { 133 return js_; 134 } 135 136 private: 137 WeakPtr<JsAccessibilityManager> js_; 138 uint32_t windowId_ = 0; 139 }; 140 class ToastAccessibilityConfigObserver : public AccessibilityConfig::AccessibilityConfigObserver { 141 public: 142 ToastAccessibilityConfigObserver() = default; 143 void OnConfigChanged( 144 const AccessibilityConfig::CONFIG_ID id, const AccessibilityConfig::ConfigValue& value) override; 145 }; 146 147 class JsAccessibilityStateObserver : public Accessibility::AccessibilityStateObserver { 148 public: 149 void OnStateChanged(const bool state) override; SetHandler(const WeakPtr<JsAccessibilityManager> & js)150 void SetHandler(const WeakPtr<JsAccessibilityManager>& js) 151 { 152 js_ = js; 153 } 154 GetHandler()155 const WeakPtr<JsAccessibilityManager>& GetHandler() const 156 { 157 return js_; 158 } 159 160 private: 161 WeakPtr<JsAccessibilityManager> js_; 162 }; 163 164 bool AccessibilityActionEvent(const Accessibility::ActionType& action, 165 const std::map<std::string, std::string> actionArguments, const RefPtr<AccessibilityNode>& node, 166 const RefPtr<PipelineContext>& context); 167 bool RequestAccessibilityFocus(const RefPtr<AccessibilityNode>& node); 168 169 bool ClearAccessibilityFocus(const RefPtr<AccessibilityNode>& node); 170 171 void AddFocusableNode(std::list<RefPtr<AccessibilityNode>>& nodeList, const RefPtr<AccessibilityNode>& node); 172 bool CanAccessibilityFocused(const RefPtr<AccessibilityNode>& node); 173 RefPtr<AccessibilityNode> FindNodeInRelativeDirection( 174 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction); 175 RefPtr<AccessibilityNode> FindNodeInAbsoluteDirection( 176 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node, const int direction); 177 RefPtr<AccessibilityNode> GetNextFocusableNode( 178 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node); 179 RefPtr<AccessibilityNode> GetPreviousFocusableNode( 180 const std::list<RefPtr<AccessibilityNode>>& nodeList, RefPtr<AccessibilityNode>& node); 181 182 void SearchElementInfoByAccessibilityIdNG(int32_t elementId, int32_t mode, 183 std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context); 184 185 void SearchElementInfosByTextNG(int32_t elementId, const std::string& text, 186 std::list<Accessibility::AccessibilityElementInfo>& infos, const RefPtr<PipelineBase>& context); 187 188 void FindFocusedElementInfoNG(int32_t elementId, int32_t focusType, Accessibility::AccessibilityElementInfo& info, 189 const RefPtr<PipelineBase>& context); 190 191 void FocusMoveSearchNG(int32_t elementId, int32_t direction, Accessibility::AccessibilityElementInfo& info, 192 const RefPtr<PipelineBase>& context); 193 194 bool ExecuteActionNG(int32_t elementId, const std::map<std::string, std::string>& actionArguments, 195 Accessibility::ActionType action, const RefPtr<PipelineBase>& context); 196 197 void SetSearchElementInfoByAccessibilityIdResult(Accessibility::AccessibilityElementOperatorCallback& callback, 198 const std::list<Accessibility::AccessibilityElementInfo>& infos, const int32_t requestId); 199 200 void SetSearchElementInfoByTextResult(Accessibility::AccessibilityElementOperatorCallback& callback, 201 const std::list<Accessibility::AccessibilityElementInfo>& infos, const int32_t requestId); 202 203 void SetFindFocusedElementInfoResult(Accessibility::AccessibilityElementOperatorCallback& callback, 204 const Accessibility::AccessibilityElementInfo& info, const int32_t requestId); 205 206 void SetFocusMoveSearchResult(Accessibility::AccessibilityElementOperatorCallback& callback, 207 const Accessibility::AccessibilityElementInfo& info, const int32_t requestId); 208 209 void SetExecuteActionResult( 210 Accessibility::AccessibilityElementOperatorCallback& callback, const bool succeeded, const int32_t requestId); 211 212 void DumpProperty(const RefPtr<AccessibilityNode>& node); 213 void DumpPropertyNG(const std::vector<std::string>& params); 214 RefPtr<NG::PipelineContext> FindPipelineByElementId(const int32_t elementId, RefPtr<NG::FrameNode>& node); 215 RefPtr<NG::FrameNode> FindNodeFromPipeline(const WeakPtr<PipelineBase>& context, const int32_t elementId); 216 RefPtr<PipelineBase> GetPipelineByWindowId(const int32_t windowId); 217 void ProcessParameters(Accessibility::ActionType op, const std::vector<std::string>& params, 218 std::map<std::string, std::string>& paramsMap); 219 220 std::string callbackKey_; 221 uint32_t windowId_ = 0; 222 bool isReg_ = false; 223 std::shared_ptr<JsAccessibilityStateObserver> stateObserver_ = nullptr; 224 std::shared_ptr<ToastAccessibilityConfigObserver> toastObserver_ = nullptr; 225 float scaleX_ = 1.0f; 226 float scaleY_ = 1.0f; 227 NodeId currentFocusNodeId_ = -1; 228 }; 229 230 } // namespace OHOS::Ace::Framework 231 232 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_ACCESSIBILITY_JS_ACCESSIBILITY_MANAGER_H 233