• 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 "singleton.h"
25 #include "window_manager.h"
26 
27 namespace OHOS {
28 namespace Accessibility {
29 
30 constexpr int32_t SCENE_BOARD_WINDOW_ID = 1; // default scene board window id 1
31 constexpr int32_t INVALID_SCENE_BOARD_ELEMENT_ID = -1; // invalid scene board element id -1
32 
33 class AccessibilityWindowManager {
34     DECLARE_SINGLETON(AccessibilityWindowManager)
35 public:
36     bool Init();
37     void DeInit();
38     static AccessibilityWindowInfo CreateAccessibilityWindowInfo(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
39     static void UpdateAccessibilityWindowInfo(AccessibilityWindowInfo &accWindowInfo,
40         const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
41     int32_t ConvertToRealWindowId(int32_t windowId, int32_t focusType);
42     void RegisterWindowListener(const std::shared_ptr<AppExecFwk::EventHandler> &handler);
43     void DeregisterWindowListener();
44     void SetActiveWindow(int32_t windowId);
45     void SetAccessibilityFocusedWindow(int32_t windowId);
46     std::vector<AccessibilityWindowInfo> GetAccessibilityWindows();
47     bool GetAccessibilityWindow(int32_t windowId, AccessibilityWindowInfo &window);
48     bool IsValidWindow(int32_t windowId);
49     void ClearAccessibilityFocused();
50 
51     // used for window id 1, scene board
52     int32_t GetSceneBoardElementId(const int32_t windowId, const int32_t elementId);
53     int32_t GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
54     bool IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo);
55 
56     // test for ut to resize a window
57     void SetWindowSize(int32_t windowId, Rect rect);
58 
59     void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos, Rosen::WindowUpdateType type);
60 
61     std::map<int32_t, AccessibilityWindowInfo> a11yWindows_ {};
62     int32_t activeWindowId_ = INVALID_WINDOW_ID;
63     int32_t a11yFocusedWindowId_ = INVALID_WINDOW_ID;
64     std::set<int32_t> subWindows_ {}; // used for window id 1, scene board
65 
66 private:
67     class AccessibilityWindowListener : public Rosen::IWindowUpdateListener {
68     public:
AccessibilityWindowListener(AccessibilityWindowManager & windInfoMgr)69         explicit AccessibilityWindowListener(AccessibilityWindowManager &windInfoMgr)
70             : windInfoMgr_(windInfoMgr) {}
71         ~AccessibilityWindowListener() = default;
72 
OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos,Rosen::WindowUpdateType type)73         virtual void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos,
74             Rosen::WindowUpdateType type) override
75         {
76             windInfoMgr_.OnWindowUpdate(infos, type);
77         }
78 
79     private:
80         AccessibilityWindowManager &windInfoMgr_;
81     };
82 
83     void WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
84     void WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
85     void WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
86     void WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
87     void WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
88     void WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos);
89     void ClearOldActiveWindow();
90 
91     sptr<AccessibilityWindowListener> windowListener_ = nullptr;
92     std::shared_ptr<AppExecFwk::EventHandler> eventHandler_ = nullptr;
93 };
94 } // namespace Accessibility
95 } // namespace OHOS
96 #endif // ACCESSIBILITY_WINDOW_MANGER_H