1 /*
2  * Copyright (c) 2021-2023 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 #ifndef OHOS_ROSEN_WINDOW_ROOT_H
16 #define OHOS_ROSEN_WINDOW_ROOT_H
17 
18 #include <refbase.h>
19 #include <iremote_object.h>
20 #include <transaction/rs_interfaces.h>
21 
22 #include "agent_death_recipient.h"
23 #include "display_manager_service_inner.h"
24 #include "parameters.h"
25 #include "window_node_container.h"
26 #include "zidl/window_manager_agent_interface.h"
27 
28 namespace OHOS {
29 namespace Rosen {
30 enum class Event : uint32_t {
31     REMOTE_DIED,
32 };
33 
34 class WindowRoot : public RefBase {
35 using Callback = std::function<void (Event event, const sptr<IRemoteObject>& remoteObject)>;
36 
37 public:
WindowRoot(Callback callback)38     explicit WindowRoot(Callback callback) : callback_(callback) {}
39     ~WindowRoot() = default;
40 
41     sptr<WindowNodeContainer> GetOrCreateWindowNodeContainer(DisplayId displayId);
42     sptr<WindowNodeContainer> GetWindowNodeContainer(DisplayId displayId);
43     sptr<WindowNodeContainer> CreateWindowNodeContainer(DisplayId defaultDisplayId, sptr<DisplayInfo> displayInfo);
44     sptr<WindowNode> GetWindowNode(uint32_t windowId) const;
45     sptr<WindowNode> GetWindowNodeByMissionId(uint32_t missionId) const;
46     void GetBackgroundNodesByScreenId(ScreenId screenGroupId, std::vector<sptr<WindowNode>>& windowNodes);
47     void GetForegroundNodes(std::vector<sptr<WindowNode>>& windowNodes);
48 
49     sptr<WindowNode> FindWallpaperWindow();
50     WMError SaveWindow(const sptr<WindowNode>& node);
51     void AddDeathRecipient(sptr<WindowNode> node);
52     sptr<WindowNode> FindWindowNodeWithToken(const sptr<IRemoteObject>& token) const;
53     WMError AddWindowNode(uint32_t parentId, sptr<WindowNode>& node, bool fromStartingWin = false);
54     WMError RemoveWindowNode(uint32_t windowId, bool fromAnimation = false);
55     WMError DestroyWindow(uint32_t windowId, bool onlySelf);
56     WMError UpdateWindowNode(uint32_t windowId, WindowUpdateReason reason);
57     bool IsVerticalDisplay(sptr<WindowNode>& node) const;
58     bool IsForbidDockSliceMove(DisplayId displayId) const;
59     bool IsDockSliceInExitSplitModeArea(DisplayId displayId) const;
60     void ExitSplitMode(DisplayId displayId);
61     void NotifyWindowVisibilityChange(std::shared_ptr<RSOcclusionData> occlusionData);
62     void AddSurfaceNodeIdWindowNodePair(uint64_t surfaceNodeId, sptr<WindowNode> node);
63 
64     WMError RequestFocus(uint32_t windowId);
65     WMError RequestActiveWindow(uint32_t windowId);
66     WMError MinimizeStructuredAppWindowsExceptSelf(sptr<WindowNode>& node);
67     AvoidArea GetAvoidAreaByType(uint32_t windowId, AvoidAreaType avoidAreaType);
68     WMError SetWindowMode(sptr<WindowNode>& node, WindowMode dstMode);
69     WMError GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId);
70     void MinimizeAllAppWindows(DisplayId displayId);
71     WMError ToggleShownStateForAllAppWindows();
72     WMError SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode);
73 
74     void ProcessWindowStateChange(WindowState state, WindowStateChangeReason reason);
75     void ProcessDisplayChange(DisplayId defaultDisplayId, sptr<DisplayInfo> displayInfo,
76         const std::map<DisplayId, sptr<DisplayInfo>>& displayInfoMap, DisplayStateChangeType type);
77     void ProcessDisplayDestroy(DisplayId defaultDisplayId, sptr<DisplayInfo> displayInfo,
78         const std::map<DisplayId, sptr<DisplayInfo>>& displayInfoMap);
79     void ProcessDisplayCreate(DisplayId defaultDisplayId, sptr<DisplayInfo> displayInfo,
80         const std::map<DisplayId, sptr<DisplayInfo>>& displayInfoMap);
81 
82     void NotifySystemBarTints();
83     WMError RaiseZOrderForAppWindow(sptr<WindowNode>& node);
84     void DispatchKeyEvent(sptr<WindowNode> node, std::shared_ptr<MMI::KeyEvent> event);
85     void FocusFaultDetection() const;
86     Rect GetDisplayGroupRect(DisplayId displayId) const;
87     WMError UpdateSizeChangeReason(uint32_t windowId, WindowSizeChangeReason reason);
88     void SetBrightness(uint32_t windowId, float brightness);
89     void HandleKeepScreenOn(uint32_t windowId, bool requireLock);
90     void UpdateFocusableProperty(uint32_t windowId);
91     void SetMaxAppWindowNumber(uint32_t windowNum);
92     WMError GetModeChangeHotZones(DisplayId displayId,
93         ModeChangeHotZones& hotZones, const ModeChangeHotZonesConfig& config);
94     std::vector<DisplayId> GetAllDisplayIds() const;
95     uint32_t GetTotalWindowNum() const;
96     uint32_t GetWindowIdByObject(const sptr<IRemoteObject>& remoteObject);
97     sptr<WindowNode> GetWindowForDumpAceHelpInfo() const;
98     void DestroyLeakStartingWindow();
99     void SetSplitRatios(const std::vector<float>& splitRatioNumbers);
100     std::vector<sptr<WindowNode>> GetSplitScreenWindowNodes(DisplayId displayId);
101     void SetExitSplitRatios(const std::vector<float>& exitSplitRatios);
102     void MinimizeTargetWindows(std::vector<uint32_t>& windowIds);
103     WMError UpdateRsTree(uint32_t windowId, bool isAdd);
104     void RemoveSingleUserWindowNodes(int accountId);
105     sptr<WindowNode> FindMainWindowWithToken(sptr<IRemoteObject> token);
106     bool CheckMultiDialogWindows(WindowType type, sptr<IRemoteObject> token);
107     bool HasPrivateWindow(DisplayId displayId);
108     Rect GetDisplayRectWithoutSystemBarAreas(const sptr<WindowNode> destNode);
109     sptr<WindowNode> GetWindowNodeByAbilityToken(const sptr<IRemoteObject>& abilityToken);
110     bool TakeWindowPairSnapshot(DisplayId displayId);
111     void ClearWindowPairSnapshot(DisplayId displayId);
112     void LayoutWhenAddWindowNode(sptr<WindowNode>& node, bool afterAnimation = false);
113     void GetAllAnimationPlayingNodes(std::vector<wptr<WindowNode>>& windowNodes);
114     void GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>>& infos) const;
115     void GetUnreliableWindowInfo(int32_t windowId, std::vector<sptr<UnreliableWindowInfo>>& infos) const;
116     WMError NotifyDesktopUnfrozen();
117     void UpdateDisplayOrientationWhenHideWindow(sptr<WindowNode>& node);
118     bool HasMainFullScreenWindowShown(DisplayId displayId);
119     WMError SetGestureNavigaionEnabled(bool enable);
120 private:
121     void OnRemoteDied(const sptr<IRemoteObject>& remoteObject);
122     WMError DestroyWindowInner(sptr<WindowNode>& node);
123     WMError DestroyWindowSelf(sptr<WindowNode>& node, const sptr<WindowNodeContainer>& container);
124     WMError DestroyWindowWithChild(sptr<WindowNode>& node, const sptr<WindowNodeContainer>& container);
125     void UpdateFocusWindowWithWindowRemoved(const sptr<WindowNode>& node,
126         const sptr<WindowNodeContainer>& container) const;
127     void UpdateActiveWindowWithWindowRemoved(const sptr<WindowNode>& node,
128         const sptr<WindowNodeContainer>& container) const;
129     void UpdateBrightnessWithWindowRemoved(uint32_t windowId, const sptr<WindowNodeContainer>& container) const;
130     std::string GenAllWindowsLogInfo() const;
131     bool CheckDisplayInfo(const sptr<DisplayInfo>& display);
132     ScreenId GetScreenGroupId(DisplayId displayId, bool& isRecordedDisplay);
133     void ProcessExpandDisplayCreate(DisplayId defaultDisplayId, sptr<DisplayInfo> displayInfo,
134         std::map<DisplayId, Rect>& displayRectMap);
135     std::map<DisplayId, Rect> GetAllDisplayRectsByDMS(sptr<DisplayInfo> displayInfo);
136     std::map<DisplayId, Rect> GetAllDisplayRectsByDisplayInfo(
137         const std::map<DisplayId, sptr<DisplayInfo>>& displayInfoMap);
138     void MoveNotShowingWindowToDefaultDisplay(DisplayId defaultDisplayId, DisplayId displayId);
139     WMError PostProcessAddWindowNode(sptr<WindowNode>& node, sptr<WindowNode>& parentNode,
140         sptr<WindowNodeContainer>& container);
141     std::vector<std::pair<uint64_t, WindowVisibilityState>> GetWindowVisibilityChangeInfo(
142         std::shared_ptr<RSOcclusionData> occlusionData);
143     bool CheckAddingModeAndSize(sptr<WindowNode>& node, const sptr<WindowNodeContainer>& container);
144     WMError BindDialogToParent(sptr<WindowNode>& node, sptr<WindowNode>& parentNode);
145     void CheckAndNotifyWaterMarkChangedResult();
146 
147     std::map<uint32_t, sptr<WindowNode>> windowNodeMap_;
148     std::map<sptr<IRemoteObject>, uint32_t> windowIdMap_;
149     std::map<uint64_t, sptr<WindowNode>> surfaceIdWindowNodeMap_;
150     std::vector<std::pair<uint64_t, WindowVisibilityState> > lastVisibleData_;
151     std::map<ScreenId, sptr<WindowNodeContainer>> windowNodeContainerMap_;
152     std::map<ScreenId, std::vector<DisplayId>> displayIdMap_;
153     bool lastWaterMarkShowStates_ { false };
154     bool needCheckFocusWindow = false;
155     bool lastGestureNativeEnabled_ { true };
156 
157     std::map<WindowManagerAgentType, std::vector<sptr<IWindowManagerAgent>>> windowManagerAgents_;
158 
159     sptr<AgentDeathRecipient> windowDeath_ = new AgentDeathRecipient(
160         [this](const sptr<IRemoteObject>& remoteObject) { this->OnRemoteDied(remoteObject); });
161     Callback callback_;
162     uint32_t maxAppWindowNumber_ = 100;
163     SplitRatioConfig splitRatioConfig_ = {0.1, 0.9, {}};
164 };
165 }
166 }
167 #endif // OHOS_ROSEN_WINDOW_ROOT_H
168