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 548ea91ffafe3dc8f8e3c9be1ae8f48eeb9d14fa..4260db6e4c954a0728b6351d3a657fa7a5cfb6c6 100644 --- a/window_scene/screen_session_manager/include/screen_session_manager.h +++ b/window_scene/screen_session_manager/include/screen_session_manager.h @@ -854,6 +854,8 @@ private: void SetScreenCastInfo(ScreenId screenId, ScreenId castScreenId, ScreenCombination screenCombination); void ChangeMirrorScreenConfig(const sptr& group, const DMRect& mainScreenRegion, sptr& screen); + void HandleFoldDeviceScreenConnect(ScreenId screenId, const sptr& screenSession, + bool phyMirrorEnable, ScreenEvent screenEvent); LowTempMode lowTemp_ {LowTempMode::UNKNOWN}; std::mutex lowTempMutex_; diff --git a/window_scene/screen_session_manager/src/screen_aod_plugin.cpp b/window_scene/screen_session_manager/src/screen_aod_plugin.cpp index 26c1e83461acaaacb4bb9066f65dde5c45c8e745..d9a46b7a2c60394284c4dbf64962247489ff9b45 100644 --- a/window_scene/screen_session_manager/src/screen_aod_plugin.cpp +++ b/window_scene/screen_session_manager/src/screen_aod_plugin.cpp @@ -31,9 +31,14 @@ bool LoadAodLib(void) } int32_t cnt = 0; int32_t retryTimes = 3; + const char* dlopenError; do { cnt++; g_handle = dlopen(PLUGIN_AOD_SO_PATH.c_str(), RTLD_LAZY); + dlopenError = dlerror(); + if (dlopenError) { + TLOGE(WmsLogTag::DMS, "dlopen error: %{public}s", dlopenError); + } TLOGI(WmsLogTag::DMS, "dlopen %{public}s, retry cnt: %{public}d", PLUGIN_AOD_SO_PATH.c_str(), cnt); usleep(SLEEP_TIME_US); } while (!g_handle && cnt < retryTimes); diff --git a/window_scene/screen_session_manager/src/screen_sensor_plugin.cpp b/window_scene/screen_session_manager/src/screen_sensor_plugin.cpp index 2a5d33b0c9b641b3629e072ec3808046c4aaf7e4..489fcb89be0bff78d271ae9dc3ba4e7dc37c3994 100644 --- a/window_scene/screen_session_manager/src/screen_sensor_plugin.cpp +++ b/window_scene/screen_session_manager/src/screen_sensor_plugin.cpp @@ -31,9 +31,14 @@ bool LoadMotionSensor(void) } int32_t cnt = 0; int32_t retryTimes = 3; + const char* dlopenError; do { cnt++; g_handle = dlopen(PLUGIN_SO_PATH.c_str(), RTLD_LAZY); + dlopenError = dlerror(); + if (dlopenError) { + TLOGE(WmsLogTag::DMS, "dlopen error: %{public}s", dlopenError); + } TLOGI(WmsLogTag::DMS, "dlopen %{public}s, retry cnt: %{public}d", PLUGIN_SO_PATH.c_str(), cnt); usleep(SLEEP_TIME_US); } while (!g_handle && cnt < retryTimes); 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 13214a57083fe401a570f97af5b3c820d2110a87..9c1f25d8fdb56fdbc431edebb2d5c37d45279a09 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager.cpp @@ -89,7 +89,7 @@ const std::string IS_PC_MODE_KEY = "persist.sceneboard.ispcmode"; const std::string PC_MODE_DPI_KEY = "pcModeDpi"; const int32_t CV_WAIT_SCREENON_MS = 300; const int32_t CV_WAIT_SCREENOFF_MS = 1500; -const int32_t CV_WAIT_SCREENOFF_MS_MAX = 3000; +const int32_t CV_WAIT_SCREENOFF_MS_MAX = 3500; const int32_t CV_WAIT_SCBSWITCH_MS = 3000; const int32_t CV_WAIT_USERSWITCH_MS = 3000; #ifdef WM_MULTI_USR_ABILITY_ENABLE @@ -430,9 +430,9 @@ void ScreenSessionManager::Init() screenEventTracker_.RecordEvent("Dms load motion plugin failed."); TLOGW(WmsLogTag::DMS, "load motion plugin failed."); } - - if (FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice() || - FoldScreenStateInternel::IsDualDisplayFoldDevice()) { + static bool isNeedLoadAodLib = FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice() || + FoldScreenStateInternel::IsDualDisplayFoldDevice() || FoldScreenStateInternel::IsSingleDisplayFoldDevice(); + if (isNeedLoadAodLib) { if (!LoadAodLib()) { TLOGE(WmsLogTag::DMS, "load aod lib failed"); } @@ -449,7 +449,6 @@ void ScreenSessionManager::Init() SetSensorSubscriptionEnabled(); screenEventTracker_.RecordEvent("Dms subscribed to sensor successfully."); } - // publish init ScreenSessionPublish::GetInstance().InitPublishEvents(); screenEventTracker_.RecordEvent("Dms init end."); @@ -545,7 +544,7 @@ DMError ScreenSessionManager::CheckDisplayMangerAgentTypeAndPermission( DMError ScreenSessionManager::RegisterDisplayManagerAgent( const sptr& displayManagerAgent, DisplayManagerAgentType type) { - TLOGI(WmsLogTag::DMS, " called type: %{public}u", type); + TLOGI(WmsLogTag::DMS, " called type: %{public}u, pid: %{public}d", type, IPCSkeleton::GetCallingPid()); DmsXcollie dmsXcollie("DMS:RegisterDisplayManagerAgent", XCOLLIE_TIMEOUT_10S); DMError ret; @@ -566,7 +565,7 @@ DMError ScreenSessionManager::RegisterDisplayManagerAgent( DMError ScreenSessionManager::UnregisterDisplayManagerAgent( const sptr& displayManagerAgent, DisplayManagerAgentType type) { - TLOGI(WmsLogTag::DMS, " called type: %{public}u", type); + TLOGI(WmsLogTag::DMS, " called type: %{public}u, pid: %{public}d", type, IPCSkeleton::GetCallingPid()); DMError ret; ret = CheckDisplayMangerAgentTypeAndPermission(displayManagerAgent, type); @@ -1511,11 +1510,7 @@ void ScreenSessionManager::HandleScreenConnectEvent(sptr screenSe SuperFoldStateManager::GetInstance().RefreshExternalRegion(); } if (foldScreenController_ != nullptr) { - if ((screenId == 0 || (screenId == SCREEN_ID_MAIN && isCoordinationFlag_ == true)) && clientProxy) { - TLOGW(WmsLogTag::DMS, "event: connect %{public}" PRIu64 ", %{public}" PRIu64 ", " - "name=%{public}s", screenId, screenSession->GetRSScreenId(), screenSession->GetName().c_str()); - clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), screenEvent); - } + HandleFoldDeviceScreenConnect(screenId, screenSession, phyMirrorEnable, screenEvent); return; } #endif @@ -1551,6 +1546,25 @@ void ScreenSessionManager::HandleScreenConnectEvent(sptr screenSe TLOGW(WmsLogTag::DMS, "connect end. ScreenId: %{public}" PRIu64, screenId); } +void ScreenSessionManager::HandleFoldDeviceScreenConnect(ScreenId screenId, const sptr& screenSession, + bool phyMirrorEnable, ScreenEvent screenEvent) +{ + if (screenSession == nullptr) { + TLOGE(WmsLogTag::DMS, "screenSession is nullptr"); + return; + } + auto clientProxy = GetClientProxy(); + if ((screenId == 0 || (screenId == SCREEN_ID_MAIN && isCoordinationFlag_)) && clientProxy) { + TLOGW(WmsLogTag::DMS, "event: connect %{public}" PRIu64 ", %{public}" PRIu64 ", " + "name=%{public}s", screenId, screenSession->GetRSScreenId(), screenSession->GetName().c_str()); + clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), screenEvent); + } + if (phyMirrorEnable) { + NotifyScreenConnected(screenSession->ConvertToScreenInfo()); + NotifyDisplayCreate(screenSession->ConvertToDisplayInfo()); + } +} + void ScreenSessionManager::WaitUpdateAvailableAreaForPc() { std::unique_lock lock(displayAddMutex_); @@ -3861,10 +3875,8 @@ void ScreenSessionManager::SetScreenPowerForFold(ScreenId screenId, ScreenPowerS SetRSScreenPowerStatus(screenId, status); return; } - static bool isNeedScreenOffDevice = - (FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice() || - FoldScreenStateInternel::IsDualDisplayFoldDevice() || - FoldScreenStateInternel::IsSingleDisplayFoldDevice()); + static bool isNeedScreenOffDevice = FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice() || + FoldScreenStateInternel::IsDualDisplayFoldDevice() || FoldScreenStateInternel::IsSingleDisplayFoldDevice(); if ((lastPowerForAllStatus_.load() == ScreenPowerStatus::POWER_STATUS_ON_ADVANCED || lastPowerForAllStatus_.load() == ScreenPowerStatus::POWER_STATUS_SUSPEND) && screenId == SCREEN_ID_MAIN && lastScreenId_.load() == SCREEN_ID_MAIN && isNeedScreenOffDevice) { diff --git a/window_scene/test/dms_unittest/screen_session_manager_test2.cpp b/window_scene/test/dms_unittest/screen_session_manager_test2.cpp index e8c73ff2ce8a7581244e8226b64c41bcbaaba460..2e16ffda21cc443bf6fa33c03992a182859c7b3b 100644 --- a/window_scene/test/dms_unittest/screen_session_manager_test2.cpp +++ b/window_scene/test/dms_unittest/screen_session_manager_test2.cpp @@ -24,6 +24,7 @@ #include "fold_screen_state_internel.h" #include "mock/mock_accesstoken_kit.h" #include "window_manager_hilog.h" +#include "test_client.h" using namespace testing; using namespace testing::ext; @@ -1502,6 +1503,51 @@ HWTEST_F(ScreenSessionManagerTest, RecoverDefaultScreenModeInner, TestSize.Level } #undef FOLD_ABILITY_ENABLE } + +/** + * @tc.name: HandleFoldDeviceScreenConnect + * @tc.desc: HandleFoldDeviceScreenConnect + * @tc.type: FUNC + */ +HWTEST_F(ScreenSessionManagerTest, HandleFoldDeviceScreenConnect, TestSize.Level1) +{ + g_errLog.clear(); + LOG_SetCallback(MyLogCallback); + ScreenId screenId = 0; + ssm_->isCoordinationFlag_ = false; + ScreenEvent screenEvent = ScreenEvent::CONNECTED; + sptr session = nullptr; + ssm_->HandleFoldDeviceScreenConnect(screenId, session, false, screenEvent); + EXPECT_FALSE(g_errLog.find("event: connect") != std::string::npos); + g_errLog.clear(); + + session = sptr::MakeSptr(); + ssm_->clientProxy_ = nullptr; + ssm_->HandleFoldDeviceScreenConnect(screenId, session, false, screenEvent); + EXPECT_FALSE(g_errLog.HandleFoldDeviceScreenConnect("event: connect") != std::string::npos); + g_errLog.clear(); + + ssm_->clientProxy_ = sptr::MakeSptr(); + ssm_->HandleFoldDeviceScreenConnect(screenId, session, false, screenEvent); + EXPECT_TRUE(g_errLog.find("event: connect") != std::string::npos); + g_errLog.clear(); + + screenId = 1; + ssm_->HandleFoldDeviceScreenConnect(screenId, session, true, screenEvent); + EXPECT_FALSE(g_errLog.find("event: connect") != std::string::npos); + g_errLog.clear(); + + screenId = SCREEN_ID_MAIN; + ssm_->HandleFoldDeviceScreenConnect(screenId, session, true, screenEvent); + EXPECT_FALSE(g_errLog.find("event: connect") != std::string::npos); + g_errLog.clear(); + + ssm_->isCoordinationFlag_ = true; + ssm_->HandleFoldDeviceScreenConnect(screenId, session, true, screenEvent); + EXPECT_TRUE(g_errLog.find("event: connect") != std::string::npos); + g_errLog.clear(); + LOG_SetCallback(nullptr); +} } } } \ No newline at end of file