diff --git a/interfaces/inner_api/ability_manager/include/window_manager_service_handler.h b/interfaces/inner_api/ability_manager/include/window_manager_service_handler.h index a87936aac1..28a839a5ff 100644 --- a/interfaces/inner_api/ability_manager/include/window_manager_service_handler.h +++ b/interfaces/inner_api/ability_manager/include/window_manager_service_handler.h @@ -42,6 +42,8 @@ public: virtual void CancelStartingWindow(sptr abilityToken) = 0; + virtual void NotifyAnimationAbilityDied(sptr info) = 0; + enum WMSCmd { // ipc id for NotifyWindowTransition ON_NOTIFY_WINDOW_TRANSITION, @@ -57,6 +59,9 @@ public: // ipc id for CancelStartingWindow ON_CANCEL_STARTING_WINDOW, + + // ipc id for NotifyAnimationAbilityDied + ON_NOTIFY_ANIMATION_ABILITY_DIED, }; }; } // namespace AAFwk diff --git a/interfaces/inner_api/ability_manager/include/window_manager_service_handler_proxy.h b/interfaces/inner_api/ability_manager/include/window_manager_service_handler_proxy.h index a2d692c07d..24abcbe771 100644 --- a/interfaces/inner_api/ability_manager/include/window_manager_service_handler_proxy.h +++ b/interfaces/inner_api/ability_manager/include/window_manager_service_handler_proxy.h @@ -39,6 +39,8 @@ public: virtual void CancelStartingWindow(sptr abilityToken) override; + virtual void NotifyAnimationAbilityDied(sptr info) override; + private: static inline BrokerDelegator delegator_; }; diff --git a/interfaces/inner_api/ability_manager/include/window_manager_service_handler_stub.h b/interfaces/inner_api/ability_manager/include/window_manager_service_handler_stub.h index aea01e0799..4cf2622b84 100644 --- a/interfaces/inner_api/ability_manager/include/window_manager_service_handler_stub.h +++ b/interfaces/inner_api/ability_manager/include/window_manager_service_handler_stub.h @@ -41,6 +41,7 @@ private: int StartingWindowCold(MessageParcel &data, MessageParcel &reply); int StartingWindowHot(MessageParcel &data, MessageParcel &reply); int CancelStartingWindowInner(MessageParcel &data, MessageParcel &reply); + int NotifyAnimationAbilityDiedInner(MessageParcel &data, MessageParcel &reply); using RequestFuncType = int (WindowManagerServiceHandlerStub::*)(MessageParcel &data, MessageParcel &reply); std::map requestFuncMap_; diff --git a/interfaces/inner_api/ability_manager/src/window_manager_service_handler_proxy.cpp b/interfaces/inner_api/ability_manager/src/window_manager_service_handler_proxy.cpp index c9b9455c0c..a88a5a3fb2 100644 --- a/interfaces/inner_api/ability_manager/src/window_manager_service_handler_proxy.cpp +++ b/interfaces/inner_api/ability_manager/src/window_manager_service_handler_proxy.cpp @@ -157,6 +157,26 @@ void WindowManagerServiceHandlerProxy::CancelStartingWindow(sptr HILOG_ERROR("SendRequest fail, error: %{public}d", error); } } + +void WindowManagerServiceHandlerProxy::NotifyAnimationAbilityDied(sptr info) +{ + HILOG_DEBUG("%{public}s is called.", __func__); + MessageParcel data; + if (!data.WriteInterfaceToken(IWindowManagerServiceHandler::GetDescriptor())) { + HILOG_ERROR("Write interface token failed."); + return; + } + if (!data.WriteParcelable(info.GetRefPtr())) { + HILOG_ERROR("Write info failed."); + return; + } + MessageParcel reply; + MessageOption option(MessageOption::TF_ASYNC); + int error = Remote()->SendRequest(WMSCmd::ON_NOTIFY_ANIMATION_ABILITY_DIED, data, reply, option); + if (error != ERR_OK) { + HILOG_ERROR("SendRequest fail, error: %{public}d", error); + } +} } // namespace AAFwk } // namespace OHOS #endif diff --git a/interfaces/inner_api/ability_manager/src/window_manager_service_handler_stub.cpp b/interfaces/inner_api/ability_manager/src/window_manager_service_handler_stub.cpp index 854835f57c..61faece3b9 100644 --- a/interfaces/inner_api/ability_manager/src/window_manager_service_handler_stub.cpp +++ b/interfaces/inner_api/ability_manager/src/window_manager_service_handler_stub.cpp @@ -38,6 +38,8 @@ void WindowManagerServiceHandlerStub::Init() requestFuncMap_[ON_COLD_STARTING_WINDOW] = &WindowManagerServiceHandlerStub::StartingWindowCold; requestFuncMap_[ON_HOT_STARTING_WINDOW] = &WindowManagerServiceHandlerStub::StartingWindowHot; requestFuncMap_[ON_CANCEL_STARTING_WINDOW] = &WindowManagerServiceHandlerStub::CancelStartingWindowInner; + requestFuncMap_[ON_NOTIFY_ANIMATION_ABILITY_DIED] = + &WindowManagerServiceHandlerStub::NotifyAnimationAbilityDiedInner; } int WindowManagerServiceHandlerStub::OnRemoteRequest( @@ -151,6 +153,18 @@ int WindowManagerServiceHandlerStub::CancelStartingWindowInner(MessageParcel &da CancelStartingWindow(abilityToken); return ERR_OK; } + +int WindowManagerServiceHandlerStub::NotifyAnimationAbilityDiedInner(MessageParcel &data, MessageParcel &reply) +{ + HILOG_DEBUG("%{public}s is called.", __func__); + sptr info(data.ReadParcelable()); + if (!info) { + HILOG_ERROR("To read info failed."); + return ERR_AAFWK_PARCEL_FAIL; + } + NotifyAnimationAbilityDied(info); + return ERR_OK; +} } // namespace AAFwk } // namespace OHOS #endif diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index a0e5cdf825..afa4252f15 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -1819,6 +1819,16 @@ void AbilityRecord::OnSchedulerDied(const wptr &remote) ability->SendResultToCallers(); }; handler->PostTask(uriTask); +#ifdef SUPPORT_GRAPHICS + // notify winddow manager service the ability died + handler->PostTask([ability = shared_from_this()]() { + if (ability->GetWMSHandler()) { + sptr info = new AbilityTransitionInfo(); + ability->SetAbilityTransitionInfo(info); + ability->GetWMSHandler()->NotifyAnimationAbilityDied(info); + } + }); +#endif HandleDlpClosed(); } diff --git a/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp b/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp index aa50704858..d06e4d1e72 100644 --- a/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp +++ b/test/unittest/mission_list_manager_test/mission_list_manager_test.cpp @@ -113,6 +113,8 @@ public: { return nullptr; } + + virtual void NotifyAnimationAbilityDied(sptr info) {} }; /*