• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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