From 1dab589937072562fd39660785a9dc24c61ce952 Mon Sep 17 00:00:00 2001 From: yangfei Date: Sat, 28 Oct 2023 17:50:36 +0800 Subject: [PATCH 1/2] add make unique screen Signed-off-by: yangfei Change-Id: I73388d6b5c6a7c4d6818f99a2e7210fcf825451c --- dm/include/display_manager_adapter.h | 3 + dm/src/display_manager_adapter.cpp | 7 +++ dm/src/screen_manager.cpp | 19 +++++- dmserver/include/display_manager_interface.h | 4 ++ interfaces/innerkits/dm/screen_group.h | 1 + interfaces/innerkits/dm/screen_manager.h | 10 ++- .../session/screen/src/screen_session.cpp | 2 + .../include/screen_session_manager.h | 6 ++ .../zidl/screen_session_manager_interface.h | 2 + .../zidl/screen_session_manager_proxy.h | 3 + .../src/screen_session_manager.cpp | 62 +++++++++++++++++++ .../src/zidl/screen_session_manager_proxy.cpp | 33 ++++++++++ .../src/zidl/screen_session_manager_stub.cpp | 16 +++++ .../unittest/screen_session_manager_test.cpp | 12 ++++ 14 files changed, 177 insertions(+), 3 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index 6e023c95e1..7beb1c6bca 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -119,6 +119,9 @@ public: virtual DMError GetScreenGamutMap(ScreenId screenId, ScreenGamutMap& gamutMap); virtual DMError SetScreenGamutMap(ScreenId screenId, ScreenGamutMap gamutMap); virtual DMError SetScreenColorTransform(ScreenId screenId); + + // unique screen + virtual DMError MakeUniqueScreen(const std::vector& screenIds); private: static inline SingletonDelegator delegator; }; diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index dd58c6b09b..e88f2de5f8 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -527,4 +527,11 @@ DMError ScreenManagerAdapter::SetVirtualPixelRatio(ScreenId screenId, float virt return displayManagerServiceProxy_->SetVirtualPixelRatio(screenId, virtualPixelRatio); } + +DMError ScreenManagerAdapter::MakeUniqueScreen(const std::vector& screenIds) +{ + INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED); + + return displayManagerServiceProxy_->MakeUniqueScreen(screenIds); +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index 013b6dcb04..21cd1710ae 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -28,8 +28,8 @@ namespace OHOS::Rosen { namespace { - constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenManager"}; - const static uint32_t MAX_SCREEN_SIZE = 32; +constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenManager"}; +const static uint32_t MAX_SCREEN_SIZE = 32; } class ScreenManager::Impl : public RefBase { public: @@ -453,6 +453,21 @@ DMError ScreenManager::MakeExpand(const std::vector& options, Scre return ret; } +DMError ScreenManager::MakeUniqueScreen(const std::vector& screenIds) +{ + WLOGFI("start Make UniqueScreen"); + if (screenIds.empty()) { + WLOGFI("screenIds is null"); + return DMError::DM_ERROR_INVALID_PARAM; + } + if (screenIds.size() > MAX_SCREEN_SIZE) { + WLOGFW("Make UniqueScreen failed. The screenIds size is bigger than %{public}u.", MAX_SCREEN_SIZE); + return DMError::DM_ERROR_INVALID_PARAM; + } + DMError ret = SingletonContainer::Get().MakeUniqueScreen(screenIds); + return ret; +} + DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, ScreenId& screenGroupId) { WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId); diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index b6793d1b68..caae18dcc9 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -89,6 +89,7 @@ public: TRANS_ID_SCENE_BOARD_IS_FOLDABLE, TRANS_ID_SCENE_BOARD_GET_FOLD_STATUS, TRANS_ID_SCENE_BOARD_GET_CURRENT_FOLD_CREASE_REGION, + TRANS_ID_SCENE_BOARD_MAKE_UNIQUE_SCREEN, }; virtual sptr GetDefaultDisplayInfo() = 0; @@ -156,6 +157,9 @@ public: virtual void SetFoldDisplayMode(const FoldDisplayMode) {} virtual sptr GetCurrentFoldCreaseRegion() { return nullptr; } + + // unique screen + virtual DMError MakeUniqueScreen(const std::vector& screenIds) { return DMError::DM_OK; } }; } // namespace OHOS::Rosen diff --git a/interfaces/innerkits/dm/screen_group.h b/interfaces/innerkits/dm/screen_group.h index 8e7eb356f1..8adb359ba1 100644 --- a/interfaces/innerkits/dm/screen_group.h +++ b/interfaces/innerkits/dm/screen_group.h @@ -26,6 +26,7 @@ enum class ScreenCombination : uint32_t { SCREEN_ALONE, SCREEN_EXPAND, SCREEN_MIRROR, + SCREEN_UNIQUE, }; class ScreenGroup : public Screen { diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index ba2424dd8b..93ac7676b2 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -66,7 +66,7 @@ public: * * @param info Change info of screen mirror. */ - virtual void OnMirrorChange([[maybe_unused]]const ChangeInfo& info) {} + virtual void OnMirrorChange([[maybe_unused]]const ChangeInfo& info) {} }; /** @@ -112,6 +112,14 @@ public: */ DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, ScreenId& screenGroupId); + /** + * @brief Make screens as unique-screen. + * + * @param screenIds Unique screen ids. + * @return DM_OK means make unique screen success, others means make unique failed. + */ + DMError MakeUniqueScreen(const std::vector& screenIds); + /** * @brief Stop expand screens. * diff --git a/window_scene/session/screen/src/screen_session.cpp b/window_scene/session/screen/src/screen_session.cpp index de3287a062..6ef7796ec6 100644 --- a/window_scene/session/screen/src/screen_session.cpp +++ b/window_scene/session/screen/src/screen_session.cpp @@ -636,6 +636,8 @@ bool ScreenSessionGroup::GetRSDisplayNodeConfig(sptr& screenSessi [[fallthrough]]; case ScreenCombination::SCREEN_EXPAND: break; + case ScreenCombination::SCREEN_UNIQUE: + break; case ScreenCombination::SCREEN_MIRROR: { if (GetChildCount() == 0 || mirrorScreenId_ == screenSession->screenId_) { WLOGI("AddChild, SCREEN_MIRROR, config is not mirror"); diff --git a/window_scene/session_manager/include/screen_session_manager.h b/window_scene/session_manager/include/screen_session_manager.h index 0b69c9e2d7..c47b50e62f 100644 --- a/window_scene/session_manager/include/screen_session_manager.h +++ b/window_scene/session_manager/include/screen_session_manager.h @@ -182,6 +182,9 @@ public: void NotifyFoldStatusChanged(FoldStatus foldStatus); void NotifyDisplayModeChanged(FoldDisplayMode displayMode); + // make unique screen + DMError MakeUniqueScreen(const std::vector& screenIds) override; + protected: ScreenSessionManager(); virtual ~ScreenSessionManager() = default; @@ -204,6 +207,9 @@ private: std::string TransferTypeToString(ScreenType type) const; bool SetScreenPower(ScreenPowerStatus status); + // notify scb virtual screen change + void OnVirtualScreenChange(ScreenId screenId, ScreenEvent screenEvent); + class ScreenIdManager { friend class ScreenSessionGroup; public: diff --git a/window_scene/session_manager/include/zidl/screen_session_manager_interface.h b/window_scene/session_manager/include/zidl/screen_session_manager_interface.h index 970a677b1f..4613c19440 100644 --- a/window_scene/session_manager/include/zidl/screen_session_manager_interface.h +++ b/window_scene/session_manager/include/zidl/screen_session_manager_interface.h @@ -103,6 +103,8 @@ public: FoldStatus GetFoldStatus() override { return FoldStatus::UNKNOWN; }; sptr GetCurrentFoldCreaseRegion() override { return nullptr; }; + + virtual DMError MakeUniqueScreen(const std::vector& screenIds) override { return DMError::DM_OK; }; }; } // namespace Rosen diff --git a/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h b/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h index 268b79d8cf..90bb484602 100644 --- a/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h +++ b/window_scene/session_manager/include/zidl/screen_session_manager_proxy.h @@ -105,6 +105,9 @@ public: FoldStatus GetFoldStatus() override; sptr GetCurrentFoldCreaseRegion() override; + + // unique screen + DMError MakeUniqueScreen(const std::vector& screenIds) override; private: static inline BrokerDelegator delegator_; }; diff --git a/window_scene/session_manager/src/screen_session_manager.cpp b/window_scene/session_manager/src/screen_session_manager.cpp index dbba6bcf74..8ef3605fe6 100644 --- a/window_scene/session_manager/src/screen_session_manager.cpp +++ b/window_scene/session_manager/src/screen_session_manager.cpp @@ -243,6 +243,28 @@ void ScreenSessionManager::RegisterScreenChangeListener() } } +void ScreenSessionManager::OnVirtualScreenChange(ScreenId screenId, ScreenEvent screenEvent) +{ + WLOGFI("Notify scb virtual screen change, ScreenId: %{public}" PRIu64 ", ScreenEvent: %{public}d", screenId, + static_cast(screenEvent)); + auto screenSession = GetScreenSession(screenId); + if (!screenSession) { + WLOGFE("screenSession is nullptr"); + return; + } + if (screenEvent == ScreenEvent::CONNECTED) { + for (auto listener : screenConnectionListenerList_) { + listener->OnScreenConnect(screenSession); + } + screenSession->Connect(); + } else if (screenEvent == ScreenEvent::DISCONNECTED) { + for (auto listener : screenConnectionListenerList_) { + listener->OnScreenDisconnect(screenSession); + } + screenSession->Disconnect(); + } +} + void ScreenSessionManager::OnScreenChange(ScreenId screenId, ScreenEvent screenEvent) { WLOGFI("SCB: On screen change. ScreenId: %{public}" PRIu64 ", ScreenEvent: %{public}d", screenId, @@ -1125,6 +1147,11 @@ DMError ScreenSessionManager::DestroyVirtualScreen(ScreenId screenId) WLOGFE("destroy virtual screen permission denied!"); return DMError::DM_ERROR_NOT_SYSTEM_APP; } + + // virtual screen destroy callback to notify scb + WLOGFI("destroy callback virtual screen"); + OnVirtualScreenChange(screenId, ScreenEvent::DISCONNECTED); + WLOGI("SCB: ScreenSessionManager::DestroyVirtualScreen Enter"); std::lock_guard lock(screenSessionMapMutex_); ScreenId rsScreenId = SCREEN_ID_INVALID; @@ -1261,6 +1288,41 @@ DMError ScreenSessionManager::StopScreens(const std::vector& screenIds return DMError::DM_OK; } +DMError ScreenSessionManager::MakeUniqueScreen(const std::vector& screenIds) +{ + WLOGFI("SCB:ScreenSessionManager::MakeUniqueScreen enter!"); + if (screenIds.empty()) { + WLOGFE("screen is empty"); + return DMError::DM_ERROR_INVALID_PARAM; + } + ScreenId mainScreenId = GetDefaultScreenId(); + ScreenId uniqueScreenId = screenIds[0]; + WLOGFI("MainScreenId %{public}" PRIu64" unique screenId %{public}" PRIu64".", mainScreenId, uniqueScreenId); + + auto defaultScreen = GetDefaultScreenSession(); + if (!defaultScreen) { + WLOGFE("Default screen is nullptr"); + return DMError::DM_ERROR_NULLPTR; + } + auto group = GetAbstractScreenGroup(defaultScreen->groupSmsId_); + if (group == nullptr) { + group = AddToGroupLocked(defaultScreen); + if (group == nullptr) { + WLOGFE("group is nullptr"); + return DMError::DM_ERROR_NULLPTR; + } + NotifyScreenGroupChanged(defaultScreen->ConvertToScreenInfo(), ScreenGroupChangeEvent::ADD_TO_GROUP); + } + Point point; + std::vector startPoints; + startPoints.insert(startPoints.begin(), screenIds.size(), point); + ChangeScreenGroup(group, screenIds, startPoints, true, ScreenCombination::SCREEN_UNIQUE); + + // virtual screen create callback to notify scb + OnVirtualScreenChange(uniqueScreenId, ScreenEvent::CONNECTED); + return DMError::DM_OK; +} + DMError ScreenSessionManager::MakeExpand(std::vector screenId, std::vector startPoint, diff --git a/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp b/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp index 3aae36675f..cf6119bb46 100644 --- a/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp +++ b/window_scene/session_manager/src/zidl/screen_session_manager_proxy.cpp @@ -1356,4 +1356,37 @@ sptr ScreenSessionManagerProxy::GetCurrentFoldCreaseRegion() } return reply.ReadStrongParcelable(); } + +DMError ScreenSessionManagerProxy::MakeUniqueScreen(const std::vector& screenIds) +{ + WLOGFI("ScreenSessionManagerProxy::MakeUniqueScreen"); + sptr remote = Remote(); + if (remote == nullptr) { + WLOGFW("make unique screen failed: remote is null"); + } + + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("MakeUniqueScreen writeInterfaceToken failed"); + return DMError::DM_ERROR_NULLPTR; + } + if (!data.WriteUint32(screenIds.size())) { + WLOGFE("MakeUniqueScreen write screenIds size failed"); + return DMError::DM_ERROR_INVALID_PARAM; + } + bool res = data.WriteUInt64Vector(screenIds); + if (!res) { + WLOGFE("MakeUniqueScreen fail: write screens failed"); + return DMError::DM_ERROR_NULLPTR; + } + if (remote->SendRequest( + static_cast(DisplayManagerMessage::TRANS_ID_SCENE_BOARD_MAKE_UNIQUE_SCREEN), + data, reply, option) != ERR_NONE) { + WLOGFE("MakeUniqueScreen fail: SendRequest failed"); + return DMError::DM_ERROR_NULLPTR; + } + return static_cast(reply.ReadInt32()); +} } // namespace OHOS::Rosen diff --git a/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp b/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp index 31839b6c73..2593edbc7d 100644 --- a/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp +++ b/window_scene/session_manager/src/zidl/screen_session_manager_stub.cpp @@ -21,6 +21,7 @@ namespace OHOS::Rosen { namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenSessionManagerStub"}; +const static uint32_t MAX_SCREEN_SIZE = 32; } int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, @@ -392,6 +393,21 @@ int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel& reply.WriteStrongParcelable(GetCurrentFoldCreaseRegion()); break; } + case DisplayManagerMessage::TRANS_ID_SCENE_BOARD_MAKE_UNIQUE_SCREEN: { + std::vector uniqueScreenIds; + uint32_t size = data.ReadUint32(); + if (size > MAX_SCREEN_SIZE) { + WLOGFE("screenIds size is bigger than %{public}u", MAX_SCREEN_SIZE); + break; + } + if (!data.ReadUInt64Vector(&uniqueScreenIds)) { + WLOGFE("failed to receive unique screens in stub"); + break; + } + DMError ret = MakeUniqueScreen(uniqueScreenIds); + reply.WriteInt32(static_cast(ret)); + break; + } default: WLOGFW("unknown transaction code"); return IPCObjectStub::OnRemoteRequest(code, data, reply, option); diff --git a/window_scene/test/unittest/screen_session_manager_test.cpp b/window_scene/test/unittest/screen_session_manager_test.cpp index f67d32d6cd..1e3e7786df 100644 --- a/window_scene/test/unittest/screen_session_manager_test.cpp +++ b/window_scene/test/unittest/screen_session_manager_test.cpp @@ -799,6 +799,18 @@ HWTEST_F(ScreenSessionManagerTest, SetOrientationFromWindow, Function | SmallTes } ASSERT_NE(DMError::DM_ERROR_NULLPTR, ssm_->SetOrientationFromWindow(1,Orientation::AUTO_ROTATION_RESTRICTED)); } + +/** + * @tc.name: MakeUniqueScreen + * @tc.desc: Make unique screen + * @tc.type: FUNC + */ +HWTEST_F(ScreenSessionManagerTest, MakeUniqueScreen, Function | SmallTest | Level3) +{ + vector screenIds; + screenIds.clear(); + ASSERT_EQ(DMError::DM_ERROR_INVALID_PARAM, ssm_->MakeUniqueScreen(screenIds)); +} } } // namespace Rosen } // namespace OHOS -- Gitee From 718264a7edd445ef0bba82256a7c2c5930f4514c Mon Sep 17 00:00:00 2001 From: yangfei Date: Sat, 28 Oct 2023 14:41:22 +0000 Subject: [PATCH 2/2] update window_scene/session_manager/include/screen_session_manager.h. Signed-off-by: yangfei --- .../session_manager/include/screen_session_manager.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/window_scene/session_manager/include/screen_session_manager.h b/window_scene/session_manager/include/screen_session_manager.h index ec99ea4acf..a377432b0a 100644 --- a/window_scene/session_manager/include/screen_session_manager.h +++ b/window_scene/session_manager/include/screen_session_manager.h @@ -94,6 +94,7 @@ public: 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; @@ -181,9 +182,7 @@ public: void NotifyFoldStatusChanged(FoldStatus foldStatus); void NotifyDisplayModeChanged(FoldDisplayMode displayMode); - - // make unique screen - DMError MakeUniqueScreen(const std::vector& screenIds) override; + void RegisterSettingDpiObserver(); protected: ScreenSessionManager(); -- Gitee