diff --git a/interfaces/kits/napi/extension_window/BUILD.gn b/interfaces/kits/napi/extension_window/BUILD.gn index cb3a51d4459af125b304ee12f746ca8e1670de63..6c92ac75cf4064ffb18f17e9901739fdbac55dde 100644 --- a/interfaces/kits/napi/extension_window/BUILD.gn +++ b/interfaces/kits/napi/extension_window/BUILD.gn @@ -90,6 +90,7 @@ ohos_shared_library("extensionwindow_napi") { ":extension_window_kit_config", "../../../../resources/config/build:coverage_flags", ] + public_configs = [ ":extension_window_kit_config" ] include_dirs = [ "extension_window" ] deps = [ diff --git a/interfaces/kits/napi/extension_window/js_extension_window_listener.cpp b/interfaces/kits/napi/extension_window/js_extension_window_listener.cpp index 7ede0ce022997f530c6edd0694805a5ed206678a..828183888a55a021b09fe401f78342ff3b6f3d09 100644 --- a/interfaces/kits/napi/extension_window/js_extension_window_listener.cpp +++ b/interfaces/kits/napi/extension_window/js_extension_window_listener.cpp @@ -28,6 +28,7 @@ namespace Rosen { using namespace AbilityRuntime; namespace { const std::string WINDOW_SIZE_CHANGE_CB = "windowSizeChange"; +const std::string WINDOW_RECT_CHANGE_CB = "windowRectChange"; const std::string SYSTEM_AVOID_AREA_CHANGE_CB = "systemAvoidAreaChange"; const std::string AVOID_AREA_CHANGE_CB = "avoidAreaChange"; const std::string LIFECYCLE_EVENT_CB = "lifeCycleEvent"; @@ -70,7 +71,8 @@ void JsExtensionWindowListener::OnSizeChange(Rect rect, WindowSizeChangeReason r { TLOGI(WmsLogTag::WMS_UIEXT, "[NAPI]OnSizeChange, [%{public}u, %{public}u], reason=%{public}u", rect.width_, rect.height_, reason); - if (currentWidth_ == rect.width_ && currentHeight_ == rect.height_ && reason != WindowSizeChangeReason::DRAG_END) { + if (currRect_.width_ == rect.width_ && currRect_.height_ == rect.height_ && + reason != WindowSizeChangeReason::DRAG_END) { TLOGD(WmsLogTag::WMS_UIEXT, "[NAPI]no need to change size"); return; } @@ -111,8 +113,56 @@ void JsExtensionWindowListener::OnSizeChange(Rect rect, WindowSizeChangeReason r eventHandler_->PostTask(jsCallback, "wms:JsExtensionWindowListener::OnSizeChange", 0, AppExecFwk::EventQueue::Priority::IMMEDIATE); } - currentWidth_ = rect.width_; - currentHeight_ = rect.height_; + currRect_ = rect; +} + +void JsExtensionWindowListener::OnRectChange(Rect rect, WindowSizeChangeReason reason) +{ + if (currRect_ == rect && reason == WindowSizeChangeReason::UNDEFINED) { + TLOGD(WmsLogTag::WMS_UIEXT, "[NAPI]Skip redundant rect update"); + return; + } + RectChangeReason rectChangeReason = RectChangeReason::UNDEFINED; + if (JS_SIZE_CHANGE_REASON.count(reason) != 0 && + !(reason == WindowSizeChangeReason::MAXIMIZE && rect.posX_ != 0)) { + rectChangeReason = JS_SIZE_CHANGE_REASON.at(reason); + } + if (currentRectChangeReason_ != RectChangeReason::DRAG && rectChangeReason == RectChangeReason::DRAG_END) { + rectChangeReason = RectChangeReason::MOVE; + } + // js callback should run in js thread + auto jsCallback = [self = weakRef_, rect, rectChangeReason, env = env_] { + HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsExtensionWindowListener::OnRectChange"); + auto thisListener = self.promote(); + if (thisListener == nullptr || env == nullptr) { + TLOGNE(WmsLogTag::WMS_UIEXT, "[NAPI]This listener or env is nullptr"); + return; + } + HandleScope handleScope(env); + napi_value objValue = nullptr; + napi_create_object(env, &objValue); + if (objValue == nullptr) { + TLOGNE(WmsLogTag::WMS_UIEXT, "[NAPI]Failed to create js object"); + return; + } + napi_value rectObjValue = GetRectAndConvertToJsValue(env, rect); + if (rectObjValue == nullptr) { + TLOGNE(WmsLogTag::WMS_UIEXT, "[NAPI]Failed to create rect js object"); + return; + } + napi_set_named_property(env, objValue, "rect", rectObjValue); + napi_set_named_property(env, objValue, "reason", CreateJsValue(env, rectChangeReason)); + napi_value argv[] = { objValue }; + thisListener->CallJsMethod(WINDOW_RECT_CHANGE_CB.c_str(), argv, ArraySize(argv)); + }; + if (!eventHandler_) { + TLOGE(WmsLogTag::WMS_UIEXT, "Get main event handler failed!"); + return; + } + eventHandler_->PostTask(jsCallback, "wms:JsExtensionWindowListener::OnRectChange", 0, + AppExecFwk::EventQueue::Priority::IMMEDIATE); + currRect_ = rect; + currentRectChangeReason_ = rectChangeReason; } void JsExtensionWindowListener::OnModeChange(WindowMode mode, bool hasDeco) diff --git a/interfaces/kits/napi/extension_window/js_extension_window_listener.h b/interfaces/kits/napi/extension_window/js_extension_window_listener.h index 101d8c91cee999215099eb22500729ca18978e3c..757dae4c21323a36af9613ba13642147a83fbbec 100644 --- a/interfaces/kits/napi/extension_window/js_extension_window_listener.h +++ b/interfaces/kits/napi/extension_window/js_extension_window_listener.h @@ -27,10 +27,12 @@ #include "window_manager.h" #include "wm_common.h" #include "js_extension_window_utils.h" +#include "js_window_utils.h" namespace OHOS { namespace Rosen { class JsExtensionWindowListener : public IWindowChangeListener, + public IWindowRectChangeListener, public IAvoidAreaChangedListener, public IWindowLifeCycle, public IOccupiedAreaChangeListener { @@ -41,6 +43,7 @@ public: ~JsExtensionWindowListener(); void OnSizeChange(Rect rect, WindowSizeChangeReason reason, const std::shared_ptr& rsTransaction = nullptr) override; + void OnRectChange(Rect rect, WindowSizeChangeReason reason) override; void OnModeChange(WindowMode mode, bool hasDeco) override; void OnAvoidAreaChanged(const AvoidArea avoidArea, AvoidAreaType type) override; void AfterForeground() override; @@ -56,8 +59,8 @@ public: void SetMainEventHandler(); private: - uint32_t currentWidth_ = 0; - uint32_t currentHeight_ = 0; + Rect currRect_; + RectChangeReason currentRectChangeReason_ = RectChangeReason::UNDEFINED; napi_env env_ = nullptr; WindowState state_ {WindowState::STATE_INITIAL}; std::shared_ptr jsCallBack_; diff --git a/interfaces/kits/napi/extension_window/js_extension_window_register_manager.cpp b/interfaces/kits/napi/extension_window/js_extension_window_register_manager.cpp index 397836f2df1f1e0f9cbc9764c72000c31936a219..2a3ff90a68d0d0b809036a447390d1781209c47e 100644 --- a/interfaces/kits/napi/extension_window/js_extension_window_register_manager.cpp +++ b/interfaces/kits/napi/extension_window/js_extension_window_register_manager.cpp @@ -21,6 +21,7 @@ namespace OHOS { namespace Rosen { namespace { const std::string WINDOW_SIZE_CHANGE_CB = "windowSizeChange"; +const std::string WINDOW_RECT_CHANGE_CB = "windowRectChange"; const std::string AVOID_AREA_CHANGE_CB = "avoidAreaChange"; const std::string WINDOW_STAGE_EVENT_CB = "windowStageEvent"; const std::string WINDOW_EVENT_CB = "windowEvent"; @@ -31,6 +32,7 @@ JsExtensionWindowRegisterManager::JsExtensionWindowRegisterManager() // white register list for window listenerCodeMap_[CaseType::CASE_WINDOW] = { {WINDOW_SIZE_CHANGE_CB, ListenerType::WINDOW_SIZE_CHANGE_CB}, + {WINDOW_RECT_CHANGE_CB, ListenerType::WINDOW_RECT_CHANGE_CB}, {AVOID_AREA_CHANGE_CB, ListenerType::AVOID_AREA_CHANGE_CB}, {WINDOW_EVENT_CB, ListenerType::WINDOW_EVENT_CB}, }; @@ -61,6 +63,23 @@ WmErrorCode JsExtensionWindowRegisterManager::ProcessWindowChangeRegister(sptr& listener, const sptr& window, bool isRegister) +{ + if (window == nullptr) { + TLOGE(WmsLogTag::WMS_UIEXT, "[NAPI]Window is nullptr"); + return WmErrorCode::WM_ERROR_STATE_ABNORMALLY; + } + sptr thisListener(listener); + WmErrorCode ret = WmErrorCode::WM_OK; + if (isRegister) { + ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowRectChangeListener(thisListener)); + } else { + ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterWindowRectChangeListener(thisListener)); + } + return ret; +} + WmErrorCode JsExtensionWindowRegisterManager::ProcessAvoidAreaChangeRegister(sptr listener, sptr window, bool isRegister) { @@ -208,6 +227,9 @@ WmErrorCode JsExtensionWindowRegisterManager::ProcessRegister(CaseType caseType, case ListenerType::WINDOW_SIZE_CHANGE_CB: ret = ProcessWindowChangeRegister(listener, window, isRegister); break; + case ListenerType::WINDOW_RECT_CHANGE_CB: + ret = ProcessWindowRectChangeRegister(listener, window, isRegister); + break; case ListenerType::AVOID_AREA_CHANGE_CB: ret = ProcessAvoidAreaChangeRegister(listener, window, isRegister); break; diff --git a/interfaces/kits/napi/extension_window/js_extension_window_register_manager.h b/interfaces/kits/napi/extension_window/js_extension_window_register_manager.h index dde81705775ca8ff0306f433b2a631f87c541d7e..dfe442d1b39e52ea174a9cf3da755d690cc36c77 100644 --- a/interfaces/kits/napi/extension_window/js_extension_window_register_manager.h +++ b/interfaces/kits/napi/extension_window/js_extension_window_register_manager.h @@ -39,6 +39,7 @@ public: private: enum class ListenerType : uint32_t { WINDOW_SIZE_CHANGE_CB, + WINDOW_RECT_CHANGE_CB, AVOID_AREA_CHANGE_CB, WINDOW_EVENT_CB, WINDOW_STAGE_EVENT_CB, @@ -47,6 +48,8 @@ private: bool IsCallbackRegistered(napi_env env, std::string type, napi_value jsListenerObject); WmErrorCode ProcessWindowChangeRegister(sptr listener, sptr window, bool isRegister); + WmErrorCode ProcessWindowRectChangeRegister(const sptr& listener, + const sptr& window, bool isRegister); WmErrorCode ProcessAvoidAreaChangeRegister(sptr listener, sptr window, bool isRegister); WmErrorCode ProcessLifeCycleEventRegister(sptr listener,