From ab9b2711330e11f51cd7161933a8b009987c26f5 Mon Sep 17 00:00:00 2001 From: donglin Date: Mon, 12 Aug 2024 04:16:03 +0000 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A1=8C=E9=9D=A2=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E8=BF=94=E5=9B=9E=E6=8B=89=E8=B5=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: donglin Change-Id: I05185c32ff3b180465a56acc5ec027e7837beaaf --- .../include/ability_manager_service.h | 5 ++ .../dialog_session/dialog_session_manager.h | 14 ++++ .../ui_ability_lifecycle_manager.h | 2 + .../src/ability_manager_service.cpp | 22 ++++-- .../dialog_session/dialog_session_manager.cpp | 74 ++++++++++++++++--- .../ui_ability_lifecycle_manager.cpp | 40 ++++++++++ 6 files changed, 140 insertions(+), 17 deletions(-) diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 6f082279345..d6b624abf9e 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -1782,6 +1782,11 @@ public: int32_t TerminateMission(int32_t missionId) override; + int32_t StartUIAbilityBySCBDefaultCommon(AbilityRequest &abilityRequest, sptr sessionInfo, + uint32_t sceneFlag, bool isColdStart); + + int32_t NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest); + // MSG 0 - 20 represents timeout message static constexpr uint32_t LOAD_TIMEOUT_MSG = 0; static constexpr uint32_t ACTIVE_TIMEOUT_MSG = 1; diff --git a/services/abilitymgr/include/dialog_session/dialog_session_manager.h b/services/abilitymgr/include/dialog_session/dialog_session_manager.h index ba8f1c4d4f2..c0249e19c48 100644 --- a/services/abilitymgr/include/dialog_session/dialog_session_manager.h +++ b/services/abilitymgr/include/dialog_session/dialog_session_manager.h @@ -43,6 +43,10 @@ enum class SelectorType { APP_CLONR_SELECTOR = 1 }; +struct StartupSessionInfo { + AbilityRequest abilityRequest; +}; + class DialogSessionManager { public: static DialogSessionManager &GetInstance(); @@ -52,6 +56,8 @@ public: std::shared_ptr GetDialogCallerInfo(const std::string &dialogSessionId) const; + std::shared_ptr GetStartupSessionInfo(const std::string &dialogSessionId) const; + int SendDialogResult(const Want &want, const std::string &dialogSessionId, bool isAllowed); int CreateJumpModalDialog(AbilityRequest &abilityRequest, int32_t userId, const Want &replaceWant); @@ -64,6 +70,8 @@ public: int HandleErmsResult(AbilityRequest &abilityRequest, int32_t userId, const Want &replaceWant); + int32_t HandleErmsResultBySCB(AbilityRequest &abilityRequest, const Want &replaceWant); + bool IsCreateCloneSelectorDialog(const std::string &bundleName, int32_t userId); private: @@ -73,6 +81,11 @@ private: void SetDialogSessionInfo(const std::string &dialogSessionId, sptr &dilogSessionInfo, std::shared_ptr &dialogCallerInfo); + void SetStartupSessionInfo(const std::string &dialogSessionId, const AbilityRequest &abilityRequest); + + int32_t NotifySCBToRecoveryAfterInterception(const std::string &dialogSessionId, + const AbilityRequest &abilityRequest); + void ClearDialogContext(const std::string &dialogSessionId); void ClearAllDialogContexts(); @@ -97,6 +110,7 @@ private: mutable ffrt::mutex dialogSessionRecordLock_; std::unordered_map> dialogSessionInfoMap_; std::unordered_map> dialogCallerInfoMap_; + std::unordered_map> startupSessionInfoMap_; DISALLOW_COPY_AND_MOVE(DialogSessionManager); }; diff --git a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h index 3c58dc2ce9a..1c6198d25f4 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -167,6 +167,8 @@ public: int NotifySCBToPreStartUIAbility(const AbilityRequest &abilityRequest, sptr &sessionInfo); + int32_t NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest); + /** * @brief handle time out event * diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 4809709add7..0f55f3f94b0 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -2107,16 +2107,19 @@ int AbilityManagerService::StartUIAbilityBySCBDefault(sptr sessionI TAG_LOGE(AAFwkTag::ABILITYMGR, "DoProcess failed or replaceWant not exist"); return result; } - auto systemUIExtension = std::make_shared(); - (const_cast(newWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1); - (const_cast(newWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true); - return IN_PROCESS_CALL(systemUIExtension->CreateModalUIExtension(newWant)) ? - ERR_ECOLOGICAL_CONTROL_STATUS : INNER_ERR; + return DialogSessionManager::GetInstance().HandleErmsResultBySCB(abilityRequest, newWant); } } + return StartUIAbilityBySCBDefaultCommon(abilityRequest, sessionInfo, sceneFlag, isColdStart); +} + +int32_t AbilityManagerService::StartUIAbilityBySCBDefaultCommon(AbilityRequest &abilityRequest, + sptr sessionInfo, uint32_t sceneFlag, bool isColdStart) +{ + auto abilityInfo = abilityRequest.abilityInfo; if (!AbilityUtil::IsSystemDialogAbility(abilityInfo.bundleName, abilityInfo.name)) { - result = PreLoadAppDataAbilities(abilityInfo.bundleName, currentUserId); + int32_t result = PreLoadAppDataAbilities(abilityInfo.bundleName, IPCSkeleton::GetCallingUid() / BASE_USER_RANGE); if (result != ERR_OK) { TAG_LOGE(AAFwkTag::ABILITYMGR, "StartAbility: App data ability preloading failed, '%{public}s', %{public}d", abilityInfo.bundleName.c_str(), result); @@ -2133,6 +2136,13 @@ int AbilityManagerService::StartUIAbilityBySCBDefault(sptr sessionI return uiAbilityManager->StartUIAbility(abilityRequest, sessionInfo, sceneFlag, isColdStart); } +int32_t AbilityManagerService::NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest) +{ + auto uiAbilityManager = GetUIAbilityManagerByUid(IPCSkeleton::GetCallingUid()); + CHECK_POINTER_AND_RETURN(uiAbilityManager, ERR_INVALID_VALUE); + return uiAbilityManager->NotifySCBToRecoveryAfterInterception(abilityRequest); +} + bool AbilityManagerService::CheckCallingTokenId(const std::string &bundleName, int32_t userId, int32_t appIndex) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); diff --git a/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp b/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp index 4e8e23126e0..fe5dc8c235f 100644 --- a/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp +++ b/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp @@ -32,6 +32,7 @@ namespace { constexpr const char* UIEXTENSION_MODAL_TYPE = "ability.want.params.modalType"; constexpr int32_t ERMS_ISALLOW_RESULTCODE = 10; constexpr const char* SUPPORT_CLOSE_ON_BLUR = "supportCloseOnBlur"; +constexpr const char* DIALOG_SESSION_ID = "dialogSessionId"; } DialogSessionManager &DialogSessionManager::GetInstance() @@ -48,7 +49,6 @@ std::string DialogSessionManager::GenerateDialogSessionId() std::mt19937 rng(seed()); std::uniform_int_distribution uni(0, INT_MAX); int randomDigit = uni(rng); - return std::to_string(time) + "_" + std::to_string(randomDigit); std::string dialogSessionId = std::to_string(time) + "_" + std::to_string(randomDigit); std::lock_guard guard(dialogSessionRecordLock_); @@ -60,6 +60,15 @@ std::string DialogSessionManager::GenerateDialogSessionId() return dialogSessionId; } +void DialogSessionManager::SetStartupSessionInfo(const std::string &dialogSessionId, + const AbilityRequest &abilityRequest) +{ + std::lock_guard guard(dialogSessionRecordLock_); + std::shared_ptr startupSessionInfo = std::make_shared(); + startupSessionInfo->abilityRequest = abilityRequest; + startupSessionInfoMap_[dialogSessionId] = startupSessionInfo; +} + void DialogSessionManager::SetDialogSessionInfo(const std::string &dialogSessionId, sptr &dilogSessionInfo, std::shared_ptr &dialogCallerInfo) { @@ -90,17 +99,24 @@ std::shared_ptr DialogSessionManager::GetDialogCallerInfo(cons return nullptr; } -void DialogSessionManager::ClearDialogContext(const std::string &dialogSessionId) +std::shared_ptr DialogSessionManager::GetStartupSessionInfo( + const std::string &dialogSessionId) const { std::lock_guard guard(dialogSessionRecordLock_); - auto it = dialogSessionInfoMap_.find(dialogSessionId); - if (it != dialogSessionInfoMap_.end()) { - dialogSessionInfoMap_.erase(it); - } - auto iter = dialogCallerInfoMap_.find(dialogSessionId); - if (iter != dialogCallerInfoMap_.end()) { - dialogCallerInfoMap_.erase(iter); + auto it = startupSessionInfoMap_.find(dialogSessionId); + if (it != startupSessionInfoMap_.end()) { + return it->second; } + TAG_LOGI(AAFwkTag::DIALOG, "not find"); + return nullptr; +} + +void DialogSessionManager::ClearDialogContext(const std::string &dialogSessionId) +{ + std::lock_guard guard(dialogSessionRecordLock_); + dialogSessionInfoMap_.erase(dialogSessionId); + dialogCallerInfoMap_.erase(dialogSessionId); + startupSessionInfoMap_.erase(dialogSessionId); return; } @@ -109,6 +125,7 @@ void DialogSessionManager::ClearAllDialogContexts() std::lock_guard guard(dialogSessionRecordLock_); dialogSessionInfoMap_.clear(); dialogCallerInfoMap_.clear(); + startupSessionInfoMap_.clear(); } void DialogSessionManager::GenerateCallerAbilityInfo(AbilityRequest &abilityRequest, @@ -186,6 +203,10 @@ int DialogSessionManager::SendDialogResult(const Want &want, const std::string & ClearDialogContext(dialogSessionId); return ERR_OK; } + std::shared_ptr startupSessionInfo = GetStartupSessionInfo(dialogSessionId); + if (startupSessionInfo != nullptr) { + return NotifySCBToRecoveryAfterInterception(dialogSessionId, startupSessionInfo->abilityRequest); + } std::shared_ptr dialogCallerInfo = GetDialogCallerInfo(dialogSessionId); if (dialogCallerInfo == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "dialog caller info is nullptr"); @@ -195,7 +216,7 @@ int DialogSessionManager::SendDialogResult(const Want &want, const std::string & auto targetWant = dialogCallerInfo->targetWant; targetWant.SetElement(want.GetElement()); targetWant.SetParam("isSelector", dialogCallerInfo->isSelector); - targetWant.SetParam("dialogSessionId", dialogSessionId); + targetWant.SetParam(DIALOG_SESSION_ID, dialogSessionId); if (want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY)) { int32_t appIndex = want.GetIntParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0); targetWant.SetParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, appIndex); @@ -217,6 +238,21 @@ int DialogSessionManager::SendDialogResult(const Want &want, const std::string & return ret; } +int32_t DialogSessionManager::NotifySCBToRecoveryAfterInterception(const std::string &dialogSessionId, + const AbilityRequest &abilityRequest) +{ + auto abilityMgr = DelayedSingleton::GetInstance(); + if (!abilityMgr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityMgr is nullptr."); + return INNER_ERR; + } + int ret = IN_PROCESS_CALL(abilityMgr->NotifySCBToRecoveryAfterInterception(abilityRequest)); + if (ret == ERR_OK) { + ClearDialogContext(dialogSessionId); + } + return ret; +} + std::string DialogSessionManager::GenerateDialogSessionRecordCommon(AbilityRequest &abilityRequest, int32_t userId, const AAFwk::WantParams ¶meters, std::vector &dialogAppInfos, bool isSelector) { @@ -318,7 +354,7 @@ int DialogSessionManager::CreateModalDialogCommon(const Want &replaceWant, sptr< const std::string &dialogSessionId) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); - (const_cast(replaceWant)).SetParam("dialogSessionId", dialogSessionId); + (const_cast(replaceWant)).SetParam(DIALOG_SESSION_ID, dialogSessionId); auto connection = std::make_shared(); if (callerToken == nullptr) { TAG_LOGD(AAFwkTag::ABILITYMGR, "create modal ui extension for system"); @@ -374,6 +410,22 @@ int DialogSessionManager::HandleErmsResult(AbilityRequest &abilityRequest, int32 return abilityMgr->CreateCloneSelectorDialog(abilityRequest, userId, replaceWant.ToString()); } +int32_t DialogSessionManager::HandleErmsResultBySCB(AbilityRequest &abilityRequest, const Want &replaceWant) +{ + auto systemUIExtension = std::make_shared(); + (const_cast(replaceWant)).SetParam(UIEXTENSION_MODAL_TYPE, 1); + (const_cast(replaceWant)).SetParam(SUPPORT_CLOSE_ON_BLUR, true); + std::string dialogSessionId = GenerateDialogSessionId(); + if (dialogSessionId == "") { + TAG_LOGE(AAFwkTag::ABILITYMGR, "generate dialog session record failed"); + return ERR_INVALID_VALUE; + } + SetStartupSessionInfo(dialogSessionId, abilityRequest); + (const_cast(replaceWant)).SetParam(DIALOG_SESSION_ID, dialogSessionId); + return IN_PROCESS_CALL(systemUIExtension->CreateModalUIExtension(replaceWant)) ? + ERR_ECOLOGICAL_CONTROL_STATUS : INNER_ERR; +} + bool DialogSessionManager::IsCreateCloneSelectorDialog(const std::string &bundleName, int32_t userId) { if (StartAbilityUtils::isWantWithAppCloneIndex) { diff --git a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp index 069baacb42f..d56b7ed9451 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -362,6 +362,46 @@ int UIAbilityLifecycleManager::NotifySCBToStartUIAbility(const AbilityRequest &a return ret; } +int32_t UIAbilityLifecycleManager::NotifySCBToRecoveryAfterInterception(const AbilityRequest &abilityRequest) +{ + HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); + std::lock_guard guard(sessionLock_); + auto abilityInfo = abilityRequest.abilityInfo; + bool isUIAbility = (abilityInfo.type == AppExecFwk::AbilityType::PAGE && abilityInfo.isStageBasedModel); + // When 'processMode' is set to new process mode, the priority is higher than 'isolationProcess'. + bool isNewProcessMode = abilityRequest.processOptions && + ProcessOptions::IsNewProcessMode(abilityRequest.processOptions->processMode); + if (!isNewProcessMode && abilityInfo.isolationProcess && AppUtils::GetInstance().IsStartSpecifiedProcess() + && isUIAbility) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "StartSpecifiedProcess"); + specifiedRequestMap_.emplace(specifiedRequestId_, abilityRequest); + DelayedSingleton::GetInstance()->StartSpecifiedProcess(abilityRequest.want, abilityInfo, + specifiedRequestId_); + ++specifiedRequestId_; + return ERR_OK; + } + auto isSpecified = (abilityRequest.abilityInfo.launchMode == AppExecFwk::LaunchMode::SPECIFIED); + if (isSpecified) { + PreCreateProcessName(const_cast(abilityRequest)); + specifiedRequestMap_.emplace(specifiedRequestId_, abilityRequest); + DelayedSingleton::GetInstance()->StartSpecifiedAbility( + abilityRequest.want, abilityRequest.abilityInfo, specifiedRequestId_); + ++specifiedRequestId_; + return ERR_OK; + } + auto sessionInfo = CreateSessionInfo(abilityRequest); + sessionInfo->requestCode = abilityRequest.requestCode; + sessionInfo->persistentId = GetPersistentIdByAbilityRequest(abilityRequest, sessionInfo->reuse); + sessionInfo->userId = userId_; + sessionInfo->isAtomicService = (abilityInfo.applicationInfo.bundleType == AppExecFwk::BundleType::ATOMIC_SERVICE); + sessionInfo->isSkipErms = false; + TAG_LOGI( + AAFwkTag::ABILITYMGR, "Reused sessionId: %{public}d, userId: %{public}d.", sessionInfo->persistentId, userId_); + int ret = NotifySCBPendingActivation(sessionInfo, abilityRequest); + sessionInfo->want.CloseAllFd(); + return ret; +} + int UIAbilityLifecycleManager::NotifySCBToPreStartUIAbility(const AbilityRequest &abilityRequest, sptr &sessionInfo) { -- Gitee