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
19namespace OHOS {
20namespace Rosen {
21namespace {
22constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "DisplayManagerAgentController"};
23}
24WM_IMPLEMENT_SINGLE_INSTANCE(DisplayManagerAgentController)
25
26DMError 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
33DMError 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
40bool 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
53bool 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
66void 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
81void 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
93void 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
108void 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
119void 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
137void 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
152void 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
164void 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
180void 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
195void 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
207void 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
219void 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
230void 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}