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 968ef70311298c3c8aa2a9c5321674bd2d2a9a4e..ee6a0e337e795ad94a5f5c702b5a34cc485683eb 100644 --- a/window_scene/screen_session_manager/include/screen_session_manager.h +++ b/window_scene/screen_session_manager/include/screen_session_manager.h @@ -374,6 +374,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 9cf6ad253e16a8e756ab87200d81acdfa3501f1f..ae83c8a9bb2ce027b44575691001fc330360669b 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager.cpp @@ -7223,9 +7223,34 @@ void ScreenSessionManager::SwitchScbNodeHandle(int32_t newUserId, int32_t newScb currentScbPId_ = newScbPid; scbSwitchCV_.notify_all(); oldScbDisplayMode_ = GetFoldDisplayMode(); + NotifyCastWhenSwitchScbNode(); #endif } +void ScreenSessionManager::NotifyCastWhenSwitchScbNode() +{ + std::map> screenSessionMapCopy; + { + std::lock_guard lock(screenSessionMapMutex_); + screenSessionMapCopy = screenSessionMap_; + } + for (const auto& sessionIt : screenSessionMapCopy) { + auto screenSession = sessionIt.second; + if (screenSession == nullptr) { + TLOGE(WmsLogTag::DMS, "screenSession is nullptr, screenId:%{public}" PRIu64"", sessionIt.first); + continue; + } + if (screenSession->GetScreenProperty().GetScreenType() != ScreenType::REAL || + !IsDefaultMirrorMode(screenSession->GetScreenId())) { + TLOGE(WmsLogTag::DMS, "screen is not real or external, screenId:%{public}" PRIu64"", sessionIt.first); + continue; + } + bool isScreenMirror = screenSession ->GetScreenCombination() == ScreenCombination::SCREEN_MIRROR; + NotifyCastWhenScreenConnectChange(isScreenMirror); + return; + } +} + void ScreenSessionManager::HotSwitch(int32_t newUserId, int32_t newScbPid) { // hot switch 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 dc312192935e235d67b5902498317102418ff343..4164eeb33d3876e26730e496aa9d9e159416b378 100644 --- a/window_scene/test/dms_unittest/screen_session_manager_test.cpp +++ b/window_scene/test/dms_unittest/screen_session_manager_test.cpp @@ -4075,6 +4075,34 @@ HWTEST_F(ScreenSessionManagerTest, CalculateXYPosition, Function | SmallTest | L EXPECT_EQ(0, y); ssm_->DestroyVirtualScreen(screenId); } + +/** + * @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