/*
 * Copyright (c) 2022 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 "window_transition_info.h"

namespace OHOS {
namespace Rosen {
WindowTransitionInfo::WindowTransitionInfo(sptr<AAFwk::AbilityTransitionInfo> info)
{
    bundleName_ = info->bundleName_;
    abilityName_ = info->abilityName_;
    mode_ = static_cast<WindowMode>(info->mode_);
    abilityToken_ = info->abilityToken_;
    displayId_ = info->displayId_;
    isShowWhenLocked_ = info->isShowWhenLocked_;
    isRecent_ = info->isRecent_;
    missionId_ = info->missionId_;
    if (info->windowModes_.empty()) {
        supportWindowModes_ = {
            AppExecFwk::SupportWindowMode::FULLSCREEN,
            AppExecFwk::SupportWindowMode::SPLIT,
            AppExecFwk::SupportWindowMode::FLOATING
        };
    } else {
        supportWindowModes_.assign(info->windowModes_.begin(), info->windowModes_.end());
    }

    sizeLimits_.maxRatio_ = static_cast<float>(info->maxWindowRatio_);
    sizeLimits_.minRatio_ = static_cast<float>(info->minWindowRatio_);
    sizeLimits_.maxWidth_ = info->maxWindowWidth_;
    sizeLimits_.minWidth_ = info->minWindowWidth_;
    sizeLimits_.maxHeight_ = info->maxWindowHeight_;
    sizeLimits_.minHeight_ = info->minWindowHeight_;
    reason_ = static_cast<TransitionReason>(info->reason_);
    orientation_ = info->orientation_;
    apiCompatibleVersion_ = info->apiCompatibleVersion_;
}

void WindowTransitionInfo::SetBundleName(std::string name)
{
    bundleName_ = name;
}

std::string WindowTransitionInfo::GetBundleName()
{
    return bundleName_;
}

void WindowTransitionInfo::SetAbilityName(std::string name)
{
    abilityName_ = name;
}

std::string WindowTransitionInfo::GetAbilityName()
{
    return abilityName_;
}

void WindowTransitionInfo::SetWindowMode(WindowMode mode)
{
    mode_ = mode;
}

WindowMode WindowTransitionInfo::GetWindowMode()
{
    return mode_;
}

void WindowTransitionInfo::SetWindowRect(Rect rect)
{
    windowRect_ = rect;
}

Rect WindowTransitionInfo::GetWindowRect()
{
    return windowRect_;
}

void WindowTransitionInfo::SetAbilityToken(sptr<IRemoteObject> abilityToken)
{
    abilityToken_ = abilityToken;
}

sptr<IRemoteObject> WindowTransitionInfo::GetAbilityToken()
{
    return abilityToken_;
}

void WindowTransitionInfo::SetDisplayId(DisplayId displayId)
{
    displayId_ = displayId;
}

DisplayId WindowTransitionInfo::GetDisplayId()
{
    return displayId_;
}

void WindowTransitionInfo::SetWindowType(WindowType windowType)
{
    windowType_ = windowType;
}

WindowType WindowTransitionInfo::GetWindowType()
{
    return windowType_;
}

void WindowTransitionInfo::SetShowFlagWhenLocked(bool isShow)
{
    isShowWhenLocked_ = isShow;
}

void WindowTransitionInfo::SetWindowSupportModes(const std::vector<AppExecFwk::SupportWindowMode> supportModes)
{
    supportWindowModes_.assign(supportModes.begin(), supportModes.end());
}

std::vector<AppExecFwk::SupportWindowMode> WindowTransitionInfo::GetWindowSupportModes()
{
    return supportWindowModes_;
}

WindowLimits WindowTransitionInfo::GetWindowSizeLimits() const
{
    return sizeLimits_;
}

bool WindowTransitionInfo::GetShowFlagWhenLocked()
{
    return isShowWhenLocked_;
}

void WindowTransitionInfo::SetTransitionReason(TransitionReason reason)
{
    reason_ = reason;
}

TransitionReason WindowTransitionInfo::GetTransitionReason()
{
    return reason_;
}

void WindowTransitionInfo::SetIsRecent(bool isRecent)
{
    isRecent_ = isRecent;
}

bool WindowTransitionInfo::GetIsRecent() const
{
    return isRecent_;
}

void WindowTransitionInfo::SetMissionId(int32_t missionId)
{
    missionId_ = missionId;
}

int32_t WindowTransitionInfo::GetMissionId() const
{
    return missionId_;
}

void WindowTransitionInfo::SetOrientation(AppExecFwk::DisplayOrientation orientation)
{
    orientation_ = orientation;
}

AppExecFwk::DisplayOrientation WindowTransitionInfo::GetOrientation() const
{
    return orientation_;
}

void WindowTransitionInfo::SetApiCompatibleVersion(uint32_t apiCompatibleVersion)
{
    apiCompatibleVersion_ = apiCompatibleVersion;
}

uint32_t WindowTransitionInfo::GetApiCompatibleVersion() const
{
    return apiCompatibleVersion_;
}

bool WindowTransitionInfo::Marshalling(Parcel& parcel) const
{
    if (!parcel.WriteString(bundleName_) || !parcel.WriteString(abilityName_)) {
        return false;
    }

    if (!parcel.WriteUint32(static_cast<uint32_t>(mode_))) {
        return false;
    }

    if (!(parcel.WriteInt32(windowRect_.posX_) && parcel.WriteInt32(windowRect_.posY_) &&
        parcel.WriteUint32(windowRect_.width_) && parcel.WriteUint32(windowRect_.height_))) {
        return false;
    }

    if (!abilityToken_) {
        if (!parcel.WriteBool(false)) {
            return false;
        }
    } else {
        if (!parcel.WriteBool(true) || !parcel.WriteObject(abilityToken_)) {
            return false;
        }
    }

    if (!parcel.WriteUint64(displayId_)) {
        return false;
    }

    if (!parcel.WriteUint32(static_cast<uint32_t>(windowType_))) {
        return false;
    }

    if (!parcel.WriteBool(isShowWhenLocked_)) {
        return false;
    }

    if (!parcel.WriteBool(isRecent_)) {
        return false;
    }

    if (!parcel.WriteUint32(static_cast<uint32_t>(reason_))) {
        return false;
    }

    if (!parcel.WriteInt32(missionId_)) {
        return false;
    }

    if (!parcel.WriteUint32(static_cast<uint32_t>(orientation_))) {
        return false;
    }
    return true;
}

WindowTransitionInfo* WindowTransitionInfo::Unmarshalling(Parcel& parcel)
{
    auto windowTransitionInfo = new(std::nothrow) WindowTransitionInfo();
    if (windowTransitionInfo == nullptr) {
        return nullptr;
    }
    windowTransitionInfo->bundleName_ = parcel.ReadString();
    windowTransitionInfo->abilityName_ = parcel.ReadString();
    windowTransitionInfo->mode_ = static_cast<WindowMode>(parcel.ReadUint32());
    windowTransitionInfo->windowRect_.posX_ = parcel.ReadInt32();
    windowTransitionInfo->windowRect_.posY_  = parcel.ReadInt32();
    windowTransitionInfo->windowRect_.width_  = parcel.ReadUint32();
    windowTransitionInfo->windowRect_.height_  = parcel.ReadUint32();
    if (parcel.ReadBool()) {
        auto readObject = parcel.ReadObject<IRemoteObject>();
        if (readObject == nullptr) {
            return nullptr;
        }
        windowTransitionInfo->abilityToken_ = readObject;
    }
    windowTransitionInfo->displayId_ = parcel.ReadUint64();
    windowTransitionInfo->windowType_ = static_cast<WindowType>(parcel.ReadUint32());
    windowTransitionInfo->isShowWhenLocked_ = parcel.ReadBool();
    windowTransitionInfo->isRecent_ = parcel.ReadBool();
    windowTransitionInfo->reason_ = static_cast<TransitionReason>(parcel.ReadUint32());
    windowTransitionInfo->missionId_ = parcel.ReadInt32();
    windowTransitionInfo->orientation_ = static_cast<AppExecFwk::DisplayOrientation>(parcel.ReadUint32());
    return windowTransitionInfo;
}
} // Rosen
} // OHOS