diff --git a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h index dd59355bba7f11c2b12b85c6db6f913363cda121..6ddd83874c3203bc02e66c8de57cb5bff4b15fad 100755 --- a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h +++ b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h @@ -34,9 +34,9 @@ using AbilityStartSetting = AppExecFwk::AbilityStartSetting; class JsAbility : public Ability { public: - static Ability* Create(const std::unique_ptr& runtime); + static Ability *Create(const std::unique_ptr &runtime); - JsAbility(JsRuntime& jsRuntime); + JsAbility(JsRuntime &jsRuntime); ~JsAbility() override; void Init(const std::shared_ptr &abilityInfo, const std::shared_ptr &application, @@ -52,20 +52,21 @@ public: void OnForeground(const Want &want) override; void OnBackground() override; bool OnContinue(WantParams &wantParams) override; + void OnNewWant(const Want &want) override; void OnAbilityResult(int requestCode, int resultCode, const Want &resultData) override; void OnRequestPermissionsFromUserResult( int requestCode, const std::vector &permissions, const std::vector &grantResults) override; protected: - void DoOnForeground(const Want& want) override; + void DoOnForeground(const Want &want) override; private: - void CallObjectMethod(const char* name, NativeValue* const* argv = nullptr, size_t argc = 0); + void CallObjectMethod(const char *name, NativeValue *const *argv = nullptr, size_t argc = 0); std::unique_ptr CreateAppWindowStage(); - void GetPageStackFromWant(const Want& want, std::string& pageStack); + void GetPageStackFromWant(const Want &want, std::string &pageStack); - JsRuntime& jsRuntime_; + JsRuntime &jsRuntime_; std::unique_ptr jsAbilityObj_; }; } // namespace AbilityRuntime 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 6da103b7cad5400084b992e0535b0e15b32cf9bc..0038c9a5d932f6d1bb05dbd084e808affc18f580 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -31,12 +31,13 @@ namespace OHOS { namespace AbilityRuntime { const std::string PAGE_STACK_PROPERTY_NAME = "pageStack"; -Ability* JsAbility::Create(const std::unique_ptr& runtime) +Ability *JsAbility::Create(const std::unique_ptr &runtime) { - return new JsAbility(static_cast(*runtime)); + return new JsAbility(static_cast(*runtime)); } -JsAbility::JsAbility(JsRuntime& jsRuntime) : jsRuntime_(jsRuntime) {} +JsAbility::JsAbility(JsRuntime &jsRuntime) : jsRuntime_(jsRuntime) +{} JsAbility::~JsAbility() = default; void JsAbility::Init(const std::shared_ptr &abilityInfo, @@ -74,18 +75,18 @@ void JsAbility::Init(const std::shared_ptr &abilityInfo, moduleName.append("::").append(abilityInfo->name); HandleScope handleScope(jsRuntime_); - auto& engine = jsRuntime_.GetNativeEngine(); + auto &engine = jsRuntime_.GetNativeEngine(); jsAbilityObj_ = jsRuntime_.LoadModule(moduleName, srcPath); - NativeObject* obj = ConvertNativeValueTo(jsAbilityObj_->Get()); + NativeObject *obj = ConvertNativeValueTo(jsAbilityObj_->Get()); if (obj == nullptr) { HILOG_ERROR("Failed to get AbilityStage object"); return; } auto context = GetAbilityContext(); - NativeValue* contextObj = CreateJsAbilityContext(engine, context); + NativeValue *contextObj = CreateJsAbilityContext(engine, context); auto shellContextRef = jsRuntime_.LoadSystemModule("application.AbilityContext", &contextObj, 1); contextObj = shellContextRef->Get(); @@ -100,11 +101,13 @@ void JsAbility::Init(const std::shared_ptr &abilityInfo, HILOG_INFO("Set ability context pointer: %{public}p", context.get()); - nativeObj->SetNativePointer(new std::weak_ptr(context), - [](NativeEngine*, void* data, void*) { + nativeObj->SetNativePointer( + new std::weak_ptr(context), + [](NativeEngine *, void *data, void *) { HILOG_INFO("Finalizer for weak_ptr ability context is called"); - delete static_cast*>(data); - }, nullptr); + delete static_cast *>(data); + }, + nullptr); } void JsAbility::OnStart(const Want &want) @@ -117,22 +120,22 @@ void JsAbility::OnStart(const Want &want) } HandleScope handleScope(jsRuntime_); - auto& nativeEngine = jsRuntime_.GetNativeEngine(); + auto &nativeEngine = jsRuntime_.GetNativeEngine(); - NativeValue* value = jsAbilityObj_->Get(); - NativeObject* obj = ConvertNativeValueTo(value); + NativeValue *value = jsAbilityObj_->Get(); + NativeObject *obj = ConvertNativeValueTo(value); if (obj == nullptr) { HILOG_ERROR("Failed to get Ability object"); return; } napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast(&nativeEngine), want); - NativeValue* jsWant = reinterpret_cast(napiWant); + NativeValue *jsWant = reinterpret_cast(napiWant); obj->SetProperty("launchWant", jsWant); obj->SetProperty("lastRequestWant", jsWant); - NativeValue* argv[] = { + NativeValue *argv[] = { jsWant, CreateJsLaunchParam(nativeEngine, GetLaunchParam()), }; @@ -159,7 +162,7 @@ void JsAbility::OnSceneCreated() HILOG_ERROR("Failed to create jsAppWindowStage object by LoadSystemModule"); return; } - NativeValue* argv[] = {jsAppWindowStage->Get()}; + NativeValue *argv[] = {jsAppWindowStage->Get()}; CallObjectMethod("onWindowStageCreate", argv, ArraySize(argv)); } @@ -172,7 +175,7 @@ void JsAbility::OnSceneRestored() HILOG_ERROR("Failed to create jsAppWindowStage object by LoadSystemModule"); return; } - NativeValue* argv[] = {jsAppWindowStage->Get()}; + NativeValue *argv[] = {jsAppWindowStage->Get()}; CallObjectMethod("onWindowStageRestore", argv, ArraySize(argv)); } @@ -188,17 +191,17 @@ void JsAbility::OnForeground(const Want &want) Ability::OnForeground(want); HandleScope handleScope(jsRuntime_); - auto& nativeEngine = jsRuntime_.GetNativeEngine(); + auto &nativeEngine = jsRuntime_.GetNativeEngine(); - NativeValue* value = jsAbilityObj_->Get(); - NativeObject* obj = ConvertNativeValueTo(value); + NativeValue *value = jsAbilityObj_->Get(); + NativeObject *obj = ConvertNativeValueTo(value); if (obj == nullptr) { HILOG_ERROR("Failed to get Ability object"); return; } napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast(&nativeEngine), want); - NativeValue* jsWant = reinterpret_cast(napiWant); + NativeValue *jsWant = reinterpret_cast(napiWant); obj->SetProperty("lastRequestWant", jsWant); @@ -215,30 +218,30 @@ void JsAbility::OnBackground() bool JsAbility::OnContinue(WantParams &wantParams) { HandleScope handleScope(jsRuntime_); - auto& nativeEngine = jsRuntime_.GetNativeEngine(); + auto &nativeEngine = jsRuntime_.GetNativeEngine(); - NativeValue* value = jsAbilityObj_->Get(); - NativeObject* obj = ConvertNativeValueTo(value); + 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"); + 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 *jsWantParams = reinterpret_cast(napiWantParams); - NativeValue* result = nativeEngine.CallFunction(value, methodOnCreate, &jsWantParams, 1); + 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); + NativeBoolean *boolResult = ConvertNativeValueTo(result); if (boolResult == nullptr) { return false; } @@ -246,6 +249,30 @@ bool JsAbility::OnContinue(WantParams &wantParams) return *boolResult; } +void JsAbility::OnNewWant(const Want &want) +{ + HILOG_INFO("%{public}s begin.", __func__); + Ability::OnNewWant(want); + + 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; + } + + napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast(&nativeEngine), want); + NativeValue *jsWant = reinterpret_cast(napiWant); + + obj->SetProperty("lastRequestWant", jsWant); + + CallObjectMethod("onNewWant", &jsWant, 1); + HILOG_INFO("%{public}s end.", __func__); +} + void JsAbility::OnAbilityResult(int requestCode, int resultCode, const Want &resultData) { HILOG_INFO("%{public}s begin.", __func__); @@ -259,13 +286,13 @@ void JsAbility::OnAbilityResult(int requestCode, int resultCode, const Want &res HILOG_INFO("%{public}s end.", __func__); } -void JsAbility::OnRequestPermissionsFromUserResult(int requestCode, const std::vector &permissions, - const std::vector &grantResults) +void JsAbility::OnRequestPermissionsFromUserResult( + int requestCode, const std::vector &permissions, const std::vector &grantResults) { HILOG_INFO("%{public}s called.", __func__); } -void JsAbility::CallObjectMethod(const char* name, NativeValue* const* argv, size_t argc) +void JsAbility::CallObjectMethod(const char *name, NativeValue *const *argv, size_t argc) { HILOG_INFO("JsAbility::CallObjectMethod(%{public}s", name); @@ -275,16 +302,16 @@ void JsAbility::CallObjectMethod(const char* name, NativeValue* const* argv, siz } HandleScope handleScope(jsRuntime_); - auto& nativeEngine = jsRuntime_.GetNativeEngine(); + auto &nativeEngine = jsRuntime_.GetNativeEngine(); - NativeValue* value = jsAbilityObj_->Get(); - NativeObject* obj = ConvertNativeValueTo(value); + NativeValue *value = jsAbilityObj_->Get(); + NativeObject *obj = ConvertNativeValueTo(value); if (obj == nullptr) { HILOG_ERROR("Failed to get Ability object"); return; } - NativeValue* methodOnCreate = obj->GetProperty(name); + NativeValue *methodOnCreate = obj->GetProperty(name); if (methodOnCreate == nullptr) { HILOG_ERROR("Failed to get '%{public}s' from Ability object", name); return; @@ -295,8 +322,8 @@ void JsAbility::CallObjectMethod(const char* name, NativeValue* const* argv, siz std::unique_ptr JsAbility::CreateAppWindowStage() { HandleScope handleScope(jsRuntime_); - auto& engine = jsRuntime_.GetNativeEngine(); - NativeValue* jsWindowStage = CreateJsWindowStage(engine, GetScene()); + auto &engine = jsRuntime_.GetNativeEngine(); + NativeValue *jsWindowStage = CreateJsWindowStage(engine, GetScene()); if (jsWindowStage == nullptr) { HILOG_ERROR("Failed to create jsWindowSatge object"); return nullptr; @@ -304,7 +331,7 @@ std::unique_ptr JsAbility::CreateAppWindowStage() return jsRuntime_.LoadSystemModule("application.WindowStage", &jsWindowStage, 1); } -void JsAbility::GetPageStackFromWant(const Want& want, std::string& pageStack) +void JsAbility::GetPageStackFromWant(const Want &want, std::string &pageStack) { auto stringObj = AAFwk::IString::Query(want.GetParams().GetParam(PAGE_STACK_PROPERTY_NAME)); if (stringObj != nullptr) { @@ -312,7 +339,7 @@ void JsAbility::GetPageStackFromWant(const Want& want, std::string& pageStack) } } -void JsAbility::DoOnForeground(const Want& want) +void JsAbility::DoOnForeground(const Want &want) { if (scene_ == nullptr) { if ((abilityContext_ == nullptr) || (sceneListener_ == nullptr)) { @@ -326,8 +353,8 @@ void JsAbility::DoOnForeground(const Want& want) } int32_t displayId = Rosen::WindowScene::DEFAULT_DISPLAY_ID; if (setting_ != nullptr) { - std::string strDisplayId = setting_->GetProperty( - OHOS::AppExecFwk::AbilityStartSetting::WINDOW_DISPLAY_ID_KEY); + std::string strDisplayId = + setting_->GetProperty(OHOS::AppExecFwk::AbilityStartSetting::WINDOW_DISPLAY_ID_KEY); std::regex formatRegex("[0-9]{0,9}$"); std::smatch sm; bool flag = std::regex_match(strDisplayId, sm, formatRegex); @@ -345,15 +372,16 @@ void JsAbility::DoOnForeground(const Want& want) return; } // multi-instance ability continuation - HILOG_INFO("lauch reason = %{public}d, contentStorage = %{public}p", launchParam_.launchReason, + HILOG_INFO("lauch reason = %{public}d, contentStorage = %{public}p", + launchParam_.launchReason, abilityContext_->GetContentStorage()); if (IsRestoredInContinuation()) { std::string pageStack; GetPageStackFromWant(want, pageStack); HandleScope handleScope(jsRuntime_); - auto& engine = jsRuntime_.GetNativeEngine(); - scene_->GetMainWindow()->SetUIContent(pageStack, &engine, - static_cast(abilityContext_->GetContentStorage()), true); + auto &engine = jsRuntime_.GetNativeEngine(); + scene_->GetMainWindow()->SetUIContent( + pageStack, &engine, static_cast(abilityContext_->GetContentStorage()), true); OnSceneRestored(); NotityContinuationResult(want, true); } else { diff --git a/frameworks/kits/ability/native/src/new_ability_impl.cpp b/frameworks/kits/ability/native/src/new_ability_impl.cpp index 4ef0b322829c61f6733e78a21ae2d3728aee3678..55638e5532d00a31bfabd569e41334c3487e1467 100644 --- a/frameworks/kits/ability/native/src/new_ability_impl.cpp +++ b/frameworks/kits/ability/native/src/new_ability_impl.cpp @@ -80,6 +80,9 @@ bool NewAbilityImpl::AbilityTransaction(const Want &want, const AAFwk::LifeCycle break; } case AAFwk::ABILITY_STATE_FOREGROUND_NEW: { + if (targetState.isNewWant) { + NewWant(want); + } Foreground(want); ret = false; break; diff --git a/interfaces/kits/napi/aafwk/ability/ability.js b/interfaces/kits/napi/aafwk/ability/ability.js index 175bce4043058c98dc3beaff67de79a4a86c1e44..e7a14a4d42c7e3a031d723c2f264c83d892a3421 100755 --- a/interfaces/kits/napi/aafwk/ability/ability.js +++ b/interfaces/kits/napi/aafwk/ability/ability.js @@ -23,6 +23,7 @@ class Ability { onBackground() {} onWindowStageRestore(windowStage) {} onContinue(wantParams) {} + onNewWant(want) {} } export default Ability