From 5f847eb4c969a02dcd3fffa0553f519ce6162adb Mon Sep 17 00:00:00 2001 From: MirMort Date: Wed, 10 Sep 2025 16:55:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B1=8F=E5=B9=95=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E6=97=B6=E6=8A=98=E5=8F=A0=E5=B1=8F=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E9=97=AE=E9=A2=98=20Signed-off-by:=20MirMort?= =?UTF-8?q?=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/screen_session_manager.h | 2 + .../src/screen_aod_plugin.cpp | 5 ++ .../src/screen_sensor_plugin.cpp | 5 ++ .../src/screen_session_manager.cpp | 44 +++++++++++------- .../screen_session_manager_test2.cpp | 46 +++++++++++++++++++ 5 files changed, 86 insertions(+), 16 deletions(-) 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 548ea91ffa..4260db6e4c 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 26c1e83461..d9a46b7a2c 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 2a5d33b0c9..489fcb89be 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 13214a5708..9c1f25d8fd 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 e8c73ff2ce..2e16ffda21 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 -- Gitee