1 /*
2  * Copyright (c) 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 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_refresh_ffi.h"
17 
18 #include <cstdint>
19 #include "base/log/ace_scoring_log.h"
20 #include "cj_lambda.h"
21 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_view_abstract_ffi.h"
22 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
23 #include "core/components/refresh/refresh_theme.h"
24 #include "core/components_ng/base/view_stack_processor.h"
25 #include "core/components_ng/pattern/refresh/refresh_model_ng.h"
26 
27 using namespace OHOS::Ace;
28 using namespace OHOS::Ace::Framework;
29 
30 extern "C" {
FfiOHOSAceFrameworkRefreshCreate(bool refreshing,double offsetValue,int32_t offsetUnit,int32_t friction)31 void FfiOHOSAceFrameworkRefreshCreate(bool refreshing, double offsetValue, int32_t offsetUnit, int32_t friction)
32 {
33     RefPtr<RefreshTheme> theme = GetTheme<RefreshTheme>();
34     if (!theme) {
35         LOGE("Refresh Theme is null");
36         return;
37     }
38     if (RefreshModel::GetInstance() == nullptr) {
39         LOGE("Refresh Instance is null");
40     }
41     RefreshModel::GetInstance()->Create();
42     RefreshModel::GetInstance()->SetLoadingDistance(theme->GetLoadingDistance());
43     RefreshModel::GetInstance()->SetRefreshDistance(theme->GetRefreshDistance());
44     RefreshModel::GetInstance()->SetProgressDistance(theme->GetProgressDistance());
45     RefreshModel::GetInstance()->SetProgressDiameter(theme->GetProgressDiameter());
46     RefreshModel::GetInstance()->SetMaxDistance(theme->GetMaxDistance());
47     RefreshModel::GetInstance()->SetShowTimeDistance(theme->GetShowTimeDistance());
48     RefreshModel::GetInstance()->SetTextStyle(theme->GetTextStyle());
49     RefreshModel::GetInstance()->SetProgressColor(theme->GetProgressColor());
50     RefreshModel::GetInstance()->SetProgressBackgroundColor(theme->GetBackgroundColor());
51 
52     RefreshModel::GetInstance()->SetRefreshing(refreshing);
53 
54     Dimension offset(offsetValue, static_cast<DimensionUnit>(offsetUnit));
55     if (offset.Value() <= 0.0) {
56         RefreshModel::GetInstance()->SetRefreshDistance(theme->GetRefreshDistance());
57     } else {
58         RefreshModel::GetInstance()->SetUseOffset(true);
59         RefreshModel::GetInstance()->SetIndicatorOffset(offset);
60     }
61 
62     RefreshModel::GetInstance()->SetFriction(friction);
63     if (friction <= 0) {
64         RefreshModel::GetInstance()->IsRefresh(true);
65     }
66 }
67 
FfiOHOSAceFrameworkRefreshCreateWithChangeEvent(bool refreshing,double offsetValue,int32_t offsetUnit,int32_t friction,void (* callback)(bool isRefreshing))68 void FfiOHOSAceFrameworkRefreshCreateWithChangeEvent(bool refreshing, double offsetValue,
69     int32_t offsetUnit, int32_t friction, void (*callback)(bool isRefreshing))
70 {
71     RefPtr<RefreshTheme> theme = GetTheme<RefreshTheme>();
72     if (!theme) {
73         LOGE("FfiOHOSAceFrameworkRefreshCreateWithChangeEvent, Refresh Theme is null");
74         return;
75     }
76     if (RefreshModel::GetInstance() == nullptr) {
77         LOGE("FfiOHOSAceFrameworkRefreshCreateWithChangeEvent, Refresh Instance is null");
78     }
79     RefreshModel::GetInstance()->Create();
80     RefreshModel::GetInstance()->SetLoadingDistance(theme->GetLoadingDistance());
81     RefreshModel::GetInstance()->SetRefreshDistance(theme->GetRefreshDistance());
82     RefreshModel::GetInstance()->SetProgressDistance(theme->GetProgressDistance());
83     RefreshModel::GetInstance()->SetProgressDiameter(theme->GetProgressDiameter());
84     RefreshModel::GetInstance()->SetTextStyle(theme->GetTextStyle());
85     RefreshModel::GetInstance()->SetProgressColor(theme->GetProgressColor());
86     RefreshModel::GetInstance()->SetMaxDistance(theme->GetMaxDistance());
87     RefreshModel::GetInstance()->SetShowTimeDistance(theme->GetShowTimeDistance());
88     RefreshModel::GetInstance()->SetProgressBackgroundColor(theme->GetBackgroundColor());
89 
90     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
91     auto changeEvent = [lambda = CJLambda::Create(callback), node = targetNode](
92         const std::string& value) -> void {
93         LOGI("FfiOHOSAceFrameworkRefreshCreateWithChangeEvent refreshing is %{public}s", value.c_str());
94         PipelineContext::SetCallBackNode(node);
95         bool newValue = value == "true";
96         lambda(newValue);
97     };
98     RefreshModel::GetInstance()->SetChangeEvent(std::move(changeEvent));
99     RefreshModel::GetInstance()->SetRefreshing(refreshing);
100 
101     Dimension offset(offsetValue, static_cast<DimensionUnit>(offsetUnit));
102     if (offset.Value() <= 0.0) {
103         RefreshModel::GetInstance()->SetRefreshDistance(theme->GetRefreshDistance());
104     } else {
105         LOGI("FfiOHOSAceFrameworkRefreshCreateWithChangeEvent, offset value > 0");
106         RefreshModel::GetInstance()->SetUseOffset(true);
107         RefreshModel::GetInstance()->SetIndicatorOffset(offset);
108     }
109 
110     RefreshModel::GetInstance()->SetFriction(friction);
111     if (friction <= 0) {
112         RefreshModel::GetInstance()->IsRefresh(true);
113     }
114 }
115 
FfiOHOSAceFrameworkRefreshPop()116 void FfiOHOSAceFrameworkRefreshPop()
117 {
118     RefreshModel::GetInstance()->Pop();
119 }
120 
FfiOHOSAceFrameworkRefreshOnStateChange(void (* callback)(const int32_t value))121 void FfiOHOSAceFrameworkRefreshOnStateChange(void (*callback)(const int32_t value))
122 {
123     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
124     auto onStateChange = [func = CJLambda::Create(callback), node = targetNode](const int32_t& key) {
125         LOGI("Refresh.OnStateChange");
126         PipelineContext::SetCallBackNode(node);
127         func(key);
128     };
129     RefreshModel::GetInstance()->SetOnStateChange(std::move(onStateChange));
130 }
131 
FfiOHOSAceFrameworkRefreshOnRefreshing(void (* callback)())132 void FfiOHOSAceFrameworkRefreshOnRefreshing(void (*callback)())
133 {
134     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
135     auto onRefreshing = [func = CJLambda::Create(callback), node = targetNode]() {
136         LOGI("Refresh.OnRefreshing");
137         PipelineContext::SetCallBackNode(node);
138         func();
139     };
140     RefreshModel::GetInstance()->SetOnRefreshing(std::move(onRefreshing));
141 }
142 }
143