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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_STEPPER_STEPPER_EVENT_HUB_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_STEPPER_STEPPER_EVENT_HUB_H
18 
19 #include "core/components_ng/event/event_hub.h"
20 #include "core/common/recorder/event_recorder.h"
21 #include "core/components_ng/base/frame_node.h"
22 
23 namespace OHOS::Ace::NG {
24 
25 using RoutineCallbackEvent = std::function<void()>;
26 using IndexCallbackEvent = std::function<void(int32_t, int32_t)>;
27 using IndexChangeEvent = std::function<void(int32_t)>;
28 
29 class StepperEventHub : public EventHub {
30     DECLARE_ACE_TYPE(StepperEventHub, EventHub)
31 
32 public:
33     StepperEventHub() = default;
34     ~StepperEventHub() override = default;
35 
SetFinishEvent(RoutineCallbackEvent && finishEvent)36     void SetFinishEvent(RoutineCallbackEvent&& finishEvent)
37     {
38         finishEvent_ = finishEvent;
39     }
SetSkipEvent(RoutineCallbackEvent && skipEvent)40     void SetSkipEvent(RoutineCallbackEvent&& skipEvent)
41     {
42         skipEvent_ = skipEvent;
43     }
SetChangeEvent(IndexCallbackEvent && changeEvent)44     void SetChangeEvent(IndexCallbackEvent&& changeEvent)
45     {
46         changeEvent_ = changeEvent;
47     }
SetNextEvent(IndexCallbackEvent && nextEvent)48     void SetNextEvent(IndexCallbackEvent&& nextEvent)
49     {
50         nextEvent_ = nextEvent;
51     }
SetPreviousEvent(IndexCallbackEvent && previousEvent)52     void SetPreviousEvent(IndexCallbackEvent&& previousEvent)
53     {
54         previousEvent_ = previousEvent;
55     }
56 
FireFinishEvent(int32_t index)57     void FireFinishEvent(int32_t index) const
58     {
59         if (finishEvent_) {
60             finishEvent_();
61         }
62         RecordEvent(Recorder::EventType::STEPPER_FINISH, index);
63     }
FireSkipEvent(int32_t index)64     void FireSkipEvent(int32_t index) const
65     {
66         if (skipEvent_) {
67             skipEvent_();
68         }
69         RecordEvent(Recorder::EventType::STEPPER_SKIP, index);
70     }
FireChangeEvent(int32_t prevIndex,int32_t index)71     void FireChangeEvent(int32_t prevIndex, int32_t index) const
72     {
73         if (onChangeEvent_) {
74             onChangeEvent_(index);
75         }
76         if (changeEvent_) {
77             changeEvent_(prevIndex, index);
78         }
79     }
FireNextEvent(int32_t index,int32_t pendingIndex)80     void FireNextEvent(int32_t index, int32_t pendingIndex) const
81     {
82         if (nextEvent_) {
83             nextEvent_(index, pendingIndex);
84         }
85         RecordEvent(Recorder::EventType::STEPPER_NEXT, index);
86     }
FirePreviousEvent(int32_t index,int32_t pendingIndex)87     void FirePreviousEvent(int32_t index, int32_t pendingIndex) const
88     {
89         if (previousEvent_) {
90             previousEvent_(index, pendingIndex);
91         }
92         RecordEvent(Recorder::EventType::STEPPER_PREVIOUS, index);
93     }
SetOnChangeEvent(IndexChangeEvent && onChangeEvent)94     void SetOnChangeEvent(IndexChangeEvent&& onChangeEvent)
95     {
96         onChangeEvent_ = onChangeEvent;
97     }
98 
99 private:
RecordEvent(Recorder::EventType eventType,int32_t index)100     void RecordEvent(Recorder::EventType eventType, int32_t index) const
101     {
102         if (!Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
103             return;
104         }
105         Recorder::EventParamsBuilder builder;
106         auto host = GetFrameNode();
107         if (host) {
108             auto id = host->GetInspectorIdValue("");
109             builder.SetId(id).SetType(host->GetHostTag()).SetDescription(host->GetAutoEventParamValue(""));
110         }
111         builder.SetEventType(eventType).SetIndex(index);
112         Recorder::EventRecorder::Get().OnEvent(std::move(builder));
113     }
114 
115     RoutineCallbackEvent finishEvent_;
116     RoutineCallbackEvent skipEvent_;
117     IndexCallbackEvent changeEvent_;
118     IndexCallbackEvent nextEvent_;
119     IndexCallbackEvent previousEvent_;
120     IndexChangeEvent onChangeEvent_;
121 
122     ACE_DISALLOW_COPY_AND_MOVE(StepperEventHub);
123 };
124 
125 } // namespace OHOS::Ace::NG
126 
127 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_STEPPER_STEPPER_EVENT_HUB_H
128