1885b47fbSopenharmony_ci/* 2885b47fbSopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3885b47fbSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4885b47fbSopenharmony_ci * you may not use this file except in compliance with the License. 5885b47fbSopenharmony_ci * You may obtain a copy of the License at 6885b47fbSopenharmony_ci * 7885b47fbSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8885b47fbSopenharmony_ci * 9885b47fbSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10885b47fbSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11885b47fbSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12885b47fbSopenharmony_ci * See the License for the specific language governing permissions and 13885b47fbSopenharmony_ci * limitations under the License. 14885b47fbSopenharmony_ci */ 15885b47fbSopenharmony_ci 16885b47fbSopenharmony_ci#ifndef ACCESSIBILITY_WINDOW_MANGER_H 17885b47fbSopenharmony_ci#define ACCESSIBILITY_WINDOW_MANGER_H 18885b47fbSopenharmony_ci 19885b47fbSopenharmony_ci#include <map> 20885b47fbSopenharmony_ci#include <memory> 21885b47fbSopenharmony_ci#include <set> 22885b47fbSopenharmony_ci#include "accessibility_window_info.h" 23885b47fbSopenharmony_ci#include "event_handler.h" 24885b47fbSopenharmony_ci#include "ffrt.h" 25885b47fbSopenharmony_ci#include "singleton.h" 26885b47fbSopenharmony_ci#include "window_manager.h" 27885b47fbSopenharmony_ci 28885b47fbSopenharmony_cinamespace OHOS { 29885b47fbSopenharmony_cinamespace Accessibility { 30885b47fbSopenharmony_ci 31885b47fbSopenharmony_ciconstexpr int32_t SCENE_BOARD_WINDOW_ID = 1; // default scene board window id 1 32885b47fbSopenharmony_ciconstexpr int64_t INVALID_SCENE_BOARD_ELEMENT_ID = -1; // invalid scene board element id -1 33885b47fbSopenharmony_ci 34885b47fbSopenharmony_ciclass AccessibilityWindowManager { 35885b47fbSopenharmony_ci DECLARE_SINGLETON(AccessibilityWindowManager) 36885b47fbSopenharmony_cipublic: 37885b47fbSopenharmony_ci bool Init(); 38885b47fbSopenharmony_ci void DeInit(); 39885b47fbSopenharmony_ci void WinDeInit(); 40885b47fbSopenharmony_ci static AccessibilityWindowInfo CreateAccessibilityWindowInfo(const sptr<Rosen::AccessibilityWindowInfo> windowInfo); 41885b47fbSopenharmony_ci static void UpdateAccessibilityWindowInfo(AccessibilityWindowInfo &accWindowInfo, 42885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> windowInfo); 43885b47fbSopenharmony_ci static bool CheckIntegerOverflow(const Rosen::Rect& rect); 44885b47fbSopenharmony_ci int32_t ConvertToRealWindowId(int32_t windowId, int32_t focusType); 45885b47fbSopenharmony_ci void RegisterWindowListener(const std::shared_ptr<AppExecFwk::EventHandler> &handler); 46885b47fbSopenharmony_ci void DeregisterWindowListener(); 47885b47fbSopenharmony_ci void SetActiveWindow(int32_t windowId, bool isSendEvent = true); 48885b47fbSopenharmony_ci int32_t GetActiveWindowId(); 49885b47fbSopenharmony_ci void SetAccessibilityFocusedWindow(int32_t windowId); 50885b47fbSopenharmony_ci std::vector<AccessibilityWindowInfo> GetAccessibilityWindows(); 51885b47fbSopenharmony_ci bool GetAccessibilityWindow(int32_t windowId, AccessibilityWindowInfo &window); 52885b47fbSopenharmony_ci bool IsValidWindow(int32_t windowId); 53885b47fbSopenharmony_ci void ClearAccessibilityFocused(); 54885b47fbSopenharmony_ci 55885b47fbSopenharmony_ci // used for window id 1, scene board 56885b47fbSopenharmony_ci int64_t GetSceneBoardElementId(const int32_t windowId, const int64_t elementId); 57885b47fbSopenharmony_ci int32_t GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo); 58885b47fbSopenharmony_ci bool IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo); 59885b47fbSopenharmony_ci 60885b47fbSopenharmony_ci // used for batch query, provide window and element id translation 61885b47fbSopenharmony_ci void GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId); 62885b47fbSopenharmony_ci void GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId, int32_t& innerWid); 63885b47fbSopenharmony_ci 64885b47fbSopenharmony_ci RetError GetFocusedWindowId(int32_t &focusedWindowId); 65885b47fbSopenharmony_ci 66885b47fbSopenharmony_ci // test for ut to resize a window 67885b47fbSopenharmony_ci void SetWindowSize(int32_t windowId, Rect rect); 68885b47fbSopenharmony_ci 69885b47fbSopenharmony_ci void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos, Rosen::WindowUpdateType type); 70885b47fbSopenharmony_ci 71885b47fbSopenharmony_ci bool IsInnerWindowRootElement(int64_t elementId); 72885b47fbSopenharmony_ci 73885b47fbSopenharmony_ci std::map<int32_t, AccessibilityWindowInfo> a11yWindows_ {}; 74885b47fbSopenharmony_ci int32_t activeWindowId_ = INVALID_WINDOW_ID; 75885b47fbSopenharmony_ci int32_t a11yFocusedWindowId_ = INVALID_WINDOW_ID; 76885b47fbSopenharmony_ci std::set<int32_t> subWindows_ {}; // used for window id 1, scene board 77885b47fbSopenharmony_ci 78885b47fbSopenharmony_ci // used for arkui windowId 1 map to WMS windowId 79885b47fbSopenharmony_ci class SceneBoardElementIdMap { 80885b47fbSopenharmony_ci public: 81885b47fbSopenharmony_ci SceneBoardElementIdMap() = default; 82885b47fbSopenharmony_ci ~SceneBoardElementIdMap() = default; 83885b47fbSopenharmony_ci void InsertPair(const int32_t windowId, const int64_t elementId); 84885b47fbSopenharmony_ci void RemovePair(const int32_t windowId); 85885b47fbSopenharmony_ci bool CheckWindowIdPair(const int32_t windowId); 86885b47fbSopenharmony_ci std::map<int32_t, int64_t> GetAllPairs(); 87885b47fbSopenharmony_ci void Clear(); 88885b47fbSopenharmony_ci private: 89885b47fbSopenharmony_ci std::map<int32_t, int64_t> windowElementMap_; 90885b47fbSopenharmony_ci ffrt::mutex mapMutex_; 91885b47fbSopenharmony_ci }; 92885b47fbSopenharmony_ci SceneBoardElementIdMap sceneBoardElementIdMap_ = {}; 93885b47fbSopenharmony_ci 94885b47fbSopenharmony_ciprivate: 95885b47fbSopenharmony_ci class AccessibilityWindowListener : public Rosen::IWindowUpdateListener { 96885b47fbSopenharmony_ci public: 97885b47fbSopenharmony_ci explicit AccessibilityWindowListener(AccessibilityWindowManager &windInfoMgr) 98885b47fbSopenharmony_ci : windInfoMgr_(windInfoMgr) {} 99885b47fbSopenharmony_ci ~AccessibilityWindowListener() = default; 100885b47fbSopenharmony_ci 101885b47fbSopenharmony_ci virtual void OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos, 102885b47fbSopenharmony_ci Rosen::WindowUpdateType type) override 103885b47fbSopenharmony_ci { 104885b47fbSopenharmony_ci windInfoMgr_.OnWindowUpdate(infos, type); 105885b47fbSopenharmony_ci } 106885b47fbSopenharmony_ci 107885b47fbSopenharmony_ci private: 108885b47fbSopenharmony_ci AccessibilityWindowManager &windInfoMgr_; 109885b47fbSopenharmony_ci }; 110885b47fbSopenharmony_ci 111885b47fbSopenharmony_ci bool CompareRect(const Rect &rectAccessibility, const Rosen::Rect &rectWindow); 112885b47fbSopenharmony_ci bool EqualFocus(const Accessibility::AccessibilityWindowInfo &accWindowInfo, 113885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> &windowInfo); 114885b47fbSopenharmony_ci bool EqualBound(const Accessibility::AccessibilityWindowInfo &accWindowInfo, 115885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> &windowInfo); 116885b47fbSopenharmony_ci bool EqualProperty(Accessibility::AccessibilityWindowInfo &accWindowInfo, 117885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> &windowInfo); 118885b47fbSopenharmony_ci void WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos); 119885b47fbSopenharmony_ci void WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos); 120885b47fbSopenharmony_ci void WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos); 121885b47fbSopenharmony_ci void WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos); 122885b47fbSopenharmony_ci void WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos); 123885b47fbSopenharmony_ci void WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos); 124885b47fbSopenharmony_ci void WindowUpdateTypeEvent(const int32_t realWidId, Accessibility::WindowUpdateType type); 125885b47fbSopenharmony_ci void WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos); 126885b47fbSopenharmony_ci void ClearOldActiveWindow(); 127885b47fbSopenharmony_ci 128885b47fbSopenharmony_ci sptr<AccessibilityWindowListener> windowListener_ = nullptr; 129885b47fbSopenharmony_ci std::shared_ptr<AppExecFwk::EventHandler> eventHandler_ = nullptr; 130885b47fbSopenharmony_ci ffrt::recursive_mutex interfaceMutex_; // mutex for interface to make sure AccessibilityWindowManager thread-safe 131885b47fbSopenharmony_ci}; 132885b47fbSopenharmony_ci} // namespace Accessibility 133885b47fbSopenharmony_ci} // namespace OHOS 134885b47fbSopenharmony_ci#endif // ACCESSIBILITY_WINDOW_MANGER_H