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