From 84fbd7434579f14261c46a50a940fef071ac2a64 Mon Sep 17 00:00:00 2001 From: wangdongdong Date: Wed, 12 Jan 2022 15:31:26 +0800 Subject: [PATCH 1/2] Signed-off-by: wangdongdong Change-Id: Ibbfadcce94d10df2e99af7e4f98ffee4bc185349 Signed-off-by: wangdongdong Change-Id: Ia17fda0adcef8d18f8b882a9ad39adb0d7b35425 --- .../kits/ability/native/include/ability.h | 16 ++++ .../include/ability_runtime/js_ability.h | 1 + .../distributed/continuation_manager.h | 8 +- .../kits/ability/native/src/ability.cpp | 23 +++++ .../native/src/ability_runtime/js_ability.cpp | 34 ++++++++ .../distributed/continuation_handler.cpp | 12 +-- .../distributed/continuation_manager.cpp | 84 ++++++++++++++++++- interfaces/kits/napi/aafwk/ability/ability.js | 1 + 8 files changed, 170 insertions(+), 9 deletions(-) mode change 100644 => 100755 frameworks/kits/ability/native/include/ability.h mode change 100644 => 100755 frameworks/kits/ability/native/include/ability_runtime/js_ability.h mode change 100644 => 100755 interfaces/kits/napi/aafwk/ability/ability.js diff --git a/frameworks/kits/ability/native/include/ability.h b/frameworks/kits/ability/native/include/ability.h old mode 100644 new mode 100755 index b078ab08d93..332ee388ba3 --- a/frameworks/kits/ability/native/include/ability.h +++ b/frameworks/kits/ability/native/include/ability.h @@ -1274,6 +1274,22 @@ public: */ std::weak_ptr GetContinuationRegisterManager(); + /** + * @brief Prepare user data of local Ability. + * + * @param wantParams Indicates the user data to be saved. + * @return If the ability is willing to continue and data saved successfully, it returns true; + * otherwise, it returns false. + */ + virtual bool OnContinue(WantParams &wantParams); + + /** + * @brief Get page ability stack info. + * + * @return A string represents page ability stack info, empty if failed; + */ + virtual const std::string& GetContentInfo(); + /** * @brief Migrates this ability to the given device on the same distributed network. The ability to migrate and its * ability slices must implement the IAbilityContinuation interface. diff --git a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h old mode 100644 new mode 100755 index 54cc070f8c2..7c2d5204f3d --- a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h +++ b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h @@ -51,6 +51,7 @@ public: void OnForeground(const Want &want) override; void OnBackground() override; + bool OnContinue(WantParams &wantParams) override; void OnAbilityResult(int requestCode, int resultCode, const Want &resultData) override; void OnRequestPermissionsFromUserResult( diff --git a/frameworks/kits/ability/native/include/continuation/distributed/continuation_manager.h b/frameworks/kits/ability/native/include/continuation/distributed/continuation_manager.h index 2cf3a35a47b..e47be5e1a0b 100644 --- a/frameworks/kits/ability/native/include/continuation/distributed/continuation_manager.h +++ b/frameworks/kits/ability/native/include/continuation/distributed/continuation_manager.h @@ -51,7 +51,11 @@ public: bool StartContinuation(); - bool OnContinue(WantParams &wantParams); + int32_t OnContinue(WantParams &wantParams); + + int32_t OnStartAndSaveData(WantParams &wantParams); + + int32_t OnContinueAndGetContent(WantParams &wantParams); bool SaveData(WantParams &saveData); @@ -97,6 +101,8 @@ private: bool DoRestoreFromRemote(const WantParams &restoreData); + bool GetContentInfo(WantParams &wantParams); + sptr continueToken_ = nullptr; std::weak_ptr ability_; std::weak_ptr abilityInfo_; diff --git a/frameworks/kits/ability/native/src/ability.cpp b/frameworks/kits/ability/native/src/ability.cpp index d266dca5e9c..0a9b7dfa273 100755 --- a/frameworks/kits/ability/native/src/ability.cpp +++ b/frameworks/kits/ability/native/src/ability.cpp @@ -1614,6 +1614,29 @@ std::weak_ptr Ability::GetContinuationRegisterMana return continuationRegisterManager; } +/** + * @brief Callback function to ask the user to prepare for the migration . + * + * @return If the user allows migration and saves data suscessfully, it returns true; otherwise, it returns false. + */ +bool Ability::OnContinue(WantParams &wantParams) +{ + return false; +} + +/** + * @brief Get page ability stack info. + * + * @return A string represents page ability stack info, empty if failed; + */ +const std::string& Ability::GetContentInfo() +{ + if (scene_ == nullptr) { + return ""; + } + return scene_->GetContentInfo(); +} + /** * @brief Migrates this ability to the given device on the same distributed network. The ability to migrate and its * ability slices must implement the IAbilityContinuation interface. diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp index e087171f79f..44a52416f2c 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -185,6 +185,40 @@ void JsAbility::OnBackground() CallObjectMethod("onBackground"); } +bool JsAbility::OnContinue(WantParams &wantParams) +{ + HandleScope handleScope(jsRuntime_); + auto& nativeEngine = jsRuntime_.GetNativeEngine(); + + NativeValue* value = jsAbilityObj_->Get(); + NativeObject* obj = ConvertNativeValueTo(value); + if (obj == nullptr) { + HILOG_ERROR("Failed to get Ability object"); + return false; + } + + NativeValue* methodOnCreate = obj->GetProperty("onContinue"); + if (methodOnCreate == nullptr) { + HILOG_ERROR("Failed to get 'onContinue' from Ability object"); + return false; + } + + napi_value napiWantParams = OHOS::AppExecFwk::WrapWantParams(reinterpret_cast(&nativeEngine), wantParams); + NativeValue* jsWantParams = reinterpret_cast(napiWantParams); + + NativeValue* result = nativeEngine.CallFunction(value, methodOnCreate, &jsWantParams, 1); + + napi_value new_napiWantParams = reinterpret_cast(jsWantParams); + OHOS::AppExecFwk::UnwrapWantParams(reinterpret_cast(&nativeEngine), new_napiWantParams, wantParams); + + NativeBoolean* boolResult = ConvertNativeValueTo(result); + if (boolResult == nullptr) { + return false; + } + + return *boolResult; +} + void JsAbility::OnAbilityResult(int requestCode, int resultCode, const Want &resultData) { HILOG_INFO("%{public}s begin.", __func__); diff --git a/frameworks/kits/ability/native/src/continuation/distributed/continuation_handler.cpp b/frameworks/kits/ability/native/src/continuation/distributed/continuation_handler.cpp index d0e424c9219..e17a54cc5d0 100644 --- a/frameworks/kits/ability/native/src/continuation/distributed/continuation_handler.cpp +++ b/frameworks/kits/ability/native/src/continuation/distributed/continuation_handler.cpp @@ -23,7 +23,6 @@ using OHOS::AAFwk::WantParams; namespace OHOS { namespace AppExecFwk { const std::string ContinuationHandler::ORIGINAL_DEVICE_ID("deviceId"); -const int32_t ABILITY_REJECTED = 29360197; ContinuationHandler::ContinuationHandler( std::weak_ptr &continuationManager, std::weak_ptr &ability) { @@ -52,14 +51,15 @@ bool ContinuationHandler::HandleStartContinuationWithStack(const sptrOnContinue(wantParams)) { - APP_LOGI("HandleStartContinuationWithStack: OnContinue failed, BundleName = %{public}s, ClassName= %{public}s", + int32_t status = continuationManagerTmp->OnContinue(wantParams); + if (status != ERR_OK) { + APP_LOGI("OnContinue failed, BundleName = %{public}s, ClassName= %{public}s, status: %{public}d", abilityInfo_->bundleName.c_str(), - abilityInfo_->name.c_str()); - status = ABILITY_REJECTED; + abilityInfo_->name.c_str(), + status); } Want want = SetWantParams(wantParams); diff --git a/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp b/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp index dcb69ac750f..b796eec8e64 100644 --- a/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp +++ b/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp @@ -23,12 +23,19 @@ #include "distributed_client.h" #include "operation_builder.h" #include "string_ex.h" +#include "string_wrapper.h" #include "want.h" namespace OHOS { namespace AppExecFwk { const int ContinuationManager::TIMEOUT_MS_WAIT_DMS_NOTIFY_CONTINUATION_COMPLETE = 25000; const int ContinuationManager::TIMEOUT_MS_WAIT_REMOTE_NOTIFY_BACK = 6000; +const int TARGET_VERSION_THRESHOLDS = 8; +const std::string PAGE_STACK_PROPERTY_NAME = "pageStack"; +const int32_t CONTINUE_ABILITY_REJECTED = 29360197; +const int32_t CONTINUE_SAVE_DATA_FAILED = 29360198; +const int32_t CONTINUE_ON_CONTINUE_FAILED = 29360199; +const int32_t CONTINUE_GET_CONTENT_FAILED = 29360200; ContinuationManager::ContinuationManager() { @@ -120,14 +127,87 @@ bool ContinuationManager::HandleContinueAbilityWithStack(const std::string &devi return true; } -bool ContinuationManager::OnContinue(WantParams &wantParams) +int32_t ContinuationManager::OnStartAndSaveData(WantParams &wantParams) { + APP_LOGI("%{public}s called begin", __func__); + if (!StartContinuation()) { + APP_LOGE("Ability rejected."); + return CONTINUE_ABILITY_REJECTED; + } + if (!SaveData(wantParams)) { + APP_LOGE("SaveData failed."); + return CONTINUE_SAVE_DATA_FAILED; + } + APP_LOGI("%{public}s called end", __func__); + return ERR_OK; +} + +int32_t ContinuationManager::OnContinueAndGetContent(WantParams &wantParams) +{ + APP_LOGI("%{public}s called begin", __func__); std::shared_ptr ability = nullptr; ability = ability_.lock(); if (ability == nullptr) { - APP_LOGE("ContinuationManager::CheckContinuationIllegal failed. ability is nullptr"); + APP_LOGE("ability is nullptr"); + return ERR_INVALID_VALUE; + } + + bool status; + APP_LOGI("OnContinue begin"); + status = ability->OnContinue(wantParams); + APP_LOGI("OnContinue end"); + if (!status) { + APP_LOGE("OnContinue failed."); + return CONTINUE_ON_CONTINUE_FAILED; + } + + status = GetContentInfo(wantParams); + if (!status) { + APP_LOGE("GetContentInfo failed."); + return CONTINUE_GET_CONTENT_FAILED; + } + APP_LOGI("%{public}s called end", __func__); + return ERR_OK; +} + +int32_t ContinuationManager::OnContinue(WantParams &wantParams) +{ + APP_LOGI("%{public}s called begin", __func__); + std::shared_ptr ability = nullptr; + ability = ability_.lock(); + if (ability == nullptr) { + APP_LOGE("ability is nullptr"); + return ERR_INVALID_VALUE; + } + + int32_t apiVersion = ability->GetCompatibleVersion(); + APP_LOGI("ability api version is %{public}d", apiVersion); + if (apiVersion < TARGET_VERSION_THRESHOLDS) { + return OnStartAndSaveData(wantParams); + } else { + return OnContinueAndGetContent(wantParams); + } +} + +bool ContinuationManager::GetContentInfo(WantParams &wantParams) +{ + APP_LOGI("%{public}s called begin", __func__); + std::shared_ptr ability = nullptr; + ability = ability_.lock(); + if (ability == nullptr) { + APP_LOGE("ability is nullptr"); return false; } + + std::string pageStack = ability->GetContentInfo(); + if (pageStack.empty()) { + APP_LOGE("GetContentInfo failed."); + return false; + } + APP_LOGI("ability pageStack: %{public}s", pageStack.c_str()); + wantParams.SetParam(PAGE_STACK_PROPERTY_NAME, String::Box(pageStack)); + + APP_LOGI("%{public}s called end", __func__); return true; } diff --git a/interfaces/kits/napi/aafwk/ability/ability.js b/interfaces/kits/napi/aafwk/ability/ability.js old mode 100644 new mode 100755 index 01d390e9d6e..175bce40430 --- a/interfaces/kits/napi/aafwk/ability/ability.js +++ b/interfaces/kits/napi/aafwk/ability/ability.js @@ -22,6 +22,7 @@ class Ability { onForeground(want) {} onBackground() {} onWindowStageRestore(windowStage) {} + onContinue(wantParams) {} } export default Ability -- Gitee From 30a3973ca5249c167d574015026393ebd6696488 Mon Sep 17 00:00:00 2001 From: wangdongdong Date: Thu, 13 Jan 2022 11:57:10 +0800 Subject: [PATCH 2/2] Signed-off-by: wangdongdong Change-Id: I0928cd2c67b25c8f6dabc8043b3abdd23f158019 Signed-off-by: wangdongdong Change-Id: Ia15b60801949e495421616afb07ff71ca8fff9ec --- .../kits/ability/native/src/ability_impl.cpp | 3 ++- .../distributed/continuation_manager.cpp | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/frameworks/kits/ability/native/src/ability_impl.cpp b/frameworks/kits/ability/native/src/ability_impl.cpp index feb6cc865b5..046828af451 100755 --- a/frameworks/kits/ability/native/src/ability_impl.cpp +++ b/frameworks/kits/ability/native/src/ability_impl.cpp @@ -66,7 +66,8 @@ void AbilityImpl::Start(const Want &want) return; } - if (ability_->GetAbilityInfo()->type == AbilityType::PAGE) { + if ((ability_->GetAbilityInfo()->type == AbilityType::PAGE) && + (ability_->GetCompatibleVersion() < TARGET_VERSION_THRESHOLDS)) { ability_->HandleCreateAsContinuation(want); } diff --git a/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp b/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp index b796eec8e64..4c83c9a564a 100644 --- a/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp +++ b/frameworks/kits/ability/native/src/continuation/distributed/continuation_manager.cpp @@ -89,10 +89,6 @@ std::string ContinuationManager::GetOriginalDeviceId() void ContinuationManager::ContinueAbilityWithStack(const std::string &deviceId) { APP_LOGI("%{public}s called begin", __func__); - if (CheckContinuationIllegal()) { - APP_LOGE("ContinueAbilityWithStack failed. Ability not available to continueAbility."); - return; - } HandleContinueAbilityWithStack(deviceId); APP_LOGI("%{public}s called end", __func__); @@ -130,11 +126,18 @@ bool ContinuationManager::HandleContinueAbilityWithStack(const std::string &devi int32_t ContinuationManager::OnStartAndSaveData(WantParams &wantParams) { APP_LOGI("%{public}s called begin", __func__); - if (!StartContinuation()) { + std::shared_ptr ability = nullptr; + ability = ability_.lock(); + if (ability == nullptr) { + APP_LOGE("ability is nullptr"); + return ERR_INVALID_VALUE; + } + + if (!ability->OnStartContinuation()) { APP_LOGE("Ability rejected."); return CONTINUE_ABILITY_REJECTED; } - if (!SaveData(wantParams)) { + if (!ability->OnSaveData(wantParams)) { APP_LOGE("SaveData failed."); return CONTINUE_SAVE_DATA_FAILED; } -- Gitee