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 b9f795a469b08ef25e319105e85db6fb0ee5cb3a..ea8dd43b1708c4a7aa3d11afabe231a5b0a3f49e 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 @@ -238,6 +238,8 @@ napi_value JsSceneSessionManager::Init(napi_env env, napi_value exportObj) JsSceneSessionManager::SetIsWindowRectAutoSave); BindNativeFunction(env, exportObj, "notifyAboveLockScreen", moduleName, JsSceneSessionManager::NotifyAboveLockScreen); + BindNativeFunction(env, exportObj, "setStatusBarAvoidHeight", moduleName, + JsSceneSessionManager::SetStatusBarAvoidHeight); return NapiGetUndefined(env); } @@ -1215,6 +1217,12 @@ napi_value JsSceneSessionManager::NotifyAboveLockScreen(napi_env env, napi_callb return me->OnNotifyAboveLockScreen(env, info); } +napi_value JsSceneSessionManager::SetStatusBarAvoidHeight(napi_env env, napi_callback_info info) +{ + JsSceneSessionManager* me = CheckParamsAndGetThis(env, info); + return (me != nullptr) ? me->OnSetStatusBarAvoidHeight(env, info) : nullptr; +} + bool JsSceneSessionManager::IsCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject) { HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsSceneSessionManager::IsCallbackRegistered[%s]", type.c_str()); @@ -3977,4 +3985,33 @@ void JsSceneSessionManager::OnWatchFocusActiveChange(bool isActive) napi_call_function(env, NapiGetUndefined(env), jsCallBack->GetNapiValue(), ArraySize(argv), argv, nullptr); }, __func__); } + +napi_value JsSceneSessionManager::OnSetStatusBarAvoidHeight(napi_env env, napi_callback_info info) +{ + size_t argc = ARGC_FOUR; + napi_value argv[ARGC_FOUR] = { nullptr }; + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + if (argc < ARGC_ONE) { + TLOGE(WmsLogTag::WMS_IMMS, "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); + } + if (SceneSessionManager::GetInstance().GetSystemSessionConfig().IsPcWindow() || + SceneSessionManager::GetInstance().GetSystemSessionConfig().IsFreeMultiWindowMode()) { + TLOGE(WmsLogTag::WMS_IMMS, "device not support"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_DEVICE_NOT_SUPPORT), + "Device is not supported")); + return NapiGetUndefined(env); + } + int32_t height = 0; + if (!ConvertFromJsValue(env, argv[0], height)) { + TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to height"); + napi_throw(env, CreateJsError(env, static_cast(WSErrorCode::WS_ERROR_INVALID_PARAM), + "Input parameter is missing or invalid")); + return NapiGetUndefined(env); + } + SceneSessionManager::GetInstance().SetStatusBarAvoidHeight(height); + return NapiGetUndefined(env); +} } // namespace OHOS::Rosen diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h index 67850e20c639537ee0ec58360c9a9d6385d79b39..bf53c3b527ab31b9554592afd63b4eeeecf0a76a 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_session_manager.h @@ -97,9 +97,6 @@ public: static napi_value GetRssData(napi_env env, napi_callback_info info); static napi_value RegisterRssData(napi_env env, napi_callback_info info); static napi_value UnregisterRssData(napi_env env, napi_callback_info info); - static napi_value SetStatusBarDefaultVisibilityPerDisplay(napi_env env, napi_callback_info info); - static napi_value NotifyStatusBarShowStatus(napi_env env, napi_callback_info info); - static napi_value NotifyAINavigationBarShowStatus(napi_env env, napi_callback_info info); static napi_value NotifySessionRecoverStatus(napi_env env, napi_callback_info info); static napi_value UpdateSessionDisplayId(napi_env env, napi_callback_info info); static napi_value NotifyStackEmpty(napi_env env, napi_callback_info info); @@ -116,7 +113,6 @@ public: static napi_value SetAppForceLandscapeConfig(napi_env env, napi_callback_info info); static napi_value SwitchFreeMultiWindow(napi_env env, napi_callback_info info); static napi_value GetFreeMultiWindowConfig(napi_env env, napi_callback_info info); - static napi_value GetIsLayoutFullScreen(napi_env env, napi_callback_info info); static napi_value IsScbCoreEnabled(napi_env env, napi_callback_info info); static napi_value RefreshPcZOrder(napi_env env, napi_callback_info info); static napi_value GetWindowPid(napi_env env, napi_callback_info info); @@ -134,6 +130,15 @@ public: static napi_value GetLastInstanceKey(napi_env env, napi_callback_info info); static napi_value RefreshAppInfo(napi_env env, napi_callback_info info); + /* + * Window Immersive + */ + static napi_value NotifyAINavigationBarShowStatus(napi_env env, napi_callback_info info); + static napi_value GetIsLayoutFullScreen(napi_env env, napi_callback_info info); + static napi_value SetStatusBarDefaultVisibilityPerDisplay(napi_env env, napi_callback_info info); + static napi_value NotifyStatusBarShowStatus(napi_env env, napi_callback_info info); + static napi_value SetStatusBarAvoidHeight(napi_env env, napi_callback_info info); + private: napi_value OnRegisterCallback(napi_env env, napi_callback_info info); napi_value OnGetRootSceneSession(napi_env env, napi_callback_info info); @@ -178,9 +183,6 @@ private: napi_value OnUpdateSessionDisplayId(napi_env env, napi_callback_info info); napi_value OnNotifyStackEmpty(napi_env env, napi_callback_info info); napi_value OnNotifySwitchingUser(napi_env env, napi_callback_info info); - napi_value OnSetStatusBarDefaultVisibilityPerDisplay(napi_env env, napi_callback_info info); - napi_value OnNotifyStatusBarShowStatus(napi_env env, napi_callback_info info); - napi_value OnNotifyAINavigationBarShowStatus(napi_env env, napi_callback_info info); napi_value OnUpdateTitleInTargetPos(napi_env env, napi_callback_info info); napi_value OnSetSystemAnimatedScenes(napi_env env, napi_callback_info info); napi_value OnGetSessionSnapshotPixelMap(napi_env env, napi_callback_info info); @@ -189,7 +191,6 @@ private: napi_value OnGetCustomDecorHeight(napi_env env, napi_callback_info info); napi_value OnSwitchFreeMultiWindow(napi_env env, napi_callback_info info); napi_value OnGetFreeMultiWindowConfig(napi_env env, napi_callback_info info); - napi_value OnGetIsLayoutFullScreen(napi_env env, napi_callback_info info); napi_value OnNotifyEnterRecentTask(napi_env env, napi_callback_info info); napi_value OnUpdateDisplayHookInfo(napi_env env, napi_callback_info info); napi_value OnUpdateAppHookDisplayInfo(napi_env env, napi_callback_info info); @@ -212,6 +213,15 @@ private: napi_value OnGetLastInstanceKey(napi_env env, napi_callback_info info); napi_value OnRefreshAppInfo(napi_env env, napi_callback_info info); + /* + * Window Immersive + */ + napi_value OnNotifyAINavigationBarShowStatus(napi_env env, napi_callback_info info); + napi_value OnGetIsLayoutFullScreen(napi_env env, napi_callback_info info); + napi_value OnSetStatusBarDefaultVisibilityPerDisplay(napi_env env, napi_callback_info info); + napi_value OnNotifyStatusBarShowStatus(napi_env env, napi_callback_info info); + napi_value OnSetStatusBarAvoidHeight(napi_env env, napi_callback_info info); + void OnRootSceneBackEvent(); void OnStatusBarEnabledUpdate(bool enable, const std::string& bundleName); void OnGestureNavigationEnabledUpdate(bool enable, const std::string& bundleName, GestureBackType type); diff --git a/window_scene/session/host/include/scene_session.h b/window_scene/session/host/include/scene_session.h index e097365631dd27da086aadc8b773abee89fb6db4..5ea64c7bfe7b1d8c5aaff810124cdcea7ce5c3af 100644 --- a/window_scene/session/host/include/scene_session.h +++ b/window_scene/session/host/include/scene_session.h @@ -103,6 +103,7 @@ using UpdateAppUseControlFunc = std::function& avoidArea, AvoidAreaType type)>; using NotifySetSupportedWindowModesFunc = std::function&& supportedWindowModes)>; +using GetStatusBarAvoidHeightFunc = std::function; struct UIExtensionTokenInfo { bool canShowOnLockScreen { false }; @@ -336,6 +337,7 @@ public: void RegisterSystemBarPropertyChangeCallback(NotifySystemBarPropertyChangeFunc&& callback); void MarkAvoidAreaAsDirty(); virtual void RecalculatePanelRectForAvoidArea(WSRect& panelRect) {} + void RegisterGetStatusBarAvoidHeightFunc(GetStatusBarAvoidHeightFunc&& func); void SetAbilitySessionInfo(std::shared_ptr abilityInfo); void SetWindowDragHotAreaListener(const NotifyWindowDragHotAreaFunc& func); @@ -635,6 +637,7 @@ protected: bool PipelineNeedNotifyClientToUpdateAvoidArea(uint32_t dirty) const; NotifyNeedAvoidFunc onNeedAvoid_; NotifySystemBarPropertyChangeFunc onSystemBarPropertyChange_; + GetStatusBarAvoidHeightFunc onGetStatusBarAvoidHeightFunc_; /* * Gesture Back diff --git a/window_scene/session/host/src/root_scene_session.cpp b/window_scene/session/host/src/root_scene_session.cpp index 7b17f3ac69297247fcfc92b15fa49c5615c89fae..bd37759ea1a2abd86f4dfd82a2b09676b859a872 100644 --- a/window_scene/session/host/src/root_scene_session.cpp +++ b/window_scene/session/host/src/root_scene_session.cpp @@ -43,6 +43,9 @@ void RootSceneSession::GetSystemAvoidAreaForRoot(const WSRect& rect, AvoidArea& continue; } WSRect statusBarRect = statusBar->GetSessionRect(); + if (onGetStatusBarAvoidHeightFunc_) { + onGetStatusBarAvoidHeightFunc_(statusBarRect); + } CalculateAvoidAreaRect(rect, statusBarRect, avoidArea); TLOGI(WmsLogTag::WMS_IMMS, "root scene %{public}s status bar %{public}s area %{public}s", rect.ToString().c_str(), statusBarRect.ToString().c_str(), avoidArea.ToString().c_str()); diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index a442a79ad14ea9b6ca2a1dc6fb84eb851a8b07f5..9f9da4edd03fa08214e4dc19249cf8f10994b3ca 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -1859,6 +1859,9 @@ void SceneSession::GetSystemAvoidArea(WSRect& rect, AvoidArea& avoidArea) WindowType::WINDOW_TYPE_STATUS_BAR, sessionProperty->GetDisplayId()); } for (auto& statusBar : statusBarVector) { + if (statusBar == nullptr) { + continue; + } WSRect statusBarRect = statusBar->GetSessionRect(); bool isStatusBarVisible = WindowHelper::IsMainWindow(Session::GetWindowType()) ? isStatusBarVisible_ : statusBar->isVisible_; @@ -1866,8 +1869,11 @@ void SceneSession::GetSystemAvoidArea(WSRect& rect, AvoidArea& avoidArea) TLOGI(WmsLogTag::WMS_IMMS, "win %{public}d status bar not visible", GetPersistentId()); continue; } - TLOGI(WmsLogTag::WMS_IMMS, "win %{public}s status bar %{public}s", - rect.ToString().c_str(), statusBarRect.ToString().c_str()); + if (onGetStatusBarAvoidHeightFunc_) { + onGetStatusBarAvoidHeightFunc_(statusBarRect); + } + TLOGI(WmsLogTag::WMS_IMMS, "win %{public}d rect %{public}s status bar %{public}s", + GetPersistentId(), rect.ToString().c_str(), statusBarRect.ToString().c_str()); CalculateAvoidAreaRect(rect, statusBarRect, avoidArea); } return; @@ -5644,6 +5650,11 @@ void SceneSession::RegisterLayoutFullScreenChangeCallback(NotifyLayoutFullScreen }, __func__); } +void SceneSession::RegisterGetStatusBarAvoidHeightFunc(GetStatusBarAvoidHeightFunc&& callback) +{ + onGetStatusBarAvoidHeightFunc_ = std::move(callback); +} + WMError SceneSession::GetAppForceLandscapeConfig(AppForceLandscapeConfig& config) { if (forceSplitFunc_ == nullptr) { @@ -5679,11 +5690,16 @@ int32_t SceneSession::GetStatusBarHeight() const auto& statusBarVector = specificCallback_->onGetSceneSessionVectorByTypeAndDisplayId_( WindowType::WINDOW_TYPE_STATUS_BAR, GetSessionProperty()->GetDisplayId()); for (auto& statusBar : statusBarVector) { - if (statusBar != nullptr && statusBar->GetSessionRect().height_ > height) { - height = statusBar->GetSessionRect().height_; + if (statusBar == nullptr) { + continue; + } + WSRect statusBarRect = statusBar->GetSessionRect(); + if (onGetStatusBarAvoidHeightFunc_) { + onGetStatusBarAvoidHeightFunc_(statusBarRect); } + height = statusBarRect.height_; } - TLOGD(WmsLogTag::WMS_IMMS, "height %{public}d", height); + TLOGI(WmsLogTag::WMS_IMMS, "win %{public}d height %{public}d", GetPersistentId(), height); return height; } diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index 0842e646f315612432a42affbcffbeaa3da3ad70..2e4786fbf303a202943a3498740cdd70d2b30bee 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -386,6 +386,8 @@ public: void SetIsRootSceneLastFrameLayoutFinishedFunc(IsRootSceneLastFrameLayoutFinishedFunc&& func); void SetStatusBarDefaultVisibilityPerDisplay(DisplayId displayId, bool visible); bool GetStatusBarDefaultVisibilityByDisplayId(DisplayId displayId); + void SetStatusBarAvoidHeight(int32_t height); + void GetStatusBarAvoidHeight(WSRect& barArea); WSError NotifyWindowExtensionVisibilityChange(int32_t pid, int32_t uid, bool visible) override; void DealwithVisibilityChange(const std::vector>& visibilityChangeInfos, @@ -1158,6 +1160,8 @@ private: std::unordered_map statusBarDefaultVisibilityPerDisplay_; std::set avoidAreaListenerSessionSet_; std::map> lastUpdatedAvoidArea_; + static constexpr int32_t INVALID_STATUS_BAR_AVOID_HEIGHT = -1; + int32_t statusBarAvoidHeight_ = INVALID_STATUS_BAR_AVOID_HEIGHT; struct SessionInfoList { int32_t uid_; diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index f44d258c5bf56a74c49c4ee068495749304e94f0..c156cd369875b9aebbc5cc883f917a8a07a73513 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -1837,6 +1837,9 @@ sptr SceneSessionManager::CreateSceneSession(const SessionInfo& se sceneSession->SetIsLastFrameLayoutFinishedFunc([this](bool& isLayoutFinished) { return this->IsLastFrameLayoutFinished(isLayoutFinished); }); + sceneSession->RegisterGetStatusBarAvoidHeightFunc([this](WSRect& barArea) { + return this->GetStatusBarAvoidHeight(barArea); + }); DragResizeType dragResizeType = DragResizeType::RESIZE_TYPE_UNDEFINED; GetAppDragResizeType(sessionInfo.bundleName_, dragResizeType); sceneSession->SetAppDragResizeType(dragResizeType); @@ -12340,4 +12343,21 @@ WMError SceneSessionManager::HasFloatingWindowForeground(const sptr= 0 ? height : INVALID_STATUS_BAR_AVOID_HEIGHT; + TLOGNI(WmsLogTag::WMS_IMMS, "%{public}s, height %{public}d", where, statusBarAvoidHeight_); + return WMError::WM_OK; + }; + taskScheduler_->PostSyncTask(task, where); +} + +void SceneSessionManager::GetStatusBarAvoidHeight(WSRect& barArea) +{ + barArea.height_ = statusBarAvoidHeight_ == INVALID_STATUS_BAR_AVOID_HEIGHT ? + barArea.height_ : statusBarAvoidHeight_; +} } // namespace OHOS::Rosen