1 /*
2  * Copyright (c) 2021-2023 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 #ifndef OHOS_ROSEN_WINDOW_PROPERTY_H
17 #define OHOS_ROSEN_WINDOW_PROPERTY_H
18 
19 #include <refbase.h>
20 #include <string>
21 #include <unordered_map>
22 #include <parcel.h>
23 #include "class_var_definition.h"
24 #include "pointer_event.h"
25 #include "dm_common.h"
26 #include "wm_common.h"
27 #include "wm_common_inner.h"
28 #include "wm_math.h"
29 
30 namespace OHOS {
31 namespace Rosen {
32 class WindowProperty : public Parcelable {
33 public:
34     WindowProperty() = default;
35     explicit WindowProperty(const sptr<WindowProperty>& property);
36     ~WindowProperty() = default;
37 
38     void CopyFrom(const sptr<WindowProperty>& property);
39 
40     void SetWindowName(const std::string& name);
41     void SetAbilityInfo(const AbilityInfo& info);
42     void SetRequestRect(const struct Rect& rect);
43     void SetWindowRect(const struct Rect& rect);
44     void SetDecoStatus(bool decoStatus);
45     void SetWindowHotZoneRect(const struct Rect& rect);
46     void SetWindowType(WindowType type);
47     void SetWindowMode(WindowMode mode);
48     void SetLastWindowMode(WindowMode mode);
49     void ResumeLastWindowMode();
50     void SetFullScreen(bool isFullScreen);
51     void SetFocusable(bool isFocusable);
52     void SetTouchable(bool isTouchable);
53     void SetPrivacyMode(bool isPrivate);
54     void SetSystemPrivacyMode(bool isSystemPrivate);
55     void SetSnapshotSkip(bool isSkip);
56     void SetTransparent(bool isTransparent);
57     void SetAlpha(float alpha);
58     void SetBrightness(float brightness);
59     void SetTurnScreenOn(bool turnScreenOn);
60     void SetKeepScreenOn(bool keepScreenOn);
61     void SetCallingWindow(uint32_t windowId);
62     void SetDisplayId(DisplayId displayId);
63     void SetWindowId(uint32_t windowId);
64     void SetParentId(uint32_t parentId);
65     void SetWindowFlags(uint32_t flags);
66     void AddWindowFlag(WindowFlag flag);
67     void SetSystemBarProperty(WindowType type, const SystemBarProperty& state);
68     void SetDecorEnable(bool decorEnable);
69     void SetHitOffset(const PointInfo& offset);
70     void SetAnimationFlag(uint32_t animationFlag);
71     void SetWindowSizeChangeReason(WindowSizeChangeReason reason);
72     void SetTokenState(bool hasToken);
73     void SetWindowModeSupportType(uint32_t windowModeSupportType);
74     void SetRequestWindowModeSupportType(uint32_t requestWindowModeSupportType);
75     void SetDragType(DragType dragType);
76     void SetStretchable(bool stretchable);
77     void SetOriginRect(const Rect& rect);
78     void SetTouchHotAreas(const std::vector<Rect>& rects);
79     void SetAccessTokenId(uint32_t accessTokenId);
80     void SetSizeLimits(const WindowLimits& sizeLimits);
81     void SetUpdatedSizeLimits(const WindowLimits& sizeLimits);
82     WindowSizeChangeReason GetWindowSizeChangeReason() const;
83     void SetTransform(const Transform& trans);
84     void ComputeTransform();
85     void SetZoomTransform(const Transform& trans);
86     void SetDisplayZoomState(bool isDisplayZoomOn);
87     void SetAnimateWindowFlag(bool isAnimateWindow);
88     void UpdatePointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent);
89     bool isNeedComputerTransform();
90     void ClearTransformZAxisOffset(Transform& trans);
91     void SetAspectRatio(float ratio);
92     void SetWindowGravity(WindowGravity gravity, uint32_t percent);
93     void SetMaximizeMode(MaximizeMode maximizeMode);
94 
95     const std::string& GetWindowName() const;
96     const AbilityInfo& GetAbilityInfo() const;
97     Rect GetRequestRect() const;
98     Rect GetWindowRect() const;
99     bool GetDecoStatus() const;
100     Rect GetWindowHotZoneRect() const;
101     WindowType GetWindowType() const;
102     WindowMode GetWindowMode() const;
103     WindowMode GetLastWindowMode() const;
104     bool GetFullScreen() const;
105     bool GetFocusable() const;
106     bool GetTouchable() const;
107     uint32_t GetCallingWindow() const;
108     bool GetPrivacyMode() const;
109     bool GetSystemPrivacyMode() const;
110     bool GetSnapshotSkip() const;
111     bool GetTransparent() const;
112     bool GetTokenState() const;
113     float GetAlpha() const;
114     float GetBrightness() const;
115     bool IsTurnScreenOn() const;
116     bool IsKeepScreenOn() const;
117     DisplayId GetDisplayId() const;
118     uint32_t GetWindowId() const;
119     uint32_t GetParentId() const;
120     uint32_t GetWindowFlags() const;
121     const std::unordered_map<WindowType, SystemBarProperty>& GetSystemBarProperty() const;
122     bool GetDecorEnable() const;
123     const PointInfo& GetHitOffset() const;
124     uint32_t GetAnimationFlag() const;
125     uint32_t GetWindowModeSupportType() const;
126     uint32_t GetRequestWindowModeSupportType() const;
127     DragType GetDragType() const;
128     bool GetStretchable() const;
129     const Rect& GetOriginRect() const;
130     void GetTouchHotAreas(std::vector<Rect>& rects) const;
131     uint32_t GetAccessTokenId() const;
132     const Transform& GetTransform() const;
133     const Transform& GetZoomTransform() const;
134     bool IsDisplayZoomOn() const;
135     bool IsAnimateWindow() const;
136     WindowLimits GetSizeLimits() const;
137     WindowLimits GetUpdatedSizeLimits() const;
138     const TransformHelper::Matrix4& GetTransformMat() const;
139     const TransformHelper::Matrix4& GetWorldTransformMat() const;
140     float GetAspectRatio() const;
141     void GetWindowGravity(WindowGravity& gravity, uint32_t& percent) const;
142     MaximizeMode GetMaximizeMode() const;
143 
144     virtual bool Marshalling(Parcel& parcel) const override;
145     static WindowProperty* Unmarshalling(Parcel& parcel);
146 
147     bool Write(Parcel& parcel, PropertyChangeAction action);
148     void Read(Parcel& parcel, PropertyChangeAction action);
149     bool isSystemCalling_ { false };
150 
151     void SetTextFieldPositionY(double textFieldPositionY);
152     void SetTextFieldHeight(double textFieldHeight);
153 
154     double GetTextFieldPositionY() const;
155     double GetTextFieldHeight() const;
156 private:
157     bool MapMarshalling(Parcel& parcel) const;
158     static void MapUnmarshalling(Parcel& parcel, WindowProperty* property);
159     bool MarshallingTouchHotAreas(Parcel& parcel) const;
160     static void UnmarshallingTouchHotAreas(Parcel& parcel, WindowProperty* property);
161     bool MarshallingTransform(Parcel& parcel) const;
162     static void UnmarshallingTransform(Parcel& parcel, WindowProperty* property);
163     bool MarshallingWindowSizeLimits(Parcel& parcel) const;
164     static void UnmarshallingWindowSizeLimits(Parcel& parcel, WindowProperty* property);
165     void HandleComputeTransform(const Transform& trans);
166 
167     std::string windowName_;
168     AbilityInfo abilityInfo_;
169     Rect requestRect_ { 0, 0, 0, 0 }; // window rect requested by the client (without decoration size)
170     Rect windowRect_ { 0, 0, 0, 0 }; // actual window rect
171     bool decoStatus_ { false }; // window has been decorated or not
172     WindowType type_ { WindowType::WINDOW_TYPE_APP_MAIN_WINDOW };
173     WindowMode mode_ { WindowMode::WINDOW_MODE_UNDEFINED };
174     WindowMode lastMode_ { WindowMode::WINDOW_MODE_UNDEFINED };
175     uint32_t flags_ { 0 };
176     bool isFullScreen_ { true };
177     bool focusable_ { true };
178     bool touchable_ { true };
179     bool isPrivacyMode_ { false };
180     bool isSystemPrivacyMode_ { false };
181     bool isTransparent_ { false };
182     bool tokenState_ { false };
183     float alpha_ { 1.0f };
184     float brightness_ = UNDEFINED_BRIGHTNESS;
185     bool turnScreenOn_ = false;
186     bool keepScreenOn_ = false;
187     uint32_t callingWindow_ = INVALID_WINDOW_ID;
188     DisplayId displayId_ { 0 };
189     uint32_t windowId_ = INVALID_WINDOW_ID;
190     uint32_t parentId_ = INVALID_WINDOW_ID;
191     PointInfo hitOffset_ { 0, 0 };
192     uint32_t animationFlag_ { static_cast<uint32_t>(WindowAnimation::DEFAULT) };
193     // windowModeSupportType_ means supported modes in runtime, which can be changed
194     uint32_t windowModeSupportType_ {WindowModeSupport::WINDOW_MODE_SUPPORT_ALL};
195     // requestWindowModeSupportType_ is configured in abilityInfo, usually can't be changed
196     uint32_t requestWindowModeSupportType_ {WindowModeSupport::WINDOW_MODE_SUPPORT_ALL};
197     WindowSizeChangeReason windowSizeChangeReason_ = WindowSizeChangeReason::UNDEFINED;
198     std::unordered_map<WindowType, SystemBarProperty> sysBarPropMap_ {
199         { WindowType::WINDOW_TYPE_STATUS_BAR,     SystemBarProperty() },
200         { WindowType::WINDOW_TYPE_NAVIGATION_BAR, SystemBarProperty() },
201     };
202     bool isDecorEnable_ { true };
203     Rect originRect_ = { 0, 0, 0, 0 };
204     bool isStretchable_ {false};
205     DragType dragType_ = DragType::DRAG_UNDEFINED;
206     std::vector<Rect> touchHotAreas_;  // coordinates relative to window.
207     uint32_t accessTokenId_ { 0 };
208     // Transform info
209     Transform trans_;
210     bool recomputeTransformMat_ { false };
211     TransformHelper::Matrix4 transformMat_ = TransformHelper::Matrix4::Identity;
212     TransformHelper::Matrix4 worldTransformMat_ = TransformHelper::Matrix4::Identity;
213     // Display Zoom transform info
214     Transform zoomTrans_; // Compared with original window rect, including class member trans_
215     bool reCalcuZoomTransformMat_ {true};
216     // if scale of trans_ is less than 1.0, zoomTrans_ may be an identity matrix
217     bool isDisplayZoomOn_ {false};
218     bool isAnimateWindow_ {false};
219     float aspectRatio_ {0.0};
220     WindowGravity windowGravity_ = WindowGravity::WINDOW_GRAVITY_BOTTOM;
221     uint32_t windowGravitySizePercent_ = 0;
222     bool isSnapshotSkip_ = false;
223 
224     DEFINE_VAR_DEFAULT_FUNC_GET_SET(Orientation, RequestedOrientation, requestedOrientation, Orientation::UNSPECIFIED);
225     DEFINE_VAR_DEFAULT_FUNC_GET_SET(uint32_t, ApiCompatibleVersion, apiCompatibleVersion, 0u);
226     WindowLimits sizeLimits_;
227     WindowLimits updatedSizeLimits_;
228     MaximizeMode maximizeMode_ { MaximizeMode::MODE_RECOVER };
229 
230     double textFieldPositionY_ = 0.0;
231     double textFieldHeight_ = 0.0;
232 };
233 }
234 }
235 #endif // OHOS_ROSEN_WINDOW_PROPERTY_H
236