diff --git a/window_scene/common/include/extension_data_handler.h b/window_scene/common/include/extension_data_handler.h index 4c0e9d6ac11c237659d9568d1e9bdcd24f792916..0af5c659c5eb8088617771ab347b9d1f889ed82d 100644 --- a/window_scene/common/include/extension_data_handler.h +++ b/window_scene/common/include/extension_data_handler.h @@ -65,6 +65,7 @@ protected: virtual bool WriteInterfaceToken(MessageParcel& data) = 0; DataHandlerErr ParseReply(MessageParcel& recieved, AAFwk::Want& reply, const DataTransferConfig& config); void PostAsyncTask(Task&& task, const std::string& name, int64_t delayTime); + bool IsProxyObject() const; protected: mutable std::mutex mutex_; diff --git a/window_scene/common/src/extension_data_handler.cpp b/window_scene/common/src/extension_data_handler.cpp index 1e36e69a40906e02fc2630a9072c6bcdb0cbadd9..07582667f03720f20a868e8b9b763701cd19f93d 100644 --- a/window_scene/common/src/extension_data_handler.cpp +++ b/window_scene/common/src/extension_data_handler.cpp @@ -82,10 +82,16 @@ void DataHandler::UnregisterDataConsumer(SubSystemId subSystemId) TLOGI(WmsLogTag::WMS_UIEXT, "Unregister consumer for subSystemId: %{public}hhu", subSystemId); } +bool DataHandler::IsProxyObject() const +{ + std::lock_guard lock(mutex_); + return remoteProxy_ && remoteProxy_->IsProxyObject(); +} + DataHandlerErr DataHandler::PrepareSendData(MessageParcel& data, const DataTransferConfig& config, const AAFwk::Want& toSend) { - if (!WriteInterfaceToken(data)) { + if (IsProxyObject() && !WriteInterfaceToken(data)) { TLOGE(WmsLogTag::WMS_UIEXT, "write interface token failed, %{public}s", config.ToString().c_str()); return DataHandlerErr::WRITE_PARCEL_ERROR; } @@ -163,11 +169,6 @@ void DataHandler::SetEventHandler(const std::shared_ptr& remoteObject) { - if (!remoteObject || !remoteObject->IsProxyObject()) { - TLOGE(WmsLogTag::WMS_UIEXT, "failed, not proxy object"); - return; - } - std::lock_guard lock(mutex_); remoteProxy_ = remoteObject; } diff --git a/window_scene/session/container/include/zidl/session_stage_interface.h b/window_scene/session/container/include/zidl/session_stage_interface.h index a8efdc6a2ba6845a552ba663d44c378860c39e33..764f1211bc5eefc060cab970be447238b9120afd 100644 --- a/window_scene/session/container/include/zidl/session_stage_interface.h +++ b/window_scene/session/container/include/zidl/session_stage_interface.h @@ -69,6 +69,10 @@ public: { return WSError::WS_OK; }; + virtual WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option) + { + return WSError::WS_OK; + } virtual WSError HandleBackEvent() = 0; virtual WSError MarkProcessed(int32_t eventId) = 0; diff --git a/window_scene/session/container/include/zidl/session_stage_proxy.h b/window_scene/session/container/include/zidl/session_stage_proxy.h index 376016f8352634c8fd1019f3401b1bc7b06ff8eb..aec362520712bfebae85061d456aa374088c2e14 100644 --- a/window_scene/session/container/include/zidl/session_stage_proxy.h +++ b/window_scene/session/container/include/zidl/session_stage_proxy.h @@ -76,7 +76,7 @@ public: // UIExtension WSError NotifyDumpInfo(const std::vector& params, std::vector& info) override; - WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option); + WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option) override; WSError SetSplitButtonVisible(bool isVisible) override; WSError SetEnableDragBySystem(bool dragEnable) override; diff --git a/window_scene/session/container/include/zidl/session_stage_stub.h b/window_scene/session/container/include/zidl/session_stage_stub.h index 9d5ceae972c458a8192af27675f0a102caacdfaa..c9a0d55d589794c5c97b13e600733249bd9f8193 100644 --- a/window_scene/session/container/include/zidl/session_stage_stub.h +++ b/window_scene/session/container/include/zidl/session_stage_stub.h @@ -74,7 +74,7 @@ private: int HandleSetUniqueVirtualPixelRatio(MessageParcel& data, MessageParcel& reply); int HandleNotifySessionFullScreen(MessageParcel& data, MessageParcel& reply); int HandleNotifyDumpInfo(MessageParcel& data, MessageParcel& reply); - int HandleExtensionHostData(MessageParcel& data, MessageParcel& reply); + int HandleExtensionHostData(MessageParcel& data, MessageParcel& reply, MessageOption& option); virtual void NotifyExtensionDataConsumer(MessageParcel& data, MessageParcel& reply) {} int HandleSetSplitButtonVisible(MessageParcel& data, MessageParcel& reply); int HandleSetEnableDragBySystem(MessageParcel& data, MessageParcel& reply); diff --git a/window_scene/session/container/src/zidl/session_stage_stub.cpp b/window_scene/session/container/src/zidl/session_stage_stub.cpp index 0874636c9ce5171450cd13ec2a9531514567f350..1cb64e517890a74d5f0c196874099d5fc93afe77 100644 --- a/window_scene/session/container/src/zidl/session_stage_stub.cpp +++ b/window_scene/session/container/src/zidl/session_stage_stub.cpp @@ -185,7 +185,7 @@ int SessionStageStub::OnRemoteRequest(uint32_t code, MessageParcel& data, Messag case static_cast(SessionStageInterfaceCode::TRANS_ID_SET_SUPPORT_ENTER_WATERFALL_MODE): return HandleSetSupportEnterWaterfallMode(data, reply); case static_cast(SessionStageInterfaceCode::TRANS_ID_SEND_EXTENSION_DATA): - return HandleExtensionHostData(data, reply); + return HandleExtensionHostData(data, reply, option); case static_cast(SessionStageInterfaceCode::TRANS_ID_SEND_CONTAINER_MODAL_EVENT): return HandleSendContainerModalEvent(data, reply); default: @@ -708,10 +708,10 @@ int SessionStageStub::HandleNotifyDumpInfo(MessageParcel& data, MessageParcel& r return ERR_NONE; } -int SessionStageStub::HandleExtensionHostData(MessageParcel& data, MessageParcel& reply) +int SessionStageStub::HandleExtensionHostData(MessageParcel& data, MessageParcel& reply, MessageOption& option) { TLOGD(WmsLogTag::WMS_UIEXT, "in"); - NotifyExtensionDataConsumer(data, reply); + static_cast(SendExtensionData(data, reply, option)); return ERR_NONE; } diff --git a/window_scene/session/host/include/extension_session.h b/window_scene/session/host/include/extension_session.h index 1250dab2b3996c9ee3b035b453ba89b69623cf74..98b73019a0cf1bbc58d193eac961d8f508fafad3 100644 --- a/window_scene/session/host/include/extension_session.h +++ b/window_scene/session/host/include/extension_session.h @@ -120,7 +120,7 @@ public: WSError Background(bool isFromClient = false, const std::string& identityToken = "") override; void NotifyExtensionEventAsync(uint32_t notifyEvent) override; WSError NotifyDumpInfo(const std::vector& params, std::vector& info); - void NotifyExtensionDataConsumer(MessageParcel& data, MessageParcel& reply) override; + WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option) override; private: sptr extSessionEventCallback_ = nullptr; diff --git a/window_scene/session/host/include/ui_extension/host_data_handler.h b/window_scene/session/host/include/ui_extension/host_data_handler.h index 48a69e27b0d0df23929dbe103947a1e03ce1ccd6..fbef89a89b08f238d001a641ce182f1fbbe6d585 100644 --- a/window_scene/session/host/include/ui_extension/host_data_handler.h +++ b/window_scene/session/host/include/ui_extension/host_data_handler.h @@ -25,7 +25,7 @@ public: DataHandlerErr SendData(const AAFwk::Want& toSend, AAFwk::Want& reply, const DataTransferConfig& config) override; private: - sptr GetRemoteProxy(); + sptr GetRemoteProxy(); bool WriteInterfaceToken(MessageParcel& data) override; }; } // namespace OHOS::Rosen::Extension diff --git a/window_scene/session/host/include/zidl/session_interface.h b/window_scene/session/host/include/zidl/session_interface.h index 4e3453bc5bca4e43d9c6a8e36d1fd2550eaab109..c02d80ccd1c5b3f95985bae7ab1bf35eb2334117 100644 --- a/window_scene/session/host/include/zidl/session_interface.h +++ b/window_scene/session/host/include/zidl/session_interface.h @@ -208,6 +208,10 @@ public: virtual void NotifyTransferAccessibilityEvent(const Accessibility::AccessibilityEventInfo& info, int64_t uiExtensionIdLevel) {} virtual void NotifyExtensionEventAsync(uint32_t notifyEvent) {} + virtual WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option) + { + return WSError::WS_OK; + } /** * @brief Close pip window while stopPip is called. diff --git a/window_scene/session/host/include/zidl/session_proxy.h b/window_scene/session/host/include/zidl/session_proxy.h index 0f60ea9e39a8bf8dd1174fd2d194cb97df619d99..465fa3f5f09edf0af4c84c21e83f32715dfe910a 100644 --- a/window_scene/session/host/include/zidl/session_proxy.h +++ b/window_scene/session/host/include/zidl/session_proxy.h @@ -89,7 +89,7 @@ public: void NotifyExtensionTimeout(int32_t errorCode) override; void TriggerBindModalUIExtension() override; void NotifyExtensionEventAsync(uint32_t notifyEvent) override; - WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option); + WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option) override; void NotifyPiPWindowPrepareClose() override; WSError UpdatePiPRect(const Rect& rect, SizeChangeReason reason) override; diff --git a/window_scene/session/host/include/zidl/session_stub.h b/window_scene/session/host/include/zidl/session_stub.h index d657336cd98ce15846e901536afedfc351a94482..f74036482900c1991db06d0ef2766c21182bcc07 100644 --- a/window_scene/session/host/include/zidl/session_stub.h +++ b/window_scene/session/host/include/zidl/session_stub.h @@ -101,8 +101,7 @@ private: int HandleTransferAccessibilityEvent(MessageParcel& data, MessageParcel& reply); int HandleNotifyExtensionEventAsync(MessageParcel& data, MessageParcel& reply); int HandleNotifyExtensionDetachToDisplay(MessageParcel& data, MessageParcel& reply); - int HandleExtensionProviderData(MessageParcel& data, MessageParcel& reply); - virtual void NotifyExtensionDataConsumer(MessageParcel& data, MessageParcel& reply) {} + int HandleExtensionProviderData(MessageParcel& data, MessageParcel& reply, MessageOption& option); // PictureInPicture int HandleNotifyPiPWindowPrepareClose(MessageParcel& data, MessageParcel& reply); diff --git a/window_scene/session/host/src/extension_session.cpp b/window_scene/session/host/src/extension_session.cpp index fc3a71407a37ae8a8094f96e468972b2bf56f35a..310f7121fe80c290a39e9c0e7632a9a7cdfb020d 100644 --- a/window_scene/session/host/src/extension_session.cpp +++ b/window_scene/session/host/src/extension_session.cpp @@ -544,8 +544,11 @@ int32_t ExtensionSession::GetStatusBarHeight() return 0; } -void ExtensionSession::NotifyExtensionDataConsumer(MessageParcel& data, MessageParcel& reply) +WSError ExtensionSession::SendExtensionData(MessageParcel& data, MessageParcel& reply, + [[maybe_unused]] MessageOption& option) { + TLOGI(WmsLogTag::WMS_UIEXT, "persistentId=%{public}d", GetPersistentId()); dataHandler_->NotifyDataConsumer(data, reply); + return WSError::WS_OK; } } // namespace OHOS::Rosen diff --git a/window_scene/session/host/src/ui_extension/host_data_handler.cpp b/window_scene/session/host/src/ui_extension/host_data_handler.cpp index 07e1ceda1038a291ccb7a22c5cfaefd88faa933a..a0fc904f0744e8edc1c43aed94b1b07807b4a7e5 100644 --- a/window_scene/session/host/src/ui_extension/host_data_handler.cpp +++ b/window_scene/session/host/src/ui_extension/host_data_handler.cpp @@ -18,13 +18,13 @@ #include "window_manager_hilog.h" namespace OHOS::Rosen::Extension { -sptr HostDataHandler::GetRemoteProxy() +sptr HostDataHandler::GetRemoteProxy() { std::lock_guard lock(mutex_); if (remoteProxy_ == nullptr) { return nullptr; } - return iface_cast(remoteProxy_); + return iface_cast(remoteProxy_); } DataHandlerErr HostDataHandler::SendData(const AAFwk::Want& toSend, AAFwk::Want& reply, diff --git a/window_scene/session/host/src/zidl/session_stub.cpp b/window_scene/session/host/src/zidl/session_stub.cpp index 16a5bc252761282d40781f3422720bc0d3378ea1..6407918e410580685e489ee789a4b6b38eb68ba8 100644 --- a/window_scene/session/host/src/zidl/session_stub.cpp +++ b/window_scene/session/host/src/zidl/session_stub.cpp @@ -233,7 +233,7 @@ int SessionStub::ProcessRemoteRequest(uint32_t code, MessageParcel& data, Messag case static_cast(SessionInterfaceCode::TRANS_ID_SET_SUPPORT_WINDOW_MODES): return HandleSetSupportedWindowModes(data, reply); case static_cast(SessionInterfaceCode::TRANS_ID_SEND_EXTENSION_DATA): - return HandleExtensionProviderData(data, reply); + return HandleExtensionProviderData(data, reply, option); case static_cast(SessionInterfaceCode::TRANS_ID_SET_SESSION_LABEL_AND_ICON): return HandleSetSessionLabelAndIcon(data, reply); default: @@ -1305,10 +1305,10 @@ int SessionStub::HandleNotifyExtensionDetachToDisplay(MessageParcel& data, Messa return ERR_NONE; } -int SessionStub::HandleExtensionProviderData(MessageParcel& data, MessageParcel& reply) +int SessionStub::HandleExtensionProviderData(MessageParcel& data, MessageParcel& reply, MessageOption& option) { TLOGD(WmsLogTag::WMS_UIEXT, "in"); - NotifyExtensionDataConsumer(data, reply); + static_cast(SendExtensionData(data, reply, option)); return ERR_NONE; } diff --git a/wm/include/window_extension_session_impl.h b/wm/include/window_extension_session_impl.h index cc2533f6d0cf5268b56499653cfcd04792e06d8f..c3df463b28430a4a7b2cf516ac44f2a26f3d8078 100644 --- a/wm/include/window_extension_session_impl.h +++ b/wm/include/window_extension_session_impl.h @@ -51,7 +51,7 @@ public: const NotifyTransferComponentDataForResultFunc& func) override; void TriggerBindModalUIExtension() override; std::shared_ptr GetExtensionDataHandler() const override; - void NotifyExtensionDataConsumer(MessageParcel& data, MessageParcel& reply) override; + WSError SendExtensionData(MessageParcel& data, MessageParcel& reply, MessageOption& option) override; WindowMode GetWindowMode() const override; WMError SetWindowMode(WindowMode mode) override; diff --git a/wm/src/window_extension_session_impl.cpp b/wm/src/window_extension_session_impl.cpp index 35f14705fabfc03f5689f95a69fe04ecdd0ef7e7..36f53c70273819938786984b39a402be11f18851 100644 --- a/wm/src/window_extension_session_impl.cpp +++ b/wm/src/window_extension_session_impl.cpp @@ -1354,10 +1354,12 @@ bool WindowExtensionSessionImpl::IsPcOrPadFreeMultiWindowMode() const return isPcOrPadFreeMultiWindowMode; } -void WindowExtensionSessionImpl::NotifyExtensionDataConsumer(MessageParcel& data, MessageParcel& reply) +WSError WindowExtensionSessionImpl::SendExtensionData(MessageParcel& data, MessageParcel& reply, + [[maybe_unused]] MessageOption& option) { TLOGI(WmsLogTag::WMS_UIEXT, "persistentId=%{public}d", GetPersistentId()); dataHandler_->NotifyDataConsumer(data, reply); + return WSError::WS_OK; } WindowMode WindowExtensionSessionImpl::GetWindowMode() const diff --git a/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp b/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp index 811bdbf5478f152d52708cec654ec5a92f264a72..71c86ddec7829b97fae2280bbc7ca27cd939101d 100644 --- a/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp +++ b/wm/test/unittest/ui_extension/window_extension_session_impl_test.cpp @@ -2229,10 +2229,11 @@ HWTEST_F(WindowExtensionSessionImplTest, NotifyExtensionDataConsumer01, Function AAFwk::Want want; want.SetParam(Extension::WINDOW_MODE_FIELD, static_cast(WindowMode::WINDOW_MODE_FLOATING)); ASSERT_TRUE(data.WriteParcelable(&want)); - - // Call NotifyExtensionDataConsumer - window_->NotifyExtensionDataConsumer(data, reply); - + + // Send data + MessageOption option; + window_->SendExtensionData(data, reply, option); + // Verify reply contains success code uint32_t replyCode; ASSERT_TRUE(reply.ReadUint32(replyCode));