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 <mutex>
22 #include <set>
23 #include "accessibility_window_info.h"
24 #include "event_handler.h"
25 #include "singleton.h"
26 #include "window_manager.h"
27 #include "ffrt.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     void SetAccessibilityFocusedWindow(int32_t windowId);
50     std::vector<AccessibilityWindowInfo> GetAccessibilityWindows();
51     bool GetAccessibilityWindow(int32_t windowId, AccessibilityWindowInfo &window);
52     bool IsValidWindow(int32_t windowId);
53     void ClearAccessibilityFocused();
54 
55     // used for window id 1, scene board
56     int64_t GetSceneBoardElementId(const int32_t windowId, const int64_t elementId);
57     int32_t GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
58     bool IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
59 
60     // used for batch query, provide window and element id translation
61     void GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId);
62     void GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId, int32_t& innerWid);
63 
64     RetError GetFocusedWindowId(int32_t &focusedWindowId);
65 
66     // test for ut to resize a window
67     void SetWindowSize(int32_t windowId, Rect rect);
68 
69     void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos, Rosen::WindowUpdateType type);
70 
71     bool IsInnerWindowRootElement(int64_t elementId);
72 
73     std::map<int32_t, AccessibilityWindowInfo> a11yWindows_ {};
74     int32_t activeWindowId_ = INVALID_WINDOW_ID;
75     int32_t a11yFocusedWindowId_ = INVALID_WINDOW_ID;
76     std::set<int32_t> subWindows_ {}; // used for window id 1, scene board
77 
78     // used for arkui windowId 1 map to WMS windowId
79     class SceneBoardElementIdMap {
80     public:
81         SceneBoardElementIdMap() = default;
82         ~SceneBoardElementIdMap() = default;
83         void InsertPair(const int32_t windowId, const int64_t elementId);
84         void RemovePair(const int32_t windowId);
85         bool CheckWindowIdPair(const int32_t windowId);
86         std::map<int32_t, int64_t> GetAllPairs();
87         void Clear();
88     private:
89         std::map<int32_t, int64_t> windowElementMap_;
90         std::mutex mapMutex_;
91     };
92     SceneBoardElementIdMap sceneBoardElementIdMap_ = {};
93 
94 private:
95     class AccessibilityWindowListener : public Rosen::IWindowUpdateListener {
96     public:
AccessibilityWindowListener(AccessibilityWindowManager & windInfoMgr)97         explicit AccessibilityWindowListener(AccessibilityWindowManager &windInfoMgr)
98             : windInfoMgr_(windInfoMgr) {}
99         ~AccessibilityWindowListener() = default;
100 
OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos,Rosen::WindowUpdateType type)101         virtual void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos,
102             Rosen::WindowUpdateType type) override
103         {
104             windInfoMgr_.OnWindowUpdate(infos, type);
105         }
106 
107     private:
108         AccessibilityWindowManager &windInfoMgr_;
109     };
110 
111     bool CompareRect(const Rect &rectAccessibility, const Rosen::Rect &rectWindow);
112     bool EqualFocus(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
113         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
114     bool EqualBound(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
115         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
116     bool EqualProperty(Accessibility::AccessibilityWindowInfo &accWindowInfo,
117         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
118     void WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
119     void WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
120     void WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
121     void WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
122     void WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
123     void WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
124     void WindowUpdateTypeEvent(const int32_t realWidId, Accessibility::WindowUpdateType type);
125     void WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
126     void ClearOldActiveWindow();
127 
128     sptr<AccessibilityWindowListener> windowListener_ = nullptr;
129     std::shared_ptr<AppExecFwk::EventHandler> eventHandler_ = nullptr;
130     ffrt::recursive_mutex interfaceMutex_; // mutex for interface to make sure AccessibilityWindowManager thread-safe
131 };
132 } // namespace Accessibility
133 } // namespace OHOS
134 #endif // ACCESSIBILITY_WINDOW_MANGER_H