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