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}