1 /*
2  * Copyright (c) 2023 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 "frameworks/bridge/declarative_frontend/engine/functions/js_swiper_function.h"
17 
18 
19 namespace OHOS::Ace::Framework {
JSBind(BindingTarget globalObj)20 void JsSwiperContentTransitionProxy::JSBind(BindingTarget globalObj)
21 {
22     JSClass<JsSwiperContentTransitionProxy>::Declare("SwiperContentTransitionProxy");
23     JSClass<JsSwiperContentTransitionProxy>::CustomProperty(
24         "selectedIndex", &JsSwiperContentTransitionProxy::GetSelectedIndex,
25         &JsSwiperContentTransitionProxy::SetSelectedIndex);
26     JSClass<JsSwiperContentTransitionProxy>::CustomProperty(
27         "index", &JsSwiperContentTransitionProxy::GetIndex, &JsSwiperContentTransitionProxy::SetIndex);
28     JSClass<JsSwiperContentTransitionProxy>::CustomProperty(
29         "position", &JsSwiperContentTransitionProxy::GetPosition, &JsSwiperContentTransitionProxy::SetPosition);
30     JSClass<JsSwiperContentTransitionProxy>::CustomProperty(
31         "mainAxisLength", &JsSwiperContentTransitionProxy::GetMainAxisLength,
32         &JsSwiperContentTransitionProxy::SetMainAxisLength);
33     JSClass<JsSwiperContentTransitionProxy>::CustomMethod(
34         "finishTransition", &JsSwiperContentTransitionProxy::FinishTransition);
35     JSClass<JsSwiperContentTransitionProxy>::Bind(
36         globalObj, &JsSwiperContentTransitionProxy::Constructor, &JsSwiperContentTransitionProxy::Destructor);
37 }
38 
SetSelectedIndex(const JSCallbackInfo & args)39 void JsSwiperContentTransitionProxy::SetSelectedIndex(const JSCallbackInfo& args)
40 {
41     TAG_LOGD(AceLogTag::ACE_SWIPER, "SwiperContentTransitionProxy can not support set selectedIndex value.");
42 }
43 
GetSelectedIndex(const JSCallbackInfo & args)44 void JsSwiperContentTransitionProxy::GetSelectedIndex(const JSCallbackInfo& args)
45 {
46     auto selectedIndex = 0;
47     if (proxy_) {
48         selectedIndex = proxy_->GetSelectedIndex();
49     }
50     auto fromRef = JSRef<JSVal>::Make(JSVal(ToJSValue(selectedIndex)));
51     args.SetReturnValue(fromRef);
52 }
53 
SetIndex(const JSCallbackInfo & args)54 void JsSwiperContentTransitionProxy::SetIndex(const JSCallbackInfo& args)
55 {
56     TAG_LOGD(AceLogTag::ACE_SWIPER, "SwiperContentTransitionProxy can not support set index value.");
57 }
58 
GetIndex(const JSCallbackInfo & args)59 void JsSwiperContentTransitionProxy::GetIndex(const JSCallbackInfo& args)
60 {
61     auto index = 0;
62     if (proxy_) {
63         index = proxy_->GetIndex();
64     }
65     auto fromRef = JSRef<JSVal>::Make(JSVal(ToJSValue(index)));
66     args.SetReturnValue(fromRef);
67 }
68 
SetPosition(const JSCallbackInfo & args)69 void JsSwiperContentTransitionProxy::SetPosition(const JSCallbackInfo& args)
70 {
71     TAG_LOGD(AceLogTag::ACE_SWIPER, "SwiperContentTransitionProxy can not support set position value.");
72 }
73 
GetPosition(const JSCallbackInfo & args)74 void JsSwiperContentTransitionProxy::GetPosition(const JSCallbackInfo& args)
75 {
76     auto position = 0.0f;
77     if (proxy_) {
78         position = proxy_->GetPosition();
79     }
80     auto toRef = JSRef<JSVal>::Make(JSVal(ToJSValue(position)));
81     args.SetReturnValue(toRef);
82 }
83 
SetMainAxisLength(const JSCallbackInfo & args)84 void JsSwiperContentTransitionProxy::SetMainAxisLength(const JSCallbackInfo& args)
85 {
86     TAG_LOGD(AceLogTag::ACE_SWIPER, "SwiperContentTransitionProxy can not support set mainAxisLength value.");
87 }
88 
GetMainAxisLength(const JSCallbackInfo & args)89 void JsSwiperContentTransitionProxy::GetMainAxisLength(const JSCallbackInfo& args)
90 {
91     auto mainAxisLength = 0.0f;
92     if (proxy_) {
93         mainAxisLength = proxy_->GetMainAxisLength();
94     }
95     auto toRef = JSRef<JSVal>::Make(JSVal(ToJSValue(mainAxisLength)));
96     args.SetReturnValue(toRef);
97 }
98 
FinishTransition(const JSCallbackInfo & args)99 void JsSwiperContentTransitionProxy::FinishTransition(const JSCallbackInfo& args)
100 {
101     if (proxy_) {
102         proxy_->FinishTransition();
103     }
104 }
105 
Constructor(const JSCallbackInfo & args)106 void JsSwiperContentTransitionProxy::Constructor(const JSCallbackInfo& args)
107 {
108     auto proxy = Referenced::MakeRefPtr<JsSwiperContentTransitionProxy>();
109     proxy->IncRefCount();
110     args.SetReturnValue(Referenced::RawPtr(proxy));
111 }
112 
Destructor(JsSwiperContentTransitionProxy * proxy)113 void JsSwiperContentTransitionProxy::Destructor(JsSwiperContentTransitionProxy* proxy)
114 {
115     if (proxy != nullptr) {
116         proxy->DecRefCount();
117     }
118 }
119 
JSBind(BindingTarget globalObj)120 void JsSwiperFunction::JSBind(BindingTarget globalObj)
121 {
122     JsSwiperContentTransitionProxy::JSBind(globalObj);
123 }
124 
Execute(int32_t index,int32_t targetIndex,const AnimationCallbackInfo & animationCallbackInfo)125 void JsSwiperFunction::Execute(int32_t index, int32_t targetIndex, const AnimationCallbackInfo& animationCallbackInfo)
126 {
127     JSRef<JSObject> obj = JSRef<JSObject>::New();
128     float currentOffset = animationCallbackInfo.currentOffset.value_or(0.0f);
129     float targetOffset = animationCallbackInfo.targetOffset.value_or(0.0f);
130     float velocity = animationCallbackInfo.velocity.value_or(0.0f);
131 
132     obj->SetProperty<float>("currentOffset", currentOffset);
133     obj->SetProperty<float>("targetOffset", targetOffset);
134     obj->SetProperty<float>("velocity", velocity);
135 
136     int32_t paramCount = 3;
137     JSRef<JSVal> params[paramCount];
138     params[0] = JSRef<JSVal>::Make(ToJSValue(index));
139     params[1] = JSRef<JSVal>::Make(ToJSValue(targetIndex));
140     params[2] = obj;
141     JsFunction::ExecuteJS(paramCount, params);
142 }
143 
Execute(int32_t index,const AnimationCallbackInfo & animationCallbackInfo)144 void JsSwiperFunction::Execute(int32_t index, const AnimationCallbackInfo& animationCallbackInfo)
145 {
146     JSRef<JSObject> obj = JSRef<JSObject>::New();
147     float currentOffset = animationCallbackInfo.currentOffset.value_or(0.0f);
148     float targetOffset = animationCallbackInfo.targetOffset.value_or(0.0f);
149     float velocity = animationCallbackInfo.velocity.value_or(0.0f);
150 
151     obj->SetProperty<float>("currentOffset", currentOffset);
152     obj->SetProperty<float>("targetOffset", targetOffset);
153     obj->SetProperty<float>("velocity", velocity);
154 
155     int32_t paramCount = 2;
156     JSRef<JSVal> params[paramCount];
157     params[0] = JSRef<JSVal>::Make(ToJSValue(index));
158     params[1] = obj;
159     JsFunction::ExecuteJS(paramCount, params);
160 }
161 
Execute(int32_t errorCode)162 void JsSwiperFunction::Execute(int32_t errorCode)
163 {
164     JSRef<JSObject> obj = JSRef<JSObject>::New();
165     if (errorCode == ERROR_CODE_PARAM_INVALID) {
166         obj->SetProperty<int32_t>("code", errorCode);
167     }
168 
169     JSRef<JSVal> params[1];
170     params[0] = obj;
171     JsFunction::ExecuteJS(1, params);
172 }
173 
Execute(const RefPtr<SwiperContentTransitionProxy> & proxy)174 void JsSwiperFunction::Execute(const RefPtr<SwiperContentTransitionProxy>& proxy)
175 {
176     JSRef<JSObject> proxyObj = JSClass<JsSwiperContentTransitionProxy>::NewInstance();
177     auto jsProxy = Referenced::Claim(proxyObj->Unwrap<JsSwiperContentTransitionProxy>());
178     jsProxy->SetProxy(proxy);
179 
180     JSRef<JSVal> param = JSRef<JSObject>::Cast(proxyObj);
181     JsFunction::ExecuteJS(1, &param);
182 }
183 
Execute(int32_t selectedIndex,int32_t index,float position,float mainAxisLength)184 void JsSwiperFunction::Execute(int32_t selectedIndex, int32_t index, float position, float mainAxisLength)
185 {
186     JSRef<JSVal> selectedIndexValue = JSRef<JSVal>::Make(ToJSValue(selectedIndex));
187     JSRef<JSVal> indexValue = JSRef<JSVal>::Make(ToJSValue(index));
188     JSRef<JSVal> positionValue = JSRef<JSVal>::Make(ToJSValue(position));
189     JSRef<JSVal> mainAxisLengthValue = JSRef<JSVal>::Make(ToJSValue(mainAxisLength));
190 
191     JSRef<JSVal> params[] = { selectedIndexValue, indexValue, positionValue, mainAxisLengthValue };
192     JsFunction::ExecuteJS(4, params);
193 }
194 } // namespace OHOS::Ace::Framework
195