From b5d3e095eea2494cb08ecea47300e84300d397e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=9D=92=E9=9D=92?= Date: Wed, 19 Mar 2025 15:31:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=89=E7=BA=BF=E6=8A=95=E5=B1=8F=E9=9A=90?= =?UTF-8?q?=E7=A7=81=E7=A9=BA=E9=97=B4=E5=88=87=E6=8D=A2=E8=83=B6=E5=9B=8A?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 王青青 --- .../include/screen_session_manager.h | 1 + .../src/screen_session_manager.cpp | 24 ++++++++++++++++ .../screen_session_manager_test.cpp | 28 +++++++++++++++++++ 3 files changed, 53 insertions(+) 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 9530e3ad55..e2fa809e92 100644 --- a/window_scene/screen_session_manager/include/screen_session_manager.h +++ b/window_scene/screen_session_manager/include/screen_session_manager.h @@ -372,6 +372,7 @@ public: void SetDefaultScreenId(ScreenId defaultId); sptr GetClientProxy(); void NotifyCastWhenScreenConnectChange(bool isConnected); + void NotifyCastWhenSwitchScbNode(); void MultiScreenModeChange(const std::string& mainScreenId, const std::string& secondaryScreenId, const std::string& secondaryScreenMode); void SwitchScrollParam(FoldDisplayMode displayMode); 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 6e0f48c4c8..054c1503a2 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager.cpp @@ -7100,9 +7100,33 @@ void ScreenSessionManager::SwitchScbNodeHandle(int32_t newUserId, int32_t newScb currentScbPId_ = newScbPid; scbSwitchCV_.notify_all(); oldScbDisplayMode_ = GetFoldDisplayMode(); + NotifyCastWhenSwitchScbNode(); #endif } +void ScreenSessionManager::NotifyCastWhenSwitchScbNode() +{ + for (const auto& sessionIt : screenSessionMap_) { + auto screenSession = sessionIt.second; + if (screenSession == nullptr) { + TLOGE(WmsLogTag::DMS, "screenSession is nullptr, screenId:%{public}" PRIu64"", sessionIt.first); + continue; + } + bool phyMirrorEnable = IsDefaultMirrorMode(screenSession->GetScreenId()); + if (screenSession->GetScreenProperty().GetScreenType() != ScreenType::REAL || !phyMirrorEnable) { + TLOGE(WmsLogTag::DMS, "screen is not real or external, screenId:%{public}" PRIu64"", sessionIt.first); + continue; + } + if (screenSession ->GetScreenCombination() == ScreenCombination::SCREEN_MIRROR) { + NotifyCastWhenScreenConnectChange(true); + return; + } else { + NotifyCastWhenScreenConnectChange(false); + return; + } + } +} + int32_t ScreenSessionManager::GetCurrentUserId() { return currentUserIdForSettings_; 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 861a0bfced..fc8cd8e5c7 100644 --- a/window_scene/test/dms_unittest/screen_session_manager_test.cpp +++ b/window_scene/test/dms_unittest/screen_session_manager_test.cpp @@ -3890,6 +3890,34 @@ HWTEST_F(ScreenSessionManagerTest, UnregisterSettingWireCastObserver, Function | ssm_->screenSessionMap_[id] = newSession; ssm_->UnregisterSettingWireCastObserver(id); } + +/** + * @tc.name: NotifyCastWhenSwitchScbNode + * @tc.desc: NotifyCastWhenSwitchScbNode + * @tc.type: FUNC + */ +HWTEST_F(ScreenSessionManagerTest, NotifyCastWhenSwitchScbNode, Function | SmallTest | Level3) +{ + ASSERT_NE(ssm_, nullptr); + sptr displayManagerAgent = new(std::nothrow) DisplayManagerAgentDefault(); + ASSERT_NE(displayManagerAgent, nullptr); + + ScreenId id = 2; + sptr newSession = new (std::nothrow) ScreenSession(id, ScreenProperty(), 0); + newSession ->SetScreenCombination(ScreenCombination::SCREEN_MIRROR); + ASSERT_NE(newSession, nullptr); + ssm_->screenSessionMap_[id] = newSession; + ScreenId id1 = 3; + sptr newSession1 = new (std::nothrow) ScreenSession(id1, ScreenProperty(), 0); + newSession1 ->SetScreenCombination(ScreenCombination::SCREEN_UNIQUE); + ASSERT_NE(newSession1, nullptr); + ssm_->screenSessionMap_[id1] = newSession1; + ScreenId id2 = 4; + sptr newSession2 = nullptr; + ssm_->screenSessionMap_[id2] = newSession2; + + ssm_->NotifyCastWhenSwitchScbNode(); +} } } // namespace Rosen } // namespace OHOS -- Gitee