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/scrollable_coordination_event.h" 34 #include "frameworks/core/components_ng/pattern/text/text_layout_property.h" 35 #include "frameworks/core/components_ng/property/property.h" 36 37 namespace OHOS::Ace::NG { 38 39 class RefreshPattern : public Pattern { 40 DECLARE_ACE_TYPE(RefreshPattern, Pattern); 41 42 public: 43 RefreshPattern() = default; 44 ~RefreshPattern() override = default; 45 CreateLayoutProperty()46 RefPtr<LayoutProperty> CreateLayoutProperty() override 47 { 48 return MakeRefPtr<RefreshLayoutProperty>(); 49 } 50 CreateEventHub()51 RefPtr<EventHub> CreateEventHub() override 52 { 53 return MakeRefPtr<RefreshEventHub>(); 54 } 55 CreateAccessibilityProperty()56 RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override 57 { 58 return MakeRefPtr<RefreshAccessibilityProperty>(); 59 } 60 IsRefreshing()61 bool IsRefreshing() const 62 { 63 return isRefreshing_; 64 } 65 IsAtomicNode()66 bool IsAtomicNode() const override 67 { 68 return false; 69 } 70 GetScrollOffsetValue()71 float GetScrollOffsetValue() const 72 { 73 return scrollOffset_; 74 } 75 76 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override; 77 void OnModifyDone() override; 78 void InitCoordinationEvent(RefPtr<ScrollableCoordinationEvent>& coordinationEvent); 79 void AddCustomBuilderNode(const RefPtr<NG::UINode>& builder); GetFocusPattern()80 FocusPattern GetFocusPattern() const override 81 { 82 return { FocusType::SCOPE, true }; 83 } 84 85 private: 86 void InitPanEvent(const RefPtr<GestureEventHub>& gestureHub); 87 void HandleDragStart(bool isDrag = true, float mainSpeed = 0.0f); 88 void HandleDragUpdate(float delta, float mainSpeed = 0.0f); 89 void HandleDragEnd(float speed); 90 void HandleDragCancel(); 91 float CalculateFriction(); 92 void TriggerStatusChange(RefreshStatus newStatus); 93 void OnAttachToFrameNode() override; 94 float GetFollowRatio(); 95 void HandleCustomBuilderDragUpdateStage(); 96 void SetAccessibilityAction(); 97 void InitOnKeyEvent(); 98 bool OnKeyEvent(const KeyEvent& event); 99 void QuickEndFresh(); 100 void QuickStartFresh(); 101 void UpdateRefreshStatus(RefreshStatus newStatus); 102 void UpdateFirstChildPlacement(); 103 void UpdateLoadingProgressTranslate(float loadingOffset); 104 void UpdateLoadingProgressStatus(RefreshAnimationState state, float followToRecycleRatio = 0.0f); 105 void UpdateBuilderHeight(float builderHeight); 106 void InitOffsetProperty(); 107 void SpeedTriggerAnimation(float speed); 108 void SpeedAnimationFinish(); 109 void SwitchToFinish(); 110 void InitChildNode(); 111 void InitProgressNode(); 112 void QuickFirstChildAppear(); 113 void QuickFirstChildDisappear(); 114 float GetLoadingVisibleHeight(); 115 void UpdateScrollTransition(float scrollOffset); 116 RefreshAnimationState GetLoadingProgressStatus(); 117 void RefreshStatusChangeEffect(); 118 float GetTargetOffset(); 119 void ResetAnimation(); 120 void FireStateChange(int32_t value); 121 void FireRefreshing(); 122 void FireChangeEvent(const std::string& value); 123 void UpdateDragFRCSceneInfo(const std::string& scene, float speed, SceneStatus sceneStatus); 124 125 RefreshStatus refreshStatus_ = RefreshStatus::INACTIVE; 126 RefPtr<PanEvent> panEvent_; 127 float scrollOffset_; 128 bool isSourceFromAnimation_ = false; 129 bool isRefreshing_ = false; 130 bool isKeyEventRegisted_ = false; 131 RefPtr<FrameNode> progressChild_; 132 RefPtr<FrameNode> customBuilder_; 133 bool isCustomBuilderExist_ = false; 134 float builderMeasureBaseHeight_ = 0.0f; 135 RefPtr<NodeAnimatablePropertyFloat> offsetProperty_; 136 std::shared_ptr<AnimationUtils::Animation> animation_; 137 // API version 10 138 void InitLowVersionOffset(); 139 void UpdateChild(); 140 void HandleDragStartLowVersion(); 141 void HandleDragUpdateLowVersion(float delta); 142 void HandleDragEndLowVersion(); 143 void LoadingProgressRefreshingAnimation(bool isDrag); 144 void LoadingProgressExit(); 145 void UpdateLoadingProgress(); 146 void CustomBuilderRefreshingAnimation(bool isDrag); 147 void CustomBuilderExit(); 148 void UpdateCustomBuilderProperty(); 149 void HandleCustomBuilderDragEndStage(); 150 void UpdateLoadingMarginTop(float top); 151 float GetScrollOffset(float delta); 152 153 float triggerLoadingDistance_ = 0.0f; 154 float customBuilderOffset_ = 0.0f; 155 RefPtr<NodeAnimatablePropertyFloat> lowVersionOffset_; 156 ACE_DISALLOW_COPY_AND_MOVE(RefreshPattern); 157 }; 158 } // namespace OHOS::Ace::NG 159 160 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TEXT_TEXT_PATTERN_H 161