• 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     std::map<int32_t, AccessibilityWindowInfo> a11yWindows_ {};
87     int32_t activeWindowId_ = INVALID_WINDOW_ID;
88     int32_t a11yFocusedWindowId_ = INVALID_WINDOW_ID;
89     std::set<int32_t> subWindows_ {}; // used for window id 1, scene board
90 
91     // used for arkui windowId 1 map to WMS windowId
92     class SceneBoardElementIdMap {
93     public:
94         SceneBoardElementIdMap() = default;
95         ~SceneBoardElementIdMap() = default;
96         void InsertPair(const int32_t windowId, const int64_t elementId);
97         void RemovePair(const int32_t windowId);
98         bool CheckWindowIdPair(const int32_t windowId);
99         std::map<int32_t, int64_t> GetAllPairs();
100         void Clear();
101     private:
102         std::map<int32_t, int64_t> windowElementMap_;
103         ffrt::mutex mapMutex_;
104     };
105     SceneBoardElementIdMap sceneBoardElementIdMap_ = {};
106 
107 private:
108     class AccessibilityWindowListener : public Rosen::IWindowUpdateListener {
109     public:
AccessibilityWindowListener(AccessibilityWindowManager & windInfoMgr)110         explicit AccessibilityWindowListener(AccessibilityWindowManager &windInfoMgr)
111             : windInfoMgr_(windInfoMgr) {}
112         ~AccessibilityWindowListener() = default;
113 
OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos,Rosen::WindowUpdateType type)114         virtual void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos,
115             Rosen::WindowUpdateType type) override
116         {
117             windInfoMgr_.OnWindowUpdate(infos, type);
118         }
119 
120     private:
121         AccessibilityWindowManager &windInfoMgr_;
122     };
123 
124     bool CompareRect(const Rect &rectAccessibility, const Rosen::Rect &rectWindow);
125     bool EqualFocus(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
126         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
127     bool EqualBound(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
128         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
129     bool EqualProperty(Accessibility::AccessibilityWindowInfo &accWindowInfo,
130         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
131     bool EqualLayer(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
132         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
133     void WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
134     void WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
135     void WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
136     void WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
137     void WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
138     void WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
139     void WindowUpdateTypeEvent(const int32_t realWidId, std::map<int32_t,
140         AccessibilityWindowInfo> &oldA11yWindows_, Accessibility::WindowUpdateType type);
141     void WindowUpdateTypeEventAdded(const int32_t realWidId,
142         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
143     void WindowUpdateTypeEventRemoved(const int32_t realWidId,
144         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
145     void WindowUpdateTypeEventBounds(const int32_t realWidId,
146         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
147     void WindowUpdateTypeEventFocused(const int32_t realWidId,
148         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
149     void WindowUpdateTypeEventProperty(const int32_t realWidId,
150         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
151     void WindowUpdateTypeEventLayer(const int32_t realWidId,
152         std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_);
153     void WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
154     void WindowUpdateAllExec(std::map<int32_t, AccessibilityWindowInfo> &oldA11yWindows_,
155         int32_t realWid, const sptr<Rosen::AccessibilityWindowInfo>& window);
156     void ClearOldActiveWindow();
157 
158     sptr<AccessibilityWindowListener> windowListener_ = nullptr;
159     std::shared_ptr<AppExecFwk::EventHandler> eventHandler_ = nullptr;
160     ffrt::recursive_mutex interfaceMutex_; // mutex for interface to make sure AccessibilityWindowManager thread-safe
161     SafeMap<int32_t, int32_t> windowTreeIdMap_; // map for tree id to window id
162 };
163 } // namespace Accessibility
164 } // namespace OHOS
165 #endif // ACCESSIBILITY_WINDOW_MANGER_H