• 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 
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