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