From c4d62229706c51b7aed36c284c0c7acd84e7867c Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 11 Aug 2025 09:04:22 +0800 Subject: [PATCH] Issue:https://gitee.com/openharmony/window_window_manager/issues/ICS8P9 Signed-off-by: Lchy2333 --- .../include/screen_session_manager.h | 3 +- .../src/screen_session_manager.cpp | 110 +++++++++++++++--- .../screen_session_manager_test.cpp | 4 +- 3 files changed, 95 insertions(+), 22 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 5c8de4839e..8d018c9a07 100644 --- a/window_scene/screen_session_manager/include/screen_session_manager.h +++ b/window_scene/screen_session_manager/include/screen_session_manager.h @@ -514,6 +514,7 @@ private: sptr GetScreenSessionInner(ScreenId screenId, ScreenProperty property); sptr CreatePhysicalMirrorSessionInner(ScreenId screenId, ScreenId defaultScreenId, ScreenProperty property); + void SetDefaultScreenResolution(sptr screenSession); /* physical screen session */ sptr GetOrCreatePhysicalScreenSession(ScreenId screenId); @@ -667,7 +668,7 @@ private: int32_t currentScbPId_ { -1 }; int32_t switchId_ { -1 }; std::vector oldScbPids_ {}; - std::map> clientProxyMap_; + std::map> multiClientProxyMap_; FoldDisplayMode oldScbDisplayMode_ = FoldDisplayMode::UNKNOWN; sptr clientProxy_; 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 d49eb02422..6e9bddba45 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager.cpp @@ -58,6 +58,7 @@ #include "screen_rotation_property.h" #include "screen_sensor_connector.h" #include "screen_setting_helper.h" +#include "screen_capability_config.h" #include "screen_session_dumper.h" #include "mock_session_manager_service.h" #include "connection/screen_snapshot_picker_connection.h" @@ -129,6 +130,7 @@ static const int NOTIFY_EVENT_FOR_DUAL_FAILED = 0; static const int NOTIFY_EVENT_FOR_DUAL_SUCESS = 1; static const int NO_NEED_NOTIFY_EVENT_FOR_DUAL = 2; static bool g_isPcDevice = false; +static bool g_isCarDevice = false; static float g_extendScreenDpiCoef = EXTEND_SCREEN_DPI_DEFAULT_PARAMETER; static uint32_t g_internalWidth = 3120; #ifdef WM_MULTI_SCREEN_CTL_ABILITY_ENABLE @@ -237,6 +239,9 @@ ScreenSessionManager::ScreenSessionManager() if (g_foldScreenFlag) { HandleFoldScreenPowerInit(); } + if (!ScreenCapabilityConfig::Init()) { + TLOGE(WmsLogTag::DMS, "screen capability config init failed"); + } if (FoldScreenStateInternel::IsSecondaryDisplayFoldDevice()) { InitSecondaryDisplayPhysicalParams(); } @@ -433,7 +438,9 @@ void ScreenSessionManager::Init() TLOGE(WmsLogTag::DMS, "load aod lib failed"); } } - + if (system::GetParameter("const.product.devicetype", "") == "car") { + g_isCarDevice = true; + } RegisterScreenChangeListener(); if (!ScreenSceneConfig::IsSupportRotateWithSensor()) { TLOGI(WmsLogTag::DMS, "Current type not support SetSensorSubscriptionEnabled."); @@ -802,20 +809,22 @@ void ScreenSessionManager::OnVirtualScreenChange(ScreenId screenId, ScreenEvent screenSession->SetDisplayGroupId(DISPLAY_GROUP_ID_DEFAULT); screenSession->SetMainDisplayIdOfGroup(MAIN_SCREEN_ID_DEFAULT); } - if (clientProxy) { - clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), - ScreenEvent::CONNECTED); + for (const auto& [userId, clientProxy] : multiClientProxyMap) { + if (clientProxy != nullptr) { + clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), + ScreenEvent::CONNECTED); + } } return; } if (screenEvent == ScreenEvent::DISCONNECTED) { - std::map> clientProxyMap; + std::map> multiClientProxyMap; { std::lock_guard lock(clientProxyMutex_); - clientProxyMap = clientProxyMap_; + multiClientProxyMap = multiClientProxyMap_; } - for (const auto& [userId, clientProxy] : clientProxyMap) { - if (clientProxy) { + for (const auto& [userId, clientProxy] : multiClientProxyMap) { + if (clientProxy != nullptr) { clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), ScreenEvent::DISCONNECTED); } @@ -901,6 +910,11 @@ void ScreenSessionManager::OnScreenChange(ScreenId screenId, ScreenEvent screenE screenId, static_cast(reason)); return; } + if (g_isCarDevice) { + std::vector ids = { screenId }; + std::vector displayIds; + MakeUniqueScreen(ids, displayIds); + } if (g_isPcDevice) { OnScreenChangeForPC(screenId, screenEvent, reason); } else { @@ -1449,7 +1463,7 @@ void ScreenSessionManager::HandleScreenConnectEvent(sptr screenSe SuperFoldStateManager::GetInstance().RefreshExternalRegion(); } if (foldScreenController_ != nullptr) { - if ((screenId == 0 || (screenId == SCREEN_ID_MAIN && isCoordinationFlag_ == true)) && clientProxy) { + if ((screenId == 0 || (screenId == SCREEN_ID_MAIN && isCoordinationFlag_ == true)) && (clientProxy || g_isCarDevice)) { 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); @@ -1478,7 +1492,11 @@ void ScreenSessionManager::HandleScreenConnectEvent(sptr screenSe } if (clientProxy && !g_isPcDevice && !phyMirrorEnable) { TLOGW(WmsLogTag::DMS, "screen connect and notify to scb."); - clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), screenEvent); + for (const auto& [screenId, clientProxy] : multiClientProxyMap_) { + if (clientProxy != nullptr) { + clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), screenEvent); + } + } } if (phyMirrorEnable) { NotifyScreenConnected(screenSession->ConvertToScreenInfo()); @@ -1525,9 +1543,11 @@ void ScreenSessionManager::HandleScreenDisconnectEvent(sptr scree bool phyMirrorEnable = IsDefaultMirrorMode(screenId); HandlePhysicalMirrorDisconnect(screenSession, screenId, phyMirrorEnable); auto clientProxy = GetClientProxy(); - if (clientProxy) { - TLOGW(WmsLogTag::DMS, "screen disconnect and notify to scb."); - clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), ScreenEvent::DISCONNECTED); + for(const auto& [screenId, clientProxy] : multiClientProxyMap_) { + if (clientProxy != nullptr) { + clientProxy->OnScreenConnectionChanged(GetSessionOption(screenSession, screenId), + ScreenEvent::DISCONNECTED); + } } #ifdef WM_MULTI_SCREEN_ENABLE HandleExtendScreenDisconnect(screenId); @@ -2488,6 +2508,10 @@ sptr ScreenSessionManager::GetPhysicalScreenSession(ScreenId scre .mirrorNodeId = nodeId, .property = property, }; + bool isCar = (system::GetParameter("const.product.devicetype", "unknown") == "car") && (screenId != 0); + if (isCar) { + config.mirrorNodeId = 0; + } screenSession = new ScreenSession(config, ScreenSessionReason::CREATE_SESSION_FOR_MIRROR); screenSession->SetIsPhysicalMirrorSwitch(true); #ifdef FOLD_ABILITY_ENABLE @@ -2534,9 +2558,14 @@ sptr ScreenSessionManager::CreatePhysicalMirrorSessionInner(Scree GetAndMergeEdidInfo(screenSession); screenSession->SetMirrorScreenType(MirrorScreenType::PHYSICAL_MIRROR); screenSession->SetIsPcUse(g_isPcDevice ? true : false); - screenSession->SetIsInternal(false); - screenSession->SetIsRealScreen(true); - screenSession->SetIsCurrentInUse(true); + bool isCar = (system::GetParameter("const.product.devicetype", "unknown") == "car") && (screenId != 0); + if (isCar) { + screenSession->SetName("UNKNOWN"); + } else { + screenSession->SetIsInternal(false); + screenSession->SetIsRealScreen(true); + screenSession->SetIsCurrentInUse(true); + } NotifyScreenChanged(screenSession->ConvertToScreenInfo(), ScreenChangeEvent::SCREEN_SWITCH_CHANGE); if (!g_isPcDevice) { hdmiScreenCount_ = hdmiScreenCount_ + 1; @@ -2915,6 +2944,9 @@ sptr ScreenSessionManager::GetOrCreateScreenSession(ScreenId scre if (g_isPcDevice) { SetMultiScreenFrameControl(); } + if (g_isCarDevice && system::GetParameter("const.cust.devmodel", "").find("PCE") != std::string::npos) { + SetDefaultScreenResolution(session); + } screenEventTracker_.RecordEvent("create screen session success."); SetHdrFormats(GetPhyScreenId(screenId), session); SetColorSpaces(GetPhyScreenId(screenId), session); @@ -2929,6 +2961,42 @@ sptr ScreenSessionManager::GetOrCreateScreenSession(ScreenId scre return session; } +void ScreenSessionManager::SetDefaultScreenResolution(sptr session) +{ + auto screenId = screenSession->screenId_; + if (screenId != GetDefaultScreenId()) { + return; + } + int32_t screenWidth = 2880; + int32_t screenHeight = 1920; + int32_t windowWidth = 2880; + int32_t windowHeight = 1800; + int32_t offsetX = (screenWidth - windowWidth) / 2; + int32_t offsetY = (screenHeight - windowHeight) / 2; + auto property = session->GetScreenProperty(); + auto screenBounds = RRect({ 0, 0, windowWidth, windowHeight }, 0.0f, 0.0f); + property.SetBounds(screenBounds); + property.SetScreenRealWidth(screenWidth); + property.SetScreenRealHeight(screenHeight); + screenSession->PropertyChange(property, ScreenPropertyChangeReason::CHANGE_MODE); + auto displayNode = session->GetDisplayNode(); + if (displayNode != nullptr) { + displayNode->SetTranslateX(offsetX); + displayNode->SetTranslateY(offsetY); + } + auto transactionProxy = RSTransactionProxy::GetInstance(); + if (transactionProxy != nullptr) { + TLOGD(WmsLogTag::DMS, "flush data"); + transactionProxy->FlushImplicitTransaction(); + } + NotifyDisplayStateChange(GetDefaultScreenId(), screenSession->ConvertToDisplayInfo(), {}, + DisplayStateChangeType::UPDATE_SCALE); + { + std::lock_guard lock(screenSessionMapMutex_); + screenSessionMap_[screenId] = screenSession; + } +} + bool ScreenSessionManager::HandleFoldScreenSessionCreate(ScreenId screenId) { #ifdef FOLD_ABILITY_ENABLE @@ -5700,6 +5768,10 @@ bool ScreenSessionManager::ScreenIdManager::DeleteScreenId(ScreenId smsScreenId) ScreenId rsScreenId = iter->second; sms2RsScreenIdMap_.erase(smsScreenId); rs2SmsScreenIdMap_.erase(rsScreenId); + TLOGD(WmsLogTag::DMS, "DeleteScreenId: smsScreenId: %{public}d", static_cast(smsScreenId)); + if (smsScreenId >= 1000) { + smsScreenCount_--; + } return true; } @@ -8520,7 +8592,7 @@ void ScreenSessionManager::SwitchScbNodeHandle(int32_t newUserId, int32_t newScb } if (coldBoot) { clientProxy->SwitchUserCallback(oldScbPids_, newScbPid); - clientProxyMap_[newUserId] = clientProxy; + multiClientProxyMap_[newUserId] = clientProxy; } else { HotSwitch(newUserId, newScbPid); } @@ -8559,7 +8631,7 @@ void ScreenSessionManager::NotifyCastWhenSwitchScbNode() void ScreenSessionManager::HotSwitch(int32_t newUserId, int32_t newScbPid) { // hot switch - if (clientProxyMap_.count(newUserId) == 0) { + if (multiClientProxyMap_.count(newUserId) == 0) { TLOGE(WmsLogTag::DMS, "not found client proxy. userId:%{public}d.", newUserId); return; } @@ -8577,7 +8649,7 @@ void ScreenSessionManager::HotSwitch(int32_t newUserId, int32_t newScbPid) clientProxy->OnScreenConnectionChanged(option, ScreenEvent::DISCONNECTED); } } - SetClientProxy(clientProxyMap_[newUserId]); + SetClientProxy(multiClientProxyMap_[newUserId]); ScbStatusRecoveryWhenSwitchUser(oldScbPids_, newScbPid); } 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 202c0cd118..51f80a213d 100644 --- a/window_scene/test/dms_unittest/screen_session_manager_test.cpp +++ b/window_scene/test/dms_unittest/screen_session_manager_test.cpp @@ -4909,9 +4909,9 @@ HWTEST_F(ScreenSessionManagerTest, HotSwitch, Function | SmallTest | Level3) int32_t newScbPid = 1; ssm->HotSwitch(newUserId, newScbPid); sptr client = nullptr; - ssm->clientProxyMap_.insert(std::make_pair(newUserId, client)); + ssm->multiClientProxyMap_.insert(std::make_pair(newUserId, client)); ssm->HotSwitch(newUserId, newScbPid); - ssm->clientProxyMap_.insert(std::make_pair(1, client)); + ssm->multiClientProxyMap_.insert(std::make_pair(1, client)); ssm->HotSwitch(1, newScbPid); } -- Gitee