diff --git a/interfaces/innerkits/wm/window.h b/interfaces/innerkits/wm/window.h index a8ff4f535609cc2478fa6ad40a2a25cbfbaafe4c..395c1ea4a1b7edc965f0a4a25c2549c03539c44f 100644 --- a/interfaces/innerkits/wm/window.h +++ b/interfaces/innerkits/wm/window.h @@ -1093,6 +1093,14 @@ public: */ virtual WMError SetLayoutFullScreen(bool status) { return WMError::WM_OK; } + /** + * @brief Set the immersive layout properties + * + * @param isIgnoreSafeArea + * @return WMError + */ + virtual WMError SetIgnoreSafeArea(bool isIgnoreSafeArea) { return WMError::WM_OK; } + /** * @brief Set whether the title bar and dock bar will show, when the mouse hovers over hot area. * diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp b/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp index dd0190d6625188693268c86d4bae1ecd84c6440f..7090d212c813ae9da494c5c6505fd7d4f0685e82 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window.cpp @@ -2966,6 +2966,7 @@ napi_value JsWindow::OnSetWindowLayoutFullScreen(napi_env env, napi_callback_inf // compatibleModeInPc need apply avoidArea method if (window->IsPcOrPadFreeMultiWindowMode() && !window->GetCompatibleModeInPc()) { TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s device not support", where); + window->SetIgnoreSafeArea(isLayoutFullScreen); task.Resolve(env, NapiGetUndefined(env)); return; } @@ -7420,19 +7421,25 @@ napi_value JsWindow::OnSetImmersiveModeEnabledState(napi_env env, napi_callback_ TLOGE(WmsLogTag::WMS_IMMS, "not allowed since invalid window type"); return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING); } - if (windowToken_->IsPcOrPadFreeMultiWindowMode()) { - TLOGE(WmsLogTag::WMS_IMMS, "device not support"); - return NapiGetUndefined(env); - } + WmErrorCode ret = WmErrorCode::WM_OK; napi_value nativeVal = argv[0]; + bool enable = true; if (nativeVal == nullptr) { TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to enable"); - return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM); + ret = WmErrorCode::WM_ERROR_INVALID_PARAM; + } else { + napi_get_value_bool(env, nativeVal, &enable); } - bool enable = true; - napi_get_value_bool(env, nativeVal, &enable); TLOGI(WmsLogTag::WMS_IMMS, "enable %{public}d", static_cast(enable)); - WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetImmersiveModeEnabledState(enable)); + if (windowToken_->IsPcOrPadFreeMultiWindowMode()) { + TLOGE(WmsLogTag::WMS_IMMS, "id:%{public}u device not support", windowToken_->GetWindowId()); + windowToken_->SetIgnoreSafeArea(enable); + return NapiGetUndefined(env); + } + if (ret != WmErrorCode::WM_OK) { + return NapiThrowError(env, ret); + } + ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetImmersiveModeEnabledState(enable)); if (ret != WmErrorCode::WM_OK) { TLOGE(WmsLogTag::WMS_IMMS, "set failed, ret %{public}d", ret); return NapiThrowError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY); diff --git a/previewer/include/window.h b/previewer/include/window.h index 299c4903ac88b6c6a2b3ff54720e631d5578aef6..aca3e75e5cf8376b3458a3628ea83a102aefdb34 100644 --- a/previewer/include/window.h +++ b/previewer/include/window.h @@ -179,6 +179,7 @@ public: virtual WMError GetSystemBarProperties(std::map& properties) = 0; virtual WMError SetFullScreen(bool status) = 0; virtual WMError SetLayoutFullScreen(bool status) = 0; + virtual WMError SetIgnoreSafeArea(bool isIgnoreSafeArea) { return WMError::WM_OK; } virtual WMError SetTitleAndDockHoverShown(bool titleHoverShowEnabled = true, bool dockHoverShowEnabled = true) { return WMError::WM_ERROR_DEVICE_NOT_SUPPORT; } virtual WMError Destroy() = 0; diff --git a/wm/include/window_scene_session_impl.h b/wm/include/window_scene_session_impl.h index cc24422de44f1658835bf1cb7a15b420b31c859c..2fc5f97cfcc913260ac66eec23699f31e545f6b1 100644 --- a/wm/include/window_scene_session_impl.h +++ b/wm/include/window_scene_session_impl.h @@ -263,6 +263,7 @@ public: SystemBarProperty GetSystemBarPropertyByType(WindowType type) const override; WMError SetSystemBarProperty(WindowType type, const SystemBarProperty& property) override; WMError SetLayoutFullScreen(bool status) override; + WMError SetIgnoreSafeArea(bool isIgnoreSafeArea) override; WMError SetFullScreen(bool status) override; WMError UpdateSystemBarProperties(const std::unordered_map& systemBarProperties, const std::unordered_map& systemBarPropertyFlags) override; diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index bf49736a0d1342b68c4403be7a68866e00da3fef..d5b10ba634693fd7fa12514ceb274599a13e2c4f 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -2242,6 +2242,11 @@ WMError WindowSceneSessionImpl::NotifyWindowNeedAvoid(bool status) return WMError::WM_OK; } +WMError WindowSceneSessionImpl::SetIgnoreSafeArea(bool isIgnoreSafeArea) +{ + return SetLayoutFullScreenByApiVersion(isIgnoreSafeArea); +} + WMError WindowSceneSessionImpl::SetLayoutFullScreenByApiVersion(bool status) { if (IsWindowSessionInvalid()) { diff --git a/wm/test/unittest/window_scene_session_impl_test.cpp b/wm/test/unittest/window_scene_session_impl_test.cpp index df87c0ea8c40b5ff49bca50d99273ba42914b156..9ccfaed7de9ae2ba3a6b4a84cf9b0c1ccba8cbd2 100644 --- a/wm/test/unittest/window_scene_session_impl_test.cpp +++ b/wm/test/unittest/window_scene_session_impl_test.cpp @@ -1475,6 +1475,28 @@ HWTEST_F(WindowSceneSessionImplTest, SetLayoutFullScreenByApiVersion, Function | ASSERT_EQ(false, window->property_->IsLayoutFullScreen()); } +/** + * @tc.name: SetIgnoreSafeArea + * @tc.desc: SetIgnoreSafeArea test + * @tc.type: FUNC + */ +HWTEST_F(WindowSceneSessionImplTest, SetIgnoreSafeArea, TestSize.Level0) +{ + sptr option = sptr::MakeSptr(); + option->SetWindowName("SetIgnoreSafeArea"); + sptr window = sptr::MakeSptr(option); + EXPECT_EQ(WMError::WM_ERROR_INVALID_WINDOW, window->SetIgnoreSafeArea(false)); + SessionInfo sessionInfo = { "CreateTestBundle", "CreateTestModule", "CreateTestAbility" }; + sptr session = sptr::MakeSptr(sessionInfo); + window->hostSession_ = session; + window->state_ = WindowState::STATE_SHOWN; + window->property_->SetPersistentId(1); + EXPECT_EQ(WMError::WM_OK, window->SetIgnoreSafeArea(false)); + EXPECT_FALSE(window->isIgnoreSafeArea_); + EXPECT_EQ(WMError::WM_OK, window->SetIgnoreSafeArea(true)); + EXPECT_TRUE(window->isIgnoreSafeArea_); +} + /** * @tc.name: SetGlobalMaximizeMode * @tc.desc: SetGlobalMaximizeMode test diff --git a/wm/test/unittest/window_test.cpp b/wm/test/unittest/window_test.cpp index 9f2c596eb37cf94c6f22bc69611deb7dda4fd9e1..11fec9e3d7e4b0c14757c33d7e301fbd9e77a592 100644 --- a/wm/test/unittest/window_test.cpp +++ b/wm/test/unittest/window_test.cpp @@ -486,6 +486,21 @@ HWTEST_F(WindowTest, SetLayoutFullScreen, Function | SmallTest | Level2) ASSERT_EQ(WMError::WM_OK, window->Destroy()); } +/** + * @tc.name: SetIgnoreSafeArea + * @tc.desc: SetIgnoreSafeArea + * @tc.type: FUNC + */ +HWTEST_F(WindowTest, SetIgnoreSafeArea, TestSize.Level1) +{ + sptr window = sptr::MakeSptr(); + auto ret = window->SetIgnoreSafeArea(true); + EXPECT_EQ(WMError::WM_OK, ret); + ret = window->SetIgnoreSafeArea(false); + EXPECT_EQ(WMError::WM_OK, ret); + EXPECT_EQ(WMError::WM_OK, window->Destroy()); +} + /** * @tc.name: SetTitleAndDockHoverShown * @tc.desc: get