From 0a1a3c5572c48ebdd94862150914b12e5fa58fe6 Mon Sep 17 00:00:00 2001 From: wangyaohui Date: Tue, 10 Jun 2025 15:39:14 +0800 Subject: [PATCH 1/3] [fix] add set init surface rect interface to pip ndk Signed-off-by: wangyaohui --- ..._picture_in_picture_controller_interface.h | 2 + interfaces/kits/ndk/libwm.ndk.json | 8 ++++ interfaces/kits/ndk/wm/oh_window_pip.h | 29 ++++++++++++++ .../picture_in_picture_controller_base.h | 1 + .../web_picture_in_picture_controller.h | 5 +++ wm/src/oh_window_pip.cpp | 21 ++++++++++ wm/src/web_picture_in_picture_controller.cpp | 17 ++++++++- ...icture_in_picture_controller_interface.cpp | 27 +++++++++++++ wm/test/unittest/oh_window_pip_test.cpp | 34 +++++++++++++++++ ...e_in_picture_controller_interface_test.cpp | 38 +++++++++++++++++++ 10 files changed, 180 insertions(+), 2 deletions(-) diff --git a/interfaces/innerkits/wm/web_picture_in_picture_controller_interface.h b/interfaces/innerkits/wm/web_picture_in_picture_controller_interface.h index 07e4abf704..9d1052a321 100644 --- a/interfaces/innerkits/wm/web_picture_in_picture_controller_interface.h +++ b/interfaces/innerkits/wm/web_picture_in_picture_controller_interface.h @@ -34,6 +34,8 @@ public: WMError UpdateContentSize(int32_t width, int32_t height); WMError UpdatePiPControlStatus(PiPControlType controlType, PiPControlStatus status); WMError setPiPControlEnabled(PiPControlType controlType, bool enabled); + WMError SetPipInitialSurfaceRect(int32_t positionX, int32_t positionY, uint32_t width, uint32_t height); + WMError UnsetPipInitialSurfaceRect(); WMError RegisterStartPipListener(NativePipStartPipCallback); WMError RegisterLifeCycleListener(NativePipLifeCycleCallback); WMError RegisterControlEventListener(NativePipControlEventCallback); diff --git a/interfaces/kits/ndk/libwm.ndk.json b/interfaces/kits/ndk/libwm.ndk.json index 7a52c1de1e..d357d6429d 100644 --- a/interfaces/kits/ndk/libwm.ndk.json +++ b/interfaces/kits/ndk/libwm.ndk.json @@ -135,6 +135,14 @@ "first_instroduced":"20", "name":"OH_PictureInPicture_SetPipControlEnabled" }, + { + "first_instroduced":"20", + "name":"OH_PictureInPicture_SetPipInitialSurfaceRect" + }, + { + "first_instroduced":"20", + "name":"OH_PictureInPicture_UnsetPipInitialSurfaceRect" + }, { "first_instroduced":"20", "name":"OH_PictureInPicture_RegisterStartPipCallback" diff --git a/interfaces/kits/ndk/wm/oh_window_pip.h b/interfaces/kits/ndk/wm/oh_window_pip.h index 9dad3a483b..39d33a86f8 100644 --- a/interfaces/kits/ndk/wm/oh_window_pip.h +++ b/interfaces/kits/ndk/wm/oh_window_pip.h @@ -370,6 +370,35 @@ int32_t OH_PictureInPicture_UpdatePipControlStatus(uint32_t controllerId, Pictur int32_t OH_PictureInPicture_SetPipControlEnabled(uint32_t controllerId, PictureInPicture_PipControlType controlType, bool enabled); +/** + * @brief Set picture-in-picture initial surface rect. + * + * @param controllerId The picture-in-picture controller ID + * @param positionX The X position of the first frame when start the picture-in-picture. + * @param positionY The Y position of the first frame when start the picture-in-picture. + * @param width The width of the first frame when start the picture-in-picture. + * @param height The height of the first frame when start the picture-in-picture. + * @return Return the result code. + * {@link OK} the function call is successful. + * {@link WINDOW_MANAGER_ERRORCODE_INCORRECT_PARAM} parameter error. + * {@link WINDOW_MANAGER_ERRORCODE_PIP_INTERNAL_ERROR} pip internal error. + * @since 20 + */ +int32_t OH_PictureInPicture_SetPipInitialSurfaceRect(uint32_t controllerId, int32_t positionX, int32_t positionY, + uint32_t width, uint32_t height); + +/** + * @brief Unset picture-in-picture initial surface rect. + * + * @param controllerId The picture-in-picture controller ID + * @return Return the result code. + * {@link OK} the function call is successful. + * {@link WINDOW_MANAGER_ERRORCODE_INCORRECT_PARAM} parameter error. + * {@link WINDOW_MANAGER_ERRORCODE_PIP_INTERNAL_ERROR} pip internal error. + * @since 20 + */ +int32_t OH_PictureInPicture_UnsetPipInitialSurfaceRect(uint32_t controllerId); + /** * @brief Register picture-in-picture controller start callback. * diff --git a/wm/include/picture_in_picture_controller_base.h b/wm/include/picture_in_picture_controller_base.h index 96a1955ac8..7b51f47a20 100644 --- a/wm/include/picture_in_picture_controller_base.h +++ b/wm/include/picture_in_picture_controller_base.h @@ -119,6 +119,7 @@ public: // web virtual uint8_t GetWebRequestId() { return 0; }; + virtual void SetPipInitialSurfaceRect(int32_t positionX, int32_t positionY, uint32_t width, uint32_t height) {}; protected: class WindowLifeCycleListener : public IWindowLifeCycle { diff --git a/wm/include/web_picture_in_picture_controller.h b/wm/include/web_picture_in_picture_controller.h index c9366ff214..9f50e1fee1 100644 --- a/wm/include/web_picture_in_picture_controller.h +++ b/wm/include/web_picture_in_picture_controller.h @@ -38,6 +38,7 @@ public: ~WebPictureInPictureController() = default; WMError StartPictureInPicture(StartPipType startType) override; void UpdateContentSize(int32_t width, int32_t height) override; + void SetPipInitialSurfaceRect(int32_t positionX, int32_t positionY, uint32_t width, uint32_t height) override; void RestorePictureInPictureWindow() override; WMError SetXComponentController(std::shared_ptr xComponentController) override; uint8_t GetWebRequestId() override; @@ -51,6 +52,10 @@ protected: private: wptr weakRef_ = nullptr; uint8_t webRequestId_ = 0; + int32_t initPositionX_ = 0; + int32_t initPositionY_ = 0; + uint32_t initWidth_ = 0; + uint32_t initHeight_ = 0; }; } // namespace Rosen } // namespace OHOS diff --git a/wm/src/oh_window_pip.cpp b/wm/src/oh_window_pip.cpp index 3f9a13f6cf..e7dcc3401a 100644 --- a/wm/src/oh_window_pip.cpp +++ b/wm/src/oh_window_pip.cpp @@ -285,6 +285,27 @@ int32_t OH_PictureInPicture_SetPipControlEnabled(uint32_t controllerId, PictureI enabled)); } +int32_t OH_PictureInPicture_SetPipInitialSurfaceRect(uint32_t controllerId, int32_t positionX, int32_t positionY, + uint32_t width, uint32_t height) +{ + auto pipController = GetControllerFromId(controllerId); + if (pipController == nullptr) { + TLOGE(WmsLogTag::WMS_PIP, "controllerId not found: %{public}d", controllerId); + return WindowManager_ErrorCode::WINDOW_MANAGER_ERRORCODE_INCORRECT_PARAM; + } + return GetErrorCodeFromWMError(pipController->SetPipInitialSurfaceRect(positionX, positionY, width, height)); +} + +int32_t OH_PictureInPicture_UnsetPipInitialSurfaceRect(uint32_t controllerId) +{ + auto pipController = GetControllerFromId(controllerId); + if (pipController == nullptr) { + TLOGE(WmsLogTag::WMS_PIP, "controllerId not found: %{public}d", controllerId); + return WindowManager_ErrorCode::WINDOW_MANAGER_ERRORCODE_INCORRECT_PARAM; + } + return GetErrorCodeFromWMError(pipController->UnsetPipInitialSurfaceRect()); +} + int32_t OH_PictureInPicture_RegisterStartPipCallback(uint32_t controllerId, WebPipStartPipCallback callback) { auto pipController = GetControllerFromId(controllerId); diff --git a/wm/src/web_picture_in_picture_controller.cpp b/wm/src/web_picture_in_picture_controller.cpp index 69ff3d77d1..24175113ee 100644 --- a/wm/src/web_picture_in_picture_controller.cpp +++ b/wm/src/web_picture_in_picture_controller.cpp @@ -133,6 +133,15 @@ void WebPictureInPictureController::UpdateContentSize(int32_t width, int32_t hei SingletonContainer::Get().ReportPiPRatio(width, height); } +void WebPictureInPictureController::SetPipInitialSurfaceRect(int32_t positionX, int32_t positionY, + uint32_t width, uint32_t height) +{ + initPositionX_ = positionX; + initPositionY_ = positionY; + initWidth_ = width; + initHeight_ = height; +} + void WebPictureInPictureController::RestorePictureInPictureWindow() { StopPictureInPicture(true, StopPipType::NULL_STOP, false); @@ -147,8 +156,12 @@ void WebPictureInPictureController::UpdateWinRectByComponent() pipOption_->GetContentSize(contentWidth, contentHeight); windowRect_.width_ = contentWidth; windowRect_.height_ = contentHeight; - windowRect_.posX_ = 0; - windowRect_.posY_ = 0; + if (initWidth_ > 0 && initHeight_ > 0) { + windowRect_.width_ = initWidth_; + windowRect_.height_ = initHeight_; + } + windowRect_.posX_ = initPositionX_; + windowRect_.posY_ = initPositionY_; TLOGD(WmsLogTag::WMS_PIP, "position width: %{public}u, height: %{public}u, posX: %{public}d, posY: %{public}d", windowRect_.width_, windowRect_.height_, windowRect_.posX_, windowRect_.posY_); } diff --git a/wm/src/web_picture_in_picture_controller_interface.cpp b/wm/src/web_picture_in_picture_controller_interface.cpp index 8e3273db4b..5fa7547e94 100644 --- a/wm/src/web_picture_in_picture_controller_interface.cpp +++ b/wm/src/web_picture_in_picture_controller_interface.cpp @@ -191,6 +191,33 @@ WMError WebPictureInPictureControllerInterface::setPiPControlEnabled(PiPControlT } } +WMError WebPictureInPictureControllerInterface::SetPipInitialSurfaceRect(int32_t positionX, int32_t positionY, + uint32_t width, uint32_t height) +{ + if (width < 1 || height < 1) { + TLOGE(WmsLogTag::WMS_PIP, "invalid initial rect"); + return WMError::WM_ERROR_INVALID_PARAM; + } + if (auto pipController = sptrWebPipController_) { + pipController->SetPipInitialSurfaceRect(positionX, positionY, width, height); + return WMError::WM_OK; + } else { + TLOGE(WmsLogTag::WMS_PIP, "webPipController is nullptr"); + return WMError::WM_ERROR_PIP_INTERNAL_ERROR; + } +} + +WMError WebPictureInPictureControllerInterface::UnsetPipInitialSurfaceRect() +{ + if (auto pipController = sptrWebPipController_) { + pipController->SetPipInitialSurfaceRect(0, 0, 0, 0); + return WMError::WM_OK; + } else { + TLOGE(WmsLogTag::WMS_PIP, "webPipController is nullptr"); + return WMError::WM_ERROR_PIP_INTERNAL_ERROR; + } +} + WMError WebPictureInPictureControllerInterface::RegisterStartPipListener(NativePipStartPipCallback callback) { if (!isPipEnabled_) { diff --git a/wm/test/unittest/oh_window_pip_test.cpp b/wm/test/unittest/oh_window_pip_test.cpp index 58f15fe99d..047354f33f 100644 --- a/wm/test/unittest/oh_window_pip_test.cpp +++ b/wm/test/unittest/oh_window_pip_test.cpp @@ -547,6 +547,40 @@ HWTEST_F(OHWindowPipTest, OH_PictureInPicture_UnregisterAllResizeListeners, Test EXPECT_EQ(WindowManager_ErrorCode::OK, ret); OH_PictureInPicture_DeletePip(pipControllerId_); } + +/** + * @tc.name: OH_PictureInPicture_SetPipInitialSurfaceRect + * @tc.desc: OH_PictureInPicture_SetPipInitialSurfaceRect + * @tc.type: FUNC + */ +HWTEST_F(OHWindowPipTest, OH_PictureInPicture_SetPipInitialSurfaceRect, TestSize.Level1) +{ + uint32_t pipControllerId_ = 0; + auto ret = OH_PictureInPicture_CreatePip(pipConfig, &pipControllerId_); + EXPECT_EQ(WindowManager_ErrorCode::OK, ret); + ret = OH_PictureInPicture_SetPipInitialSurfaceRect(pipControllerId_ + 1, 10, 10, 100, 100); + EXPECT_EQ(WindowManager_ErrorCode::WINDOW_MANAGER_ERRORCODE_INCORRECT_PARAM, ret); + ret = OH_PictureInPicture_SetPipInitialSurfaceRect(pipControllerId_, 10, 10, 100, 100); + EXPECT_EQ(WindowManager_ErrorCode::OK, ret); + OH_PictureInPicture_DeletePip(pipControllerId_); +} + +/** + * @tc.name: OH_PictureInPicture_UnsetPipInitialSurfaceRect + * @tc.desc: OH_PictureInPicture_UnsetPipInitialSurfaceRect + * @tc.type: FUNC + */ +HWTEST_F(OHWindowPipTest, OH_PictureInPicture_UnsetPipInitialSurfaceRect, TestSize.Level1) +{ + uint32_t pipControllerId_ = 0; + auto ret = OH_PictureInPicture_CreatePip(pipConfig, &pipControllerId_); + EXPECT_EQ(WindowManager_ErrorCode::OK, ret); + ret = OH_PictureInPicture_UnsetPipInitialSurfaceRect(pipControllerId_ + 1); + EXPECT_EQ(WindowManager_ErrorCode::WINDOW_MANAGER_ERRORCODE_INCORRECT_PARAM, ret); + ret = OH_PictureInPicture_UnsetPipInitialSurfaceRect(pipControllerId_); + EXPECT_EQ(WindowManager_ErrorCode::OK, ret); + OH_PictureInPicture_DeletePip(pipControllerId_); +} } } } \ No newline at end of file diff --git a/wm/test/unittest/web_picture_in_picture_controller_interface_test.cpp b/wm/test/unittest/web_picture_in_picture_controller_interface_test.cpp index 77c300192f..031ae883af 100644 --- a/wm/test/unittest/web_picture_in_picture_controller_interface_test.cpp +++ b/wm/test/unittest/web_picture_in_picture_controller_interface_test.cpp @@ -435,6 +435,44 @@ HWTEST_F(WebPictureInPictureControllerInterfaceTest, UnregisterAllPiPWindowSize, ret = controller->UnregisterAllPiPWindowSize(); EXPECT_EQ(WMError::WM_ERROR_PIP_INTERNAL_ERROR, ret); } + +/** + * @tc.name: SetPipInitialSurfaceRect + * @tc.desc: SetPipInitialSurfaceRect + * @tc.type: FUNC + */ +HWTEST_F(WebPictureInPictureControllerInterfaceTest, SetPipInitialSurfaceRect, TestSize.Level1) +{ + controller->Create(pipConfig); + WMError ret = controller->SetPipInitialSurfaceRect(10, 10, 0, 20); + EXPECT_EQ(WMError::WM_ERROR_INVALID_PARAM, ret); + ret = controller->SetPipInitialSurfaceRect(10, 10, 20, 0); + EXPECT_EQ(WMError::WM_ERROR_INVALID_PARAM, ret); + ret = controller->SetPipInitialSurfaceRect(10, 10, 0, 0); + EXPECT_EQ(WMError::WM_ERROR_INVALID_PARAM, ret); + ret = controller->SetPipInitialSurfaceRect(10, 10, 20, 20); + EXPECT_EQ(WMError::WM_OK, ret); + controller->sptrWebPipController_ = nullptr; + ret = controller->SetPipInitialSurfaceRect(10, 10, 20, 20); + EXPECT_EQ(WMError::WM_ERROR_PIP_INTERNAL_ERROR, ret); +} + +/** + * @tc.name: UnsetPipInitialSurfaceRect + * @tc.desc: UnsetPipInitialSurfaceRect + * @tc.type: FUNC + */ +HWTEST_F(WebPictureInPictureControllerInterfaceTest, UnsetPipInitialSurfaceRect, TestSize.Level1) +{ + controller->Create(pipConfig); + WMError ret = controller->SetPipInitialSurfaceRect(10, 10, 20, 20); + EXPECT_EQ(WMError::WM_OK, ret); + ret = controller->UnsetPipInitialSurfaceRect(); + EXPECT_EQ(WMError::WM_OK, ret); + controller->sptrWebPipController_ = nullptr; + ret = controller->UnsetPipInitialSurfaceRect(); + EXPECT_EQ(WMError::WM_ERROR_PIP_INTERNAL_ERROR, ret); +} } } } \ No newline at end of file -- Gitee From 27572d22ec7badc6e53f0e8d8aea17c096a14463 Mon Sep 17 00:00:00 2001 From: wangyaohui Date: Thu, 12 Jun 2025 19:19:22 +0800 Subject: [PATCH 2/3] codeCheck Signed-off-by: wangyaohui --- wm/src/web_picture_in_picture_controller_interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wm/src/web_picture_in_picture_controller_interface.cpp b/wm/src/web_picture_in_picture_controller_interface.cpp index 5fa7547e94..cdebc9b81f 100644 --- a/wm/src/web_picture_in_picture_controller_interface.cpp +++ b/wm/src/web_picture_in_picture_controller_interface.cpp @@ -194,7 +194,7 @@ WMError WebPictureInPictureControllerInterface::setPiPControlEnabled(PiPControlT WMError WebPictureInPictureControllerInterface::SetPipInitialSurfaceRect(int32_t positionX, int32_t positionY, uint32_t width, uint32_t height) { - if (width < 1 || height < 1) { + if (width <= 0 || height <= 0) { TLOGE(WmsLogTag::WMS_PIP, "invalid initial rect"); return WMError::WM_ERROR_INVALID_PARAM; } -- Gitee From ebc7849bec917311c360f030dea0d5a48b5ac33f Mon Sep 17 00:00:00 2001 From: wangyaohui Date: Fri, 13 Jun 2025 07:01:00 +0000 Subject: [PATCH 3/3] update wm/src/web_picture_in_picture_controller_interface.cpp. Signed-off-by: wangyaohui --- wm/src/web_picture_in_picture_controller_interface.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wm/src/web_picture_in_picture_controller_interface.cpp b/wm/src/web_picture_in_picture_controller_interface.cpp index cdebc9b81f..624ff6bae3 100644 --- a/wm/src/web_picture_in_picture_controller_interface.cpp +++ b/wm/src/web_picture_in_picture_controller_interface.cpp @@ -26,6 +26,7 @@ using namespace Ace; namespace { constexpr uint32_t MAX_CONTROL_GROUP_NUM = 3; std::shared_mutex cbSetMutex_; + std::shared_mutex initRectMutex_; const std::set VIDEO_PLAY_CONTROLS { PiPControlGroup::VIDEO_PREVIOUS_NEXT, PiPControlGroup::FAST_FORWARD_BACKWARD, @@ -199,6 +200,7 @@ WMError WebPictureInPictureControllerInterface::SetPipInitialSurfaceRect(int32_t return WMError::WM_ERROR_INVALID_PARAM; } if (auto pipController = sptrWebPipController_) { + std::unique_lock lock(initRectMutex_); pipController->SetPipInitialSurfaceRect(positionX, positionY, width, height); return WMError::WM_OK; } else { @@ -210,6 +212,7 @@ WMError WebPictureInPictureControllerInterface::SetPipInitialSurfaceRect(int32_t WMError WebPictureInPictureControllerInterface::UnsetPipInitialSurfaceRect() { if (auto pipController = sptrWebPipController_) { + std::unique_lock lock(initRectMutex_); pipController->SetPipInitialSurfaceRect(0, 0, 0, 0); return WMError::WM_OK; } else { -- Gitee