1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "window_transition_info.h"
17
18namespace OHOS {
19namespace Rosen {
20WindowTransitionInfo::WindowTransitionInfo(sptr<AAFwk::AbilityTransitionInfo> info)
21{
22    bundleName_ = info->bundleName_;
23    abilityName_ = info->abilityName_;
24    mode_ = static_cast<WindowMode>(info->mode_);
25    abilityToken_ = info->abilityToken_;
26    displayId_ = info->displayId_;
27    isShowWhenLocked_ = info->isShowWhenLocked_;
28    isRecent_ = info->isRecent_;
29    missionId_ = info->missionId_;
30    if (info->windowModes_.empty()) {
31        supportWindowModes_ = {
32            AppExecFwk::SupportWindowMode::FULLSCREEN,
33            AppExecFwk::SupportWindowMode::SPLIT,
34            AppExecFwk::SupportWindowMode::FLOATING
35        };
36    } else {
37        supportWindowModes_.assign(info->windowModes_.begin(), info->windowModes_.end());
38    }
39
40    sizeLimits_.maxRatio_ = static_cast<float>(info->maxWindowRatio_);
41    sizeLimits_.minRatio_ = static_cast<float>(info->minWindowRatio_);
42    sizeLimits_.maxWidth_ = info->maxWindowWidth_;
43    sizeLimits_.minWidth_ = info->minWindowWidth_;
44    sizeLimits_.maxHeight_ = info->maxWindowHeight_;
45    sizeLimits_.minHeight_ = info->minWindowHeight_;
46    reason_ = static_cast<TransitionReason>(info->reason_);
47    orientation_ = info->orientation_;
48    apiCompatibleVersion_ = info->apiCompatibleVersion_;
49}
50
51void WindowTransitionInfo::SetBundleName(std::string name)
52{
53    bundleName_ = name;
54}
55
56std::string WindowTransitionInfo::GetBundleName()
57{
58    return bundleName_;
59}
60
61void WindowTransitionInfo::SetAbilityName(std::string name)
62{
63    abilityName_ = name;
64}
65
66std::string WindowTransitionInfo::GetAbilityName()
67{
68    return abilityName_;
69}
70
71void WindowTransitionInfo::SetWindowMode(WindowMode mode)
72{
73    mode_ = mode;
74}
75
76WindowMode WindowTransitionInfo::GetWindowMode()
77{
78    return mode_;
79}
80
81void WindowTransitionInfo::SetWindowRect(Rect rect)
82{
83    windowRect_ = rect;
84}
85
86Rect WindowTransitionInfo::GetWindowRect()
87{
88    return windowRect_;
89}
90
91void WindowTransitionInfo::SetAbilityToken(sptr<IRemoteObject> abilityToken)
92{
93    abilityToken_ = abilityToken;
94}
95
96sptr<IRemoteObject> WindowTransitionInfo::GetAbilityToken()
97{
98    return abilityToken_;
99}
100
101void WindowTransitionInfo::SetDisplayId(DisplayId displayId)
102{
103    displayId_ = displayId;
104}
105
106DisplayId WindowTransitionInfo::GetDisplayId()
107{
108    return displayId_;
109}
110
111void WindowTransitionInfo::SetWindowType(WindowType windowType)
112{
113    windowType_ = windowType;
114}
115
116WindowType WindowTransitionInfo::GetWindowType()
117{
118    return windowType_;
119}
120
121void WindowTransitionInfo::SetShowFlagWhenLocked(bool isShow)
122{
123    isShowWhenLocked_ = isShow;
124}
125
126void WindowTransitionInfo::SetWindowSupportModes(const std::vector<AppExecFwk::SupportWindowMode> supportModes)
127{
128    supportWindowModes_.assign(supportModes.begin(), supportModes.end());
129}
130
131std::vector<AppExecFwk::SupportWindowMode> WindowTransitionInfo::GetWindowSupportModes()
132{
133    return supportWindowModes_;
134}
135
136WindowLimits WindowTransitionInfo::GetWindowSizeLimits() const
137{
138    return sizeLimits_;
139}
140
141bool WindowTransitionInfo::GetShowFlagWhenLocked()
142{
143    return isShowWhenLocked_;
144}
145
146void WindowTransitionInfo::SetTransitionReason(TransitionReason reason)
147{
148    reason_ = reason;
149}
150
151TransitionReason WindowTransitionInfo::GetTransitionReason()
152{
153    return reason_;
154}
155
156void WindowTransitionInfo::SetIsRecent(bool isRecent)
157{
158    isRecent_ = isRecent;
159}
160
161bool WindowTransitionInfo::GetIsRecent() const
162{
163    return isRecent_;
164}
165
166void WindowTransitionInfo::SetMissionId(int32_t missionId)
167{
168    missionId_ = missionId;
169}
170
171int32_t WindowTransitionInfo::GetMissionId() const
172{
173    return missionId_;
174}
175
176void WindowTransitionInfo::SetOrientation(AppExecFwk::DisplayOrientation orientation)
177{
178    orientation_ = orientation;
179}
180
181AppExecFwk::DisplayOrientation WindowTransitionInfo::GetOrientation() const
182{
183    return orientation_;
184}
185
186void WindowTransitionInfo::SetApiCompatibleVersion(uint32_t apiCompatibleVersion)
187{
188    apiCompatibleVersion_ = apiCompatibleVersion;
189}
190
191uint32_t WindowTransitionInfo::GetApiCompatibleVersion() const
192{
193    return apiCompatibleVersion_;
194}
195
196bool WindowTransitionInfo::Marshalling(Parcel& parcel) const
197{
198    if (!parcel.WriteString(bundleName_) || !parcel.WriteString(abilityName_)) {
199        return false;
200    }
201
202    if (!parcel.WriteUint32(static_cast<uint32_t>(mode_))) {
203        return false;
204    }
205
206    if (!(parcel.WriteInt32(windowRect_.posX_) && parcel.WriteInt32(windowRect_.posY_) &&
207        parcel.WriteUint32(windowRect_.width_) && parcel.WriteUint32(windowRect_.height_))) {
208        return false;
209    }
210
211    if (!abilityToken_) {
212        if (!parcel.WriteBool(false)) {
213            return false;
214        }
215    } else {
216        if (!parcel.WriteBool(true) || !parcel.WriteObject(abilityToken_)) {
217            return false;
218        }
219    }
220
221    if (!parcel.WriteUint64(displayId_)) {
222        return false;
223    }
224
225    if (!parcel.WriteUint32(static_cast<uint32_t>(windowType_))) {
226        return false;
227    }
228
229    if (!parcel.WriteBool(isShowWhenLocked_)) {
230        return false;
231    }
232
233    if (!parcel.WriteBool(isRecent_)) {
234        return false;
235    }
236
237    if (!parcel.WriteUint32(static_cast<uint32_t>(reason_))) {
238        return false;
239    }
240
241    if (!parcel.WriteInt32(missionId_)) {
242        return false;
243    }
244
245    if (!parcel.WriteUint32(static_cast<uint32_t>(orientation_))) {
246        return false;
247    }
248    return true;
249}
250
251WindowTransitionInfo* WindowTransitionInfo::Unmarshalling(Parcel& parcel)
252{
253    auto windowTransitionInfo = new(std::nothrow) WindowTransitionInfo();
254    if (windowTransitionInfo == nullptr) {
255        return nullptr;
256    }
257    windowTransitionInfo->bundleName_ = parcel.ReadString();
258    windowTransitionInfo->abilityName_ = parcel.ReadString();
259    windowTransitionInfo->mode_ = static_cast<WindowMode>(parcel.ReadUint32());
260    windowTransitionInfo->windowRect_.posX_ = parcel.ReadInt32();
261    windowTransitionInfo->windowRect_.posY_  = parcel.ReadInt32();
262    windowTransitionInfo->windowRect_.width_  = parcel.ReadUint32();
263    windowTransitionInfo->windowRect_.height_  = parcel.ReadUint32();
264    if (parcel.ReadBool()) {
265        auto readObject = parcel.ReadObject<IRemoteObject>();
266        if (readObject == nullptr) {
267            return nullptr;
268        }
269        windowTransitionInfo->abilityToken_ = readObject;
270    }
271    windowTransitionInfo->displayId_ = parcel.ReadUint64();
272    windowTransitionInfo->windowType_ = static_cast<WindowType>(parcel.ReadUint32());
273    windowTransitionInfo->isShowWhenLocked_ = parcel.ReadBool();
274    windowTransitionInfo->isRecent_ = parcel.ReadBool();
275    windowTransitionInfo->reason_ = static_cast<TransitionReason>(parcel.ReadUint32());
276    windowTransitionInfo->missionId_ = parcel.ReadInt32();
277    windowTransitionInfo->orientation_ = static_cast<AppExecFwk::DisplayOrientation>(parcel.ReadUint32());
278    return windowTransitionInfo;
279}
280} // Rosen
281} // OHOS
282