diff --git a/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h b/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h index 31e1600425..9b86569e14 100644 --- a/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h +++ b/interfaces/inner_api/ability_manager/include/lifecycle_state_info.h @@ -52,6 +52,7 @@ enum class ErrorLifecycleState { ABILITY_STATE_PERMISSION_UPDATE, ABILITY_STATE_LOW_MEMORY_KILL, ABILITY_STATE_SKIP_KILL_IN_STARTUP, + ABILITY_STATE_INTERCEPTOR_REJECT, }; /** diff --git a/services/abilitymgr/include/dialog_session/dialog_session_manager.h b/services/abilitymgr/include/dialog_session/dialog_session_manager.h index 87e530440c..6f7c60155e 100644 --- a/services/abilitymgr/include/dialog_session/dialog_session_manager.h +++ b/services/abilitymgr/include/dialog_session/dialog_session_manager.h @@ -46,6 +46,7 @@ struct DialogCallerInfo { SelectorType type = SelectorType::WITHOUT_SELECTOR; // for app gallery selector bool needGrantUriPermission = false; + sptr sessionToken = nullptr; }; struct StartupSessionInfo { @@ -183,6 +184,9 @@ private: void NotifyAbilityRequestFailure(const std::string &dialogSessionId, const Want &want); + void HandleUserRejected(const std::string &dialogSessionId, const Want &want, + const std::shared_ptr &dialogCallerInfo); + mutable ffrt::mutex dialogSessionRecordLock_; std::unordered_map> dialogSessionInfoMap_; std::unordered_map> dialogCallerInfoMap_; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index df6c23be6d..e8a9903f64 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -3175,6 +3175,7 @@ int AbilityManagerService::StartUIAbilityBySCBDefault(sptr sessionI return result; } abilityRequest.userId = currentUserId; + abilityRequest.sessionInfo = sessionInfo; if (!HandleExecuteSAInterceptor(sessionInfo->want, sessionInfo->callerToken, abilityRequest, result)) { return result; } diff --git a/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp b/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp index f98e450200..0e12114e38 100644 --- a/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp +++ b/services/abilitymgr/src/dialog_session/dialog_session_manager.cpp @@ -26,6 +26,7 @@ #include "scene_board_judgement.h" #include "session_manager_lite.h" #endif +#include "session/host/include/zidl/session_interface.h" #include "start_ability_utils.h" #include "string_wrapper.h" #include "want.h" @@ -275,17 +276,16 @@ int DialogSessionManager::SendDialogResult(const Want &want, const std::string & ClearDialogContext(dialogSessionId); return ERR_OK; } + std::shared_ptr dialogCallerInfo = GetDialogCallerInfo(dialogSessionId); if (!isAllowed) { TAG_LOGI(AAFwkTag::ABILITYMGR, "user refuse to jump"); - NotifyAbilityRequestFailure(dialogSessionId, want); - ClearDialogContext(dialogSessionId); + HandleUserRejected(dialogSessionId, want, dialogCallerInfo); 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, "dialogCallerInfo null"); ClearDialogContext(dialogSessionId); @@ -321,6 +321,23 @@ int DialogSessionManager::SendDialogResult(const Want &want, const std::string & return ret; } +void DialogSessionManager::HandleUserRejected(const std::string &dialogSessionId, const Want &want, + const std::shared_ptr &dialogCallerInfo) +{ + NotifyAbilityRequestFailure(dialogSessionId, want); + if (dialogCallerInfo != nullptr && dialogCallerInfo->sessionToken != nullptr) { + auto session = iface_cast(dialogCallerInfo->sessionToken); + if (session != nullptr) { + sptr sessionInfo = sptr::MakeSptr(); + sessionInfo->errorCode = static_cast(ErrorLifecycleState::ABILITY_STATE_INTERCEPTOR_REJECT); + sessionInfo->errorReason = "userReject"; + Rosen::ExceptionInfo exceptionInfo; + session->NotifySessionException(sessionInfo, exceptionInfo); + } + } + ClearDialogContext(dialogSessionId); +} + int32_t DialogSessionManager::NotifySCBToRecoveryAfterInterception(const std::string &dialogSessionId, const AbilityRequest &abilityRequest) { @@ -610,6 +627,9 @@ void DialogSessionManager::OnlySetDialogCallerInfo(AbilityRequest &abilityReques std::lock_guard guard(dialogSessionRecordLock_); std::shared_ptr dialogCallerInfo = std::make_shared(); GenerateDialogCallerInfo(abilityRequest, userId, dialogCallerInfo, type, needGrantUriPermission); + if (abilityRequest.sessionInfo != nullptr) { + dialogCallerInfo->sessionToken = abilityRequest.sessionInfo->sessionToken; + } dialogCallerInfoMap_[dialogSessionId] = dialogCallerInfo; } } // namespace AAFwk diff --git a/test/unittest/dialog_session_manager_test/BUILD.gn b/test/unittest/dialog_session_manager_test/BUILD.gn index 5db1923b93..86a8768737 100644 --- a/test/unittest/dialog_session_manager_test/BUILD.gn +++ b/test/unittest/dialog_session_manager_test/BUILD.gn @@ -58,6 +58,7 @@ ohos_unittest("dialog_session_manager_test") { external_deps = [ "ability_base:base", + "ability_base:session_info", "ability_base:want", "ability_base:zuri", "bundle_framework:appexecfwk_core", diff --git a/test/unittest/dialog_session_manager_test/dialog_session_manager_test.cpp b/test/unittest/dialog_session_manager_test/dialog_session_manager_test.cpp index 4e5cbea235..a352e20795 100644 --- a/test/unittest/dialog_session_manager_test/dialog_session_manager_test.cpp +++ b/test/unittest/dialog_session_manager_test/dialog_session_manager_test.cpp @@ -167,6 +167,34 @@ HWTEST_F(DialogSessionManagerTest, SendDialogResultTest_0300, TestSize.Level1) GTEST_LOG_(INFO) << "SendDialogResultTest_0300 end"; } +/** + * @tc.name: SendDialogResultTest_0400 + * @tc.desc: Test SendDialogResult + * @tc.type: FUNC + */ +HWTEST_F(DialogSessionManagerTest, SendDialogResultTest_0400, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SendDialogResultTest_0400 start"; + AbilityRequest abilityRequest; + DialogSessionManager dialogSessionManager; + Want want; + bool isAllowed = false; + sptr dialogSessionInfo = nullptr; + std::shared_ptr dialogCallerInfo = std::make_shared(); + dialogSessionManager.SetDialogSessionInfo(TEST_DIALOG_SESSION_ID, dialogSessionInfo, dialogCallerInfo); + int32_t ret = dialogSessionManager.SendDialogResult(want, TEST_DIALOG_SESSION_ID, isAllowed); + EXPECT_EQ(ret, ERR_OK); + + dialogCallerInfo->sessionToken = sptr::MakeSptr(); + dialogSessionManager.SetDialogSessionInfo(TEST_DIALOG_SESSION_ID, dialogSessionInfo, dialogCallerInfo); + ret = dialogSessionManager.SendDialogResult(want, TEST_DIALOG_SESSION_ID, isAllowed); + EXPECT_EQ(ret, ERR_OK); + bool cleared = dialogSessionManager.dialogSessionInfoMap_.find(TEST_DIALOG_SESSION_ID) == + dialogSessionManager.dialogSessionInfoMap_.end(); + EXPECT_TRUE(cleared); + GTEST_LOG_(INFO) << "SendDialogResultTest_0400 end"; +} + /** * @tc.name: NotifySCBToRecoveryAfterInterceptionTest_0100 * @tc.desc: Test NotifySCBToRecoveryAfterInterception @@ -397,6 +425,28 @@ HWTEST_F(DialogSessionManagerTest, OnlySetDialogCallerInfo_0100, TestSize.Level1 GTEST_LOG_(INFO) << "OnlySetDialogCallerInfo_0100 end"; } +/** + * @tc.name: OnlySetDialogCallerInfo_0200 + * @tc.desc: OnlySetDialogCallerInfo + * @tc.type: FUNC + */ +HWTEST_F(DialogSessionManagerTest, OnlySetDialogCallerInfo_0200, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "OnlySetDialogCallerInfo_0200 start"; + SelectorType type = SelectorType::INTERCEPTOR_SELECTOR; + AbilityRequest abilityRequest; + abilityRequest.sessionInfo = sptr::MakeSptr(); + sptr sessionToken = sptr::MakeSptr(); + abilityRequest.sessionInfo->sessionToken = sessionToken; + + DialogSessionManager dialogSessionManager; + dialogSessionManager.OnlySetDialogCallerInfo(abilityRequest, TEST_USER_ID, type, TEST_DIALOG_SESSION_ID, false); + auto info = dialogSessionManager.GetDialogCallerInfo(TEST_DIALOG_SESSION_ID); + EXPECT_NE(info, nullptr); + EXPECT_EQ(info->sessionToken, sessionToken); + GTEST_LOG_(INFO) << "OnlySetDialogCallerInfo_0200 end"; +} + /** * @tc.name: CreateImplicitSelectorModalDialog_0001 * @tc.desc: No APP_LAUNCH_TRUSTLIST