• 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 <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 
28 namespace OHOS {
29 namespace Accessibility {
30 
31 constexpr int32_t SCENE_BOARD_WINDOW_ID = 1; // default scene board window id 1
32 constexpr int64_t INVALID_SCENE_BOARD_ELEMENT_ID = -1; // invalid scene board element id -1
33 
34 class AccessibilityWindowManager {
35     DECLARE_SINGLETON(AccessibilityWindowManager)
36 public:
37     bool Init();
38     void DeInit();
39     void WinDeInit();
40     static AccessibilityWindowInfo CreateAccessibilityWindowInfo(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
41     static void UpdateAccessibilityWindowInfo(AccessibilityWindowInfo &accWindowInfo,
42         const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
43     static bool CheckIntegerOverflow(const Rosen::Rect& rect);
44     int32_t ConvertToRealWindowId(int32_t windowId, int32_t focusType);
45     void RegisterWindowListener(const std::shared_ptr<AppExecFwk::EventHandler> &handler);
46     void DeregisterWindowListener();
47     void SetActiveWindow(int32_t windowId, bool isSendEvent = true);
48     void SetAccessibilityFocusedWindow(int32_t windowId);
49     std::vector<AccessibilityWindowInfo> GetAccessibilityWindows();
50     bool GetAccessibilityWindow(int32_t windowId, AccessibilityWindowInfo &window);
51     bool IsValidWindow(int32_t windowId);
52     void ClearAccessibilityFocused();
53 
54     // used for window id 1, scene board
55     int64_t GetSceneBoardElementId(const int32_t windowId, const int64_t elementId);
56     int32_t GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
57     bool IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
58 
59     // used for batch query, provide window and element id translation
60     void GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId);
61     void GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId, int32_t& innerWid);
62 
63     RetError GetFocusedWindowId(int32_t &focusedWindowId);
64 
65     // test for ut to resize a window
66     void SetWindowSize(int32_t windowId, Rect rect);
67 
68     void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos, Rosen::WindowUpdateType type);
69 
70     bool IsInnerWindowRootElement(int64_t elementId);
71 
72     std::map<int32_t, AccessibilityWindowInfo> a11yWindows_ {};
73     int32_t activeWindowId_ = INVALID_WINDOW_ID;
74     int32_t a11yFocusedWindowId_ = INVALID_WINDOW_ID;
75     std::set<int32_t> subWindows_ {}; // used for window id 1, scene board
76 
77     // used for arkui windowId 1 map to WMS windowId
78     class SceneBoardElementIdMap {
79     public:
80         SceneBoardElementIdMap() = default;
81         ~SceneBoardElementIdMap() = default;
82         void InsertPair(const int32_t windowId, const int64_t elementId);
83         void RemovePair(const int32_t windowId);
84         bool CheckWindowIdPair(const int32_t windowId);
85         std::map<int32_t, int64_t> GetAllPairs();
86         void Clear();
87     private:
88         std::map<int32_t, int64_t> windowElementMap_;
89         std::mutex mapMutex_;
90     };
91     SceneBoardElementIdMap sceneBoardElementIdMap_ = {};
92 
93 private:
94     class AccessibilityWindowListener : public Rosen::IWindowUpdateListener {
95     public:
AccessibilityWindowListener(AccessibilityWindowManager & windInfoMgr)96         explicit AccessibilityWindowListener(AccessibilityWindowManager &windInfoMgr)
97             : windInfoMgr_(windInfoMgr) {}
98         ~AccessibilityWindowListener() = default;
99 
OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos,Rosen::WindowUpdateType type)100         virtual void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos,
101             Rosen::WindowUpdateType type) override
102         {
103             windInfoMgr_.OnWindowUpdate(infos, type);
104         }
105 
106     private:
107         AccessibilityWindowManager &windInfoMgr_;
108     };
109 
110     bool CompareRect(const Rect &rectAccessibility, const Rosen::Rect &rectWindow);
111     bool EqualFocus(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
112         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
113     bool EqualBound(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
114         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
115     bool EqualProperty(Accessibility::AccessibilityWindowInfo &accWindowInfo,
116         const sptr<Rosen::AccessibilityWindowInfo> &windowInfo);
117     void WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
118     void WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
119     void WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
120     void WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
121     void WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
122     void WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
123     void WindowUpdateTypeEvent(const int32_t realWidId, Accessibility::WindowUpdateType type);
124     void WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
125     void ClearOldActiveWindow();
126 
127     sptr<AccessibilityWindowListener> windowListener_ = nullptr;
128     std::shared_ptr<AppExecFwk::EventHandler> eventHandler_ = nullptr;
129     std::recursive_mutex interfaceMutex_; // mutex for interface to make sure AccessibilityWindowManager thread-safe
130 };
131 } // namespace Accessibility
132 } // namespace OHOS
133 #endif // ACCESSIBILITY_WINDOW_MANGER_H