• 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 ACCESSIBILITY_WINDOW_MANGER_H
17 #define ACCESSIBILITY_WINDOW_MANGER_H
18 
19 #include <map>
20 #include <memory>
21 #include <set>
22 #include "accessibility_window_info.h"
23 #include "event_handler.h"
24 #include "ffrt.h"
25 #include "singleton.h"
26 #include "window_manager.h"
27 #include "safe_map.h"
28 
29 namespace OHOS {
30 namespace Accessibility {
31 
32 constexpr int32_t SCENE_BOARD_WINDOW_ID = 1; // default scene board window id 1
33 constexpr int64_t INVALID_SCENE_BOARD_ELEMENT_ID = -1; // invalid scene board element id -1
34 
35 class AccessibilityWindowManager {
36     DECLARE_SINGLETON(AccessibilityWindowManager)
37 public:
38     bool Init();
39     void DeInit();
40     void WinDeInit();
41     static AccessibilityWindowInfo CreateAccessibilityWindowInfo(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
42     static void UpdateAccessibilityWindowInfo(AccessibilityWindowInfo &accWindowInfo,
43         const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
44     static bool CheckIntegerOverflow(const Rosen::Rect& rect);
45     int32_t ConvertToRealWindowId(int32_t windowId, int32_t focusType);
46     void RegisterWindowListener(const std::shared_ptr<AppExecFwk::EventHandler> &handler);
47     void DeregisterWindowListener();
48     void SetActiveWindow(int32_t windowId, bool isSendEvent = true);
49     int32_t GetActiveWindowId();
50     void SetAccessibilityFocusedWindow(int32_t windowId);
51     std::vector<AccessibilityWindowInfo> GetAccessibilityWindows();
52     bool GetAccessibilityWindow(int32_t windowId, AccessibilityWindowInfo &window);
53     std::string GetA11yWindowsBundleName(int32_t windowId, std::string bundleName);
54     void SetEventInfoBundleName(const AccessibilityEventInfo &uiEvent);
55     void SetEventInfoBundleNameOld(const AccessibilityEventInfo &uiEvent, const int32_t windowId,
56         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
57     bool IsValidWindow(int32_t windowId);
58     void ClearAccessibilityFocused();
59 
60     // used for window id 1, scene board
61     int64_t GetSceneBoardElementId(const int32_t windowId, const int64_t elementId);
62     int32_t GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
63     bool IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
64     bool IsScenePanel(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
65 
66     // used for batch query, provide window and element id translation
67     void GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId);
68     void GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId, int32_t& innerWid);
69 
70     RetError GetFocusedWindowId(int32_t &focusedWindowId);
71 
72     // test for ut to resize a window
73     void SetWindowSize(int32_t windowId, Rect rect);
74 
75     void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos, Rosen::WindowUpdateType type);
76 
77     bool IsInnerWindowRootElement(int64_t elementId);
78 
79     void InsertTreeIdWindowIdPair(int32_t treeId, int32_t windowId);
80 
81     void RemoveTreeIdWindowIdPair(int32_t treeId);
82 
83     // return 0 when not found
84     int32_t FindTreeIdWindowIdPair(int32_t treeId);
85 
86     bool CheckEvents();
87 
88     std::map<int32_t, AccessibilityWindowInfo> a11yWindows_ {};
89     int32_t activeWindowId_ = INVALID_WINDOW_ID;
90     int32_t a11yFocusedWindowId_ = INVALID_WINDOW_ID;
91     std::set<int32_t> subWindows_ {}; // used for window id 1, scene board
92 
93     // used for arkui windowId 1 map to WMS windowId
94     class SceneBoardElementIdMap {
95     public:
96         SceneBoardElementIdMap() = default;
97         ~SceneBoardElementIdMap() = default;
98         void InsertPair(const int32_t windowId, const int64_t elementId);
99         void RemovePair(const int32_t windowId);
100         bool CheckWindowIdPair(const int32_t windowId);
101         std::map<int32_t, int64_t> GetAllPairs();
102         void Clear();
103     private:
104         std::map<int32_t, int64_t> windowElementMap_;
105         ffrt::mutex mapMutex_;
106     };
107     SceneBoardElementIdMap sceneBoardElementIdMap_ = {};
108 
109 private:
110     class AccessibilityWindowListener : public Rosen::IWindowUpdateListener {
111     public:
AccessibilityWindowListener(AccessibilityWindowManager & windInfoMgr)112         explicit AccessibilityWindowListener(AccessibilityWindowManager &windInfoMgr)
113             : windInfoMgr_(windInfoMgr) {}
114         ~AccessibilityWindowListener() = default;
115 
OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos,Rosen::WindowUpdateType type)116         virtual void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos,
117             Rosen::WindowUpdateType type) override
118         {
119             windInfoMgr_.OnWindowUpdate(infos, type);
120         }
121 
122     private:
123         AccessibilityWindowManager &windInfoMgr_;
124     };
125 
126     class WindowRotationChangeListener : public Rosen::IWindowRotationChangeListener {
127     public:
128         explicit WindowRotationChangeListener();
129         ~WindowRotationChangeListener() = default;
130 
131         virtual void OnRotationChange(const Rosen::RotationChangeInfo& rotationChangeInfo,
132             Rosen::RotationChangeResult& rotationChangeResult) override;
133     };
134 
135     bool CompareRect(const Rect &rectAccessibility, const Rosen::Rect &rectWindow);
136     bool EqualFocus(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
137         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
138     bool EqualBound(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
139         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
140     bool EqualProperty(Accessibility::AccessibilityWindowInfo &accWindowInfo,
141         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
142     bool EqualLayer(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
143         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
144     void WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
145     void WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
146     void WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
147     void WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
148     void WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
149     void WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
150     void WindowUpdateTypeEvent(const int32_t realWidId, std::map<int32_t,
151         AccessibilityWindowInfo> &oldA11yWindows_, Accessibility::WindowUpdateType type);
152     void WindowUpdateTypeEventAdded(const int32_t realWidId,
153         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
154     void WindowUpdateTypeEventRemoved(const int32_t realWidId,
155         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
156     void WindowUpdateTypeEventBounds(const int32_t realWidId,
157         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
158     void WindowUpdateTypeEventFocused(const int32_t realWidId,
159         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
160     void WindowUpdateTypeEventProperty(const int32_t realWidId,
161         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
162     void WindowUpdateTypeEventLayer(const int32_t realWidId,
163         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
164     void WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
165     void WindowUpdateAllExec(std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_,
166         int32_t realWid, const sptr<Rosen::AccessibilityWindowInfo>& window);
167     void ClearOldActiveWindow();
168 
169     sptr<AccessibilityWindowListener> windowListener_ = nullptr;
170     std::shared_ptr<AppExecFwk::EventHandler> eventHandler_ = nullptr;
171     ffrt::recursive_mutex interfaceMutex_; // mutex for interface to make sure AccessibilityWindowManager thread-safe
172     SafeMap<int32_t, int32_t> windowTreeIdMap_; // map for tree id to window id
173 };
174 } // namespace Accessibility
175 } // namespace OHOS
176 #endif // ACCESSIBILITY_WINDOW_MANGER_H