1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci#include "display_manager_agent_controller.h"
17e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
18e0dac50fSopenharmony_ci
19e0dac50fSopenharmony_cinamespace OHOS {
20e0dac50fSopenharmony_cinamespace Rosen {
21e0dac50fSopenharmony_cinamespace {
22e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "DisplayManagerAgentController"};
23e0dac50fSopenharmony_ci}
24e0dac50fSopenharmony_ciWM_IMPLEMENT_SINGLE_INSTANCE(DisplayManagerAgentController)
25e0dac50fSopenharmony_ci
26e0dac50fSopenharmony_ciDMError DisplayManagerAgentController::RegisterDisplayManagerAgent(
27e0dac50fSopenharmony_ci    const sptr<IDisplayManagerAgent>& displayManagerAgent,
28e0dac50fSopenharmony_ci    DisplayManagerAgentType type)
29e0dac50fSopenharmony_ci{
30e0dac50fSopenharmony_ci    return dmAgentContainer_.RegisterAgent(displayManagerAgent, type) ? DMError::DM_OK :DMError::DM_ERROR_NULLPTR;
31e0dac50fSopenharmony_ci}
32e0dac50fSopenharmony_ci
33e0dac50fSopenharmony_ciDMError DisplayManagerAgentController::UnregisterDisplayManagerAgent(
34e0dac50fSopenharmony_ci    const sptr<IDisplayManagerAgent>& displayManagerAgent,
35e0dac50fSopenharmony_ci    DisplayManagerAgentType type)
36e0dac50fSopenharmony_ci{
37e0dac50fSopenharmony_ci    return dmAgentContainer_.UnregisterAgent(displayManagerAgent, type) ? DMError::DM_OK :DMError::DM_ERROR_NULLPTR;
38e0dac50fSopenharmony_ci}
39e0dac50fSopenharmony_ci
40e0dac50fSopenharmony_cibool DisplayManagerAgentController::NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status)
41e0dac50fSopenharmony_ci{
42e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
43e0dac50fSopenharmony_ci    if (agents.empty()) {
44e0dac50fSopenharmony_ci        return false;
45e0dac50fSopenharmony_ci    }
46e0dac50fSopenharmony_ci    WLOGFI("NotifyDisplayPowerEvent");
47e0dac50fSopenharmony_ci    for (auto& agent : agents) {
48e0dac50fSopenharmony_ci        agent->NotifyDisplayPowerEvent(event, status);
49e0dac50fSopenharmony_ci    }
50e0dac50fSopenharmony_ci    return true;
51e0dac50fSopenharmony_ci}
52e0dac50fSopenharmony_ci
53e0dac50fSopenharmony_cibool DisplayManagerAgentController::NotifyDisplayStateChanged(DisplayId id, DisplayState state)
54e0dac50fSopenharmony_ci{
55e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_STATE_LISTENER);
56e0dac50fSopenharmony_ci    if (agents.empty()) {
57e0dac50fSopenharmony_ci        return false;
58e0dac50fSopenharmony_ci    }
59e0dac50fSopenharmony_ci    WLOGFI("NotifyDisplayStateChanged");
60e0dac50fSopenharmony_ci    for (auto& agent : agents) {
61e0dac50fSopenharmony_ci        agent->NotifyDisplayStateChanged(id, state);
62e0dac50fSopenharmony_ci    }
63e0dac50fSopenharmony_ci    return true;
64e0dac50fSopenharmony_ci}
65e0dac50fSopenharmony_ci
66e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnScreenConnect(sptr<ScreenInfo> screenInfo)
67e0dac50fSopenharmony_ci{
68e0dac50fSopenharmony_ci    if (screenInfo == nullptr) {
69e0dac50fSopenharmony_ci        return;
70e0dac50fSopenharmony_ci    }
71e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
72e0dac50fSopenharmony_ci    if (agents.empty()) {
73e0dac50fSopenharmony_ci        return;
74e0dac50fSopenharmony_ci    }
75e0dac50fSopenharmony_ci    WLOGFI("OnScreenConnect");
76e0dac50fSopenharmony_ci    for (auto& agent : agents) {
77e0dac50fSopenharmony_ci        agent->OnScreenConnect(screenInfo);
78e0dac50fSopenharmony_ci    }
79e0dac50fSopenharmony_ci}
80e0dac50fSopenharmony_ci
81e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnScreenDisconnect(ScreenId screenId)
82e0dac50fSopenharmony_ci{
83e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
84e0dac50fSopenharmony_ci    if (agents.empty()) {
85e0dac50fSopenharmony_ci        return;
86e0dac50fSopenharmony_ci    }
87e0dac50fSopenharmony_ci    WLOGFI("OnScreenDisconnect");
88e0dac50fSopenharmony_ci    for (auto& agent : agents) {
89e0dac50fSopenharmony_ci        agent->OnScreenDisconnect(screenId);
90e0dac50fSopenharmony_ci    }
91e0dac50fSopenharmony_ci}
92e0dac50fSopenharmony_ci
93e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnScreenChange(sptr<ScreenInfo> screenInfo, ScreenChangeEvent screenChangeEvent)
94e0dac50fSopenharmony_ci{
95e0dac50fSopenharmony_ci    if (screenInfo == nullptr) {
96e0dac50fSopenharmony_ci        return;
97e0dac50fSopenharmony_ci    }
98e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
99e0dac50fSopenharmony_ci    if (agents.empty()) {
100e0dac50fSopenharmony_ci        return;
101e0dac50fSopenharmony_ci    }
102e0dac50fSopenharmony_ci    WLOGFI("OnScreenChange");
103e0dac50fSopenharmony_ci    for (auto& agent : agents) {
104e0dac50fSopenharmony_ci        agent->OnScreenChange(screenInfo, screenChangeEvent);
105e0dac50fSopenharmony_ci    }
106e0dac50fSopenharmony_ci}
107e0dac50fSopenharmony_ci
108e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnScreenGroupChange(const std::string& trigger,
109e0dac50fSopenharmony_ci    const sptr<ScreenInfo>& screenInfo, ScreenGroupChangeEvent groupEvent)
110e0dac50fSopenharmony_ci{
111e0dac50fSopenharmony_ci    if (screenInfo == nullptr) {
112e0dac50fSopenharmony_ci        return;
113e0dac50fSopenharmony_ci    }
114e0dac50fSopenharmony_ci    std::vector<sptr<ScreenInfo>> screenInfos;
115e0dac50fSopenharmony_ci    screenInfos.push_back(screenInfo);
116e0dac50fSopenharmony_ci    OnScreenGroupChange(trigger, screenInfos, groupEvent);
117e0dac50fSopenharmony_ci}
118e0dac50fSopenharmony_ci
119e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnScreenGroupChange(const std::string& trigger,
120e0dac50fSopenharmony_ci    const std::vector<sptr<ScreenInfo>>& screenInfos, ScreenGroupChangeEvent groupEvent)
121e0dac50fSopenharmony_ci{
122e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
123e0dac50fSopenharmony_ci    std::vector<sptr<ScreenInfo>> infos;
124e0dac50fSopenharmony_ci    for (auto& screenInfo : screenInfos) {
125e0dac50fSopenharmony_ci        if (screenInfo != nullptr) {
126e0dac50fSopenharmony_ci            infos.emplace_back(screenInfo);
127e0dac50fSopenharmony_ci        }
128e0dac50fSopenharmony_ci    }
129e0dac50fSopenharmony_ci    if (agents.empty() || infos.empty()) {
130e0dac50fSopenharmony_ci        return;
131e0dac50fSopenharmony_ci    }
132e0dac50fSopenharmony_ci    for (auto& agent : agents) {
133e0dac50fSopenharmony_ci        agent->OnScreenGroupChange(trigger, infos, groupEvent);
134e0dac50fSopenharmony_ci    }
135e0dac50fSopenharmony_ci}
136e0dac50fSopenharmony_ci
137e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnDisplayCreate(sptr<DisplayInfo> displayInfo)
138e0dac50fSopenharmony_ci{
139e0dac50fSopenharmony_ci    if (displayInfo == nullptr) {
140e0dac50fSopenharmony_ci        return;
141e0dac50fSopenharmony_ci    }
142e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
143e0dac50fSopenharmony_ci    if (agents.empty()) {
144e0dac50fSopenharmony_ci        return;
145e0dac50fSopenharmony_ci    }
146e0dac50fSopenharmony_ci    WLOGFI("OnDisplayCreate");
147e0dac50fSopenharmony_ci    for (auto& agent : agents) {
148e0dac50fSopenharmony_ci        agent->OnDisplayCreate(displayInfo);
149e0dac50fSopenharmony_ci    }
150e0dac50fSopenharmony_ci}
151e0dac50fSopenharmony_ci
152e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnDisplayDestroy(DisplayId displayId)
153e0dac50fSopenharmony_ci{
154e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
155e0dac50fSopenharmony_ci    if (agents.empty()) {
156e0dac50fSopenharmony_ci        return;
157e0dac50fSopenharmony_ci    }
158e0dac50fSopenharmony_ci    WLOGFI("OnDisplayDestroy");
159e0dac50fSopenharmony_ci    for (auto& agent : agents) {
160e0dac50fSopenharmony_ci        agent->OnDisplayDestroy(displayId);
161e0dac50fSopenharmony_ci    }
162e0dac50fSopenharmony_ci}
163e0dac50fSopenharmony_ci
164e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnDisplayChange(
165e0dac50fSopenharmony_ci    sptr<DisplayInfo> displayInfo, DisplayChangeEvent displayChangeEvent)
166e0dac50fSopenharmony_ci{
167e0dac50fSopenharmony_ci    if (displayInfo == nullptr) {
168e0dac50fSopenharmony_ci        return;
169e0dac50fSopenharmony_ci    }
170e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
171e0dac50fSopenharmony_ci    if (agents.empty()) {
172e0dac50fSopenharmony_ci        return;
173e0dac50fSopenharmony_ci    }
174e0dac50fSopenharmony_ci    WLOGFI("OnDisplayChange");
175e0dac50fSopenharmony_ci    for (auto& agent : agents) {
176e0dac50fSopenharmony_ci        agent->OnDisplayChange(displayInfo, displayChangeEvent);
177e0dac50fSopenharmony_ci    }
178e0dac50fSopenharmony_ci}
179e0dac50fSopenharmony_ci
180e0dac50fSopenharmony_civoid DisplayManagerAgentController::OnScreenshot(sptr<ScreenshotInfo> info)
181e0dac50fSopenharmony_ci{
182e0dac50fSopenharmony_ci    if (info == nullptr) {
183e0dac50fSopenharmony_ci        return;
184e0dac50fSopenharmony_ci    }
185e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::SCREENSHOT_EVENT_LISTENER);
186e0dac50fSopenharmony_ci    if (agents.empty()) {
187e0dac50fSopenharmony_ci        return;
188e0dac50fSopenharmony_ci    }
189e0dac50fSopenharmony_ci    WLOGFI("onScreenshot");
190e0dac50fSopenharmony_ci    for (auto& agent : agents) {
191e0dac50fSopenharmony_ci        agent->OnScreenshot(info);
192e0dac50fSopenharmony_ci    }
193e0dac50fSopenharmony_ci}
194e0dac50fSopenharmony_ci
195e0dac50fSopenharmony_civoid DisplayManagerAgentController::NotifyPrivateWindowStateChanged(bool hasPrivate)
196e0dac50fSopenharmony_ci{
197e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::PRIVATE_WINDOW_LISTENER);
198e0dac50fSopenharmony_ci    if (agents.empty()) {
199e0dac50fSopenharmony_ci        return;
200e0dac50fSopenharmony_ci    }
201e0dac50fSopenharmony_ci    WLOGI("PrivateWindow status : %{public}u", hasPrivate);
202e0dac50fSopenharmony_ci    for (auto& agent : agents) {
203e0dac50fSopenharmony_ci        agent->NotifyPrivateWindowStateChanged(hasPrivate);
204e0dac50fSopenharmony_ci    }
205e0dac50fSopenharmony_ci}
206e0dac50fSopenharmony_ci
207e0dac50fSopenharmony_civoid DisplayManagerAgentController::NotifyFoldStatusChanged(FoldStatus foldStatus)
208e0dac50fSopenharmony_ci{
209e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
210e0dac50fSopenharmony_ci    if (agents.empty()) {
211e0dac50fSopenharmony_ci        return;
212e0dac50fSopenharmony_ci    }
213e0dac50fSopenharmony_ci    WLOGI("FoldStatus is : %{public}u", foldStatus);
214e0dac50fSopenharmony_ci    for (auto& agent : agents) {
215e0dac50fSopenharmony_ci        agent->NotifyFoldStatusChanged(foldStatus);
216e0dac50fSopenharmony_ci    }
217e0dac50fSopenharmony_ci}
218e0dac50fSopenharmony_ci
219e0dac50fSopenharmony_civoid DisplayManagerAgentController::NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info)
220e0dac50fSopenharmony_ci{
221e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_UPDATE_LISTENER);
222e0dac50fSopenharmony_ci    if (agents.empty()) {
223e0dac50fSopenharmony_ci        return;
224e0dac50fSopenharmony_ci    }
225e0dac50fSopenharmony_ci    for (auto& agent : agents) {
226e0dac50fSopenharmony_ci        agent->NotifyDisplayChangeInfoChanged(info);
227e0dac50fSopenharmony_ci    }
228e0dac50fSopenharmony_ci}
229e0dac50fSopenharmony_ci
230e0dac50fSopenharmony_civoid DisplayManagerAgentController::NotifyDisplayModeChanged(FoldDisplayMode displayMode)
231e0dac50fSopenharmony_ci{
232e0dac50fSopenharmony_ci    auto agents = dmAgentContainer_.GetAgentsByType(DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
233e0dac50fSopenharmony_ci    if (agents.empty()) {
234e0dac50fSopenharmony_ci        return;
235e0dac50fSopenharmony_ci    }
236e0dac50fSopenharmony_ci    WLOGI("FoldDisplayMode is : %{public}u", displayMode);
237e0dac50fSopenharmony_ci    for (auto& agent : agents) {
238e0dac50fSopenharmony_ci        agent->NotifyDisplayModeChanged(displayMode);
239e0dac50fSopenharmony_ci    }
240e0dac50fSopenharmony_ci}
241e0dac50fSopenharmony_ci}
242e0dac50fSopenharmony_ci}