From ac9f13c15b9cbb5b066e43ce0fbdab7e5a114866 Mon Sep 17 00:00:00 2001 From: l00574490 Date: Tue, 9 Apr 2024 15:30:34 +0800 Subject: [PATCH] add gravityChange for scb Signed-off-by: l00574490 Change-Id: I706cefdc98b543a675b395af41579e7428f23440 --- interfaces/innerkits/wm/wm_common.h | 3 +- .../js_scene_session.cpp | 40 +++++++++++++++++++ .../scene_session_manager/js_scene_session.h | 2 + .../js_scene_session_manager.cpp | 1 + .../scene_session_manager/js_scene_utils.cpp | 26 +++++++++++- .../scene_session_manager/js_scene_utils.h | 4 ++ .../session/host/include/scene_session.h | 2 + .../session/host/src/keyboard_session.cpp | 5 ++- .../src/scene_session_manager.cpp | 7 ++++ 9 files changed, 87 insertions(+), 3 deletions(-) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index 2032afc53c..6cd2ab38f2 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -88,7 +88,8 @@ enum class WindowType : uint32_t { SYSTEM_WINDOW_END = SYSTEM_SUB_WINDOW_END, WINDOW_TYPE_UI_EXTENSION = 3000, - WINDOW_TYPE_SCENE_BOARD + WINDOW_TYPE_SCENE_BOARD, + WINDOW_TYPE_KEYBOARD_PANEL }; /** diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp index 69d90aa9dd..9e5a5c063a 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.cpp @@ -60,6 +60,7 @@ const std::string WINDOW_DRAG_HOT_AREA_CB = "windowDragHotArea"; const std::string SESSIONINFO_LOCKEDSTATE_CHANGE_CB = "sessionInfoLockedStateChange"; const std::string PREPARE_CLOSE_PIP_SESSION = "prepareClosePiPSession"; const std::string LANDSCAPE_MULTI_WINDOW_CB = "landscapeMultiWindow"; +const std::string KEYBOARD_GRAVITY_CHANGE_CB = "keyboardGravityChange"; constexpr int SCALE_ARG_COUNT = 4; constexpr int ARG_INDEX_0 = 0; constexpr int ARG_INDEX_1 = 1; @@ -213,6 +214,7 @@ void JsSceneSession::InitListenerFuncs() { SESSIONINFO_LOCKEDSTATE_CHANGE_CB, &JsSceneSession::ProcessSessionInfoLockedStateChangeRegister }, { PREPARE_CLOSE_PIP_SESSION, &JsSceneSession::ProcessPrepareClosePiPSessionRegister}, { LANDSCAPE_MULTI_WINDOW_CB, &JsSceneSession::ProcessLandscapeMultiWindowRegister }, + { KEYBOARD_GRAVITY_CHANGE_CB, &JsSceneSession::ProcessKeyboardGravityChangeRegister }, }; } @@ -325,6 +327,44 @@ void JsSceneSession::SetLandscapeMultiWindow(bool isLandscapeMultiWindow) "SetLandscapeMultiWindow, isLandscapeMultiWindow:" + std::to_string(isLandscapeMultiWindow)); } +void JsSceneSession::ProcessKeyboardGravityChangeRegister() +{ + auto sessionchangeCallback = sessionchangeCallback_.promote(); + if (sessionchangeCallback == nullptr) { + TLOGE(WmsLogTag::WMS_KEYBOARD, "sessionchangeCallback is nullptr"); + return; + } + sessionchangeCallback->onKeyboardGravityChange_ = std::bind(&JsSceneSession::OnKeyboardGravityChange, + this, std::placeholders::_1); + TLOGI(WmsLogTag::WMS_KEYBOARD, "Register success"); +} + +void JsSceneSession::OnKeyboardGravityChange(SessionGravity gravity) +{ + TLOGI(WmsLogTag::WMS_KEYBOARD, "[NAPI] gravity: %{public}u", gravity); + std::shared_ptr jsCallBack = nullptr; + { + std::shared_lock lock(jsCbMapMutex_); + auto iter = jsCbMap_.find(KEYBOARD_GRAVITY_CHANGE_CB); + if (iter == jsCbMap_.end()) { + return; + } + jsCallBack = iter->second; + } + auto task = [gravity, jsCallBack, env = env_]() { + if (!jsCallBack) { + WLOGFE("[NAPI]jsCallBack is nullptr"); + return; + } + napi_value gravityObj = CreateJsValue(env, gravity); + napi_value argv[] = {gravityObj}; + napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr); + TLOGI(WmsLogTag::WMS_KEYBOARD, "Napi call gravity success, gravity: %{public}u", gravity); + }; + taskScheduler_->PostMainThreadTask(task, "OnKeyboardGravityChange: gravity " + + std::to_string(static_cast(gravity))); +} + void JsSceneSession::OnSessionInfoLockedStateChange(bool lockedState) { WLOGFI("[NAPI]OnSessionInfoLockedStateChange, state: %{public}u", lockedState); diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h index 7818a4adb0..2527d322d1 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session.h @@ -118,6 +118,7 @@ private: void ProcessSessionInfoLockedStateChangeRegister(); void ProcessPrepareClosePiPSessionRegister(); void ProcessLandscapeMultiWindowRegister(); + void ProcessKeyboardGravityChangeRegister(); void ChangeSessionVisibilityWithStatusBar(SessionInfo& info, bool visible); void ChangeSessionVisibilityWithStatusBarInner(std::shared_ptr sessionInfo, bool visible); @@ -157,6 +158,7 @@ private: void OnSessionInfoLockedStateChange(bool lockedState); void OnPrepareClosePiPSession(); void SetLandscapeMultiWindow(bool isLandscapeMultiWindow); + void OnKeyboardGravityChange(SessionGravity gravity); napi_env env_; wptr weakSession_ = nullptr; diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp index c5c32cb8bd..f2a83d59e2 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.cpp @@ -75,6 +75,7 @@ napi_value JsSceneSessionManager::Init(napi_env env, napi_value exportObj) napi_set_named_property(env, exportObj, "SessionState", CreateJsSessionState(env)); napi_set_named_property(env, exportObj, "SessionType", SessionTypeInit(env)); + napi_set_named_property(env, exportObj, "KeyboardGravity", KeyboardGravityInit(env)); napi_set_named_property(env, exportObj, "SessionSizeChangeReason", CreateJsSessionSizeChangeReason(env)); napi_set_named_property(env, exportObj, "StartupVisibility", CreateJsSessionStartupVisibility(env)); napi_set_named_property(env, exportObj, "ProcessMode", CreateJsSessionProcessMode(env)); diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp index 6a11af08bc..8cb2863b5f 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp @@ -298,7 +298,7 @@ bool ConvertProcessOptionFromJs(napi_env env, napi_value jsObject, } processOptions->processMode = static_cast(processMode); processOptions->startupVisibility = static_cast(startupVisibility); - + return true; } @@ -911,6 +911,30 @@ static void SetTypeProperty(napi_value object, napi_env env, const std::string& napi_set_named_property(env, object, name.c_str(), CreateJsValue(env, static_cast(type))); } +napi_value KeyboardGravityInit(napi_env env) +{ + WLOGFI("KeyboardGravityInit"); + + if (env == nullptr) { + WLOGFE("Env is nullptr"); + return nullptr; + } + + napi_value objValue = nullptr; + napi_create_object(env, &objValue); + if (objValue == nullptr) { + WLOGFE("Failed to get object"); + return nullptr; + } + napi_set_named_property(env, objValue, "GRAVITY_FLOAT", CreateJsValue(env, + static_cast(SessionGravity::SESSION_GRAVITY_FLOAT))); + napi_set_named_property(env, objValue, "GRAVITY_BOTTOM", CreateJsValue(env, + static_cast(SessionGravity::SESSION_GRAVITY_BOTTOM))); + napi_set_named_property(env, objValue, "GRAVITY_DEFAULT", CreateJsValue(env, + static_cast(SessionGravity::SESSION_GRAVITY_DEFAULT))); + return objValue; +} + napi_value SessionTypeInit(napi_env env) { WLOGFD("SessionTypeInit"); diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.h b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.h index 8e89d98db0..5a9c6a3b4d 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.h +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.h @@ -62,6 +62,7 @@ enum class JsSessionType : uint32_t { TYPE_SEARCHING_BAR, TYPE_SYSTEM_SUB_WINDOW, TYPE_HANDWRITE, + TYPE_KEYBOARD_PANEL, }; const std::map WINDOW_TO_JS_SESSION_TYPE_MAP { @@ -98,6 +99,7 @@ const std::map WINDOW_TO_JS_SESSION_TYPE_MAP { { WindowType::WINDOW_TYPE_SEARCHING_BAR, JsSessionType::TYPE_SEARCHING_BAR }, { WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW, JsSessionType::TYPE_SYSTEM_SUB_WINDOW }, { WindowType::WINDOW_TYPE_HANDWRITE, JsSessionType::TYPE_HANDWRITE }, + { WindowType::WINDOW_TYPE_KEYBOARD_PANEL, JsSessionType::TYPE_KEYBOARD_PANEL }, }; const std::map JS_SESSION_TO_WINDOW_TYPE_MAP { @@ -134,6 +136,7 @@ const std::map JS_SESSION_TO_WINDOW_TYPE_MAP { { JsSessionType::TYPE_SEARCHING_BAR, WindowType::WINDOW_TYPE_SEARCHING_BAR }, { JsSessionType::TYPE_SYSTEM_SUB_WINDOW, WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW }, { JsSessionType::TYPE_HANDWRITE, WindowType::WINDOW_TYPE_HANDWRITE }, + { JsSessionType::TYPE_KEYBOARD_PANEL, WindowType::WINDOW_TYPE_KEYBOARD_PANEL }, }; JsSessionType GetApiType(WindowType type); @@ -158,6 +161,7 @@ napi_value CreateJsSessionRect(napi_env env, const WSRect& rect); napi_value CreateJsSystemBarPropertyArrayObject( napi_env env, const std::unordered_map& propertyMap); napi_value SessionTypeInit(napi_env env); +napi_value KeyboardGravityInit(napi_env env); napi_value NapiGetUndefined(napi_env env); napi_valuetype GetType(napi_env env, napi_value value); bool NapiIsCallable(napi_env env, napi_value value); diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index 9d38a71304..bfd21a3ff1 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -63,6 +63,7 @@ using NotifyPrepareClosePiPSessionFunc = std::function; using OnOutsideDownEvent = std::function; using NotifyAddOrRemoveSecureSessionFunc = std::function& sceneSession)>; using NotifyLandscapeMultiWindowSessionFunc = std::function; +using NotifyKeyboardGravityChangeFunc = std::function; class SceneSession : public Session { public: // callback for notify SceneSessionManager @@ -99,6 +100,7 @@ public: ClearCallbackMapFunc clearCallbackFunc_; NotifyPrepareClosePiPSessionFunc onPrepareClosePiPSession_; NotifyLandscapeMultiWindowSessionFunc onSetLandscapeMultiWindowFunc_; + NotifyKeyboardGravityChangeFunc onKeyboardGravityChange_; }; // func for change window scene pattern property diff --git a/window_scene/session/host/src/keyboard_session.cpp b/window_scene/session/host/src/keyboard_session.cpp index 70edfc5b4b..1c07d517c2 100644 --- a/window_scene/session/host/src/keyboard_session.cpp +++ b/window_scene/session/host/src/keyboard_session.cpp @@ -134,9 +134,12 @@ WSError KeyboardSession::SetKeyboardSessionGravity(SessionGravity gravity, uint3 TLOGE(WmsLogTag::WMS_KEYBOARD, "keyboard session is null"); return WSError::WS_ERROR_DESTROYED_OBJECT; } - TLOGI(WmsLogTag::WMS_KEYBOARD, "persistentId: %{public}d, gravity: %{public}d, percent: %{public}d", + TLOGI(WmsLogTag::WMS_KEYBOARD, "keyboardId: %{public}d, gravity: %{public}d, percent: %{public}d", session->GetPersistentId(), gravity, percent); + if (session->sessionChangeCallback_ && session->sessionChangeCallback_->onKeyboardGravityChange_) { + session->sessionChangeCallback_->onKeyboardGravityChange_(gravity); + } if (session->GetSessionProperty()) { session->GetSessionProperty()->SetKeyboardSessionGravity(gravity, percent); } diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 553bf87b5f..1e13d1a522 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -6842,6 +6842,13 @@ const std::map> SceneSessionManager::GetSceneSession return true; } + if (pair.second->GetWindowType() == WindowType::WINDOW_TYPE_KEYBOARD_PANEL) { + if (pair.second->IsVisible()) { + return false; + } + return true; + } + if (pair.second->IsSystemInput()) { return false; } else if (pair.second->IsSystemSession() && pair.second->IsVisible() && pair.second->IsSystemActive()) { -- Gitee