1 /* 2 * Copyright (c) 2021-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 #ifndef FOUNDATION_DM_DISPLAY_MANAGER_H 17 #define FOUNDATION_DM_DISPLAY_MANAGER_H 18 19 #include <vector> 20 #include <mutex> 21 #include <pixel_map.h> 22 23 #include "display.h" 24 #include "dm_common.h" 25 #include "fold_screen_info.h" 26 #include "wm_single_instance.h" 27 #include "screenshot_info.h" 28 #include "display_change_info.h" 29 30 namespace OHOS::Rosen { 31 class DisplayManager { 32 WM_DECLARE_SINGLE_INSTANCE_BASE(DisplayManager); 33 friend class DMSDeathRecipient; 34 public: 35 class IDisplayListener : public virtual RefBase { 36 public: 37 /** 38 * @brief Notify when a new display is created. 39 */ 40 virtual void OnCreate(DisplayId) = 0; 41 42 /** 43 * @brief Notify when the display is destroyed. 44 */ 45 virtual void OnDestroy(DisplayId) = 0; 46 47 /** 48 * @brief Notify when the state of a display changes 49 */ 50 virtual void OnChange(DisplayId) = 0; 51 }; 52 53 class IScreenshotListener : public virtual RefBase { 54 public: 55 /** 56 * @brief Notify when a screenshot event occurs. 57 * 58 * @param info Screenshot info. 59 */ OnScreenshot(const ScreenshotInfo info)60 virtual void OnScreenshot([[maybe_unused]]const ScreenshotInfo info) {} 61 }; 62 63 class IPrivateWindowListener : public virtual RefBase { 64 public: 65 /** 66 * @brief Monitor whether the existence of privacy window has changed. 67 * 68 * @param hasPrivate True means the display has private window, false means the opposite. 69 */ OnPrivateWindow(bool hasPrivate)70 virtual void OnPrivateWindow([[maybe_unused]]bool hasPrivate) {} 71 }; 72 73 class IFoldStatusListener : public virtual RefBase { 74 public: 75 /** 76 * @brief Notify listeners when screen fold status changed. 77 * 78 * @param foldStatus Screen foldStatus. 79 */ OnFoldStatusChanged(FoldStatus foldStatus)80 virtual void OnFoldStatusChanged([[maybe_unused]]FoldStatus foldStatus) {} 81 }; 82 83 class IDisplayUpdateListener : public virtual RefBase { 84 public: 85 /** 86 * @brief Notify listeners when session change display. 87 * 88 * @param infos DisplayChangeInfo. 89 */ OnDisplayUpdate(const sptr<DisplayChangeInfo> & info)90 virtual void OnDisplayUpdate([[maybe_unused]]const sptr<DisplayChangeInfo>& info) {} 91 }; 92 93 class IDisplayModeListener : public virtual RefBase { 94 public: 95 /** 96 * @brief Notify listeners when display mode changed. 97 * 98 * @param displayMode DisplayMode. 99 */ OnDisplayModeChanged(FoldDisplayMode displayMode)100 virtual void OnDisplayModeChanged([[maybe_unused]]FoldDisplayMode displayMode) {} 101 }; 102 103 class IAvailableAreaListener : public virtual RefBase { 104 public: 105 /** 106 * @brief Notify listeners when available area changed. 107 * 108 * @param DMRect area. 109 */ OnAvailableAreaChanged(DMRect area)110 virtual void OnAvailableAreaChanged(DMRect area) {} 111 }; 112 113 /** 114 * @brief Obtain all displays. 115 * 116 * @return All displays. 117 */ 118 std::vector<sptr<Display>> GetAllDisplays(); 119 120 /** 121 * @brief Obtain the id of the default display. 122 * 123 * @return Default display id. 124 */ 125 DisplayId GetDefaultDisplayId(); 126 127 /** 128 * @brief Get the default display object. 129 * 130 * @return Default display object. 131 */ 132 sptr<Display> GetDefaultDisplay(); 133 134 /** 135 * @brief Get the default display object by means of sync. 136 * 137 * @return Default display id. 138 */ 139 sptr<Display> GetDefaultDisplaySync(); 140 141 /** 142 * @brief Get the display object by id. 143 * 144 * @param displayId Id of the target display. 145 * @return Default display object. 146 */ 147 sptr<Display> GetDisplayById(DisplayId displayId); 148 149 /** 150 * @brief Get the display object by corresponding screenId. 151 * 152 * @param screenId The id of the target screen. 153 * @return Display object. 154 */ 155 sptr<Display> GetDisplayByScreen(ScreenId screenId); 156 157 /** 158 * @brief Get IDs of all displays. 159 * 160 * @return All display IDs. 161 */ 162 std::vector<DisplayId> GetAllDisplayIds(); 163 164 /** 165 * @brief Get whether the target display contains privacy windows. 166 * 167 * @param displayId Display id. 168 * @param hasPrivateWindow True means display has private window, false means the opposite. 169 * @return DM_OK means query privacy success, others means query failed. 170 */ 171 DMError HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow); 172 173 /** 174 * @brief Get screenshot of the target display. 175 * 176 * @param displayId Display id. 177 * @param errorCode error code. 178 * @return PixelMap object of screenshot. 179 */ 180 std::shared_ptr<Media::PixelMap> GetScreenshot(DisplayId displayId, DmErrorCode* errorCode = nullptr); 181 /** 182 * @brief Get screenshot of the target display. 183 * 184 * @param displayId Display id. 185 * @param rect Rect of screenshot. 186 * @param size Size of screenshot. 187 * @param rotation Parameter of rotation. 188 * @param errorCode error code. 189 * @return PixelMap object of screenshot. 190 */ 191 std::shared_ptr<Media::PixelMap> GetScreenshot(DisplayId displayId, const Media::Rect &rect, 192 const Media::Size &size, int rotation, DmErrorCode* errorCode = nullptr); 193 194 /** 195 * @brief Begin to wake up screen. 196 * 197 * @param reason Reason for power state change. 198 * @return True means begin success, false means begin failed. 199 */ 200 bool WakeUpBegin(PowerStateChangeReason reason); 201 202 /** 203 * @brief Wake up screen end. 204 * 205 * @return True means end success, false means end failed. 206 */ 207 bool WakeUpEnd(); 208 209 /** 210 * @brief Begin to suspend the screen. 211 * 212 * @param reason Reason for power state change. 213 * @return True means begin success, false means begin failed. 214 */ 215 bool SuspendBegin(PowerStateChangeReason reason); 216 217 /** 218 * @brief Suspend screen end. 219 * 220 * @return True means suspend screen end success. 221 * @return False means suspend screen end failed. 222 */ 223 bool SuspendEnd(); 224 225 /** 226 * @brief Set the Display State object 227 * 228 * @param state State of display. 229 * @param callback Callback for display state. 230 * @return True means set success, false means set failed. 231 */ 232 bool SetDisplayState(DisplayState state, DisplayStateCallback callback); 233 234 /** 235 * @brief Get the state of the target display. 236 * 237 * @param displayId Display id. 238 * @return State of display. 239 */ 240 DisplayState GetDisplayState(DisplayId displayId); 241 242 /** 243 * @brief Set the brightness level of the target screen. 244 * 245 * @param screenId Target screen. 246 * @param level Brightness level. 247 */ 248 bool SetScreenBrightness(uint64_t screenId, uint32_t level); 249 250 /** 251 * @brief Get the brightness level of the target screen. 252 * 253 * @param screenId Screen id. 254 * @return Brightness value of screen. 255 */ 256 uint32_t GetScreenBrightness(uint64_t screenId) const; 257 258 /** 259 * @brief Notify when events of certain types occur. 260 * 261 * @param event Enumerate value of DisplayEvent. 262 */ 263 void NotifyDisplayEvent(DisplayEvent event); 264 265 /** 266 * @brief Freeze target displays. 267 * 268 * @param displayIds Display id needed to freeze. 269 * @return True means freeze success, false means freeze failed. 270 */ 271 bool Freeze(std::vector<DisplayId> displayIds); 272 273 /** 274 * @brief Unfreeze target displays. 275 * 276 * @param displayIds Display id needed to unfreeze. 277 * @return True means unfreeze success, false means unfreeze failed. 278 */ 279 bool Unfreeze(std::vector<DisplayId> displayIds); 280 281 /** 282 * @brief Resgister a display listener. 283 * 284 * @param listener IDisplayListener. 285 * @return DM_OK means register success, others means register failed. 286 */ 287 DMError RegisterDisplayListener(sptr<IDisplayListener> listener); 288 289 /** 290 * @brief Unregister an existed display listener. 291 * 292 * @param listener IDisplayListener. 293 * @return DM_OK means unregister success, others means unregister failed. 294 */ 295 DMError UnregisterDisplayListener(sptr<IDisplayListener> listener); 296 297 /** 298 * @brief Register a listener for display power events. 299 * 300 * @param listener IDisplayPowerEventListener. 301 * @return DM_OK means register success, others means register failed. 302 */ 303 DMError RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener); 304 305 /** 306 * @brief Unregiste an existed listener for display power events. 307 * 308 * @param listener IDisplayPowerEventListener. 309 * @return DM_OK means unregister success, others means unregister failed. 310 */ 311 DMError UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener); 312 313 /** 314 * @brief Register a listener for screenshot event. 315 * 316 * @param listener IScreenshotListener. 317 * @return DM_OK means register success, others means register failed. 318 */ 319 DMError RegisterScreenshotListener(sptr<IScreenshotListener> listener); 320 321 /** 322 * @brief Unregister an existed listener for screenshot event. 323 * 324 * @param listener IScreenshotListener. 325 * @return DM_OK means unregister success, others means unregister failed. 326 */ 327 DMError UnregisterScreenshotListener(sptr<IScreenshotListener> listener); 328 329 /** 330 * @brief Register a listener for the event of private window. 331 * 332 * @param listener IPrivateWindowListener. 333 * @return DM_OK means register success, others means register failed. 334 */ 335 DMError RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener); 336 337 /** 338 * @brief Unregister an existed listener for the event of private window. 339 * 340 * @param listener IPrivateWindowListener. 341 * @return DM_OK means unregister success, others means unregister failed. 342 */ 343 DMError UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener); 344 345 /** 346 * @brief Register a listener for the event of screen fold status changed. 347 * 348 * @param listener IFoldStatusListener. 349 * @return DM_OK means register success, others means register failed. 350 */ 351 DMError RegisterFoldStatusListener(sptr<IFoldStatusListener> listener); 352 353 /** 354 * @brief Unregister an existed listener for the event of screen fold status changed. 355 * 356 * @param listener IFoldStatusListener. 357 * @return DM_OK means unregister success, others means unregister failed. 358 */ 359 DMError UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener); 360 361 /** 362 * @brief Register an listener when session changed. 363 * 364 * @param listener IDisplayUpdateListener. 365 * @return DM_OK means register success, others means unregister failed. 366 */ 367 DMError RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener); 368 369 /** 370 * @brief Unregister an listener when session changed. 371 * 372 * @param listener IDisplayUpdateListener. 373 * @return DM_OK means unregister success, others means unregister failed. 374 */ 375 DMError UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener); 376 377 /** 378 * @brief Register a listener for the event of dispaly mode changed. 379 * 380 * @param listener IDisplayModeListener. 381 * @return DM_OK means register success, others means register failed. 382 */ 383 DMError RegisterDisplayModeListener(sptr<IDisplayModeListener> listener); 384 385 /** 386 * @brief Unregister an existed listener for the event of dispaly mode changed. 387 * 388 * @param listener IDisplayModeListener. 389 * @return DM_OK means unregister success, others means unregister failed. 390 */ 391 DMError UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener); 392 393 /** 394 * @brief Register a listener for the event of available area changed. 395 * 396 * @param listener IAvailableAreaListener. 397 * @return DM_OK means unregister success, others means unregister failed. 398 */ 399 DMError RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener); 400 401 /** 402 * @brief UnRegister a listener for the event of available area changed. 403 * 404 * @param listener IAvailableAreaListener. 405 * @return DM_OK means unregister success, others means unregister failed. 406 */ 407 DMError UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener); 408 409 /** 410 * @brief Add a surface node to the target display. 411 * 412 * @param displayId Target display. 413 * @param surfaceNode SurfaceNode object. 414 * @return DM_OK means add success, others means add failed. 415 */ 416 DMError AddSurfaceNodeToDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode); 417 418 /** 419 * @brief Remove a surface node from the target display. 420 * 421 * @param displayId Target display. 422 * @param surfaceNode SurfaceNode object. 423 * @return DM_OK means remove success, others means remove failed. 424 */ 425 DMError RemoveSurfaceNodeFromDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode); 426 427 /** 428 * @brief Check whether the device is foldable. 429 * 430 * @return true means the device is foldable. 431 */ 432 bool IsFoldable(); 433 434 /** 435 * @brief Get the current fold status of the foldable device. 436 * 437 * @return fold status of device. 438 */ 439 FoldStatus GetFoldStatus(); 440 441 /** 442 * @brief Get the display mode of the foldable device. 443 * 444 * @return display mode of the foldable device. 445 */ 446 FoldDisplayMode GetFoldDisplayMode(); 447 448 /** 449 * @brief Change the display mode of the foldable device. 450 * 451 * @param mode target display mode to change. 452 */ 453 void SetFoldDisplayMode(const FoldDisplayMode mode); 454 455 /** 456 * @brief Locked fold status. 457 * 458 * @param mode locked fold status is locked. 459 */ 460 void SetFoldStatusLocked(bool locked); 461 462 /** 463 * @brief Get the fold crease region in the current display mode. 464 * 465 * @return fold crease region in the current display mode. 466 */ 467 sptr<FoldCreaseRegion> GetCurrentFoldCreaseRegion(); 468 469 /** 470 * @brief convert screenId to RsScreenId. 471 * 472 * @param screenId screenId used in DisplayManager. 473 * @param rsScreenId screenId used in RenderService. 474 * 475 * @return convert success or not. 476 */ 477 bool ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId); 478 479 constexpr static int32_t MAX_RESOLUTION_SIZE_SCREENSHOT = 3840; // max resolution, 4K 480 481 private: 482 DisplayManager(); 483 ~DisplayManager(); 484 void OnRemoteDied(); 485 486 class Impl; 487 std::recursive_mutex mutex_; 488 bool destroyed_ = false; 489 sptr<Impl> pImpl_; 490 }; 491 } // namespace OHOS::Rosen 492 493 #endif // FOUNDATION_DM_DISPLAY_MANAGER_H