diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp index 2cdfd5645b..c89456b678 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp @@ -103,33 +103,6 @@ napi_value AttachUIExtensionContext(napi_env env, void *value, void *extValue) return contextObj; } -void AbilityResultListeners::AddListener(const uint64_t &uiExtensionComponentId, - std::shared_ptr listener) -{ - if (uiExtensionComponentId == 0) { - HILOG_ERROR("Invalid session."); - return; - } - listeners_[uiExtensionComponentId] = listener; -} - -void AbilityResultListeners::RemoveListener(const uint64_t &uiExtensionComponentId) -{ - if (listeners_.find(uiExtensionComponentId) != listeners_.end()) { - listeners_.erase(uiExtensionComponentId); - } -} - -void AbilityResultListeners::OnAbilityResult(int requestCode, int resultCode, const Want &resultData) -{ - for (auto item:listeners_) { - if (item.second && item.second->IsMatch(requestCode)) { - item.second->OnAbilityResult(requestCode, resultCode, resultData); - return; - } - } -} - JsUIExtension* JsUIExtension::Create(const std::unique_ptr& runtime) { return new (std::nothrow) JsUIExtension(static_cast(*runtime)); diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_base.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_base.cpp index a7ee9e2190..838c43630e 100644 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_base.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_base.cpp @@ -98,7 +98,9 @@ napi_value AttachUIExtensionBaseContext(napi_env env, void *value, void*) JsUIExtensionBase::JsUIExtensionBase(const std::unique_ptr &runtime) : jsRuntime_(static_cast(*runtime)) -{} +{ + abilityResultListeners_ = std::make_shared(); +} JsUIExtensionBase::~JsUIExtensionBase() { @@ -449,8 +451,8 @@ bool JsUIExtensionBase::CallJsOnSessionCreate(const AAFwk::Want &want, const spt HILOG_ERROR("Failed to get want"); return false; } - napi_value nativeContentSession = - JsUIExtensionContentSession::CreateJsUIExtensionContentSession(env, sessionInfo, uiWindow); + napi_value nativeContentSession = JsUIExtensionContentSession::CreateJsUIExtensionContentSession( + env, sessionInfo, uiWindow, context_, abilityResultListeners_); if (nativeContentSession == nullptr) { HILOG_ERROR("Failed to get contentSession"); return false; @@ -568,6 +570,9 @@ void JsUIExtensionBase::DestroyWindow(const sptr &sessionInf uiWindowMap_.erase(componentId); foregroundWindows_.erase(componentId); contentSessions_.erase(componentId); + if (abilityResultListeners_) { + abilityResultListeners_->RemoveListener(componentId); + } } napi_value JsUIExtensionBase::CallObjectMethod(const char *name, napi_value const *argv, size_t argc) @@ -682,6 +687,11 @@ void JsUIExtensionBase::OnAbilityResult(int32_t requestCode, int32_t resultCode, return; } context_->OnAbilityResult(requestCode, resultCode, resultData); + if (abilityResultListeners_ == nullptr) { + HILOG_WARN("abilityResultListensers is nullptr"); + return; + } + abilityResultListeners_->OnAbilityResult(requestCode, resultCode, resultData); } void JsUIExtensionBase::SetAbilityInfo(const std::shared_ptr &abilityInfo) diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_content_session.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_content_session.cpp index 0eab504fd2..59aa39bb3a 100644 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_content_session.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension_content_session.cpp @@ -61,6 +61,33 @@ do { } \ } while (0) +void AbilityResultListeners::AddListener(const uint64_t &uiExtensionComponentId, + std::shared_ptr listener) +{ + if (uiExtensionComponentId == 0) { + HILOG_ERROR("Invalid session."); + return; + } + listeners_[uiExtensionComponentId] = listener; +} + +void AbilityResultListeners::RemoveListener(const uint64_t &uiExtensionComponentId) +{ + if (listeners_.find(uiExtensionComponentId) != listeners_.end()) { + listeners_.erase(uiExtensionComponentId); + } +} + +void AbilityResultListeners::OnAbilityResult(int requestCode, int resultCode, const Want &resultData) +{ + for (auto item:listeners_) { + if (item.second && item.second->IsMatch(requestCode)) { + item.second->OnAbilityResult(requestCode, resultCode, resultData); + return; + } + } +} + void UISessionAbilityResultListener::OnAbilityResult(int requestCode, int resultCode, const Want &resultData) { HILOG_DEBUG("begin."); diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h index 97f21207ff..71181e7abb 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h @@ -17,6 +17,7 @@ #define OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_H #include "configuration.h" +#include "js_ui_extension_content_session.h" #include "ui_extension.h" #include @@ -29,27 +30,6 @@ class JsRuntime; /** * @brief Basic ui extension components. */ - - -class AbilityResultListener { -public: - AbilityResultListener() = default; - virtual ~AbilityResultListener() = default; - virtual void OnAbilityResult(int requestCode, int resultCode, const Want &resultData) = 0; - virtual bool IsMatch(int requestCode) = 0; -}; - -class AbilityResultListeners { -public: - AbilityResultListeners() = default; - virtual ~AbilityResultListeners() = default; - void AddListener(const uint64_t &uiExtensionComponentId, std::shared_ptr listener); - void RemoveListener(const uint64_t &uiExtensionComponentId); - void OnAbilityResult(int requestCode, int resultCode, const Want &resultData); -private: - std::map> listeners_; -}; - class JsUIExtension : public UIExtension { public: explicit JsUIExtension(JsRuntime& jsRuntime); diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_base.h b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_base.h index 602b3787e8..a85207dbbd 100644 --- a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_base.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_base.h @@ -20,6 +20,7 @@ #include "ability_local_record.h" #include "configuration.h" #include "js_extension_common.h" +#include "js_ui_extension_content_session.h" #include "native_engine/native_engine.h" #include "ohos_application.h" #include "session_info.h" @@ -170,6 +171,7 @@ private: std::map> uiWindowMap_; std::set foregroundWindows_; std::map> contentSessions_; + std::shared_ptr abilityResultListeners_ = nullptr; std::shared_ptr abilityInfo_; std::shared_ptr context_; sptr token_ = nullptr; diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_content_session.h b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_content_session.h index 806b2fcfde..003e387816 100644 --- a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_content_session.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension_content_session.h @@ -19,7 +19,6 @@ #include "native_engine/native_engine.h" #include "js_free_install_observer.h" #include "js_runtime_utils.h" -#include "js_ui_extension.h" #include "session_info.h" #include "start_options.h" #include "window.h" @@ -28,13 +27,32 @@ namespace OHOS { namespace AbilityRuntime { using RuntimeTask = std::function; +class AbilityResultListener { +public: + AbilityResultListener() = default; + virtual ~AbilityResultListener() = default; + virtual void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData) = 0; + virtual bool IsMatch(int requestCode) = 0; +}; + +class AbilityResultListeners { +public: + AbilityResultListeners() = default; + virtual ~AbilityResultListeners() = default; + void AddListener(const uint64_t &uiExtensionComponentId, std::shared_ptr listener); + void RemoveListener(const uint64_t &uiExtensionComponentId); + void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData); +private: + std::map> listeners_; +}; + class UISessionAbilityResultListener : public AbilityResultListener { public: UISessionAbilityResultListener() = default; virtual ~UISessionAbilityResultListener() = default; - virtual void OnAbilityResult(int requestCode, int resultCode, const Want &resultData); + virtual void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData); virtual bool IsMatch(int requestCode); - void OnAbilityResultInner(int requestCode, int resultCode, const Want &resultData); + void OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want &resultData); void SaveResultCallbacks(int requestCode, RuntimeTask&& task); private: std::map resultCallbacks_;