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_tab_ffi.h"
17 
18 #include "cj_lambda.h"
19 
20 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
21 #include "core/components_ng/pattern/tabs/tab_content_model_ng.h"
22 #include "core/components_ng/pattern/tabs/tabs_model_ng.h"
23 
24 using namespace OHOS::Ace;
25 using namespace OHOS::FFI;
26 using namespace OHOS::Ace::Framework;
27 
28 namespace {
29 const std::vector<BarPosition> BAR_POSITIONS = { BarPosition::START, BarPosition::END };
30 const std::vector<TabBarMode> TAB_BAR_MODES = {
31     TabBarMode::FIXED, TabBarMode::SCROLLABLE
32     // not support TabBarMode::FIXED_START yet
33 };
34 } // namespace
35 
36 namespace OHOS::Ace::Framework {
37 
38 namespace {
39 
40 int32_t g_tabControllerId = 0;
41 
42 } // namespace
43 
TabsController()44 TabsController::TabsController() : FFIData()
45 {
46     controller_ = TabController::GetController(++g_tabControllerId);
47     swiperController_ = AceType::MakeRefPtr<SwiperController>();
48     LOGI("Native TabsController constructed: %{public}" PRId64, GetID());
49 }
50 
~TabsController()51 TabsController::~TabsController()
52 {
53     LOGI("Native TabsController Destroyed: %{public}" PRId64, GetID());
54 }
55 
ChangeIndex(int32_t index)56 void TabsController::ChangeIndex(int32_t index)
57 {
58     LOGI("Native TabsController %{public}" PRId64 "ChangeIndex: %{public}d", GetID(), index);
59     if (swiperController_) {
60         const auto& updateCubicCurveCallback = swiperController_->GetUpdateCubicCurveCallback();
61         if (updateCubicCurveCallback != nullptr) {
62             updateCubicCurveCallback();
63         }
64         swiperController_->SwipeTo(index);
65     }
66     if (controller_) {
67         controller_->SetIndexByController(index, false);
68     }
69 }
70 
71 } // namespace OHOS::Ace::Framework
72 
73 extern "C" {
FfiOHOSAceFrameworkTabsCreate(int32_t barPosition,int64_t controllerId,int32_t index)74 void FfiOHOSAceFrameworkTabsCreate(int32_t barPosition, int64_t controllerId, int32_t index)
75 {
76     if (!Utils::CheckParamsValid(barPosition, BAR_POSITIONS.size())) {
77         LOGE("invalid value for bar position");
78         return;
79     }
80     auto nativeTabsController = FFIData::GetData<TabsController>(controllerId);
81     if (nativeTabsController == nullptr) {
82         return;
83     }
84     RefPtr<TabController> tabController;
85     RefPtr<SwiperController> swiperController;
86 
87     tabController = nativeTabsController->GetController();
88     swiperController = nativeTabsController->GetSwiperController();
89     tabController->SetInitialIndex(index);
90     TabsModel::GetInstance()->Create(BAR_POSITIONS[barPosition], index, tabController, swiperController);
91 }
92 
FfiOHOSAceFrameworkTabsPop()93 void FfiOHOSAceFrameworkTabsPop()
94 {
95     TabsModel::GetInstance()->Pop();
96 }
97 
FfiOHOSAceFrameworkTabsSetBarWidth(double width,int32_t unit)98 void FfiOHOSAceFrameworkTabsSetBarWidth(double width, int32_t unit)
99 {
100     Dimension value(width, static_cast<DimensionUnit>(unit));
101     TabsModel::GetInstance()->SetTabBarWidth(value);
102 }
103 
FfiOHOSAceFrameworkTabsSetBarHeight(double height,int32_t unit)104 void FfiOHOSAceFrameworkTabsSetBarHeight(double height, int32_t unit)
105 {
106     Dimension value(height, static_cast<DimensionUnit>(unit));
107     TabsModel::GetInstance()->SetTabBarHeight(value);
108 }
109 
FfiOHOSAceFrameworkTabsSetBarMode(int32_t barMode)110 void FfiOHOSAceFrameworkTabsSetBarMode(int32_t barMode)
111 {
112     if (!Utils::CheckParamsValid(barMode, TAB_BAR_MODES.size())) {
113         LOGE("invalid value for tab bar mode");
114         return;
115     }
116     TabsModel::GetInstance()->SetTabBarMode(TAB_BAR_MODES[barMode]);
117 }
118 
FfiOHOSAceFrameworkTabsSetIndex(int32_t index)119 void FfiOHOSAceFrameworkTabsSetIndex(int32_t index)
120 {
121     TabsModel::GetInstance()->SetIndex(index);
122 }
123 
FfiOHOSAceFrameworkTabsSetVertical(bool isVertical)124 void FfiOHOSAceFrameworkTabsSetVertical(bool isVertical)
125 {
126     TabsModel::GetInstance()->SetIsVertical(isVertical);
127 }
128 
FfiOHOSAceFrameworkTabsSetScrollable(bool isScrollable)129 void FfiOHOSAceFrameworkTabsSetScrollable(bool isScrollable)
130 {
131     TabsModel::GetInstance()->SetScrollable(isScrollable);
132 }
133 
FfiOHOSAceFrameworkTabsSetAnimationDuration(float duration)134 void FfiOHOSAceFrameworkTabsSetAnimationDuration(float duration)
135 {
136     TabsModel::GetInstance()->SetAnimationDuration(duration);
137 }
138 
FfiOHOSAceFrameworkTabsOnChange(void (* callback)(int32_t index))139 void FfiOHOSAceFrameworkTabsOnChange(void (*callback)(int32_t index))
140 {
141     auto onChange = [lambda = CJLambda::Create(callback)](const BaseEventInfo* info) {
142         const auto* tabsInfo = TypeInfoHelper::DynamicCast<TabContentChangeEvent>(info);
143         if (!tabsInfo) {
144             LOGE("HandleChangeEvent tabsInfo == nullptr");
145             return;
146         }
147         lambda(tabsInfo->GetIndex());
148     };
149     TabsModel::GetInstance()->SetOnChange(std::move(onChange));
150 }
151 
FfiOHOSAceFrameworkTabsControllerCtor()152 int64_t FfiOHOSAceFrameworkTabsControllerCtor()
153 {
154     auto ret_ = FFIData::Create<TabsController>();
155     return ret_->GetID();
156 }
157 
FfiOHOSAceFrameworkTabsControllerChangeIndex(int64_t selfId,int32_t index)158 void FfiOHOSAceFrameworkTabsControllerChangeIndex(int64_t selfId, int32_t index)
159 {
160     auto self_ = FFIData::GetData<TabsController>(selfId);
161     if (self_ != nullptr) {
162         self_->ChangeIndex(index);
163     }
164 }
165 
FfiOHOSAceFrameworkTabContentCreate()166 void FfiOHOSAceFrameworkTabContentCreate()
167 {
168     TabContentModel::GetInstance()->Create();
169 }
170 
FfiOHOSAceFrameworkTabContentPop()171 void FfiOHOSAceFrameworkTabContentPop()
172 {
173     TabContentModel::GetInstance()->Pop();
174 }
175 
FfiOHOSAceFrameworkTabContentSetTabBar(const char * content)176 void FfiOHOSAceFrameworkTabContentSetTabBar(const char* content)
177 {
178     TabContentModel::GetInstance()->SetTabBar(content, std::nullopt, std::nullopt, nullptr, true);
179 }
180 
FfiOHOSAceFrameworkTabContentSetTabBarWithIcon(const char * icon,const char * text)181 void FfiOHOSAceFrameworkTabContentSetTabBarWithIcon(const char* icon, const char* text)
182 {
183     TabContentModel::GetInstance()->SetTabBar(text, icon, std::nullopt, nullptr, false);
184 }
185 
FfiOHOSAceFrameworkTabContentSetTabBarWithComponent(void (* callback)())186 void FfiOHOSAceFrameworkTabContentSetTabBarWithComponent(void (*callback)())
187 {
188     TabContentModel::GetInstance()->SetTabBar(
189         std::nullopt, std::nullopt, std::nullopt, CJLambda::Create(callback), false);
190 }
191 
FfiOHOSAceFrameworkTabContentPUCreate(void (* callback)())192 void FfiOHOSAceFrameworkTabContentPUCreate(void (*callback)())
193 {
194     auto childBuild = CJLambda::Create(callback);
195     TabContentModel::GetInstance()->Create(std::move(childBuild));
196 }
197 }
198