From af4b5766ee6c1a6abc8d5e628ba68d6ff6f0d15e Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 11 Aug 2025 10:25:50 +0800 Subject: [PATCH 01/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../include/mock_session_manager_service.h | 8 +- wmserver/src/mock_session_manager_service.cpp | 213 ++++++++++-------- 2 files changed, 122 insertions(+), 99 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 0f94b31f39..55745af4d4 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -118,13 +118,15 @@ private: std::vector>& userIdAndBunldeNames); sptr screenSessionManager_; - sptr sceneSessionManager_; + sptr defaultSceneSessionManager_; /* * Multi User */ - int32_t currentWMSUserId_; - int32_t currentScreenId_; + int32_t defaultWMSUserId_; + int32_t defaultScreenId_; + std::shared_mutex screenId2UserIdMapLock_; + std::map screenId2UserIdMap_; std::shared_mutex smsDeathRecipientMapLock_; std::map> smsDeathRecipientMap_; std::shared_mutex sessionManagerServiceMapLock_; diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index d81b89a67a..3f4d3a8b5c 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -126,9 +126,11 @@ void MockSessionManagerService::SMSDeathRecipient::SetScreenId(int32_t screenId) } MockSessionManagerService::MockSessionManagerService() - : SystemAbility(WINDOW_MANAGER_SERVICE_ID, true), currentWMSUserId_(INVALID_USER_ID), - currentScreenId_(DEFAULT_SCREEN_ID) -{} + : SystemAbility(WINDOW_MANAGER_SERVICE_ID, true), defaultWMSUserId_(INVALID_USER_ID), + defaultScreenId_(DEFAULT_SCREEN_ID) +{ + //TODO 需要从dms获取默认屏幕id +} bool MockSessionManagerService::RegisterMockSessionManagerService() { @@ -210,25 +212,25 @@ bool MockSessionManagerService::SetSessionManagerService(const sptr lock(sessionManagerServiceMapLock_); - sessionManagerServiceMap_[currentWMSUserId_] = sessionManagerService; + sessionManagerServiceMap_[clientUserId] = sessionManagerService; } - RecoverSCBSnapshotSkipByUserId(currentWMSUserId_); - auto smsDeathRecipient = GetSMSDeathRecipientByUserId(currentWMSUserId_); + RecoverSCBSnapshotSkipByUserId(clientUserId); + auto smsDeathRecipient = GetSMSDeathRecipientByUserId(clientUserId); if (!smsDeathRecipient) { - smsDeathRecipient = new SMSDeathRecipient(currentWMSUserId_); + smsDeathRecipient = new SMSDeathRecipient(clientUserId); std::unique_lock lock(smsDeathRecipientMapLock_); if (!smsDeathRecipient) { TLOGE(WmsLogTag::WMS_MULTI_USER, "Failed to create death Recipient ptr smsDeathRecipient"); return false; } - smsDeathRecipientMap_[currentWMSUserId_] = smsDeathRecipient; + smsDeathRecipientMap_[clientUserId] = smsDeathRecipient; } if (sessionManagerService->IsProxyObject() && !sessionManagerService->AddDeathRecipient(smsDeathRecipient)) { TLOGE(WmsLogTag::WMS_MULTI_USER, "Failed to add death recipient"); @@ -237,6 +239,7 @@ bool MockSessionManagerService::SetSessionManagerService(const sptr& TLOGE(WmsLogTag::WMS_MULTI_USER, "userId is illegal: %{public}d", clientUserId); return ERR_INVALID_VALUE; } + //TODO U0用户只能拿到默认scb的句柄, 有问题, 要么改逻辑,要么加重载方法 if (clientUserId == SYSTEM_USERID) { - TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return current sessionManagerService with %{public}d", - currentWMSUserId_); - clientUserId = currentWMSUserId_; + TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", + defaultWMSUserId_); + clientUserId = defaultWMSUserId_; } sessionManagerService = GetSessionManagerServiceByUserId(clientUserId); return ERR_OK; @@ -308,27 +312,6 @@ void MockSessionManagerService::RemoveSessionManagerServiceByUserId(int32_t user } } -ErrCode MockSessionManagerService::NotifySceneBoardAvailable() -{ - if (!SessionPermission::IsSystemCalling()) { - TLOGE(WmsLogTag::WMS_RECOVER, "permission denied"); - return ERR_PERMISSION_DENIED; - } - int32_t userId = GetUserIdByCallingUid(); - if (userId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "userId is illegal: %{public}d", userId); - return ERR_INVALID_VALUE; - } - TLOGI(WmsLogTag::WMS_RECOVER, "scene board is available with userId=%{public}d", userId); - - NotifySceneBoardAvailableToLiteClient(SYSTEM_USERID); - NotifySceneBoardAvailableToLiteClient(userId); - - NotifySceneBoardAvailableToClient(SYSTEM_USERID); - NotifySceneBoardAvailableToClient(userId); - return ERR_OK; -} - ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener) { if (listener == nullptr) { @@ -354,21 +337,24 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(currentWMSUserId_) != wmsConnectionStatusMap_.end()) { - isWMSConnected = wmsConnectionStatusMap_[currentWMSUserId_]; + if (wmsConnectionStatusMap_.find(defaultWMSUserId_) != wmsConnectionStatusMap_.end()) {、 + //TODO 这里回调只能返回默认scb的sessionManagerService + isWMSConnected = wmsConnectionStatusMap_[defaultWMSUserId_]; } } if (smsListener && isWMSConnected) { - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + //TODO 这里回调只能返回默认scb的sessionManagerService + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return ERR_DEAD_OBJECT; } TLOGI(WmsLogTag::WMS_RECOVER, "WMS ready,notify client"); - smsListener->OnWMSConnectionChanged(currentWMSUserId_, currentScreenId_, true, sessionManagerService); + smsListener->OnWMSConnectionChanged(defaultWMSUserId_, defaultScreenId_, true, sessionManagerService); } return ERR_OK; } @@ -412,30 +398,6 @@ void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId, int } } -void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId) -{ - std::shared_lock lock(smsRecoverListenerLock_); - std::map>* smsRecoverListenerMap = - GetSMSRecoverListenerMap(userId); - if (!smsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); - return; - } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, - static_cast(smsRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; - } - for (auto& iter : *smsRecoverListenerMap) { - if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); - iter.second->OnSessionManagerServiceRecover(sessionManagerService); - } - } -} - ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr& listener) { if (listener == nullptr) { @@ -460,21 +422,22 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(currentWMSUserId_) != wmsConnectionStatusMap_.end()) { - isWMSConnected = wmsConnectionStatusMap_[currentWMSUserId_]; + if (wmsConnectionStatusMap_.find(defaultWMSUserId_) != wmsConnectionStatusMap_.end()) { + isWMSConnected = wmsConnectionStatusMap_[defaultWMSUserId_]; } } if (smsListener && isWMSConnected) { - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return ERR_DEAD_OBJECT; } TLOGD(WmsLogTag::WMS_MULTI_USER, "Lite wms is already connected, notify client"); - smsListener->OnWMSConnectionChanged(currentWMSUserId_, currentScreenId_, true, sessionManagerService); + smsListener->OnWMSConnectionChanged(defaultWMSUserId_, defaultScreenId_, true, sessionManagerService); } return ERR_OK; } @@ -517,6 +480,53 @@ void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId, } } +// 下面三个函数是recover相关的,会通知SYSTEM_USERID和userId, scb ts侧会调用过来。 +ErrCode MockSessionManagerService::NotifySceneBoardAvailable() +{ + if (!SessionPermission::IsSystemCalling()) { + TLOGE(WmsLogTag::WMS_RECOVER, "permission denied"); + return ERR_PERMISSION_DENIED; + } + int32_t userId = GetUserIdByCallingUid(); + if (userId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "userId is illegal: %{public}d", userId); + return ERR_INVALID_VALUE; + } + TLOGI(WmsLogTag::WMS_RECOVER, "scene board is available with userId=%{public}d", userId); + + NotifySceneBoardAvailableToLiteClient(SYSTEM_USERID); + NotifySceneBoardAvailableToLiteClient(userId); + + NotifySceneBoardAvailableToClient(SYSTEM_USERID); + NotifySceneBoardAvailableToClient(userId); + return ERR_OK; +} + +void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId) +{ + std::shared_lock lock(smsRecoverListenerLock_); + std::map>* smsRecoverListenerMap = + GetSMSRecoverListenerMap(userId); + if (!smsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, + static_cast(smsRecoverListenerMap->size())); + //TODO 这里以前是currentUserId,需要验证下改成userId对不对 + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *smsRecoverListenerMap) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); + } + } +} + void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t userId) { std::shared_lock lock(smsLiteRecoverListenerLock_); @@ -527,7 +537,8 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, static_cast(smsLiteRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + //TODO 这里以前是currentUserId,需要验证下改成userId对不对 + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; @@ -542,13 +553,18 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us } } +// dms进行用户切换时,会调用该方法,传入切入用户id,屏幕id, 非冷启动 +// scb启动时,会通过SCBScreenSessionManager连接fundation进程的dms服务端,连接后,会调用SetClient,dms服务端会发起一次NotifyWMSConnected(userid,screenId, true)。此时是冷启动 void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t screenId, bool isColdStart) { TLOGI(WmsLogTag::WMS_MULTI_USER, "userId = %{public}d, screenId = %{public}d, isColdStart = %{public}d", userId, screenId, isColdStart); - currentScreenId_ = screenId; - currentWMSUserId_ = userId; - auto smsDeathRecipient = GetSMSDeathRecipientByUserId(currentWMSUserId_); + // currentScreenId_ = screenId; + // currentWMSUserId_ = userId; + //TODO 这里需要通过dms提供的defaultScreenId获取到defaultWMSUserId,一旦默认屏幕上的用户发生切换,需要修改默认用户id。 + std::shared_lock lock(screenId2UserIdMapLock_); + screenId2UserIdMap_[screenId] = userId; + auto smsDeathRecipient = GetSMSDeathRecipientByUserId(userId); if (smsDeathRecipient != nullptr) { smsDeathRecipient->SetScreenId(screenId); } @@ -583,7 +599,7 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToClient( TLOGD(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", wmsUserId, isConnected, smsRecoverListenerMap->size()); - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; @@ -606,7 +622,7 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( return; } TLOGD(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d", wmsUserId, isConnected); - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; @@ -639,7 +655,7 @@ void MockSessionManagerService::ShowIllegalArgsInfo(std::string& dumpInfo) sptr MockSessionManagerService::GetSceneSessionManager() { - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { WLOGFE("SessionManagerService is null"); return nullptr; @@ -654,8 +670,8 @@ sptr MockSessionManagerService::GetSceneSessionManager() WLOGFW("Get scene session manager proxy failed, scene session manager service is null"); return sptr(nullptr); } - sceneSessionManager_ = remoteObject; - return sceneSessionManager_; + defaultSceneSessionManager_ = remoteObject; + return defaultSceneSessionManager_; } int MockSessionManagerService::DumpSessionInfo(const std::vector& args, std::string& dumpInfo) @@ -663,20 +679,21 @@ int MockSessionManagerService::DumpSessionInfo(const std::vector& a if (args.empty()) { return -1; // WMError::WM_ERROR_INVALID_PARAM; } - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + // TODO 这里现在只能获取默认屏幕用户的dump信息 + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { WLOGFE("sessionManagerService is nullptr"); return -1; } - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { WLOGFW("Get scene session manager ..."); GetSceneSessionManager(); - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { WLOGFW("Get scene session manager proxy failed, nullptr"); return -1; } } - sptr sceneSessionManagerProxy = iface_cast(sceneSessionManager_); + sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); WSError ret = sceneSessionManagerProxy->GetSessionDumpInfo(args, dumpInfo); if (ret != WSError::WS_OK) { WLOGFD("sessionManagerService set success!"); @@ -751,15 +768,16 @@ bool MockSessionManagerService::SMSDeathRecipient::IsSceneBoardTestMode() void MockSessionManagerService::GetProcessSurfaceNodeIdByPersistentId(const int32_t pid, const std::vector& windowIdList, std::vector& surfaceNodeIds) { - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + //TODO 这里现在只支持默认屏幕用户的 + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { WLOGFE("sessionManagerService is nullptr"); return; } - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { WLOGFW("Get scene session manager ..."); GetSceneSessionManager(); - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { WLOGFW("Get scene session manager proxy failed, nullptr"); return; } @@ -772,7 +790,7 @@ void MockSessionManagerService::GetProcessSurfaceNodeIdByPersistentId(const int3 for (uint64_t id : windowIdList) { persistentIds.push_back(static_cast(id)); } - sptr sceneSessionManagerProxy = iface_cast(sceneSessionManager_); + sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); WMError ret = sceneSessionManagerProxy->GetProcessSurfaceNodeIdByPersistentId( pid, persistentIds, surfaceNodeIds); if (ret != WMError::WM_OK) { @@ -782,19 +800,20 @@ void MockSessionManagerService::GetProcessSurfaceNodeIdByPersistentId(const int3 void MockSessionManagerService::AddSkipSelfWhenShowOnVirtualScreenList(const std::vector& persistentIds) { - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + //TODO 这里现在只支持默认屏幕用户的 + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerService is nullptr"); return; } - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { GetSceneSessionManager(); - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { TLOGW(WmsLogTag::WMS_ATTRIBUTE, "get scene session manager proxy failed, nullptr"); return; } } - sptr sceneSessionManagerProxy = iface_cast(sceneSessionManager_); + sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); if (sceneSessionManagerProxy == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerServiceProxy is nullptr"); return; @@ -807,19 +826,20 @@ void MockSessionManagerService::AddSkipSelfWhenShowOnVirtualScreenList(const std void MockSessionManagerService::RemoveSkipSelfWhenShowOnVirtualScreenList(const std::vector& persistentIds) { - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + //TODO 这里现在只支持默认屏幕用户的 + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerService is nullptr"); return; } - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { GetSceneSessionManager(); - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { TLOGW(WmsLogTag::WMS_ATTRIBUTE, "get scene session manager proxy failed, nullptr"); return; } } - sptr sceneSessionManagerProxy = iface_cast(sceneSessionManager_); + sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); if (sceneSessionManagerProxy == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerServiceProxy is nullptr"); return; @@ -837,19 +857,20 @@ void MockSessionManagerService::SetScreenPrivacyWindowTagSwitch( TLOGI(WmsLogTag::WMS_ATTRIBUTE, "PrivacyWindowTags is empty"); return; } - auto sessionManagerService = GetSessionManagerServiceByUserId(currentWMSUserId_); + //TODO 这里现在只支持默认屏幕用户的 这个方法还有个screenId + auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerService is nullptr"); return; } - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { GetSceneSessionManager(); - if (!sceneSessionManager_) { + if (!defaultSceneSessionManager_) { TLOGW(WmsLogTag::WMS_ATTRIBUTE, "get scene session manager proxy failed, nullptr"); return; } } - sptr sceneSessionManagerProxy = iface_cast(sceneSessionManager_); + sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); if (sceneSessionManagerProxy == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerServiceProxy is nullptr"); return; -- Gitee From 3b6d6d4b1bc7dd9873f5807e850cdc73e8190b66 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 11 Aug 2025 10:49:24 +0800 Subject: [PATCH 02/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 3f4d3a8b5c..f3fe91563b 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -559,9 +559,10 @@ void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t scree { TLOGI(WmsLogTag::WMS_MULTI_USER, "userId = %{public}d, screenId = %{public}d, isColdStart = %{public}d", userId, screenId, isColdStart); - // currentScreenId_ = screenId; - // currentWMSUserId_ = userId; //TODO 这里需要通过dms提供的defaultScreenId获取到defaultWMSUserId,一旦默认屏幕上的用户发生切换,需要修改默认用户id。 + if (screenId == defaultScreenId_) { + defaultWMSUserId_ = userId; + } std::shared_lock lock(screenId2UserIdMapLock_); screenId2UserIdMap_[screenId] = userId; auto smsDeathRecipient = GetSMSDeathRecipientByUserId(userId); -- Gitee From 180285e76a56c3b16e4a71f9809ff5deee2c392b Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 11 Aug 2025 11:38:57 +0800 Subject: [PATCH 03/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/include/mock_session_manager_service.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 55745af4d4..60fe41656c 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -126,7 +126,7 @@ private: int32_t defaultWMSUserId_; int32_t defaultScreenId_; std::shared_mutex screenId2UserIdMapLock_; - std::map screenId2UserIdMap_; + std::map screenId2UserIdMap_; std::shared_mutex smsDeathRecipientMapLock_; std::map> smsDeathRecipientMap_; std::shared_mutex sessionManagerServiceMapLock_; -- Gitee From 2851a5ceb132540fc7c223d9f7aba73bed8bd07d Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 11 Aug 2025 14:32:30 +0800 Subject: [PATCH 04/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index f3fe91563b..07c7b2580c 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -513,6 +513,11 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, static_cast(smsRecoverListenerMap->size())); + if (userId == SYSTEM_USERID) { + TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", + defaultWMSUserId_); + userId = defaultWMSUserId_; + } //TODO 这里以前是currentUserId,需要验证下改成userId对不对 auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { @@ -537,6 +542,11 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, static_cast(smsLiteRecoverListenerMap->size())); + if (userId == SYSTEM_USERID) { + TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", + defaultWMSUserId_); + userId = defaultWMSUserId_; + } //TODO 这里以前是currentUserId,需要验证下改成userId对不对 auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { -- Gitee From 0419467389ccf586b91b58b5525c770c0753e809 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 11 Aug 2025 17:01:19 +0800 Subject: [PATCH 05/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../include/mock_session_manager_service.h | 2 +- wmserver/src/mock_session_manager_service.cpp | 21 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 60fe41656c..251a703e5f 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -125,7 +125,7 @@ private: */ int32_t defaultWMSUserId_; int32_t defaultScreenId_; - std::shared_mutex screenId2UserIdMapLock_; + std::mutex screenId2UserIdMapLock_; std::map screenId2UserIdMap_; std::shared_mutex smsDeathRecipientMapLock_; std::map> smsDeathRecipientMap_; diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 07c7b2580c..25bf8619df 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -573,8 +573,10 @@ void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t scree if (screenId == defaultScreenId_) { defaultWMSUserId_ = userId; } - std::shared_lock lock(screenId2UserIdMapLock_); - screenId2UserIdMap_[screenId] = userId; + { + std::lock_guard lock(screenId2UserIdMapLock_); + screenId2UserIdMap_[screenId] = userId; + } auto smsDeathRecipient = GetSMSDeathRecipientByUserId(userId); if (smsDeathRecipient != nullptr) { smsDeathRecipient->SetScreenId(screenId); @@ -705,6 +707,10 @@ int MockSessionManagerService::DumpSessionInfo(const std::vector& a } } sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); + if (sceneSessionManagerProxy == nullptr) { + WLOGFW("sessionManagerServiceProxy is nullptr"); + return -1; + } WSError ret = sceneSessionManagerProxy->GetSessionDumpInfo(args, dumpInfo); if (ret != WSError::WS_OK) { WLOGFD("sessionManagerService set success!"); @@ -797,11 +803,14 @@ void MockSessionManagerService::GetProcessSurfaceNodeIdByPersistentId(const int3 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "windowIdList is null, no need to get surfaceNodeId"); return; } - std::vector persistentIds; - for (uint64_t id : windowIdList) { - persistentIds.push_back(static_cast(id)); - } + std::vector persistentIds(windowIdList.size()); + std::transform(windowIdList.begin(), windowIdList.end(), + persistentIds.begin(), [](uint64_t id) { return static_cast(id); }); sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); + if (sceneSessionManagerProxy == nullptr) { + WLOGFW("sessionManagerServiceProxy is nullptr"); + return; + } WMError ret = sceneSessionManagerProxy->GetProcessSurfaceNodeIdByPersistentId( pid, persistentIds, surfaceNodeIds); if (ret != WMError::WM_OK) { -- Gitee From b17764522f70a96a3cfd2bab0c97a4bb08a51ca4 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 11 Aug 2025 17:07:50 +0800 Subject: [PATCH 06/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 25bf8619df..bcc906ff33 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -341,7 +341,7 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(defaultWMSUserId_) != wmsConnectionStatusMap_.end()) {、 + if (wmsConnectionStatusMap_.find(defaultWMSUserId_) != wmsConnectionStatusMap_.end()) { //TODO 这里回调只能返回默认scb的sessionManagerService isWMSConnected = wmsConnectionStatusMap_[defaultWMSUserId_]; } -- Gitee From e4daf79f1bd15b70839c6617361cd7ffd0ba60be Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Tue, 12 Aug 2025 10:54:56 +0800 Subject: [PATCH 07/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index bcc906ff33..0d29b49c74 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -42,6 +42,7 @@ #include "session_manager_service_interface.h" #include "screen_session_manager_lite.h" #include "common/include/session_permission.h" +#include "display_manager.h" #define PATH_LEN 1024 #define O_RDWR 02 @@ -129,7 +130,8 @@ MockSessionManagerService::MockSessionManagerService() : SystemAbility(WINDOW_MANAGER_SERVICE_ID, true), defaultWMSUserId_(INVALID_USER_ID), defaultScreenId_(DEFAULT_SCREEN_ID) { - //TODO 需要从dms获取默认屏幕id + defaultScreenId_ = DisplayManager::GetInstance().GetDefaultDisplayId(); + TLOGI(WmsLogTag::WMS_MULTI_USER, "MockSessionManagerService initialized. Default screenId: %{public}d", defaultScreenId_); } bool MockSessionManagerService::RegisterMockSessionManagerService() @@ -518,7 +520,6 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId defaultWMSUserId_); userId = defaultWMSUserId_; } - //TODO 这里以前是currentUserId,需要验证下改成userId对不对 auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -547,7 +548,6 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us defaultWMSUserId_); userId = defaultWMSUserId_; } - //TODO 这里以前是currentUserId,需要验证下改成userId对不对 auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -563,13 +563,10 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us } } -// dms进行用户切换时,会调用该方法,传入切入用户id,屏幕id, 非冷启动 -// scb启动时,会通过SCBScreenSessionManager连接fundation进程的dms服务端,连接后,会调用SetClient,dms服务端会发起一次NotifyWMSConnected(userid,screenId, true)。此时是冷启动 void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t screenId, bool isColdStart) { TLOGI(WmsLogTag::WMS_MULTI_USER, "userId = %{public}d, screenId = %{public}d, isColdStart = %{public}d", userId, screenId, isColdStart); - //TODO 这里需要通过dms提供的defaultScreenId获取到defaultWMSUserId,一旦默认屏幕上的用户发生切换,需要修改默认用户id。 if (screenId == defaultScreenId_) { defaultWMSUserId_ = userId; } -- Gitee From 5a943aba04966bdcfe94e30efe1e7de3df4945a7 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Tue, 12 Aug 2025 16:44:15 +0800 Subject: [PATCH 08/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/BUILD.gn | 1 + wmserver/src/mock_session_manager_service.cpp | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/wmserver/BUILD.gn b/wmserver/BUILD.gn index bad8c1749f..3b521f11a8 100644 --- a/wmserver/BUILD.gn +++ b/wmserver/BUILD.gn @@ -151,6 +151,7 @@ ohos_shared_library("sms") { deps = [ ":mock_session_manager_service_stub", + "${window_base_path}/dm:libdm", "${window_base_path}/utils:libwmutil", "${window_base_path}/utils:libwmutil_base", "${window_base_path}/window_scene/common:window_scene_common", diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 0d29b49c74..be2623fd97 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -131,7 +131,8 @@ MockSessionManagerService::MockSessionManagerService() defaultScreenId_(DEFAULT_SCREEN_ID) { defaultScreenId_ = DisplayManager::GetInstance().GetDefaultDisplayId(); - TLOGI(WmsLogTag::WMS_MULTI_USER, "MockSessionManagerService initialized. Default screenId: %{public}d", defaultScreenId_); + TLOGI(WmsLogTag::WMS_MULTI_USER, "MockSessionManagerService initialized. Default screenId: %{public}d", + defaultScreenId_); } bool MockSessionManagerService::RegisterMockSessionManagerService() @@ -284,7 +285,7 @@ ErrCode MockSessionManagerService::GetSessionManagerService(sptr& //TODO U0用户只能拿到默认scb的句柄, 有问题, 要么改逻辑,要么加重载方法 if (clientUserId == SYSTEM_USERID) { TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", - defaultWMSUserId_); + defaultWMSUserId_); clientUserId = defaultWMSUserId_; } sessionManagerService = GetSessionManagerServiceByUserId(clientUserId); @@ -517,7 +518,7 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId static_cast(smsRecoverListenerMap->size())); if (userId == SYSTEM_USERID) { TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", - defaultWMSUserId_); + defaultWMSUserId_); userId = defaultWMSUserId_; } auto sessionManagerService = GetSessionManagerServiceByUserId(userId); @@ -545,9 +546,9 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us static_cast(smsLiteRecoverListenerMap->size())); if (userId == SYSTEM_USERID) { TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", - defaultWMSUserId_); + defaultWMSUserId_); userId = defaultWMSUserId_; - } + } auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -802,7 +803,7 @@ void MockSessionManagerService::GetProcessSurfaceNodeIdByPersistentId(const int3 } std::vector persistentIds(windowIdList.size()); std::transform(windowIdList.begin(), windowIdList.end(), - persistentIds.begin(), [](uint64_t id) { return static_cast(id); }); + persistentIds.begin(), [](uint64_t id) { return static_cast(id); }); sptr sceneSessionManagerProxy = iface_cast(defaultSceneSessionManager_); if (sceneSessionManagerProxy == nullptr) { WLOGFW("sessionManagerServiceProxy is nullptr"); -- Gitee From 166e51ad9cf1a2f8608aef1de00675be100fcd2c Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Thu, 14 Aug 2025 18:46:11 +0800 Subject: [PATCH 09/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/IMockSessionManagerInterface.idl | 3 + wmserver/src/mock_session_manager_service.cpp | 70 ++++++++++++++++++- 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/wmserver/IMockSessionManagerInterface.idl b/wmserver/IMockSessionManagerInterface.idl index 7a0227abf9..d034e0451d 100644 --- a/wmserver/IMockSessionManagerInterface.idl +++ b/wmserver/IMockSessionManagerInterface.idl @@ -18,6 +18,7 @@ interface_token OHOS.IMockSessionManager; interface OHOS.Rosen.IMockSessionManagerInterface { [ipccode 0] void GetSessionManagerService([out] IRemoteObject sessionManageService); + void GetSessionManagerServiceByUserId([in] int userId, [out] IRemoteObject sessionManageService); void GetScreenSessionManagerLite([out] IRemoteObject screenSessionManagerLite); [oneway] void NotifySceneBoardAvailable(); void RegisterSMSRecoverListener([in] IRemoteObject listener); @@ -26,4 +27,6 @@ interface OHOS.Rosen.IMockSessionManagerInterface { void UnregisterSMSLiteRecoverListener(); void SetSnapshotSkipByUserIdAndBundleNames([in] int userId, [in] String[] bundleNameList); void SetSnapshotSkipByIdNamesMap([in] Map userIdAndBundleNames); + void GetSceneSessionManagerLiteByUserId([in] int userId, [out] IRemoteObject sceneSessionManagerLite); + void GetSceneSessionManagerByUserId([in] int userId, [out] IRemoteObject sceneSessionManager); } \ No newline at end of file diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index be2623fd97..d339cbf8f5 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -282,7 +282,6 @@ ErrCode MockSessionManagerService::GetSessionManagerService(sptr& TLOGE(WmsLogTag::WMS_MULTI_USER, "userId is illegal: %{public}d", clientUserId); return ERR_INVALID_VALUE; } - //TODO U0用户只能拿到默认scb的句柄, 有问题, 要么改逻辑,要么加重载方法 if (clientUserId == SYSTEM_USERID) { TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", defaultWMSUserId_); @@ -292,6 +291,21 @@ ErrCode MockSessionManagerService::GetSessionManagerService(sptr& return ERR_OK; } +ErrCode MockSessionManagerService::GetSessionManagerService(int32_t userId, sptr& sessionManagerService) +{ + int32_t clientUserId = GetUserIdByCallingUid(); + if (clientUserId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_MULTI_USER, "userId is illegal: %{public}d", clientUserId); + return ERR_INVALID_VALUE; + } + if (clientUserId != SYSTEM_USERID) { + return ERR_WOULD_BLOCK; + } + sessionManagerService = GetSessionManagerServiceByUserId(userId); + return ERR_OK; +} + + sptr MockSessionManagerService::GetSessionManagerServiceByUserId(int32_t userId) { std::shared_lock lock(sessionManagerServiceMapLock_); @@ -919,6 +933,60 @@ sptr MockSessionManagerService::GetSceneSessionManagerByUserId(in return remoteObject; } +ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( + int32_t userId, + sptr& result, + bool isLite) +{ + int32_t clientUserId = GetUserIdByCallingUid(); + if (clientUserId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_MULTI_USER, "userId is illegal: %{public}d", clientUserId); + return ERR_INVALID_VALUE; + } + + if (clientUserId != SYSTEM_USERID) { + return ERR_WOULD_BLOCK; + } + + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + WLOGFE("sessionManagerService is nullptr"); + return ERR_INVALID_VALUE; + } + + sptr sessionManagerServiceProxy = + iface_cast(sessionManagerService); + if (sessionManagerServiceProxy == nullptr) { + WLOGFE("sessionManagerServiceProxy is nullptr"); + return ERR_DEAD_OBJECT; + } + + if (isLite) { + result = sessionManagerServiceProxy->GetSceneSessionManagerLite(); + } else { + result = sessionManagerServiceProxy->GetSceneSessionManager(); + } + + if (result == nullptr) { + WLOGFW("Get scene session manager proxy failed, scene session manager service %s is null", + isLite ? "(lite)" : ""); + return ERR_DEAD_OBJECT; + } + return ERR_OK; +} + +ErrCode MockSessionManagerService::GetSceneSessionManagerLiteByUserId(int32_t userId, sptr& sceneSessionManagerLite) +{ + return GetSceneSessionManagerCommon(userId, sceneSessionManagerLite, true); +} + +ErrCode MockSessionManagerService::GetSceneSessionManagerByUserId( + int32_t userId, + sptr& sceneSessionManager) +{ + return GetSceneSessionManagerCommon(userId, sceneSessionManager, false); +} + ErrCode MockSessionManagerService::RecoverSCBSnapshotSkipByUserId(int32_t userId) { std::unique_lock lock(userIdBundleNamesMapLock_); -- Gitee From cc3cbd04abec72ea420de7894a2a100da84abdde Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Thu, 14 Aug 2025 19:07:47 +0800 Subject: [PATCH 10/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/include/mock_session_manager_service.h | 7 +++++++ wmserver/src/mock_session_manager_service.cpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 251a703e5f..1071e40d69 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -45,6 +45,7 @@ public: */ bool SetSessionManagerService(const sptr& sessionManagerService); ErrCode GetSessionManagerService(sptr& sessionManagerService) override; + ErrCode GetSessionManagerService(int32_t userId, sptr& sessionManagerService) override; void NotifyWMSConnected(int32_t userId, int32_t screenId, bool isColdStart); void NotifyNotKillService() {} @@ -67,6 +68,12 @@ public: ErrCode SetSnapshotSkipByIdNamesMap(const std::unordered_map>& userIdAndBunldeNames) override; + + ErrCode GetSceneSessionManagerLiteByUserId(int32_t userId, + sptr& sceneSessionManagerLite) override; + ErrCode GetSceneSessionManagerByUserId(int32_t userId, + sptr& sceneSessionManager) override; + protected: MockSessionManagerService(); virtual ~MockSessionManagerService() = default; diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index d339cbf8f5..bc8d6b4b9f 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -131,7 +131,7 @@ MockSessionManagerService::MockSessionManagerService() defaultScreenId_(DEFAULT_SCREEN_ID) { defaultScreenId_ = DisplayManager::GetInstance().GetDefaultDisplayId(); - TLOGI(WmsLogTag::WMS_MULTI_USER, "MockSessionManagerService initialized. Default screenId: %{public}d", + TLOGI(WmsLogTag::WMS_MULTI_USER, "MockSessionManagerService initialized. Default screenId: %{public}d", defaultScreenId_); } -- Gitee From 5529330cb227726becfe8d01f1dd881d38149279 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Thu, 14 Aug 2025 19:27:00 +0800 Subject: [PATCH 11/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/include/mock_session_manager_service.h | 2 +- wmserver/src/mock_session_manager_service.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 1071e40d69..86a3388f21 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -45,7 +45,7 @@ public: */ bool SetSessionManagerService(const sptr& sessionManagerService); ErrCode GetSessionManagerService(sptr& sessionManagerService) override; - ErrCode GetSessionManagerService(int32_t userId, sptr& sessionManagerService) override; + ErrCode GetSessionManagerServiceByUserId(int32_t userId, sptr& sessionManagerService) override; void NotifyWMSConnected(int32_t userId, int32_t screenId, bool isColdStart); void NotifyNotKillService() {} diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index bc8d6b4b9f..3a56dbfbbd 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -291,7 +291,7 @@ ErrCode MockSessionManagerService::GetSessionManagerService(sptr& return ERR_OK; } -ErrCode MockSessionManagerService::GetSessionManagerService(int32_t userId, sptr& sessionManagerService) +ErrCode MockSessionManagerService::GetSessionManagerServiceByUserId(int32_t userId, sptr& sessionManagerService) { int32_t clientUserId = GetUserIdByCallingUid(); if (clientUserId <= INVALID_USER_ID) { @@ -975,16 +975,16 @@ ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( return ERR_OK; } -ErrCode MockSessionManagerService::GetSceneSessionManagerLiteByUserId(int32_t userId, sptr& sceneSessionManagerLite) +ErrCode MockSessionManagerService::GetSceneSessionManagerLiteByUserId(int32_t userId, + sptr& sceneSessionManagerLite) { - return GetSceneSessionManagerCommon(userId, sceneSessionManagerLite, true); + return GetSceneSessionManagerCommon(userId, sceneSessionManagerLite, true); } -ErrCode MockSessionManagerService::GetSceneSessionManagerByUserId( - int32_t userId, +ErrCode MockSessionManagerService::GetSceneSessionManagerByUserId(int32_t userId, sptr& sceneSessionManager) { - return GetSceneSessionManagerCommon(userId, sceneSessionManager, false); + return GetSceneSessionManagerCommon(userId, sceneSessionManager, false); } ErrCode MockSessionManagerService::RecoverSCBSnapshotSkipByUserId(int32_t userId) -- Gitee From bc0a762b28af3f68bdb2a88f358c9a6d094f7398 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Thu, 14 Aug 2025 19:36:17 +0800 Subject: [PATCH 12/38] feature: multi screen multi user Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/include/mock_session_manager_service.h | 3 ++- wmserver/src/mock_session_manager_service.cpp | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 86a3388f21..ded8b5254f 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -68,7 +68,6 @@ public: ErrCode SetSnapshotSkipByIdNamesMap(const std::unordered_map>& userIdAndBunldeNames) override; - ErrCode GetSceneSessionManagerLiteByUserId(int32_t userId, sptr& sceneSessionManagerLite) override; ErrCode GetSceneSessionManagerByUserId(int32_t userId, @@ -112,6 +111,8 @@ private: void ShowAceDumpHelp(std::string& dumpInfo); void ShowIllegalArgsInfo(std::string& dumpInfo); + ErrCode GetSceneSessionManagerCommon(int32_t userId, sptr& result, bool isLite); + /* * Window Snapshot */ diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 3a56dbfbbd..2b5837aa3d 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -291,7 +291,8 @@ ErrCode MockSessionManagerService::GetSessionManagerService(sptr& return ERR_OK; } -ErrCode MockSessionManagerService::GetSessionManagerServiceByUserId(int32_t userId, sptr& sessionManagerService) +ErrCode MockSessionManagerService::GetSessionManagerServiceByUserId(int32_t userId, + sptr& sessionManagerService) { int32_t clientUserId = GetUserIdByCallingUid(); if (clientUserId <= INVALID_USER_ID) { @@ -934,8 +935,8 @@ sptr MockSessionManagerService::GetSceneSessionManagerByUserId(in } ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( - int32_t userId, - sptr& result, + int32_t userId, + sptr& result, bool isLite) { int32_t clientUserId = GetUserIdByCallingUid(); @@ -976,7 +977,7 @@ ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( } ErrCode MockSessionManagerService::GetSceneSessionManagerLiteByUserId(int32_t userId, - sptr& sceneSessionManagerLite) + sptr& sceneSessionManagerLite) { return GetSceneSessionManagerCommon(userId, sceneSessionManagerLite, true); } -- Gitee From ba89e4e4f90e0e565de23a866b98a4c68279254a Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 25 Aug 2025 10:29:54 +0800 Subject: [PATCH 13/38] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 2b5837aa3d..584152bda4 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -242,7 +242,6 @@ bool MockSessionManagerService::SetSessionManagerService(const sptr lock(wmsConnectionStatusLock_); if (wmsConnectionStatusMap_.find(defaultWMSUserId_) != wmsConnectionStatusMap_.end()) { - //TODO 这里回调只能返回默认scb的sessionManagerService isWMSConnected = wmsConnectionStatusMap_[defaultWMSUserId_]; } } if (smsListener && isWMSConnected) { - //TODO 这里回调只能返回默认scb的sessionManagerService auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -440,7 +436,6 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr lock(wmsConnectionStatusLock_); @@ -498,7 +493,6 @@ void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId, } } -// 下面三个函数是recover相关的,会通知SYSTEM_USERID和userId, scb ts侧会调用过来。 ErrCode MockSessionManagerService::NotifySceneBoardAvailable() { if (!SessionPermission::IsSystemCalling()) { @@ -705,7 +699,6 @@ int MockSessionManagerService::DumpSessionInfo(const std::vector& a if (args.empty()) { return -1; // WMError::WM_ERROR_INVALID_PARAM; } - // TODO 这里现在只能获取默认屏幕用户的dump信息 auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { WLOGFE("sessionManagerService is nullptr"); @@ -798,7 +791,6 @@ bool MockSessionManagerService::SMSDeathRecipient::IsSceneBoardTestMode() void MockSessionManagerService::GetProcessSurfaceNodeIdByPersistentId(const int32_t pid, const std::vector& windowIdList, std::vector& surfaceNodeIds) { - //TODO 这里现在只支持默认屏幕用户的 auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { WLOGFE("sessionManagerService is nullptr"); @@ -833,7 +825,6 @@ void MockSessionManagerService::GetProcessSurfaceNodeIdByPersistentId(const int3 void MockSessionManagerService::AddSkipSelfWhenShowOnVirtualScreenList(const std::vector& persistentIds) { - //TODO 这里现在只支持默认屏幕用户的 auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerService is nullptr"); @@ -859,7 +850,6 @@ void MockSessionManagerService::AddSkipSelfWhenShowOnVirtualScreenList(const std void MockSessionManagerService::RemoveSkipSelfWhenShowOnVirtualScreenList(const std::vector& persistentIds) { - //TODO 这里现在只支持默认屏幕用户的 auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerService is nullptr"); @@ -890,7 +880,6 @@ void MockSessionManagerService::SetScreenPrivacyWindowTagSwitch( TLOGI(WmsLogTag::WMS_ATTRIBUTE, "PrivacyWindowTags is empty"); return; } - //TODO 这里现在只支持默认屏幕用户的 这个方法还有个screenId auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_ATTRIBUTE, "sessionManagerService is nullptr"); -- Gitee From 76ecafda2adc22792b225cf86d1a560e0c887cff Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Mon, 25 Aug 2025 21:34:02 +0800 Subject: [PATCH 14/38] recover notify fixed Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../include/mock_session_manager_service.h | 2 - wmserver/src/mock_session_manager_service.cpp | 54 ++++++++----------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index ded8b5254f..7c33a41967 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -133,8 +133,6 @@ private: */ int32_t defaultWMSUserId_; int32_t defaultScreenId_; - std::mutex screenId2UserIdMapLock_; - std::map screenId2UserIdMap_; std::shared_mutex smsDeathRecipientMapLock_; std::map> smsDeathRecipientMap_; std::shared_mutex sessionManagerServiceMapLock_; diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 584152bda4..a5501dea54 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -127,8 +127,7 @@ void MockSessionManagerService::SMSDeathRecipient::SetScreenId(int32_t screenId) } MockSessionManagerService::MockSessionManagerService() - : SystemAbility(WINDOW_MANAGER_SERVICE_ID, true), defaultWMSUserId_(INVALID_USER_ID), - defaultScreenId_(DEFAULT_SCREEN_ID) + : SystemAbility(WINDOW_MANAGER_SERVICE_ID, true), defaultWMSUserId_(INVALID_USER_ID) { defaultScreenId_ = DisplayManager::GetInstance().GetDefaultDisplayId(); TLOGI(WmsLogTag::WMS_MULTI_USER, "MockSessionManagerService initialized. Default screenId: %{public}d", @@ -294,6 +293,8 @@ ErrCode MockSessionManagerService::GetSessionManagerServiceByUserId(int32_t user sptr& sessionManagerService) { int32_t clientUserId = GetUserIdByCallingUid(); + TLOGI(WmsLogTag::WMS_MULTI_USER, "GetSessionManagerServiceByUserId, userId: %{public}d, clientUserId: %{public}d", + userId, clientUserId); if (clientUserId <= INVALID_USER_ID) { TLOGE(WmsLogTag::WMS_MULTI_USER, "userId is illegal: %{public}d", clientUserId); return ERR_INVALID_VALUE; @@ -506,30 +507,26 @@ ErrCode MockSessionManagerService::NotifySceneBoardAvailable() } TLOGI(WmsLogTag::WMS_RECOVER, "scene board is available with userId=%{public}d", userId); - NotifySceneBoardAvailableToLiteClient(SYSTEM_USERID); - NotifySceneBoardAvailableToLiteClient(userId); + NotifySceneBoardAvailableToLiteClient(userId, true); + NotifySceneBoardAvailableToLiteClient(userId, false); - NotifySceneBoardAvailableToClient(SYSTEM_USERID); - NotifySceneBoardAvailableToClient(userId); + NotifySceneBoardAvailableToClient(userId, true); + NotifySceneBoardAvailableToClient(userId, false); return ERR_OK; } -void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId) -{ +void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId, bool notifySystemUserIdClient) +{ + int32_t listenerUserId = notifySystemUserIdClient ? SYSTEM_USERID : userId; std::shared_lock lock(smsRecoverListenerLock_); std::map>* smsRecoverListenerMap = - GetSMSRecoverListenerMap(userId); + GetSMSRecoverListenerMap(listenerUserId); if (!smsRecoverListenerMap) { TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); return; } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, listenerUserId, static_cast(smsRecoverListenerMap->size())); - if (userId == SYSTEM_USERID) { - TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", - defaultWMSUserId_); - userId = defaultWMSUserId_; - } auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -543,25 +540,21 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId } } -void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t userId) +void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t userId, bool notifySystemUserIdClient) { + int32_t listenerUserId = notifySystemUserIdClient ? SYSTEM_USERID : userId; std::shared_lock lock(smsLiteRecoverListenerLock_); std::map>* smsLiteRecoverListenerMap = - GetSMSLiteRecoverListenerMap(userId); + GetSMSLiteRecoverListenerMap(listenerUserId); if (!smsLiteRecoverListenerMap) { return; } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, listenerUserId, static_cast(smsLiteRecoverListenerMap->size())); - if (userId == SYSTEM_USERID) { - TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", - defaultWMSUserId_); - userId = defaultWMSUserId_; - } auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; + return; } for (auto& iter : *smsLiteRecoverListenerMap) { if (iter.second != nullptr) { @@ -580,10 +573,6 @@ void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t scree if (screenId == defaultScreenId_) { defaultWMSUserId_ = userId; } - { - std::lock_guard lock(screenId2UserIdMapLock_); - screenId2UserIdMap_[screenId] = userId; - } auto smsDeathRecipient = GetSMSDeathRecipientByUserId(userId); if (smsDeathRecipient != nullptr) { smsDeathRecipient->SetScreenId(screenId); @@ -940,14 +929,14 @@ ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { - WLOGFE("sessionManagerService is nullptr"); + TLOGE(WmsLogTag::WMS_MULTI_USER, "sessionManagerService is nullptr, userId: %{public}d", userId); return ERR_INVALID_VALUE; } sptr sessionManagerServiceProxy = iface_cast(sessionManagerService); if (sessionManagerServiceProxy == nullptr) { - WLOGFE("sessionManagerServiceProxy is nullptr"); + TLOGE(WmsLogTag::WMS_MULTI_USER, "sessionManagerServiceProxy is nullptr, userId: %{public}d", userId); return ERR_DEAD_OBJECT; } @@ -958,8 +947,9 @@ ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( } if (result == nullptr) { - WLOGFW("Get scene session manager proxy failed, scene session manager service %s is null", - isLite ? "(lite)" : ""); + TLOGE(WmsLogTag::WMS_MULTI_USER, "Get scene session manager proxy failed, + scene session manager service is null, userId: %{public}d, isLite: %{public}d", + userId, isLite); return ERR_DEAD_OBJECT; } return ERR_OK; -- Gitee From b7290c5036daa40b8200feb11af25d1035594d62 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Tue, 26 Aug 2025 21:23:23 +0800 Subject: [PATCH 15/38] notify fix Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/IMockSessionManagerInterface.idl | 8 +- .../include/mock_session_manager_service.h | 21 +- wmserver/src/mock_session_manager_service.cpp | 356 +++++++++++++----- 3 files changed, 280 insertions(+), 105 deletions(-) diff --git a/wmserver/IMockSessionManagerInterface.idl b/wmserver/IMockSessionManagerInterface.idl index d034e0451d..8d23725731 100644 --- a/wmserver/IMockSessionManagerInterface.idl +++ b/wmserver/IMockSessionManagerInterface.idl @@ -21,10 +21,10 @@ interface OHOS.Rosen.IMockSessionManagerInterface { void GetSessionManagerServiceByUserId([in] int userId, [out] IRemoteObject sessionManageService); void GetScreenSessionManagerLite([out] IRemoteObject screenSessionManagerLite); [oneway] void NotifySceneBoardAvailable(); - void RegisterSMSRecoverListener([in] IRemoteObject listener); - void UnregisterSMSRecoverListener(); - void RegisterSMSLiteRecoverListener([in] IRemoteObject listener); - void UnregisterSMSLiteRecoverListener(); + void RegisterSMSRecoverListener([in] IRemoteObject listener, [in] int userId); + void UnregisterSMSRecoverListener([in] int userId); + void RegisterSMSLiteRecoverListener([in] IRemoteObject listener, [in] int userId); + void UnregisterSMSLiteRecoverListener([in] int userId); void SetSnapshotSkipByUserIdAndBundleNames([in] int userId, [in] String[] bundleNameList); void SetSnapshotSkipByIdNamesMap([in] Map userIdAndBundleNames); void GetSceneSessionManagerLiteByUserId([in] int userId, [out] IRemoteObject sceneSessionManagerLite); diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 7c33a41967..8cb93089b8 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -53,12 +53,12 @@ public: * Window Recover */ ErrCode NotifySceneBoardAvailable() override; - ErrCode RegisterSMSRecoverListener(const sptr& listener) override; - ErrCode UnregisterSMSRecoverListener() override; - void UnregisterSMSRecoverListener(int32_t userId, int32_t pid); - ErrCode RegisterSMSLiteRecoverListener(const sptr& listener) override; - ErrCode UnregisterSMSLiteRecoverListener() override; - void UnregisterSMSLiteRecoverListener(int32_t userId, int32_t pid); + ErrCode RegisterSMSRecoverListener(const sptr& listener, int32_t userId) override; + ErrCode UnregisterSMSRecoverListener(int32_t userId) override; + void UnregisterSMSRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid); + ErrCode RegisterSMSLiteRecoverListener(const sptr& listener, int32_t userId) override; + ErrCode UnregisterSMSLiteRecoverListener(int32_t userId) override; + void UnregisterSMSLiteRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid); /* * Window Snapshot @@ -99,7 +99,9 @@ private: void RemoveSessionManagerServiceByUserId(int32_t userId); bool RegisterMockSessionManagerService(); std::map>* GetSMSRecoverListenerMap(int32_t userId); + std::map>* GetSMSRecoverListenerMapU0(int32_t displayId); std::map>* GetSMSLiteRecoverListenerMap(int32_t userId); + std::map>* GetSMSLiteRecoverListenerMapU0(int32_t displayId); void NotifySceneBoardAvailableToClient(int32_t userId); void NotifySceneBoardAvailableToLiteClient(int32_t userId); void NotifyWMSConnectionChanged(int32_t wmsUserId, int32_t screenId, bool isConnected); @@ -133,6 +135,8 @@ private: */ int32_t defaultWMSUserId_; int32_t defaultScreenId_; + std::mutex userId2ScreenIdMapLock_; + std::map userId2ScreenIdMap_; std::shared_mutex smsDeathRecipientMapLock_; std::map> smsDeathRecipientMap_; std::shared_mutex sessionManagerServiceMapLock_; @@ -148,6 +152,11 @@ private: std::shared_mutex smsLiteRecoverListenerLock_; std::map>> smsLiteRecoverListenerMap_; + std::shared_mutex smsRecoverListenerLockU0_; + std::map>> smsRecoverListenerMapU0_; + std::shared_mutex smsLiteRecoverListenerLockU0_; + std::map>> smsLiteRecoverListenerMapU0_; + /* * Window Snapshot */ diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index a5501dea54..b308830f78 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -76,22 +76,23 @@ inline int32_t GetUserIdByCallingUid() class ClientListenerDeathRecipient : public IRemoteObject::DeathRecipient { public: - explicit ClientListenerDeathRecipient(int32_t userId, int32_t pid, bool isLite) - : userId_(userId), pid_(pid), isLite_(isLite) + explicit ClientListenerDeathRecipient(int32_t userId, int32_t displayId, int32_t pid, bool isLite) + : userId_(userId), displayId_(displayId), pid_(pid), isLite_(isLite) {} void OnRemoteDied(const wptr& wptrDeath) override { TLOGD(WmsLogTag::WMS_RECOVER, "Client died, pid = %{public}d, isLite = %{public}d", pid_, isLite_); if (isLite_) { - MockSessionManagerService::GetInstance().UnregisterSMSLiteRecoverListener(userId_, pid_); + MockSessionManagerService::GetInstance().UnregisterSMSLiteRecoverListener(userId_, displayId_, pid_); } else { - MockSessionManagerService::GetInstance().UnregisterSMSRecoverListener(userId_, pid_); + MockSessionManagerService::GetInstance().UnregisterSMSRecoverListener(userId_, displayId_, pid_); } } private: int32_t userId_; + int32_t displayId_; int32_t pid_; bool isLite_; }; @@ -330,7 +331,7 @@ void MockSessionManagerService::RemoveSessionManagerServiceByUserId(int32_t user } } -ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener) +ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener, int32_t userId) { if (listener == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "listener is nullptr"); @@ -339,18 +340,36 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, pid, false); + sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, false); listener->AddDeathRecipient(clientDeathListener); sptr smsListener; { - std::unique_lock lock(smsRecoverListenerLock_); smsListener = iface_cast(listener); - smsRecoverListenerMap_[clientUserId][pid] = smsListener; + if (clientUserId == SYSTEM_USERID) { + std::unique_lock lock(smsRevocerListenerLockU0_); + smsRecoverListenerMapU0_[displayId][pid] = smsListener; + } else { + std::unique_lock lock(smsRecoverListenerLock_); + smsRecoverListenerMap_[clientUserId][pid] = smsListener; + } } if (clientUserId != SYSTEM_USERID) { return ERR_WOULD_BLOCK; @@ -384,55 +403,112 @@ std::map>* MockSessionManag return nullptr; } -ErrCode MockSessionManagerService::UnregisterSMSRecoverListener() +std::map>* MockSessionManagerService::GetSMSRecoverListenerMapU0( + int32_t displayId) +{ + auto iter = smsRecoverListenerMapU0_.find(displayId); + if (iter != smsRecoverListenerMapU0_.end()) { + return &iter->second; + } + return nullptr; +} + +ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) { int32_t clientUserId = GetUserIdByCallingUid(); if (clientUserId <= INVALID_USER_ID) { TLOGE(WmsLogTag::WMS_RECOVER, "userId is illegal: %{public}d", clientUserId); return ERR_INVALID_VALUE; } + + DisplayId displayId = DISPLAY_ID_INVALID; + if (clientUserId == SYSTEM_USERID) { + if (userId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); + return ERR_INVALID_VALUE; + } + ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); + if (err != ERR_OK) { + TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); + return ERR_INVALID_VALUE; + } + } int32_t pid = IPCSkeleton::GetCallingRealPid(); - TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, pid = %{public}d", clientUserId, pid); - UnregisterSMSRecoverListener(clientUserId, pid); + TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); + UnregisterSMSRecoverListener(clientUserId, displayId, pid); return ERR_OK; } -void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId, int32_t pid) +void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid) { - TLOGD(WmsLogTag::WMS_RECOVER, "userId = %{public}d, pid = %{public}d", userId, pid); - std::unique_lock lock(smsRecoverListenerLock_); - std::map>* smsRecoverListenerMap = - GetSMSRecoverListenerMap(userId); - if (!smsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); - return; - } - auto iter = smsRecoverListenerMap->find(pid); - if (iter != smsRecoverListenerMap->end()) { - smsRecoverListenerMap->erase(iter); + TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); + if (clientUserId == SYSTEM_USERID) { + std::unique_lock lock(smsRecoverListenerLockU0_); + std::map>* smsRecoverListenerMapU0 = + GetSMSRecoverListenerMapU0(displayId); + if (!smsRecoverListenerMapU0) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMapU0 is null"); + return; + } + auto iter = smsRecoverListenerMapU0->find(pid); + if (iter != smsRecoverListenerMapU0->end()) { + smsRecoverListenerMapU0->erase(iter); + } + } else { + std::unique_lock lock(smsRecoverListenerLock_); + std::map>* smsRecoverListenerMap = + GetSMSRecoverListenerMap(clientUserId); + if (!smsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); + return; + } + auto iter = smsRecoverListenerMap->find(pid); + if (iter != smsRecoverListenerMap->end()) { + smsRecoverListenerMap->erase(iter); + } } } -ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr& listener) +ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr& listener, int32_t userId) { if (listener == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "Lite listener is nullptr"); return ERR_INVALID_VALUE; } + int32_t clientUserId = GetUserIdByCallingUid(); if (clientUserId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "userId is illegal: %{public}d", clientUserId); + TLOGE(WmsLogTag::WMS_RECOVER, "clientUserId is illegal: %{public}d", clientUserId); return ERR_INVALID_VALUE; } + + DisplayId displayId = DISPLAY_ID_INVALID; + if (clientUserId == SYSTEM_USERID) { + if (userId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); + return ERR_INVALID_VALUE; + } + ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); + if (err != ERR_OK) { + TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); + return ERR_INVALID_VALUE; + } + } + int32_t pid = IPCSkeleton::GetCallingRealPid(); TLOGI(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, pid = %{public}d", clientUserId, pid); - sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, pid, true); + sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, true); listener->AddDeathRecipient(clientDeathListener); sptr smsListener; { - std::unique_lock lock(smsLiteRecoverListenerLock_); smsListener = iface_cast(listener); - smsLiteRecoverListenerMap_[clientUserId][pid] = smsListener; + if (clientUserId == SYSTEM_USERID) { + std::unique_lock lock(smsLiteRecoverListenerLockU0_); + smsLiteRecoverListenerMapU0_[displayId][pid] = smsListener; + } else { + std::unique_lock lock(smsLiteRecoverListenerLock_); + smsLiteRecoverListenerMap_[clientUserId][pid] = smsListener; + } } if (clientUserId != SYSTEM_USERID) { return ERR_WOULD_BLOCK; @@ -466,31 +542,69 @@ std::map>* MockSessionManag return nullptr; } -ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener() +std::map>* MockSessionManagerService::GetSMSLiteRecoverListenerMapU0( + int32_t displayId) +{ + auto iter = smsLiteRecoverListenerMapU0_.find(displayId); + if (iter != smsLiteRecoverListenerMapU0_.end()) { + return &iter->second; + } + return nullptr; +} + +ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId) { int32_t clientUserId = GetUserIdByCallingUid(); if (clientUserId <= INVALID_USER_ID) { TLOGE(WmsLogTag::WMS_RECOVER, "userId is illegal: %{public}d", clientUserId); return ERR_INVALID_VALUE; } + + DisplayId displayId = DISPLAY_ID_INVALID; + if (clientUserId == SYSTEM_USERID) { + if (userId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); + return ERR_INVALID_VALUE; + } + ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); + if (err != ERR_OK) { + TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); + return ERR_INVALID_VALUE; + } + } + int32_t pid = IPCSkeleton::GetCallingRealPid(); - TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, pid = %{public}d", clientUserId, pid); - UnregisterSMSLiteRecoverListener(clientUserId, pid); + TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); + UnregisterSMSLiteRecoverListener(clientUserId, displayId, pid); return ERR_OK; } -void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId, int32_t pid) +void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid) { - TLOGD(WmsLogTag::WMS_RECOVER, "userId = %{public}d, pid = %{public}d", userId, pid); - std::unique_lock lock(smsLiteRecoverListenerLock_); - std::map>* smsLiteRecoverListenerMap = - GetSMSLiteRecoverListenerMap(userId); - if (!smsLiteRecoverListenerMap) { - return; - } - auto iter = smsLiteRecoverListenerMap->find(pid); - if (iter != smsLiteRecoverListenerMap->end()) { - smsLiteRecoverListenerMap->erase(iter); + TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); + if (clientUserId == SYSTEM_USERID) { + std::unique_lock lock(smsLiteRecoverListenerLockU0_); + std::map>* smsLiteRecoverListenerMapU0 = + GetSMSLiteRecoverListenerMapU0(displayId); + if (!smsLiteRecoverListenerMapU0) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsLiteRecoverListenerMapU0 is null"); + return; + } + auto iter = smsLiteRecoverListenerMapU0->find(pid); + if (iter != smsLiteRecoverListenerMapU0->end()) { + smsLiteRecoverListenerMapU0->erase(iter); + } + } else { + std::unique_lock lock(smsLiteRecoverListenerLock_); + std::map>* smsLiteRecoverListenerMap = + GetSMSLiteRecoverListenerMap(clientUserId); + if (!smsLiteRecoverListenerMap) { + return; + } + auto iter = smsLiteRecoverListenerMap->find(pid); + if (iter != smsLiteRecoverListenerMap->end()) { + smsLiteRecoverListenerMap->erase(iter); + } } } @@ -517,51 +631,99 @@ ErrCode MockSessionManagerService::NotifySceneBoardAvailable() void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId, bool notifySystemUserIdClient) { - int32_t listenerUserId = notifySystemUserIdClient ? SYSTEM_USERID : userId; - std::shared_lock lock(smsRecoverListenerLock_); - std::map>* smsRecoverListenerMap = - GetSMSRecoverListenerMap(listenerUserId); - if (!smsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); - return; - } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, listenerUserId, - static_cast(smsRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; - } - for (auto& iter : *smsRecoverListenerMap) { - if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); - iter.second->OnSessionManagerServiceRecover(sessionManagerService); + if (notifySystemUserIdClient) { + std::lock_guard lock(userId2ScreenIdMapLock_); + int32_t displayId = userId2ScreenIdMap_[userId]; + std::shared_lock lock(smsRecoverListenerLockU0_); + std::map>* smsRecoverListenerMapU0 = + GetSMSRecoverListenerMapU0(displayId); + if (!smsRecoverListenerMapU0) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMapU0 is null"); + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, + static_cast(smsRecoverListenerMapU0->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *smsRecoverListenerMapU0) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); + } + } + } else { + std::shared_lock lock(smsRecoverListenerLock_); + std::map>* smsRecoverListenerMap = + GetSMSRecoverListenerMap(userId); + if (!smsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, + static_cast(smsRecoverListenerMap->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *smsRecoverListenerMap) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); + } } } } void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t userId, bool notifySystemUserIdClient) -{ - int32_t listenerUserId = notifySystemUserIdClient ? SYSTEM_USERID : userId; - std::shared_lock lock(smsLiteRecoverListenerLock_); - std::map>* smsLiteRecoverListenerMap = - GetSMSLiteRecoverListenerMap(listenerUserId); - if (!smsLiteRecoverListenerMap) { - return; - } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, listenerUserId, - static_cast(smsLiteRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; - } - for (auto& iter : *smsLiteRecoverListenerMap) { - if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, - "Call OnSessionManagerServiceRecover Lite pid = %{public}d, ref count = %{public}" PRId32, iter.first, - iter.second->GetSptrRefCount()); - iter.second->OnSessionManagerServiceRecover(sessionManagerService); +{ + if (notifySystemUserIdClient) { + std::lock_guard lock(userId2ScreenIdMapLock_); + int32_t displayId = userId2ScreenIdMap_[userId]; + std::shared_lock lock(smsLiteRecoverListenerLockU0_); + std::map>* smsLiteRecoverListenerMapU0 = + GetSMSRecoverListenerMapU0(displayId); + if (!smsLiteRecoverListenerMapU0) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMapU0 is null"); + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, + static_cast(smsLiteRecoverListenerMapU0->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *smsLiteRecoverListenerMapU0) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); + } + } + } else { + std::shared_lock lock(smsLiteRecoverListenerLock_); + std::map>* smsLiteRecoverListenerMap = + GetSMSLiteRecoverListenerMap(userId); + if (!smsLiteRecoverListenerMap) { + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, + static_cast(smsLiteRecoverListenerMap->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *smsLiteRecoverListenerMap) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, + "Call OnSessionManagerServiceRecover Lite pid = %{public}d, ref count = %{public}" PRId32, iter.first, + iter.second->GetSptrRefCount()); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); + } } } } @@ -573,6 +735,10 @@ void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t scree if (screenId == defaultScreenId_) { defaultWMSUserId_ = userId; } + { + std::lock_guard lock(userId2ScreenIdMapLock_); + userId2ScreenIdMap_[userId] = screenId; + } auto smsDeathRecipient = GetSMSDeathRecipientByUserId(userId); if (smsDeathRecipient != nullptr) { smsDeathRecipient->SetScreenId(screenId); @@ -598,22 +764,22 @@ void MockSessionManagerService::NotifyWMSConnectionChanged(int32_t wmsUserId, in void MockSessionManagerService::NotifyWMSConnectionChangedToClient( int32_t wmsUserId, int32_t screenId, bool isConnected) { - std::shared_lock lock(smsRecoverListenerLock_); - std::map>* smsRecoverListenerMap = - GetSMSRecoverListenerMap(SYSTEM_USERID); - if (!smsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_MULTI_USER, "smsRecoverListenerMap is null"); + std::shared_lock lock(smsRecoverListenerLockU0_); + std::map>* smsRecoverListenerMapU0 = + GetSMSRecoverListenerMapU0(screenId); + if (!smsRecoverListenerMapU0) { + TLOGW(WmsLogTag::WMS_MULTI_USER, "smsRecoverListenerMapU0 is null"); return; } TLOGD(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", - wmsUserId, isConnected, smsRecoverListenerMap->size()); + wmsUserId, isConnected, smsRecoverListenerMapU0->size()); auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; } - for (auto& iter : *smsRecoverListenerMap) { + for (auto& iter : *smsRecoverListenerMapU0) { if (iter.second != nullptr) { TLOGD(WmsLogTag::WMS_MULTI_USER, "Call OnWMSConnectionChanged pid = %{public}d", iter.first); iter.second->OnWMSConnectionChanged(wmsUserId, screenId, isConnected, sessionManagerService); @@ -624,10 +790,10 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToClient( void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( int32_t wmsUserId, int32_t screenId, bool isConnected) { - std::shared_lock lock(smsLiteRecoverListenerLock_); - std::map>* smsLiteRecoverListenerMap = - GetSMSLiteRecoverListenerMap(SYSTEM_USERID); - if (!smsLiteRecoverListenerMap) { + std::shared_lock lock(smsLiteRecoverListenerLockU0_); + std::map>* smsLiteRecoverListenerMapU0 = + GetSMSLiteRecoverListenerMapU0(screenId); + if (!smsLiteRecoverListenerMapU0) { return; } TLOGD(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d", wmsUserId, isConnected); @@ -636,7 +802,7 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; } - for (auto& iter : *smsLiteRecoverListenerMap) { + for (auto& iter : *smsLiteRecoverListenerMapU0) { if (iter.second != nullptr) { TLOGD(WmsLogTag::WMS_MULTI_USER, "Call OnWMSConnectionChanged Lite pid = %{public}d, ref count = %{public}d", -- Gitee From 10053fe5040b4360af419aadf4686746097b1112 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 09:46:07 +0800 Subject: [PATCH 16/38] notify fix part2 Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../session_manager/src/session_manager.cpp | 6 +- .../src/session_manager_lite.cpp | 6 +- wmserver/BUILD.gn | 1 + .../include/mock_session_manager_service.h | 14 +- wmserver/src/mock_session_manager_service.cpp | 169 ++++++++++-------- 5 files changed, 108 insertions(+), 88 deletions(-) diff --git a/window_scene/session_manager/src/session_manager.cpp b/window_scene/session_manager/src/session_manager.cpp index 5c96e610ce..c0c3caab99 100644 --- a/window_scene/session_manager/src/session_manager.cpp +++ b/window_scene/session_manager/src/session_manager.cpp @@ -252,7 +252,8 @@ void SessionManager::RegisterSMSRecoverListener() TLOGD(WmsLogTag::WMS_RECOVER, "Register recover listener"); smsRecoverListener_ = sptr::MakeSptr(); std::string identity = IPCSkeleton::ResetCallingIdentity(); - mockSessionManagerServiceProxy_->RegisterSMSRecoverListener(smsRecoverListener_); + TLOGD(WmsLogTag::WMS_RECOVER, "Register recover listener, userId_: %{public}d", userId_); + mockSessionManagerServiceProxy_->RegisterSMSRecoverListener(smsRecoverListener_, userId_); IPCSkeleton::SetCallingIdentity(identity); } } @@ -262,7 +263,8 @@ void SessionManager::UnregisterSMSRecoverListener() std::lock_guard lock(mutex_); isRecoverListenerRegistered_ = false; if (mockSessionManagerServiceProxy_) { - mockSessionManagerServiceProxy_->UnregisterSMSRecoverListener(); + TLOGD(WmsLogTag::WMS_RECOVER, "UnRegister recover listener, userId_: %{public}d", userId_); + mockSessionManagerServiceProxy_->UnregisterSMSRecoverListener(userId_); } } diff --git a/window_scene/session_manager/src/session_manager_lite.cpp b/window_scene/session_manager/src/session_manager_lite.cpp index 1fa954a672..6ee6fa0210 100644 --- a/window_scene/session_manager/src/session_manager_lite.cpp +++ b/window_scene/session_manager/src/session_manager_lite.cpp @@ -472,7 +472,8 @@ void SessionManagerLite::RegisterSMSRecoverListener() TLOGD(WmsLogTag::WMS_RECOVER, "Register recover listener"); smsRecoverListener_ = sptr::MakeSptr(); std::string identity = IPCSkeleton::ResetCallingIdentity(); - mockSessionManagerServiceProxy_->RegisterSMSLiteRecoverListener(smsRecoverListener_); + TLOGD(WmsLogTag::WMS_RECOVER, "Register recover listener, userId_: %{public}d", userId_); + mockSessionManagerServiceProxy_->RegisterSMSLiteRecoverListener(smsRecoverListener_, userId_); IPCSkeleton::SetCallingIdentity(identity); } } @@ -482,7 +483,8 @@ void SessionManagerLite::UnregisterSMSRecoverListener() std::lock_guard lock(mutex_); recoverListenerRegistered_ = false; if (mockSessionManagerServiceProxy_) { - mockSessionManagerServiceProxy_->UnregisterSMSLiteRecoverListener(); + TLOGD(WmsLogTag::WMS_RECOVER, "UnRegister recover listener, userId_: %{public}d", userId_); + mockSessionManagerServiceProxy_->UnregisterSMSLiteRecoverListener(userId_); } } diff --git a/wmserver/BUILD.gn b/wmserver/BUILD.gn index 3b521f11a8..b49913c1e8 100644 --- a/wmserver/BUILD.gn +++ b/wmserver/BUILD.gn @@ -171,6 +171,7 @@ ohos_shared_library("sms") { "hilog:libhilog", "image_framework:image_native", "ipc:ipc_single", + "os_account:os_account_innerkits", "safwk:system_ability_fwk", "samgr:samgr_proxy", ] diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 8cb93089b8..d1be442f9e 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -99,9 +99,9 @@ private: void RemoveSessionManagerServiceByUserId(int32_t userId); bool RegisterMockSessionManagerService(); std::map>* GetSMSRecoverListenerMap(int32_t userId); - std::map>* GetSMSRecoverListenerMapU0(int32_t displayId); + std::map>* GetSystemAppSMSRecoverListenerMap(int32_t displayId); std::map>* GetSMSLiteRecoverListenerMap(int32_t userId); - std::map>* GetSMSLiteRecoverListenerMapU0(int32_t displayId); + std::map>* GetSystemAppSMSLiteRecoverListenerMap(int32_t displayId); void NotifySceneBoardAvailableToClient(int32_t userId); void NotifySceneBoardAvailableToLiteClient(int32_t userId); void NotifyWMSConnectionChanged(int32_t wmsUserId, int32_t screenId, bool isConnected); @@ -135,7 +135,7 @@ private: */ int32_t defaultWMSUserId_; int32_t defaultScreenId_; - std::mutex userId2ScreenIdMapLock_; + std::mutex userId2ScreenIdMapMutex_; std::map userId2ScreenIdMap_; std::shared_mutex smsDeathRecipientMapLock_; std::map> smsDeathRecipientMap_; @@ -152,10 +152,10 @@ private: std::shared_mutex smsLiteRecoverListenerLock_; std::map>> smsLiteRecoverListenerMap_; - std::shared_mutex smsRecoverListenerLockU0_; - std::map>> smsRecoverListenerMapU0_; - std::shared_mutex smsLiteRecoverListenerLockU0_; - std::map>> smsLiteRecoverListenerMapU0_; + std::shared_mutex systemAppSmsRecoverListenerLock_; + std::map>> systemAppSmsRecoverListenerMap_; + std::shared_mutex systemAppSmsLiteRecoverListenerLock_; + std::map>> systemAppSmsLiteRecoverListenerMap_; /* * Window Snapshot diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index b308830f78..40307edba8 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -30,6 +30,7 @@ #include #include +#include "os_account_manager.h" #include "window_manager_hilog.h" #include "unique_fd.h" #include "parameters.h" @@ -344,12 +345,13 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr(listener); if (clientUserId == SYSTEM_USERID) { - std::unique_lock lock(smsRevocerListenerLockU0_); - smsRecoverListenerMapU0_[displayId][pid] = smsListener; + std::unique_lock lock(systemAppSmsRecoverListenerLock_); + systemAppSmsRecoverListenerMap_[displayId][pid] = smsListener; } else { std::unique_lock lock(smsRecoverListenerLock_); smsRecoverListenerMap_[clientUserId][pid] = smsListener; @@ -377,18 +379,23 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(defaultWMSUserId_) != wmsConnectionStatusMap_.end()) { - isWMSConnected = wmsConnectionStatusMap_[defaultWMSUserId_]; + if (wmsConnectionStatusMap_.find(userId) != wmsConnectionStatusMap_.end()) { + isWMSConnected = wmsConnectionStatusMap_[userId]; } } if (smsListener && isWMSConnected) { - auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return ERR_DEAD_OBJECT; } TLOGI(WmsLogTag::WMS_RECOVER, "WMS ready,notify client"); - smsListener->OnWMSConnectionChanged(defaultWMSUserId_, defaultScreenId_, true, sessionManagerService); + int32_t screenId = DEFAULT_SCREEN_ID; + { + std::lock_guard lock(userId2ScreenIdMapMutex_); + screenId = userId2ScreenIdMap_[userId]; + } + smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); } return ERR_OK; } @@ -403,11 +410,11 @@ std::map>* MockSessionManag return nullptr; } -std::map>* MockSessionManagerService::GetSMSRecoverListenerMapU0( +std::map>* MockSessionManagerService::GetSystemAppSMSRecoverListenerMap( int32_t displayId) { - auto iter = smsRecoverListenerMapU0_.find(displayId); - if (iter != smsRecoverListenerMapU0_.end()) { + auto iter = systemAppSmsRecoverListenerMap_.find(displayId); + if (iter != systemAppSmsRecoverListenerMap_.end()) { return &iter->second; } return nullptr; @@ -421,12 +428,13 @@ ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) return ERR_INVALID_VALUE; } + if (clientUserId == SYSTEM_USERID && userId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); + return ERR_INVALID_VALUE; + } + DisplayId displayId = DISPLAY_ID_INVALID; if (clientUserId == SYSTEM_USERID) { - if (userId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); - return ERR_INVALID_VALUE; - } ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); if (err != ERR_OK) { TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); @@ -443,16 +451,16 @@ void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserI { TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); if (clientUserId == SYSTEM_USERID) { - std::unique_lock lock(smsRecoverListenerLockU0_); - std::map>* smsRecoverListenerMapU0 = - GetSMSRecoverListenerMapU0(displayId); - if (!smsRecoverListenerMapU0) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMapU0 is null"); + std::unique_lock lock(systemAppSmsRecoverListenerLock_); + std::map>* systemAppSmsRecoverListenerMap = + GetSystemAppSMSRecoverListenerMap(displayId); + if (!systemAppSmsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); return; } - auto iter = smsRecoverListenerMapU0->find(pid); - if (iter != smsRecoverListenerMapU0->end()) { - smsRecoverListenerMapU0->erase(iter); + auto iter = systemAppSmsRecoverListenerMap->find(pid); + if (iter != systemAppSmsRecoverListenerMap->end()) { + systemAppSmsRecoverListenerMap->erase(iter); } } else { std::unique_lock lock(smsRecoverListenerLock_); @@ -482,12 +490,13 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr(listener); if (clientUserId == SYSTEM_USERID) { - std::unique_lock lock(smsLiteRecoverListenerLockU0_); - smsLiteRecoverListenerMapU0_[displayId][pid] = smsListener; + std::unique_lock lock(systemAppSmsLiteRecoverListenerLock_); + systemAppSmsLiteRecoverListenerMap_[displayId][pid] = smsListener; } else { std::unique_lock lock(smsLiteRecoverListenerLock_); smsLiteRecoverListenerMap_[clientUserId][pid] = smsListener; @@ -516,18 +525,23 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(defaultWMSUserId_) != wmsConnectionStatusMap_.end()) { - isWMSConnected = wmsConnectionStatusMap_[defaultWMSUserId_]; + if (wmsConnectionStatusMap_.find(userId) != wmsConnectionStatusMap_.end()) { + isWMSConnected = wmsConnectionStatusMap_[userId]; } } if (smsListener && isWMSConnected) { - auto sessionManagerService = GetSessionManagerServiceByUserId(defaultWMSUserId_); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return ERR_DEAD_OBJECT; } + int32_t screenId = DEFAULT_SCREEN_ID; + { + std::lock_guard lock(userId2ScreenIdMapMutex_); + screenId = userId2ScreenIdMap_[userId]; + } TLOGD(WmsLogTag::WMS_MULTI_USER, "Lite wms is already connected, notify client"); - smsListener->OnWMSConnectionChanged(defaultWMSUserId_, defaultScreenId_, true, sessionManagerService); + smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); } return ERR_OK; } @@ -542,11 +556,11 @@ std::map>* MockSessionManag return nullptr; } -std::map>* MockSessionManagerService::GetSMSLiteRecoverListenerMapU0( +std::map>* MockSessionManagerService::GetSystemAppSMSLiteRecoverListenerMap( int32_t displayId) { - auto iter = smsLiteRecoverListenerMapU0_.find(displayId); - if (iter != smsLiteRecoverListenerMapU0_.end()) { + auto iter = systemAppSmsLiteRecoverListenerMap_.find(displayId); + if (iter != systemAppSmsLiteRecoverListenerMap_.end()) { return &iter->second; } return nullptr; @@ -560,12 +574,13 @@ ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t user return ERR_INVALID_VALUE; } + if (clientUserId == SYSTEM_USERID && userId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); + return ERR_INVALID_VALUE; + } + DisplayId displayId = DISPLAY_ID_INVALID; if (clientUserId == SYSTEM_USERID) { - if (userId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); - return ERR_INVALID_VALUE; - } ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); if (err != ERR_OK) { TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); @@ -583,16 +598,16 @@ void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientU { TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); if (clientUserId == SYSTEM_USERID) { - std::unique_lock lock(smsLiteRecoverListenerLockU0_); - std::map>* smsLiteRecoverListenerMapU0 = - GetSMSLiteRecoverListenerMapU0(displayId); - if (!smsLiteRecoverListenerMapU0) { + std::unique_lock lock(systemAppSmsLiteRecoverListenerLock_); + std::map>* systemAppSmsLiteRecoverListenerMap = + GetSystemAppSMSLiteRecoverListenerMap(displayId); + if (!systemAppSmsLiteRecoverListenerMap) { TLOGW(WmsLogTag::WMS_RECOVER, "smsLiteRecoverListenerMapU0 is null"); return; } - auto iter = smsLiteRecoverListenerMapU0->find(pid); - if (iter != smsLiteRecoverListenerMapU0->end()) { - smsLiteRecoverListenerMapU0->erase(iter); + auto iter = systemAppSmsLiteRecoverListenerMap->find(pid); + if (iter != systemAppSmsLiteRecoverListenerMap->end()) { + systemAppSmsLiteRecoverListenerMap->erase(iter); } } else { std::unique_lock lock(smsLiteRecoverListenerLock_); @@ -632,23 +647,23 @@ ErrCode MockSessionManagerService::NotifySceneBoardAvailable() void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId, bool notifySystemUserIdClient) { if (notifySystemUserIdClient) { - std::lock_guard lock(userId2ScreenIdMapLock_); + std::lock_guard lock(userId2ScreenIdMapMutex_); int32_t displayId = userId2ScreenIdMap_[userId]; - std::shared_lock lock(smsRecoverListenerLockU0_); - std::map>* smsRecoverListenerMapU0 = - GetSMSRecoverListenerMapU0(displayId); - if (!smsRecoverListenerMapU0) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMapU0 is null"); + std::shared_lock lock(systemAppSmsRecoverListenerLock_); + std::map>* systemAppSmsRecoverListenerMap = + GetSystemAppSMSRecoverListenerMap(displayId); + if (!systemAppSmsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); return; } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, - static_cast(smsRecoverListenerMapU0->size())); + static_cast(systemAppSmsRecoverListenerMap->size())); auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; } - for (auto& iter : *smsRecoverListenerMapU0) { + for (auto& iter : *systemAppSmsRecoverListenerMap) { if (iter.second != nullptr) { TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); iter.second->OnSessionManagerServiceRecover(sessionManagerService); @@ -681,23 +696,23 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t userId, bool notifySystemUserIdClient) { if (notifySystemUserIdClient) { - std::lock_guard lock(userId2ScreenIdMapLock_); + std::lock_guard lock(userId2ScreenIdMapMutex_); int32_t displayId = userId2ScreenIdMap_[userId]; - std::shared_lock lock(smsLiteRecoverListenerLockU0_); - std::map>* smsLiteRecoverListenerMapU0 = - GetSMSRecoverListenerMapU0(displayId); - if (!smsLiteRecoverListenerMapU0) { + std::shared_lock lock(systemAppSmsLiteRecoverListenerLock_); + std::map>* systemAppSmsLiteRecoverListenerMap = + GetSystemAppSMSRecoverListenerMap(displayId); + if (!systemAppSmsLiteRecoverListenerMap) { TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMapU0 is null"); return; } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, - static_cast(smsLiteRecoverListenerMapU0->size())); + static_cast(systemAppSmsLiteRecoverListenerMap->size())); auto sessionManagerService = GetSessionManagerServiceByUserId(userId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; } - for (auto& iter : *smsLiteRecoverListenerMapU0) { + for (auto& iter : *systemAppSmsLiteRecoverListenerMap) { if (iter.second != nullptr) { TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); iter.second->OnSessionManagerServiceRecover(sessionManagerService); @@ -736,7 +751,7 @@ void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t scree defaultWMSUserId_ = userId; } { - std::lock_guard lock(userId2ScreenIdMapLock_); + std::lock_guard lock(userId2ScreenIdMapMutex_); userId2ScreenIdMap_[userId] = screenId; } auto smsDeathRecipient = GetSMSDeathRecipientByUserId(userId); @@ -764,22 +779,22 @@ void MockSessionManagerService::NotifyWMSConnectionChanged(int32_t wmsUserId, in void MockSessionManagerService::NotifyWMSConnectionChangedToClient( int32_t wmsUserId, int32_t screenId, bool isConnected) { - std::shared_lock lock(smsRecoverListenerLockU0_); - std::map>* smsRecoverListenerMapU0 = - GetSMSRecoverListenerMapU0(screenId); - if (!smsRecoverListenerMapU0) { - TLOGW(WmsLogTag::WMS_MULTI_USER, "smsRecoverListenerMapU0 is null"); + std::shared_lock lock(systemAppSmsRecoverListenerLock_); + std::map>* systemAppSmsRecoverListenerMap = + GetSystemAppSMSRecoverListenerMap(screenId); + if (!systemAppSmsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_MULTI_USER, "systemAppSmsRecoverListenerMap is null"); return; } TLOGD(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", - wmsUserId, isConnected, smsRecoverListenerMapU0->size()); + wmsUserId, isConnected, systemAppSmsRecoverListenerMap->size()); auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; } - for (auto& iter : *smsRecoverListenerMapU0) { + for (auto& iter : *systemAppSmsRecoverListenerMap) { if (iter.second != nullptr) { TLOGD(WmsLogTag::WMS_MULTI_USER, "Call OnWMSConnectionChanged pid = %{public}d", iter.first); iter.second->OnWMSConnectionChanged(wmsUserId, screenId, isConnected, sessionManagerService); @@ -790,10 +805,10 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToClient( void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( int32_t wmsUserId, int32_t screenId, bool isConnected) { - std::shared_lock lock(smsLiteRecoverListenerLockU0_); - std::map>* smsLiteRecoverListenerMapU0 = - GetSMSLiteRecoverListenerMapU0(screenId); - if (!smsLiteRecoverListenerMapU0) { + std::shared_lock lock(systemAppSmsLiteRecoverListenerLock_); + std::map>* systemAppSmsLiteRecoverListenerMap = + GetSystemAppSMSLiteRecoverListenerMap(screenId); + if (!systemAppSmsLiteRecoverListenerMap) { return; } TLOGD(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d", wmsUserId, isConnected); @@ -802,7 +817,7 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); return; } - for (auto& iter : *smsLiteRecoverListenerMapU0) { + for (auto& iter : *systemAppSmsLiteRecoverListenerMap) { if (iter.second != nullptr) { TLOGD(WmsLogTag::WMS_MULTI_USER, "Call OnWMSConnectionChanged Lite pid = %{public}d, ref count = %{public}d", -- Gitee From c5c617612456d77369184b6075610b704f173b89 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 10:56:16 +0800 Subject: [PATCH 17/38] notify fix part3 Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../include/mock_session_manager_service.h | 2 + wmserver/src/mock_session_manager_service.cpp | 195 +++++++++--------- 2 files changed, 104 insertions(+), 93 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index d1be442f9e..029a419586 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -103,7 +103,9 @@ private: std::map>* GetSMSLiteRecoverListenerMap(int32_t userId); std::map>* GetSystemAppSMSLiteRecoverListenerMap(int32_t displayId); void NotifySceneBoardAvailableToClient(int32_t userId); + void NotifySceneBoardAvailableToSystemAppClient(int32_t userId); void NotifySceneBoardAvailableToLiteClient(int32_t userId); + void NotifySceneBoardAvailableToSystemAppLiteClient(int32_t userId); void NotifyWMSConnectionChanged(int32_t wmsUserId, int32_t screenId, bool isConnected); void NotifyWMSConnectionChangedToClient(int32_t wmsUserId, int32_t screenId, bool isConnected); void NotifyWMSConnectionChangedToLiteClient(int32_t wmsUserId, int32_t screenId, bool isConnected); diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 40307edba8..81a03d112d 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -457,7 +457,7 @@ void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserI if (!systemAppSmsRecoverListenerMap) { TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); return; - } + } auto iter = systemAppSmsRecoverListenerMap->find(pid); if (iter != systemAppSmsRecoverListenerMap->end()) { systemAppSmsRecoverListenerMap->erase(iter); @@ -602,9 +602,9 @@ void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientU std::map>* systemAppSmsLiteRecoverListenerMap = GetSystemAppSMSLiteRecoverListenerMap(displayId); if (!systemAppSmsLiteRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsLiteRecoverListenerMapU0 is null"); + TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsLiteRecoverListenerMap is null"); return; - } + } auto iter = systemAppSmsLiteRecoverListenerMap->find(pid); if (iter != systemAppSmsLiteRecoverListenerMap->end()) { systemAppSmsLiteRecoverListenerMap->erase(iter); @@ -636,109 +636,118 @@ ErrCode MockSessionManagerService::NotifySceneBoardAvailable() } TLOGI(WmsLogTag::WMS_RECOVER, "scene board is available with userId=%{public}d", userId); - NotifySceneBoardAvailableToLiteClient(userId, true); - NotifySceneBoardAvailableToLiteClient(userId, false); + NotifySceneBoardAvailableToSystemAppLiteClient(userId); + NotifySceneBoardAvailableToLiteClient(userId); - NotifySceneBoardAvailableToClient(userId, true); - NotifySceneBoardAvailableToClient(userId, false); + NotifySceneBoardAvailableToSystemAppClient(userId); + NotifySceneBoardAvailableToClient(userId); return ERR_OK; } -void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId, bool notifySystemUserIdClient) -{ - if (notifySystemUserIdClient) { +void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppClient(int32_t userId) +{ + int32_t displayId = DEFAULT_SCREEN_ID; + { std::lock_guard lock(userId2ScreenIdMapMutex_); - int32_t displayId = userId2ScreenIdMap_[userId]; - std::shared_lock lock(systemAppSmsRecoverListenerLock_); - std::map>* systemAppSmsRecoverListenerMap = - GetSystemAppSMSRecoverListenerMap(displayId); - if (!systemAppSmsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); - return; - } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, - static_cast(systemAppSmsRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; - } - for (auto& iter : *systemAppSmsRecoverListenerMap) { - if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); - iter.second->OnSessionManagerServiceRecover(sessionManagerService); - } - } - } else { - std::shared_lock lock(smsRecoverListenerLock_); - std::map>* smsRecoverListenerMap = - GetSMSRecoverListenerMap(userId); - if (!smsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); - return; - } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, - static_cast(smsRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; + displayId = userId2ScreenIdMap_[userId]; + } + std::shared_lock lock(systemAppSmsRecoverListenerLock_); + std::map>* systemAppSmsRecoverListenerMap = + GetSystemAppSMSRecoverListenerMap(displayId); + if (!systemAppSmsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, + static_cast(systemAppSmsRecoverListenerMap->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *systemAppSmsRecoverListenerMap) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); } - for (auto& iter : *smsRecoverListenerMap) { - if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); - iter.second->OnSessionManagerServiceRecover(sessionManagerService); - } + } +} + +void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId) +{ + std::shared_lock lock(smsRecoverListenerLock_); + std::map>* smsRecoverListenerMap = + GetSMSRecoverListenerMap(userId); + if (!smsRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, + static_cast(smsRecoverListenerMap->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *smsRecoverListenerMap) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); } } } -void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t userId, bool notifySystemUserIdClient) + +void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppLiteClient(int32_t userId) { - if (notifySystemUserIdClient) { + int32_t displayId = DEFAULT_SCREEN_ID; + { std::lock_guard lock(userId2ScreenIdMapMutex_); - int32_t displayId = userId2ScreenIdMap_[userId]; - std::shared_lock lock(systemAppSmsLiteRecoverListenerLock_); - std::map>* systemAppSmsLiteRecoverListenerMap = - GetSystemAppSMSRecoverListenerMap(displayId); - if (!systemAppSmsLiteRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMapU0 is null"); - return; - } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, - static_cast(systemAppSmsLiteRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; - } - for (auto& iter : *systemAppSmsLiteRecoverListenerMap) { - if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); - iter.second->OnSessionManagerServiceRecover(sessionManagerService); - } - } - } else { - std::shared_lock lock(smsLiteRecoverListenerLock_); - std::map>* smsLiteRecoverListenerMap = - GetSMSLiteRecoverListenerMap(userId); - if (!smsLiteRecoverListenerMap) { - return; - } - TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, - static_cast(smsLiteRecoverListenerMap->size())); - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return; + displayId = userId2ScreenIdMap_[userId]; + } + std::shared_lock lock(systemAppSmsLiteRecoverListenerLock_); + std::map>* systemAppSmsLiteRecoverListenerMap = + GetSystemAppSMSRecoverListenerMap(displayId); + if (!systemAppSmsLiteRecoverListenerMap) { + TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsLiteRecoverListenerMap is null"); + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, + static_cast(systemAppSmsLiteRecoverListenerMap->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *systemAppSmsLiteRecoverListenerMap) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); } - for (auto& iter : *smsLiteRecoverListenerMap) { - if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, - "Call OnSessionManagerServiceRecover Lite pid = %{public}d, ref count = %{public}" PRId32, iter.first, - iter.second->GetSptrRefCount()); - iter.second->OnSessionManagerServiceRecover(sessionManagerService); - } + } +} + +void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t userId) +{ + std::shared_lock lock(smsLiteRecoverListenerLock_); + std::map>* smsLiteRecoverListenerMap = + GetSMSLiteRecoverListenerMap(userId); + if (!smsLiteRecoverListenerMap) { + return; + } + TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, + static_cast(smsLiteRecoverListenerMap->size())); + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return; + } + for (auto& iter : *smsLiteRecoverListenerMap) { + if (iter.second != nullptr) { + TLOGI(WmsLogTag::WMS_RECOVER, + "Call OnSessionManagerServiceRecover Lite pid = %{public}d, ref count = %{public}" PRId32, iter.first, + iter.second->GetSptrRefCount()); + iter.second->OnSessionManagerServiceRecover(sessionManagerService); } } } -- Gitee From d79c45a1f284bffa1fcc139dedbe0f93f1c9974f Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 14:10:20 +0800 Subject: [PATCH 18/38] notify fix part4 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/include/mock_session_manager_service.h | 5 +++-- wmserver/src/mock_session_manager_service.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 029a419586..e228d7d953 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -19,6 +19,7 @@ #include #include +#include "dm_common.h" #include "mock_session_manager_interface_stub.h" #include "wm_single_instance.h" #include "zidl/session_manager_service_recover_interface.h" @@ -55,10 +56,10 @@ public: ErrCode NotifySceneBoardAvailable() override; ErrCode RegisterSMSRecoverListener(const sptr& listener, int32_t userId) override; ErrCode UnregisterSMSRecoverListener(int32_t userId) override; - void UnregisterSMSRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid); + void UnregisterSMSRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid); ErrCode RegisterSMSLiteRecoverListener(const sptr& listener, int32_t userId) override; ErrCode UnregisterSMSLiteRecoverListener(int32_t userId) override; - void UnregisterSMSLiteRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid); + void UnregisterSMSLiteRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid); /* * Window Snapshot diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 81a03d112d..59d8fcf050 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -447,7 +447,7 @@ ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) return ERR_OK; } -void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid) +void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); if (clientUserId == SYSTEM_USERID) { @@ -594,7 +594,7 @@ ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t user return ERR_OK; } -void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientUserId, DisplayId displayId, int32_t pid) +void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); if (clientUserId == SYSTEM_USERID) { -- Gitee From 930493cb3e3dec7bf0413efbbbbbe4a40a4bc73d Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 14:16:02 +0800 Subject: [PATCH 19/38] notify fix part5 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 59d8fcf050..62ced027bc 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -1137,9 +1137,7 @@ ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( } if (result == nullptr) { - TLOGE(WmsLogTag::WMS_MULTI_USER, "Get scene session manager proxy failed, - scene session manager service is null, userId: %{public}d, isLite: %{public}d", - userId, isLite); + TLOGE(WmsLogTag::WMS_MULTI_USER, "Get scene session manager proxy failed, scene session manager service is null, userId: %{public}d, isLite: %{public}d", userId, isLite); return ERR_DEAD_OBJECT; } return ERR_OK; -- Gitee From cfe804eb0a2873e4a4d7a3793dffce0dc4db3dc8 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 16:03:49 +0800 Subject: [PATCH 20/38] notify fix part6 Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../include/mock_session_manager_service.h | 14 +- wmserver/src/mock_session_manager_service.cpp | 127 ++++++++++-------- 2 files changed, 80 insertions(+), 61 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index e228d7d953..4a1c9f2572 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -99,10 +99,14 @@ private: sptr GetSessionManagerServiceByUserId(int32_t userId); void RemoveSessionManagerServiceByUserId(int32_t userId); bool RegisterMockSessionManagerService(); + ErrCode MockSessionManagerService::ValidateParameters(int32_t clientUserId, int32_t userId) const; + ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const; std::map>* GetSMSRecoverListenerMap(int32_t userId); - std::map>* GetSystemAppSMSRecoverListenerMap(int32_t displayId); + std::map>* GetSystemAppSMSRecoverListenerMap( + int32_t displayId); std::map>* GetSMSLiteRecoverListenerMap(int32_t userId); - std::map>* GetSystemAppSMSLiteRecoverListenerMap(int32_t displayId); + std::map>* GetSystemAppSMSLiteRecoverListenerMap( + int32_t displayId); void NotifySceneBoardAvailableToClient(int32_t userId); void NotifySceneBoardAvailableToSystemAppClient(int32_t userId); void NotifySceneBoardAvailableToLiteClient(int32_t userId); @@ -156,9 +160,11 @@ private: std::map>> smsLiteRecoverListenerMap_; std::shared_mutex systemAppSmsRecoverListenerLock_; - std::map>> systemAppSmsRecoverListenerMap_; + std::map>> + systemAppSmsRecoverListenerMap_; std::shared_mutex systemAppSmsLiteRecoverListenerLock_; - std::map>> systemAppSmsLiteRecoverListenerMap_; + std::map>> + systemAppSmsLiteRecoverListenerMap_; /* * Window Snapshot diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 62ced027bc..523373671c 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -332,14 +332,8 @@ void MockSessionManagerService::RemoveSessionManagerServiceByUserId(int32_t user } } -ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener, int32_t userId) +ErrCode MockSessionManagerService::ValidateParameters(int32_t clientUserId, int32_t userId) const { - if (listener == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "listener is nullptr"); - return ERR_INVALID_VALUE; - } - - int32_t clientUserId = GetUserIdByCallingUid(); if (clientUserId <= INVALID_USER_ID) { TLOGE(WmsLogTag::WMS_RECOVER, "clientUserId is illegal: %{public}d", clientUserId); return ERR_INVALID_VALUE; @@ -349,18 +343,45 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener, int32_t userId) +{ + if (listener == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "listener is nullptr"); + return ERR_INVALID_VALUE; + } + + int32_t clientUserId = GetUserIdByCallingUid(); + ErrCode ret = ValidateParameters(clientUserId, userId); + if (ret != ERR_OK) { + return ret; + } DisplayId displayId = DISPLAY_ID_INVALID; if (clientUserId == SYSTEM_USERID) { - ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); - if (err != ERR_OK) { - TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); - return ERR_INVALID_VALUE; + ret = GetForegroundOsAccountDisplayId(userId, displayId); + if (ret != ERR_OK) { + return ret; } } + int32_t pid = IPCSkeleton::GetCallingRealPid(); TLOGI(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, pid = %{public}d", clientUserId, pid); - sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, false); + sptr clientDeathListener = + new ClientListenerDeathRecipient(clientUserId, displayId, pid, false); listener->AddDeathRecipient(clientDeathListener); sptr smsListener; { @@ -410,8 +431,8 @@ std::map>* MockSessionManag return nullptr; } -std::map>* MockSessionManagerService::GetSystemAppSMSRecoverListenerMap( - int32_t displayId) +std::map>* + MockSessionManagerService::GetSystemAppSMSRecoverListenerMap(int32_t displayId) { auto iter = systemAppSmsRecoverListenerMap_.find(displayId); if (iter != systemAppSmsRecoverListenerMap_.end()) { @@ -423,33 +444,31 @@ std::map>* MockSessionManag ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) { int32_t clientUserId = GetUserIdByCallingUid(); - if (clientUserId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "userId is illegal: %{public}d", clientUserId); - return ERR_INVALID_VALUE; - } - if (clientUserId == SYSTEM_USERID && userId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); - return ERR_INVALID_VALUE; + ErrCode ret = ValidateParameters(clientUserId, userId); + if (ret != ERR_OK) { + return ret; } DisplayId displayId = DISPLAY_ID_INVALID; if (clientUserId == SYSTEM_USERID) { - ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); - if (err != ERR_OK) { - TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); - return ERR_INVALID_VALUE; + err = GetForegroundOsAccountDisplayId(userId, displayId); + if (ret != ERR_OK) { + return ret; } } + int32_t pid = IPCSkeleton::GetCallingRealPid(); - TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); + TLOGD(WmsLogTag::WMS_RECOVER, + "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); UnregisterSMSRecoverListener(clientUserId, displayId, pid); return ERR_OK; } void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { - TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); + TLOGD(WmsLogTag::WMS_RECOVER, + "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); if (clientUserId == SYSTEM_USERID) { std::unique_lock lock(systemAppSmsRecoverListenerLock_); std::map>* systemAppSmsRecoverListenerMap = @@ -485,28 +504,23 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, true); + sptr clientDeathListener = + new ClientListenerDeathRecipient(clientUserId, displayId, pid, true); listener->AddDeathRecipient(clientDeathListener); sptr smsListener; { @@ -556,8 +570,8 @@ std::map>* MockSessionManag return nullptr; } -std::map>* MockSessionManagerService::GetSystemAppSMSLiteRecoverListenerMap( - int32_t displayId) +std::map>* + MockSessionManagerService::GetSystemAppSMSLiteRecoverListenerMap(int32_t displayId) { auto iter = systemAppSmsLiteRecoverListenerMap_.find(displayId); if (iter != systemAppSmsLiteRecoverListenerMap_.end()) { @@ -569,34 +583,30 @@ std::map>* MockSessionManag ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId) { int32_t clientUserId = GetUserIdByCallingUid(); - if (clientUserId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "userId is illegal: %{public}d", clientUserId); - return ERR_INVALID_VALUE; - } - - if (clientUserId == SYSTEM_USERID && userId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); - return ERR_INVALID_VALUE; + ErrCode ret = ValidateParameters(clientUserId, userId); + if (ret != ERR_OK) { + return ret; } DisplayId displayId = DISPLAY_ID_INVALID; if (clientUserId == SYSTEM_USERID) { - ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); - if (err != ERR_OK) { - TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); - return ERR_INVALID_VALUE; + err = GetForegroundOsAccountDisplayId(userId, displayId); + if (ret != ERR_OK) { + return ret; } } int32_t pid = IPCSkeleton::GetCallingRealPid(); - TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); + TLOGD(WmsLogTag::WMS_RECOVER, + "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); UnregisterSMSLiteRecoverListener(clientUserId, displayId, pid); return ERR_OK; } void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { - TLOGD(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); + TLOGD(WmsLogTag::WMS_RECOVER, + "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); if (clientUserId == SYSTEM_USERID) { std::unique_lock lock(systemAppSmsLiteRecoverListenerLock_); std::map>* systemAppSmsLiteRecoverListenerMap = @@ -1137,7 +1147,10 @@ ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( } if (result == nullptr) { - TLOGE(WmsLogTag::WMS_MULTI_USER, "Get scene session manager proxy failed, scene session manager service is null, userId: %{public}d, isLite: %{public}d", userId, isLite); + TLOGE(WmsLogTag::WMS_MULTI_USER, + "Get scene session manager proxy failed, scene session manager service is null," + "userId: %{public}d, isLite: %{public}d", + userId, isLite); return ERR_DEAD_OBJECT; } return ERR_OK; -- Gitee From f7debc9c388dae35d50bb1260a35aabaabfae9c6 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 16:23:59 +0800 Subject: [PATCH 21/38] notify fix part7 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/include/mock_session_manager_service.h | 4 ++-- wmserver/src/mock_session_manager_service.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 4a1c9f2572..c44929daf9 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -99,8 +99,8 @@ private: sptr GetSessionManagerServiceByUserId(int32_t userId); void RemoveSessionManagerServiceByUserId(int32_t userId); bool RegisterMockSessionManagerService(); - ErrCode MockSessionManagerService::ValidateParameters(int32_t clientUserId, int32_t userId) const; - ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const; + ErrCode ValidateParameters(int32_t clientUserId, int32_t userId) const; + ErrCode GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const; std::map>* GetSMSRecoverListenerMap(int32_t userId); std::map>* GetSystemAppSMSRecoverListenerMap( int32_t displayId); diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 523373671c..c37611aec1 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -452,7 +452,7 @@ ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) DisplayId displayId = DISPLAY_ID_INVALID; if (clientUserId == SYSTEM_USERID) { - err = GetForegroundOsAccountDisplayId(userId, displayId); + ret = GetForegroundOsAccountDisplayId(userId, displayId); if (ret != ERR_OK) { return ret; } @@ -590,7 +590,7 @@ ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t user DisplayId displayId = DISPLAY_ID_INVALID; if (clientUserId == SYSTEM_USERID) { - err = GetForegroundOsAccountDisplayId(userId, displayId); + ret = GetForegroundOsAccountDisplayId(userId, displayId); if (ret != ERR_OK) { return ret; } -- Gitee From 0c98e40f6c8e4fbb4ad8a38e3d2a28cd2d4042c6 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 17:05:34 +0800 Subject: [PATCH 22/38] notify fix part8 Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../include/mock_session_manager_service.h | 1 + wmserver/src/mock_session_manager_service.cpp | 69 +++++++------------ 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index c44929daf9..2082f7b138 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -101,6 +101,7 @@ private: bool RegisterMockSessionManagerService(); ErrCode ValidateParameters(int32_t clientUserId, int32_t userId) const; ErrCode GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const; + void NotifyWMSConnectionStatus(int32_t userId, const sptr& smsListener); std::map>* GetSMSRecoverListenerMap(int32_t userId); std::map>* GetSystemAppSMSRecoverListenerMap( int32_t displayId); diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index c37611aec1..e40f269dd5 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -357,6 +357,30 @@ ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userI return err; } +void MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, const sptr& smsListener) { + bool isWMSConnected = false; + { + std::lock_guard lock(wmsConnectionStatusLock_); + if (wmsConnectionStatusMap_.find(userId) != wmsConnectionStatusMap_.end()) { + isWMSConnected = wmsConnectionStatusMap_[userId]; + } + } + if (smsListener && isWMSConnected) { + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return ERR_DEAD_OBJECT; + } + TLOGI(WmsLogTag::WMS_MULTI_USER, "wms is already connected, notify client"); + int32_t screenId = DEFAULT_SCREEN_ID; + { + std::lock_guard lock(userId2ScreenIdMapMutex_); + screenId = userId2ScreenIdMap_[userId]; + } + smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); + } +} + ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener, int32_t userId) { if (listener == nullptr) { @@ -397,27 +421,7 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(userId) != wmsConnectionStatusMap_.end()) { - isWMSConnected = wmsConnectionStatusMap_[userId]; - } - } - if (smsListener && isWMSConnected) { - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return ERR_DEAD_OBJECT; - } - TLOGI(WmsLogTag::WMS_RECOVER, "WMS ready,notify client"); - int32_t screenId = DEFAULT_SCREEN_ID; - { - std::lock_guard lock(userId2ScreenIdMapMutex_); - screenId = userId2ScreenIdMap_[userId]; - } - smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); - } + NotifyWMSConnectionStatus(userId, smsListener); return ERR_OK; } @@ -536,27 +540,7 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(userId) != wmsConnectionStatusMap_.end()) { - isWMSConnected = wmsConnectionStatusMap_[userId]; - } - } - if (smsListener && isWMSConnected) { - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return ERR_DEAD_OBJECT; - } - int32_t screenId = DEFAULT_SCREEN_ID; - { - std::lock_guard lock(userId2ScreenIdMapMutex_); - screenId = userId2ScreenIdMap_[userId]; - } - TLOGD(WmsLogTag::WMS_MULTI_USER, "Lite wms is already connected, notify client"); - smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); - } + NotifyWMSConnectionStatus(userId, smsListener); return ERR_OK; } @@ -707,7 +691,6 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId } } - void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppLiteClient(int32_t userId) { int32_t displayId = DEFAULT_SCREEN_ID; -- Gitee From d6123d6e3f6a15b4235f544d000f9fc3dcd64073 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 17:08:59 +0800 Subject: [PATCH 23/38] notify fix part9 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index e40f269dd5..2e63b3ac3d 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -357,7 +357,8 @@ ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userI return err; } -void MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, const sptr& smsListener) { +void MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, + const sptr& smsListener) { bool isWMSConnected = false; { std::lock_guard lock(wmsConnectionStatusLock_); -- Gitee From 2cbb27d384e2daa6287423c7beaca5a8f6dad2e5 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 17:16:32 +0800 Subject: [PATCH 24/38] notify fix part10 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 2e63b3ac3d..03709164ac 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -357,7 +357,7 @@ ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userI return err; } -void MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, +ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, const sptr& smsListener) { bool isWMSConnected = false; { @@ -380,6 +380,7 @@ void MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, } smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); } + return ERR_OK; } ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener, int32_t userId) @@ -422,8 +423,7 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr>* MockSessionManagerService::GetSMSRecoverListenerMap( @@ -541,8 +541,7 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr>* MockSessionManagerService::GetSMSLiteRecoverListenerMap( -- Gitee From bbc9f253b7d54e09c60deb23677d042f7a79f044 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 17:18:39 +0800 Subject: [PATCH 25/38] notify fix part11 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/include/mock_session_manager_service.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 2082f7b138..0dcc342c98 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -101,7 +101,7 @@ private: bool RegisterMockSessionManagerService(); ErrCode ValidateParameters(int32_t clientUserId, int32_t userId) const; ErrCode GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const; - void NotifyWMSConnectionStatus(int32_t userId, const sptr& smsListener); + ErrCode NotifyWMSConnectionStatus(int32_t userId, const sptr& smsListener); std::map>* GetSMSRecoverListenerMap(int32_t userId); std::map>* GetSystemAppSMSRecoverListenerMap( int32_t displayId); -- Gitee From 8b6c51e579151811261707d3bd61150f3b632638 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 27 Aug 2025 19:48:34 +0800 Subject: [PATCH 26/38] notify fix part12 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 03709164ac..3d06b014d5 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -700,7 +700,7 @@ void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppLiteClient(i } std::shared_lock lock(systemAppSmsLiteRecoverListenerLock_); std::map>* systemAppSmsLiteRecoverListenerMap = - GetSystemAppSMSRecoverListenerMap(displayId); + GetSystemAppSMSLiteRecoverListenerMap(displayId); if (!systemAppSmsLiteRecoverListenerMap) { TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsLiteRecoverListenerMap is null"); return; -- Gitee From d7bf7244ab4c6a66374d2631438db81486074d6b Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Thu, 28 Aug 2025 11:41:26 +0800 Subject: [PATCH 27/38] notify fix part13 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 3d06b014d5..e03e1ba5e9 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -212,6 +212,7 @@ int MockSessionManagerService::Dump(int fd, const std::vector& a bool MockSessionManagerService::SetSessionManagerService(const sptr& sessionManagerService) { + TLOGI(WmsLogTag::WMS_MULTI_USER, "sessionManagerService set start"); if (!sessionManagerService) { WLOGFE("sessionManagerService is nullptr"); return false; @@ -350,6 +351,7 @@ ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userI { displayId = DISPLAY_ID_INVALID; ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); + TLOGI(WmsLogTag::WMS_RECOVER, "displayId: %{public}d,", displayId); if (err != ERR_OK) { TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); @@ -385,6 +387,7 @@ ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener, int32_t userId) { + TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d,", userId); if (listener == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "listener is nullptr"); return ERR_INVALID_VALUE; @@ -503,6 +506,7 @@ void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserI ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr& listener, int32_t userId) { + TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d,", userId); if (listener == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "Lite listener is nullptr"); return ERR_INVALID_VALUE; -- Gitee From 9f37088ad2c34f788699c6df0e89a305e4bca44b Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Thu, 28 Aug 2025 16:08:18 +0800 Subject: [PATCH 28/38] notify fix part14 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 123 ++++++++++-------- 1 file changed, 71 insertions(+), 52 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index e03e1ba5e9..f92a8c6f05 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -333,58 +333,6 @@ void MockSessionManagerService::RemoveSessionManagerServiceByUserId(int32_t user } } -ErrCode MockSessionManagerService::ValidateParameters(int32_t clientUserId, int32_t userId) const -{ - if (clientUserId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "clientUserId is illegal: %{public}d", clientUserId); - return ERR_INVALID_VALUE; - } - - if (clientUserId == SYSTEM_USERID && userId <= INVALID_USER_ID) { - TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); - return ERR_INVALID_VALUE; - } - return ERR_OK; -} - -ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const -{ - displayId = DISPLAY_ID_INVALID; - ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); - TLOGI(WmsLogTag::WMS_RECOVER, "displayId: %{public}d,", displayId); - if (err != ERR_OK) { - TLOGE(WmsLogTag::WMS_RECOVER, - "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); - } - return err; -} - -ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, - const sptr& smsListener) { - bool isWMSConnected = false; - { - std::lock_guard lock(wmsConnectionStatusLock_); - if (wmsConnectionStatusMap_.find(userId) != wmsConnectionStatusMap_.end()) { - isWMSConnected = wmsConnectionStatusMap_[userId]; - } - } - if (smsListener && isWMSConnected) { - auto sessionManagerService = GetSessionManagerServiceByUserId(userId); - if (sessionManagerService == nullptr) { - TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); - return ERR_DEAD_OBJECT; - } - TLOGI(WmsLogTag::WMS_MULTI_USER, "wms is already connected, notify client"); - int32_t screenId = DEFAULT_SCREEN_ID; - { - std::lock_guard lock(userId2ScreenIdMapMutex_); - screenId = userId2ScreenIdMap_[userId]; - } - smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); - } - return ERR_OK; -} - ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr& listener, int32_t userId) { TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d,", userId); @@ -394,6 +342,11 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr>* ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) { int32_t clientUserId = GetUserIdByCallingUid(); + // SYSTEM_USERID calling, userId = INVALID_USER_ID, set userId to defaultWMSUserId_ + if (clientUserId == SYSTEM_USERID && userId == INVALID_USER_ID) { + userId = defaultWMSUserId_; + } ErrCode ret = ValidateParameters(clientUserId, userId); if (ret != ERR_OK) { @@ -513,6 +470,11 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr>* ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId) { int32_t clientUserId = GetUserIdByCallingUid(); + // SYSTEM_USERID calling, userId = INVALID_USER_ID, set userId to defaultWMSUserId_ + if (clientUserId == SYSTEM_USERID && userId == INVALID_USER_ID) { + userId = defaultWMSUserId_; + } + ErrCode ret = ValidateParameters(clientUserId, userId); if (ret != ERR_OK) { return ret; @@ -1243,5 +1210,57 @@ ErrCode MockSessionManagerService::SetSnapshotSkipByIdNamesMapInner( } return ERR_OK; } + +ErrCode MockSessionManagerService::ValidateParameters(int32_t clientUserId, int32_t userId) const +{ + if (clientUserId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "clientUserId is illegal: %{public}d", clientUserId); + return ERR_INVALID_VALUE; + } + + if (clientUserId == SYSTEM_USERID && userId <= INVALID_USER_ID) { + TLOGE(WmsLogTag::WMS_RECOVER, "system userid calling, userId is illegal: %{public}d", userId); + return ERR_INVALID_VALUE; + } + return ERR_OK; +} + +ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const +{ + displayId = DISPLAY_ID_INVALID; + ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); + TLOGI(WmsLogTag::WMS_RECOVER, "displayId: %{public}d,", displayId); + if (err != ERR_OK) { + TLOGE(WmsLogTag::WMS_RECOVER, + "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); + } + return err; +} + +ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, + const sptr& smsListener) { + bool isWMSConnected = false; + { + std::lock_guard lock(wmsConnectionStatusLock_); + if (wmsConnectionStatusMap_.find(userId) != wmsConnectionStatusMap_.end()) { + isWMSConnected = wmsConnectionStatusMap_[userId]; + } + } + if (smsListener && isWMSConnected) { + auto sessionManagerService = GetSessionManagerServiceByUserId(userId); + if (sessionManagerService == nullptr) { + TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); + return ERR_DEAD_OBJECT; + } + TLOGI(WmsLogTag::WMS_MULTI_USER, "wms is already connected, notify client"); + int32_t screenId = DEFAULT_SCREEN_ID; + { + std::lock_guard lock(userId2ScreenIdMapMutex_); + screenId = userId2ScreenIdMap_[userId]; + } + smsListener->OnWMSConnectionChanged(userId, screenId, true, sessionManagerService); + } + return ERR_OK; +} } // namespace Rosen } // namespace OHOS \ No newline at end of file -- Gitee From 0aaa98f1b40c4357b5b26ae9f66c48d6e0ccc4ca Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Fri, 29 Aug 2025 10:04:55 +0800 Subject: [PATCH 29/38] notify fix part15 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 85 +++++++++++-------- 1 file changed, 51 insertions(+), 34 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index f92a8c6f05..459577902e 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -65,7 +65,7 @@ const std::string BOOTEVENT_WMS_READY = "bootevent.wms.ready"; inline int32_t GetUserIdByCallingUid() { int32_t uid = IPCSkeleton::GetCallingUid(); - TLOGD(WmsLogTag::WMS_MULTI_USER, "get calling uid(%{public}d)", uid); + TLOGI(WmsLogTag::WMS_MULTI_USER, "get calling uid(%{public}d)", uid); if (uid <= INVALID_UID) { TLOGE(WmsLogTag::WMS_MULTI_USER, "uid is illegal: %{public}d", uid); return INVALID_USER_ID; @@ -83,7 +83,7 @@ public: void OnRemoteDied(const wptr& wptrDeath) override { - TLOGD(WmsLogTag::WMS_RECOVER, "Client died, pid = %{public}d, isLite = %{public}d", pid_, isLite_); + TLOGI(WmsLogTag::WMS_RECOVER, "Client died, pid = %{public}d, isLite = %{public}d", pid_, isLite_); if (isLite_) { MockSessionManagerService::GetInstance().UnregisterSMSLiteRecoverListener(userId_, displayId_, pid_); } else { @@ -119,7 +119,7 @@ void MockSessionManagerService::SMSDeathRecipient::OnRemoteDied(const wptr& return ERR_INVALID_VALUE; } if (clientUserId == SYSTEM_USERID) { - TLOGD(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", + TLOGI(WmsLogTag::WMS_MULTI_USER, "System user, return default sessionManagerService with %{public}d", defaultWMSUserId_); clientUserId = defaultWMSUserId_; } @@ -303,6 +303,7 @@ ErrCode MockSessionManagerService::GetSessionManagerServiceByUserId(int32_t user return ERR_INVALID_VALUE; } if (clientUserId != SYSTEM_USERID) { + TLOGE(WmsLogTag::WMS_MULTI_USER, "clientUserId is not system user id : %{public}d", clientUserId); return ERR_WOULD_BLOCK; } sessionManagerService = GetSessionManagerServiceByUserId(userId); @@ -344,6 +345,8 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, false); listener->AddDeathRecipient(clientDeathListener); @@ -404,9 +408,13 @@ std::map>* ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) { + TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d,", userId); + int32_t clientUserId = GetUserIdByCallingUid(); // SYSTEM_USERID calling, userId = INVALID_USER_ID, set userId to defaultWMSUserId_ if (clientUserId == SYSTEM_USERID && userId == INVALID_USER_ID) { + TLOGI(WmsLogTag::WMS_MULTI_USER, "system user, userId is INVALID_USER_ID, use defaultWMSUserId_: %{public}d", + defaultWMSUserId_); userId = defaultWMSUserId_; } @@ -424,22 +432,20 @@ ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) } int32_t pid = IPCSkeleton::GetCallingRealPid(); - TLOGD(WmsLogTag::WMS_RECOVER, - "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); UnregisterSMSRecoverListener(clientUserId, displayId, pid); return ERR_OK; } void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { - TLOGD(WmsLogTag::WMS_RECOVER, - "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); + TLOGI(WmsLogTag::WMS_RECOVER, + "clientUserId = %{public}d, pid = %{public}d, displayId = %{public}d", clientUserId, pid, displayId); if (clientUserId == SYSTEM_USERID) { std::unique_lock lock(systemAppSmsRecoverListenerLock_); std::map>* systemAppSmsRecoverListenerMap = GetSystemAppSMSRecoverListenerMap(displayId); if (!systemAppSmsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); + TLOGE(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); return; } auto iter = systemAppSmsRecoverListenerMap->find(pid); @@ -451,7 +457,7 @@ void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserI std::map>* smsRecoverListenerMap = GetSMSRecoverListenerMap(clientUserId); if (!smsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); + TLOGE(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); return; } auto iter = smsRecoverListenerMap->find(pid); @@ -472,6 +478,8 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, true); listener->AddDeathRecipient(clientDeathListener); @@ -531,13 +540,17 @@ std::map>* } ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId) -{ +{ + TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d,", userId); + int32_t clientUserId = GetUserIdByCallingUid(); // SYSTEM_USERID calling, userId = INVALID_USER_ID, set userId to defaultWMSUserId_ if (clientUserId == SYSTEM_USERID && userId == INVALID_USER_ID) { + TLOGI(WmsLogTag::WMS_MULTI_USER, "system user, userId is INVALID_USER_ID, use defaultWMSUserId_: %{public}d", + defaultWMSUserId_); userId = defaultWMSUserId_; } - + ErrCode ret = ValidateParameters(clientUserId, userId); if (ret != ERR_OK) { return ret; @@ -552,22 +565,20 @@ ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t user } int32_t pid = IPCSkeleton::GetCallingRealPid(); - TLOGD(WmsLogTag::WMS_RECOVER, - "clientUserId = %{public}d, userId = %{public}d, pid = %{public}d", clientUserId, userId, pid); UnregisterSMSLiteRecoverListener(clientUserId, displayId, pid); return ERR_OK; } void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { - TLOGD(WmsLogTag::WMS_RECOVER, - "clientUserId = %{public}d, displayId = %{public}d, pid = %{public}d", clientUserId, displayId, pid); + TLOGI(WmsLogTag::WMS_RECOVER, + "clientUserId = %{public}d, pid = %{public}d, displayId = %{public}d", clientUserId, pid, displayId); if (clientUserId == SYSTEM_USERID) { std::unique_lock lock(systemAppSmsLiteRecoverListenerLock_); std::map>* systemAppSmsLiteRecoverListenerMap = GetSystemAppSMSLiteRecoverListenerMap(displayId); if (!systemAppSmsLiteRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsLiteRecoverListenerMap is null"); + TLOGE(WmsLogTag::WMS_RECOVER, "systemAppSmsLiteRecoverListenerMap is null"); return; } auto iter = systemAppSmsLiteRecoverListenerMap->find(pid); @@ -579,6 +590,7 @@ void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientU std::map>* smsLiteRecoverListenerMap = GetSMSLiteRecoverListenerMap(clientUserId); if (!smsLiteRecoverListenerMap) { + TLOGE(WmsLogTag::WMS_RECOVER, "smsLiteRecoverListenerMap is null"); return; } auto iter = smsLiteRecoverListenerMap->find(pid); @@ -616,11 +628,12 @@ void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppClient(int32 std::lock_guard lock(userId2ScreenIdMapMutex_); displayId = userId2ScreenIdMap_[userId]; } + TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d, displayId = %{public}d", userId, displayId); std::shared_lock lock(systemAppSmsRecoverListenerLock_); std::map>* systemAppSmsRecoverListenerMap = GetSystemAppSMSRecoverListenerMap(displayId); if (!systemAppSmsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); + TLOGE(WmsLogTag::WMS_RECOVER, "systemAppSmsRecoverListenerMap is null"); return; } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, @@ -644,7 +657,7 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId std::map>* smsRecoverListenerMap = GetSMSRecoverListenerMap(userId); if (!smsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); + TLOGE(WmsLogTag::WMS_RECOVER, "smsRecoverListenerMap is null"); return; } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, @@ -669,11 +682,12 @@ void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppLiteClient(i std::lock_guard lock(userId2ScreenIdMapMutex_); displayId = userId2ScreenIdMap_[userId]; } + TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d, displayId = %{public}d", userId, displayId); std::shared_lock lock(systemAppSmsLiteRecoverListenerLock_); std::map>* systemAppSmsLiteRecoverListenerMap = GetSystemAppSMSLiteRecoverListenerMap(displayId); if (!systemAppSmsLiteRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_RECOVER, "systemAppSmsLiteRecoverListenerMap is null"); + TLOGE(WmsLogTag::WMS_RECOVER, "systemAppSmsLiteRecoverListenerMap is null"); return; } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, SYSTEM_USERID, @@ -685,7 +699,7 @@ void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppLiteClient(i } for (auto& iter : *systemAppSmsLiteRecoverListenerMap) { if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover pid = %{public}d", iter.first); + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover Lite pid = %{public}d", iter.first); iter.second->OnSessionManagerServiceRecover(sessionManagerService); } } @@ -697,6 +711,7 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us std::map>* smsLiteRecoverListenerMap = GetSMSLiteRecoverListenerMap(userId); if (!smsLiteRecoverListenerMap) { + TLOGE(WmsLogTag::WMS_RECOVER, "smsLiteRecoverListenerMap is null"); return; } TLOGI(WmsLogTag::WMS_RECOVER, "userId=%{public}d, Remote process count = %{public}" PRIu64, userId, @@ -708,9 +723,7 @@ void MockSessionManagerService::NotifySceneBoardAvailableToLiteClient(int32_t us } for (auto& iter : *smsLiteRecoverListenerMap) { if (iter.second != nullptr) { - TLOGI(WmsLogTag::WMS_RECOVER, - "Call OnSessionManagerServiceRecover Lite pid = %{public}d, ref count = %{public}" PRId32, iter.first, - iter.second->GetSptrRefCount()); + TLOGI(WmsLogTag::WMS_RECOVER, "Call OnSessionManagerServiceRecover Lite pid = %{public}d", iter.first); iter.second->OnSessionManagerServiceRecover(sessionManagerService); } } @@ -722,6 +735,7 @@ void MockSessionManagerService::NotifyWMSConnected(int32_t userId, int32_t scree screenId, isColdStart); if (screenId == defaultScreenId_) { defaultWMSUserId_ = userId; + TLOGI(WmsLogTag::WMS_MULTI_USER, "set defaultWMSUserId_ = %{public}d", defaultWMSUserId_); } { std::lock_guard lock(userId2ScreenIdMapMutex_); @@ -756,12 +770,12 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToClient( std::map>* systemAppSmsRecoverListenerMap = GetSystemAppSMSRecoverListenerMap(screenId); if (!systemAppSmsRecoverListenerMap) { - TLOGW(WmsLogTag::WMS_MULTI_USER, "systemAppSmsRecoverListenerMap is null"); + TLOGE(WmsLogTag::WMS_MULTI_USER, "systemAppSmsRecoverListenerMap is null"); return; } - TLOGD(WmsLogTag::WMS_MULTI_USER, - "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", - wmsUserId, isConnected, systemAppSmsRecoverListenerMap->size()); + TLOGI(WmsLogTag::WMS_MULTI_USER, + "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", + wmsUserId, isConnected, systemAppSmsRecoverListenerMap->size()); auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -769,7 +783,7 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToClient( } for (auto& iter : *systemAppSmsRecoverListenerMap) { if (iter.second != nullptr) { - TLOGD(WmsLogTag::WMS_MULTI_USER, "Call OnWMSConnectionChanged pid = %{public}d", iter.first); + TLOGI(WmsLogTag::WMS_MULTI_USER, "Call OnWMSConnectionChanged pid = %{public}d", iter.first); iter.second->OnWMSConnectionChanged(wmsUserId, screenId, isConnected, sessionManagerService); } } @@ -782,9 +796,12 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( std::map>* systemAppSmsLiteRecoverListenerMap = GetSystemAppSMSLiteRecoverListenerMap(screenId); if (!systemAppSmsLiteRecoverListenerMap) { + TLOGE(WmsLogTag::WMS_MULTI_USER, "systemAppSmsLiteRecoverListenerMap is null"); return; } - TLOGD(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d", wmsUserId, isConnected); + TLOGI(WmsLogTag::WMS_MULTI_USER, + "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", + wmsUserId, isConnected, systemAppSmsLiteRecoverListenerMap->size()); auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -792,7 +809,7 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( } for (auto& iter : *systemAppSmsLiteRecoverListenerMap) { if (iter.second != nullptr) { - TLOGD(WmsLogTag::WMS_MULTI_USER, + TLOGI(WmsLogTag::WMS_MULTI_USER, "Call OnWMSConnectionChanged Lite pid = %{public}d, ref count = %{public}d", iter.first, iter.second->GetSptrRefCount()); iter.second->OnWMSConnectionChanged(wmsUserId, screenId, isConnected, sessionManagerService); @@ -1229,7 +1246,7 @@ ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userI { displayId = DISPLAY_ID_INVALID; ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); - TLOGI(WmsLogTag::WMS_RECOVER, "displayId: %{public}d,", displayId); + TLOGI(WmsLogTag::WMS_RECOVER, "displayId: %{public}" PRIu64, displayId); if (err != ERR_OK) { TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); -- Gitee From b32b2c8436d8623f15e5ed1a2303161177f7439e Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Sat, 30 Aug 2025 10:29:28 +0800 Subject: [PATCH 30/38] notify fix part16 Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 459577902e..f614f888d4 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -343,6 +343,7 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr Date: Sat, 30 Aug 2025 14:41:57 +0800 Subject: [PATCH 31/38] mock unittest add Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../mock_session_manager_service_test.cpp | 326 +++++++++++++++++- 1 file changed, 325 insertions(+), 1 deletion(-) diff --git a/window_scene/test/unittest/mock_session_manager_service_test.cpp b/window_scene/test/unittest/mock_session_manager_service_test.cpp index ebc1648b8f..ab90f69741 100644 --- a/window_scene/test/unittest/mock_session_manager_service_test.cpp +++ b/window_scene/test/unittest/mock_session_manager_service_test.cpp @@ -129,6 +129,330 @@ HWTEST(MockSessionManagerServiceTest, RecoverSCBSnapshotSkipByUserId, TestSize.L ret = mockMockSms.RecoverSCBSnapshotSkipByUserId(100); EXPECT_EQ(ERR_OK, ret); } + +/** + * @tc.name: SetSessionManagerService + * @tc.desc: test the function of SetSessionManagerService + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, SetSessionManagerService, TestSize.Level1) +{ + MockMockSessionManagerService mockMockSms; + sptr nullSessionManagerService = nullptr; + bool result = mockMockSms.SetSessionManagerService(nullSessionManagerService); + EXPECT_EQ(result, false); + + sptr mockSessionManagerService = sptr::MakeSptr(); + // Mock GetUserIdByCallingUid() 返回非法用户id -1 + result = SetSessionManagerService(mockSessionManagerService); + EXPECT_EQ(resultCode, false); + + // Mock GetUserIdByCallingUid() 返回合法用户id 100 + result = SetSessionManagerService(mockSessionManagerService); + EXPECT_EQ(resultCode, true); +} + +/** + * @tc.name: GetSessionManagerService + * @tc.desc: test the function of GetSessionManagerService + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, GetSessionManagerService, TestSize.Level1) +{ + sptr sessionManagerService; + // 1. Mock GetUserIdByCallingUid() 返回非法用户id -1 + ErrCode resultCode = GetSessionManagerService(sessionManagerService); + EXPECT_EQ(resultCode, ERR_INVALID_VALUE); + + // 1. Mock GetUserIdByCallingUid() 返回系统用户id 0 + ErrCode resultCode = GetSessionManagerService(sessionManagerService); + EXPECT_EQ(resultCode, ERR_OK); +} + +/** + * @tc.name: GetSessionManagerServiceByUserId + * @tc.desc: test the function of GetSessionManagerServiceByUserId + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, GetSessionManagerServiceByUserId, TestSize.Level1) +{ + int32_t userId = 100; + sptr sessionManagerService; + // 1. Mock GetUserIdByCallingUid() 返回非法用户id -1 + ErrCode resultCode = GetSessionManagerServiceByUserId(userId, sessionManagerService); + EXPECT_EQ(resultCode, ERR_INVALID_VALUE); + + // 2. Mock GetUserIdByCallingUid() 返回非系统用户id 200 + ErrCode resultCode = GetSessionManagerServiceByUserId(userId, sessionManagerService); + EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); + + + // 2. Mock GetUserIdByCallingUid() 返回系统用户id 0 + ErrCode resultCode = GetSessionManagerServiceByUserId(userId, sessionManagerService); + EXPECT_EQ(resultCode, ERR_OK); +} + +/** + * @tc.name: RegisterSMSRecoverListener + * @tc.desc: test the function of RegisterSMSRecoverListener + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, RegisterSMSRecoverListener, TestSize.Level1) +{ + sptr listener = nullptr; + int32_t userId = 100; + // 1. listener 为 nullptr + ErrCode resultCode = RegisterSMSRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_INVALID_VALUE); + + // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + listener = sptr::MakeSptr(); + userId = INVALID_USER_ID; + resultCode = RegisterSMSRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_OK); + + + SetMockUserId(0); + listener = sptr::MakeSptr(); + userId = 100; + resultCode = RegisterSMSRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_OK); +} + +/** + * @tc.name: UnregisterSMSRecoverListener + * @tc.desc: test the function of UnregisterSMSRecoverListener + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, UnregisterSMSRecoverListener, TestSize.Level1) +{ + int32_t userId = INVALID_USER_ID; + // 1.Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + ErrCode resultCode = UnregisterSMSRecoverListener(userId); + EXPECT_EQ(resultCode, ERR_OK); + + SetMockUserId(0); + userId = 100; + resultCode = UnregisterSMSRecoverListener(userId); + EXPECT_EQ(resultCode, ERR_OK); +} + +/** + * @tc.name: RegisterSMSLiteRecoverListener + * @tc.desc: test the function of RegisterSMSLiteRecoverListener + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, RegisterSMSLiteRecoverListener, TestSize.Level1) +{ + sptr listener = nullptr; + int32_t userId = 100; + // 1. listener 为 nullptr + ErrCode resultCode = RegisterSMSLiteRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_INVALID_VALUE); + + // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + listener = sptr::MakeSptr(); + userId = INVALID_USER_ID; + resultCode = RegisterSMSLiteRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_OK); + + + SetMockUserId(0); + listener = sptr::MakeSptr(); + userId = 100; + resultCode = RegisterSMSLiteRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_OK); +} + +/** + * @tc.name: UnregisterSMSLiteRecoverListener + * @tc.desc: test the function of UnregisterSMSLiteRecoverListener + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, UnregisterSMSLiteRecoverListener, TestSize.Level1) +{ + int32_t userId = INVALID_USER_ID; + // 1.Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + ErrCode resultCode = UnregisterSMSLiteRecoverListener(userId); + EXPECT_EQ(resultCode, ERR_OK); + + SetMockUserId(0); + userId = 100; + resultCode = UnregisterSMSLiteRecoverListener(userId); + EXPECT_EQ(resultCode, ERR_OK); +} + +/** + * @tc.name: NotifySceneBoardAvailable + * @tc.desc: test the function of NotifySceneBoardAvailable + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailable, TestSize.Level1) +{ + // 1.Mock IsSystemCalling返回fasle + ErrCode resultCode = NotifySceneBoardAvailable(); + EXPECT_EQ(resultCode, ERR_PERMISSION_DENIED); + + // 2. Mock IsSystemCalling返回true + // Mock GetUserIdByCallingUid() 返回非法用户-1 + resultCode = NotifySceneBoardAvailable(); + EXPECT_EQ(resultCode, ERR_INVALID_VALUE); + + // 2. Mock IsSystemCalling返回true + // Mock GetUserIdByCallingUid() 返回合法用户100 + resultCode = NotifySceneBoardAvailable(); + EXPECT_EQ(resultCode, ERR_OK); +} +} + +/** + * @tc.name: NotifySceneBoardAvailableToSystemAppClient + * @tc.desc: test the function of NotifySceneBoardAvailableToSystemAppClient + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppClient, TestSize.Level1) +{ + int32_t userId = 100; + NotifySceneBoardAvailableToSystemAppClient(userId); +} + +/** + * @tc.name: NotifySceneBoardAvailableToClient + * @tc.desc: test the function of NotifySceneBoardAvailableToClient + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToClient, TestSize.Level1) +{ + int32_t userId = 100; + NotifySceneBoardAvailableToClient(userId); +} + +/** + * @tc.name: NotifySceneBoardAvailableToSystemAppLiteClient + * @tc.desc: test the function of NotifySceneBoardAvailableToSystemAppLiteClient + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppLiteClient, TestSize.Level1) +{ + int32_t userId = 100; + NotifySceneBoardAvailableToSystemAppLiteClient(userId); +} + +/** + * @tc.name: NotifySceneBoardAvailableToLiteClient + * @tc.desc: test the function of NotifySceneBoardAvailableToLiteClient + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToLiteClient, TestSize.Level1) +{ + int32_t userId = 100; + NotifySceneBoardAvailableToLiteClient(userId); +} + +/** + * @tc.name: NotifyWMSConnected + * @tc.desc: test the function of NotifyWMSConnected + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifyWMSConnected, TestSize.Level1) +{ + int32_t userId = 100; + int32_t screenId = 0; + bool isColdStart = false; + NotifyWMSConnected(userId, screenId, isColdStart); +} + +/** + * @tc.name: NotifyWMSConnectionChangedToClient + * @tc.desc: test the function of NotifyWMSConnectionChangedToClient + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifyWMSConnectionChangedToClient, TestSize.Level1) +{ + int32_t wmsUserId = 100; + int32_t screenId = 0; + bool isConnnected = true; + NotifyWMSConnectionChangedToClient(wmsUserId, screenId, isConnnected); +} + +/** + * @tc.name: NotifyWMSConnectionChangedToLiteClient + * @tc.desc: test the function of NotifyWMSConnectionChangedToLiteClient + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifyWMSConnectionChangedToLiteClient, TestSize.Level1) +{ + int32_t wmsUserId = 100; + int32_t screenId = 0; + bool isConnnected = true; + NotifyWMSConnectionChangedToLiteClient(wmsUserId, screenId, isConnnected); +} + + +/** + * @tc.name: GetSceneSessionManagerCommon + * @tc.desc: test the function of GetSceneSessionManagerCommon + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon, TestSize.Level1) +{ + sptr result; + bool isLite = false; + // Mock GetUserIdByCallingUid() 返回非法用户id -1 + SetMockUserId(-1); + ErrCode resultCode = MockSessionManagerService::GetInstance().GetSceneSessionManagerCommon(100, result, isLite); + EXPECT_EQ(resultCode, ERR_INVALID_VALUE); + + // Mock GetUserIdByCallingUid() 返回非系统用户id 100 + SetMockUserId(100); + ErrCode resultCode = GetSceneSessionManagerCommon(200, result, isLite); + EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); + + // Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + // Mock GetSessionManagerServiceByUserId() 返回nullptr 或者 传入不存在userId 99999 + ErrCode resultCode = GetSceneSessionManagerCommon(99999, result, isLite); + EXPECT_EQ(resultCode, ERR_INVALID_VALUE); + + // Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // Mock iface_cast 返回nullptr + ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); + EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); + + isLite = false; + // Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // Mock iface_cast 返回有效代理 + ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); + EXPECT_EQ(resultCode, ERR_OK); + EXPECT_NQ(result, nullptr); + + isLite = true; + // Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // Mock iface_cast 返回有效代理 + ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); + EXPECT_EQ(resultCode, ERR_OK); + EXPECT_NQ(result, nullptr); + + isLite = false; + // Mock GetUserIdByCallingUid() 返回系统用户id 0 + SetMockUserId(0); + // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // Mock iface_cast 返回有效代理 + // Mock GetSceneSessionManager() 返回nullptr + ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); + EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); +} + } // namespace } // namespace Rosen -} // namespace OHOS \ No newline at end of file +} // namespace OHOSHOPEFU \ No newline at end of file -- Gitee From af90330c7f2db8da7fee5b86eb5d76f529b20bec Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Sat, 30 Aug 2025 21:43:30 +0800 Subject: [PATCH 32/38] get UserIdByCallingUid add Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../include/mock_session_manager_service.h | 1 + wmserver/src/mock_session_manager_service.cpp | 22 +++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 0dcc342c98..47e634ac4b 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -102,6 +102,7 @@ private: ErrCode ValidateParameters(int32_t clientUserId, int32_t userId) const; ErrCode GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const; ErrCode NotifyWMSConnectionStatus(int32_t userId, const sptr& smsListener); + virtual int32_t GetUserIdByCallingUid(); std::map>* GetSMSRecoverListenerMap(int32_t userId); std::map>* GetSystemAppSMSRecoverListenerMap( int32_t displayId); diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index f614f888d4..430629c2ec 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -61,17 +61,6 @@ const std::string KEY_SCENE_BOARD_TEST_ENABLE = "persist.scb.testmode.enable"; const std::string SCENE_BOARD_BUNDLE_NAME = "com.ohos.sceneboard"; const std::string TEST_MODULE_NAME_SUFFIX = "_test"; const std::string BOOTEVENT_WMS_READY = "bootevent.wms.ready"; - -inline int32_t GetUserIdByCallingUid() -{ - int32_t uid = IPCSkeleton::GetCallingUid(); - TLOGI(WmsLogTag::WMS_MULTI_USER, "get calling uid(%{public}d)", uid); - if (uid <= INVALID_UID) { - TLOGE(WmsLogTag::WMS_MULTI_USER, "uid is illegal: %{public}d", uid); - return INVALID_USER_ID; - } - return GetUserIdByUid(uid); -} } // namespace @@ -1282,5 +1271,16 @@ ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, } return ERR_OK; } + +int32_t GetUserIdByCallingUid() +{ + int32_t uid = IPCSkeleton::GetCallingUid(); + TLOGI(WmsLogTag::WMS_MULTI_USER, "get calling uid(%{public}d)", uid); + if (uid <= INVALID_UID) { + TLOGE(WmsLogTag::WMS_MULTI_USER, "uid is illegal: %{public}d", uid); + return INVALID_USER_ID; + } + return GetUserIdByUid(uid); +} } // namespace Rosen } // namespace OHOS \ No newline at end of file -- Gitee From 99aa44d3102c6a62da9904a9f98db82d7351dbd4 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Sun, 31 Aug 2025 16:33:43 +0800 Subject: [PATCH 33/38] tdd add Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../mock_session_manager_service_test.cpp | 342 +++++++++++++----- 1 file changed, 252 insertions(+), 90 deletions(-) diff --git a/window_scene/test/unittest/mock_session_manager_service_test.cpp b/window_scene/test/unittest/mock_session_manager_service_test.cpp index ab90f69741..0bc949731f 100644 --- a/window_scene/test/unittest/mock_session_manager_service_test.cpp +++ b/window_scene/test/unittest/mock_session_manager_service_test.cpp @@ -21,6 +21,8 @@ #include "iremote_object_mocker.h" #include "scene_session_manager.h" +#include "session_manager_service_proxy.h" +#include "../mock/mock_accesstoken_kit.h" #include "wm_common.h" using namespace testing; @@ -35,6 +37,7 @@ public: NotifySCBSnapshotSkipByUserIdAndBundleNames, (int32_t, const std::vector&, const sptr&), (override)); + MOCK_METHOD(int32_t, GetUserIdByCallingUid, (), (override)); }; namespace { @@ -131,11 +134,11 @@ HWTEST(MockSessionManagerServiceTest, RecoverSCBSnapshotSkipByUserId, TestSize.L } /** - * @tc.name: SetSessionManagerService - * @tc.desc: test the function of SetSessionManagerService + * @tc.name: SetSessionManagerServiceFailed + * @tc.desc: test the function of SetSessionManagerServiceFailed * @tc.type: FUNC */ -HWTEST(MockSessionManagerServiceTest, SetSessionManagerService, TestSize.Level1) +HWTEST(MockSessionManagerServiceTest, SetSessionManagerServiceFailed, TestSize.Level1) { MockMockSessionManagerService mockMockSms; sptr nullSessionManagerService = nullptr; @@ -144,12 +147,29 @@ HWTEST(MockSessionManagerServiceTest, SetSessionManagerService, TestSize.Level1) sptr mockSessionManagerService = sptr::MakeSptr(); // Mock GetUserIdByCallingUid() 返回非法用户id -1 - result = SetSessionManagerService(mockSessionManagerService); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(-1)); + result = mockMockSms.SetSessionManagerService(mockSessionManagerService); EXPECT_EQ(resultCode, false); +} - // Mock GetUserIdByCallingUid() 返回合法用户id 100 - result = SetSessionManagerService(mockSessionManagerService); - EXPECT_EQ(resultCode, true); +/** + * @tc.name: SetSessionManagerServiceSuccess + * @tc.desc: test the function of SetSessionManagerServiceSuccess + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, SetSessionManagerServiceSuccess, TestSize.Level1) +{ + // crash + // MockMockSessionManagerService mockMockSms; + // sptr mockSessionManagerService = sptr::MakeSptr(); + // // Mock GetUserIdByCallingUid() 返回合法用户id 100 + // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + // .Times(1) + // .WillOnce(Return(100)); + // bool result = mockMockSms.SetSessionManagerService(mockSessionManagerService); + // EXPECT_EQ(result, false); } /** @@ -160,12 +180,19 @@ HWTEST(MockSessionManagerServiceTest, SetSessionManagerService, TestSize.Level1) HWTEST(MockSessionManagerServiceTest, GetSessionManagerService, TestSize.Level1) { sptr sessionManagerService; + MockMockSessionManagerService mockMockSms; // 1. Mock GetUserIdByCallingUid() 返回非法用户id -1 - ErrCode resultCode = GetSessionManagerService(sessionManagerService); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(-1)); + ErrCode resultCode = mockMockSms.GetSessionManagerService(sessionManagerService); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); // 1. Mock GetUserIdByCallingUid() 返回系统用户id 0 - ErrCode resultCode = GetSessionManagerService(sessionManagerService); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); + resultCode = mockMockSms.GetSessionManagerService(sessionManagerService); EXPECT_EQ(resultCode, ERR_OK); } @@ -177,18 +204,27 @@ HWTEST(MockSessionManagerServiceTest, GetSessionManagerService, TestSize.Level1) HWTEST(MockSessionManagerServiceTest, GetSessionManagerServiceByUserId, TestSize.Level1) { int32_t userId = 100; + MockMockSessionManagerService mockMockSms; sptr sessionManagerService; // 1. Mock GetUserIdByCallingUid() 返回非法用户id -1 - ErrCode resultCode = GetSessionManagerServiceByUserId(userId, sessionManagerService); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(-1)); + ErrCode resultCode = mockMockSms.GetSessionManagerServiceByUserId(userId, sessionManagerService); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); // 2. Mock GetUserIdByCallingUid() 返回非系统用户id 200 - ErrCode resultCode = GetSessionManagerServiceByUserId(userId, sessionManagerService); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(200)); + resultCode = mockMockSms.GetSessionManagerServiceByUserId(userId, sessionManagerService); EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); - - // 2. Mock GetUserIdByCallingUid() 返回系统用户id 0 - ErrCode resultCode = GetSessionManagerServiceByUserId(userId, sessionManagerService); + // 2. Mock GetUserIdByCallingUid() 返回非系统用户id 0 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); + resultCode = mockMockSms.GetSessionManagerServiceByUserId(sessionManagerService); EXPECT_EQ(resultCode, ERR_OK); } @@ -199,25 +235,39 @@ HWTEST(MockSessionManagerServiceTest, GetSessionManagerServiceByUserId, TestSize */ HWTEST(MockSessionManagerServiceTest, RegisterSMSRecoverListener, TestSize.Level1) { + MockMockSessionManagerService mockMockSms; sptr listener = nullptr; int32_t userId = 100; // 1. listener 为 nullptr - ErrCode resultCode = RegisterSMSRecoverListener(listener, userId); + ErrCode resultCode = mockMockSms.RegisterSMSRecoverListener(listener, userId); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); listener = sptr::MakeSptr(); userId = INVALID_USER_ID; - resultCode = RegisterSMSRecoverListener(listener, userId); + resultCode = mockMockSms.RegisterSMSRecoverListener(listener, userId); EXPECT_EQ(resultCode, ERR_OK); - - SetMockUserId(0); + // 3.Mock GetUserIdByCallingUid() 返回系统用户id 0 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); listener = sptr::MakeSptr(); userId = 100; - resultCode = RegisterSMSRecoverListener(listener, userId); - EXPECT_EQ(resultCode, ERR_OK); + resultCode = mockMockSms.RegisterSMSRecoverListener(listener, userId); + EXPECT_EQ(resultCode, 4194312); + + // 4.Mock GetUserIdByCallingUid() 返回非系统用户id 100 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(100)); + listener = sptr::MakeSptr(); + userId = INVALID_USER_ID; + resultCode = mockMockSms.RegisterSMSRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); } /** @@ -227,15 +277,29 @@ HWTEST(MockSessionManagerServiceTest, RegisterSMSRecoverListener, TestSize.Level */ HWTEST(MockSessionManagerServiceTest, UnregisterSMSRecoverListener, TestSize.Level1) { - int32_t userId = INVALID_USER_ID; + MockMockSessionManagerService mockMockSms; // 1.Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); - ErrCode resultCode = UnregisterSMSRecoverListener(userId); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); + int32_t userId = INVALID_USER_ID; + ErrCode resultCode = mockMockSms.UnregisterSMSRecoverListener(userId); EXPECT_EQ(resultCode, ERR_OK); - SetMockUserId(0); + // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); userId = 100; - resultCode = UnregisterSMSRecoverListener(userId); + resultCode = mockMockSms.UnregisterSMSRecoverListener(userId); + EXPECT_EQ(resultCode, 4194312); + + // 3.Mock GetUserIdByCallingUid() 返回非系统用户id 100 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(100)); + userId = INVALID_USER_ID; + resultCode = mockMockSms.UnregisterSMSRecoverListener(userId); EXPECT_EQ(resultCode, ERR_OK); } @@ -246,25 +310,39 @@ HWTEST(MockSessionManagerServiceTest, UnregisterSMSRecoverListener, TestSize.Lev */ HWTEST(MockSessionManagerServiceTest, RegisterSMSLiteRecoverListener, TestSize.Level1) { + MockMockSessionManagerService mockMockSms; sptr listener = nullptr; int32_t userId = 100; // 1. listener 为 nullptr - ErrCode resultCode = RegisterSMSLiteRecoverListener(listener, userId); + ErrCode resultCode = mockMockSms.RegisterSMSLiteRecoverListener(listener, userId); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); listener = sptr::MakeSptr(); userId = INVALID_USER_ID; - resultCode = RegisterSMSLiteRecoverListener(listener, userId); + resultCode = mockMockSms.RegisterSMSLiteRecoverListener(listener, userId); EXPECT_EQ(resultCode, ERR_OK); - - SetMockUserId(0); + // 3.Mock GetUserIdByCallingUid() 返回系统用户id 0 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); listener = sptr::MakeSptr(); userId = 100; - resultCode = RegisterSMSLiteRecoverListener(listener, userId); - EXPECT_EQ(resultCode, ERR_OK); + resultCode = mockMockSms.RegisterSMSLiteRecoverListener(listener, userId); + EXPECT_EQ(resultCode, 4194312); + + // 4.Mock GetUserIdByCallingUid() 返回非系统用户id 100 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(100)); + listener = sptr::MakeSptr(); + userId = INVALID_USER_ID; + resultCode = mockMockSms.RegisterSMSLiteRecoverListener(listener, userId); + EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); } /** @@ -274,15 +352,29 @@ HWTEST(MockSessionManagerServiceTest, RegisterSMSLiteRecoverListener, TestSize.L */ HWTEST(MockSessionManagerServiceTest, UnregisterSMSLiteRecoverListener, TestSize.Level1) { - int32_t userId = INVALID_USER_ID; + MockMockSessionManagerService mockMockSms; // 1.Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); - ErrCode resultCode = UnregisterSMSLiteRecoverListener(userId); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); + int32_t userId = INVALID_USER_ID; + ErrCode resultCode = mockMockSms.UnregisterSMSLiteRecoverListener(userId); EXPECT_EQ(resultCode, ERR_OK); - SetMockUserId(0); + // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); userId = 100; - resultCode = UnregisterSMSLiteRecoverListener(userId); + resultCode = mockMockSms.UnregisterSMSLiteRecoverListener(userId); + EXPECT_EQ(resultCode, 4194312); + + // 3.Mock GetUserIdByCallingUid() 返回非系统用户id 100 + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(100)); + userId = INVALID_USER_ID; + resultCode = mockMockSms.UnregisterSMSLiteRecoverListener(userId); EXPECT_EQ(resultCode, ERR_OK); } @@ -294,20 +386,32 @@ HWTEST(MockSessionManagerServiceTest, UnregisterSMSLiteRecoverListener, TestSize HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailable, TestSize.Level1) { // 1.Mock IsSystemCalling返回fasle - ErrCode resultCode = NotifySceneBoardAvailable(); + MockMockSessionManagerService mockMockSms; + MockAccesstokenKit::MockIsSystemApp(false); + MockAccesstokenKit::MockIsSACalling(false); + ErrCode resultCode = mockMockSms.NotifySceneBoardAvailable(); EXPECT_EQ(resultCode, ERR_PERMISSION_DENIED); // 2. Mock IsSystemCalling返回true + MockAccesstokenKit::MockIsSystemApp(true); + MockAccesstokenKit::MockIsSACalling(true); // Mock GetUserIdByCallingUid() 返回非法用户-1 - resultCode = NotifySceneBoardAvailable(); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(-1)); + resultCode = mockMockSms.NotifySceneBoardAvailable(); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); // 2. Mock IsSystemCalling返回true + MockAccesstokenKit::MockIsSystemApp(true); + MockAccesstokenKit::MockIsSACalling(true); // Mock GetUserIdByCallingUid() 返回合法用户100 - resultCode = NotifySceneBoardAvailable(); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(100)); + resultCode = mockMockSms.NotifySceneBoardAvailable(); EXPECT_EQ(resultCode, ERR_OK); } -} /** * @tc.name: NotifySceneBoardAvailableToSystemAppClient @@ -317,7 +421,8 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailable, TestSize.Level1 HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppClient, TestSize.Level1) { int32_t userId = 100; - NotifySceneBoardAvailableToSystemAppClient(userId); + MockMockSessionManagerService mockMockSms; + mockMockSms.NotifySceneBoardAvailableToSystemAppClient(userId); } /** @@ -328,7 +433,8 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppClient HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToClient, TestSize.Level1) { int32_t userId = 100; - NotifySceneBoardAvailableToClient(userId); + MockMockSessionManagerService mockMockSms; + mockMockSms.NotifySceneBoardAvailableToClient(userId); } /** @@ -339,7 +445,8 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToClient, TestSiz HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppLiteClient, TestSize.Level1) { int32_t userId = 100; - NotifySceneBoardAvailableToSystemAppLiteClient(userId); + MockMockSessionManagerService mockMockSms; + mockMockSms.NotifySceneBoardAvailableToSystemAppLiteClient(userId); } /** @@ -350,7 +457,8 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppLiteCl HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToLiteClient, TestSize.Level1) { int32_t userId = 100; - NotifySceneBoardAvailableToLiteClient(userId); + MockMockSessionManagerService mockMockSms; + mockMockSms.NotifySceneBoardAvailableToLiteClient(userId); } /** @@ -363,7 +471,8 @@ HWTEST(MockSessionManagerServiceTest, NotifyWMSConnected, TestSize.Level1) int32_t userId = 100; int32_t screenId = 0; bool isColdStart = false; - NotifyWMSConnected(userId, screenId, isColdStart); + MockMockSessionManagerService mockMockSms; + mockMockSms.NotifyWMSConnected(userId, screenId, isColdStart); } /** @@ -376,7 +485,8 @@ HWTEST(MockSessionManagerServiceTest, NotifyWMSConnectionChangedToClient, TestSi int32_t wmsUserId = 100; int32_t screenId = 0; bool isConnnected = true; - NotifyWMSConnectionChangedToClient(wmsUserId, screenId, isConnnected); + MockMockSessionManagerService mockMockSms; + mockMockSms.NotifyWMSConnectionChangedToClient(wmsUserId, screenId, isConnnected); } /** @@ -389,10 +499,10 @@ HWTEST(MockSessionManagerServiceTest, NotifyWMSConnectionChangedToLiteClient, Te int32_t wmsUserId = 100; int32_t screenId = 0; bool isConnnected = true; - NotifyWMSConnectionChangedToLiteClient(wmsUserId, screenId, isConnnected); + MockMockSessionManagerService mockMockSms; + mockMockSms.NotifyWMSConnectionChangedToLiteClient(wmsUserId, screenId, isConnnected); } - /** * @tc.name: GetSceneSessionManagerCommon * @tc.desc: test the function of GetSceneSessionManagerCommon @@ -403,56 +513,108 @@ HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon, TestSize.Lev sptr result; bool isLite = false; // Mock GetUserIdByCallingUid() 返回非法用户id -1 - SetMockUserId(-1); - ErrCode resultCode = MockSessionManagerService::GetInstance().GetSceneSessionManagerCommon(100, result, isLite); + MockMockSessionManagerService mockMockSms; + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(-1)); + ErrCode resultCode = mockMockSms.GetSceneSessionManagerCommon(100, result, isLite); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); // Mock GetUserIdByCallingUid() 返回非系统用户id 100 - SetMockUserId(100); - ErrCode resultCode = GetSceneSessionManagerCommon(200, result, isLite); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(100)); + resultCode = mockMockSms.GetSceneSessionManagerCommon(200, result, isLite); EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); // Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); // Mock GetSessionManagerServiceByUserId() 返回nullptr 或者 传入不存在userId 99999 - ErrCode resultCode = GetSceneSessionManagerCommon(99999, result, isLite); + resultCode = mockMockSms.GetSceneSessionManagerCommon(99999, result, isLite); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); +} - // Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); - // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // Mock iface_cast 返回nullptr - ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); - EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); - - isLite = false; - // Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); - // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // Mock iface_cast 返回有效代理 - ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); - EXPECT_EQ(resultCode, ERR_OK); - EXPECT_NQ(result, nullptr); - - isLite = true; - // Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); - // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // Mock iface_cast 返回有效代理 - ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); - EXPECT_EQ(resultCode, ERR_OK); - EXPECT_NQ(result, nullptr); - - isLite = false; - // Mock GetUserIdByCallingUid() 返回系统用户id 0 - SetMockUserId(0); - // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // Mock iface_cast 返回有效代理 - // Mock GetSceneSessionManager() 返回nullptr - ErrCode resultCode = GetSceneSessionManagerCommon(100, result, isLite); - EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); +/** + * @tc.name: GetSceneSessionManagerCommon1 + * @tc.desc: test the function of GetSceneSessionManagerCommon1 + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon1, TestSize.Level1) +{ + // crash + // sptr result; + // bool isLite = false; + // // Mock GetUserIdByCallingUid() 返回合法用户id 102 + // MockMockSessionManagerService mockMockSms; + // // 设置 102 -> sessionManagerService + // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + // .Times(1) + // .WillOnce(Return(102)); + // sptr sessionManagerService = sptr::MakeSptr(); + // mockMockSms.SetSessionManagerService(sessionManagerService); + + // // Mock GetUserIdByCallingUid() 返回系统用户id 0 + // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + // .Times(1) + // .WillOnce(Return(0)); + // // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // // Mock iface_cast 返回nullptr + // ErrCode resultCode = mockMockSms.GetSceneSessionManagerCommon(102, result, isLite); + // EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); } +/** + * @tc.name: GetSceneSessionManagerCommon2 + * @tc.desc: test the function of GetSceneSessionManagerCommon2 + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon2, TestSize.Level1) +{ + // crash + // sptr result; + // isLite = false; + // MockMockSessionManagerService mockMockSms; + // // 设置 103 -> sessionManagerService + // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + // .Times(1) + // .WillOnce(Return(103)); + // sptr sessionManagerService = sptr::MakeSptr(); + // mockMockSms.SetSessionManagerService(sessionManagerService); + + // // Mock GetUserIdByCallingUid() 返回系统用户id 0 + // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + // .Times(1) + // .WillOnce(Return(0)); + // // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // // Mock iface_cast 返回有效代理 + // isLite = false; + // ErrCode resultCode = mockMockSms.GetSceneSessionManagerCommon(103, result, isLite); + // EXPECT_EQ(resultCode, ERR_OK); + + // // Mock GetUserIdByCallingUid() 返回系统用户id 0 + // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + // .Times(1) + // .WillOnce(Return(0)); + // // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // // Mock iface_cast 返回有效代理 + // isLite = true; + // resultCode = mockMockSms.GetSceneSessionManagerCommon(103, result, isLite); + // EXPECT_EQ(resultCode, ERR_OK); + + // isLite = false; + // // Mock GetUserIdByCallingUid() 返回系统用户id 0 + // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + // .Times(1) + // .WillOnce(Return(0)); + // // Mock GetSessionManagerServiceByUserId() 返回有效指针 + // // Mock iface_cast 返回有效代理 + // // Mock GetSceneSessionManager() 返回nullptr + // resultCode = mockMockSms.GetSceneSessionManagerCommon(103, result, isLite); + // EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); + // EXPECT_EQ(resultCode, nullptr); +} } // namespace } // namespace Rosen -} // namespace OHOSHOPEFU \ No newline at end of file +} // namespace OHOS \ No newline at end of file -- Gitee From 90be053be866a60a0fb58ff3d39d9153737fefc6 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Sun, 31 Aug 2025 16:40:19 +0800 Subject: [PATCH 34/38] tdd add Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../mock_session_manager_service_test.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/window_scene/test/unittest/mock_session_manager_service_test.cpp b/window_scene/test/unittest/mock_session_manager_service_test.cpp index 0bc949731f..cafe410f81 100644 --- a/window_scene/test/unittest/mock_session_manager_service_test.cpp +++ b/window_scene/test/unittest/mock_session_manager_service_test.cpp @@ -37,7 +37,7 @@ public: NotifySCBSnapshotSkipByUserIdAndBundleNames, (int32_t, const std::vector&, const sptr&), (override)); - MOCK_METHOD(int32_t, GetUserIdByCallingUid, (), (override)); + MOCK_METHOD(int32_t, GetUserIdByCallingUid, (), (override)); }; namespace { @@ -151,7 +151,7 @@ HWTEST(MockSessionManagerServiceTest, SetSessionManagerServiceFailed, TestSize.L .Times(1) .WillOnce(Return(-1)); result = mockMockSms.SetSessionManagerService(mockSessionManagerService); - EXPECT_EQ(resultCode, false); + EXPECT_EQ(result, false); } /** @@ -169,7 +169,7 @@ HWTEST(MockSessionManagerServiceTest, SetSessionManagerServiceSuccess, TestSize. // .Times(1) // .WillOnce(Return(100)); // bool result = mockMockSms.SetSessionManagerService(mockSessionManagerService); - // EXPECT_EQ(result, false); + // EXPECT_EQ(result, true); } /** @@ -220,11 +220,11 @@ HWTEST(MockSessionManagerServiceTest, GetSessionManagerServiceByUserId, TestSize resultCode = mockMockSms.GetSessionManagerServiceByUserId(userId, sessionManagerService); EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); - // 2. Mock GetUserIdByCallingUid() 返回非系统用户id 0 + // 2. Mock GetUserIdByCallingUid() 返回系统用户id 0 EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) .Times(1) .WillOnce(Return(0)); - resultCode = mockMockSms.GetSessionManagerServiceByUserId(sessionManagerService); + resultCode = mockMockSms.GetSessionManagerServiceByUserId(userId, sessionManagerService); EXPECT_EQ(resultCode, ERR_OK); } @@ -267,7 +267,7 @@ HWTEST(MockSessionManagerServiceTest, RegisterSMSRecoverListener, TestSize.Level listener = sptr::MakeSptr(); userId = INVALID_USER_ID; resultCode = mockMockSms.RegisterSMSRecoverListener(listener, userId); - EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); + EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); } /** @@ -342,7 +342,7 @@ HWTEST(MockSessionManagerServiceTest, RegisterSMSLiteRecoverListener, TestSize.L listener = sptr::MakeSptr(); userId = INVALID_USER_ID; resultCode = mockMockSms.RegisterSMSLiteRecoverListener(listener, userId); - EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); + EXPECT_EQ(resultCode, ERR_WOULD_BLOCK); } /** @@ -574,7 +574,7 @@ HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon2, TestSize.Le { // crash // sptr result; - // isLite = false; + // bool isLite = false; // MockMockSessionManagerService mockMockSms; // // 设置 103 -> sessionManagerService // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) @@ -613,7 +613,7 @@ HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon2, TestSize.Le // // Mock GetSceneSessionManager() 返回nullptr // resultCode = mockMockSms.GetSceneSessionManagerCommon(103, result, isLite); // EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); - // EXPECT_EQ(resultCode, nullptr); + // EXPECT_EQ(result, nullptr); } } // namespace } // namespace Rosen -- Gitee From 535da557c16b9aceb60df22b7d7ed4817d369c3f Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Sun, 31 Aug 2025 16:56:04 +0800 Subject: [PATCH 35/38] tdd add Signed-off-by: WenJunYuan <1903700887@qq.com> --- window_scene/test/unittest/BUILD.gn | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/window_scene/test/unittest/BUILD.gn b/window_scene/test/unittest/BUILD.gn index e2a1f2abe4..fb4f5f9c5c 100644 --- a/window_scene/test/unittest/BUILD.gn +++ b/window_scene/test/unittest/BUILD.gn @@ -1355,7 +1355,10 @@ ohos_unittest("ws_mock_session_manager_service_test") { include_dirs = [ "../mock" ] - sources = [ "mock_session_manager_service_test.cpp" ] + sources = [ + "${window_base_path}/window_scene/test/mock/mock_accesstoken_kit.cpp", + "mock_session_manager_service_test.cpp" + ] deps = [ ":ws_unittest_common", -- Gitee From 376266c47e2e02356dc1e702234110f570d557ac Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Sun, 31 Aug 2025 19:02:07 +0800 Subject: [PATCH 36/38] tdd add Signed-off-by: WenJunYuan <1903700887@qq.com> --- .../mock_session_manager_service_test.cpp | 100 +----------------- .../include/mock_session_manager_service.h | 4 +- wmserver/src/mock_session_manager_service.cpp | 39 +++---- 3 files changed, 23 insertions(+), 120 deletions(-) diff --git a/window_scene/test/unittest/mock_session_manager_service_test.cpp b/window_scene/test/unittest/mock_session_manager_service_test.cpp index cafe410f81..87d5b75d9b 100644 --- a/window_scene/test/unittest/mock_session_manager_service_test.cpp +++ b/window_scene/test/unittest/mock_session_manager_service_test.cpp @@ -37,7 +37,7 @@ public: NotifySCBSnapshotSkipByUserIdAndBundleNames, (int32_t, const std::vector&, const sptr&), (override)); - MOCK_METHOD(int32_t, GetUserIdByCallingUid, (), (override)); + MOCK_METHOD(int32_t, GetUserIdByCallingUid, (), (override)); }; namespace { @@ -154,24 +154,6 @@ HWTEST(MockSessionManagerServiceTest, SetSessionManagerServiceFailed, TestSize.L EXPECT_EQ(result, false); } -/** - * @tc.name: SetSessionManagerServiceSuccess - * @tc.desc: test the function of SetSessionManagerServiceSuccess - * @tc.type: FUNC - */ -HWTEST(MockSessionManagerServiceTest, SetSessionManagerServiceSuccess, TestSize.Level1) -{ - // crash - // MockMockSessionManagerService mockMockSms; - // sptr mockSessionManagerService = sptr::MakeSptr(); - // // Mock GetUserIdByCallingUid() 返回合法用户id 100 - // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) - // .Times(1) - // .WillOnce(Return(100)); - // bool result = mockMockSms.SetSessionManagerService(mockSessionManagerService); - // EXPECT_EQ(result, true); -} - /** * @tc.name: GetSessionManagerService * @tc.desc: test the function of GetSessionManagerService @@ -535,86 +517,6 @@ HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon, TestSize.Lev resultCode = mockMockSms.GetSceneSessionManagerCommon(99999, result, isLite); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); } - -/** - * @tc.name: GetSceneSessionManagerCommon1 - * @tc.desc: test the function of GetSceneSessionManagerCommon1 - * @tc.type: FUNC - */ -HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon1, TestSize.Level1) -{ - // crash - // sptr result; - // bool isLite = false; - // // Mock GetUserIdByCallingUid() 返回合法用户id 102 - // MockMockSessionManagerService mockMockSms; - // // 设置 102 -> sessionManagerService - // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) - // .Times(1) - // .WillOnce(Return(102)); - // sptr sessionManagerService = sptr::MakeSptr(); - // mockMockSms.SetSessionManagerService(sessionManagerService); - - // // Mock GetUserIdByCallingUid() 返回系统用户id 0 - // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) - // .Times(1) - // .WillOnce(Return(0)); - // // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // // Mock iface_cast 返回nullptr - // ErrCode resultCode = mockMockSms.GetSceneSessionManagerCommon(102, result, isLite); - // EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); -} - -/** - * @tc.name: GetSceneSessionManagerCommon2 - * @tc.desc: test the function of GetSceneSessionManagerCommon2 - * @tc.type: FUNC - */ -HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon2, TestSize.Level1) -{ - // crash - // sptr result; - // bool isLite = false; - // MockMockSessionManagerService mockMockSms; - // // 设置 103 -> sessionManagerService - // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) - // .Times(1) - // .WillOnce(Return(103)); - // sptr sessionManagerService = sptr::MakeSptr(); - // mockMockSms.SetSessionManagerService(sessionManagerService); - - // // Mock GetUserIdByCallingUid() 返回系统用户id 0 - // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) - // .Times(1) - // .WillOnce(Return(0)); - // // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // // Mock iface_cast 返回有效代理 - // isLite = false; - // ErrCode resultCode = mockMockSms.GetSceneSessionManagerCommon(103, result, isLite); - // EXPECT_EQ(resultCode, ERR_OK); - - // // Mock GetUserIdByCallingUid() 返回系统用户id 0 - // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) - // .Times(1) - // .WillOnce(Return(0)); - // // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // // Mock iface_cast 返回有效代理 - // isLite = true; - // resultCode = mockMockSms.GetSceneSessionManagerCommon(103, result, isLite); - // EXPECT_EQ(resultCode, ERR_OK); - - // isLite = false; - // // Mock GetUserIdByCallingUid() 返回系统用户id 0 - // EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) - // .Times(1) - // .WillOnce(Return(0)); - // // Mock GetSessionManagerServiceByUserId() 返回有效指针 - // // Mock iface_cast 返回有效代理 - // // Mock GetSceneSessionManager() 返回nullptr - // resultCode = mockMockSms.GetSceneSessionManagerCommon(103, result, isLite); - // EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); - // EXPECT_EQ(result, nullptr); -} } // namespace } // namespace Rosen } // namespace OHOS \ No newline at end of file diff --git a/wmserver/include/mock_session_manager_service.h b/wmserver/include/mock_session_manager_service.h index 47e634ac4b..2095af0ee2 100644 --- a/wmserver/include/mock_session_manager_service.h +++ b/wmserver/include/mock_session_manager_service.h @@ -162,10 +162,10 @@ private: std::map>> smsLiteRecoverListenerMap_; std::shared_mutex systemAppSmsRecoverListenerLock_; - std::map>> + std::map>> systemAppSmsRecoverListenerMap_; std::shared_mutex systemAppSmsLiteRecoverListenerLock_; - std::map>> + std::map>> systemAppSmsLiteRecoverListenerMap_; /* diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index 430629c2ec..bfe584baeb 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -285,7 +285,7 @@ ErrCode MockSessionManagerService::GetSessionManagerServiceByUserId(int32_t user sptr& sessionManagerService) { int32_t clientUserId = GetUserIdByCallingUid(); - TLOGI(WmsLogTag::WMS_MULTI_USER, "GetSessionManagerServiceByUserId, userId: %{public}d, clientUserId: %{public}d", + TLOGI(WmsLogTag::WMS_MULTI_USER, "GetSessionManagerServiceByUserId, userId: %{public}d, clientUserId: %{public}d", userId, clientUserId); if (clientUserId <= INVALID_USER_ID) { TLOGE(WmsLogTag::WMS_MULTI_USER, "userId is illegal: %{public}d", clientUserId); @@ -357,7 +357,7 @@ ErrCode MockSessionManagerService::RegisterSMSRecoverListener(const sptr clientDeathListener = + sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, false); listener->AddDeathRecipient(clientDeathListener); sptr smsListener; @@ -431,7 +431,7 @@ ErrCode MockSessionManagerService::UnregisterSMSRecoverListener(int32_t userId) void MockSessionManagerService::UnregisterSMSRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { - TLOGI(WmsLogTag::WMS_RECOVER, + TLOGI(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, pid = %{public}d, displayId = %{public}d", clientUserId, pid, displayId); if (clientUserId == SYSTEM_USERID) { std::unique_lock lock(systemAppSmsRecoverListenerLock_); @@ -494,7 +494,7 @@ ErrCode MockSessionManagerService::RegisterSMSLiteRecoverListener(const sptr clientDeathListener = + sptr clientDeathListener = new ClientListenerDeathRecipient(clientUserId, displayId, pid, true); listener->AddDeathRecipient(clientDeathListener); sptr smsListener; @@ -524,7 +524,7 @@ std::map>* MockSessionManag return nullptr; } -std::map>* +std::map>* MockSessionManagerService::GetSystemAppSMSLiteRecoverListenerMap(int32_t displayId) { auto iter = systemAppSmsLiteRecoverListenerMap_.find(displayId); @@ -535,7 +535,7 @@ std::map>* } ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t userId) -{ +{ TLOGI(WmsLogTag::WMS_RECOVER, "userId = %{public}d,", userId); int32_t clientUserId = GetUserIdByCallingUid(); @@ -568,7 +568,7 @@ ErrCode MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t user void MockSessionManagerService::UnregisterSMSLiteRecoverListener(int32_t clientUserId, int32_t displayId, int32_t pid) { - TLOGI(WmsLogTag::WMS_RECOVER, + TLOGI(WmsLogTag::WMS_RECOVER, "clientUserId = %{public}d, pid = %{public}d, displayId = %{public}d", clientUserId, pid, displayId); if (clientUserId == SYSTEM_USERID) { std::unique_lock lock(systemAppSmsLiteRecoverListenerLock_); @@ -673,7 +673,7 @@ void MockSessionManagerService::NotifySceneBoardAvailableToClient(int32_t userId } void MockSessionManagerService::NotifySceneBoardAvailableToSystemAppLiteClient(int32_t userId) -{ +{ int32_t displayId = DEFAULT_SCREEN_ID; { std::lock_guard lock(userId2ScreenIdMapMutex_); @@ -770,7 +770,7 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToClient( TLOGE(WmsLogTag::WMS_MULTI_USER, "systemAppSmsRecoverListenerMap is null"); return; } - TLOGI(WmsLogTag::WMS_MULTI_USER, + TLOGI(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", wmsUserId, isConnected, systemAppSmsRecoverListenerMap->size()); auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); @@ -796,9 +796,9 @@ void MockSessionManagerService::NotifyWMSConnectionChangedToLiteClient( TLOGE(WmsLogTag::WMS_MULTI_USER, "systemAppSmsLiteRecoverListenerMap is null"); return; } - TLOGI(WmsLogTag::WMS_MULTI_USER, + TLOGI(WmsLogTag::WMS_MULTI_USER, "wmsUserId = %{public}d, isConnected = %{public}d, remote process count = %{public}zu", - wmsUserId, isConnected, systemAppSmsLiteRecoverListenerMap->size()); + wmsUserId, isConnected, systemAppSmsLiteRecoverListenerMap->size()); auto sessionManagerService = GetSessionManagerServiceByUserId(wmsUserId); if (sessionManagerService == nullptr) { TLOGE(WmsLogTag::WMS_RECOVER, "SessionManagerService is null"); @@ -1115,10 +1115,10 @@ ErrCode MockSessionManagerService::GetSceneSessionManagerCommon( } if (result == nullptr) { - TLOGE(WmsLogTag::WMS_MULTI_USER, + TLOGE(WmsLogTag::WMS_MULTI_USER, "Get scene session manager proxy failed, scene session manager service is null," - "userId: %{public}d, isLite: %{public}d", - userId, isLite); + "userId: %{public}d, isLite: %{public}d", + userId, isLite); return ERR_DEAD_OBJECT; } return ERR_OK; @@ -1234,20 +1234,21 @@ ErrCode MockSessionManagerService::ValidateParameters(int32_t clientUserId, int3 return ERR_OK; } -ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const +ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userId, DisplayId& displayId) const { - displayId = DISPLAY_ID_INVALID; + displayId = DISPLAY_ID_INVALID; ErrCode err = AccountSA::OsAccountManager::GetForegroundOsAccountDisplayId(userId, displayId); TLOGI(WmsLogTag::WMS_RECOVER, "displayId: %{public}" PRIu64, displayId); if (err != ERR_OK) { - TLOGE(WmsLogTag::WMS_RECOVER, + TLOGE(WmsLogTag::WMS_RECOVER, "get user display failed, errorCode: %{public}d, userId %{public}d", err, userId); } return err; } -ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, - const sptr& smsListener) { +ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, + const sptr& smsListener) +{ bool isWMSConnected = false; { std::lock_guard lock(wmsConnectionStatusLock_); -- Gitee From 7ceaff283df9888eec27361a5ae89fb5fb9a46bd Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Sun, 31 Aug 2025 19:10:07 +0800 Subject: [PATCH 37/38] tdd add Signed-off-by: WenJunYuan <1903700887@qq.com> --- wmserver/src/mock_session_manager_service.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wmserver/src/mock_session_manager_service.cpp b/wmserver/src/mock_session_manager_service.cpp index bfe584baeb..0e8841219d 100644 --- a/wmserver/src/mock_session_manager_service.cpp +++ b/wmserver/src/mock_session_manager_service.cpp @@ -387,7 +387,7 @@ std::map>* MockSessionManag return nullptr; } -std::map>* +std::map>* MockSessionManagerService::GetSystemAppSMSRecoverListenerMap(int32_t displayId) { auto iter = systemAppSmsRecoverListenerMap_.find(displayId); @@ -1247,7 +1247,7 @@ ErrCode MockSessionManagerService::GetForegroundOsAccountDisplayId(int32_t userI } ErrCode MockSessionManagerService::NotifyWMSConnectionStatus(int32_t userId, - const sptr& smsListener) + const sptr& smsListener) { bool isWMSConnected = false; { -- Gitee From f90281d52b8cfed8c8f22afae84c02778872c146 Mon Sep 17 00:00:00 2001 From: WenJunYuan <1903700887@qq.com> Date: Wed, 3 Sep 2025 15:46:22 +0800 Subject: [PATCH 38/38] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mock_session_manager_service_test.cpp | 144 +++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/window_scene/test/unittest/mock_session_manager_service_test.cpp b/window_scene/test/unittest/mock_session_manager_service_test.cpp index 87d5b75d9b..849e7e95a7 100644 --- a/window_scene/test/unittest/mock_session_manager_service_test.cpp +++ b/window_scene/test/unittest/mock_session_manager_service_test.cpp @@ -13,7 +13,12 @@ * limitations under the License. */ + +#define private public +#define protected public #include "mock_session_manager_service.h" +#undef private +#undef protected #include #include @@ -22,7 +27,7 @@ #include "scene_session_manager.h" #include "session_manager_service_proxy.h" -#include "../mock/mock_accesstoken_kit.h" +#include "mock_accesstoken_kit.h" #include "wm_common.h" using namespace testing; @@ -268,6 +273,15 @@ HWTEST(MockSessionManagerServiceTest, UnregisterSMSRecoverListener, TestSize.Lev ErrCode resultCode = mockMockSms.UnregisterSMSRecoverListener(userId); EXPECT_EQ(resultCode, ERR_OK); + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); + std::map> systemAppSmsRecoverListenerMap; + systemAppSmsRecoverListenerMap[999090] = nullptr; + mockMockSms.systemAppSmsRecoverListenerMap_[0] = systemAppSmsRecoverListenerMap; + resultCode = mockMockSms.UnregisterSMSRecoverListener(userId); + EXPECT_EQ(resultCode, ERR_OK); + // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) .Times(1) @@ -343,6 +357,15 @@ HWTEST(MockSessionManagerServiceTest, UnregisterSMSLiteRecoverListener, TestSize ErrCode resultCode = mockMockSms.UnregisterSMSLiteRecoverListener(userId); EXPECT_EQ(resultCode, ERR_OK); + std::map> systemAppSmsLiteRecoverListenerMap; + systemAppSmsLiteRecoverListenerMap[999090] = nullptr; + mockMockSms.systemAppSmsLiteRecoverListenerMap_[0] = systemAppSmsLiteRecoverListenerMap; + EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) + .Times(1) + .WillOnce(Return(0)); + resultCode = mockMockSms.UnregisterSMSLiteRecoverListener(userId); + EXPECT_EQ(resultCode, ERR_OK); + // 2.Mock GetUserIdByCallingUid() 返回系统用户id 0 EXPECT_CALL(mockMockSms, GetUserIdByCallingUid()) .Times(1) @@ -405,6 +428,18 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppClient int32_t userId = 100; MockMockSessionManagerService mockMockSms; mockMockSms.NotifySceneBoardAvailableToSystemAppClient(userId); + + mockMockSms.userId2ScreenIdMap_[100] = 0; + std::map> systemAppSmsRecoverListenerMap; + systemAppSmsRecoverListenerMap[999090] = nullptr; + mockMockSms.systemAppSmsRecoverListenerMap_[0] = systemAppSmsRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToSystemAppClient(userId); + + mockMockSms.sessionManagerServiceMap_[100] = sptr::MakeSptr(); + sptr mockRemoteObject = sptr::MakeSptr(); + systemAppSmsRecoverListenerMap[999090] = iface_cast(mockRemoteObject); + mockMockSms.systemAppSmsRecoverListenerMap_[0] = systemAppSmsRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToSystemAppClient(userId); } /** @@ -417,6 +452,17 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToClient, TestSiz int32_t userId = 100; MockMockSessionManagerService mockMockSms; mockMockSms.NotifySceneBoardAvailableToClient(userId); + + std::map> smsRecoverListenerMap; + smsRecoverListenerMap[999090] = nullptr; + mockMockSms.smsRecoverListenerMap_[0] = smsRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToClient(userId); + + mockMockSms.sessionManagerServiceMap_[100] = sptr::MakeSptr(); + sptr mockRemoteObject = sptr::MakeSptr(); + smsRecoverListenerMap[999090] = iface_cast(mockRemoteObject); + mockMockSms.smsRecoverListenerMap_[0] = smsRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToClient(userId); } /** @@ -429,6 +475,18 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToSystemAppLiteCl int32_t userId = 100; MockMockSessionManagerService mockMockSms; mockMockSms.NotifySceneBoardAvailableToSystemAppLiteClient(userId); + + mockMockSms.userId2ScreenIdMap_[100] = 0; + std::map> systemAppSmsLiteRecoverListenerMap; + systemAppSmsLiteRecoverListenerMap[999090] = nullptr; + mockMockSms.systemAppSmsLiteRecoverListenerMap_[0] = systemAppSmsLiteRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToSystemAppLiteClient(userId); + + mockMockSms.sessionManagerServiceMap_[100] = sptr::MakeSptr(); + sptr mockRemoteObject = sptr::MakeSptr(); + systemAppSmsRecoverListenerMap[999090] = iface_cast(mockRemoteObject); + mockMockSms.systemAppSmsLiteRecoverListenerMap_[0] = systemAppSmsLiteRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToSystemAppLiteClient(userId); } /** @@ -441,6 +499,17 @@ HWTEST(MockSessionManagerServiceTest, NotifySceneBoardAvailableToLiteClient, Tes int32_t userId = 100; MockMockSessionManagerService mockMockSms; mockMockSms.NotifySceneBoardAvailableToLiteClient(userId); + + std::map> smsLiteRecoverListenerMap; + smsLiteRecoverListenerMap[999090] = nullptr; + mockMockSms.smsLiteRecoverListenerMap_[0] = smsLiteRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToLiteClient(userId); + + mockMockSms.sessionManagerServiceMap_[100] = sptr::MakeSptr(); + sptr mockRemoteObject = sptr::MakeSptr(); + smsLiteRecoverListenerMap[999090] = iface_cast(mockRemoteObject); + mockMockSms.smsLiteRecoverListenerMap_[0] = smsLiteRecoverListenerMap; + mockMockSms.NotifySceneBoardAvailableToLiteClient(userId); } /** @@ -469,6 +538,18 @@ HWTEST(MockSessionManagerServiceTest, NotifyWMSConnectionChangedToClient, TestSi bool isConnnected = true; MockMockSessionManagerService mockMockSms; mockMockSms.NotifyWMSConnectionChangedToClient(wmsUserId, screenId, isConnnected); + + mockMockSms.userId2ScreenIdMap_[100] = 0; + std::map> systemAppSmsRecoverListenerMap; + systemAppSmsRecoverListenerMap[999090] = nullptr; + mockMockSms.systemAppSmsRecoverListenerMap_[0] = systemAppSmsRecoverListenerMap; + mockMockSms.NotifyWMSConnectionChangedToClient(wmsUserId, screenId, isConnnected); + + mockMockSms.sessionManagerServiceMap_[100] = sptr::MakeSptr(); + sptr mockRemoteObject = sptr::MakeSptr(); + systemAppSmsRecoverListenerMap[999090] = iface_cast(mockRemoteObject); + mockMockSms.systemAppSmsRecoverListenerMap_[0] = systemAppSmsRecoverListenerMap; + mockMockSms.NotifyWMSConnectionChangedToClient(wmsUserId, screenId, isConnnected); } /** @@ -483,6 +564,18 @@ HWTEST(MockSessionManagerServiceTest, NotifyWMSConnectionChangedToLiteClient, Te bool isConnnected = true; MockMockSessionManagerService mockMockSms; mockMockSms.NotifyWMSConnectionChangedToLiteClient(wmsUserId, screenId, isConnnected); + + mockMockSms.userId2ScreenIdMap_[100] = 0; + std::map> systemAppSmsLiteRecoverListenerMap; + systemAppSmsLiteRecoverListenerMap[999090] = nullptr; + mockMockSms.systemAppSmsLiteRecoverListenerMap_[0] = systemAppSmsLiteRecoverListenerMap; + mockMockSms.NotifyWMSConnectionChangedToLiteClient(wmsUserId, screenId, isConnnected); + + mockMockSms.sessionManagerServiceMap_[100] = sptr::MakeSptr(); + sptr mockRemoteObject = sptr::MakeSptr(); + systemAppSmsLiteRecoverListenerMap[999090] = iface_cast(mockRemoteObject); + mockMockSms.systemAppSmsLiteRecoverListenerMap_[0] = systemAppSmsLiteRecoverListenerMap; + mockMockSms.NotifyWMSConnectionChangedToLiteClient(wmsUserId, screenId, isConnnected); } /** @@ -517,6 +610,55 @@ HWTEST(MockSessionManagerServiceTest, GetSceneSessionManagerCommon, TestSize.Lev resultCode = mockMockSms.GetSceneSessionManagerCommon(99999, result, isLite); EXPECT_EQ(resultCode, ERR_INVALID_VALUE); } + +/** + * @tc.name: DefaultSceneSessionManager + * @tc.desc: test the function of DefaultSceneSessionManager + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, DefaultSceneSessionManager, TestSize.Level1) +{ + MockMockSessionManagerService mockMockSms; + mockMockSms.defaultWMSUserId_ = 100; + mockMockSms.sessionManagerServiceMap_[100] = sptr::MakeSptr(); + mockMockSms.defaultSceneSessionManager_ = sptr::MakeSptr(); + + std::vector args = {"arg1"}; + std::string info = "info"; + std::string& dumpInfo = info; + mockMockSms.DumpSessionInfo(args, dumpInfo); + std::vector windowIdList = {111, 222}; + std::vector surfaceNodeIds = {111, 222}; + std::vector persistentIds = {111, 222}; + std::vector privacyWindowTags = {"tag1", "tag2"}; + mockMockSms.GetProcessSurfaceNodeIdByPersistentId(123, windowIdList, surfaceNodeIds); + mockMockSms.AddSkipSelfWhenShowOnVirtualScreenList(persistentIds); + mockMockSms.RemoveSkipSelfWhenShowOnVirtualScreenList(persistentIds); + mockMockSms.SetScreenPrivacyWindowTagSwitch(0, privacyWindowTags, false); +} + +/** + * @tc.name: NotifyWMSConnectionStatus + * @tc.desc: test the function of NotifyWMSConnectionStatus + * @tc.type: FUNC + */ +HWTEST(MockSessionManagerServiceTest, NotifyWMSConnectionStatus, TestSize.Level1) +{ + MockMockSessionManagerService mockMockSms; + int32_t userId = 100; + mockMockSms.wmsConnectionStatusMap_[userId] = true; + + sptr mockRemoteObject = sptr::MakeSptr(); + sptr smsListener = + iface_cast(mockRemoteObject); + ErrCode errCode = mockMockSms.NotifyWMSConnectionStatus(userId, smsListener); + EXPECT_EQ(resultCode, ERR_DEAD_OBJECT); + + mockMockSms.sessionManagerServiceMap_[userId] = sptr::MakeSptr<(); + mockMockSms.userId2ScreenIdMap_[userId] = 0; + errCode = mockMockSms.NotifyWMSConnectionStatus(userId, smsListener); + EXPECT_EQ(resultCode, ERR_OK); +} } // namespace } // namespace Rosen } // namespace OHOS \ No newline at end of file -- Gitee