diff --git a/window_scene/screen_session_manager_client/src/screen_session_manager_client.cpp b/window_scene/screen_session_manager_client/src/screen_session_manager_client.cpp index f27d26d0d484a95602d7af8e18985db8dbbeb020..3068ac7e6829918addba372f6b17117f0739b3d9 100644 --- a/window_scene/screen_session_manager_client/src/screen_session_manager_client.cpp +++ b/window_scene/screen_session_manager_client/src/screen_session_manager_client.cpp @@ -599,21 +599,21 @@ void ScreenSessionManagerClient::SwitchUserCallback(std::vector oldScbP } for (const auto& iter : screenSessionMapCopy) { ScreenId screenId = iter.first; + sptr screenSession = iter.second; + if (screenSession == nullptr) { + TLOGE(WmsLogTag::DMS, "screenSession is null"); + continue; + } { auto displayNode = screenSessionManager_->GetDisplayNode(screenId); if (displayNode == nullptr) { TLOGE(WmsLogTag::DMS, "display node is null"); continue; } - RSAdapterUtil::SetRSUIContext(displayNode, GetRSUIContext(screenId), true); + RSAdapterUtil::SetRSUIContext(displayNode, screenSession->GetRSUIContext(), true); displayNode->SetScbNodePid(oldScbPids, currentScbPid); RSTransactionAdapter::FlushImplicitTransaction(displayNode); } - sptr screenSession = iter.second; - if (screenSession == nullptr) { - TLOGE(WmsLogTag::DMS, "screenSession is null"); - return; - } ScreenProperty screenProperty = screenSession->GetScreenProperty(); RRect bounds = screenProperty.GetBounds(); float rotation = screenSession->ConvertRotationToFloat(screenSession->GetRotation()); @@ -1104,12 +1104,6 @@ bool ScreenSessionManagerClient::OnExtendDisplayNodeChange(ScreenId mainScreenId sptr ScreenSessionManagerClient::CreateTempScreenSession( ScreenId screenId, ScreenId rsId, const std::shared_ptr& displayNode) { - sptr screenSession = GetScreenSession(screenId); - if (screenSession != nullptr) { - TLOGW(WmsLogTag::DMS, "screen session has exist."); - return screenSession; - } - ScreenSessionConfig config = { .screenId = screenId, .rsId = rsId, diff --git a/window_scene/session/screen/src/screen_session.cpp b/window_scene/session/screen/src/screen_session.cpp index 254ff73b13124ab97ee082eb0970bb2fa9f6344a..008b8e48f0db4c105728e791ac6c69e994300a17 100644 --- a/window_scene/session/screen/src/screen_session.cpp +++ b/window_scene/session/screen/src/screen_session.cpp @@ -2447,8 +2447,9 @@ void ScreenSession::SetScreenId(ScreenId screenId) void ScreenSession::SetDisplayNode(std::shared_ptr displayNode) { - std::shared_lock displayNodeLock(displayNodeMutex_); + std::unique_lock displayNodeLock(displayNodeMutex_); displayNode_ = displayNode; + RSAdapterUtil::SetRSUIContext(displayNode_, GetRSUIContext(), true); } void ScreenSession::SetScreenAvailableStatus(bool isScreenAvailable) diff --git a/window_scene/test/dms_unittest/screen_session_manager_client_test.cpp b/window_scene/test/dms_unittest/screen_session_manager_client_test.cpp index 0e5ca1387109f3d57772a94c3308c0c1cf1761d4..4454cd8ae62b018ce4982be184e0e612aa5c0a4a 100644 --- a/window_scene/test/dms_unittest/screen_session_manager_client_test.cpp +++ b/window_scene/test/dms_unittest/screen_session_manager_client_test.cpp @@ -1033,6 +1033,35 @@ HWTEST_F(ScreenSessionManagerClientTest, SwitchUserCallback02, TestSize.Level1) screenSessionManagerClient_->SwitchUserCallback(oldScbPids, currentScbPid); } +/** + * @tc.name: SwitchUserCallback03 + * @tc.desc: SwitchUserCallback test + * @tc.type: FUNC + */ +HWTEST_F(ScreenSessionManagerClientTest, SwitchUserCallback03, TestSize.Level1) +{ + logMsg.clear(); + LOG_SetCallback(MyLogCallback); + std::vector oldScbPids = {0}; + int32_t currentScbPid = 1; + ASSERT_TRUE(screenSessionManagerClient_ != nullptr); + sptr iRemoteObjectMocker = sptr::MakeSptr(); + screenSessionManagerClient_->screenSessionManager_ = sptr::MakeSptr(iRemoteObjectMocker); + ScreenId screenId = 1234; + sptr screenSession = nullptr; + screenSessionManagerClient_->screenSessionMap_.insert({screenId, screenSession}); + screenSessionManagerClient_->SwitchUserCallback(oldScbPids, currentScbPid); + EXPECT_TRUE(logMsg.find("screenSession is null") != std::string::npos); + logMsg.clear(); + screenSession = sptr::MakeSptr(screenId, ScreenProperty(), 0); + screenSessionManagerClient_->screenSessionMap_.erase(screenId); + screenSessionManagerClient_->screenSessionMap_.insert({screenId, screenSession}); + screenSessionManagerClient_->SwitchUserCallback(oldScbPids, currentScbPid); + EXPECT_FALSE(logMsg.find("screenSession is null") != std::string::npos); + screenSessionManagerClient_->screenSessionMap_.erase(screenId); + logMsg.clear(); +} + /** * @tc.name: SwitchingCurrentUser * @tc.desc: SwitchingCurrentUser test @@ -1762,5 +1791,28 @@ HWTEST_F(ScreenSessionManagerClientTest, SetPrimaryDisplaySystemDpi, TestSize.Le client->SetPrimaryDisplaySystemDpi(dpi); EXPECT_EQ(DisplayManager::GetInstance().GetPrimaryDisplaySystemDpi(), 2.2f); } + +/** + * @tc.name: CreateTempScreenSession + * @tc.desc: CreateTempScreenSession test + * @tc.type: FUNC + */ +HWTEST_F(ScreenSessionManagerClientTest, CreateTempScreenSession, TestSize.Level2) +{ + ASSERT_NE(screenSessionManagerClient_, nullptr); + RSDisplayNodeConfig config; + std::shared_ptr node1 = std::make_shared(config); + std::shared_ptr node2 = std::make_shared(config); + sptr screenSession = sptr::MakeSptr(50, 50, "test1", ScreenProperty(), node1); + ASSERT_NE(nullptr, screenSession); + screenSessionManagerClient_->screenSessionMap_[50] = screenSession; + screenSessionManagerClient_->screenSessionManager_ = sptr::MakeSptr(); + + auto tempScreenSession = screenSessionManagerClient_->CreateTempScreenSession(50, 51, node2); + ASSERT_NE(nullptr, tempScreenSession); + tempScreenSession = screenSessionManagerClient_->CreateTempScreenSession(52, 51, node2); + ASSERT_NE(nullptr, tempScreenSession); + screenSessionManagerClient_->screenSessionManager_ = nullptr; +} } // namespace Rosen } // namespace OHOS