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 bool DisplayManagerAgentController::RegisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
27 DisplayManagerAgentType type)
28 {
29 return dmAgentContainer_.RegisterAgent(displayManagerAgent, type);
30 }
31
UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent> & displayManagerAgent,DisplayManagerAgentType type)32 bool DisplayManagerAgentController::UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
33 DisplayManagerAgentType type)
34 {
35 return dmAgentContainer_.UnregisterAgent(displayManagerAgent, type);
36 }
37
NotifyDisplayPowerEvent(DisplayPowerEvent event,EventStatus status)38 bool DisplayManagerAgentController::NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status)
39 {
40 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
41 if (agents.empty()) {
42 return false;
43 }
44 WLOGFI("NotifyDisplayPowerEvent");
45 for (auto& agent : agents) {
46 agent->NotifyDisplayPowerEvent(event, status);
47 }
48 return true;
49 }
50
NotifyDisplayStateChanged(DisplayId id,DisplayState state)51 bool DisplayManagerAgentController::NotifyDisplayStateChanged(DisplayId id, DisplayState state)
52 {
53 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_STATE_LISTENER);
54 if (agents.empty()) {
55 return false;
56 }
57 WLOGFI("NotifyDisplayStateChanged");
58 for (auto& agent : agents) {
59 agent->NotifyDisplayStateChanged(id, state);
60 }
61 return true;
62 }
63
OnScreenConnect(sptr<ScreenInfo> screenInfo)64 void DisplayManagerAgentController::OnScreenConnect(sptr<ScreenInfo> screenInfo)
65 {
66 if (screenInfo == nullptr) {
67 return;
68 }
69 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
70 if (agents.empty()) {
71 return;
72 }
73 WLOGFI("OnScreenConnect");
74 for (auto& agent : agents) {
75 agent->OnScreenConnect(screenInfo);
76 }
77 }
78
OnScreenDisconnect(ScreenId screenId)79 void DisplayManagerAgentController::OnScreenDisconnect(ScreenId screenId)
80 {
81 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
82 if (agents.empty()) {
83 return;
84 }
85 WLOGFI("OnScreenDisconnect");
86 for (auto& agent : agents) {
87 agent->OnScreenDisconnect(screenId);
88 }
89 }
90
OnScreenChange(sptr<ScreenInfo> screenInfo,ScreenChangeEvent screenChangeEvent)91 void DisplayManagerAgentController::OnScreenChange(sptr<ScreenInfo> screenInfo, ScreenChangeEvent screenChangeEvent)
92 {
93 if (screenInfo == nullptr) {
94 return;
95 }
96 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
97 if (agents.empty()) {
98 return;
99 }
100 WLOGFI("OnScreenChange");
101 for (auto& agent : agents) {
102 agent->OnScreenChange(screenInfo, screenChangeEvent);
103 }
104 }
105
OnScreenGroupChange(const std::string & trigger,const sptr<ScreenInfo> & screenInfo,ScreenGroupChangeEvent groupEvent)106 void DisplayManagerAgentController::OnScreenGroupChange(const std::string& trigger,
107 const sptr<ScreenInfo>& screenInfo, ScreenGroupChangeEvent groupEvent)
108 {
109 if (screenInfo == nullptr) {
110 return;
111 }
112 std::vector<sptr<ScreenInfo>> screenInfos;
113 screenInfos.push_back(screenInfo);
114 OnScreenGroupChange(trigger, screenInfos, groupEvent);
115 }
116
OnScreenGroupChange(const std::string & trigger,const std::vector<sptr<ScreenInfo>> & screenInfos,ScreenGroupChangeEvent groupEvent)117 void DisplayManagerAgentController::OnScreenGroupChange(const std::string& trigger,
118 const std::vector<sptr<ScreenInfo>>& screenInfos, ScreenGroupChangeEvent groupEvent)
119 {
120 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
121 std::vector<sptr<ScreenInfo>> infos;
122 for (auto& screenInfo : screenInfos) {
123 if (screenInfo != nullptr) {
124 infos.emplace_back(screenInfo);
125 }
126 }
127 if (agents.empty() || infos.empty()) {
128 return;
129 }
130 for (auto& agent : agents) {
131 agent->OnScreenGroupChange(trigger, infos, groupEvent);
132 }
133 }
134
OnDisplayCreate(sptr<DisplayInfo> displayInfo)135 void DisplayManagerAgentController::OnDisplayCreate(sptr<DisplayInfo> displayInfo)
136 {
137 if (displayInfo == nullptr) {
138 return;
139 }
140 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
141 if (agents.empty()) {
142 return;
143 }
144 WLOGFI("OnDisplayCreate");
145 for (auto& agent : agents) {
146 agent->OnDisplayCreate(displayInfo);
147 }
148 }
149
OnDisplayDestroy(DisplayId displayId)150 void DisplayManagerAgentController::OnDisplayDestroy(DisplayId displayId)
151 {
152 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
153 if (agents.empty()) {
154 return;
155 }
156 WLOGFI("OnDisplayDestroy");
157 for (auto& agent : agents) {
158 agent->OnDisplayDestroy(displayId);
159 }
160 }
161
OnDisplayChange(sptr<DisplayInfo> displayInfo,DisplayChangeEvent displayChangeEvent)162 void DisplayManagerAgentController::OnDisplayChange(
163 sptr<DisplayInfo> displayInfo, DisplayChangeEvent displayChangeEvent)
164 {
165 if (displayInfo == nullptr) {
166 return;
167 }
168 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
169 if (agents.empty()) {
170 return;
171 }
172 WLOGFI("OnDisplayChange");
173 for (auto& agent : agents) {
174 agent->OnDisplayChange(displayInfo, displayChangeEvent);
175 }
176 }
177
OnScreenshot(sptr<ScreenshotInfo> info)178 void DisplayManagerAgentController::OnScreenshot(sptr<ScreenshotInfo> info)
179 {
180 if (info == nullptr) {
181 return;
182 }
183 auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREENSHOT_EVENT_LISTENER);
184 if (agents.empty()) {
185 return;
186 }
187 WLOGFI("onScreenshot");
188 for (auto& agent : agents) {
189 agent->OnScreenshot(info);
190 }
191 }
192 }
193 }