diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h index 1f460261af1f59c9b31aee5217649f04300c64aa..d058cdf77b41f117e27d687f2785cb43ae9d8511 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/include/ani_window_listener.h @@ -55,8 +55,8 @@ class AniWindowListener : public IWindowChangeListener, public IDisplayIdChangeListener, public IWindowRotationChangeListener { public: - AniWindowListener(ani_env* env, ani_ref callback, CaseType caseType) - : env_(env), aniCallback_(callback), caseType_(caseType), + AniWindowListener(ani_env* env, ani_vm* vm, ani_ref callback, CaseType caseType) + : env_(env), vm_(vm), aniCallback_(callback), caseType_(caseType), weakRef_(wptr (this)) {} ~AniWindowListener(); ani_ref GetAniCallback() const { return aniCallback_; } @@ -109,6 +109,7 @@ private: void LifeCycleCallback(LifeCycleEventType eventType); int64_t noInteractionTimeout_ = 0; ani_env* env_ = nullptr; + ani_vm* vm_ = nullptr; ani_ref aniCallback_; CaseType caseType_ = CaseType::CASE_WINDOW; wptr weakRef_ = nullptr; diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp index eaa798e56797f8e63af464638b1e469e3f898936..7f617a846dd61cfb1cf35f0ab9e412e46a3ed8cd 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window.cpp @@ -1698,27 +1698,27 @@ void AniWindow::RegisterWindowCallback(ani_env* env, ani_object obj, ani_long na void AniWindow::RegisterNoInteractionDetectedCallback(ani_env* env, ani_object obj, ani_long nativeObj, ani_string type, ani_long timeOut, ani_ref callback) { - TLOGI(WmsLogTag::DEFAULT, "[ANI]"); + TLOGI(WmsLogTag::WMS_EVENT, "[ANI]"); AniWindow* aniWindow = reinterpret_cast(nativeObj); if (aniWindow != nullptr) { aniWindow->OnRegisterWindowCallback(env, type, callback, timeOut); } else { - TLOGE(WmsLogTag::DEFAULT, "[ANI] aniWindow is nullptr"); + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]aniWindow is nullptr!"); } } void AniWindow::OnRegisterWindowCallback(ani_env* env, ani_string type, ani_ref callback, ani_long timeOut) { - TLOGI(WmsLogTag::DEFAULT, "[ANI]"); + TLOGI(WmsLogTag::WMS_EVENT, "[ANI]"); auto window = GetWindow(); if (window == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI] window is nullptr"); + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]window is nullptr!"); AniWindowUtils::AniThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY); return; } std::string cbType; AniWindowUtils::GetStdString(env, type, cbType); - TLOGI(WmsLogTag::DEFAULT, "[ANI] type:%{public}s", cbType.c_str()); + TLOGI(WmsLogTag::WMS_EVENT, "[ANI] type:%{public}s", cbType.c_str()); WmErrorCode ret = registerManager_->RegisterListener(window, cbType, CaseType::CASE_WINDOW, env, callback, timeOut); if (ret != WmErrorCode::WM_OK) { AniWindowUtils::AniThrowError(env, ret); @@ -2874,7 +2874,7 @@ ani_status OHOS::Rosen::ANI_Window_Constructor(ani_vm *vm, uint32_t *result) reinterpret_cast(AniWindow::KeepKeyboardOnFocus)}, ani_native_function {"setWindowTouchableSync", "JZ:V", reinterpret_cast(AniWindow::SetWindowTouchable)}, - ani_native_function {"onNoInteractionDetected", nullptr, + ani_native_function {"onNoInteractionDetected", "lC{std.core.String}lC{std.core.Object}:", reinterpret_cast(AniWindow::RegisterNoInteractionDetectedCallback)}, ani_native_function {"opacity", "JD:V", reinterpret_cast(AniWindow::Opacity)}, diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp index 1ed9addea40f824728aaf0b18d6f6af066de4810..3e76d611494627c235184ce487c2fc96605aeaa1 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_listener.cpp @@ -27,8 +27,11 @@ using namespace AbilityRuntime; AniWindowListener::~AniWindowListener() { - ani_status ret = env_->GlobalReference_Delete(aniCallback_); - TLOGI(WmsLogTag::DEFAULT, "[ANI]~AniWindowListener ret:%{public}d", static_cast(ret)); + ani_status ret = ANI_OK; + if (env_ != nullptr && aniCallback_ != nullptr) { + ret = env_->GlobalReference_Delete(aniCallback_); + } + TLOGI(WmsLogTag::DEFAULT, "[ANI]~AniWindowListener ret: %{public}u", ret); } void AniWindowListener::OnLastStrongRef(const void *) @@ -56,14 +59,20 @@ void AniWindowListener::OnSizeChange(Rect rect, WindowSizeChangeReason reason, } currRect_ = rect; - auto task = [self = weakRef_, rect, eng = env_] () { + auto task = [self = weakRef_, rect, vm = vm_] () { auto thisListener = self.promote(); - if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI]this listener, eng or callback is nullptr"); + if (thisListener == nullptr || vm == nullptr || thisListener->aniCallback_ == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "[ANI]this listener, vm or callback is nullptr"); + return; + } + ani_env* env = nullptr; + ani_status ret = vm->GetEnv(ANI_VERSION_1, &env); + if (ret != ANI_OK || env == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "[ANI]Get env failed, ret:%{public}u", ret); return; } - AniWindowUtils::CallAniFunctionVoid(eng, "L@ohos/window/window;", "runWindowSizeCallback", - nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniSize(eng, rect.width_, rect.height_)); + AniWindowUtils::CallAniFunctionVoid(env, "L@ohos/window/window;", "runWindowSizeCallback", + nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniSize(env, rect.width_, rect.height_)); }; if (!eventHandler_) { TLOGE(WmsLogTag::DEFAULT, "get main event handler failed!"); @@ -389,18 +398,24 @@ int64_t AniWindowListener::GetTimeout() const void AniWindowListener::OnWindowNoInteractionCallback() { - TLOGI(WmsLogTag::DEFAULT, "[ANI] diaglogtargettouch"); - auto task = [self = weakRef_, eng = env_] () { + TLOGI(WmsLogTag::WMS_EVENT, "[ANI]"); + auto task = [self = weakRef_, vm = vm_] () { auto thisListener = self.promote(); - if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { - TLOGE(WmsLogTag::DEFAULT, "[ANI]this listener, eng or callback is nullptr"); + if (thisListener == nullptr || vm == nullptr || thisListener->aniCallback_ == nullptr) { + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]thisListener, vm or callback is nullptr!"); return; } - AniWindowUtils::CallAniFunctionVoid(eng, "L@ohos/window/window;", "runWindowNoInteractionCallback", - nullptr, thisListener->aniCallback_); + ani_env* env = nullptr; + ani_status ret = vm->GetEnv(ANI_VERSION_1, &env); + if (ret != ANI_OK || env == nullptr) { + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]Get env failed, ret: %{public}u", ret); + return; + } + AniWindowUtils::CallAniFunctionVoid(env, "@ohos.window.window", "runWindowNoInteractionCallback", + "C{std.core.Object}:", thisListener->aniCallback_); }; if (!eventHandler_) { - TLOGE(WmsLogTag::DEFAULT, "get main event handler failed!"); + TLOGE(WmsLogTag::WMS_EVENT, "Get main event handler failed!"); return; } eventHandler_->PostTask(task, "wms:AniWindowListener::WindowNoInteractionCallback", 0, @@ -486,14 +501,20 @@ void AniWindowListener::OnRectChange(Rect rect, WindowSizeChangeReason reason) TLOGD(WmsLogTag::WMS_LAYOUT, "drag end change to move event"); rectChangeReason = RectChangeReason::MOVE; } - auto task = [self = weakRef_, rect, rectChangeReason, eng = env_] () { + auto task = [self = weakRef_, rect, rectChangeReason, vm = vm_] () { auto thisListener = self.promote(); - if (thisListener == nullptr || eng == nullptr || thisListener->aniCallback_ == nullptr) { - TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]this listener, eng or callback is nullptr"); + if (thisListener == nullptr || vm == nullptr || thisListener->aniCallback_ == nullptr) { + TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]this listener, vm or callback is nullptr"); + return; + } + ani_env* env = nullptr; + ani_status ret = vm->GetEnv(ANI_VERSION_1, &env); + if (ret != ANI_OK || env == nullptr) { + TLOGE(WmsLogTag::WMS_LAYOUT, "[ANI]Get env failed, ret:%{public}u", ret); return; } - AniWindowUtils::CallAniFunctionVoid(eng, "L@ohos/window/window;", "runWindowRectChangeCallback", - nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniRect(eng, rect), + AniWindowUtils::CallAniFunctionVoid(env, "L@ohos/window/window;", "runWindowRectChangeCallback", + nullptr, thisListener->aniCallback_, AniWindowUtils::CreateAniRect(env, rect), static_cast(rectChangeReason)); }; if (!eventHandler_) { diff --git a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp index dbb753a597a1a63302b449691399d5e22a2479c1..d7a74f2b02594f14a2f92233efc80ccf0b7a9a5a 100644 --- a/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp +++ b/interfaces/kits/ani/window_runtime/window_stage_ani/src/ani_window_register_manager.cpp @@ -325,12 +325,12 @@ WmErrorCode AniWindowRegisterManager::ProcessWindowNoInteractionRegister(sptr noInteractionMax)) { - TLOGE(WmsLogTag::DEFAULT, "invalid parameter: no-interaction-timeout %{public}" PRId64 " is not in " + TLOGE(WmsLogTag::WMS_EVENT, "[ANI]invalid parameter: no-interaction-timeout %{public}" PRId64 " is not in " "(0s~%{public}" PRId64, timeout, noInteractionMax); return WmErrorCode::WM_ERROR_INVALID_PARAM; } thisListener->SetTimeout(timeout * secToMicrosecRatio); - return WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowNoInteractionListener(thisListener)); + return AniWindowUtils::ToErrorCode(window->RegisterWindowNoInteractionListener(thisListener)); } WmErrorCode AniWindowRegisterManager::ProcessScreenshotRegister(sptr listener, @@ -442,7 +442,13 @@ WmErrorCode AniWindowRegisterManager::RegisterListener(sptr window, cons TLOGE(WmsLogTag::DEFAULT, "[ANI]create global ref fail"); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; }; - sptr windowManagerListener = new AniWindowListener(env, cbRef, caseType); + ani_vm* vm = nullptr; + ani_status aniRet = env->GetVM(&vm); + if (aniRet != ANI_OK || vm == nullptr) { + TLOGE(WmsLogTag::DEFAULT, "[ANI]Get VM failed, ret: %{public}u", aniRet); + return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; + } + auto windowManagerListener = sptr::MakeSptr(env, vm, cbRef, caseType); if (windowManagerListener == nullptr) { TLOGE(WmsLogTag::DEFAULT, "[ANI]New AniWindowListener failed"); return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;