From ac8e94f4c3c3a355dfc55d7b7387b418f5f3d897 Mon Sep 17 00:00:00 2001 From: cuifeihe Date: Tue, 2 Apr 2024 19:23:39 +0800 Subject: [PATCH] =?UTF-8?q?Description:=20=E4=BF=AE=E5=A4=8DJsScreenSessio?= =?UTF-8?q?nManager=E5=9C=A8=E6=9E=90=E6=9E=84=E6=97=B6=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=E9=97=AE=E9=A2=98=20IssueN?= =?UTF-8?q?o:=20https://gitee.com/openharmony/window=5Fwindow=5Fmanager/is?= =?UTF-8?q?sues/I9DQ5W=20Signed-off-by:=20chenyunjiu=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kits/napi/screen_session_manager/BUILD.gn | 2 + .../js_screen_session_manager.cpp | 118 +++++++++++------- .../js_screen_session_manager.h | 6 +- .../js_screen_utils.cpp | 73 +++++++++++ .../screen_session_manager/js_screen_utils.h | 15 +++ 5 files changed, 169 insertions(+), 45 deletions(-) diff --git a/window_scene/interfaces/kits/napi/screen_session_manager/BUILD.gn b/window_scene/interfaces/kits/napi/screen_session_manager/BUILD.gn index 2c375190b2..77322fcc1e 100644 --- a/window_scene/interfaces/kits/napi/screen_session_manager/BUILD.gn +++ b/window_scene/interfaces/kits/napi/screen_session_manager/BUILD.gn @@ -39,8 +39,10 @@ ohos_shared_library("screensessionmanager_napi") { external_deps = [ "ability_runtime:runtime", "c_utils:utils", + "eventhandler:libeventhandler", "graphic_2d:librender_service_client", "hilog:libhilog", + "hitrace:hitrace_meter", "image_framework:image", "image_framework:image_native", "ipc:ipc_core", diff --git a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.cpp b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.cpp index 32efa2d290..7226214ad7 100644 --- a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.cpp +++ b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.cpp @@ -39,13 +39,17 @@ constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_WINDOW, "JsScre const std::string ON_SCREEN_CONNECTION_CHANGE_CALLBACK = "screenConnectChange"; } // namespace -JsScreenSessionManager::JsScreenSessionManager(napi_env env) : env_(env) {} +JsScreenSessionManager::JsScreenSessionManager(napi_env env) : env_(env), + taskScheduler_(std::make_shared(env)) +{ + TLOGI(WmsLogTag::DMS, "Create JsScreenSessionManager instance"); +} napi_value JsScreenSessionManager::Init(napi_env env, napi_value exportObj) { WLOGD("Init."); if (env == nullptr || exportObj == nullptr) { - WLOGFE("Failed to init, env or exportObj is null!"); + TLOGE(WmsLogTag::DMS, "Failed to init, env or exportObj is null!"); return nullptr; } @@ -83,6 +87,29 @@ napi_value JsScreenSessionManager::Init(napi_env env, napi_value exportObj) return NapiGetUndefined(env); } +JsScreenSessionManager::~JsScreenSessionManager() +{ + TLOGI(WmsLogTag::DMS, "Destroy JsScreenSessionManager instance"); + ClearNativeReference(); +} + +void JsScreenSessionManager::ClearNativeReference() +{ + auto localScreenConnectionCallback = screenConnectionCallback_; + auto localShutdownCallback = shutdownCallback_; + // Capture shared_ptr by value to ensure that its life cycle is in the alive state + auto task = [localScreenConnectionCallback, localShutdownCallback]() mutable { + TLOGI(WmsLogTag::DMS, "Clear NativeReference callback"); + localScreenConnectionCallback = nullptr; + localShutdownCallback = nullptr; + }; + if (taskScheduler_ == nullptr) { + TLOGE(WmsLogTag::DMS, "taskScheduler instance is nullptr"); + return; + } + taskScheduler_->PostMainThreadTask(task, "ClearScreenNativeReference"); +} + void JsScreenSessionManager::Finalizer(napi_env env, void* data, void* hint) { std::unique_ptr(static_cast(data)); @@ -171,14 +198,14 @@ void JsScreenSessionManager::OnScreenConnected(const sptr& screen WLOGE("[NAPI]screenConnectionCallback is nullptr"); return; } - + TLOGD(WmsLogTag::DMS, "[NAPI]OnScreenConnected"); std::shared_ptr callback_ = screenConnectionCallback_; std::unique_ptr complete = std::make_unique( [callback_, screenSession](napi_env env, NapiAsyncTask& task, int32_t status) { napi_value objValue = nullptr; napi_create_object(env, &objValue); if (objValue == nullptr) { - WLOGFE("Object is null!"); + TLOGE(WmsLogTag::DMS, "Object is null!"); return; } @@ -188,7 +215,7 @@ void JsScreenSessionManager::OnScreenConnected(const sptr& screen napi_value argv[] = { objValue }; napi_value method = callback_->GetNapiValue(); if (method == nullptr) { - WLOGFE("Failed to get method callback from object!"); + TLOGE(WmsLogTag::DMS, "Failed to get method callback from object!"); return; } napi_call_function(env, NapiGetUndefined(env), method, ArraySize(argv), argv, nullptr); @@ -205,14 +232,14 @@ void JsScreenSessionManager::OnScreenDisconnected(const sptr& scr if (screenConnectionCallback_ == nullptr) { return; } - + TLOGD(WmsLogTag::DMS, "[NAPI]OnScreenDisconnected"); std::shared_ptr callback_ = screenConnectionCallback_; std::unique_ptr complete = std::make_unique( [callback_, screenSession](napi_env env, NapiAsyncTask& task, int32_t status) { napi_value objValue = nullptr; napi_create_object(env, &objValue); if (objValue == nullptr) { - WLOGFE("Object is null!"); + TLOGE(WmsLogTag::DMS, "Object is null!"); return; } @@ -222,7 +249,7 @@ void JsScreenSessionManager::OnScreenDisconnected(const sptr& scr napi_value argv[] = { objValue }; napi_value method = callback_->GetNapiValue(); if (method == nullptr) { - WLOGFE("Failed to get method callback from object!"); + TLOGE(WmsLogTag::DMS, "Failed to get method callback from object!"); return; } napi_call_function(env, NapiGetUndefined(env), method, ArraySize(argv), argv, nullptr); @@ -239,13 +266,14 @@ bool JsScreenSessionManager::OnTakeOverShutdown(bool isReboot) if (!shutdownCallback_) { return false; } + TLOGD(WmsLogTag::DMS, "[NAPI]OnTakeOverShutdown"); std::shared_ptr callback_ = shutdownCallback_; std::unique_ptr complete = std::make_unique( [callback_, isReboot](napi_env env, NapiAsyncTask& task, int32_t status) { napi_value argv[] = {CreateJsValue(env, isReboot)}; napi_value method = callback_->GetNapiValue(); if (method == nullptr) { - WLOGFE("Failed to get method callback from object!"); + TLOGE(WmsLogTag::DMS, "Failed to get method callback from object!"); return; } napi_call_function(env, NapiGetUndefined(env), method, ArraySize(argv), argv, nullptr); @@ -260,9 +288,9 @@ bool JsScreenSessionManager::OnTakeOverShutdown(bool isReboot) napi_value JsScreenSessionManager::OnRegisterShutdownCallback(napi_env env, const napi_callback_info info) { - WLOGD("[NAPI]OnRegisterShutdownCallback"); + TLOGI(WmsLogTag::DMS, "[NAPI]OnRegisterShutdownCallback"); if (shutdownCallback_ != nullptr) { - WLOGFE("Failed to register callback, callback exits"); + TLOGE(WmsLogTag::DMS, "Failed to register callback, callback exits"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_REPEAT_OPERATION))); return NapiGetUndefined(env); } @@ -270,14 +298,14 @@ napi_value JsScreenSessionManager::OnRegisterShutdownCallback(napi_env env, cons napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < 1) { // 1: params num - WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); } napi_value value = argv[0]; if (!NapiIsCallable(env, value)) { - WLOGFE("Failed to register callback, param is not callable"); + TLOGE(WmsLogTag::DMS, "Failed to register callback, param is not callable"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM))); return NapiGetUndefined(env); } @@ -296,9 +324,9 @@ napi_value JsScreenSessionManager::OnRegisterShutdownCallback(napi_env env, cons napi_value JsScreenSessionManager::OnUnRegisterShutdownCallback(napi_env env, const napi_callback_info info) { - WLOGD("[NAPI]OnUnRegisterShutdownCallback"); + TLOGD(WmsLogTag::DMS, "[NAPI]OnUnRegisterShutdownCallback"); if (shutdownCallback_ == nullptr) { - WLOGFE("Failed to unregister callback, callback is not exits"); + TLOGE(WmsLogTag::DMS, "Failed to unregister callback, callback is not exits"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_NOT_REGISTER_SYNC_CALLBACK))); return NapiGetUndefined(env); } @@ -314,7 +342,7 @@ napi_value JsScreenSessionManager::OnUnRegisterShutdownCallback(napi_env env, co napi_value JsScreenSessionManager::OnRegisterCallback(napi_env env, const napi_callback_info info) { - WLOGD("On register callback."); + TLOGI(WmsLogTag::DMS, "[NAPI]OnRegisterCallback"); if (screenConnectionCallback_ != nullptr) { return NapiGetUndefined(env); } @@ -322,27 +350,27 @@ napi_value JsScreenSessionManager::OnRegisterCallback(napi_env env, const napi_c napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < 2) { // 2: params num - WLOGFE("Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM))); return NapiGetUndefined(env); } std::string callbackType; if (!ConvertFromJsValue(env, argv[0], callbackType)) { - WLOGFE("Failed to convert parameter to callback type."); + TLOGE(WmsLogTag::DMS, "Failed to convert parameter to callback type."); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM))); return NapiGetUndefined(env); } if (callbackType != ON_SCREEN_CONNECTION_CHANGE_CALLBACK) { - WLOGFE("Unsupported callback type: %{public}s.", callbackType.c_str()); + TLOGE(WmsLogTag::DMS, "Unsupported callback type: %{public}s.", callbackType.c_str()); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM))); return NapiGetUndefined(env); } napi_value value = argv[1]; if (!NapiIsCallable(env, value)) { - WLOGFE("Failed to register callback, callback is not callable!"); + TLOGE(WmsLogTag::DMS, "Failed to register callback, callback is not callable!"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM))); return NapiGetUndefined(env); } @@ -358,18 +386,19 @@ napi_value JsScreenSessionManager::OnRegisterCallback(napi_env env, const napi_c napi_value JsScreenSessionManager::OnUpdateScreenRotationProperty(napi_env env, const napi_callback_info info) { + TLOGD(WmsLogTag::DMS, "[NAPI]OnUpdateScreenRotationProperty"); size_t argc = 4; napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < 3) { // 3: params num - WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); } int32_t screenId; if (!ConvertFromJsValue(env, argv[0], screenId)) { - WLOGFE("[NAPI]Failed to convert parameter to screenId"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to screenId"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); @@ -377,15 +406,15 @@ napi_value JsScreenSessionManager::OnUpdateScreenRotationProperty(napi_env env, RRect bounds; napi_value nativeObj = argv[1]; if (nativeObj == nullptr) { - WLOGFE("[NAPI]Failed to convert object to RRect bounds"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert object to RRect bounds"); return NapiGetUndefined(env); } else if (!ConvertRRectFromJs(env, nativeObj, bounds)) { - WLOGFE("[NAPI]Failed to get bounds from js object"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to get bounds from js object"); return NapiGetUndefined(env); } int rotation; if (!ConvertFromJsValue(env, argv[2], rotation)) { // 2: the 3rd argv - WLOGFE("[NAPI]Failed to convert parameter to rotation"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to rotation"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); @@ -397,18 +426,19 @@ napi_value JsScreenSessionManager::OnUpdateScreenRotationProperty(napi_env env, napi_value JsScreenSessionManager::OnNotifyScreenLockEvent(napi_env env, const napi_callback_info info) { + TLOGI(WmsLogTag::DMS, "[NAPI]OnNotifyScreenLockEvent"); size_t argc = 4; napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < 1) { // 1: params num - WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); } int32_t event; if (!ConvertFromJsValue(env, argv[0], event)) { - WLOGFE("[NAPI]Failed to convert parameter to display event"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to display event"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); @@ -420,7 +450,7 @@ napi_value JsScreenSessionManager::OnNotifyScreenLockEvent(napi_env env, napi_value JsScreenSessionManager::OnGetCurvedCompressionArea(napi_env env, const napi_callback_info info) { - WLOGD("[NAPI]OnGetCurvedCompressionArea"); + WLOGFD("[NAPI]OnGetCurvedCompressionArea"); napi_value result = nullptr; napi_create_uint32(env, ScreenSessionManagerClient::GetInstance().GetCurvedCompressionArea(), &result); return result; @@ -428,19 +458,19 @@ napi_value JsScreenSessionManager::OnGetCurvedCompressionArea(napi_env env, cons napi_value JsScreenSessionManager::OnGetPhyScreenProperty(napi_env env, const napi_callback_info info) { - WLOGD("[NAPI]OnGetPhyScreenProperty"); + WLOGFD("[NAPI]OnGetPhyScreenProperty"); size_t argc = 4; napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < 1) { // 1: params num - WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); } int32_t screenId; if (!ConvertFromJsValue(env, argv[0], screenId)) { - WLOGFE("[NAPI]Failed to convert parameter to screenId"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to screenId"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); @@ -451,19 +481,19 @@ napi_value JsScreenSessionManager::OnGetPhyScreenProperty(napi_env env, const na napi_value JsScreenSessionManager::OnUpdateAvailableArea(napi_env env, const napi_callback_info info) { - WLOGD("[NAPI]OnUpdateAvailableArea"); + WLOGFD("[NAPI]OnUpdateAvailableArea"); size_t argc = 4; napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < 1) { // 1: params num - WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); } int32_t screenId; if (!ConvertFromJsValue(env, argv[0], screenId)) { - WLOGFE("[NAPI]Failed to convert parameter to screenId"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to screenId"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); @@ -471,10 +501,10 @@ napi_value JsScreenSessionManager::OnUpdateAvailableArea(napi_env env, const nap DMRect area; napi_value nativeObj = argv[1]; if (nativeObj == nullptr) { - WLOGFE("[NAPI]Failed to convert parameter to DMRect,the param is null"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to DMRect,the param is null"); return NapiGetUndefined(env); } else if (!ConvertDMRectFromJs(env, nativeObj, area)) { - WLOGFE("[NAPI]Failed to convert parameter to DMRect"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to DMRect"); return NapiGetUndefined(env); } ScreenSessionManagerClient::GetInstance().UpdateAvailableArea(screenId, area); @@ -483,19 +513,19 @@ napi_value JsScreenSessionManager::OnUpdateAvailableArea(napi_env env, const nap napi_value JsScreenSessionManager::OnNotifyFoldToExpandCompletion(napi_env env, const napi_callback_info info) { - WLOGD("[NAPI]OnNotifyFoldToExpandCompletion"); + WLOGFD("[NAPI]OnNotifyFoldToExpandCompletion"); size_t argc = 4; napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < 1) { // 1: params num - WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); } bool foldToExpand; if (!ConvertFromJsValue(env, argv[0], foldToExpand)) { - WLOGFE("[NAPI]Failed to convert parameter to foldToExpand"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to foldToExpand"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); @@ -506,7 +536,7 @@ napi_value JsScreenSessionManager::OnNotifyFoldToExpandCompletion(napi_env env, napi_value JsScreenSessionManager::OnGetFoldStatus(napi_env env, napi_callback_info info) { - WLOGD("[NAPI]OnGetFoldStatus"); + WLOGFD("[NAPI]OnGetFoldStatus"); size_t argc = 4; napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); @@ -521,19 +551,19 @@ napi_value JsScreenSessionManager::OnGetFoldStatus(napi_env env, napi_callback_i napi_value JsScreenSessionManager::OnGetScreenSnapshot(napi_env env, const napi_callback_info info) { - WLOGD("[NAPI]OnGetScreenSnapshot"); + WLOGFD("[NAPI]OnGetScreenSnapshot"); size_t argc = 4; napi_value argv[4] = {nullptr}; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); if (argc < ARGC_THREE) { - WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc); + TLOGE(WmsLogTag::DMS, "[NAPI]Argc is invalid: %{public}zu", argc); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); } int32_t screenId; if (!ConvertFromJsValue(env, argv[0], screenId)) { - WLOGFE("[NAPI]Failed to convert parameter to screenId"); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to screenId"); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); @@ -541,7 +571,7 @@ napi_value JsScreenSessionManager::OnGetScreenSnapshot(napi_env env, const napi_ std::array scaleParam; for (uint8_t i = 0; i < ARGC_TWO; i++) { if (!ConvertFromJsValue(env, argv[i + 1], scaleParam[i])) { - WLOGFE("[NAPI]Failed to convert parameter to scale[%d]", i + 1); + TLOGE(WmsLogTag::DMS, "[NAPI]Failed to convert parameter to scale[%d]", i + 1); napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), "Input parameter is missing or invalid")); return NapiGetUndefined(env); diff --git a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.h b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.h index 44634b5282..f4ecf231aa 100644 --- a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.h +++ b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_session_manager.h @@ -20,6 +20,7 @@ #include #include "screen_session_manager_client.h" +#include "js_screen_utils.h" #ifdef POWER_MANAGER_ENABLE #include "shutdown/takeover_shutdown_callback_stub.h" @@ -30,7 +31,7 @@ class JsScreenSessionManager final : public IScreenConnectionListener, public PowerMgr::TakeOverShutdownCallbackStub { public: explicit JsScreenSessionManager(napi_env env); - virtual ~JsScreenSessionManager() = default; + ~JsScreenSessionManager(); static napi_value Init(napi_env env, napi_value exportObj); static void Finalizer(napi_env env, void* data, void* hint); @@ -64,9 +65,12 @@ private: napi_value OnGetFoldStatus(napi_env env, const napi_callback_info info); napi_value OnGetScreenSnapshot(napi_env env, const napi_callback_info info); + void ClearNativeReference(); + std::shared_ptr screenConnectionCallback_; std::shared_ptr shutdownCallback_; napi_env env_; + std::shared_ptr taskScheduler_; }; } // namespace OHOS::Rosen diff --git a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.cpp b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.cpp index 1e78202652..2dd32bf4b4 100644 --- a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.cpp +++ b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.cpp @@ -16,6 +16,8 @@ #include "js_screen_utils.h" #include +#include +#include "process_options.h" #include "dm_common.h" #include "window_manager_hilog.h" @@ -235,4 +237,75 @@ bool ConvertDMRectFromJs(napi_env env, napi_value jsObject, DMRect& rect) } return true; } + + +struct AsyncInfo { + napi_env env; + napi_async_work work; + std::function func; +}; + +void NapiAsyncWork(napi_env env, std::function task) +{ + napi_value resource = nullptr; + AsyncInfo* info = new (std::nothrow) AsyncInfo(); + if (info == nullptr) { + TLOGE(WmsLogTag::DMS, "malloc asyncinfo failed"); + return; + } + info->env = env; + info->func = task; + napi_create_string_utf8(env, "DMSAsyncWork", NAPI_AUTO_LENGTH, &resource); + napi_create_async_work(env, nullptr, resource, [](napi_env env, void* data) { + }, + [](napi_env env, napi_status status, void* data) { + AsyncInfo* info = (AsyncInfo*)data; + if (info == nullptr) { + TLOGE(WmsLogTag::DMS, "async info is nullptr"); + return; + } + info->func(); + napi_delete_async_work(env, info->work); + delete info; + }, (void*)info, &info->work); + napi_queue_async_work(env, info->work); +} + +MainThreadScheduler::MainThreadScheduler(napi_env env) + : env_(env) +{ + GetMainEventHandler(); +} + +inline void MainThreadScheduler::GetMainEventHandler() +{ + if (handler_ != nullptr) { + return; + } + auto runner = OHOS::AppExecFwk::EventRunner::GetMainEventRunner(); + if (runner == nullptr) { + return; + } + handler_ = std::make_shared(runner); +} + +void MainThreadScheduler::PostMainThreadTask(Task && localTask, std::string traceInfo, int64_t delayTime) +{ + GetMainEventHandler(); + auto task = [env = env_, localTask, traceInfo] () { + HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "DMS:%s", traceInfo.c_str()); + napi_handle_scope scope = nullptr; + napi_open_handle_scope(env, &scope); + localTask(); + napi_close_handle_scope(env, scope); + }; + if (handler_ && handler_->GetEventRunner()->IsCurrentRunnerThread()) { + return task(); + } else if (handler_ && !handler_->GetEventRunner()->IsCurrentRunnerThread()) { + handler_->PostTask(std::move(task), "dms:" + traceInfo, delayTime, + OHOS::AppExecFwk::EventQueue::Priority::IMMEDIATE); + } else { + NapiAsyncWork(env_, task); + } +} } // namespace OHOS::Rosen diff --git a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.h b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.h index 8f2bd7d1a0..bd8131405a 100644 --- a/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.h +++ b/window_scene/interfaces/kits/napi/screen_session_manager/js_screen_utils.h @@ -18,7 +18,10 @@ #include #include +#include +#include +#include "hitrace_meter.h" #include "dm_common.h" #include "session/screen/include/screen_property.h" @@ -35,6 +38,18 @@ public: static napi_value CreateJsScreenPropertyChangeReason(napi_env env); static napi_value CreateJsFoldStatus(napi_env env); }; + + +class MainThreadScheduler { +public: + using Task = std::function; + explicit MainThreadScheduler(napi_env env); + void PostMainThreadTask(Task && localTask, std::string traceInfo = "DefaultDMSTask", int64_t delayTime = 0); +private: + void GetMainEventHandler(); + napi_env env_; + std::shared_ptr handler_; +}; } // namespace OHOS::Rosen #endif // OHOS_WINDOW_SCENE_JS_SCREEN_UTILS_H -- Gitee