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