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