1 /*
2  * Copyright (c) 2022 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 #include "core/components/refresh/render_refresh_target.h"
17 
18 namespace OHOS::Ace {
19 
FindRefreshParent(const WeakPtr<RenderNode> & node)20 void RenderRefreshTarget::FindRefreshParent(const WeakPtr<RenderNode>& node)
21 {
22     auto childNode = node.Upgrade();
23     if (!childNode) {
24         return;
25     }
26     auto parent = childNode->GetParent().Upgrade();
27     while (parent) {
28         auto refresh = AceType::DynamicCast<RenderRefresh>(parent);
29         if (refresh) {
30             refreshParent_ = AceType::WeakClaim(AceType::RawPtr(refresh));
31             break;
32         }
33         parent = parent->GetParent().Upgrade();
34     }
35 }
36 
HandleRefreshEffect(double delta,int32_t source,double currentOffset)37 bool RenderRefreshTarget::HandleRefreshEffect(double delta, int32_t source, double currentOffset)
38 {
39     auto refresh = refreshParent_.Upgrade();
40     if (!refresh) {
41         return false;
42     }
43     refresh->SetHasScrollableChild(true);
44     if ((LessOrEqual(currentOffset, 0.0) && source == SCROLL_FROM_UPDATE) || inLinkRefresh_) {
45         refresh->UpdateScrollableOffset(delta);
46         inLinkRefresh_ = true;
47     }
48     if (refresh->GetStatus() != RefreshStatus::INACTIVE) {
49         return true;
50     }
51     return false;
52 }
53 
InitializeScrollable(const RefPtr<Scrollable> & scrollable)54 void RenderRefreshTarget::InitializeScrollable(const RefPtr<Scrollable>& scrollable)
55 {
56     if (!scrollable) {
57         return;
58     }
59     scrollable->SetDragEndCallback([weakRefreshBase = AceType::WeakClaim(this)]() {
60         auto refreshBase = weakRefreshBase.Upgrade();
61         if (refreshBase) {
62             auto refresh = refreshBase->refreshParent_.Upgrade();
63             if (refresh && refreshBase->inLinkRefresh_) {
64                 refresh->HandleDragEnd();
65                 refreshBase->inLinkRefresh_ = false;
66             }
67         }
68     });
69     scrollable->SetDragCancelCallback([weakRefreshBase = AceType::WeakClaim(this)]() {
70         auto refreshBase = weakRefreshBase.Upgrade();
71         if (refreshBase) {
72             auto refresh = refreshBase->refreshParent_.Upgrade();
73             if (refresh && refreshBase->inLinkRefresh_) {
74                 refresh->HandleDragCancel();
75                 refreshBase->inLinkRefresh_ = false;
76             }
77         }
78     });
79 }
80 
81 } // namespace OHOS::Ace
82