/* * 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 "common/include/task_scheduler.h" #include "session/screen/include/screen_session.h" #include "zidl/screen_session_manager_stub.h" #include "client_agent_container.h" #include "display_change_listener.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" namespace OHOS::Rosen { class IScreenConnectionListener : public RefBase { public: IScreenConnectionListener() = default; virtual ~IScreenConnectionListener() = default; virtual void OnScreenConnect(sptr&) = 0; virtual void OnScreenDisconnect(sptr&) = 0; }; class RSInterfaces; class ScreenSessionManager : public ScreenSessionManagerStub { WM_DECLARE_SINGLE_INSTANCE_BASE(ScreenSessionManager) public: sptr GetScreenSession(ScreenId screenId) const; std::vector GetAllScreenIds(); sptr GetDefaultDisplayInfo() override; DMError SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override; DMError SetVirtualPixelRatio(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; void DumpAllScreensInfo(std::string& dumpInfo) override; void DumpSpecialScreenInfo(ScreenId id, std::string& dumpInfo) override; void RegisterScreenConnectionListener(sptr& screenConnectionListener); void UnregisterScreenConnectionListener(sptr& screenConnectionListener); 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 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); 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 DestroyVirtualScreen(ScreenId screenId) override; virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, ScreenId& screenGroupId) 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 UpdateScreenRotationProperty(ScreenId screenId, RRect bounds, int rotation); 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); ScreenId GetDefaultAbstractScreenId(); 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); DMError SetMirror(ScreenId screenId, std::vector screens); 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); void UpdatePrivateStateAndNotify(sptr& screenSession, bool isAddingPrivateSession); DMError HasPrivateWindow(DisplayId id, bool& hasPrivateWindow) 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); sptr GetCutoutInfo(DisplayId displayId) override; void SetDisplayBoundary(const sptr screenSession); //Fold Screen void SetFoldDisplayMode(const FoldDisplayMode displayMode) override; FoldDisplayMode GetFoldDisplayMode() override; bool IsFoldable() override; FoldStatus GetFoldStatus() override; sptr GetCurrentFoldCreaseRegion() override; ScreenProperty GetPhyScreenProperty(ScreenId screenId); uint32_t GetCurvedCompressionArea() const; void NotifyFoldStatusChanged(FoldStatus foldStatus); void NotifyDisplayModeChanged(FoldDisplayMode displayMode); protected: ScreenSessionManager(); virtual ~ScreenSessionManager() = default; private: void Init(); void LoadScreenSceneXml(); void ConfigureScreenScene(); void ConfigureWaterfallDisplayCompressionParams(); void RegisterScreenChangeListener(); void OnScreenChange(ScreenId screenId, ScreenEvent screenEvent); sptr GetOrCreateScreenSession(ScreenId screenId); ScreenId GetDefaultScreenId(); void NotifyDisplayStateChange(DisplayId defaultDisplayId, sptr displayInfo, const std::map>& displayInfoMap, DisplayStateChangeType type); bool OnRemoteDied(const sptr& agent); std::string TransferTypeToString(ScreenType type) const; 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_; ClientAgentContainer dmAgentContainer_; mutable std::recursive_mutex screenSessionMapMutex_; std::map> screenSessionMap_; 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 }; std::vector> screenConnectionListenerList_; sptr displayChangeListener_; sptr sessionDisplayPowerController_; sptr screenCutoutController_; bool isDensityDpiLoad_ = false; float densityDpi_ { 1.0f }; }; } // namespace OHOS::Rosen #endif // OHOS_ROSEN_WINDOW_SCENE_SCREEN_SESSION_MANAGER_H