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