diff --git a/frameworks/js/napi/ability/ability.js b/frameworks/js/napi/ability/ability.js index 51a0a28f51..c043d6d578 100644 --- a/frameworks/js/napi/ability/ability.js +++ b/frameworks/js/napi/ability/ability.js @@ -25,9 +25,6 @@ class Ability { onWindowStageDestroy() { } onForeground(want) { } onBackground() { } - onBackPressed() { - return true; - } onPrepareToTerminate() { return false; } diff --git a/frameworks/native/ability/native/ability.cpp b/frameworks/native/ability/native/ability.cpp index 1c1b5aca76..93191641d0 100644 --- a/frameworks/native/ability/native/ability.cpp +++ b/frameworks/native/ability/native/ability.cpp @@ -1547,7 +1547,7 @@ void Ability::OnBackground() bool Ability::OnBackPress() { TAG_LOGD(AAFwkTag::ABILITY, "call"); - return true; + return false; } bool Ability::OnPrepareTerminate() diff --git a/frameworks/native/ability/native/ability_runtime/js_ability.cpp b/frameworks/native/ability/native/ability_runtime/js_ability.cpp index a767ef9e99..508017d1a2 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ability.cpp @@ -548,10 +548,10 @@ bool JsAbility::OnBackPress() HandleScope handleScope(jsRuntime_); auto env = jsRuntime_.GetNapiEnv(); napi_value jsValue = CallObjectMethod("onBackPressed", nullptr, 0, true); - bool ret = true; + bool ret = false; if (!ConvertFromJsValue(env, jsValue, ret)) { TAG_LOGW(AAFwkTag::ABILITY, "Get js value failed"); - return true; + return false; } TAG_LOGD(AAFwkTag::ABILITY, "end, ret = %{public}d", ret); return ret; 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 ba53858c91..85d38670ee 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp @@ -59,6 +59,8 @@ const std::string METHOD_NAME = "WindowScene::GoForeground"; #endif // Numerical base (radix) that determines the valid characters and their interpretation. const int32_t BASE_DISPLAY_ID_NUM (10); +constexpr const int32_t API12 = 12; +constexpr const int32_t API_VERSION_MOD = 100; napi_value PromiseCallback(napi_env env, napi_callback_info info) { @@ -619,11 +621,16 @@ bool JsUIAbility::OnBackPress() UIAbility::OnBackPress(); HandleScope handleScope(jsRuntime_); auto env = jsRuntime_.GetNapiEnv(); - napi_value jsValue = CallObjectMethod("onBackPressed", nullptr, 0, true); - bool ret = true; + napi_value jsValue = CallObjectMethod("onBackPressed", nullptr, 0, true, false); + bool defaultRet = BackPressDefaultValue(); + if (jsValue == nullptr) { + TAG_LOGD(AAFwkTag::UIABILITY, "jsValue is nullptr, return defaultRet %{public}d.", defaultRet); + return defaultRet; + } + bool ret = defaultRet; if (!ConvertFromJsValue(env, jsValue, ret)) { TAG_LOGE(AAFwkTag::UIABILITY, "Get js value failed."); - return true; + return defaultRet; } TAG_LOGD(AAFwkTag::UIABILITY, "End ret is %{public}d.", ret); return ret; @@ -1216,7 +1223,8 @@ sptr JsUIAbility::CallRequest() return remoteCallee_; } -napi_value JsUIAbility::CallObjectMethod(const char *name, napi_value const *argv, size_t argc, bool withResult) +napi_value JsUIAbility::CallObjectMethod(const char *name, napi_value const *argv, size_t argc, bool withResult, + bool showMethodNotFoundLog) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); TAG_LOGD(AAFwkTag::UIABILITY, "Lifecycle: the begin of %{public}s", name); @@ -1237,7 +1245,9 @@ napi_value JsUIAbility::CallObjectMethod(const char *name, napi_value const *arg napi_value methodOnCreate = nullptr; napi_get_named_property(env, obj, name, &methodOnCreate); if (methodOnCreate == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "Failed to get '%{public}s' from Ability object.", name); + if (showMethodNotFoundLog) { + TAG_LOGE(AAFwkTag::UIABILITY, "Failed to get '%{public}s' from Ability object.", name); + } return nullptr; } TryCatch tryCatch(env); @@ -1474,5 +1484,21 @@ void JsUIAbility::UpdateJsWindowStage(napi_value windowStage) TAG_LOGD(AAFwkTag::UIABILITY, "Set context windowStage object."); napi_set_named_property(env, contextObj, "windowStage", windowStage); } + +bool JsUIAbility::CheckSatisfyTargetAPIVersion(int32_t version) +{ + auto applicationInfo = GetApplicationInfo(); + if (!applicationInfo) { + TAG_LOGE(AAFwkTag::UIABILITY, "CheckTargetAPIVersion applicationInfo is nullptr."); + return false; + } + TAG_LOGD(AAFwkTag::UIABILITY, "TargetAPIVersion: %{public}d.", applicationInfo->apiTargetVersion); + return applicationInfo->apiTargetVersion % API_VERSION_MOD >= version; +} + +bool JsUIAbility::BackPressDefaultValue() +{ + return CheckSatisfyTargetAPIVersion(API12) ? true : false; +} } // namespace AbilityRuntime } // namespace OHOS 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 bef28a9823..1ca1430340 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 @@ -293,7 +293,7 @@ private: private: napi_value CallObjectMethod(const char *name, napi_value const *argv = nullptr, size_t argc = 0, - bool withResult = false); + bool withResult = false, bool showMethodNotFoundLog = true); bool CheckPromise(napi_value result); bool CallPromise(napi_value result, AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo); bool CallPromise(napi_value result, int32_t &onContinueRes); @@ -308,6 +308,8 @@ private: void AddLifecycleEventBeforeJSCall(FreezeUtil::TimeoutState state, const std::string &methodName) const; void AddLifecycleEventAfterJSCall(FreezeUtil::TimeoutState state, const std::string &methodName) const; void CreateJSContext(napi_env env, napi_value &contextObj, int32_t screenMode); + bool CheckSatisfyTargetAPIVersion(int32_t targetAPIVersion); + bool BackPressDefaultValue(); JsRuntime &jsRuntime_; std::shared_ptr shellContextRef_;