From 360a3ccb8e4c695fc13c696363f449da97ae5aa7 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Fri, 6 Jun 2025 16:10:49 +0800 Subject: [PATCH] add ets uiability onCollaborate Signed-off-by: zhangzezhong --- .../native/ability_runtime/js_ui_ability.cpp | 36 -------------- .../native/ability_runtime/sts_ui_ability.cpp | 48 ++++++++++++++----- .../native/ability/native/ui_ability.cpp | 38 ++++++++++++++- .../native/ability_runtime/js_ui_ability.h | 9 +--- .../native/ability_runtime/sts_ui_ability.h | 7 +-- .../kits/native/ability/native/ui_ability.h | 9 +++- 6 files changed, 83 insertions(+), 64 deletions(-) diff --git a/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp b/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp index aa29748f183..22f44401754 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp @@ -40,7 +40,6 @@ #include "js_runtime_utils.h" #include "js_utils.h" #ifdef SUPPORT_SCREEN -#include "distributed_client.h" #include "js_window_stage.h" #include "scene_board_judgement.h" #endif @@ -63,13 +62,6 @@ const std::string METHOD_NAME = "WindowScene::GoForeground"; // Numerical base (radix) that determines the valid characters and their interpretation. #ifdef SUPPORT_SCREEN const int32_t BASE_DISPLAY_ID_NUM (10); -constexpr const char* IS_CALLING_FROM_DMS = "supportCollaborativeCallingFromDmsInAAFwk"; -constexpr const char* SUPPORT_COLLABORATE_INDEX = "ohos.extra.param.key.supportCollaborateIndex"; -constexpr const char* COLLABORATE_KEY = "ohos.dms.collabToken"; -enum CollaborateResult { - ACCEPT = 0, - REJECT, -}; #endif constexpr const int32_t API12 = 12; constexpr const int32_t API_VERSION_MOD = 100; @@ -1301,34 +1293,6 @@ int32_t JsUIAbility::OnCollaborate(WantParams &wantParam) ret = (ret == CollaborateResult::ACCEPT) ? CollaborateResult::ACCEPT : CollaborateResult::REJECT; return ret; } - -void JsUIAbility::HandleCollaboration(const Want &want) -{ - HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); - if (abilityInfo_ == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo_"); - return; - } - if (want.GetBoolParam(IS_CALLING_FROM_DMS, false) && - (abilityInfo_->launchMode != AppExecFwk::LaunchMode::SPECIFIED)) { - (const_cast(want)).RemoveParam(IS_CALLING_FROM_DMS); - SetWant(want); - OHOS::AAFwk::WantParams wantParams = want.GetParams(); - int32_t resultCode = OnCollaborate(wantParams); - auto abilityContext = GetAbilityContext(); - if (abilityContext == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext"); - return; - } - OHOS::AAFwk::WantParams param = want.GetParams().GetWantParams(SUPPORT_COLLABORATE_INDEX); - auto collabToken = param.GetStringParam(COLLABORATE_KEY); - auto uid = abilityInfo_->uid; - auto callerPid = getpid(); - auto accessTokenId = abilityInfo_->applicationInfo.accessTokenId; - AAFwk::DistributedClient dmsClient; - dmsClient.OnCollaborateDone(collabToken, resultCode, callerPid, uid, accessTokenId); - } -} #endif int32_t JsUIAbility::OnContinue(WantParams &wantParams, bool &isAsyncOnContinue, diff --git a/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp b/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp index 7c028130760..2da3d99d6bc 100644 --- a/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/sts_ui_ability.cpp @@ -61,18 +61,6 @@ const std::string METHOD_NAME = "WindowScene::GoForeground"; // Numerical base (radix) that determines the valid characters and their interpretation. #ifdef SUPPORT_SCREEN const int32_t BASE_DISPLAY_ID_NUM(10); -enum CollaborateResult { - ACCEPT = 0, - REJECT, -}; -[[maybe_unused]] static CollaborateResult CollaborateResult_ConvertStsToNative(const int32_t index) -{ - return static_cast(index); -} -[[maybe_unused]] static int32_t CollaborateResult_ConvertNativeToSts(const CollaborateResult value) -{ - return value; -} #endif constexpr const int32_t API12 = 12; constexpr const int32_t API_VERSION_MOD = 100; @@ -629,6 +617,7 @@ void StsUIAbility::OnForeground(const Want &want) } UIAbility::OnForeground(want); + HandleCollaboration(want); if (CheckIsSilentForeground()) { TAG_LOGD(AAFwkTag::UIABILITY, "silent foreground, do not call 'onForeground'"); @@ -709,6 +698,10 @@ void StsUIAbility::OnBackground() applicationContext = AbilityRuntime::Context::GetApplicationContext(); if (applicationContext != nullptr) { } + auto want = GetWant(); + if (want != nullptr) { + HandleCollaboration(*want); + } TAG_LOGD(AAFwkTag::UIABILITY, "end"); } @@ -1106,11 +1099,39 @@ int32_t StsUIAbility::OnCollaborate(WantParams &wantParam) HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGD(AAFwkTag::UIABILITY, "OnCollaborate: %{public}s", GetAbilityName().c_str()); int32_t ret = CollaborateResult::REJECT; - + auto env = stsRuntime_.GetAniEnv(); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + return ret; + } if (stsAbilityObj_ == nullptr) { TAG_LOGE(AAFwkTag::UIABILITY, "null stsAbilityObj_"); return ret; } + ani_method method {}; + ani_status status = env->Class_FindMethod(stsAbilityObj_->aniCls, "onCollaborate", nullptr, &method); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::UIABILITY, "Class_FindMethod status: %{public}d", status); + env->ResetError(); + return ret; + } + ani_value args[1] = {}; + ani_ref wantParamsRef = OHOS::AppExecFwk::WrapWantParams(env, wantParam); + if (wantParamsRef == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null wantParamsRef"); + return ret; + } + args[0].r = wantParamsRef; + ani_ref result {}; + if ((status = env->Object_CallMethod_Ref_A(stsAbilityObj_->aniObj, method, &result, args)) != ANI_OK) { + TAG_LOGE(AAFwkTag::UIABILITY, "Object_CallMethod_Ref_A status: %{public}d", status); + return ret; + } + OHOS::AppExecFwk::UnwrapWantParams(env, wantParamsRef, wantParam); + if (!AAFwk::AniEnumConvertUtil::EnumConvertStsToNative(env, reinterpret_cast(result), ret)) { + TAG_LOGE(AAFwkTag::UIABILITY, "EnumConvertStsToNative failed"); + return ret; + } ret = (ret == CollaborateResult::ACCEPT) ? CollaborateResult::ACCEPT : CollaborateResult::REJECT; return ret; } @@ -1184,6 +1205,7 @@ void StsUIAbility::OnNewWant(const Want &want) if (scene_) { scene_->OnNewWant(want); } + HandleCollaboration(want); #endif auto env = stsRuntime_.GetAniEnv(); if (env == nullptr) { diff --git a/frameworks/native/ability/native/ui_ability.cpp b/frameworks/native/ability/native/ui_ability.cpp index 492b0632eef..1ef71e38bc7 100644 --- a/frameworks/native/ability/native/ui_ability.cpp +++ b/frameworks/native/ability/native/ui_ability.cpp @@ -37,6 +37,9 @@ #ifdef SUPPORT_GRAPHICS #include "wm_common.h" #endif +#ifdef SUPPORT_SCREEN +#include "distributed_client.h" +#endif namespace OHOS { namespace AbilityRuntime { @@ -69,6 +72,9 @@ constexpr char DLP_PARAMS_SECURITY_FLAG[] = "ohos.dlp.params.securityFlag"; constexpr char COMPONENT_STARTUP_NEW_RULES[] = "component.startup.newRules"; #ifdef SUPPORT_SCREEN constexpr int32_t ERR_INVALID_VALUE = -1; +constexpr const char* IS_CALLING_FROM_DMS = "supportCollaborativeCallingFromDmsInAAFwk"; +constexpr const char* SUPPORT_COLLABORATE_INDEX = "ohos.extra.param.key.supportCollaborateIndex"; +constexpr const char* COLLABORATE_KEY = "ohos.dms.collabToken"; #endif } UIAbility *UIAbility::Create(const std::unique_ptr &runtime) @@ -892,7 +898,37 @@ void UIAbility::OnLeaveForeground() void UIAbility::HandleCollaboration(const AAFwk::Want &want) { - TAG_LOGD(AAFwkTag::UIABILITY, "called"); + TAG_LOGD(AAFwkTag::UIABILITY, "HandleCollaboration called"); + HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); + if (abilityInfo_ == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null abilityInfo_"); + return; + } + if (want.GetBoolParam(IS_CALLING_FROM_DMS, false) && + (abilityInfo_->launchMode != AppExecFwk::LaunchMode::SPECIFIED)) { + (const_cast(want)).RemoveParam(IS_CALLING_FROM_DMS); + SetWant(want); + OHOS::AAFwk::WantParams wantParams = want.GetParams(); + int32_t resultCode = OnCollaborate(wantParams); + auto abilityContext = GetAbilityContext(); + if (abilityContext == nullptr) { + TAG_LOGE(AAFwkTag::UIABILITY, "null abilityContext"); + return; + } + OHOS::AAFwk::WantParams param = want.GetParams().GetWantParams(SUPPORT_COLLABORATE_INDEX); + auto collabToken = param.GetStringParam(COLLABORATE_KEY); + auto uid = abilityInfo_->uid; + auto callerPid = getpid(); + auto accessTokenId = abilityInfo_->applicationInfo.accessTokenId; + AAFwk::DistributedClient dmsClient; + dmsClient.OnCollaborateDone(collabToken, resultCode, callerPid, uid, accessTokenId); + } +} + +int32_t UIAbility::OnCollaborate(WantParams &wantParams) +{ + TAG_LOGD(AAFwkTag::UIABILITY, "OnCollaborate called"); + return CollaborateResult::REJECT; } std::string UIAbility::GetContentInfo() diff --git a/interfaces/kits/native/ability/native/ability_runtime/js_ui_ability.h b/interfaces/kits/native/ability/native/ability_runtime/js_ui_ability.h index 284b3965978..18be575c9d3 100644 --- a/interfaces/kits/native/ability/native/ability_runtime/js_ui_ability.h +++ b/interfaces/kits/native/ability/native/ability_runtime/js_ui_ability.h @@ -333,11 +333,7 @@ public: const std::shared_ptr &executeParam, std::unique_ptr callback) override; - /** - * @brief Called when distributed system trying to collaborate remote ability. - * @param want want with collaborative info. - */ - void HandleCollaboration(const Want &want) override; + int32_t OnCollaborate(WantParams &wantParams) override; protected: void DoOnForeground(const Want &want) override; @@ -352,8 +348,7 @@ private: inline bool GetInsightIntentExecutorInfo(const Want &want, const std::shared_ptr &executeParam, InsightIntentExecutorInfo& executeInfo); - int32_t OnCollaborate(WantParams &wantParams); - + std::shared_ptr jsWindowStageObj_; int32_t windowMode_ = 0; #endif diff --git a/interfaces/kits/native/ability/native/ability_runtime/sts_ui_ability.h b/interfaces/kits/native/ability/native/ability_runtime/sts_ui_ability.h index c3019ded152..2ee68eef261 100644 --- a/interfaces/kits/native/ability/native/ability_runtime/sts_ui_ability.h +++ b/interfaces/kits/native/ability/native/ability_runtime/sts_ui_ability.h @@ -280,11 +280,7 @@ public: const std::shared_ptr &executeParam, std::unique_ptr callback) override; - // /** - // * @brief Called when distributed system trying to collaborate remote ability. - // * @param want want with collaborative info. - // */ - // void HandleCollaboration(const Want &want) override; + int32_t OnCollaborate(WantParams &wantParams) override; protected: void DoOnForeground(const Want &want) override; @@ -299,7 +295,6 @@ private: inline bool GetInsightIntentExecutorInfo(const Want &want, const std::shared_ptr &executeParam, InsightIntentExecutorInfo& executeInfo); - int32_t OnCollaborate(WantParams &wantParams); std::shared_ptr stsWindowStageObj_; int32_t windowMode_ = 0; diff --git a/interfaces/kits/native/ability/native/ui_ability.h b/interfaces/kits/native/ability/native/ui_ability.h index 59ede4873f0..be461da3668 100644 --- a/interfaces/kits/native/ability/native/ui_ability.h +++ b/interfaces/kits/native/ability/native/ui_ability.h @@ -379,6 +379,11 @@ private: public: uint32_t sceneFlag_ = 0; + enum CollaborateResult { + ACCEPT = 0, + REJECT, + }; + /** * @brief Called after instantiating WindowScene. * You can override this function to implement your own processing logic. @@ -606,7 +611,9 @@ public: * @brief Called when distributed system trying to collaborate remote ability. * @param want want with collaborative info. */ - virtual void HandleCollaboration(const AAFwk::Want &want); + void HandleCollaboration(const AAFwk::Want &want); + + virtual int32_t OnCollaborate(WantParams &wantParams); protected: class UIAbilityDisplayListener : public OHOS::Rosen::IDisplayInfoChangedListener { -- Gitee