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 #include "display_manager_agent_controller.h"
17 #include "window_manager_hilog.h"
18
19 namespace OHOS {
20 namespace Rosen {
WM_IMPLEMENT_SINGLE_INSTANCE(DisplayManagerAgentController)21 WM_IMPLEMENT_SINGLE_INSTANCE(DisplayManagerAgentController)
22
23 DMError DisplayManagerAgentController::RegisterDisplayManagerAgent(
24 const sptr<IDisplayManagerAgent>& displayManagerAgent,
25 DisplayManagerAgentType type)
26 {
27 return dmAgentContainer_.RegisterAgent(displayManagerAgent, type) ? DMError::DM_OK :DMError::DM_ERROR_NULLPTR;
28 }
29
UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent> & displayManagerAgent,DisplayManagerAgentType type)30 DMError DisplayManagerAgentController::UnregisterDisplayManagerAgent(
31 const sptr<IDisplayManagerAgent>& displayManagerAgent,
32 DisplayManagerAgentType type)
33 {
34 return dmAgentContainer_.UnregisterAgent(displayManagerAgent, type) ? DMError::DM_OK :DMError::DM_ERROR_NULLPTR;
35 }
36
NotifyDisplayPowerEvent(DisplayPowerEvent event,EventStatus status)37 bool DisplayManagerAgentController::NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status)
38 {
39 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
40 if (agents.empty()) {
41 return false;
42 }
43 TLOGI(WmsLogTag::DMS, "NotifyDisplayPowerEvent");
44 for (auto& agent : agents) {
45 agent->NotifyDisplayPowerEvent(event, status);
46 }
47 return true;
48 }
49
NotifyDisplayStateChanged(DisplayId id,DisplayState state)50 bool DisplayManagerAgentController::NotifyDisplayStateChanged(DisplayId id, DisplayState state)
51 {
52 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_STATE_LISTENER);
53 if (agents.empty()) {
54 return false;
55 }
56 TLOGI(WmsLogTag::DMS, "NotifyDisplayStateChanged");
57 for (auto& agent : agents) {
58 agent->NotifyDisplayStateChanged(id, state);
59 }
60 return true;
61 }
62
OnScreenConnect(sptr<ScreenInfo> screenInfo)63 void DisplayManagerAgentController::OnScreenConnect(sptr<ScreenInfo> screenInfo)
64 {
65 if (screenInfo == nullptr) {
66 return;
67 }
68 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
69 if (agents.empty()) {
70 return;
71 }
72 TLOGI(WmsLogTag::DMS, "OnScreenConnect");
73 for (auto& agent : agents) {
74 agent->OnScreenConnect(screenInfo);
75 }
76 }
77
OnScreenDisconnect(ScreenId screenId)78 void DisplayManagerAgentController::OnScreenDisconnect(ScreenId screenId)
79 {
80 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
81 if (agents.empty()) {
82 return;
83 }
84 TLOGI(WmsLogTag::DMS, "OnScreenDisconnect");
85 for (auto& agent : agents) {
86 agent->OnScreenDisconnect(screenId);
87 }
88 }
89
OnScreenChange(sptr<ScreenInfo> screenInfo,ScreenChangeEvent screenChangeEvent)90 void DisplayManagerAgentController::OnScreenChange(sptr<ScreenInfo> screenInfo, ScreenChangeEvent screenChangeEvent)
91 {
92 if (screenInfo == nullptr) {
93 return;
94 }
95 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
96 if (agents.empty()) {
97 return;
98 }
99 TLOGI(WmsLogTag::DMS, "OnScreenChange");
100 for (auto& agent : agents) {
101 agent->OnScreenChange(screenInfo, screenChangeEvent);
102 }
103 }
104
OnScreenGroupChange(const std::string & trigger,const sptr<ScreenInfo> & screenInfo,ScreenGroupChangeEvent groupEvent)105 void DisplayManagerAgentController::OnScreenGroupChange(const std::string& trigger,
106 const sptr<ScreenInfo>& screenInfo, ScreenGroupChangeEvent groupEvent)
107 {
108 if (screenInfo == nullptr) {
109 return;
110 }
111 std::vector<sptr<ScreenInfo>> screenInfos;
112 screenInfos.push_back(screenInfo);
113 OnScreenGroupChange(trigger, screenInfos, groupEvent);
114 }
115
OnScreenGroupChange(const std::string & trigger,const std::vector<sptr<ScreenInfo>> & screenInfos,ScreenGroupChangeEvent groupEvent)116 void DisplayManagerAgentController::OnScreenGroupChange(const std::string& trigger,
117 const std::vector<sptr<ScreenInfo>>& screenInfos, ScreenGroupChangeEvent groupEvent)
118 {
119 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
120 std::vector<sptr<ScreenInfo>> infos;
121 for (auto& screenInfo : screenInfos) {
122 if (screenInfo != nullptr) {
123 infos.emplace_back(screenInfo);
124 }
125 }
126 if (agents.empty() || infos.empty()) {
127 return;
128 }
129 for (auto& agent : agents) {
130 agent->OnScreenGroupChange(trigger, infos, groupEvent);
131 }
132 }
133
OnDisplayCreate(sptr<DisplayInfo> displayInfo)134 void DisplayManagerAgentController::OnDisplayCreate(sptr<DisplayInfo> displayInfo)
135 {
136 if (displayInfo == nullptr) {
137 return;
138 }
139 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
140 if (agents.empty()) {
141 return;
142 }
143 TLOGI(WmsLogTag::DMS, "OnDisplayCreate");
144 for (auto& agent : agents) {
145 agent->OnDisplayCreate(displayInfo);
146 }
147 }
148
OnDisplayDestroy(DisplayId displayId)149 void DisplayManagerAgentController::OnDisplayDestroy(DisplayId displayId)
150 {
151 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
152 if (agents.empty()) {
153 return;
154 }
155 TLOGI(WmsLogTag::DMS, "OnDisplayDestroy");
156 for (auto& agent : agents) {
157 agent->OnDisplayDestroy(displayId);
158 }
159 }
160
OnDisplayChange(sptr<DisplayInfo> displayInfo,DisplayChangeEvent displayChangeEvent)161 void DisplayManagerAgentController::OnDisplayChange(
162 sptr<DisplayInfo> displayInfo, DisplayChangeEvent displayChangeEvent)
163 {
164 if (displayInfo == nullptr) {
165 return;
166 }
167 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
168 if (agents.empty()) {
169 return;
170 }
171 TLOGI(WmsLogTag::DMS, "OnDisplayChange");
172 for (auto& agent : agents) {
173 agent->OnDisplayChange(displayInfo, displayChangeEvent);
174 }
175 }
176
OnScreenshot(sptr<ScreenshotInfo> info)177 void DisplayManagerAgentController::OnScreenshot(sptr<ScreenshotInfo> info)
178 {
179 if (info == nullptr) {
180 return;
181 }
182 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREENSHOT_EVENT_LISTENER);
183 if (agents.empty()) {
184 return;
185 }
186 TLOGI(WmsLogTag::DMS, "onScreenshot");
187 for (auto& agent : agents) {
188 agent->OnScreenshot(info);
189 }
190 }
191
NotifyPrivateWindowStateChanged(bool hasPrivate)192 void DisplayManagerAgentController::NotifyPrivateWindowStateChanged(bool hasPrivate)
193 {
194 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::PRIVATE_WINDOW_LISTENER);
195 if (agents.empty()) {
196 return;
197 }
198 TLOGI(WmsLogTag::DMS, "PrivateWindow status : %{public}u", hasPrivate);
199 for (auto& agent : agents) {
200 agent->NotifyPrivateWindowStateChanged(hasPrivate);
201 }
202 }
203
NotifyFoldStatusChanged(FoldStatus foldStatus)204 void DisplayManagerAgentController::NotifyFoldStatusChanged(FoldStatus foldStatus)
205 {
206 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
207 if (agents.empty()) {
208 return;
209 }
210 TLOGI(WmsLogTag::DMS, "FoldStatus is : %{public}u", foldStatus);
211 for (auto& agent : agents) {
212 agent->NotifyFoldStatusChanged(foldStatus);
213 }
214 }
215
NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo> & info)216 void DisplayManagerAgentController::NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info)
217 {
218 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_UPDATE_LISTENER);
219 if (agents.empty()) {
220 return;
221 }
222 for (auto& agent : agents) {
223 agent->NotifyDisplayChangeInfoChanged(info);
224 }
225 }
226
NotifyDisplayModeChanged(FoldDisplayMode displayMode)227 void DisplayManagerAgentController::NotifyDisplayModeChanged(FoldDisplayMode displayMode)
228 {
229 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
230 if (agents.empty()) {
231 return;
232 }
233 TLOGI(WmsLogTag::DMS, "FoldDisplayMode is : %{public}u", displayMode);
234 for (auto& agent : agents) {
235 agent->NotifyDisplayModeChanged(displayMode);
236 }
237 }
238 }
239 }