From c326e231376f3a4d1ce518f33f5b9c72e68a6f61 Mon Sep 17 00:00:00 2001 From: zhangyafei-echo Date: Sat, 16 Dec 2023 19:39:35 +0800 Subject: [PATCH] fix onBackground before onSessionCreate. Signed-off-by: zhangyafei-echo Change-Id: I84ad01f020d49b3f12d0f65dbc0675c5ab43da0c --- .../include/ability_connect_manager.h | 2 + services/abilitymgr/include/ability_record.h | 4 + .../src/ability_connect_manager.cpp | 27 +- services/abilitymgr/src/ability_record.cpp | 10 + .../ui_extension_ability_test/BUILD.gn | 1 + ...extension_connect_module_test_connection.h | 0 ...i_extension_connect_module_test_observer.h | 0 .../ohos_test/ohos_test.xml | 11 + ...tension_connect_module_test_connection.cpp | 0 ...extension_connect_module_test_observer.cpp | 0 .../ui_extension_connect_module_test/BUILD.gn | 6 +- .../ui_extension_stability_test/BUILD.gn | 66 +++++ .../ui_extension_stability_test.cpp | 278 ++++++++++++++++++ 13 files changed, 402 insertions(+), 3 deletions(-) rename test/moduletest/ui_extension_ability_test/{ui_extension_connect_module_test => include}/ui_extension_connect_module_test_connection.h (100%) rename test/moduletest/ui_extension_ability_test/{ui_extension_connect_module_test => include}/ui_extension_connect_module_test_observer.h (100%) rename test/moduletest/ui_extension_ability_test/{ui_extension_connect_module_test => src}/ui_extension_connect_module_test_connection.cpp (100%) rename test/moduletest/ui_extension_ability_test/{ui_extension_connect_module_test => src}/ui_extension_connect_module_test_observer.cpp (100%) create mode 100644 test/moduletest/ui_extension_ability_test/ui_extension_stability_test/BUILD.gn create mode 100644 test/moduletest/ui_extension_ability_test/ui_extension_stability_test/ui_extension_stability_test.cpp diff --git a/services/abilitymgr/include/ability_connect_manager.h b/services/abilitymgr/include/ability_connect_manager.h index 551b9c36a7f..76a44aee5b3 100644 --- a/services/abilitymgr/include/ability_connect_manager.h +++ b/services/abilitymgr/include/ability_connect_manager.h @@ -467,6 +467,8 @@ private: void DoForegroundUIExtension(std::shared_ptr abilityRecord, const AbilityRequest &abilityRequest); void SaveUIExtRequestSessionInfo(std::shared_ptr abilityRecord, sptr sessionInfo); + void DoBackgroundAbilityWindow(const std::shared_ptr &abilityRecord, + const sptr &sessionInfo); /** * When a service is under starting, enque the request and handle it after the service starting completes diff --git a/services/abilitymgr/include/ability_record.h b/services/abilitymgr/include/ability_record.h index d3d3cf01610..181c8f86175 100644 --- a/services/abilitymgr/include/ability_record.h +++ b/services/abilitymgr/include/ability_record.h @@ -942,6 +942,9 @@ public: void SetURI(const std::string &uri); std::string GetURI() const; + void DoBackgroundAbilityWindowDelayed(bool needBackground); + bool BackgroundAbilityWindowDelayed(); + protected: void SendEvent(uint32_t msg, uint32_t timeOut, int32_t param = -1); @@ -1144,6 +1147,7 @@ private: bool isAttachDebug_ = false; bool isAppAutoStartup_ = false; bool isConnected = false; + std::atomic_bool backgroundAbilityWindowDelayed_ = false; }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index 3465bd735d7..d069881b103 100644 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -145,6 +145,8 @@ int AbilityConnectManager::StartAbilityLocked(const AbilityRequest &abilityReque targetService->SetLaunchReason(LaunchReason::LAUNCHREASON_START_EXTENSION); + targetService->DoBackgroundAbilityWindowDelayed(false); + if (IsUIExtensionAbility(targetService) && abilityRequest.sessionInfo && abilityRequest.sessionInfo->sessionToken) { auto &remoteObj = abilityRequest.sessionInfo->sessionToken; uiExtensionMap_[remoteObj] = UIExtWindowMapValType(targetService, abilityRequest.sessionInfo); @@ -1485,7 +1487,24 @@ void AbilityConnectManager::BackgroundAbilityWindowLocked(const std::shared_ptr< HILOG_ERROR("sessionInfo is nullptr"); return; } - CommandAbilityWindow(abilityRecord, sessionInfo, WIN_CMD_BACKGROUND); + + DoBackgroundAbilityWindow(abilityRecord, sessionInfo); +} + +void AbilityConnectManager::DoBackgroundAbilityWindow(const std::shared_ptr &abilityRecord, + const sptr &sessionInfo) +{ + CHECK_POINTER(abilityRecord); + CHECK_POINTER(sessionInfo); + if (abilityRecord->IsAbilityState(AbilityState::FOREGROUND)) { + CommandAbilityWindow(abilityRecord, sessionInfo, WIN_CMD_BACKGROUND); + } else if (abilityRecord->IsAbilityState(AbilityState::INITIAL) || + abilityRecord->IsAbilityState(AbilityState::FOREGROUNDING)) { + HILOG_INFO("There exist initial or foregrounding task."); + abilityRecord->DoBackgroundAbilityWindowDelayed(true); + } else { + HILOG_WARN("Invalid ability state when background."); + } } void AbilityConnectManager::TerminateAbilityWindowLocked(const std::shared_ptr &abilityRecord, @@ -2171,6 +2190,11 @@ void AbilityConnectManager::CompleteForeground(const std::shared_ptrSetAbilityState(AbilityState::FOREGROUND); + if (abilityRecord->BackgroundAbilityWindowDelayed()) { + HILOG_INFO("Response background request."); + abilityRecord->DoBackgroundAbilityWindowDelayed(false); + DoBackgroundAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo()); + } CompleteStartServiceReq(abilityRecord->GetURI()); } @@ -2182,6 +2206,7 @@ void AbilityConnectManager::HandleForegroundTimeoutTask(const std::shared_ptrSetAbilityState(AbilityState::BACKGROUND); + abilityRecord->DoBackgroundAbilityWindowDelayed(false); CompleteStartServiceReq(abilityRecord->GetURI()); } diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index 618e9ae6f4f..c4ddc284ddb 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -3253,5 +3253,15 @@ int32_t AbilityRecord::GetUIExtensionAbilityId() const { return uiExtensionAbilityId_; } + +bool AbilityRecord::BackgroundAbilityWindowDelayed() +{ + return backgroundAbilityWindowDelayed_.load(); +} + +void AbilityRecord::DoBackgroundAbilityWindowDelayed(bool needBackground) +{ + backgroundAbilityWindowDelayed_.store(needBackground); +} } // namespace AAFwk } // namespace OHOS diff --git a/test/moduletest/ui_extension_ability_test/BUILD.gn b/test/moduletest/ui_extension_ability_test/BUILD.gn index 7c77e4e5515..fa388f96b47 100644 --- a/test/moduletest/ui_extension_ability_test/BUILD.gn +++ b/test/moduletest/ui_extension_ability_test/BUILD.gn @@ -21,5 +21,6 @@ group("moduletest") { if (target_cpu == "arm") { deps += [ "ui_extension_connect_module_test:moduletest" ] + deps += [ "ui_extension_stability_test:moduletest" ] } } diff --git a/test/moduletest/ui_extension_ability_test/ui_extension_connect_module_test/ui_extension_connect_module_test_connection.h b/test/moduletest/ui_extension_ability_test/include/ui_extension_connect_module_test_connection.h similarity index 100% rename from test/moduletest/ui_extension_ability_test/ui_extension_connect_module_test/ui_extension_connect_module_test_connection.h rename to test/moduletest/ui_extension_ability_test/include/ui_extension_connect_module_test_connection.h diff --git a/test/moduletest/ui_extension_ability_test/ui_extension_connect_module_test/ui_extension_connect_module_test_observer.h b/test/moduletest/ui_extension_ability_test/include/ui_extension_connect_module_test_observer.h similarity index 100% rename from test/moduletest/ui_extension_ability_test/ui_extension_connect_module_test/ui_extension_connect_module_test_observer.h rename to test/moduletest/ui_extension_ability_test/include/ui_extension_connect_module_test_observer.h diff --git a/test/moduletest/ui_extension_ability_test/ohos_test/ohos_test.xml b/test/moduletest/ui_extension_ability_test/ohos_test/ohos_test.xml index 80067a7d98c..e61966d006d 100644 --- a/test/moduletest/ui_extension_ability_test/ohos_test/ohos_test.xml +++ b/test/moduletest/ui_extension_ability_test/ohos_test/ohos_test.xml @@ -25,4 +25,15 @@