1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2021-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#ifndef FOUNDATION_DM_DISPLAY_MANAGER_H
17e0dac50fSopenharmony_ci#define FOUNDATION_DM_DISPLAY_MANAGER_H
18e0dac50fSopenharmony_ci
19e0dac50fSopenharmony_ci#include <vector>
20e0dac50fSopenharmony_ci#include <mutex>
21e0dac50fSopenharmony_ci#include <ipc_skeleton.h>
22e0dac50fSopenharmony_ci#include <pixel_map.h>
23e0dac50fSopenharmony_ci#include <set>
24e0dac50fSopenharmony_ci
25e0dac50fSopenharmony_ci#include "display.h"
26e0dac50fSopenharmony_ci#include "dm_common.h"
27e0dac50fSopenharmony_ci#include "fold_screen_info.h"
28e0dac50fSopenharmony_ci#include "wm_single_instance.h"
29e0dac50fSopenharmony_ci#include "screenshot_info.h"
30e0dac50fSopenharmony_ci#include "display_change_info.h"
31e0dac50fSopenharmony_ci
32e0dac50fSopenharmony_cinamespace OHOS::Rosen {
33e0dac50fSopenharmony_ciclass DisplayManager {
34e0dac50fSopenharmony_ciWM_DECLARE_SINGLE_INSTANCE_BASE(DisplayManager);
35e0dac50fSopenharmony_cifriend class DMSDeathRecipient;
36e0dac50fSopenharmony_cipublic:
37e0dac50fSopenharmony_ci    class IDisplayListener : public virtual RefBase {
38e0dac50fSopenharmony_ci    public:
39e0dac50fSopenharmony_ci        /**
40e0dac50fSopenharmony_ci         * @brief Notify when a new display is created.
41e0dac50fSopenharmony_ci         */
42e0dac50fSopenharmony_ci        virtual void OnCreate(DisplayId) = 0;
43e0dac50fSopenharmony_ci
44e0dac50fSopenharmony_ci        /**
45e0dac50fSopenharmony_ci         * @brief Notify when the display is destroyed.
46e0dac50fSopenharmony_ci         */
47e0dac50fSopenharmony_ci        virtual void OnDestroy(DisplayId) = 0;
48e0dac50fSopenharmony_ci
49e0dac50fSopenharmony_ci        /**
50e0dac50fSopenharmony_ci         * @brief Notify when the state of a display changes
51e0dac50fSopenharmony_ci         */
52e0dac50fSopenharmony_ci        virtual void OnChange(DisplayId) = 0;
53e0dac50fSopenharmony_ci    };
54e0dac50fSopenharmony_ci
55e0dac50fSopenharmony_ci    class IScreenshotListener : public virtual RefBase {
56e0dac50fSopenharmony_ci    public:
57e0dac50fSopenharmony_ci        /**
58e0dac50fSopenharmony_ci         * @brief Notify when a screenshot event occurs.
59e0dac50fSopenharmony_ci         *
60e0dac50fSopenharmony_ci         * @param info Screenshot info.
61e0dac50fSopenharmony_ci         */
62e0dac50fSopenharmony_ci        virtual void OnScreenshot([[maybe_unused]]const ScreenshotInfo info) {}
63e0dac50fSopenharmony_ci    };
64e0dac50fSopenharmony_ci
65e0dac50fSopenharmony_ci    class IPrivateWindowListener : public virtual RefBase {
66e0dac50fSopenharmony_ci    public:
67e0dac50fSopenharmony_ci        /**
68e0dac50fSopenharmony_ci         * @brief Monitor whether the existence of privacy window has changed.
69e0dac50fSopenharmony_ci         *
70e0dac50fSopenharmony_ci         * @param hasPrivate True means the display has private window, false means the opposite.
71e0dac50fSopenharmony_ci         */
72e0dac50fSopenharmony_ci        virtual void OnPrivateWindow([[maybe_unused]]bool hasPrivate) {}
73e0dac50fSopenharmony_ci    };
74e0dac50fSopenharmony_ci
75e0dac50fSopenharmony_ci    class IPrivateWindowListChangeListener : public virtual RefBase {
76e0dac50fSopenharmony_ci    public:
77e0dac50fSopenharmony_ci        /**
78e0dac50fSopenharmony_ci         * @brief Monitor whether the existence of privacy window list has changed.
79e0dac50fSopenharmony_ci         *
80e0dac50fSopenharmony_ci         * @param displayId Id of the target display.
81e0dac50fSopenharmony_ci         *
82e0dac50fSopenharmony_ci         * @param privacyWindowList privacywindow bundlename list of the target display.
83e0dac50fSopenharmony_ci         */
84e0dac50fSopenharmony_ci        virtual void OnPrivateWindowListChange([[maybe_unused]]DisplayId displayId,
85e0dac50fSopenharmony_ci            [[maybe_unused]]std::vector<std::string> privacyWindowList) {}
86e0dac50fSopenharmony_ci
87e0dac50fSopenharmony_ci        /**
88e0dac50fSopenharmony_ci         * @brief only for UT to compare privacy window list.
89e0dac50fSopenharmony_ci         *
90e0dac50fSopenharmony_ci         * @param callback callback.
91e0dac50fSopenharmony_ci         */
92e0dac50fSopenharmony_ci        virtual void setCallback([[maybe_unused]]std::function<void(std::vector<std::string>)> callback) {}
93e0dac50fSopenharmony_ci    private:
94e0dac50fSopenharmony_ci        std::function<void(std::vector<std::string>)> callback_;
95e0dac50fSopenharmony_ci    };
96e0dac50fSopenharmony_ci
97e0dac50fSopenharmony_ci    class IFoldStatusListener : public virtual RefBase {
98e0dac50fSopenharmony_ci    public:
99e0dac50fSopenharmony_ci        /**
100e0dac50fSopenharmony_ci         * @brief Notify listeners when screen fold status changed.
101e0dac50fSopenharmony_ci         *
102e0dac50fSopenharmony_ci         * @param foldStatus Screen foldStatus.
103e0dac50fSopenharmony_ci         */
104e0dac50fSopenharmony_ci        virtual void OnFoldStatusChanged([[maybe_unused]]FoldStatus foldStatus) {}
105e0dac50fSopenharmony_ci    };
106e0dac50fSopenharmony_ci
107e0dac50fSopenharmony_ci    class IFoldAngleListener : public virtual RefBase {
108e0dac50fSopenharmony_ci    public:
109e0dac50fSopenharmony_ci        /**
110e0dac50fSopenharmony_ci         * @brief Notify listeners when screen fold angles changed.
111e0dac50fSopenharmony_ci         *
112e0dac50fSopenharmony_ci         * @param foldAngles Screen fold angles array.
113e0dac50fSopenharmony_ci         */
114e0dac50fSopenharmony_ci        virtual void OnFoldAngleChanged([[maybe_unused]]std::vector<float> foldAngles) {}
115e0dac50fSopenharmony_ci    };
116e0dac50fSopenharmony_ci
117e0dac50fSopenharmony_ci    class ICaptureStatusListener : public virtual RefBase {
118e0dac50fSopenharmony_ci    public:
119e0dac50fSopenharmony_ci        /**
120e0dac50fSopenharmony_ci         * @brief Notify listeners when screen capture status changed.
121e0dac50fSopenharmony_ci         *
122e0dac50fSopenharmony_ci         * @param isCapture Screen capture status.
123e0dac50fSopenharmony_ci         */
124e0dac50fSopenharmony_ci        virtual void OnCaptureStatusChanged([[maybe_unused]]bool isCapture) {}
125e0dac50fSopenharmony_ci    };
126e0dac50fSopenharmony_ci
127e0dac50fSopenharmony_ci    class IDisplayUpdateListener : public virtual RefBase {
128e0dac50fSopenharmony_ci    public:
129e0dac50fSopenharmony_ci        /**
130e0dac50fSopenharmony_ci         * @brief Notify listeners when session change display.
131e0dac50fSopenharmony_ci         *
132e0dac50fSopenharmony_ci         * @param infos DisplayChangeInfo.
133e0dac50fSopenharmony_ci         */
134e0dac50fSopenharmony_ci        virtual void OnDisplayUpdate([[maybe_unused]]const sptr<DisplayChangeInfo>& info) {}
135e0dac50fSopenharmony_ci    };
136e0dac50fSopenharmony_ci
137e0dac50fSopenharmony_ci    class IDisplayModeListener : public virtual RefBase {
138e0dac50fSopenharmony_ci    public:
139e0dac50fSopenharmony_ci        /**
140e0dac50fSopenharmony_ci         * @brief Notify listeners when display mode changed.
141e0dac50fSopenharmony_ci         *
142e0dac50fSopenharmony_ci         * @param displayMode DisplayMode.
143e0dac50fSopenharmony_ci         */
144e0dac50fSopenharmony_ci        virtual void OnDisplayModeChanged([[maybe_unused]]FoldDisplayMode displayMode) {}
145e0dac50fSopenharmony_ci    };
146e0dac50fSopenharmony_ci
147e0dac50fSopenharmony_ci    class IAvailableAreaListener : public virtual RefBase {
148e0dac50fSopenharmony_ci    public:
149e0dac50fSopenharmony_ci        /**
150e0dac50fSopenharmony_ci         * @brief Notify listeners when available area changed.
151e0dac50fSopenharmony_ci         *
152e0dac50fSopenharmony_ci         * @param DMRect area.
153e0dac50fSopenharmony_ci         */
154e0dac50fSopenharmony_ci        virtual void OnAvailableAreaChanged(DMRect area) {}
155e0dac50fSopenharmony_ci    };
156e0dac50fSopenharmony_ci
157e0dac50fSopenharmony_ci    /**
158e0dac50fSopenharmony_ci     * @brief Obtain all displays.
159e0dac50fSopenharmony_ci     *
160e0dac50fSopenharmony_ci     * @return All displays.
161e0dac50fSopenharmony_ci     */
162e0dac50fSopenharmony_ci    std::vector<sptr<Display>> GetAllDisplays();
163e0dac50fSopenharmony_ci
164e0dac50fSopenharmony_ci    /**
165e0dac50fSopenharmony_ci     * @brief Obtain the id of the default display.
166e0dac50fSopenharmony_ci     *
167e0dac50fSopenharmony_ci     * @return Default display id.
168e0dac50fSopenharmony_ci     */
169e0dac50fSopenharmony_ci    DisplayId GetDefaultDisplayId();
170e0dac50fSopenharmony_ci
171e0dac50fSopenharmony_ci    /**
172e0dac50fSopenharmony_ci     * @brief Get the default display object.
173e0dac50fSopenharmony_ci     *
174e0dac50fSopenharmony_ci     * @return Default display object.
175e0dac50fSopenharmony_ci     */
176e0dac50fSopenharmony_ci    sptr<Display> GetDefaultDisplay();
177e0dac50fSopenharmony_ci
178e0dac50fSopenharmony_ci    /**
179e0dac50fSopenharmony_ci     * @brief Get the default display object by means of sync.
180e0dac50fSopenharmony_ci     *
181e0dac50fSopenharmony_ci     * @return Default display id.
182e0dac50fSopenharmony_ci     */
183e0dac50fSopenharmony_ci    sptr<Display> GetDefaultDisplaySync(bool isFromNapi = false);
184e0dac50fSopenharmony_ci
185e0dac50fSopenharmony_ci    /**
186e0dac50fSopenharmony_ci     * @brief Get the display object by id.
187e0dac50fSopenharmony_ci     *
188e0dac50fSopenharmony_ci     * @param displayId Id of the target display.
189e0dac50fSopenharmony_ci     * @return Default display object.
190e0dac50fSopenharmony_ci     */
191e0dac50fSopenharmony_ci    sptr<Display> GetDisplayById(DisplayId displayId);
192e0dac50fSopenharmony_ci
193e0dac50fSopenharmony_ci    /**
194e0dac50fSopenharmony_ci     * @brief Get the display object by corresponding screenId.
195e0dac50fSopenharmony_ci     *
196e0dac50fSopenharmony_ci     * @param screenId The id of the target screen.
197e0dac50fSopenharmony_ci     * @return Display object.
198e0dac50fSopenharmony_ci     */
199e0dac50fSopenharmony_ci    sptr<Display> GetDisplayByScreen(ScreenId screenId);
200e0dac50fSopenharmony_ci
201e0dac50fSopenharmony_ci    /**
202e0dac50fSopenharmony_ci     * @brief Get IDs of all displays.
203e0dac50fSopenharmony_ci     *
204e0dac50fSopenharmony_ci     * @return All display IDs.
205e0dac50fSopenharmony_ci     */
206e0dac50fSopenharmony_ci    std::vector<DisplayId> GetAllDisplayIds();
207e0dac50fSopenharmony_ci
208e0dac50fSopenharmony_ci    /**
209e0dac50fSopenharmony_ci     * @brief Get whether the target display contains privacy windows.
210e0dac50fSopenharmony_ci     *
211e0dac50fSopenharmony_ci     * @param displayId Display id.
212e0dac50fSopenharmony_ci     * @param hasPrivateWindow True means display has private window, false means the opposite.
213e0dac50fSopenharmony_ci     * @return DM_OK means query privacy success, others means query failed.
214e0dac50fSopenharmony_ci     */
215e0dac50fSopenharmony_ci    DMError HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow);
216e0dac50fSopenharmony_ci
217e0dac50fSopenharmony_ci    /**
218e0dac50fSopenharmony_ci     * @brief Get screenshot of the target display.
219e0dac50fSopenharmony_ci     *
220e0dac50fSopenharmony_ci     * @param displayId Display id.
221e0dac50fSopenharmony_ci     * @param errorCode error code.
222e0dac50fSopenharmony_ci     * @return PixelMap object of screenshot.
223e0dac50fSopenharmony_ci     */
224e0dac50fSopenharmony_ci    std::shared_ptr<Media::PixelMap> GetScreenshot(DisplayId displayId, DmErrorCode* errorCode = nullptr);
225e0dac50fSopenharmony_ci
226e0dac50fSopenharmony_ci    /**
227e0dac50fSopenharmony_ci     * @brief Get screenshot by user select area.
228e0dac50fSopenharmony_ci     *
229e0dac50fSopenharmony_ci     * @param rect user select area.
230e0dac50fSopenharmony_ci     * @param errorCode error code.
231e0dac50fSopenharmony_ci     * @return PixelMap object of screenshot.
232e0dac50fSopenharmony_ci     */
233e0dac50fSopenharmony_ci    std::shared_ptr<Media::PixelMap> GetSnapshotByPicker(Media::Rect &rect, DmErrorCode* errorCode = nullptr);
234e0dac50fSopenharmony_ci
235e0dac50fSopenharmony_ci    /**
236e0dac50fSopenharmony_ci     * @brief Get screenshot of the target display.
237e0dac50fSopenharmony_ci     *
238e0dac50fSopenharmony_ci     * @param displayId Display id.
239e0dac50fSopenharmony_ci     * @param rect Rect of screenshot.
240e0dac50fSopenharmony_ci     * @param size Size of screenshot.
241e0dac50fSopenharmony_ci     * @param rotation Parameter of rotation.
242e0dac50fSopenharmony_ci     * @param errorCode error code.
243e0dac50fSopenharmony_ci     * @return PixelMap object of screenshot.
244e0dac50fSopenharmony_ci     */
245e0dac50fSopenharmony_ci    std::shared_ptr<Media::PixelMap> GetScreenshot(DisplayId displayId, const Media::Rect &rect,
246e0dac50fSopenharmony_ci        const Media::Size &size, int rotation, DmErrorCode* errorCode = nullptr);
247e0dac50fSopenharmony_ci
248e0dac50fSopenharmony_ci    /**
249e0dac50fSopenharmony_ci     * @brief Begin to wake up screen.
250e0dac50fSopenharmony_ci     *
251e0dac50fSopenharmony_ci     * @param reason Reason for power state change.
252e0dac50fSopenharmony_ci     * @return True means begin success, false means begin failed.
253e0dac50fSopenharmony_ci     */
254e0dac50fSopenharmony_ci    bool WakeUpBegin(PowerStateChangeReason reason);
255e0dac50fSopenharmony_ci
256e0dac50fSopenharmony_ci    /**
257e0dac50fSopenharmony_ci     * @brief Wake up screen end.
258e0dac50fSopenharmony_ci     *
259e0dac50fSopenharmony_ci     * @return True means end success, false means end failed.
260e0dac50fSopenharmony_ci     */
261e0dac50fSopenharmony_ci    bool WakeUpEnd();
262e0dac50fSopenharmony_ci
263e0dac50fSopenharmony_ci    /**
264e0dac50fSopenharmony_ci     * @brief Begin to suspend the screen.
265e0dac50fSopenharmony_ci     *
266e0dac50fSopenharmony_ci     * @param reason Reason for power state change.
267e0dac50fSopenharmony_ci     * @return True means begin success, false means begin failed.
268e0dac50fSopenharmony_ci     */
269e0dac50fSopenharmony_ci    bool SuspendBegin(PowerStateChangeReason reason);
270e0dac50fSopenharmony_ci
271e0dac50fSopenharmony_ci    /**
272e0dac50fSopenharmony_ci     * @brief Suspend screen end.
273e0dac50fSopenharmony_ci     *
274e0dac50fSopenharmony_ci     * @return True means suspend screen end success.
275e0dac50fSopenharmony_ci     * @return False means suspend screen end failed.
276e0dac50fSopenharmony_ci     */
277e0dac50fSopenharmony_ci    bool SuspendEnd();
278e0dac50fSopenharmony_ci
279e0dac50fSopenharmony_ci    /**
280e0dac50fSopenharmony_ci     * @brief Get id of internal screen.
281e0dac50fSopenharmony_ci     *
282e0dac50fSopenharmony_ci     * @return Internal screen id.
283e0dac50fSopenharmony_ci     */
284e0dac50fSopenharmony_ci    ScreenId GetInternalScreenId();
285e0dac50fSopenharmony_ci
286e0dac50fSopenharmony_ci    /**
287e0dac50fSopenharmony_ci     * @brief Set the screen power state by screen id.
288e0dac50fSopenharmony_ci     *
289e0dac50fSopenharmony_ci     * @param screenId Screen id.
290e0dac50fSopenharmony_ci     * @param state Screen power state.
291e0dac50fSopenharmony_ci     * @param reason Reason for power state change.
292e0dac50fSopenharmony_ci     * @return True means set success, false means set failed.
293e0dac50fSopenharmony_ci     */
294e0dac50fSopenharmony_ci    bool SetScreenPowerById(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason);
295e0dac50fSopenharmony_ci
296e0dac50fSopenharmony_ci    /**
297e0dac50fSopenharmony_ci     * @brief Set the Display State object
298e0dac50fSopenharmony_ci     *
299e0dac50fSopenharmony_ci     * @param state State of display.
300e0dac50fSopenharmony_ci     * @param callback Callback for display state.
301e0dac50fSopenharmony_ci     * @return True means set success, false means set failed.
302e0dac50fSopenharmony_ci     */
303e0dac50fSopenharmony_ci    bool SetDisplayState(DisplayState state, DisplayStateCallback callback);
304e0dac50fSopenharmony_ci
305e0dac50fSopenharmony_ci    /**
306e0dac50fSopenharmony_ci     * @brief Get the state of the target display.
307e0dac50fSopenharmony_ci     *
308e0dac50fSopenharmony_ci     * @param displayId Display id.
309e0dac50fSopenharmony_ci     * @return State of display.
310e0dac50fSopenharmony_ci     */
311e0dac50fSopenharmony_ci    DisplayState GetDisplayState(DisplayId displayId);
312e0dac50fSopenharmony_ci
313e0dac50fSopenharmony_ci    /**
314e0dac50fSopenharmony_ci     * @brief Try to cancel screenoff action before display power off.
315e0dac50fSopenharmony_ci     *
316e0dac50fSopenharmony_ci     * @return True means cancel screenoff action success.
317e0dac50fSopenharmony_ci     * @return False means cancel screenoff action failed.
318e0dac50fSopenharmony_ci     */
319e0dac50fSopenharmony_ci    bool TryToCancelScreenOff();
320e0dac50fSopenharmony_ci
321e0dac50fSopenharmony_ci    /**
322e0dac50fSopenharmony_ci     * @brief Set the brightness level of the target screen.
323e0dac50fSopenharmony_ci     *
324e0dac50fSopenharmony_ci     * @param screenId Target screen.
325e0dac50fSopenharmony_ci     * @param level Brightness level.
326e0dac50fSopenharmony_ci     */
327e0dac50fSopenharmony_ci    bool SetScreenBrightness(uint64_t screenId, uint32_t level);
328e0dac50fSopenharmony_ci
329e0dac50fSopenharmony_ci    /**
330e0dac50fSopenharmony_ci     * @brief Get the brightness level of the target screen.
331e0dac50fSopenharmony_ci     *
332e0dac50fSopenharmony_ci     * @param screenId Screen id.
333e0dac50fSopenharmony_ci     * @return Brightness value of screen.
334e0dac50fSopenharmony_ci     */
335e0dac50fSopenharmony_ci    uint32_t GetScreenBrightness(uint64_t screenId) const;
336e0dac50fSopenharmony_ci
337e0dac50fSopenharmony_ci    /**
338e0dac50fSopenharmony_ci     * @brief Notify when events of certain types occur.
339e0dac50fSopenharmony_ci     *
340e0dac50fSopenharmony_ci     * @param event Enumerate value of DisplayEvent.
341e0dac50fSopenharmony_ci     */
342e0dac50fSopenharmony_ci    void NotifyDisplayEvent(DisplayEvent event);
343e0dac50fSopenharmony_ci
344e0dac50fSopenharmony_ci    /**
345e0dac50fSopenharmony_ci     * @brief Freeze target displays.
346e0dac50fSopenharmony_ci     *
347e0dac50fSopenharmony_ci     * @param displayIds Display id needed to freeze.
348e0dac50fSopenharmony_ci     * @return True means freeze success, false means freeze failed.
349e0dac50fSopenharmony_ci     */
350e0dac50fSopenharmony_ci    bool Freeze(std::vector<DisplayId> displayIds);
351e0dac50fSopenharmony_ci
352e0dac50fSopenharmony_ci    /**
353e0dac50fSopenharmony_ci     * @brief Unfreeze target displays.
354e0dac50fSopenharmony_ci     *
355e0dac50fSopenharmony_ci     * @param displayIds Display id needed to unfreeze.
356e0dac50fSopenharmony_ci     * @return True means unfreeze success, false means unfreeze failed.
357e0dac50fSopenharmony_ci     */
358e0dac50fSopenharmony_ci    bool Unfreeze(std::vector<DisplayId> displayIds);
359e0dac50fSopenharmony_ci
360e0dac50fSopenharmony_ci    /**
361e0dac50fSopenharmony_ci     * @brief Register a display listener.
362e0dac50fSopenharmony_ci     *
363e0dac50fSopenharmony_ci     * @param listener IDisplayListener.
364e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
365e0dac50fSopenharmony_ci     */
366e0dac50fSopenharmony_ci    DMError RegisterDisplayListener(sptr<IDisplayListener> listener);
367e0dac50fSopenharmony_ci
368e0dac50fSopenharmony_ci    /**
369e0dac50fSopenharmony_ci     * @brief Unregister an existed display listener.
370e0dac50fSopenharmony_ci     *
371e0dac50fSopenharmony_ci     * @param listener IDisplayListener.
372e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
373e0dac50fSopenharmony_ci     */
374e0dac50fSopenharmony_ci    DMError UnregisterDisplayListener(sptr<IDisplayListener> listener);
375e0dac50fSopenharmony_ci
376e0dac50fSopenharmony_ci    /**
377e0dac50fSopenharmony_ci     * @brief Register a listener for display power events.
378e0dac50fSopenharmony_ci     *
379e0dac50fSopenharmony_ci     * @param listener IDisplayPowerEventListener.
380e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
381e0dac50fSopenharmony_ci     */
382e0dac50fSopenharmony_ci    DMError RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener);
383e0dac50fSopenharmony_ci
384e0dac50fSopenharmony_ci    /**
385e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for display power events.
386e0dac50fSopenharmony_ci     *
387e0dac50fSopenharmony_ci     * @param listener IDisplayPowerEventListener.
388e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
389e0dac50fSopenharmony_ci     */
390e0dac50fSopenharmony_ci    DMError UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener);
391e0dac50fSopenharmony_ci
392e0dac50fSopenharmony_ci    /**
393e0dac50fSopenharmony_ci     * @brief Register a listener for screenshot event.
394e0dac50fSopenharmony_ci     *
395e0dac50fSopenharmony_ci     * @param listener IScreenshotListener.
396e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
397e0dac50fSopenharmony_ci     */
398e0dac50fSopenharmony_ci    DMError RegisterScreenshotListener(sptr<IScreenshotListener> listener);
399e0dac50fSopenharmony_ci
400e0dac50fSopenharmony_ci    /**
401e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for screenshot event.
402e0dac50fSopenharmony_ci     *
403e0dac50fSopenharmony_ci     * @param listener IScreenshotListener.
404e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
405e0dac50fSopenharmony_ci     */
406e0dac50fSopenharmony_ci    DMError UnregisterScreenshotListener(sptr<IScreenshotListener> listener);
407e0dac50fSopenharmony_ci
408e0dac50fSopenharmony_ci    /**
409e0dac50fSopenharmony_ci     * @brief Register a listener for the event of private window.
410e0dac50fSopenharmony_ci     *
411e0dac50fSopenharmony_ci     * @param listener IPrivateWindowListener.
412e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
413e0dac50fSopenharmony_ci     */
414e0dac50fSopenharmony_ci    DMError RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener);
415e0dac50fSopenharmony_ci
416e0dac50fSopenharmony_ci    /**
417e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for the event of private window.
418e0dac50fSopenharmony_ci     *
419e0dac50fSopenharmony_ci     * @param listener IPrivateWindowListener.
420e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
421e0dac50fSopenharmony_ci     */
422e0dac50fSopenharmony_ci    DMError UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener);
423e0dac50fSopenharmony_ci
424e0dac50fSopenharmony_ci    /**
425e0dac50fSopenharmony_ci     * @brief Register a listener for the event of private window.
426e0dac50fSopenharmony_ci     *
427e0dac50fSopenharmony_ci     * @param listener IPrivateWindowListChangeListener.
428e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
429e0dac50fSopenharmony_ci     */
430e0dac50fSopenharmony_ci    DMError RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener);
431e0dac50fSopenharmony_ci
432e0dac50fSopenharmony_ci    /**
433e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for the event of private window.
434e0dac50fSopenharmony_ci     *
435e0dac50fSopenharmony_ci     * @param listener IPrivateWindowListChangeListener.
436e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
437e0dac50fSopenharmony_ci     */
438e0dac50fSopenharmony_ci    DMError UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener);
439e0dac50fSopenharmony_ci
440e0dac50fSopenharmony_ci    /**
441e0dac50fSopenharmony_ci     * @brief Register a listener for the event of screen fold status changed.
442e0dac50fSopenharmony_ci     *
443e0dac50fSopenharmony_ci     * @param listener IFoldStatusListener.
444e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
445e0dac50fSopenharmony_ci     */
446e0dac50fSopenharmony_ci    DMError RegisterFoldStatusListener(sptr<IFoldStatusListener> listener);
447e0dac50fSopenharmony_ci
448e0dac50fSopenharmony_ci    /**
449e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for the event of screen fold status changed.
450e0dac50fSopenharmony_ci     *
451e0dac50fSopenharmony_ci     * @param listener IFoldStatusListener.
452e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
453e0dac50fSopenharmony_ci     */
454e0dac50fSopenharmony_ci    DMError UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener);
455e0dac50fSopenharmony_ci
456e0dac50fSopenharmony_ci    /**
457e0dac50fSopenharmony_ci     * @brief Register a listener for the event of screen fold angle changed.
458e0dac50fSopenharmony_ci     *
459e0dac50fSopenharmony_ci     * @param listener IFoldAngleListener.
460e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
461e0dac50fSopenharmony_ci     */
462e0dac50fSopenharmony_ci    DMError RegisterFoldAngleListener(sptr<IFoldAngleListener> listener);
463e0dac50fSopenharmony_ci
464e0dac50fSopenharmony_ci    /**
465e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for the event of screen fold angle changed.
466e0dac50fSopenharmony_ci     *
467e0dac50fSopenharmony_ci     * @param listener IFoldAngleListener.
468e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
469e0dac50fSopenharmony_ci     */
470e0dac50fSopenharmony_ci    DMError UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener);
471e0dac50fSopenharmony_ci
472e0dac50fSopenharmony_ci    /**
473e0dac50fSopenharmony_ci     * @brief Register a listener for the event of screen capture status changed.
474e0dac50fSopenharmony_ci     *
475e0dac50fSopenharmony_ci     * @param listener ICaptureStatusListener.
476e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
477e0dac50fSopenharmony_ci     */
478e0dac50fSopenharmony_ci    DMError RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener);
479e0dac50fSopenharmony_ci
480e0dac50fSopenharmony_ci    /**
481e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for the event of screen capture status changed.
482e0dac50fSopenharmony_ci     *
483e0dac50fSopenharmony_ci     * @param listener ICaptureStatusListener.
484e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
485e0dac50fSopenharmony_ci     */
486e0dac50fSopenharmony_ci    DMError UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener);
487e0dac50fSopenharmony_ci
488e0dac50fSopenharmony_ci    /**
489e0dac50fSopenharmony_ci     * @brief Register an listener when session changed.
490e0dac50fSopenharmony_ci     *
491e0dac50fSopenharmony_ci     * @param listener IDisplayUpdateListener.
492e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means unregister failed.
493e0dac50fSopenharmony_ci     */
494e0dac50fSopenharmony_ci    DMError RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener);
495e0dac50fSopenharmony_ci
496e0dac50fSopenharmony_ci    /**
497e0dac50fSopenharmony_ci     * @brief Unregister an listener when session changed.
498e0dac50fSopenharmony_ci     *
499e0dac50fSopenharmony_ci     * @param listener IDisplayUpdateListener.
500e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
501e0dac50fSopenharmony_ci     */
502e0dac50fSopenharmony_ci    DMError UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener);
503e0dac50fSopenharmony_ci
504e0dac50fSopenharmony_ci    /**
505e0dac50fSopenharmony_ci     * @brief Register a listener for the event of display mode changed.
506e0dac50fSopenharmony_ci     *
507e0dac50fSopenharmony_ci     * @param listener IDisplayModeListener.
508e0dac50fSopenharmony_ci     * @return DM_OK means register success, others means register failed.
509e0dac50fSopenharmony_ci     */
510e0dac50fSopenharmony_ci    DMError RegisterDisplayModeListener(sptr<IDisplayModeListener> listener);
511e0dac50fSopenharmony_ci
512e0dac50fSopenharmony_ci    /**
513e0dac50fSopenharmony_ci     * @brief Unregister an existed listener for the event of display mode changed.
514e0dac50fSopenharmony_ci     *
515e0dac50fSopenharmony_ci     * @param listener IDisplayModeListener.
516e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
517e0dac50fSopenharmony_ci     */
518e0dac50fSopenharmony_ci    DMError UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener);
519e0dac50fSopenharmony_ci
520e0dac50fSopenharmony_ci    /**
521e0dac50fSopenharmony_ci     * @brief Register a listener for the event of available  area changed.
522e0dac50fSopenharmony_ci     *
523e0dac50fSopenharmony_ci     * @param listener IAvailableAreaListener.
524e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
525e0dac50fSopenharmony_ci     */
526e0dac50fSopenharmony_ci    DMError RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener);
527e0dac50fSopenharmony_ci
528e0dac50fSopenharmony_ci    /**
529e0dac50fSopenharmony_ci     * @brief UnRegister a listener for the event of available  area changed.
530e0dac50fSopenharmony_ci     *
531e0dac50fSopenharmony_ci     * @param listener IAvailableAreaListener.
532e0dac50fSopenharmony_ci     * @return DM_OK means unregister success, others means unregister failed.
533e0dac50fSopenharmony_ci     */
534e0dac50fSopenharmony_ci    DMError UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener);
535e0dac50fSopenharmony_ci
536e0dac50fSopenharmony_ci    /**
537e0dac50fSopenharmony_ci     * @brief Add a surface node to the target display.
538e0dac50fSopenharmony_ci     *
539e0dac50fSopenharmony_ci     * @param displayId Target display.
540e0dac50fSopenharmony_ci     * @param surfaceNode SurfaceNode object.
541e0dac50fSopenharmony_ci     * @return DM_OK means add success, others means add failed.
542e0dac50fSopenharmony_ci     */
543e0dac50fSopenharmony_ci    DMError AddSurfaceNodeToDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode);
544e0dac50fSopenharmony_ci
545e0dac50fSopenharmony_ci    /**
546e0dac50fSopenharmony_ci     * @brief Remove a surface node from the target display.
547e0dac50fSopenharmony_ci     *
548e0dac50fSopenharmony_ci     * @param displayId Target display.
549e0dac50fSopenharmony_ci     * @param surfaceNode SurfaceNode object.
550e0dac50fSopenharmony_ci     * @return DM_OK means remove success, others means remove failed.
551e0dac50fSopenharmony_ci     */
552e0dac50fSopenharmony_ci    DMError RemoveSurfaceNodeFromDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode);
553e0dac50fSopenharmony_ci
554e0dac50fSopenharmony_ci    /**
555e0dac50fSopenharmony_ci     * @brief Check whether the device is foldable.
556e0dac50fSopenharmony_ci     *
557e0dac50fSopenharmony_ci     * @return true means the device is foldable.
558e0dac50fSopenharmony_ci     */
559e0dac50fSopenharmony_ci    bool IsFoldable();
560e0dac50fSopenharmony_ci
561e0dac50fSopenharmony_ci    /**
562e0dac50fSopenharmony_ci     * @brief Check whether the device is capture.
563e0dac50fSopenharmony_ci     *
564e0dac50fSopenharmony_ci     * @return true means the device is capture.
565e0dac50fSopenharmony_ci     */
566e0dac50fSopenharmony_ci    bool IsCaptured();
567e0dac50fSopenharmony_ci
568e0dac50fSopenharmony_ci    /**
569e0dac50fSopenharmony_ci     * @brief Get the current fold status of the foldable device.
570e0dac50fSopenharmony_ci     *
571e0dac50fSopenharmony_ci     * @return fold status of device.
572e0dac50fSopenharmony_ci     */
573e0dac50fSopenharmony_ci    FoldStatus GetFoldStatus();
574e0dac50fSopenharmony_ci
575e0dac50fSopenharmony_ci    /**
576e0dac50fSopenharmony_ci     * @brief Get the display mode of the foldable device.
577e0dac50fSopenharmony_ci     *
578e0dac50fSopenharmony_ci     * @return display mode of the foldable device.
579e0dac50fSopenharmony_ci     */
580e0dac50fSopenharmony_ci    FoldDisplayMode GetFoldDisplayMode();
581e0dac50fSopenharmony_ci
582e0dac50fSopenharmony_ci    /**
583e0dac50fSopenharmony_ci     * @brief Change the display mode of the foldable device.
584e0dac50fSopenharmony_ci     *
585e0dac50fSopenharmony_ci     * @param mode target display mode to change.
586e0dac50fSopenharmony_ci     */
587e0dac50fSopenharmony_ci    void SetFoldDisplayMode(const FoldDisplayMode mode);
588e0dac50fSopenharmony_ci
589e0dac50fSopenharmony_ci    /**
590e0dac50fSopenharmony_ci     * @brief Change the display mode of the foldable device from js.
591e0dac50fSopenharmony_ci     *
592e0dac50fSopenharmony_ci     * @param mode target display mode to change.
593e0dac50fSopenharmony_ci     * @return DM_OK means set success, others means set failed.
594e0dac50fSopenharmony_ci     */
595e0dac50fSopenharmony_ci    DMError SetFoldDisplayModeFromJs(const FoldDisplayMode mode);
596e0dac50fSopenharmony_ci
597e0dac50fSopenharmony_ci    /**
598e0dac50fSopenharmony_ci     * @brief Set display scale.
599e0dac50fSopenharmony_ci     *
600e0dac50fSopenharmony_ci     * @param screenId screenId used in DisplayManager.
601e0dac50fSopenharmony_ci     * @param scaleX screen scale in x axis.
602e0dac50fSopenharmony_ci     * @param scaleY screen scale in y axis.
603e0dac50fSopenharmony_ci     * @param pivotX screen scale pivot in x axis.
604e0dac50fSopenharmony_ci     * @param pivotY screen scale pivot in y axis.
605e0dac50fSopenharmony_ci     */
606e0dac50fSopenharmony_ci    void SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY);
607e0dac50fSopenharmony_ci
608e0dac50fSopenharmony_ci    /**
609e0dac50fSopenharmony_ci     * @brief Locked fold status.
610e0dac50fSopenharmony_ci     *
611e0dac50fSopenharmony_ci     * @param mode locked fold status is locked.
612e0dac50fSopenharmony_ci     */
613e0dac50fSopenharmony_ci    void SetFoldStatusLocked(bool locked);
614e0dac50fSopenharmony_ci
615e0dac50fSopenharmony_ci    /**
616e0dac50fSopenharmony_ci     * @brief Locked fold status from js.
617e0dac50fSopenharmony_ci     *
618e0dac50fSopenharmony_ci     * @param locked locked fold status is locked.
619e0dac50fSopenharmony_ci     * @return DM_OK means set success, others means set failed.
620e0dac50fSopenharmony_ci     */
621e0dac50fSopenharmony_ci    DMError SetFoldStatusLockedFromJs(bool locked);
622e0dac50fSopenharmony_ci
623e0dac50fSopenharmony_ci    /**
624e0dac50fSopenharmony_ci     * @brief Get the fold crease region in the current display mode.
625e0dac50fSopenharmony_ci     *
626e0dac50fSopenharmony_ci     * @return fold crease region in the current display mode.
627e0dac50fSopenharmony_ci     */
628e0dac50fSopenharmony_ci    sptr<FoldCreaseRegion> GetCurrentFoldCreaseRegion();
629e0dac50fSopenharmony_ci
630e0dac50fSopenharmony_ci    /**
631e0dac50fSopenharmony_ci     * @brief convert screenId to RsScreenId.
632e0dac50fSopenharmony_ci     *
633e0dac50fSopenharmony_ci     * @param screenId screenId used in DisplayManager.
634e0dac50fSopenharmony_ci     * @param rsScreenId screenId used in RenderService.
635e0dac50fSopenharmony_ci     *
636e0dac50fSopenharmony_ci     * @return convert success or not.
637e0dac50fSopenharmony_ci     */
638e0dac50fSopenharmony_ci    bool ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId);
639e0dac50fSopenharmony_ci
640e0dac50fSopenharmony_ci    /**
641e0dac50fSopenharmony_ci     * @brief Set virtual screen black list to RS.
642e0dac50fSopenharmony_ci     *
643e0dac50fSopenharmony_ci     * @param screenId ScreenId used in virtual screen.
644e0dac50fSopenharmony_ci     * @param windowIdList The windowId list to shield on cast screen.
645e0dac50fSopenharmony_ci    */
646e0dac50fSopenharmony_ci    void SetVirtualScreenBlackList(ScreenId screenId, std::vector<uint64_t>& windowIdList);
647e0dac50fSopenharmony_ci
648e0dac50fSopenharmony_ci    /**
649e0dac50fSopenharmony_ci     * @brief When casting the screen, the display not be skipped after the physical screen is turned off.
650e0dac50fSopenharmony_ci     *
651e0dac50fSopenharmony_ci     * @param screenId ScreenId used in virtual screen.
652e0dac50fSopenharmony_ci    */
653e0dac50fSopenharmony_ci    void DisablePowerOffRenderControl(ScreenId screenId);
654e0dac50fSopenharmony_ci
655e0dac50fSopenharmony_ci    /**
656e0dac50fSopenharmony_ci     * @brief get to freeze status with specified pid list
657e0dac50fSopenharmony_ci     *
658e0dac50fSopenharmony_ci     * @param pidList Indicates the calling pid
659e0dac50fSopenharmony_ci     * @param isProxy value is true indicates process status is freeze
660e0dac50fSopenharmony_ci     * @param DM_OK means process status update success, others means update failed.
661e0dac50fSopenharmony_ci    */
662e0dac50fSopenharmony_ci    DMError ProxyForFreeze(std::set<int32_t> pidList, bool isProxy);
663e0dac50fSopenharmony_ci
664e0dac50fSopenharmony_ci    /**
665e0dac50fSopenharmony_ci     * @brief reset all process freeze status
666e0dac50fSopenharmony_ci     *
667e0dac50fSopenharmony_ci     * @param DM_OK means process status update success, others means update failed.
668e0dac50fSopenharmony_ci    */
669e0dac50fSopenharmony_ci    DMError ResetAllFreezeStatus();
670e0dac50fSopenharmony_ci
671e0dac50fSopenharmony_ci    /**
672e0dac50fSopenharmony_ci     * @brief get all display physical resolution
673e0dac50fSopenharmony_ci     *
674e0dac50fSopenharmony_ci     * @return all physical resolution
675e0dac50fSopenharmony_ci     */
676e0dac50fSopenharmony_ci    std::vector<DisplayPhysicalResolution> GetAllDisplayPhysicalResolution();
677e0dac50fSopenharmony_ci
678e0dac50fSopenharmony_ci    /**
679e0dac50fSopenharmony_ci     * @brief set virtual screen security exemption
680e0dac50fSopenharmony_ci     *
681e0dac50fSopenharmony_ci     * @param DM_OK means set exemption is success.
682e0dac50fSopenharmony_ci    */
683e0dac50fSopenharmony_ci    DMError SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid, std::vector<uint64_t>& windowIdList);
684e0dac50fSopenharmony_ci
685e0dac50fSopenharmony_ci    constexpr static int32_t MAX_RESOLUTION_SIZE_SCREENSHOT = 3840; // max resolution, 4K
686e0dac50fSopenharmony_ci
687e0dac50fSopenharmony_ci    /**
688e0dac50fSopenharmony_ci     * @brief Add displayId for current ability through Ability Management.
689e0dac50fSopenharmony_ci     *
690e0dac50fSopenharmony_ci     * @param displayId Identifier of the current display.
691e0dac50fSopenharmony_ci     * @param abilityToken Token of the ability.
692e0dac50fSopenharmony_ci     */
693e0dac50fSopenharmony_ci    void AddDisplayIdFromAms(DisplayId displayId, const wptr<IRemoteObject>& abilityToken);
694e0dac50fSopenharmony_ci
695e0dac50fSopenharmony_ci    /**
696e0dac50fSopenharmony_ci     * @brief Removes the display identifier through the Ability Management.
697e0dac50fSopenharmony_ci     *
698e0dac50fSopenharmony_ci     * @param abilityToken Token of ability.
699e0dac50fSopenharmony_ci     */
700e0dac50fSopenharmony_ci    void RemoveDisplayIdFromAms(const wptr<IRemoteObject>& abilityToken);
701e0dac50fSopenharmony_ci
702e0dac50fSopenharmony_ciprivate:
703e0dac50fSopenharmony_ci    DisplayManager();
704e0dac50fSopenharmony_ci    ~DisplayManager();
705e0dac50fSopenharmony_ci    void OnRemoteDied();
706e0dac50fSopenharmony_ci
707e0dac50fSopenharmony_ci    void ShowDisplayIdList(bool isShowLog = false);
708e0dac50fSopenharmony_ci    std::mutex displayOperateMutex_;
709e0dac50fSopenharmony_ci    DisplayId GetCallingAbilityDisplayId();
710e0dac50fSopenharmony_ci    std::vector<std::pair<wptr<IRemoteObject>, DisplayId>> displayIdList_ {};
711e0dac50fSopenharmony_ci
712e0dac50fSopenharmony_ci    class Impl;
713e0dac50fSopenharmony_ci    std::recursive_mutex mutex_;
714e0dac50fSopenharmony_ci    sptr<Impl> pImpl_;
715e0dac50fSopenharmony_ci};
716e0dac50fSopenharmony_ci} // namespace OHOS::Rosen
717e0dac50fSopenharmony_ci
718e0dac50fSopenharmony_ci#endif // FOUNDATION_DM_DISPLAY_MANAGER_H