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