/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OHOS_ROSEN_WINDOW_SCENE_SCREEN_SESSION_MANAGER_H #define OHOS_ROSEN_WINDOW_SCENE_SCREEN_SESSION_MANAGER_H #include #include #include "common/include/task_scheduler.h" #include "dm_common.h" #include "session/screen/include/screen_session.h" #include "zidl/screen_session_manager_stub.h" #include "client_agent_container.h" #include "session_display_power_controller.h" #include "wm_single_instance.h" #include "agent_death_recipient.h" #include "screen.h" #include "screen_cutout_controller.h" #include "fold_screen_controller/fold_screen_controller.h" namespace OHOS::Rosen { class RSInterfaces; class ScreenSessionManager : public SystemAbility, public ScreenSessionManagerStub, public IScreenChangeListener { DECLARE_SYSTEM_ABILITY(ScreenSessionManager) WM_DECLARE_SINGLE_INSTANCE_BASE(ScreenSessionManager) public: sptr GetScreenSession(ScreenId screenId) const; sptr GetDefaultScreenSession(); std::vector GetAllScreenIds(); sptr GetDefaultDisplayInfo() override; DMError SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override; DMError SetVirtualPixelRatio(ScreenId screenId, float virtualPixelRatio) override; DMError SetResolution(ScreenId screenId, uint32_t width, uint32_t height, float virtualPixelRatio) override; DMError GetDensityInCurResolution(ScreenId screenId, float& virtualPixelRatio) override; void NotifyScreenChanged(sptr screenInfo, ScreenChangeEvent event); DMError GetScreenColorGamut(ScreenId screenId, ScreenColorGamut& colorGamut) override; DMError SetScreenColorGamut(ScreenId screenId, int32_t colorGamutIdx) override; DMError GetScreenGamutMap(ScreenId screenId, ScreenGamutMap& gamutMap) override; DMError SetScreenGamutMap(ScreenId screenId, ScreenGamutMap gamutMap) override; DMError SetScreenColorTransform(ScreenId screenId) override; DMError GetPixelFormat(ScreenId screenId, GraphicPixelFormat& pixelFormat) override; DMError SetPixelFormat(ScreenId screenId, GraphicPixelFormat pixelFormat) override; DMError GetSupportedHDRFormats(ScreenId screenId, std::vector& hdrFormats) override; DMError GetScreenHDRFormat(ScreenId screenId, ScreenHDRFormat& hdrFormat) override; DMError SetScreenHDRFormat(ScreenId screenId, int32_t modeIdx) override; DMError GetSupportedColorSpaces(ScreenId screenId, std::vector& colorSpaces) override; DMError GetScreenColorSpace(ScreenId screenId, GraphicCM_ColorSpaceType& colorSpace) override; DMError SetScreenColorSpace(ScreenId screenId, GraphicCM_ColorSpaceType colorSpace) override; void DumpAllScreensInfo(std::string& dumpInfo) override; void DumpSpecialScreenInfo(ScreenId id, std::string& dumpInfo) override; virtual DMError RegisterDisplayManagerAgent(const sptr& displayManagerAgent, DisplayManagerAgentType type) override; virtual DMError UnregisterDisplayManagerAgent(const sptr& displayManagerAgent, DisplayManagerAgentType type) override; bool WakeUpBegin(PowerStateChangeReason reason) override; bool WakeUpEnd() override; bool SuspendBegin(PowerStateChangeReason reason) override; bool SuspendEnd() override; bool SetDisplayState(DisplayState state) override; DisplayState GetDisplayState(DisplayId displayId) override; bool SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason) override; bool SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason) override; ScreenPowerState GetScreenPower(ScreenId screenId) override; void NotifyDisplayEvent(DisplayEvent event) override; void RegisterDisplayChangeListener(sptr listener); bool NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status, PowerStateChangeReason reason); bool NotifyDisplayStateChanged(DisplayId id, DisplayState state); void NotifyScreenshot(DisplayId displayId); virtual ScreenId CreateVirtualScreen(VirtualScreenOption option, const sptr& displayManagerAgent) override; virtual DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface) override; virtual DMError SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool autoRotate) override; virtual DMError DestroyVirtualScreen(ScreenId screenId) override; DMError ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height) override; virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, ScreenId& screenGroupId) override; virtual DMError StopMirror(const std::vector& mirrorScreenIds) override; DMError DisableMirror(bool disableOrNot) override; virtual DMError MakeExpand(std::vector screenId, std::vector startPoint, ScreenId& screenGroupId) override; virtual DMError StopExpand(const std::vector& expandScreenIds) override; DMError MakeUniqueScreen(const std::vector& screenIds) override; virtual sptr GetScreenGroupInfoById(ScreenId screenId) override; virtual void RemoveVirtualScreenFromGroup(std::vector screens) override; virtual std::shared_ptr GetDisplaySnapshot(DisplayId displayId, DmErrorCode* errorCode) override; virtual sptr GetDisplayInfoById(DisplayId displayId) override; sptr GetDisplayInfoByScreen(ScreenId screenId) override; std::vector GetAllDisplayIds() override; virtual sptr GetScreenInfoById(ScreenId screenId) override; virtual DMError GetAllScreenInfos(std::vector>& screenInfos) override; virtual DMError GetScreenSupportedColorGamuts(ScreenId screenId, std::vector& colorGamuts) override; DMError IsScreenRotationLocked(bool& isLocked) override; DMError SetScreenRotationLocked(bool isLocked) override; DMError SetOrientation(ScreenId screenId, Orientation orientation) override; DMError SetOrientationFromWindow(DisplayId displayId, Orientation orientation); DMError SetOrientationController(ScreenId screenId, Orientation newOrientation, bool isFromWindow); bool SetRotation(ScreenId screenId, Rotation rotationAfter, bool isFromWindow); void SetSensorSubscriptionEnabled(); bool SetRotationFromWindow(Rotation targetRotation); sptr GetScreenModesByDisplayId(DisplayId displayId); sptr GetScreenInfoByDisplayId(DisplayId displayId); void NotifyDisplayCreate(sptr displayInfo); void NotifyDisplayDestroy(DisplayId displayId); void NotifyDisplayChanged(sptr displayInfo, DisplayChangeEvent event); std::vector GetAllScreenIds() const; const std::shared_ptr GetRSDisplayNodeByScreenId(ScreenId smsScreenId) const; std::shared_ptr GetScreenSnapshot(DisplayId displayId); sptr InitVirtualScreen(ScreenId smsScreenId, ScreenId rsId, VirtualScreenOption option); sptr InitAndGetScreen(ScreenId rsScreenId); bool InitAbstractScreenModesInfo(sptr& absScreen); std::vector GetAllValidScreenIds(const std::vector& screenIds) const; sptr AddToGroupLocked(sptr newScreen); sptr AddAsFirstScreenLocked(sptr newScreen); sptr AddAsSuccedentScreenLocked(sptr newScreen); sptr RemoveFromGroupLocked(sptr screen); sptr GetAbstractScreenGroup(ScreenId smsScreenId); void ChangeScreenGroup(sptr group, const std::vector& screens, const std::vector& startPoints, bool filterScreen, ScreenCombination combination); bool RemoveChildFromGroup(sptr screen, sptr screenGroup); void AddScreenToGroup(sptr group, const std::vector& addScreens, const std::vector& addChildPos, std::map& removeChildResMap); bool CheckScreenInScreenGroup(sptr screen) const; DMError SetMirror(ScreenId screenId, std::vector screens); DMError StopScreens(const std::vector& screenIds, ScreenCombination stopCombination); void NotifyScreenConnected(sptr screenInfo); void NotifyScreenDisconnected(ScreenId screenId); void NotifyScreenGroupChanged(const sptr& screenInfo, ScreenGroupChangeEvent event); void NotifyScreenGroupChanged(const std::vector>& screenInfo, ScreenGroupChangeEvent event); void NotifyPrivateSessionStateChanged(bool hasPrivate); DMError HasPrivateWindow(DisplayId id, bool& hasPrivateWindow) override; bool ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId) override; void OnScreenConnect(const sptr screenInfo); void OnScreenDisconnect(ScreenId screenId); void OnScreenGroupChange(const std::string& trigger, const sptr& screenInfo, ScreenGroupChangeEvent groupEvent); void OnScreenGroupChange(const std::string& trigger, const std::vector>& screenInfos, ScreenGroupChangeEvent groupEvent); void OnScreenshot(sptr info); bool IsMultiScreenCollaboration(); sptr GetCutoutInfo(DisplayId displayId) override; DMError HasImmersiveWindow(bool& immersive) override; void SetDisplayBoundary(const sptr screenSession); //Fold Screen void SetFoldDisplayMode(const FoldDisplayMode displayMode) override; void SetDisplayNodeScreenId(ScreenId screenId, ScreenId displayNodeScreenId); void SetFoldStatusLocked(bool locked) override; FoldDisplayMode GetFoldDisplayMode() override; bool IsFoldable() override; FoldStatus GetFoldStatus() override; bool SetScreenPower(ScreenPowerStatus status, PowerStateChangeReason reason); void SetKeyguardDrawnDoneFlag(bool flag); sptr GetCurrentFoldCreaseRegion() override; void NotifyFoldStatusChanged(FoldStatus foldStatus); void NotifyDisplayModeChanged(FoldDisplayMode displayMode); void NotifyDisplayChangeInfoChanged(const sptr& info) override; void RegisterSettingDpiObserver(); void OnConnect(ScreenId screenId) override {} void OnDisconnect(ScreenId screenId) override {} void OnPropertyChange(const ScreenProperty& newProperty, ScreenPropertyChangeReason reason, ScreenId screenId) override; void OnPowerStatusChange(DisplayPowerEvent event, EventStatus status, PowerStateChangeReason reason) override; void OnSensorRotationChange(float sensorRotation, ScreenId screenId) override; void OnScreenOrientationChange(float screenOrientation, ScreenId screenId) override; void OnScreenRotationLockedChange(bool isLocked, ScreenId screenId) override; void SetHdrFormats(ScreenId screenId, sptr& session); void SetColorSpaces(ScreenId screenId, sptr& session); void SetClient(const sptr& client, int32_t userId) override; ScreenProperty GetScreenProperty(ScreenId screenId) override; std::shared_ptr GetDisplayNode(ScreenId screenId) override; void UpdateScreenRotationProperty(ScreenId screenId, const RRect& bounds, float rotation) override; uint32_t GetCurvedCompressionArea() override; ScreenProperty GetPhyScreenProperty(ScreenId screenId) override; void SetScreenPrivacyState(bool hasPrivate) override; void UpdateAvailableArea(ScreenId screenId, DMRect area) override; DMError GetAvailableArea(DisplayId displayId, DMRect& area) override; void NotifyAvailableAreaChanged(DMRect area); void NotifyFoldToExpandCompletion(bool foldToExpand) override; protected: ScreenSessionManager(); virtual ~ScreenSessionManager() = default; private: void OnStart() override; void Init(); void LoadScreenSceneXml(); void ConfigureScreenScene(); void ConfigureWaterfallDisplayCompressionParams(); void RegisterScreenChangeListener(); void OnScreenChange(ScreenId screenId, ScreenEvent screenEvent); void RegisterRefreshRateModeChangeListener(); void OnHgmRefreshRateModeChange(int32_t refreshRateMode); sptr GetOrCreateScreenSession(ScreenId screenId); sptr GetScreenSessionInner(ScreenId screenId, ScreenProperty property); void FreeDisplayMirrorNodeInner(const sptr mirrorSession); ScreenId GetDefaultScreenId(); void NotifyDisplayStateChange(DisplayId defaultDisplayId, sptr displayInfo, const std::map>& displayInfoMap, DisplayStateChangeType type); bool OnMakeExpand(std::vector screenId, std::vector startPoint); bool OnRemoteDied(const sptr& agent); std::string TransferTypeToString(ScreenType type) const; void CheckAndSendHiSysEvent(const std::string& eventName, const std::string& bundleName) const; void HandlerSensor(ScreenPowerStatus status); // notify scb virtual screen change void OnVirtualScreenChange(ScreenId screenId, ScreenEvent screenEvent); int Dump(int fd, const std::vector& args) override; void ShowHelpInfo(std::string& dumpInfo); void ShowIllegalArgsInfo(std::string& dumpInfo); int DumpScreenInfo(const std::vector& args, std::string& dumpInfo); int DumpAllScreenInfo(std::string& dumpInfo); int DumpSpecifiedScreenInfo(ScreenId screenId, std::string& dumpInfo); bool IsValidDigitString(const std::string& idStr) const; int SetFoldDisplayMode(const std::string& modeParam); int SetFoldStatusLocked(const std::string& lockParam); class ScreenIdManager { friend class ScreenSessionGroup; public: ScreenIdManager() = default; ~ScreenIdManager() = default; WM_DISALLOW_COPY_AND_MOVE(ScreenIdManager); ScreenId CreateAndGetNewScreenId(ScreenId rsScreenId); void UpdateScreenId(ScreenId rsScreenId, ScreenId smsScreenId); bool DeleteScreenId(ScreenId smsScreenId); bool HasRsScreenId(ScreenId smsScreenId) const; bool ConvertToRsScreenId(ScreenId, ScreenId&) const; ScreenId ConvertToRsScreenId(ScreenId) const; bool ConvertToSmsScreenId(ScreenId, ScreenId&) const; ScreenId ConvertToSmsScreenId(ScreenId) const; private: std::atomic smsScreenCount_ {2}; std::map rs2SmsScreenIdMap_; std::map sms2RsScreenIdMap_; mutable std::shared_mutex screenIdMapMutex_; }; RSInterfaces& rsInterface_; std::shared_ptr taskScheduler_; std::shared_ptr screenPowerTaskScheduler_; sptr clientProxy_; ClientAgentContainer dmAgentContainer_; mutable std::recursive_mutex screenSessionMapMutex_; std::map> screenSessionMap_; std::recursive_mutex mutex_; std::recursive_mutex displayInfoMutex_; ScreenId defaultScreenId_ = SCREEN_ID_INVALID; ScreenIdManager screenIdManager_; std::atomic defaultRsScreenId_ { SCREEN_ID_INVALID }; std::map, std::vector> screenAgentMap_; std::map> smsScreenGroupMap_; bool isAutoRotationOpen_ = false; bool isExpandCombination_ = false; sptr deathRecipient_ { nullptr }; sptr sessionDisplayPowerController_; sptr screenCutoutController_; sptr foldScreenController_; bool isDensityDpiLoad_ = false; float densityDpi_ { 1.0f }; std::atomic cachedSettingDpi_ {0}; uint32_t defaultDpi {0}; bool isMultiScreenCollaboration_ = false; bool screenPrivacyStates = false; bool keyguardDrawnDone_ = true; bool needScreenOnWhenKeyguardNotify_ = false; bool blockScreenPowerChange_ = false; //Fold Screen std::map phyScreenPropMap_; mutable std::recursive_mutex phyScreenPropMapMutex_; static void BootFinishedCallback(const char *key, const char *value, void *context); std::function foldScreenPowerInit_ = nullptr; void SetFoldScreenPowerInit(std::function foldScreenPowerInit); void SetDpiFromSettingData(); }; } // namespace OHOS::Rosen #endif // OHOS_ROSEN_WINDOW_SCENE_SCREEN_SESSION_MANAGER_H