!12372 Description:新增makemirrorforrecord

Merge pull request !12372 from zhangyao/112233
This commit is contained in:
openharmony_ci 2025-01-26 16:42:12 +00:00 committed by Gitee
commit 9ac7707c46
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
13 changed files with 145 additions and 2 deletions

View File

@ -128,6 +128,8 @@ public:
virtual sptr<ScreenGroupInfo> GetScreenGroupInfoById(ScreenId screenId);
virtual DMError GetAllScreenInfos(std::vector<sptr<ScreenInfo>>& screenInfos);
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId);
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
ScreenId& screenGroupId);
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, DMRect mainScreenRegion,
ScreenId& screenGroupId);
virtual DMError SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,

View File

@ -500,6 +500,14 @@ DMError ScreenManagerAdapter::MakeMirror(ScreenId mainScreenId, std::vector<Scre
return displayManagerServiceProxy_->MakeMirror(mainScreenId, mirrorScreenId, screenGroupId);
}
DMError ScreenManagerAdapter::MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
ScreenId& screenGroupId)
{
INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
return displayManagerServiceProxy_->MakeMirrorForRecord(mainScreenId, mirrorScreenId, screenGroupId);
}
DMError ScreenManagerAdapter::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
DMRect mainScreenRegion, ScreenId& screenGroupId)
{

View File

@ -500,6 +500,22 @@ DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> m
return ret;
}
DMError ScreenManager::MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
ScreenId& screenGroupId)
{
WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId);
if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
WLOGFW("Make Mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE);
return DMError::DM_ERROR_INVALID_PARAM;
}
DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirrorForRecord(mainScreenId, mirrorScreenId,
screenGroupId);
if (screenGroupId == SCREEN_ID_INVALID) {
WLOGFE("create mirror failed");
}
return ret;
}
DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, DMRect mainScreenRegion,
ScreenId& screenGroupId)
{

View File

@ -142,6 +142,11 @@ public:
virtual DMError GetAllScreenInfos(std::vector<sptr<ScreenInfo>>& screenInfos) = 0;
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
ScreenId& screenGroupId) = 0;
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
ScreenId& screenGroupId)
{
return DMError::DM_ERROR_DEVICE_NOT_SUPPORT;
}
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
DMRect mainScreenRegion, ScreenId& screenGroupId)
{

View File

@ -58,6 +58,7 @@ enum class DisplayManagerMessage : unsigned int {
TRANS_ID_SET_SCREEN_PRIVACY_MASKIMAGE,
TRANS_ID_SCREENGROUP_BASE = 1100,
TRANS_ID_SCREEN_MAKE_MIRROR = TRANS_ID_SCREENGROUP_BASE,
TRANS_ID_SCREEN_MAKE_MIRROR_FOR_RECORD,
TRANS_ID_SCREEN_MAKE_MIRROR_WITH_REGION,
TRANS_ID_MULTI_SCREEN_MODE_SWITCH,
TRANS_ID_SET_MULTI_SCREEN_POSITION,

View File

@ -113,6 +113,17 @@ public:
*/
DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId);
/**
* @brief Make screens as mirror-screen
*
* @param mainScreenId Main screen id.
* @param mirrorScreenId Mirror screen ids.
* @param screenGroupId Screen group id.
* @return DM_OK means make mirror success, others means make mirror failed.
*/
DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
ScreenId& screenGroupId);
/**
* @brief Make screen as mirror-screen for region of main screen.
*

View File

@ -29,6 +29,7 @@ public:
bool IsFakeDisplayExist();
bool IsNeedSetSnapshotRect(DisplayId displayId);
Drawing::Rect GetSnapshotRect(DisplayId displayId);
DMRect GetRecordRect(DisplayId displayId);
};
}
#endif // OHOS_ROSEN_WINDOW_SUPER_FOLD_POLICY_H
#endif // OHOS_ROSEN_WINDOW_SUPER_FOLD_POLICY_H

View File

@ -114,6 +114,8 @@ public:
DMError ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height) override;
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
ScreenId& screenGroupId) override;
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
ScreenId& screenGroupId) override;
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
DMRect mainScreenRegion, ScreenId& screenGroupId) override;
virtual DMError SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,

View File

@ -89,6 +89,8 @@ public:
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
ScreenId& screenGroupId) override;
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
ScreenId& screenGroupId) override;
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
DMRect mainScreenRegion, ScreenId& screenGroupId) override;
virtual DMError SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,

View File

@ -58,4 +58,32 @@ Drawing::Rect SuperFoldPolicy::GetSnapshotRect(DisplayId displayId)
TLOGW(WmsLogTag::DMS, "%{public}s", oss.str().c_str());
return snapshotRect;
}
} // namespace OHOS::Rosen
DMRect SuperFoldPolicy::GetRecordRect(DisplayId displayId)
{
auto defaultInfo = ScreenSessionManager::GetInstance().GetDisplayInfoById(DEFAULT_DISPLAY_ID);
auto fakeInfo = ScreenSessionManager::GetInstance().GetDisplayInfoById(DISPLAY_ID_FAKE);
DMRect recordRect = {0, 0, 0, 0};
if (defaultInfo == nullptr) {
return recordRect;
}
if (displayId == DISPLAY_ID_FAKE) {
if (fakeInfo != nullptr) {
recordRect = {0, defaultInfo->GetHeight(), defaultInfo->GetWidth(),
fakeInfo->GetHeight()};
}
} else {
recordRect = {0, 0, defaultInfo->GetWidth(), defaultInfo->GetHeight()};
}
std::ostringstream oss;
oss << "snapshot displayId: " << static_cast<uint32_t>(displayId)
<< " left: 0"
<< " top:" << recordRect.posY_
<< " right:" << recordRect.width_
<< " bottom:" << recordRect.height_;
TLOGW(WmsLogTag::DMS, "%{public}s", oss.str().c_str());
return recordRect;
}
} // namespace OHOS::Rosen

View File

@ -3937,6 +3937,27 @@ DMError ScreenSessionManager::MakeMirror(ScreenId mainScreenId, std::vector<Scre
return DoMakeMirror(mainScreenId, mirrorScreenIds, DMRect::NONE(), screenGroupId);
}
DMError ScreenSessionManager::MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
ScreenId& screenGroupId)
{
TLOGW(WmsLogTag::DMS, "start");
ScreenId realScreenId = mainScreenId;
if (FoldScreenStateInternel::IsSuperFoldDisplayDevice() && mainScreenId == DISPLAY_ID_FAKE) {
if (!SuperFoldPolicy::GetInstance().IsFakeDisplayExist()) {
TLOGE(WmsLogTag::DMS, "fake display is not exist!");
return DMError::DM_ERROR_INVALID_PARAM;
}
realScreenId = 0;
}
if (FoldScreenStateInternel::IsSuperFoldDisplayDevice() &&
SuperFoldPolicy::GetInstance().IsNeedSetSnapshotRect(mainScreenId)) {
DMRect mainScreenRect = SuperFoldPolicy::GetInstance().GetRecordRect(mainScreenId);
return DoMakeMirror(realScreenId, mirrorScreenIds, mainScreenRect, screenGroupId);
}
return DoMakeMirror(mainScreenId, mirrorScreenIds, DMRect::NONE(), screenGroupId);
}
DMError ScreenSessionManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
DMRect mainScreenRegion, ScreenId& screenGroupId)
{

View File

@ -1335,6 +1335,39 @@ DMError ScreenSessionManagerProxy::MakeMirror(ScreenId mainScreenId,
return ret;
}
DMError ScreenSessionManagerProxy::MakeMirrorForRecord(ScreenId mainScreenId,
std::vector<ScreenId> mirrorScreenIds, ScreenId& screenGroupId)
{
WLOGFW("SCB: ScreenSessionManagerProxy::MakeMirror: ENTER");
sptr<IRemoteObject> remote = Remote();
if (remote == nullptr) {
WLOGFW("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: remote is null");
return DMError::DM_ERROR_NULLPTR;
}
MessageParcel data;
MessageParcel reply;
MessageOption option;
if (!data.WriteInterfaceToken(GetDescriptor())) {
WLOGFE("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: WriteInterfaceToken failed");
return DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED;
}
bool res = data.WriteUint64(static_cast<uint64_t>(mainScreenId)) &&
data.WriteUInt64Vector(mirrorScreenIds);
if (!res) {
WLOGFE("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: data write failed");
return DMError::DM_ERROR_IPC_FAILED;
}
if (remote->SendRequest(static_cast<uint32_t>(DisplayManagerMessage::TRANS_ID_SCREEN_MAKE_MIRROR_FOR_RECORD),
data, reply, option) != ERR_NONE) {
WLOGFW("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: SendRequest failed");
return DMError::DM_ERROR_IPC_FAILED;
}
DMError ret = static_cast<DMError>(reply.ReadInt32());
screenGroupId = static_cast<ScreenId>(reply.ReadUint64());
return ret;
}
DMError ScreenSessionManagerProxy::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
DMRect mainScreenRegion, ScreenId& screenGroupId)
{

View File

@ -287,6 +287,19 @@ int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel&
static_cast<void>(reply.WriteUint64(static_cast<uint64_t>(screenGroupId)));
break;
}
case DisplayManagerMessage::TRANS_ID_SCREEN_MAKE_MIRROR_FOR_RECORD: {
ScreenId mainScreenId = static_cast<ScreenId>(data.ReadUint64());
std::vector<ScreenId> mirrorScreenId;
if (!data.ReadUInt64Vector(&mirrorScreenId)) {
WLOGE("fail to receive mirror screen in stub. screen:%{public}" PRIu64"", mainScreenId);
break;
}
ScreenId screenGroupId = INVALID_SCREEN_ID;
DMError ret = MakeMirrorForRecord(mainScreenId, mirrorScreenId, screenGroupId);
static_cast<void>(reply.WriteInt32(static_cast<int32_t>(ret)));
static_cast<void>(reply.WriteUint64(static_cast<uint64_t>(screenGroupId)));
break;
}
case DisplayManagerMessage::TRANS_ID_SCREEN_MAKE_MIRROR_WITH_REGION: {
ScreenId mainScreenId = static_cast<ScreenId>(data.ReadUint64());
std::vector<ScreenId> mirrorScreenId;