diff --git a/frameworks/native/ability/native/ui_ability_impl.cpp b/frameworks/native/ability/native/ui_ability_impl.cpp index 7cec9fefc25af71b8d40a95dacd56abb1f95fc57..43a83fc531596d996340c13d90982e06db3d6f17 100644 --- a/frameworks/native/ability/native/ui_ability_impl.cpp +++ b/frameworks/native/ability/native/ui_ability_impl.cpp @@ -368,7 +368,7 @@ void UIAbilityImpl::UpdateSilentForeground(const AAFwk::LifeCycleStateInfo &targ } if (lifecycleState_ == AAFwk::ABILITY_STATE_INITIAL && sessionInfo && sessionInfo->processOptions && - AAFwk::ProcessOptions::IsNewProcessMode(sessionInfo->processOptions->processMode) && + AAFwk::ProcessOptions::IsValidProcessMode(sessionInfo->processOptions->processMode) && sessionInfo->processOptions->startupVisibility == AAFwk::StartupVisibility::STARTUP_HIDE) { TAG_LOGI(AAFwkTag::UIABILITY, "Set IsSilentForeground to true."); ability_->SetIsSilentForeground(true); diff --git a/interfaces/inner_api/ability_manager/include/process_options.h b/interfaces/inner_api/ability_manager/include/process_options.h index afce4b4500880503fa94db3afdc16fce8ab8df6f..17a26e7c9fa8225170ba062df88ceab8c7056b69 100644 --- a/interfaces/inner_api/ability_manager/include/process_options.h +++ b/interfaces/inner_api/ability_manager/include/process_options.h @@ -24,6 +24,7 @@ enum class ProcessMode { UNSPECIFIED = 0, NEW_PROCESS_ATTACH_TO_PARENT = 1, NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM = 2, + ATTACH_TO_STATUS_BAR_ITEM = 3, END }; @@ -46,6 +47,8 @@ public: static ProcessMode ConvertInt32ToProcessMode(int32_t value); static StartupVisibility ConvertInt32ToStartupVisibility(int32_t value); static bool IsNewProcessMode(ProcessMode value); + static bool IsAttachToStatusBarMode(ProcessMode value); + static bool IsValidProcessMode(ProcessMode value); ProcessMode processMode = ProcessMode::UNSPECIFIED; StartupVisibility startupVisibility = StartupVisibility::UNSPECIFIED; 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 147b7d461dc9648780ae23153bacb27fe3d386f5..dc347f0aedfee5dab1fa4513d5e42e989172ee3d 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -399,7 +399,7 @@ private: bool CheckPid(const std::shared_ptr abilityRecord, const int32_t pid) const; std::shared_ptr GetStatusBarDelegateManager(); int32_t DoProcessAttachment(std::shared_ptr abilityRecord); - void BatchCloseUIAbility(std::unordered_set>& abilitySet); + void BatchCloseUIAbility(const std::unordered_set>& abilitySet); int StartWithPersistentIdByDistributed(const AbilityRequest &abilityRequest, int32_t persistentId); int32_t userId_ = -1; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 762548dd5dcecf109072023db56ba65e61e63653..d86dd00864c9d54288581cfab49ece53b574de6c 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -9468,11 +9468,11 @@ int32_t AbilityManagerService::CheckProcessOptions(const Want &want, const Start { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); if (startOptions.processOptions == nullptr || - !ProcessOptions::IsNewProcessMode(startOptions.processOptions->processMode)) { + !ProcessOptions::IsValidProcessMode(startOptions.processOptions->processMode)) { return ERR_OK; } - TAG_LOGD(AAFwkTag::ABILITYMGR, "start ability in new process mode."); + TAG_LOGD(AAFwkTag::ABILITYMGR, "start ability with process options."); bool isEnable = AppUtils::GetInstance().IsStartOptionsWithProcessOptions(); if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled() || !isEnable) { TAG_LOGE(AAFwkTag::ABILITYMGR, "Not support process options."); @@ -9493,9 +9493,9 @@ int32_t AbilityManagerService::CheckProcessOptions(const Want &want, const Start auto uiAbilityManager = GetUIAbilityManagerByUid(IPCSkeleton::GetCallingUid()); CHECK_POINTER_AND_RETURN(uiAbilityManager, ERR_INVALID_VALUE); - if (startOptions.processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM && + if (ProcessOptions::IsAttachToStatusBarMode(startOptions.processOptions->processMode) && !uiAbilityManager->IsCallerInStatusBar()) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "Caller is not in status bar in NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM mode."); + TAG_LOGE(AAFwkTag::ABILITYMGR, "Caller is not in status bar in attch to status bar mode."); return ERR_START_OPTIONS_CHECK_FAILED; } diff --git a/services/abilitymgr/src/process_options.cpp b/services/abilitymgr/src/process_options.cpp index 0ab137066700a91bc5bc0c0bc9587985d8119bde..47163efec5612d0e1b9a06f1081d5239f0b74297 100644 --- a/services/abilitymgr/src/process_options.cpp +++ b/services/abilitymgr/src/process_options.cpp @@ -83,5 +83,16 @@ bool ProcessOptions::IsNewProcessMode(ProcessMode value) return (value == ProcessMode::NEW_PROCESS_ATTACH_TO_PARENT) || (value == ProcessMode::NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM); } + +bool ProcessOptions::IsAttachToStatusBarMode(ProcessMode value) +{ + return (value == ProcessMode::NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM) || + (value == ProcessMode::ATTACH_TO_STATUS_BAR_ITEM); +} + +bool ProcessOptions::IsValidProcessMode(ProcessMode value) +{ + return (value > ProcessMode::UNSPECIFIED) && (value < ProcessMode::END); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/scene_board/status_bar_delegate_manager.cpp b/services/abilitymgr/src/scene_board/status_bar_delegate_manager.cpp index 825cdb09f23b20e5cc22c295f830e9dd0b30b5b1..fe3c37058efcf772282422817f9659d53bb5b42a 100644 --- a/services/abilitymgr/src/scene_board/status_bar_delegate_manager.cpp +++ b/services/abilitymgr/src/scene_board/status_bar_delegate_manager.cpp @@ -58,41 +58,32 @@ int32_t StatusBarDelegateManager::DoProcessAttachment(std::shared_ptr int32_t { - auto sessionInfo = abilityRecord->GetSessionInfo(); - CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); - auto processOptions = sessionInfo->processOptions; - if (processOptions == nullptr) { - TAG_LOGD(AAFwkTag::ABILITYMGR, "no need to attach process."); - return ERR_OK; - } - if (processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_PARENT) { - auto callerRecord = abilityRecord->GetCallerRecord(); - CHECK_POINTER_AND_RETURN(callerRecord, ERR_INVALID_VALUE); - TAG_LOGI(AAFwkTag::ABILITYMGR, "attach pid to parent."); - IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton::GetInstance()->AttachPidToParent( - abilityRecord->GetToken(), callerRecord->GetToken())); - } - if (processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM) { - auto statusBarDelegate = GetStatusBarDelegate(); - CHECK_POINTER_AND_RETURN(statusBarDelegate, ERR_INVALID_VALUE); - auto accessTokenId = abilityRecord->GetApplicationInfo().accessTokenId; - auto ret = statusBarDelegate->AttachPidToStatusBarItem(accessTokenId, abilityRecord->GetPid()); - if (ret != ERR_OK) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "AttachPidToStatusBarItem failed, ret: %{public}d", ret); - return ret; - } - TAG_LOGI(AAFwkTag::ABILITYMGR, "AttachPidToStatusBarItem success."); - } + auto sessionInfo = abilityRecord->GetSessionInfo(); + CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); + auto processOptions = sessionInfo->processOptions; + if (processOptions == nullptr) { + TAG_LOGD(AAFwkTag::ABILITYMGR, "no need to attach process."); return ERR_OK; - }; - auto ret = func(); - if (ret != ERR_OK) { - std::vector pids; - pids.push_back(abilityRecord->GetPid()); - IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton::GetInstance()->KillProcessesByPids(pids)); } - return ret; + if (processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_PARENT) { + auto callerRecord = abilityRecord->GetCallerRecord(); + CHECK_POINTER_AND_RETURN(callerRecord, ERR_INVALID_VALUE); + TAG_LOGI(AAFwkTag::ABILITYMGR, "attach pid to parent."); + IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton::GetInstance()->AttachPidToParent( + abilityRecord->GetToken(), callerRecord->GetToken())); + } + if (ProcessOptions::IsAttachToStatusBarMode(processOptions->processMode)) { + auto statusBarDelegate = GetStatusBarDelegate(); + CHECK_POINTER_AND_RETURN(statusBarDelegate, ERR_INVALID_VALUE); + auto accessTokenId = abilityRecord->GetApplicationInfo().accessTokenId; + auto ret = statusBarDelegate->AttachPidToStatusBarItem(accessTokenId, abilityRecord->GetPid()); + if (ret != ERR_OK) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "AttachPidToStatusBarItem failed, ret: %{public}d", ret); + return ret; + } + TAG_LOGI(AAFwkTag::ABILITYMGR, "AttachPidToStatusBarItem success."); + } + return ERR_OK; } } // namespace AAFwk } // namespace OHOS \ No newline at end of file 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 5eb280ebec330f4a5772594914b1c12a7f0e8429..cc83863de1a5ce6746573d62120bc2037da89fe9 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -249,7 +249,8 @@ int UIAbilityLifecycleManager::AttachAbilityThread(const sptr abilityRecord->SetScheduler(scheduler); if (DoProcessAttachment(abilityRecord) != ERR_OK) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "do process attachment failed."); + TAG_LOGE(AAFwkTag::ABILITYMGR, "do process attachment failed, close the ability."); + BatchCloseUIAbility({abilityRecord}); return ERR_INVALID_VALUE; } if (abilityRecord->IsStartedByCall()) { @@ -2218,7 +2219,8 @@ int32_t UIAbilityLifecycleManager::KillProcessWithPrepareTerminate(const std::ve return ERR_OK; } -void UIAbilityLifecycleManager::BatchCloseUIAbility(std::unordered_set>& abilitySet) +void UIAbilityLifecycleManager::BatchCloseUIAbility( + const std::unordered_set>& abilitySet) { auto closeTask = [ self = shared_from_this(), abilitySet]() { TAG_LOGI(AAFwkTag::ABILITYMGR, "The abilities need to be closed."); @@ -2251,7 +2253,7 @@ int UIAbilityLifecycleManager::ChangeAbilityVisibility(sptr token auto sessionInfo = abilityRecord->GetSessionInfo(); CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE); if (sessionInfo->processOptions == nullptr || - sessionInfo->processOptions->processMode != ProcessMode::NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM) { + !ProcessOptions::IsAttachToStatusBarMode(sessionInfo->processOptions->processMode)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "Process options check failed."); return ERR_START_OPTIONS_CHECK_FAILED; }