• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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