• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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/jsview/js_gesture.h"
17 
18 #include "base/log/log_wrapper.h"
19 #include "bridge/declarative_frontend/jsview/models/gesture_model_impl.h"
20 #include "core/components_ng/pattern/gesture/gesture_model_ng.h"
21 #include "frameworks/base/log/ace_scoring_log.h"
22 #include "frameworks/bridge/declarative_frontend/engine/functions/js_gesture_function.h"
23 #include "frameworks/core/gestures/timeout_gesture.h"
24 
25 namespace OHOS::Ace {
26 std::unique_ptr<GestureModel> GestureModel::instance_ = nullptr;
27 std::mutex GestureModel::mutex_;
GetInstance()28 GestureModel* GestureModel::GetInstance()
29 {
30     if (!instance_) {
31         std::lock_guard<std::mutex> lock(mutex_);
32         if (!instance_) {
33 #ifdef NG_BUILD
34             instance_.reset(new NG::GestureModelNG());
35 #else
36             if (Container::IsCurrentUseNewPipeline()) {
37                 instance_.reset(new NG::GestureModelNG());
38             } else {
39                 instance_.reset(new Framework::GestureModelImpl());
40             }
41 #endif
42         }
43     }
44     return instance_.get();
45 }
46 
47 std::unique_ptr<TapGestureModel> TapGestureModel::instance_ = nullptr;
48 std::mutex TapGestureModel::mutex_;
GetInstance()49 TapGestureModel* TapGestureModel::GetInstance()
50 {
51     if (!instance_) {
52         std::lock_guard<std::mutex> lock(mutex_);
53         if (!instance_) {
54 #ifdef NG_BUILD
55             instance_.reset(new NG::TapGestureModelNG());
56 #else
57             if (Container::IsCurrentUseNewPipeline()) {
58                 instance_.reset(new NG::TapGestureModelNG());
59             } else {
60                 instance_.reset(new Framework::TapGestureModelImpl());
61             }
62 #endif
63         }
64     }
65     return instance_.get();
66 }
67 
68 std::unique_ptr<LongPressGestureModel> LongPressGestureModel::instance_ = nullptr;
69 std::mutex LongPressGestureModel::mutex_;
GetInstance()70 LongPressGestureModel* LongPressGestureModel::GetInstance()
71 {
72     if (!instance_) {
73         std::lock_guard<std::mutex> lock(mutex_);
74         if (!instance_) {
75 #ifdef NG_BUILD
76             instance_.reset(new NG::LongPressGestureModelNG());
77 #else
78             if (Container::IsCurrentUseNewPipeline()) {
79                 instance_.reset(new NG::LongPressGestureModelNG());
80             } else {
81                 instance_.reset(new Framework::LongPressGestureModelImpl());
82             }
83 #endif
84         }
85     }
86     return instance_.get();
87 }
88 
89 std::unique_ptr<PanGestureModel> PanGestureModel::instance_ = nullptr;
90 std::mutex PanGestureModel::mutex_;
GetInstance()91 PanGestureModel* PanGestureModel::GetInstance()
92 {
93     if (!instance_) {
94         std::lock_guard<std::mutex> lock(mutex_);
95         if (!instance_) {
96 #ifdef NG_BUILD
97             instance_.reset(new NG::PanGestureModelNG());
98 #else
99             if (Container::IsCurrentUseNewPipeline()) {
100                 instance_.reset(new NG::PanGestureModelNG());
101             } else {
102                 instance_.reset(new Framework::PanGestureModelImpl());
103             }
104 #endif
105         }
106     }
107     return instance_.get();
108 }
109 
110 std::unique_ptr<SwipeGestureModel> SwipeGestureModel::instance_ = nullptr;
111 std::mutex SwipeGestureModel::mutex_;
GetInstance()112 SwipeGestureModel* SwipeGestureModel::GetInstance()
113 {
114     if (!instance_) {
115         std::lock_guard<std::mutex> lock(mutex_);
116         if (!instance_) {
117 #ifdef NG_BUILD
118             instance_.reset(new NG::SwipeGestureModelNG());
119 #else
120             if (Container::IsCurrentUseNewPipeline()) {
121                 instance_.reset(new NG::SwipeGestureModelNG());
122             } else {
123                 instance_.reset(new Framework::SwipeGestureModelImpl());
124             }
125 #endif
126         }
127     }
128     return instance_.get();
129 }
130 
131 std::unique_ptr<PinchGestureModel> PinchGestureModel::instance_ = nullptr;
132 std::mutex PinchGestureModel::mutex_;
GetInstance()133 PinchGestureModel* PinchGestureModel::GetInstance()
134 {
135     if (!instance_) {
136         std::lock_guard<std::mutex> lock(mutex_);
137         if (!instance_) {
138 #ifdef NG_BUILD
139             instance_.reset(new NG::PinchGestureModelNG());
140 #else
141             if (Container::IsCurrentUseNewPipeline()) {
142                 instance_.reset(new NG::PinchGestureModelNG());
143             } else {
144                 instance_.reset(new Framework::PinchGestureModelImpl());
145             }
146 #endif
147         }
148     }
149     return instance_.get();
150 }
151 
152 std::unique_ptr<RotationGestureModel> RotationGestureModel::instance_ = nullptr;
153 std::mutex RotationGestureModel::mutex_;
GetInstance()154 RotationGestureModel* RotationGestureModel::GetInstance()
155 {
156     if (!instance_) {
157         std::lock_guard<std::mutex> lock(mutex_);
158         if (!instance_) {
159 #ifdef NG_BUILD
160             instance_.reset(new NG::RotationGestureModelNG());
161 #else
162             if (Container::IsCurrentUseNewPipeline()) {
163                 instance_.reset(new NG::RotationGestureModelNG());
164             } else {
165                 instance_.reset(new Framework::RotationGestureModelImpl());
166             }
167 #endif
168         }
169     }
170     return instance_.get();
171 }
172 
173 std::unique_ptr<GestureGroupModel> GestureGroupModel::instance_ = nullptr;
174 std::mutex GestureGroupModel::mutex_;
GetInstance()175 GestureGroupModel* GestureGroupModel::GetInstance()
176 {
177     if (!instance_) {
178         std::lock_guard<std::mutex> lock(mutex_);
179         if (!instance_) {
180 #ifdef NG_BUILD
181             instance_.reset(new NG::GestureGroupModelNG());
182 #else
183             if (Container::IsCurrentUseNewPipeline()) {
184                 instance_.reset(new NG::GestureGroupModelNG());
185             } else {
186                 instance_.reset(new Framework::GestureGroupModelImpl());
187             }
188 #endif
189         }
190     }
191     return instance_.get();
192 }
193 
194 std::unique_ptr<TimeoutGestureModel> TimeoutGestureModel::instance_ = nullptr;
195 std::mutex TimeoutGestureModel::mutex_;
GetInstance()196 TimeoutGestureModel* TimeoutGestureModel::GetInstance()
197 {
198     if (!instance_) {
199         std::lock_guard<std::mutex> lock(mutex_);
200         if (!instance_) {
201 #ifdef NG_BUILD
202             instance_.reset(new NG::TimeoutGestureModelNG());
203 #else
204             if (Container::IsCurrentUseNewPipeline()) {
205                 instance_.reset(new NG::TimeoutGestureModelNG());
206             } else {
207                 instance_.reset(new Framework::TimeoutGestureModelImpl());
208             }
209 #endif
210         }
211     }
212     return instance_.get();
213 }
214 } // namespace OHOS::Ace
215 
216 namespace OHOS::Ace::Framework {
217 namespace {
218 constexpr int32_t DEFAULT_TAP_FINGER = 1;
219 constexpr int32_t DEFAULT_TAP_COUNT = 1;
220 constexpr int32_t DEFAULT_LONG_PRESS_FINGER = 1;
221 constexpr int32_t DEFAULT_LONG_PRESS_DURATION = 500;
222 constexpr int32_t DEFAULT_PINCH_FINGER = 2;
223 constexpr int32_t DEFAULT_MAX_PINCH_FINGER = 5;
224 constexpr double DEFAULT_PINCH_DISTANCE = 5.0;
225 constexpr int32_t DEFAULT_PAN_FINGER = 1;
226 constexpr int32_t DEFAULT_MAX_PAN_FINGERS = 10;
227 constexpr Dimension DEFAULT_PAN_DISTANCE = 5.0_vp;
228 constexpr int32_t DEFAULT_SLIDE_FINGER = DEFAULT_PAN_FINGER;
229 constexpr double DEFAULT_SLIDE_SPEED = 100.0;
230 constexpr int32_t DEFAULT_ROTATION_FINGER = 2;
231 constexpr double DEFAULT_ROTATION_ANGLE = 1.0;
232 
233 constexpr char GESTURE_FINGERS[] = "fingers";
234 constexpr char GESTURE_DISTANCE[] = "distance";
235 constexpr char GESTURE_SPEED[] = "speed";
236 constexpr char TAP_COUNT[] = "count";
237 constexpr char LONG_PRESS_REPEAT[] = "repeat";
238 constexpr char LONG_PRESS_DURATION[] = "duration";
239 constexpr char PAN_DIRECTION[] = "direction";
240 constexpr char SWIPE_DIRECTION[] = "direction";
241 constexpr char ROTATION_ANGLE[] = "angle";
242 } // namespace
243 
Create(const JSCallbackInfo & info)244 void JSGesture::Create(const JSCallbackInfo& info)
245 {
246     int32_t priorityNum = 0;
247     if (info.Length() > 0) {
248         auto jsPriorityNum = info[0];
249         if (jsPriorityNum->IsNumber()) {
250             priorityNum = jsPriorityNum->ToNumber<int32_t>();
251         }
252     }
253 
254     int32_t gestureMaskNum = 0;
255     if (info.Length() > 1) {
256         auto jsGestureMaskNum = info[1];
257         if (jsGestureMaskNum->IsNumber()) {
258             gestureMaskNum = jsGestureMaskNum->ToNumber<int32_t>();
259         }
260     }
261 
262     GestureModel::GetInstance()->Create(priorityNum, gestureMaskNum);
263 }
264 
Finish()265 void JSGesture::Finish()
266 {
267     GestureModel::GetInstance()->Finish();
268 }
269 
Pop()270 void JSGesture::Pop()
271 {
272     GestureModel::GetInstance()->Pop();
273 }
274 
Create(const JSCallbackInfo & args)275 void JSTapGesture::Create(const JSCallbackInfo& args)
276 {
277     int32_t countNum = DEFAULT_TAP_COUNT;
278     int32_t fingersNum = DEFAULT_TAP_FINGER;
279     if (args.Length() > 0 && args[0]->IsObject()) {
280         JSRef<JSObject> obj = JSRef<JSObject>::Cast(args[0]);
281         JSRef<JSVal> count = obj->GetProperty(TAP_COUNT);
282         JSRef<JSVal> fingers = obj->GetProperty(GESTURE_FINGERS);
283 
284         if (count->IsNumber()) {
285             int32_t countNumber = count->ToNumber<int32_t>();
286             countNum = countNumber <= DEFAULT_TAP_COUNT ? DEFAULT_TAP_COUNT : countNumber;
287         }
288         if (fingers->IsNumber()) {
289             int32_t fingersNumber = fingers->ToNumber<int32_t>();
290             fingersNum = fingersNumber <= DEFAULT_TAP_FINGER ? DEFAULT_TAP_FINGER : fingersNumber;
291         }
292     }
293 
294     TapGestureModel::GetInstance()->Create(countNum, fingersNum);
295 }
296 
Create(const JSCallbackInfo & args)297 void JSLongPressGesture::Create(const JSCallbackInfo& args)
298 {
299     int32_t fingersNum = DEFAULT_LONG_PRESS_FINGER;
300     bool repeatResult = false;
301     int32_t durationNum = DEFAULT_LONG_PRESS_DURATION;
302     if (args.Length() > 0 && args[0]->IsObject()) {
303         JSRef<JSObject> obj = JSRef<JSObject>::Cast(args[0]);
304         JSRef<JSVal> fingers = obj->GetProperty(GESTURE_FINGERS);
305         JSRef<JSVal> repeat = obj->GetProperty(LONG_PRESS_REPEAT);
306         JSRef<JSVal> duration = obj->GetProperty(LONG_PRESS_DURATION);
307 
308         if (fingers->IsNumber()) {
309             int32_t fingersNumber = fingers->ToNumber<int32_t>();
310             fingersNum = fingersNumber <= DEFAULT_LONG_PRESS_FINGER ? DEFAULT_LONG_PRESS_FINGER : fingersNumber;
311         }
312         if (repeat->IsBoolean()) {
313             repeatResult = repeat->ToBoolean();
314         }
315         if (duration->IsNumber()) {
316             int32_t durationNumber = duration->ToNumber<int32_t>();
317             durationNum = durationNumber <= 0 ? DEFAULT_LONG_PRESS_DURATION : durationNumber;
318         }
319     }
320 
321     LongPressGestureModel::GetInstance()->Create(fingersNum, repeatResult, durationNum);
322 }
323 
Create(const JSCallbackInfo & args)324 void JSPanGesture::Create(const JSCallbackInfo& args)
325 {
326     int32_t fingersNum = DEFAULT_PAN_FINGER;
327     double distanceNum = DEFAULT_PAN_DISTANCE.ConvertToPx();
328     PanDirection panDirection;
329     if (args.Length() <= 0 || !args[0]->IsObject()) {
330         PanGestureModel::GetInstance()->Create(fingersNum, panDirection, distanceNum);
331         return;
332     }
333 
334     JSRef<JSObject> obj = JSRef<JSObject>::Cast(args[0]);
335     JSPanGestureOption* panGestureOption = obj->Unwrap<JSPanGestureOption>();
336 
337     if (panGestureOption != nullptr) {
338         RefPtr<PanGestureOption> refPanGestureOption = panGestureOption->GetPanGestureOption();
339         PanGestureModel::GetInstance()->SetPanGestureOption(refPanGestureOption);
340         return;
341     }
342 
343     JSRef<JSVal> fingers = obj->GetProperty(GESTURE_FINGERS);
344     JSRef<JSVal> distance = obj->GetProperty(GESTURE_DISTANCE);
345     JSRef<JSVal> directionNum = obj->GetProperty(PAN_DIRECTION);
346 
347     if (fingers->IsNumber()) {
348         int32_t fingersNumber = fingers->ToNumber<int32_t>();
349         fingersNum = fingersNumber <= DEFAULT_PAN_FINGER ? DEFAULT_PAN_FINGER : fingersNumber;
350     }
351     if (distance->IsNumber()) {
352         double distanceNumber = distance->ToNumber<double>();
353         Dimension dimension =
354             LessNotEqual(distanceNumber, 0.0) ? DEFAULT_PAN_DISTANCE : Dimension(distanceNumber, DimensionUnit::VP);
355         distanceNum = dimension.ConvertToPx();
356     }
357     if (directionNum->IsNumber()) {
358         uint32_t directNum = directionNum->ToNumber<uint32_t>();
359         if (directNum >= static_cast<uint32_t>(PanDirection::NONE) &&
360             directNum <= static_cast<uint32_t>(PanDirection::ALL)) {
361             panDirection.type = directNum;
362         }
363     }
364 
365     PanGestureModel::GetInstance()->Create(fingersNum, panDirection, distanceNum);
366 }
367 
Create(const JSCallbackInfo & args)368 void JSSwipeGesture::Create(const JSCallbackInfo& args)
369 {
370     int32_t fingersNum = DEFAULT_SLIDE_FINGER;
371     double speedNum = DEFAULT_SLIDE_SPEED;
372     SwipeDirection slideDirection;
373 
374     if (args.Length() <= 0 || !args[0]->IsObject()) {
375         SwipeGestureModel::GetInstance()->Create(fingersNum, slideDirection, speedNum);
376         return;
377     }
378 
379     JSRef<JSObject> obj = JSRef<JSObject>::Cast(args[0]);
380     JSRef<JSVal> fingers = obj->GetProperty(GESTURE_FINGERS);
381     JSRef<JSVal> speed = obj->GetProperty(GESTURE_SPEED);
382     JSRef<JSVal> directionNum = obj->GetProperty(SWIPE_DIRECTION);
383 
384     if (fingers->IsNumber()) {
385         int32_t fingersNumber = fingers->ToNumber<int32_t>();
386         fingersNum = fingersNumber <= DEFAULT_PAN_FINGER ? DEFAULT_PAN_FINGER : fingersNumber;
387     }
388     if (speed->IsNumber()) {
389         double speedNumber = speed->ToNumber<double>();
390         speedNum = LessNotEqual(speedNumber, 0.0) ? DEFAULT_SLIDE_SPEED : speedNumber;
391     }
392     if (directionNum->IsNumber()) {
393         uint32_t directNum = directionNum->ToNumber<uint32_t>();
394         if (directNum >= static_cast<uint32_t>(SwipeDirection::NONE) &&
395             directNum <= static_cast<uint32_t>(SwipeDirection::ALL)) {
396             slideDirection.type = directNum;
397         }
398     }
399 
400     SwipeGestureModel::GetInstance()->Create(fingersNum, slideDirection, speedNum);
401 }
402 
Create(const JSCallbackInfo & args)403 void JSPinchGesture::Create(const JSCallbackInfo& args)
404 {
405     int32_t fingersNum = DEFAULT_PINCH_FINGER;
406     double distanceNum = DEFAULT_PINCH_DISTANCE;
407     if (args.Length() > 0 && args[0]->IsObject()) {
408         JSRef<JSObject> obj = JSRef<JSObject>::Cast(args[0]);
409         JSRef<JSVal> fingers = obj->GetProperty(GESTURE_FINGERS);
410         JSRef<JSVal> distance = obj->GetProperty(GESTURE_DISTANCE);
411 
412         if (fingers->IsNumber()) {
413             int32_t fingersNumber = fingers->ToNumber<int32_t>();
414             fingersNum = fingersNumber <= DEFAULT_PINCH_FINGER ? DEFAULT_PINCH_FINGER : fingersNumber;
415             fingersNum = fingersNum > DEFAULT_MAX_PINCH_FINGER ? DEFAULT_PINCH_FINGER : fingersNum;
416         }
417         if (distance->IsNumber()) {
418             double distanceNumber = distance->ToNumber<double>();
419             distanceNum = LessNotEqual(distanceNumber, 0.0) ? DEFAULT_PINCH_DISTANCE : distanceNumber;
420         }
421     }
422 
423     PinchGestureModel::GetInstance()->Create(fingersNum, distanceNum);
424 }
425 
Create(const JSCallbackInfo & args)426 void JSRotationGesture::Create(const JSCallbackInfo& args)
427 {
428     double angleNum = DEFAULT_ROTATION_ANGLE;
429     int32_t fingersNum = DEFAULT_ROTATION_FINGER;
430     if (args.Length() > 0 && args[0]->IsObject()) {
431         JSRef<JSObject> obj = JSRef<JSObject>::Cast(args[0]);
432         JSRef<JSVal> fingers = obj->GetProperty(GESTURE_FINGERS);
433         JSRef<JSVal> angle = obj->GetProperty(ROTATION_ANGLE);
434 
435         if (fingers->IsNumber()) {
436             int32_t fingersNumber = fingers->ToNumber<int32_t>();
437             fingersNum = fingersNumber <= DEFAULT_ROTATION_FINGER ? DEFAULT_ROTATION_FINGER : fingersNumber;
438         }
439         if (angle->IsNumber()) {
440             double angleNumber = angle->ToNumber<double>();
441             angleNum = LessNotEqual(angleNumber, 0.0) ? DEFAULT_ROTATION_ANGLE : angleNumber;
442         }
443     }
444 
445     RotationGestureModel::GetInstance()->Create(fingersNum, angleNum);
446 }
447 
Create(const JSCallbackInfo & args)448 void JSGestureGroup::Create(const JSCallbackInfo& args)
449 {
450     int32_t gestureMode = 0;
451     if (args.Length() > 0) {
452         auto jsGestureMode = args[0];
453         if (jsGestureMode->IsNumber()) {
454             gestureMode = jsGestureMode->ToNumber<int32_t>();
455         }
456     }
457 
458     GestureGroupModel::GetInstance()->Create(gestureMode);
459 }
460 
JsHandlerOnGestureEvent(Ace::GestureEventAction action,const JSCallbackInfo & args)461 void JSGesture::JsHandlerOnGestureEvent(Ace::GestureEventAction action, const JSCallbackInfo& args)
462 {
463     if (args.Length() < 1 || !args[0]->IsFunction()) {
464         return;
465     }
466 
467     RefPtr<JsGestureFunction> handlerFunc = AceType::MakeRefPtr<JsGestureFunction>(JSRef<JSFunc>::Cast(args[0]));
468 
469     if (action == Ace::GestureEventAction::CANCEL) {
470         auto onActionCancelFunc = [execCtx = args.GetExecutionContext(), func = std::move(handlerFunc)]() {
471             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
472             auto info = GestureEvent();
473             ACE_SCORING_EVENT("Gesture.onCancel");
474             func->Execute(info);
475         };
476         GestureModel::GetInstance()->SetOnGestureEvent(onActionCancelFunc);
477         return;
478     }
479 
480     auto onActionFunc = [execCtx = args.GetExecutionContext(), func = std::move(handlerFunc)](GestureEvent& info) {
481         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
482         ACE_SCORING_EVENT("Gesture.onActionCancel");
483         func->Execute(info);
484     };
485 
486     GestureModel::GetInstance()->SetOnActionFunc(onActionFunc, action);
487 }
488 
SetTag(const JSCallbackInfo & args)489 void JSGesture::SetTag(const JSCallbackInfo& args)
490 {
491     std::string tag;
492     if (args.Length() > 0) {
493         auto jsTag = args[0];
494         if (jsTag->IsString()) {
495             tag = jsTag->ToString();
496         }
497     }
498     GestureModel::GetInstance()->SetTag(tag);
499 }
500 
JsHandlerOnAction(const JSCallbackInfo & args)501 void JSGesture::JsHandlerOnAction(const JSCallbackInfo& args)
502 {
503     JSGesture::JsHandlerOnGestureEvent(Ace::GestureEventAction::ACTION, args);
504 }
JsHandlerOnActionStart(const JSCallbackInfo & args)505 void JSGesture::JsHandlerOnActionStart(const JSCallbackInfo& args)
506 {
507     JSGesture::JsHandlerOnGestureEvent(Ace::GestureEventAction::START, args);
508 }
JsHandlerOnActionUpdate(const JSCallbackInfo & args)509 void JSGesture::JsHandlerOnActionUpdate(const JSCallbackInfo& args)
510 {
511     JSGesture::JsHandlerOnGestureEvent(Ace::GestureEventAction::UPDATE, args);
512 }
513 
JsHandlerOnActionEnd(const JSCallbackInfo & args)514 void JSGesture::JsHandlerOnActionEnd(const JSCallbackInfo& args)
515 {
516     JSGesture::JsHandlerOnGestureEvent(Ace::GestureEventAction::END, args);
517 }
JsHandlerOnActionCancel(const JSCallbackInfo & args)518 void JSGesture::JsHandlerOnActionCancel(const JSCallbackInfo& args)
519 {
520     JSGesture::JsHandlerOnGestureEvent(Ace::GestureEventAction::CANCEL, args);
521 }
522 
JSBind(BindingTarget globalObj)523 void JSPanGestureOption::JSBind(BindingTarget globalObj)
524 {
525     JSClass<JSPanGestureOption>::Declare("PanGestureOption");
526     JSClass<JSPanGestureOption>::CustomMethod("setDirection", &JSPanGestureOption::SetDirection);
527     JSClass<JSPanGestureOption>::CustomMethod("setDistance", &JSPanGestureOption::SetDistance);
528     JSClass<JSPanGestureOption>::CustomMethod("setFingers", &JSPanGestureOption::SetFingers);
529     JSClass<JSPanGestureOption>::Bind(globalObj, &JSPanGestureOption::Constructor, &JSPanGestureOption::Destructor);
530 
531     JSClass<JSPanGestureOption>::Declare("PanGestureOptions");
532     JSClass<JSPanGestureOption>::CustomMethod("setDirection", &JSPanGestureOption::SetDirection);
533     JSClass<JSPanGestureOption>::CustomMethod("setDistance", &JSPanGestureOption::SetDistance);
534     JSClass<JSPanGestureOption>::CustomMethod("setFingers", &JSPanGestureOption::SetFingers);
535     JSClass<JSPanGestureOption>::Bind(globalObj, &JSPanGestureOption::Constructor, &JSPanGestureOption::Destructor);
536 }
537 
SetDirection(const JSCallbackInfo & args)538 void JSPanGestureOption::SetDirection(const JSCallbackInfo& args)
539 {
540     if (args.Length() > 0 && args[0]->IsNumber()) {
541         PanDirection direction = { args[0]->ToNumber<int32_t>() };
542         panGestureOption_->SetDirection(direction);
543     } else {
544         PanDirection directionAll = { PanDirection::ALL };
545         panGestureOption_->SetDirection(directionAll);
546     }
547 }
548 
SetDistance(const JSCallbackInfo & args)549 void JSPanGestureOption::SetDistance(const JSCallbackInfo& args)
550 {
551     if (args.Length() > 0 && args[0]->IsNumber()) {
552         auto distance = args[0]->ToNumber<double>();
553         Dimension dimension =
554             LessNotEqual(distance, 0.0) ? DEFAULT_PAN_DISTANCE : Dimension(distance, DimensionUnit::VP);
555         panGestureOption_->SetDistance(dimension.ConvertToPx());
556     } else {
557         panGestureOption_->SetDistance(DEFAULT_PAN_DISTANCE.ConvertToPx());
558     }
559 }
560 
SetFingers(const JSCallbackInfo & args)561 void JSPanGestureOption::SetFingers(const JSCallbackInfo& args)
562 {
563     if (args.Length() > 0 && args[0]->IsNumber()) {
564         auto fingers = args[0]->ToNumber<int32_t>();
565         fingers = fingers <= DEFAULT_PAN_FINGER ? DEFAULT_PAN_FINGER : fingers;
566         fingers = fingers > DEFAULT_MAX_PAN_FINGERS ? DEFAULT_PAN_FINGER : fingers;
567         panGestureOption_->SetFingers(fingers);
568     } else {
569         panGestureOption_->SetFingers(DEFAULT_PAN_FINGER);
570     }
571 }
572 
Constructor(const JSCallbackInfo & args)573 void JSPanGestureOption::Constructor(const JSCallbackInfo& args)
574 {
575     auto panGestureOption = Referenced::MakeRefPtr<JSPanGestureOption>();
576     panGestureOption->IncRefCount();
577     RefPtr<PanGestureOption> option = AceType::MakeRefPtr<PanGestureOption>();
578 
579     int32_t fingersNum = DEFAULT_PAN_FINGER;
580     double distanceNum = DEFAULT_PAN_DISTANCE.ConvertToPx();
581     PanDirection panDirection;
582 
583     if (args.Length() > 0 && args[0]->IsObject()) {
584         JSRef<JSObject> obj = JSRef<JSObject>::Cast(args[0]);
585         JSRef<JSVal> fingers = obj->GetProperty(GESTURE_FINGERS);
586         JSRef<JSVal> distance = obj->GetProperty(GESTURE_DISTANCE);
587         JSRef<JSVal> directionNum = obj->GetProperty(PAN_DIRECTION);
588 
589         if (fingers->IsNumber()) {
590             int32_t fingersNumber = fingers->ToNumber<int32_t>();
591             fingersNum = fingersNumber <= DEFAULT_PAN_FINGER ? DEFAULT_PAN_FINGER : fingersNumber;
592         }
593         if (distance->IsNumber()) {
594             double distanceNumber = distance->ToNumber<double>();
595             Dimension dimension =
596                 LessNotEqual(distanceNumber, 0.0) ? DEFAULT_PAN_DISTANCE : Dimension(distanceNumber, DimensionUnit::VP);
597             distanceNum = dimension.ConvertToPx();
598         }
599         if (directionNum->IsNumber()) {
600             uint32_t directNum = directionNum->ToNumber<uint32_t>();
601             if (directNum >= static_cast<uint32_t>(PanDirection::NONE) &&
602                 directNum <= static_cast<uint32_t>(PanDirection::ALL)) {
603                 panDirection.type = directNum;
604             }
605         }
606     }
607     option->SetDirection(panDirection);
608     option->SetDistance(distanceNum);
609     option->SetFingers(fingersNum);
610 
611     panGestureOption->SetPanGestureOption(option);
612     args.SetReturnValue(Referenced::RawPtr(panGestureOption));
613 }
614 
Destructor(JSPanGestureOption * panGestureOption)615 void JSPanGestureOption::Destructor(JSPanGestureOption* panGestureOption)
616 {
617     if (panGestureOption != nullptr) {
618         panGestureOption->DecRefCount();
619     }
620 }
621 
JSBind(BindingTarget globalObj)622 void JSGesture::JSBind(BindingTarget globalObj)
623 {
624     JSClass<JSGesture>::Declare("Gesture");
625     MethodOptions opt = MethodOptions::NONE;
626     JSClass<JSGesture>::StaticMethod("create", &JSGesture::Create, opt);
627     JSClass<JSGesture>::StaticMethod("pop", &JSGesture::Finish);
628     JSClass<JSGesture>::Bind<>(globalObj);
629 
630     JSClass<JSTapGesture>::Declare("TapGesture");
631     JSClass<JSTapGesture>::StaticMethod("create", &JSTapGesture::Create, opt);
632     JSClass<JSTapGesture>::StaticMethod("tag", &JSGesture::SetTag, opt);
633     JSClass<JSTapGesture>::StaticMethod("pop", &JSGesture::Pop);
634     JSClass<JSTapGesture>::StaticMethod("onAction", &JSGesture::JsHandlerOnAction);
635     JSClass<JSTapGesture>::StaticMethod("onActionUpdate", &JSGesture::JsHandlerOnActionUpdate);
636     JSClass<JSTapGesture>::Bind<>(globalObj);
637 
638     JSClass<JSLongPressGesture>::Declare("LongPressGesture");
639     JSClass<JSLongPressGesture>::StaticMethod("create", &JSLongPressGesture::Create, opt);
640     JSClass<JSLongPressGesture>::StaticMethod("tag", &JSGesture::SetTag, opt);
641     JSClass<JSLongPressGesture>::StaticMethod("pop", &JSGesture::Pop);
642     JSClass<JSLongPressGesture>::StaticMethod("onAction", &JSGesture::JsHandlerOnAction);
643     JSClass<JSLongPressGesture>::StaticMethod("onActionEnd", &JSGesture::JsHandlerOnActionEnd);
644     JSClass<JSLongPressGesture>::StaticMethod("onActionCancel", &JSGesture::JsHandlerOnActionCancel);
645     JSClass<JSLongPressGesture>::StaticMethod("onActionUpdate", &JSGesture::JsHandlerOnActionUpdate);
646     JSClass<JSLongPressGesture>::Bind(globalObj);
647 
648     JSClass<JSPanGesture>::Declare("PanGesture");
649     JSClass<JSPanGesture>::StaticMethod("create", &JSPanGesture::Create, opt);
650     JSClass<JSPanGesture>::StaticMethod("tag", &JSGesture::SetTag, opt);
651     JSClass<JSPanGesture>::StaticMethod("pop", &JSGesture::Pop);
652     JSClass<JSPanGesture>::StaticMethod("onActionStart", &JSGesture::JsHandlerOnActionStart);
653     JSClass<JSPanGesture>::StaticMethod("onActionUpdate", &JSGesture::JsHandlerOnActionUpdate);
654     JSClass<JSPanGesture>::StaticMethod("onActionEnd", &JSGesture::JsHandlerOnActionEnd);
655     JSClass<JSPanGesture>::StaticMethod("onActionCancel", &JSGesture::JsHandlerOnActionCancel);
656     JSClass<JSPanGesture>::Bind(globalObj);
657 
658     JSClass<JSSwipeGesture>::Declare("SwipeGesture");
659     JSClass<JSSwipeGesture>::StaticMethod("create", &JSSwipeGesture::Create, opt);
660     JSClass<JSSwipeGesture>::StaticMethod("tag", &JSGesture::SetTag, opt);
661     JSClass<JSSwipeGesture>::StaticMethod("pop", &JSGesture::Pop);
662     JSClass<JSSwipeGesture>::StaticMethod("onAction", &JSGesture::JsHandlerOnAction);
663     JSClass<JSSwipeGesture>::Bind(globalObj);
664 
665     JSClass<JSPinchGesture>::Declare("PinchGesture");
666     JSClass<JSPinchGesture>::StaticMethod("create", &JSPinchGesture::Create, opt);
667     JSClass<JSPinchGesture>::StaticMethod("tag", &JSGesture::SetTag, opt);
668     JSClass<JSPinchGesture>::StaticMethod("pop", &JSGesture::Pop);
669     JSClass<JSPinchGesture>::StaticMethod("onActionStart", &JSGesture::JsHandlerOnActionStart);
670     JSClass<JSPinchGesture>::StaticMethod("onActionUpdate", &JSGesture::JsHandlerOnActionUpdate);
671     JSClass<JSPinchGesture>::StaticMethod("onActionEnd", &JSGesture::JsHandlerOnActionEnd);
672     JSClass<JSPinchGesture>::StaticMethod("onActionCancel", &JSGesture::JsHandlerOnActionCancel);
673     JSClass<JSPinchGesture>::Bind(globalObj);
674 
675     JSClass<JSRotationGesture>::Declare("RotationGesture");
676     JSClass<JSRotationGesture>::StaticMethod("create", &JSRotationGesture::Create, opt);
677     JSClass<JSRotationGesture>::StaticMethod("tag", &JSGesture::SetTag, opt);
678     JSClass<JSRotationGesture>::StaticMethod("pop", &JSGesture::Pop);
679     JSClass<JSRotationGesture>::StaticMethod("onActionStart", &JSGesture::JsHandlerOnActionStart);
680     JSClass<JSRotationGesture>::StaticMethod("onActionUpdate", &JSGesture::JsHandlerOnActionUpdate);
681     JSClass<JSRotationGesture>::StaticMethod("onActionEnd", &JSGesture::JsHandlerOnActionEnd);
682     JSClass<JSRotationGesture>::StaticMethod("onActionCancel", &JSGesture::JsHandlerOnActionCancel);
683     JSClass<JSRotationGesture>::Bind(globalObj);
684 
685     JSClass<JSGestureGroup>::Declare("GestureGroup");
686     JSClass<JSGestureGroup>::StaticMethod("create", &JSGestureGroup::Create, opt);
687     JSClass<JSGestureGroup>::StaticMethod("pop", &JSGesture::Pop);
688     JSClass<JSGestureGroup>::StaticMethod("onCancel", &JSGesture::JsHandlerOnActionCancel);
689     JSClass<JSGestureGroup>::Bind<>(globalObj);
690 
691     JSClass<JSTimeoutGesture>::Declare("TimeoutGesture");
692     JSClass<JSTimeoutGesture>::StaticMethod("create", &JSTimeoutGesture::Create, opt);
693     JSClass<JSTimeoutGesture>::StaticMethod("pop", &JSGesture::Pop);
694 
695     JSClass<JSTimeoutGesture>::Bind<>(globalObj);
696 }
697 
Create(const JSCallbackInfo & args)698 void JSTimeoutGesture::Create(const JSCallbackInfo& args)
699 {
700     auto jsGesture = args[0];
701     if (!jsGesture->IsNumber()) {
702         return;
703     }
704 
705     RefPtr<GestureProcessor> gestureProcessor;
706     gestureProcessor = TimeoutGestureModel::GetInstance()->GetGestureProcessor();
707     auto gesture = AceType::MakeRefPtr<TimeoutGesture>(std::chrono::duration<float>(jsGesture->ToNumber<float>()));
708     gestureProcessor->PushGesture(gesture);
709 }
710 
JSBind(BindingTarget globalObj)711 void JSTimeoutGesture::JSBind(BindingTarget globalObj)
712 {
713     JSClass<JSTimeoutGesture>::Declare("TimeoutGesture");
714     MethodOptions opt = MethodOptions::NONE;
715     JSClass<JSTimeoutGesture>::StaticMethod("create", &JSTimeoutGesture::Create, opt);
716     JSClass<JSTimeoutGesture>::StaticMethod("pop", &JSGesture::Pop);
717 
718     JSClass<JSTimeoutGesture>::Bind<>(globalObj);
719 }
720 }; // namespace OHOS::Ace::Framework
721