c0e88a2f创建于 5月14日历史提交
/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "display_manager_ipc_service.h"
#include "scene_board_judgement.h"
#include "window_manager_hilog.h"

namespace OHOS::Rosen {
WM_IMPLEMENT_SINGLE_INSTANCE(DisplayManagerIpcService)
const bool REGISTER_RESULT = SceneBoardJudgement::IsSceneBoardEnabled() ? false :
    SystemAbility::MakeAndRegisterAbility(&DisplayManagerIpcService::GetInstance());

DisplayManagerIpcService::DisplayManagerIpcService() : SystemAbility(DISPLAY_MANAGER_SERVICE_SA_ID, true),
    displayManagerService_(DisplayManagerService::GetInstance())
{
}

void DisplayManagerIpcService::OnStart()
{
    TLOGI(WmsLogTag::DMS, "start");
    if (!displayManagerService_.Init()) {
        TLOGE(WmsLogTag::DMS, "Init failed");
        return;
    }
    if (!Publish(this)) {
        TLOGE(WmsLogTag::DMS, "Publish failed");
    }
    displayManagerService_.SetDisplayState(DisplayState::ON);
    TLOGI(WmsLogTag::DMS, "end");
}

void DisplayManagerIpcService::OnStop()
{
    TLOGI(WmsLogTag::DMS, "ready to stop display service.");
}

int DisplayManagerIpcService::Dump(int fd, const std::vector<std::u16string>& args)
{
    return displayManagerService_.Dump(fd, args);
}

ErrCode DisplayManagerIpcService::GetDefaultDisplayInfo(sptr<DisplayInfo>& displayInfo)
{
    displayInfo = displayManagerService_.GetDefaultDisplayInfo();
    if (displayInfo == nullptr) {
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetDisplayInfoById(uint64_t displayId, sptr<DisplayInfo>& displayInfo)
{
    displayInfo = displayManagerService_.GetDisplayInfoById(displayId);
    if (displayInfo == nullptr) {
        TLOGE(WmsLogTag::DMS, "GetDisplayInfoById failed, displayId: %{public}" PRIu64, displayId);
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetVisibleAreaDisplayInfoById(uint64_t displayId, sptr<DisplayInfo>& displayInfo)
{
    displayInfo = displayManagerService_.GetVisibleAreaDisplayInfoById(displayId);
    if (displayInfo == nullptr) {
        TLOGE(WmsLogTag::DMS, "GetVisibleAreaDisplayInfoById failed, displayId: %{public}" PRIu64, displayId);
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetDisplayInfoByScreen(uint64_t screenId, sptr<DisplayInfo>& displayInfo)
{
    displayInfo = displayManagerService_.GetDisplayInfoByScreen(screenId);
    if (displayInfo == nullptr) {
        TLOGE(WmsLogTag::DMS, "GetDisplayInfoByScreen failed, screenId: %{public}" PRIu64, screenId);
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::CreateVirtualScreen(const DmVirtualScreenOption& virtualOption,
    const sptr<IRemoteObject>& displayManagerAgent, uint64_t& screenId)
{
    screenId = displayManagerService_.CreateVirtualScreen(virtualOption.GetOption(), displayManagerAgent);
    return  ERR_OK;
}

ErrCode DisplayManagerIpcService::CreateVirtualScreen(const DmVirtualScreenOption& virtualOption,
    const sptr<IRemoteObject>& displayManagerAgent, uint64_t& screenId,
    const sptr<IBufferProducer>& surface)
{
    VirtualScreenOption option = virtualOption.GetOption();
    sptr<IBufferProducer> surfaceCopy = surface;
    option.surface_ = Surface::CreateSurfaceAsProducer(surfaceCopy);
    screenId = displayManagerService_.CreateVirtualScreen(option, displayManagerAgent);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::DestroyVirtualScreen(uint64_t screenId, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.DestroyVirtualScreen(screenId));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetVirtualScreenSurface(uint64_t screenId, const sptr<IBufferProducer>& surface,
    int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetVirtualScreenSurface(screenId, surface));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetOrientation(uint64_t screenId, uint32_t orientation, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetOrientation(screenId,
        static_cast<Orientation>(orientation)));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetDisplaySnapshot(uint64_t displayId, int32_t& errorCode, bool isUseDma,
    bool isCaptureFullOfScreen, std::shared_ptr<PixelMap>& pixelMap)
{
    DmErrorCode errorCodeOut = DmErrorCode::DM_OK;
    pixelMap = displayManagerService_.GetDisplaySnapshot(displayId, &errorCodeOut, isUseDma, isCaptureFullOfScreen);
    errorCode = static_cast<int32_t>(errorCodeOut);
    if (pixelMap == nullptr) {
        TLOGE(WmsLogTag::DMS, "GetDisplaySnapshot failed, displayId: %{public}" PRIu64 ", errorCode: %{public}d",
            displayId, errorCode);
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetScreenSupportedColorGamuts(uint64_t screenId, std::vector<uint32_t>& colorGamuts,
    int32_t& dmError)
{
    std::vector<ScreenColorGamut> colorGamutsOut;
    dmError = static_cast<int32_t>(displayManagerService_.GetScreenSupportedColorGamuts(screenId, colorGamutsOut));
    for (auto& colorGamut : colorGamutsOut) {
        colorGamuts.push_back(static_cast<uint32_t>(colorGamut));
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetScreenColorGamut(uint64_t screenId, uint32_t& colorGamut, int32_t& dmError)
{
    ScreenColorGamut colorGamutOut;
    dmError = static_cast<int32_t>(displayManagerService_.GetScreenColorGamut(screenId, colorGamutOut));
    colorGamut = static_cast<uint32_t>(colorGamutOut);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenColorGamut(uint64_t screenId, int32_t colorGamutIdx, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetScreenColorGamut(screenId, colorGamutIdx));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetScreenGamutMap(uint64_t screenId, uint32_t& gamutMap, int32_t& dmError)
{
    ScreenGamutMap gamutMapOut;
    dmError = static_cast<int32_t>(displayManagerService_.GetScreenGamutMap(screenId, gamutMapOut));
    gamutMap = static_cast<uint32_t>(gamutMapOut);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenGamutMap(uint64_t screenId, uint32_t gamutMap, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetScreenGamutMap(screenId,
        static_cast<ScreenGamutMap>(gamutMap)));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenColorTransform(uint64_t screenId)
{
    displayManagerService_.SetScreenColorTransform(screenId);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::RegisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
    uint32_t type, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.RegisterDisplayManagerAgent(displayManagerAgent,
        static_cast<DisplayManagerAgentType>(type)));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
    uint32_t type, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.UnregisterDisplayManagerAgent(displayManagerAgent,
        static_cast<DisplayManagerAgentType>(type)));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::WakeUpBegin(uint32_t reason, bool& isSucc)
{
    isSucc = displayManagerService_.WakeUpBegin(static_cast<PowerStateChangeReason>(reason));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::WakeUpEnd(bool& isSucc)
{
    isSucc = displayManagerService_.WakeUpEnd();
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SuspendBegin(uint32_t reason, bool& isSucc)
{
    isSucc = displayManagerService_.SuspendBegin(static_cast<PowerStateChangeReason>(reason));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SuspendEnd(bool& isSucc)
{
    isSucc = displayManagerService_.SuspendEnd();
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenPowerForAll(uint32_t screenPowerState, uint32_t reason, bool& isSucc)
{
    isSucc = displayManagerService_.SetScreenPowerForAll(static_cast<ScreenPowerState>(screenPowerState),
        static_cast<PowerStateChangeReason>(reason));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetSpecifiedScreenPower(uint64_t screenId, uint32_t screenPowerState, uint32_t
    reason, bool& isSucc)
{
    isSucc = displayManagerService_.SetSpecifiedScreenPower(screenId, static_cast<ScreenPowerState>(screenPowerState),
        static_cast<PowerStateChangeReason>(reason));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetScreenPower(uint64_t dmsScreenId, uint32_t& screenPowerState)
{
    screenPowerState = static_cast<uint32_t>(displayManagerService_.GetScreenPower(dmsScreenId));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetDisplayState(uint32_t displayState, bool& isSucc)
{
    isSucc = displayManagerService_.SetDisplayState(static_cast<DisplayState>(displayState));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetDisplayState(uint64_t displayId, uint32_t& displayState)
{
    displayState = static_cast<uint32_t>(displayManagerService_.GetDisplayState(displayId));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::TryToCancelScreenOff(bool& isSucc)
{
    isSucc = displayManagerService_.TryToCancelScreenOff();
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetAllDisplayIds(std::vector<uint64_t>& displayIds)
{
    displayIds = displayManagerService_.GetAllDisplayIds();
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetCutoutInfo(uint64_t displayId, sptr<CutoutInfo>& cutoutInfo)
{
    cutoutInfo = displayManagerService_.GetCutoutInfo(displayId);
    if (cutoutInfo == nullptr) {
        TLOGE(WmsLogTag::DMS, "GetCutoutInfo failed, displayId: %{public}" PRIu64, displayId);
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::AddSurfaceNodeToDisplay(uint64_t displayId,
    const std::shared_ptr<DmRsSurfaceNode>& dmRsSurfaceNode, int32_t& dmError)
{
    std::shared_ptr<RSSurfaceNode> surfaceNode = dmRsSurfaceNode->GetSurfaceNode();
    dmError = static_cast<int32_t>(displayManagerService_.AddSurfaceNodeToDisplay(displayId, surfaceNode, true));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::RemoveSurfaceNodeFromDisplay(uint64_t displayId,
    const std::shared_ptr<DmRsSurfaceNode>& dmRsSurfaceNode, int32_t& dmError)
{
    std::shared_ptr<RSSurfaceNode> surfaceNode = dmRsSurfaceNode->GetSurfaceNode();
    dmError = static_cast<int32_t>(displayManagerService_.RemoveSurfaceNodeFromDisplay(displayId, surfaceNode));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::HasPrivateWindow(uint64_t displayId, bool& hasPrivateWindow, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.HasPrivateWindow(displayId, hasPrivateWindow));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::NotifyDisplayEvent(uint32_t displayEvent)
{
    displayManagerService_.NotifyDisplayEvent(static_cast<DisplayEvent>(displayEvent));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetFreeze(const std::vector<uint64_t>& displayIds, bool isFreeze, bool& isSucc)
{
    isSucc = displayManagerService_.SetFreeze(displayIds, isFreeze);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::MakeMirror(uint64_t mainScreenId, const std::vector<uint64_t>& mirrorScreenId,
    uint64_t& screenGroupId, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.MakeMirror(mainScreenId, mirrorScreenId, screenGroupId));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::StopMirror(const std::vector<uint64_t>& mirrorScreenIds, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.StopMirror(mirrorScreenIds));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetScreenInfoById(uint64_t screenId, sptr<ScreenInfo>& screenInfo)
{
    screenInfo = displayManagerService_.GetScreenInfoById(screenId);
    if (screenInfo == nullptr) {
        TLOGE(WmsLogTag::DMS, "GetScreenInfoById failed, screenId: %{public}" PRIu64, screenId);
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetScreenGroupInfoById(uint64_t screenId, sptr<ScreenGroupInfo>& screenGroupInfo)
{
    screenGroupInfo = displayManagerService_.GetScreenGroupInfoById(screenId);
    if (screenGroupInfo == nullptr) {
        TLOGE(WmsLogTag::DMS, "GetScreenGroupInfoById failed, screenId: %{public}" PRIu64, screenId);
        return ERR_INVALID_DATA;
    }
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetAllScreenInfos(std::vector<sptr<ScreenInfo>>& screenInfos, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.GetAllScreenInfos(screenInfos));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::MakeExpand(const std::vector<uint64_t>& screenId,
    const std::vector<Point>& startPoint, uint64_t& screenGroupId, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.MakeExpand(screenId, startPoint, screenGroupId));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::StopExpand(const std::vector<uint64_t>& expandScreenIds, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.StopExpand(expandScreenIds));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::RemoveVirtualScreenFromGroup(const std::vector<uint64_t>& screens)
{
    displayManagerService_.RemoveVirtualScreenFromGroup(screens);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenActiveMode(uint64_t screenId, uint32_t modeId, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetScreenActiveMode(screenId, modeId));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetVirtualPixelRatio(uint64_t screenId, float virtualPixelRatio, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetVirtualPixelRatio(screenId, virtualPixelRatio));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetResolution(uint64_t screenId, uint32_t width, uint32_t height,
    float virtualPixelRatio, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetResolution(screenId, width, height, virtualPixelRatio));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetDensityInCurResolution(uint64_t screenId, float& virtualPixelRatio,
    int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.GetDensityInCurResolution(screenId, virtualPixelRatio));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::IsScreenRotationLocked(bool& isLocked, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.IsScreenRotationLocked(isLocked));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenRotationLocked(bool isLocked, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetScreenRotationLocked(isLocked));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenRotationLockedFromJs(bool isLocked, int32_t& dmError)
{
    dmError = static_cast<int32_t>(displayManagerService_.SetScreenRotationLockedFromJs(isLocked));
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetAllDisplayPhysicalResolution(
    std::vector<DisplayPhysicalResolution>& displayPhysicalResolutions)
{
    displayPhysicalResolutions = displayManagerService_.GetAllDisplayPhysicalResolution();
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetScreenBrightness(const DmsScreenBrightnessData& brightnessData, bool& isSucc)
{
    isSucc = displayManagerService_.SetScreenBrightness(brightnessData);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::GetScreenBrightness(uint64_t screenId, uint32_t& level)
{
    level = displayManagerService_.GetScreenBrightness(screenId);
    return ERR_OK;
}

ErrCode DisplayManagerIpcService::SetVirtualScreenAsDefault(uint64_t screenId, bool& isSucc)
{
    isSucc = displayManagerService_.SetVirtualScreenAsDefault(screenId);
    return ERR_OK;
}
} // namespace OHOS::Rosen