• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2024 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_REFRESH_PATTERN_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_REFRESH_PATTERN_H
18 
19 #include <string>
20 
21 #include "frameworks/base/geometry/dimension.h"
22 #include "frameworks/base/geometry/ng/offset_t.h"
23 #include "frameworks/base/memory/referenced.h"
24 #include "frameworks/base/utils/noncopyable.h"
25 #include "frameworks/core/components_ng/base/frame_scene_status.h"
26 #include "frameworks/core/components_ng/pattern/list/list_layout_property.h"
27 #include "frameworks/core/components_ng/pattern/pattern.h"
28 #include "frameworks/core/components_ng/pattern/refresh/refresh_accessibility_property.h"
29 #include "frameworks/core/components_ng/pattern/refresh/refresh_animation_state.h"
30 #include "frameworks/core/components_ng/pattern/refresh/refresh_event_hub.h"
31 #include "frameworks/core/components_ng/pattern/refresh/refresh_layout_algorithm.h"
32 #include "frameworks/core/components_ng/pattern/refresh/refresh_layout_property.h"
33 #include "frameworks/core/components_ng/pattern/refresh/refresh_theme_ng.h"
34 #include "frameworks/core/components_ng/pattern/scrollable/nestable_scroll_container.h"
35 #include "frameworks/core/components_ng/pattern/scrollable/scrollable_coordination_event.h"
36 #include "frameworks/core/components_ng/pattern/text/text_layout_property.h"
37 #include "frameworks/core/components_ng/property/property.h"
38 
39 namespace OHOS::Ace::NG {
40 
41 class RefreshPattern : public NestableScrollContainer {
42     DECLARE_ACE_TYPE(RefreshPattern, NestableScrollContainer);
43 
44 public:
45     RefreshPattern() = default;
46     ~RefreshPattern() override = default;
47 
CreateLayoutProperty()48     RefPtr<LayoutProperty> CreateLayoutProperty() override
49     {
50         return MakeRefPtr<RefreshLayoutProperty>();
51     }
52 
CreateEventHub()53     RefPtr<EventHub> CreateEventHub() override
54     {
55         return MakeRefPtr<RefreshEventHub>();
56     }
57 
CreateAccessibilityProperty()58     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
59     {
60         return MakeRefPtr<RefreshAccessibilityProperty>();
61     }
62 
IsRefreshing()63     bool IsRefreshing() const
64     {
65         return isRefreshing_;
66     }
67 
IsAtomicNode()68     bool IsAtomicNode() const override
69     {
70         return false;
71     }
72 
GetScrollOffsetValue()73     float GetScrollOffsetValue() const
74     {
75         return scrollOffset_;
76     }
77 
78     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override;
79     void OnModifyDone() override;
80     void InitCoordinationEvent(RefPtr<ScrollableCoordinationEvent>& coordinationEvent);
81     void AddCustomBuilderNode(const RefPtr<NG::UINode>& builder);
GetFocusPattern()82     FocusPattern GetFocusPattern() const override
83     {
84         return { FocusType::SCOPE, true };
85     }
86 
87     void OnColorConfigurationUpdate() override;
88 
89     void OnColorModeChange(uint32_t colorMode) override;
90 
GetAxis()91     Axis GetAxis() const override
92     {
93         return Axis::VERTICAL;
94     }
95 
96     ScrollResult HandleScroll(
97         float offset, int32_t source, NestedState state = NestedState::GESTURE, float velocity = 0.f) override;
98 
99     bool HandleScrollVelocity(float velocity, const RefPtr<NestableScrollContainer>& child = nullptr) override;
100 
101     void OnScrollEndRecursive(const std::optional<float>& velocity) override;
102 
103     void OnScrollStartRecursive(WeakPtr<NestableScrollContainer> child, float position, float velocity = 0.f) override;
104 
NestedScrollOutOfBoundary()105     bool NestedScrollOutOfBoundary() override
106     {
107         return !NearZero(scrollOffset_);
108     }
109 
IsEnableMatchParent()110     bool IsEnableMatchParent() override
111     {
112         return true;
113     }
114 
IsEnableFix()115     bool IsEnableFix() override
116     {
117         return true;
118     }
119 
IsEnableChildrenMatchParent()120     bool IsEnableChildrenMatchParent() override
121     {
122         return true;
123     }
124 
ChildPreMeasureHelperEnabled()125     bool ChildPreMeasureHelperEnabled() override
126     {
127         return true;
128     }
129 
PostponedTaskForIgnoreEnabled()130     bool PostponedTaskForIgnoreEnabled() override
131     {
132         return true;
133     }
134 
135 private:
136     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
137     void InitPanEvent(const RefPtr<FrameNode>& host);
138     void HandleDragStart(bool isDrag = true, float mainSpeed = 0.0f);
139     ScrollResult HandleDragUpdate(float delta, float mainSpeed = 0.0f);
140     void HandleDragEnd(float speed);
141     void HandleDragCancel();
142     float CalculatePullDownRatio();
143     float GetMaxPullDownDistance();
144     void TriggerStatusChange(RefreshStatus newStatus);
145     void OnAttachToFrameNode() override;
146     void OnAttachToFrameNodeMultiThread();
147     void OnAttachToMainTree() override;
148     void OnAttachToMainTreeMultiThread();
149     float GetFollowRatio();
150     void HandleCustomBuilderDragUpdateStage();
151     void SetAccessibilityAction(const RefPtr<FrameNode>& host);
152     void InitOnKeyEvent(const RefPtr<FrameNode>& host);
153     bool OnKeyEvent(const KeyEvent& event);
154     void QuickEndFresh();
155     void QuickStartFresh();
156     void UpdateRefreshStatus(RefreshStatus newStatus);
157     void UpdateFirstChildPlacement();
158     void UpdateLoadingProgressTranslate(float loadingOffset);
159     void UpdateLoadingProgressStatus(RefreshAnimationState state, float followToRecycleRatio = 0.0f);
160     void UpdateBuilderHeight(float builderHeight);
161     void InitOffsetProperty();
162     void SpeedTriggerAnimation(float speed);
163     void SpeedAnimationFinish();
164     void SwitchToFinish();
165     void InitChildNode(const RefPtr<FrameNode>& host);
166     void InitProgressNode(const RefPtr<FrameNode>& host);
167     void QuickFirstChildAppear();
168     void QuickFirstChildDisappear();
169     float GetLoadingVisibleHeight();
170     void UpdateScrollTransition(const RefPtr<FrameNode>& host, float scrollOffset);
171     RefreshAnimationState GetLoadingProgressStatus();
172     void RefreshStatusChangeEffect(bool refreshingProp);
173     float GetTargetOffset();
174     void ResetAnimation();
175     void FireOnOffsetChange(float value);
176     void FireOnStepOffsetChange(float value);
177     void UpdateDragFRCSceneInfo(const std::string& scene, float speed, SceneStatus sceneStatus);
178     void InitProgressColumn();
179     void UpdateLoadingTextOpacity(float opacity);
180     void BeginTrailingTrace();
181     void EndTrailingTrace();
182     float GetLoadingProgressOpacity();
183     float GetLoadingTextOpacity();
184     Color GetLoadingProgressColor();
185     void DumpInfo() override;
186     void DumpInfo(std::unique_ptr<JsonValue>& json) override;
DumpSimplifyInfo(std::shared_ptr<JsonValue> & json)187     void DumpSimplifyInfo(std::shared_ptr<JsonValue>& json) override {}
188     RefreshStatus refreshStatus_ = RefreshStatus::INACTIVE;
189     RefPtr<PanEvent> panEvent_;
190     float scrollOffset_ = 0.0f;
191     float lastScrollOffset_ = 0.0f;
192     bool isSourceFromAnimation_ = false;
193     bool isRefreshing_ = false;
194     bool isKeyEventRegisted_ = false;
195     bool hasLoadingText_ = false;
196     bool isRemoveCustomBuilder_ = false;
197     bool isTextNodeChanged_ = false;
198     RefPtr<FrameNode> progressChild_;
199     RefPtr<FrameNode> loadingTextNode_;
200     RefPtr<FrameNode> columnNode_;
201     RefPtr<FrameNode> customBuilder_;
202     bool isCustomBuilderExist_ = false;
203     float builderMeasureBaseHeight_ = 0.0f;
204     Dimension refreshOffset_ = 64.0_vp;
205     bool pullToRefresh_ = true;
206     RefPtr<NodeAnimatablePropertyFloat> offsetProperty_;
207     std::shared_ptr<AnimationUtils::Animation> animation_;
208     std::optional<float> ratio_;
209     bool hasBeginTrailingTrace_ = false;
210     // API version 10
211     void InitLowVersionOffset();
212     void UpdateChild();
213     void HandleDragStartLowVersion();
214     void HandleDragUpdateLowVersion(float delta);
215     void HandleDragEndLowVersion();
216     void LoadingProgressRefreshingAnimation(bool isDrag);
217     void LoadingProgressExit();
218     void UpdateLoadingProgress();
219     void CustomBuilderRefreshingAnimation(bool isDrag);
220     void CustomBuilderExit();
221     void UpdateCustomBuilderProperty();
222     void HandleCustomBuilderDragEndStage();
223     void UpdateLoadingMarginTop(float top);
224     float GetScrollOffset(float delta);
225     Dimension GetTriggerRefreshDisTance();
226 
227     float triggerLoadingDistance_ = 0.0f;
228     float customBuilderOffset_ = 0.0f;
229     RefPtr<NodeAnimatablePropertyFloat> lowVersionOffset_;
230     ACE_DISALLOW_COPY_AND_MOVE(RefreshPattern);
231     Dimension loadingProgressSizeTheme_ = 32.0_vp;
232     Dimension triggerLoadingDistanceTheme_ = 16.0_vp;
233     bool isHigherVersion_ = true;
234 };
235 } // namespace OHOS::Ace::NG
236 
237 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TEXT_TEXT_PATTERN_H
238