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 a1ca2fdd16478b2f1ab530d4d261b3ddde45f27f..4a306f2833a686e3c1c11bc517c2f6fccd94616a 100644 --- a/window_scene/session/container/include/zidl/session_stage_interface.h +++ b/window_scene/session/container/include/zidl/session_stage_interface.h @@ -110,6 +110,7 @@ public: virtual WSError UpdateTitleInTargetPos(bool isShow, int32_t height) = 0; virtual void NotifyTransformChange(const Transform& transform) = 0; virtual WSError SetPipActionEvent(const std::string& action, int32_t status) = 0; + virtual WSError UpdateDisplayId(uint64_t displayId) = 0; }; } // namespace OHOS::Rosen #endif // OHOS_WINDOW_SCENE_SESSION_STAGE_INTERFACE_H diff --git a/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h b/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h index 765ee0531fa69ea6e9f51c250397e4dd7aa3a552..5bf2f72710cf8173acd4c576fcffa156121f8d7a 100644 --- a/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h +++ b/window_scene/session/container/include/zidl/session_stage_ipc_interface_code.h @@ -46,6 +46,7 @@ enum class SessionStageInterfaceCode { TRANS_ID_NOTIFY_TRANSFORM_CHANGE, TRANS_ID_NOTIFY_DIALOG_STATE_CHANGE, TRANS_ID_SET_PIP_ACTION_EVENT, + TRANS_ID_NOTIFY_DISPLAYID_CHANGE, }; } // namespace Rosen } // namespace OHOS 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 7901a8ba468c98c3628c12f07026ef14622057e4..3efe0d072efbe6c6a7bcf649fa6116a3118c9ebc 100644 --- a/window_scene/session/container/include/zidl/session_stage_proxy.h +++ b/window_scene/session/container/include/zidl/session_stage_proxy.h @@ -56,6 +56,7 @@ public: void NotifyTransformChange(const Transform& transform) override; WSError NotifyDialogStateChange(bool isForeground) override; WSError SetPipActionEvent(const std::string& action, int32_t status) override; + WSError UpdateDisplayId(uint64_t displayId) override; private: static inline BrokerDelegator delegator_; 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 66d0abe0020173d128bee9230d27f17307a813d4..75a51ac92fb3ad2e8213e6005cbe5ddfaa9d8220 100644 --- a/window_scene/session/container/include/zidl/session_stage_stub.h +++ b/window_scene/session/container/include/zidl/session_stage_stub.h @@ -61,6 +61,7 @@ private: int HandleNotifyTransformChange(MessageParcel& data, MessageParcel& reply); int HandleNotifyDialogStateChange(MessageParcel& data, MessageParcel& reply); int HandleSetPipActionEvent(MessageParcel& data, MessageParcel& reply); + int HandleUpdateDisplayId(MessageParcel& data, MessageParcel& reply); }; } // namespace OHOS::Rosen #endif // OHOS_WINDOW_SCENE_SESSION_STAGE_STUB_H diff --git a/window_scene/session/container/src/zidl/session_stage_proxy.cpp b/window_scene/session/container/src/zidl/session_stage_proxy.cpp index 559e0307722efeaadbcbc60f6803c8ee6b37fc10..0dbeffa261e7d1cd235727f075dfaedfa056994c 100644 --- a/window_scene/session/container/src/zidl/session_stage_proxy.cpp +++ b/window_scene/session/container/src/zidl/session_stage_proxy.cpp @@ -53,6 +53,30 @@ WSError SessionStageProxy::SetActive(bool active) return static_cast(ret); } +WSError SessionStageProxy::UpdateDisplayId(uint64_t displayId) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option(MessageOption::TF_ASYNC); + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("WriteInterfaceToken failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + + if (!data.WriteUint64(displayId)) { + WLOGFE("Write displayId failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + + if (Remote()->SendRequest(static_cast(SessionStageInterfaceCode::TRANS_ID_NOTIFY_DISPLAYID_CHANGE), + data, reply, option) != ERR_NONE) { + WLOGFE("SendRequest failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + int32_t ret = reply.ReadInt32(); + return static_cast(ret); +} + WSError SessionStageProxy::UpdateRect(const WSRect& rect, SizeChangeReason reason, const std::shared_ptr& rsTransaction) { 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 116850969eda739a2281631657bc88232392f6e9..fd0f51c0e4fbada276def7feb484f60fb1a6cc65 100644 --- a/window_scene/session/container/src/zidl/session_stage_stub.cpp +++ b/window_scene/session/container/src/zidl/session_stage_stub.cpp @@ -75,6 +75,8 @@ const std::map SessionStageStub::stubFuncMap_{ &SessionStageStub::HandleNotifyDialogStateChange), std::make_pair(static_cast(SessionStageInterfaceCode::TRANS_ID_SET_PIP_ACTION_EVENT), &SessionStageStub::HandleSetPipActionEvent), + std::make_pair(static_cast(SessionStageInterfaceCode::TRANS_ID_NOTIFY_DISPLAYID_CHANGE), + &SessionStageStub::HandleUpdateDisplayId), }; int SessionStageStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) @@ -345,4 +347,13 @@ int SessionStageStub::HandleSetPipActionEvent(MessageParcel& data, MessageParcel SetPipActionEvent(action, status); return ERR_NONE; } + +int SessionStageStub::HandleUpdateDisplayId(MessageParcel& data, MessageParcel& reply) +{ + WLOGD("UpdateDisplayId!"); + uint64_t displayId = data.ReadUint64(); + WSError errCode = UpdateDisplayId(displayId); + reply.WriteInt32(static_cast(errCode)); + return ERR_NONE; +} } // namespace OHOS::Rosen diff --git a/window_scene/session/host/src/session.cpp b/window_scene/session/host/src/session.cpp index 2fef2b7f4c042ecab0442f79654c71e833613141..037513d16891e42d761d1e2042f0401f4f761e78 100644 --- a/window_scene/session/host/src/session.cpp +++ b/window_scene/session/host/src/session.cpp @@ -223,6 +223,9 @@ void Session::SetSessionInfo(const SessionInfo& info) void Session::SetScreenId(uint64_t screenId) { sessionInfo_.screenId_ = screenId; + if (sessionStage_) { + sessionStage_->UpdateDisplayId(screenId); + } } const SessionInfo& Session::GetSessionInfo() const diff --git a/window_scene/session/host/src/zidl/session_proxy.cpp b/window_scene/session/host/src/zidl/session_proxy.cpp index 11e67fdf462e5e593eeb4c095fb40f516b635fdd..2555b4e826a7be015d9b3032dfd1b39a4e5a7129 100644 --- a/window_scene/session/host/src/zidl/session_proxy.cpp +++ b/window_scene/session/host/src/zidl/session_proxy.cpp @@ -208,6 +208,7 @@ WSError SessionProxy::Connect(const sptr& sessionStage, const spt } if (property) { property->SetPersistentId(reply.ReadInt32()); + property->SetDisplayId(reply.ReadUint64()); bool needUpdate = reply.ReadBool(); property->SetIsNeedUpdateWindowMode(needUpdate); if (needUpdate) { diff --git a/window_scene/session/host/src/zidl/session_stub.cpp b/window_scene/session/host/src/zidl/session_stub.cpp index c82e990f776542c5747598c6fe71d1c3754a25cd..6c03add94df2d30aae26bef3fed5529ea7a5ced6 100644 --- a/window_scene/session/host/src/zidl/session_stub.cpp +++ b/window_scene/session/host/src/zidl/session_stub.cpp @@ -230,6 +230,7 @@ int SessionStub::HandleConnect(MessageParcel& data, MessageParcel& reply) reply.WriteParcelable(&systemConfig); if (property) { reply.WriteInt32(property->GetPersistentId()); + reply.WriteUint64(property->GetDisplayId()); bool needUpdate = property->GetIsNeedUpdateWindowMode(); reply.WriteBool(needUpdate); if (needUpdate) { diff --git a/window_scene/test/mock/mock_session_stage.h b/window_scene/test/mock/mock_session_stage.h index ca37618a89cc69d7e6256300484e151dbe15f0d3..e5abb9b77d887576f583f1e2fb6370ce0045905e 100644 --- a/window_scene/test/mock/mock_session_stage.h +++ b/window_scene/test/mock/mock_session_stage.h @@ -51,6 +51,7 @@ public: MOCK_METHOD1(NotifyWindowVisibility, WSError(bool isVisible)); MOCK_METHOD1(NotifyTransformChange, void(const Transform& transform)); MOCK_METHOD2(SetPipActionEvent, WSError(const std::string& action, int32_t status)); + MOCK_METHOD1(UpdateDisplayId, WSError(uint64_t displayId)); }; } // namespace Rosen } // namespace OHOS diff --git a/wm/include/window_session_impl.h b/wm/include/window_session_impl.h index 175fe07901a5d90c7bbc1bde9171af99bfd65c67..76f9456a31ce25b7e9d5da7607f226587fe90d77 100644 --- a/wm/include/window_session_impl.h +++ b/wm/include/window_session_impl.h @@ -101,6 +101,7 @@ public: WSError UpdateRect(const WSRect& rect, SizeChangeReason reason, const std::shared_ptr& rsTransaction = nullptr) override; void UpdateDensity() override; + WSError UpdateDisplayId(uint64_t displayId) override; WSError UpdateFocus(bool focus) override; bool IsFocused() const override; WMError RequestFocus() const override; diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index ce9bc52ec31d9aff328998304ac53bc40d8219a4..f533e4421baa9879a5f23831a68360b0a64f5fdc 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -532,6 +532,12 @@ void WindowSessionImpl::UpdateDensity() preRect.posX_, preRect.posY_, preRect.width_, preRect.height_); } +WSError WindowSessionImpl::UpdateDisplayId(uint64_t displayId) +{ + property_->SetDisplayId(displayId); + return WSError::WS_OK; +} + WSError WindowSessionImpl::UpdateFocus(bool isFocused) { TLOGI(WmsLogTag::WMS_FOCUS, "Report update focus: %{public}u, id: %{public}d", isFocused, GetPersistentId()); diff --git a/wm/test/unittest/window_session_impl_test.cpp b/wm/test/unittest/window_session_impl_test.cpp index 67815c4965be19bbf003bc26e6cea0a1bcd05e28..cabf868417ab6cc99ad69485d51ed3c81038a7f9 100644 --- a/wm/test/unittest/window_session_impl_test.cpp +++ b/wm/test/unittest/window_session_impl_test.cpp @@ -1433,6 +1433,27 @@ HWTEST_F(WindowSessionImplTest, UpdateDensity, Function | SmallTest | Level2) GTEST_LOG_(INFO) << "WindowSessionImplTest: UpdateDensitytest01 end"; } +/** + * @tc.name: UpdateDisplayIdtest01 + * @tc.desc: UpdateDisplayId + * @tc.type: FUNC + */ +HWTEST_F(WindowSessionImplTest, UpdateDisplayId, Function | SmallTest | Level2) +{ + GTEST_LOG_(INFO) << "WindowSessionImplTest: UpdateDisplayIdtest01 start"; + sptr option = new WindowOption(); + ASSERT_NE(option, nullptr); + option->SetWindowName("UpdateDisplayId"); + sptr window = new (std::nothrow) WindowSessionImpl(option); + ASSERT_NE(window, nullptr); + uint64_t newDisplayId = 2; + auto ret = window->UpdateDisplayId(newDisplayId); + ASSERT_EQ(ret, WSError::WS_OK); + uint64_t displayId = window->property_->GetDisplayId(); + ASSERT_EQ(newDisplayId, displayId); + GTEST_LOG_(INFO) << "WindowSessionImplTest: UpdateDisplayIdtest01 end"; +} + /** * @tc.name: IsFloatingWindowAppTypetest01 * @tc.desc: IsFloatingWindowAppType