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 }