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/scrollable/nestable_scroll_container.h"
34 #include "frameworks/core/components_ng/pattern/scrollable/scrollable_coordination_event.h"
35 #include "frameworks/core/components_ng/pattern/text/text_layout_property.h"
36 #include "frameworks/core/components_ng/property/property.h"
37 
38 namespace OHOS::Ace::NG {
39 
40 class RefreshPattern : public NestableScrollContainer {
41     DECLARE_ACE_TYPE(RefreshPattern, NestableScrollContainer);
42 
43 public:
44     RefreshPattern() = default;
45     ~RefreshPattern() override = default;
46 
CreateLayoutProperty()47     RefPtr<LayoutProperty> CreateLayoutProperty() override
48     {
49         return MakeRefPtr<RefreshLayoutProperty>();
50     }
51 
CreateEventHub()52     RefPtr<EventHub> CreateEventHub() override
53     {
54         return MakeRefPtr<RefreshEventHub>();
55     }
56 
CreateAccessibilityProperty()57     RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override
58     {
59         return MakeRefPtr<RefreshAccessibilityProperty>();
60     }
61 
IsRefreshing()62     bool IsRefreshing() const
63     {
64         return isRefreshing_;
65     }
66 
IsAtomicNode()67     bool IsAtomicNode() const override
68     {
69         return false;
70     }
71 
GetScrollOffsetValue()72     float GetScrollOffsetValue() const
73     {
74         return scrollOffset_;
75     }
76 
77     RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override;
78     void OnModifyDone() override;
79     void InitCoordinationEvent(RefPtr<ScrollableCoordinationEvent>& coordinationEvent);
80     void AddCustomBuilderNode(const RefPtr<NG::UINode>& builder);
GetFocusPattern()81     FocusPattern GetFocusPattern() const override
82     {
83         return { FocusType::SCOPE, true };
84     }
85 
86     void OnColorConfigurationUpdate() override;
87 
GetAxis()88     Axis GetAxis() const override
89     {
90         return Axis::VERTICAL;
91     }
92 
93     ScrollResult HandleScroll(
94         float offset, int32_t source, NestedState state = NestedState::GESTURE, float velocity = 0.f) override;
95 
96     bool HandleScrollVelocity(float velocity, const RefPtr<NestableScrollContainer>& child = nullptr) override;
97 
98     void OnScrollEndRecursive(const std::optional<float>& velocity) override;
99 
100     void OnScrollStartRecursive(WeakPtr<NestableScrollContainer> child, float position, float velocity = 0.f) override;
101 
NestedScrollOutOfBoundary()102     bool NestedScrollOutOfBoundary() override
103     {
104         return !NearZero(scrollOffset_);
105     }
106 
107 private:
108     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
109     void InitPanEvent(const RefPtr<GestureEventHub>& gestureHub);
110     void HandleDragStart(bool isDrag = true, float mainSpeed = 0.0f);
111     ScrollResult HandleDragUpdate(float delta, float mainSpeed = 0.0f);
112     void HandleDragEnd(float speed);
113     void HandleDragCancel();
114     float CalculatePullDownRatio();
115     void TriggerStatusChange(RefreshStatus newStatus);
116     void OnAttachToFrameNode() override;
117     float GetFollowRatio();
118     void HandleCustomBuilderDragUpdateStage();
119     void SetAccessibilityAction();
120     void InitOnKeyEvent();
121     bool OnKeyEvent(const KeyEvent& event);
122     void QuickEndFresh();
123     void QuickStartFresh();
124     void UpdateRefreshStatus(RefreshStatus newStatus);
125     void UpdateFirstChildPlacement();
126     void UpdateLoadingProgressTranslate(float loadingOffset);
127     void UpdateLoadingProgressStatus(RefreshAnimationState state, float followToRecycleRatio = 0.0f);
128     void UpdateBuilderHeight(float builderHeight);
129     void InitOffsetProperty();
130     void SpeedTriggerAnimation(float speed);
131     void SpeedAnimationFinish();
132     void SwitchToFinish();
133     void InitChildNode();
134     void InitProgressNode();
135     void QuickFirstChildAppear();
136     void QuickFirstChildDisappear();
137     float GetLoadingVisibleHeight();
138     void UpdateScrollTransition(float scrollOffset);
139     RefreshAnimationState GetLoadingProgressStatus();
140     void RefreshStatusChangeEffect();
141     float GetTargetOffset();
142     void ResetAnimation();
143     void FireStateChange(int32_t value);
144     void FireRefreshing();
145     void FireChangeEvent(const std::string& value);
146     void FireOnOffsetChange(float value);
147     void UpdateDragFRCSceneInfo(const std::string& scene, float speed, SceneStatus sceneStatus);
148     void InitProgressColumn();
149     void UpdateLoadingTextOpacity(float opacity);
150     void DumpInfo() override;
151 
152     RefreshStatus refreshStatus_ = RefreshStatus::INACTIVE;
153     RefPtr<PanEvent> panEvent_;
154     float scrollOffset_;
155     float lastScrollOffset_;
156     bool isSourceFromAnimation_ = false;
157     bool isRefreshing_ = false;
158     bool isKeyEventRegisted_ = false;
159     bool hasLoadingText_ = false;
160     bool isRemoveCustomBuilder_ = false;
161     bool isTextNodeChanged_ = false;
162     RefPtr<FrameNode> progressChild_;
163     RefPtr<FrameNode> loadingTextNode_;
164     RefPtr<FrameNode> columnNode_;
165     RefPtr<FrameNode> customBuilder_;
166     bool isCustomBuilderExist_ = false;
167     float builderMeasureBaseHeight_ = 0.0f;
168     Dimension refreshOffset_ = 64.0_vp;
169     bool pullToRefresh_ = true;
170     RefPtr<NodeAnimatablePropertyFloat> offsetProperty_;
171     std::shared_ptr<AnimationUtils::Animation> animation_;
172     // API version 10
173     void InitLowVersionOffset();
174     void UpdateChild();
175     void HandleDragStartLowVersion();
176     void HandleDragUpdateLowVersion(float delta);
177     void HandleDragEndLowVersion();
178     void LoadingProgressRefreshingAnimation(bool isDrag);
179     void LoadingProgressExit();
180     void UpdateLoadingProgress();
181     void CustomBuilderRefreshingAnimation(bool isDrag);
182     void CustomBuilderExit();
183     void UpdateCustomBuilderProperty();
184     void HandleCustomBuilderDragEndStage();
185     void UpdateLoadingMarginTop(float top);
186     float GetScrollOffset(float delta);
187     Dimension GetTriggerRefreshDisTance();
188 
189     float triggerLoadingDistance_ = 0.0f;
190     float customBuilderOffset_ = 0.0f;
191     RefPtr<NodeAnimatablePropertyFloat> lowVersionOffset_;
192     ACE_DISALLOW_COPY_AND_MOVE(RefreshPattern);
193 };
194 } // namespace OHOS::Ace::NG
195 
196 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TEXT_TEXT_PATTERN_H
197