From d6a7ccd8c418cfa74cca37eb749ea499e0aaeb44 Mon Sep 17 00:00:00 2001 From: Jiayi Zhu Date: Wed, 10 Sep 2025 21:37:54 +0800 Subject: [PATCH] MakeMirror add rotation Signed-off-by: Jiayi Zhu --- dm/include/display_manager_adapter.h | 5 +- dm/src/display_manager_adapter.cpp | 5 +- dm/src/screen_manager.cpp | 16 +++++ dm/test/unittest/screen_manager_test.cpp | 19 ++++++ interfaces/innerkits/dm/dm_common.h | 8 +++ interfaces/innerkits/dm/screen_manager.h | 12 ++++ .../mock/mock_display_manager_adapter.h | 4 +- .../include/multi_screen_manager.h | 7 +- .../include/screen_session_manager.h | 14 ++-- .../zidl/screen_session_manager_interface.h | 3 +- .../zidl/screen_session_manager_proxy.h | 3 +- .../src/multi_screen_manager.cpp | 17 +++-- .../src/screen_session_manager.cpp | 27 ++++---- .../src/zidl/screen_session_manager_proxy.cpp | 5 +- .../src/zidl/screen_session_manager_stub.cpp | 5 +- .../session/screen/include/screen_session.h | 3 +- .../session/screen/src/screen_session.cpp | 6 +- .../multi_screen_manager_test.cpp | 66 ++++++++++++------- .../screen_session_manager_test.cpp | 11 ++-- .../test/dms_unittest/screen_session_test.cpp | 2 +- 20 files changed, 168 insertions(+), 70 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index b857f49a99..e6eb603017 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -145,11 +145,12 @@ public: virtual DMError SetOrientation(ScreenId screenId, Orientation orientation); virtual sptr GetScreenGroupInfoById(ScreenId screenId); virtual DMError GetAllScreenInfos(std::vector>& screenInfos); - virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, ScreenId& screenGroupId); + virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, ScreenId& screenGroupId, + const RotationOption& rotationOption = {Rotation::ROTATION_0, false}); virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector mirrorScreenId, ScreenId& screenGroupId); virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, DMRect mainScreenRegion, - ScreenId& screenGroupId); + ScreenId& screenGroupId); virtual DMError SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId, MultiScreenMode screenMode); virtual DMError SetMultiScreenRelativePosition(MultiScreenPositionOptions mainScreenOptions, diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 34e4a3d57e..beb9440453 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -861,12 +861,13 @@ void BaseAdapter::Clear() } DMError ScreenManagerAdapter::MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, - ScreenId& screenGroupId) + ScreenId& screenGroupId, const RotationOption& rotationOption) { INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED); if (screenSessionManagerServiceProxy_) { - return screenSessionManagerServiceProxy_->MakeMirror(mainScreenId, mirrorScreenId, screenGroupId); + return screenSessionManagerServiceProxy_->MakeMirror(mainScreenId, mirrorScreenId, screenGroupId, + rotationOption); } int32_t dmError; diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index acc086e842..592b4a7ddf 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -532,6 +532,22 @@ DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector m return ret; } +DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, + ScreenId& screenGroupId, Rotation rotation) +{ + TLOGI(WmsLogTag::DMS, "Make mirror for screen: %{public}" PRIu64"", mainScreenId); + if (mirrorScreenId.size() > MAX_SCREEN_SIZE) { + TLOGW(WmsLogTag::DMS, "Make mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE); + return DMError::DM_ERROR_INVALID_PARAM; + } + DMError ret = SingletonContainer::Get().MakeMirror(mainScreenId, mirrorScreenId, + screenGroupId, {rotation, true}); + if (screenGroupId == SCREEN_ID_INVALID) { + TLOGE(WmsLogTag::DMS, "Create mirror failed"); + } + return ret; +} + DMError ScreenManager::SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId, MultiScreenMode screenMode) { diff --git a/dm/test/unittest/screen_manager_test.cpp b/dm/test/unittest/screen_manager_test.cpp index 2297b47a32..eb313c1c20 100644 --- a/dm/test/unittest/screen_manager_test.cpp +++ b/dm/test/unittest/screen_manager_test.cpp @@ -720,6 +720,25 @@ HWTEST_F(ScreenManagerTest, MakeMirror_001, TestSize.Level1) ASSERT_EQ(error, DMError::DM_ERROR_INVALID_PARAM); } +/** + * @tc.name: MakeMirror_002 + * @tc.desc: MakeMirror_002 fun + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, MakeMirror_002, TestSize.Level1) +{ + std::vector mirrorScreenId; + mirrorScreenId.emplace_back(1000); + ScreenId screenGroupId = SCREEN_ID_INVALID; + DMError ret1 = ScreenManager::GetInstance().MakeMirror(1, mirrorScreenId, screenGroupId, Rotation::ROTATION_0); + ASSERT_NE(ret1, DMError::DM_ERROR_INVALID_PARAM); + for (uint32_t i = 0; i < 33; ++i) { + mirrorScreenId.emplace_back(i); + } + DMError ret2 = ScreenManager::GetInstance().MakeMirror(1, mirrorScreenId, ScreenGroupId, Rotation::ROTATION_0); + ASSERT_EQ(ret2, DMError::DM_ERROR_INVALID_PARAM); +} + /** * @tc.name: StopExpand * @tc.desc: StopExpand fun diff --git a/interfaces/innerkits/dm/dm_common.h b/interfaces/innerkits/dm/dm_common.h index b38485596a..a3ffa10c1b 100644 --- a/interfaces/innerkits/dm/dm_common.h +++ b/interfaces/innerkits/dm/dm_common.h @@ -780,5 +780,13 @@ struct RelativePosition { DisplayId displayId = 0; Position position = {0, 0}; }; + +/** + * @brief Rotation option + */ +struct RotationOption { + Rotation rotation_ = Rotation::ROTATION_0; + bool needSetRotation_ = false; +}; } #endif // OHOS_ROSEN_DM_COMMON_H diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index c5bb410c8b..aea37a4bae 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -136,6 +136,18 @@ public: DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, DMRect mainScreenRegion, ScreenId& screenGroupId); + /** + * @brief Make screen as mirror-screen for region of main screen. + * + * @param mainScreenId Main screen id. + * @param mirrorScreenId Mirro screen id. + * @param screenGroupId Screen group id. + * @param rotation Mirror screen rotation. + * @return DM_OK means make mirror success, others means make mirror failed. + */ + DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId, + ScreenId& screenGroupId, Rotation rotation); + /** * @brief Make screens as mirror-screen * diff --git a/test/common/mock/mock_display_manager_adapter.h b/test/common/mock/mock_display_manager_adapter.h index b22cafa34e..a90c88a3ca 100644 --- a/test/common/mock/mock_display_manager_adapter.h +++ b/test/common/mock/mock_display_manager_adapter.h @@ -67,8 +67,8 @@ public: MOCK_METHOD2(SetVirtualScreenSurface, DMError(ScreenId screenId, sptr surface)); MOCK_METHOD1(GetScreenGroupInfoById, sptr(ScreenId screenId)); MOCK_METHOD1(GetAllScreenInfos, DMError(std::vector>& screenInfos)); - MOCK_METHOD3(MakeMirror, DMError(ScreenId mainScreenId, std::vector mirrorScreenId, - ScreenId& screenGroupId)); + MOCK_METHOD4(MakeMirror, DMError(ScreenId mainScreenId, std::vector mirrorScreenId, + ScreenId& screenGroupId, const RotationOption& rotationOption)); MOCK_METHOD3(MakeExpand, DMError(std::vector screenId, std::vector startPoint, ScreenId& screenGroupId)); MOCK_METHOD2(SetScreenActiveMode, DMError(ScreenId screenId, uint32_t modeId)); diff --git a/window_scene/screen_session_manager/include/multi_screen_manager.h b/window_scene/screen_session_manager/include/multi_screen_manager.h index 22ec14db26..3504e82930 100644 --- a/window_scene/screen_session_manager/include/multi_screen_manager.h +++ b/window_scene/screen_session_manager/include/multi_screen_manager.h @@ -33,7 +33,7 @@ public: DMError UniqueSwitch(const std::vector& screenIds, std::vector& displayIds); DMError MirrorSwitch(const ScreenId mainScreenId, const std::vector& screenIds, DMRect mainScreenRegion, - ScreenId& screenGroupId, bool forceMirror = false); + ScreenId& screenGroupId, const RotationOption& rotationOption, bool forceMirror = false); void MultiScreenModeChange(sptr mainSession, sptr secondarySession, const std::string& operateType); @@ -61,10 +61,11 @@ private: std::vector& physicalScreenIds, std::vector& virtualScreenIds); DMError VirtualScreenMirrorSwitch(const ScreenId mainScreenId, const std::vector& screenIds, - DMRect mainScreenRegion, ScreenId& screenGroupId, bool forceMirror = false); + DMRect mainScreenRegion, ScreenId& screenGroupId, const RotationOption& rotationOption, + bool forceMirror = false); DMError PhysicalScreenMirrorSwitch(const std::vector& screenIds, DMRect mainScreenRegion, - bool forceMirror = false); + const RotationOption& rotationOption, bool forceMirror = false); DMError PhysicalScreenUniqueSwitch(const std::vector& screenIds); diff --git a/window_scene/screen_session_manager/include/screen_session_manager.h b/window_scene/screen_session_manager/include/screen_session_manager.h index bc2ba00bf0..b596527313 100644 --- a/window_scene/screen_session_manager/include/screen_session_manager.h +++ b/window_scene/screen_session_manager/include/screen_session_manager.h @@ -130,7 +130,8 @@ public: 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, bool forceMirror = false) override; + ScreenId& screenGroupId, const RotationOption& rotationOption = {Rotation::ROTATION_0, false}, + bool forceMirror = false) override; virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector mirrorScreenIds, ScreenId& screenGroupId) override; virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, @@ -200,17 +201,18 @@ public: void ChangeScreenGroup(sptr group, const std::vector& screens, const std::vector& startPoints, bool filterScreen, ScreenCombination combination, - DMRect mainScreenRegion = DMRect::NONE()); + DMRect mainScreenRegion = DMRect::NONE(), + const RotationOption& rotationOption = {Rotation::ROTATION_0, false}); bool RemoveChildFromGroup(sptr screen, sptr screenGroup); void AddScreenToGroup(sptr group, const std::vector& addScreens, const std::vector& addChildPos, - std::map& removeChildResMap); + std::map& removeChildResMap, const RotationOption& rotationOption); bool CheckScreenInScreenGroup(sptr screen) const; DMError SetMirror(ScreenId screenId, std::vector screens, DMRect mainScreenRegion, - bool forceMirror = false); + const RotationOption& rotationOption, bool forceMirror = false); DMError StopScreens(const std::vector& screenIds, ScreenCombination stopCombination); void NotifyScreenConnected(sptr screenInfo); @@ -584,7 +586,9 @@ private: void NotifyCaptureStatusChanged(); void NotifyCaptureStatusChanged(bool IsCaptured); DMError DoMakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, - DMRect mainScreenRegion, ScreenId& screenGroupId, bool forceMirror = false); + DMRect mainScreenRegion, ScreenId& screenGroupId, + const RotationOption& rotationOption = {Rotation::ROTATION_0, false}, + bool forceMirror = false); bool OnMakeExpand(std::vector screenId, std::vector startPoint); bool OnRemoteDied(const sptr& agent); std::string TransferTypeToString(ScreenType type) const; diff --git a/window_scene/screen_session_manager/include/zidl/screen_session_manager_interface.h b/window_scene/screen_session_manager/include/zidl/screen_session_manager_interface.h index e9ea9dd655..cc2466423f 100644 --- a/window_scene/screen_session_manager/include/zidl/screen_session_manager_interface.h +++ b/window_scene/screen_session_manager/include/zidl/screen_session_manager_interface.h @@ -187,7 +187,8 @@ public: virtual sptr GetScreenGroupInfoById(ScreenId screenId) { return nullptr; } virtual DMError GetAllScreenInfos(std::vector>& screenInfos) { return DMError::DM_OK; } virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, - ScreenId& screenGroupId, bool forceMirror = false) { return DMError::DM_OK; } + ScreenId& screenGroupId, const RotationOption& rotationOption = {Rotation::ROTATION_0, false}, + bool forceMirror = false) { return DMError::DM_OK; } virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector mirrorScreenIds, ScreenId &screenGroupId) diff --git a/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h b/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h index 6069a117e4..7410c6193e 100644 --- a/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h +++ b/window_scene/screen_session_manager/include/zidl/screen_session_manager_proxy.h @@ -93,7 +93,8 @@ public: virtual DMError SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode) override; virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, - ScreenId& screenGroupId, bool forceRecord = false) override; + ScreenId& screenGroupId, const RotationOption& rotationOption = {Rotation::ROTATION_0, false}, + bool forceRecord = false) override; virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector mirrorScreenIds, ScreenId& screenGroupId) override; virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, diff --git a/window_scene/screen_session_manager/src/multi_screen_manager.cpp b/window_scene/screen_session_manager/src/multi_screen_manager.cpp index 9e1acac5b0..cd93da7478 100644 --- a/window_scene/screen_session_manager/src/multi_screen_manager.cpp +++ b/window_scene/screen_session_manager/src/multi_screen_manager.cpp @@ -79,7 +79,8 @@ void MultiScreenManager::FilterPhysicalAndVirtualScreen(const std::vector& screenIds, DMRect mainScreenRegion, ScreenId& screenGroupId, bool forceMirror) + const std::vector& screenIds, DMRect mainScreenRegion, ScreenId& screenGroupId, + const RotationOption& rotationOption, bool forceMirror) { TLOGW(WmsLogTag::DMS, "enter size: %{public}u", static_cast(screenIds.size())); @@ -89,7 +90,8 @@ DMError MultiScreenManager::VirtualScreenMirrorSwitch(const ScreenId mainScreenI TLOGE(WmsLogTag::DMS, "screen session null fail mainScreenId: %{public}" PRIu64, mainScreenId); return DMError::DM_ERROR_INVALID_PARAM; } - DMError ret = ScreenSessionManager::GetInstance().SetMirror(mainScreenId, screenIds, mainScreenRegion, forceMirror); + DMError ret = ScreenSessionManager::GetInstance().SetMirror(mainScreenId, screenIds, mainScreenRegion, + rotationOption, forceMirror); if (ret != DMError::DM_OK) { TLOGE(WmsLogTag::DMS, "error: %{public}d", ret); return ret; @@ -105,7 +107,7 @@ DMError MultiScreenManager::VirtualScreenMirrorSwitch(const ScreenId mainScreenI } DMError MultiScreenManager::PhysicalScreenMirrorSwitch(const std::vector& screenIds, DMRect mirrorRegion, - bool forceMirror) + const RotationOption& rotationOption, bool forceMirror) { sptr defaultSession = ScreenSessionManager::GetInstance().GetDefaultScreenSession(); if (defaultSession == nullptr) { @@ -132,6 +134,9 @@ DMError MultiScreenManager::PhysicalScreenMirrorSwitch(const std::vectorrsId_, true, nodeId, true}; + if (rotationOption.needSetRotation_) { + config.mirrorSourceRotation = static_cast(rotationOption.rotation_); + } screenSession->ReuseDisplayNode(config); screenSession->SetMirrorScreenRegion(defaultSession->GetRSScreenId(), mirrorRegion); screenSession->SetIsPhysicalMirrorSwitch(true); @@ -301,7 +306,7 @@ DMError MultiScreenManager::UniqueSwitch(const std::vector& screenIds, } DMError MultiScreenManager::MirrorSwitch(const ScreenId mainScreenId, const std::vector& screenIds, - DMRect mainScreenRegion, ScreenId& screenGroupId, bool forceMirror) + DMRect mainScreenRegion, ScreenId& screenGroupId, const RotationOption& rotationOption, bool forceMirror) { DMError switchStatus = DMError::DM_OK; std::vector virtualScreenIds; @@ -315,12 +320,12 @@ DMError MultiScreenManager::MirrorSwitch(const ScreenId mainScreenId, const std: if (!virtualScreenIds.empty()) { switchStatus = VirtualScreenMirrorSwitch(mainScreenId, virtualScreenIds, mainScreenRegion, - screenGroupId, forceMirror); + screenGroupId, rotationOption, forceMirror); TLOGW(WmsLogTag::DMS, "virtual screen switch to mirror result: %{public}d", switchStatus); } if (!physicalScreenIds.empty()) { screenGroupId = 1; - switchStatus = PhysicalScreenMirrorSwitch(physicalScreenIds, mainScreenRegion, forceMirror); + switchStatus = PhysicalScreenMirrorSwitch(physicalScreenIds, mainScreenRegion, rotationOption, forceMirror); if (switchStatus == DMError::DM_OK) { for (auto screenId : physicalScreenIds) { auto screenSession = ScreenSessionManager::GetInstance().GetScreenSession(screenId); diff --git a/window_scene/screen_session_manager/src/screen_session_manager.cpp b/window_scene/screen_session_manager/src/screen_session_manager.cpp index 7bdfa57ee8..f60e67936a 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager.cpp @@ -5470,7 +5470,7 @@ void ScreenSessionManager::MirrorSwitchNotify(ScreenId screenId) } DMError ScreenSessionManager::DoMakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, - DMRect mainScreenRegion, ScreenId& screenGroupId, bool forceMirror) + DMRect mainScreenRegion, ScreenId& screenGroupId, const RotationOption& rotationOption, bool forceMirror) { #ifdef WM_MULTI_SCREEN_ENABLE TLOGW(WmsLogTag::DMS, "enter!"); @@ -5501,7 +5501,7 @@ DMError ScreenSessionManager::DoMakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, - ScreenId& screenGroupId, bool forceMirror) + ScreenId& screenGroupId, const RotationOption& rotationOption, bool forceMirror) { #ifdef FOLD_ABILITY_ENABLE if (foldScreenController_ != nullptr && FoldScreenStateInternel::IsSecondaryDisplayFoldDevice()) { DMRect mainScreenRegion = DMRect::NONE(); foldScreenController_->SetMainScreenRegion(mainScreenRegion); - return DoMakeMirror(mainScreenId, mirrorScreenIds, mainScreenRegion, screenGroupId, forceMirror); + return DoMakeMirror(mainScreenId, mirrorScreenIds, mainScreenRegion, screenGroupId, rotationOption, + forceMirror); } #endif - return DoMakeMirror(mainScreenId, mirrorScreenIds, DMRect::NONE(), screenGroupId, forceMirror); + return DoMakeMirror(mainScreenId, mirrorScreenIds, DMRect::NONE(), screenGroupId, rotationOption, forceMirror); } DMError ScreenSessionManager::MakeMirrorForRecord(ScreenId mainScreenId, std::vector mirrorScreenIds, @@ -6337,7 +6338,7 @@ bool ScreenSessionManager::RemoveChildFromGroup(sptr screen, sptr } DMError ScreenSessionManager::SetMirror(ScreenId screenId, std::vector screens, DMRect mainScreenRegion, - bool forceMirror) + const RotationOption& rotationOption, bool forceMirror) { TLOGI(WmsLogTag::DMS, "screenId:%{public}" PRIu64"", screenId); sptr screen = GetScreenSession(screenId); @@ -6363,7 +6364,7 @@ DMError ScreenSessionManager::SetMirror(ScreenId screenId, std::vector && !forceMirror; group->mirrorScreenId_ = screen->screenId_; ChangeScreenGroup(group, screens, startPoints, filterMirroredScreen, ScreenCombination::SCREEN_MIRROR, - mainScreenRegion); + mainScreenRegion, rotationOption); TLOGI(WmsLogTag::DMS, "success"); return DMError::DM_OK; } @@ -6397,7 +6398,8 @@ bool ScreenSessionManager::CheckScreenInScreenGroup(sptr screen) } void ScreenSessionManager::ChangeScreenGroup(sptr group, const std::vector& screens, - const std::vector& startPoints, bool filterScreen, ScreenCombination combination, DMRect mainScreenRegion) + const std::vector& startPoints, bool filterScreen, ScreenCombination combination, DMRect mainScreenRegion, + const RotationOption& rotationOption) { std::map removeChildResMap; std::vector addScreens; @@ -6443,7 +6445,7 @@ void ScreenSessionManager::ChangeScreenGroup(sptr group, con SetScreenCastInfo(screen->GetScreenId(), group->mirrorScreenId_, combination); } group->combination_ = combination; - AddScreenToGroup(group, addScreens, addChildPos, removeChildResMap); + AddScreenToGroup(group, addScreens, addChildPos, removeChildResMap, rotationOption); } void ScreenSessionManager::ChangeMirrorScreenConfig(const sptr& group, @@ -6521,7 +6523,7 @@ void ScreenSessionManager::IsEnableRegionRotation(sptr screenSess void ScreenSessionManager::AddScreenToGroup(sptr group, const std::vector& addScreens, const std::vector& addChildPos, - std::map& removeChildResMap) + std::map& removeChildResMap, const RotationOption& rotationOption) { std::vector> addToGroup; std::vector> removeFromGroup; @@ -6535,7 +6537,8 @@ void ScreenSessionManager::AddScreenToGroup(sptr group, Point expandPoint = addChildPos[i]; TLOGI(WmsLogTag::DMS, "screenId: %{public}" PRIu64", Point: %{public}d, %{public}d", screen->screenId_, expandPoint.posX_, expandPoint.posY_); - bool addChildRes = group->AddChild(screen, expandPoint, GetScreenSession(group->mirrorScreenId_)); + bool addChildRes = group->AddChild(screen, expandPoint, GetScreenSession(group->mirrorScreenId_), + false, rotationOption); if (removeChildResMap[screenId] && addChildRes) { changeGroup.emplace_back(screen->ConvertToScreenInfo()); TLOGD(WmsLogTag::DMS, "changeGroup"); @@ -11732,7 +11735,7 @@ void ScreenSessionManager::MakeMirrorAfterSwitchUser() } } ScreenId screenGroupId = SCREEN_GROUP_ID_DEFAULT; - MakeMirror(mainScreenId, mirrorScreenIds, screenGroupId, true); + MakeMirror(mainScreenId, mirrorScreenIds, screenGroupId, {Rotation::ROTATION_0, false}, true); } void ScreenSessionManager::NotifySwitchUserAnimationFinish() diff --git a/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp b/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp index 2822901355..1f19f1152a 100644 --- a/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp +++ b/window_scene/screen_session_manager/src/zidl/screen_session_manager_proxy.cpp @@ -1401,7 +1401,7 @@ DMError ScreenSessionManagerProxy::DestroyVirtualScreen(ScreenId screenId) } DMError ScreenSessionManagerProxy::MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenIds, - ScreenId& screenGroupId, bool forceMirror) + ScreenId& screenGroupId, const RotationOption& rotationOption, bool forceMirror) { TLOGW(WmsLogTag::DMS, "SCB: ENTER"); sptr remote = Remote(); @@ -1418,7 +1418,8 @@ DMError ScreenSessionManagerProxy::MakeMirror(ScreenId mainScreenId, std::vector return DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED; } bool res = data.WriteUint64(static_cast(mainScreenId)) && - data.WriteUInt64Vector(mirrorScreenIds); + data.WriteUInt64Vector(mirrorScreenIds) && data.WriteUint32(static_cast(rotationOption.rotation_)) && + data.WriteBool(rotationOption.needSetRotation_); if (!res) { TLOGE(WmsLogTag::DMS, "SCB: data write failed"); return DMError::DM_ERROR_IPC_FAILED; diff --git a/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp b/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp index 6048a7ae74..b27acff9c5 100644 --- a/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp +++ b/window_scene/screen_session_manager/src/zidl/screen_session_manager_stub.cpp @@ -363,7 +363,10 @@ int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel& break; } ScreenId screenGroupId = INVALID_SCREEN_ID; - DMError ret = MakeMirror(mainScreenId, mirrorScreenId, screenGroupId); + Rotation rotation = static_cast(data.ReadUint32()); + bool needSetRotation = data.ReadBool(); + RotationOption rotationOption = {rotation, needSetRotation}; + DMError ret = MakeMirror(mainScreenId, mirrorScreenId, screenGroupId, rotationOption); static_cast(reply.WriteInt32(static_cast(ret))); static_cast(reply.WriteUint64(static_cast(screenGroupId))); break; diff --git a/window_scene/session/screen/include/screen_session.h b/window_scene/session/screen/include/screen_session.h index 5ab1768dd6..5f1cb39c65 100644 --- a/window_scene/session/screen/include/screen_session.h +++ b/window_scene/session/screen/include/screen_session.h @@ -463,7 +463,8 @@ public: bool AddChild(sptr& smsScreen, Point& startPoint); bool AddChild(sptr& smsScreen, Point& startPoint, - sptr defaultScreenSession, bool isExtend = false); + sptr defaultScreenSession, bool isExtend = false, + const RotationOption& rotationOption = {Rotation::ROTATION_0, false}); bool AddChildren(std::vector>& smsScreens, std::vector& startPoints); bool RemoveChild(sptr& smsScreen); bool HasChild(ScreenId childScreen) const; diff --git a/window_scene/session/screen/src/screen_session.cpp b/window_scene/session/screen/src/screen_session.cpp index 859ba32099..1b17b3f61f 100644 --- a/window_scene/session/screen/src/screen_session.cpp +++ b/window_scene/session/screen/src/screen_session.cpp @@ -1976,7 +1976,8 @@ bool ScreenSessionGroup::GetRSDisplayNodeConfig(sptr& screenSessi } bool ScreenSessionGroup::AddChild(sptr& smsScreen, Point& startPoint, - sptr defaultScreenSession, bool isExtend) + sptr defaultScreenSession, bool isExtend, + const RotationOption& rotationOption) { if (smsScreen == nullptr) { TLOGE(WmsLogTag::DMS, "AddChild, smsScreen is nullptr."); @@ -1995,6 +1996,9 @@ bool ScreenSessionGroup::AddChild(sptr& smsScreen, Point& startPo if (!GetRSDisplayNodeConfig(smsScreen, config, defaultScreenSession)) { return false; } + if (rotationOption.needSetRotation_) { + config.mirrorSourceRotation = static_cast(rotationOption.rotation_); + } smsScreen->InitRSDisplayNode(config, startPoint, isExtend); smsScreen->lastGroupSmsId_ = smsScreen->groupSmsId_; smsScreen->groupSmsId_ = screenId_; diff --git a/window_scene/test/dms_unittest/multi_screen_manager_test.cpp b/window_scene/test/dms_unittest/multi_screen_manager_test.cpp index 2bacf9013f..fe9eea8229 100644 --- a/window_scene/test/dms_unittest/multi_screen_manager_test.cpp +++ b/window_scene/test/dms_unittest/multi_screen_manager_test.cpp @@ -92,7 +92,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch01, TestSize.Level1) std::vector ScreenIds = {2, 3}; ScreenId screenGroupId; MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, DMRect::NONE(), - screenGroupId); + screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(screenGroupId, 0); } @@ -109,7 +109,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch02, TestSize.Level1) sptr session = new ScreenSession(); ScreenSessionManager::GetInstance().screenSessionMap_[mainScreenId] = session; auto ret = MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, - DMRect::NONE(), screenGroupId); + DMRect::NONE(), screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -131,7 +131,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch03, TestSize.Level1) sptr sessiongroup = new ScreenSessionGroup(mainScreenId, rsId, name, combination); ScreenSessionManager::GetInstance().smsScreenGroupMap_[mainScreenId] = sessiongroup; auto ret = MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, DMRect::NONE(), - screenGroupId); + screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -146,7 +146,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch04, TestSize.Level1) std::vector ScreenIds = {2, 3}; ScreenId screenGroupId; MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, DMRect::NONE(), - screenGroupId); + screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(screenGroupId, 0); } @@ -161,7 +161,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch05, TestSize.Level1) std::vector ScreenIds = {1, 2}; ScreenId screenGroupId; MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, DMRect::NONE(), - screenGroupId); + screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(screenGroupId, 0); } @@ -176,7 +176,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch06, TestSize.Level1) std::vector ScreenIds = {1, 3}; ScreenId screenGroupId; MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, DMRect::NONE(), - screenGroupId); + screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(screenGroupId, 0); } @@ -192,7 +192,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch07, TestSize.Level1) ScreenId screenGroupId; DMRect myRect = {0, 0, 400, 600}; MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, myRect, - screenGroupId); + screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(screenGroupId, 0); } @@ -210,7 +210,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch08, TestSize.Level1) DMRect myRect = {0, 0, 400, 600}; ScreenSessionManager::GetInstance().screenSessionMap_[mainScreenId] = session; auto ret = MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, - myRect, screenGroupId); + myRect, screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -233,7 +233,7 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch09, TestSize.Level1) sptr sessiongroup = new ScreenSessionGroup(mainScreenId, rsId, name, combination); ScreenSessionManager::GetInstance().smsScreenGroupMap_[mainScreenId] = sessiongroup; auto ret = MultiScreenManager::GetInstance().VirtualScreenMirrorSwitch(mainScreenId, ScreenIds, myRect, - screenGroupId); + screenGroupId, {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -245,7 +245,8 @@ HWTEST_F(MultiScreenManagerTest, VirtualScreenMirrorSwitch09, TestSize.Level1) HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch01, TestSize.Level1) { std::vector screenIds = {2, 3}; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE()); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE(), + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_ERROR_NULLPTR); } @@ -260,7 +261,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch02, TestSize.Level1) sptr session = new ScreenSession(); ScreenSessionManager::GetInstance().screenSessionMap_[ ScreenSessionManager::GetInstance().defaultScreenId_] = session; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE()); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE(), + {Rotation::ROTATION_0, true}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -277,7 +279,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch03, TestSize.Level1) ScreenSessionManager::GetInstance().defaultScreenId_] = session; sptr session1 = new ScreenSession(); ScreenSessionManager::GetInstance().screenSessionMap_[1002] = session1; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE()); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE(), + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -292,7 +295,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch04, TestSize.Level1) sptr session = new ScreenSession(); ScreenSessionManager::GetInstance().screenSessionMap_[ ScreenSessionManager::GetInstance().defaultScreenId_] = session; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE()); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE(), + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -309,7 +313,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch05, TestSize.Level1) ScreenSessionManager::GetInstance().defaultScreenId_] = session; sptr session1 = new ScreenSession(); ScreenSessionManager::GetInstance().screenSessionMap_[12] = session1; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE()); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, DMRect::NONE(), + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -322,7 +327,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch06, TestSize.Level1) { std::vector screenIds = {2, 3}; DMRect myRect = {0, 0, 400, 600}; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect, + {Rotation::ROTATION_0, false}); EXPECT_NE(ret, DMError::DM_ERROR_NULLPTR); } @@ -338,7 +344,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch07, TestSize.Level1) DMRect myRect = {0, 0, 400, 600}; ScreenSessionManager::GetInstance().screenSessionMap_[ ScreenSessionManager::GetInstance().defaultScreenId_] = session; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -356,7 +363,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch08, TestSize.Level1) ScreenSessionManager::GetInstance().defaultScreenId_] = session; sptr session1 = new ScreenSession(); ScreenSessionManager::GetInstance().screenSessionMap_[1002] = session1; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -372,7 +380,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch09, TestSize.Level1) DMRect myRect = {0, 0, 400, 600}; ScreenSessionManager::GetInstance().screenSessionMap_[ ScreenSessionManager::GetInstance().defaultScreenId_] = session; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -391,7 +400,8 @@ HWTEST_F(MultiScreenManagerTest, PhysicalScreenMirrorSwitch10, TestSize.Level1) sptr session1 = new ScreenSession(); DMRect myRect = {0, 0, 400, 600}; ScreenSessionManager::GetInstance().screenSessionMap_[12] = session1; - DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect); + DMError ret = MultiScreenManager::GetInstance().PhysicalScreenMirrorSwitch(screenIds, myRect, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -714,7 +724,8 @@ HWTEST_F(MultiScreenManagerTest, MirrorSwitch, TestSize.Level1) { std::vector screenIds = {}; ScreenId screenGroupId = 0; - DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId); + DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -728,7 +739,8 @@ HWTEST_F(MultiScreenManagerTest, MirrorSwitch01, TestSize.Level1) { std::vector screenIds = {1001, 1002}; ScreenId screenGroupId = 0; - DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId); + DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -741,7 +753,8 @@ HWTEST_F(MultiScreenManagerTest, MirrorSwitch02, TestSize.Level1) { std::vector screenIds = {2, 3}; ScreenId screenGroupId = 0; - DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId); + DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -754,7 +767,8 @@ HWTEST_F(MultiScreenManagerTest, MirrorSwitch03, TestSize.Level1) { std::vector screenIds = {1003, 1002}; ScreenId screenGroupId = 0; - DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId); + DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -767,7 +781,8 @@ HWTEST_F(MultiScreenManagerTest, MirrorSwitch04, TestSize.Level1) { std::vector screenIds = {1003, 2}; ScreenId screenGroupId = 0; - DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId); + DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, DMRect::NONE(), screenGroupId, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } @@ -781,7 +796,8 @@ HWTEST_F(MultiScreenManagerTest, MirrorSwitch05, TestSize.Level1) std::vector screenIds = {}; ScreenId screenGroupId = 0; DMRect myRect = {0, 0, 400, 600}; - DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, myRect, screenGroupId); + DMError ret = MultiScreenManager::GetInstance().MirrorSwitch(1, screenIds, myRect, screenGroupId, + {Rotation::ROTATION_0, false}); EXPECT_EQ(ret, DMError::DM_OK); } diff --git a/window_scene/test/dms_unittest/screen_session_manager_test.cpp b/window_scene/test/dms_unittest/screen_session_manager_test.cpp index 1f4299e0d6..ceb43ff385 100644 --- a/window_scene/test/dms_unittest/screen_session_manager_test.cpp +++ b/window_scene/test/dms_unittest/screen_session_manager_test.cpp @@ -1692,13 +1692,14 @@ HWTEST_F(ScreenSessionManagerTest, SetMirror, TestSize.Level1) auto screenId = ssm_->CreateVirtualScreen(virtualOption, displayManagerAgent->AsObject()); auto screen = ssm_->GetScreenSession(2); screen->GetScreenProperty().SetScreenType(ScreenType::REAL); - ASSERT_EQ(DMError::DM_OK, ssm_->SetMirror(2, screens, DMRect::NONE())); - ASSERT_EQ(DMError::DM_ERROR_NULLPTR, ssm_->SetMirror(9, screens, DMRect::NONE())); - ASSERT_EQ(DMError::DM_OK, ssm_->SetMirror(screenId, screens, DMRect::NONE())); + ASSERT_EQ(DMError::DM_OK, ssm_->SetMirror(2, screens, DMRect::NONE(), {Rotation::ROTATION_0, false})); + ASSERT_EQ(DMError::DM_ERROR_NULLPTR, ssm_->SetMirror(9, screens, DMRect::NONE(), {Rotation::ROTATION_0, false})); + ASSERT_EQ(DMError::DM_OK, ssm_->SetMirror(screenId, screens, DMRect::NONE(), {Rotation::ROTATION_0, false})); auto mirrorscreen = ssm_->GetScreenSession(screenId); ASSERT_TRUE(mirrorscreen != nullptr); mirrorscreen->SetScreenCombination(ScreenCombination::SCREEN_MIRROR); - ASSERT_EQ(DMError::DM_ERROR_NULLPTR, ssm_->SetMirror(screenId, screens, DMRect::NONE())); + ASSERT_EQ(DMError::DM_ERROR_NULLPTR, ssm_->SetMirror(screenId, screens, DMRect::NONE(), + {Rotation::ROTATION_0, false})); ssm_->DestroyVirtualScreen(screenId); } @@ -1860,7 +1861,7 @@ HWTEST_F(ScreenSessionManagerTest, AddScreenToGroup, TestSize.Level1) const std::vector addChildPos; std::map removeChildResMap; sptr group; - ssm_->AddScreenToGroup(group, addScreens, addChildPos, removeChildResMap); + ssm_->AddScreenToGroup(group, addScreens, addChildPos, removeChildResMap, {Rotation::ROTATION_0, false}); sptr screenSession =new (std::nothrow) ScreenSession(); ASSERT_NE(screenSession, ssm_->InitAndGetScreen(2)); ssm_->DestroyVirtualScreen(screenId); diff --git a/window_scene/test/dms_unittest/screen_session_test.cpp b/window_scene/test/dms_unittest/screen_session_test.cpp index 7ff4d543d4..88a887886a 100644 --- a/window_scene/test/dms_unittest/screen_session_test.cpp +++ b/window_scene/test/dms_unittest/screen_session_test.cpp @@ -1599,7 +1599,7 @@ HWTEST_F(ScreenSessionTest, AddChild, TestSize.Level1) ASSERT_EQ(res, false); sptr session = sptr::MakeSptr(); - res = sessionGroup.AddChild(session, startPoint, defaultScreenSession); + res = sessionGroup.AddChild(session, startPoint, defaultScreenSession, false, {Rotation::ROTATION_0, true}); ASSERT_EQ(res, true); GTEST_LOG_(INFO) << "ScreenSessionTest: AddChild end"; } -- Gitee