1 /*
2  * Copyright (c) 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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TOAST_TOAST_PATTERN_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TOAST_TOAST_PATTERN_H
18 
19 #include <cstdint>
20 
21 #include "base/geometry/ng/offset_t.h"
22 #include "base/geometry/ng/size_t.h"
23 #include "base/memory/ace_type.h"
24 #include "base/memory/referenced.h"
25 #include "core/components/toast/toast_theme.h"
26 #include "core/components_ng/pattern/overlay/popup_base_pattern.h"
27 #include "core/components_ng/pattern/pattern.h"
28 #include "core/components_ng/pattern/toast/toast_accessibility_property.h"
29 #include "core/components_ng/pattern/text/text_layout_property.h"
30 #include "core/components_ng/pattern/toast/toast_layout_algorithm.h"
31 #include "core/components_ng/pattern/toast/toast_layout_property.h"
32 
33 namespace OHOS::Ace::NG {
34 class ToastPattern : public PopupBasePattern {
35     DECLARE_ACE_TYPE(ToastPattern, PopupBasePattern);
36 
37 public:
38     ToastPattern() = default;
39     ~ToastPattern() override = default;
40 
IsAtomicNode()41     bool IsAtomicNode() const override
42     {
43         return false;
44     }
45 
CreateAccessibilityProperty()46     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
47     {
48         return MakeRefPtr<ToastAccessibilityProperty>();
49     }
50 
CreateLayoutProperty()51     RefPtr<LayoutProperty> CreateLayoutProperty() override
52     {
53         return AceType::MakeRefPtr<ToastLayoutProperty>();
54     }
55 
CreateLayoutAlgorithm()56     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override
57     {
58         return AceType::MakeRefPtr<ToastLayoutAlgorithm>();
59     }
60 
61     void InitWrapperRect(LayoutWrapper* layoutWrapper, const RefPtr<ToastLayoutProperty>& toastProps);
62 
63     void OnAttachToFrameNode() override;
64 
65     void OnDetachFromFrameNode(FrameNode* node) override;
66 
67     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& changeConfig) override;
68 
69     void OnColorConfigurationUpdate() override;
70 
71     void DumpInfo() override;
72 
SetTextNode(RefPtr<FrameNode> textNode)73     void SetTextNode(RefPtr<FrameNode> textNode)
74     {
75         textNode_ = textNode;
76     }
77 
IsDefaultToast()78     bool IsDefaultToast() const
79     {
80         auto layoutProp = GetLayoutProperty<ToastLayoutProperty>();
81         CHECK_NULL_RETURN(layoutProp, false);
82         auto showMode = layoutProp->GetShowModeValue(ToastShowMode::DEFAULT);
83         return showMode == ToastShowMode::DEFAULT;
84     }
85 
IsSystemTopMost()86     bool IsSystemTopMost() const
87     {
88         auto layoutProp = GetLayoutProperty<ToastLayoutProperty>();
89         CHECK_NULL_RETURN(layoutProp, false);
90         auto showMode = layoutProp->GetShowModeValue(ToastShowMode::SYSTEM_TOP_MOST);
91         return showMode == ToastShowMode::SYSTEM_TOP_MOST;
92     }
93 
AvoidKeyboard()94     bool AvoidKeyboard() const override
95     {
96         return IsDefaultToast();
97     }
98 
UpdateFoldDisplayModeChangedCallbackId(std::optional<int32_t> id)99     void UpdateFoldDisplayModeChangedCallbackId(std::optional<int32_t> id)
100     {
101         foldDisplayModeChangedCallbackId_ = id;
102     }
103 
HasFoldDisplayModeChangedCallbackId()104     bool HasFoldDisplayModeChangedCallbackId()
105     {
106         return foldDisplayModeChangedCallbackId_.has_value();
107     }
108 
UpdateHalfFoldHoverChangedCallbackId(std::optional<int32_t> id)109     void UpdateHalfFoldHoverChangedCallbackId(std::optional<int32_t> id)
110     {
111         halfFoldHoverChangedCallbackId_ = id;
112     }
113 
HasHalfFoldHoverChangedCallbackId()114     bool HasHalfFoldHoverChangedCallbackId()
115     {
116         return halfFoldHoverChangedCallbackId_.has_value();
117     }
118 
SetToastInfo(const ToastInfo & toastInfo)119     void SetToastInfo(const ToastInfo& toastInfo)
120     {
121         toastInfo_ = toastInfo;
122     }
123 
GetToastInfo()124     ToastInfo& GetToastInfo()
125     {
126         return toastInfo_;
127     }
128 
129     bool IsShowInFreeMultiWindow();
130 
131     bool IsUIExtensionSubWindow();
132 
133 private:
134     void BeforeCreateLayoutWrapper() override;
135     void UpdateToastSize(const RefPtr<FrameNode>& toast);
136     void UpdateTextSizeConstraint(const RefPtr<FrameNode>& text);
137     void UpdateHoverModeRect(const RefPtr<ToastLayoutProperty>& toastProps,
138         const RefPtr<SafeAreaManager>& safeAreaManager, float safeAreaTop, float safeAreaBottom);
139     Dimension GetOffsetX(const RefPtr<LayoutWrapper>& layoutWrapper);
140     Dimension GetOffsetY(const RefPtr<LayoutWrapper>& layoutWrapper);
141 
142     double GetBottomValue(const RefPtr<LayoutWrapper>& layoutWrapper);
143     double GetTextMaxHeight();
144     double GetTextMaxWidth();
145     int32_t GetTextLineHeight(const RefPtr<FrameNode>& textNode);
146     NG::SizeF GetSystemTopMostSubwindowSize() const;
147 
148     RefPtr<FrameNode> textNode_;
149     std::optional<int32_t> foldDisplayModeChangedCallbackId_;
150     std::optional<int32_t> halfFoldHoverChangedCallbackId_;
151     ToastInfo toastInfo_;
152     ACE_DISALLOW_COPY_AND_MOVE(ToastPattern);
153     double toastBottom_;
154     Dimension defaultBottom_;
155     bool expandDisplay_ = false;
156     Rect wrapperRect_;
157     bool isHoverMode_ = false;
158 };
159 } // namespace OHOS::Ace::NG
160 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TOAST_TOAST_PATTERN_H
161