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}