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_navigation_ffi.h"
17 
18 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_collection_ffi.h"
19 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
20 #include "core/components_ng/pattern/navigation/navigation_model.h"
21 #include "core/components_ng/base/view_stack_processor.h"
22 #include "cj_lambda.h"
23 
24 using namespace OHOS::Ace;
25 using namespace OHOS::Ace::Framework;
26 
27 namespace OHOS::Ace {
28 
ParseBarItems(const std::vector<NavigationItem> & items,std::vector<NG::BarItem> & barItems)29 void ParseBarItems(const std::vector<NavigationItem> &items, std::vector<NG::BarItem>& barItems)
30 {
31     for (size_t i = 0; i < items.size(); i++) {
32         NG::BarItem toolBarItem;
33         toolBarItem.text = items[i].value;
34         toolBarItem.icon = items[i].icon;
35         auto builderFunc = items[i].builder;
36         auto onItemClick = [func = std::move(builderFunc)]() {
37             func();
38         };
39         LOGD("ParseBarItems text: %{public}s, icon: %{public}s", toolBarItem.text->c_str(), toolBarItem.icon->c_str());
40         toolBarItem.action = onItemClick;
41         barItems.push_back(toolBarItem);
42     }
43 }
44 
45 }
46 extern "C" {
FfiOHOSAceFrameworkNavigationCreate()47 void FfiOHOSAceFrameworkNavigationCreate()
48 {
49     NavigationModel::GetInstance()->Create();
50 }
51 
FfiOHOSAceFrameworkNavigationSetTitle(const char * title)52 void FfiOHOSAceFrameworkNavigationSetTitle(const char *title)
53 {
54     NavigationModel::GetInstance()->SetTitle(title);
55 }
56 
FfiOHOSAceFrameworkNavigationSetTitleWithBuilder(void (* builder)())57 void FfiOHOSAceFrameworkNavigationSetTitleWithBuilder(void (*builder)())
58 {
59     auto builderFunc = CJLambda::Create(builder);
60     RefPtr<NG::UINode> customNode;
61     {
62         NG::ScopedViewStackProcessor builderViewStackProcessor;
63         builderFunc();
64         customNode = NG::ViewStackProcessor::GetInstance()->Finish();
65     }
66     NavigationModel::GetInstance()->SetCustomTitle(customNode);
67 }
68 
FfiOHOSAceFrameworkNavigationSetSubTitle(const char * subTitle)69 void FfiOHOSAceFrameworkNavigationSetSubTitle(const char *subTitle)
70 {
71     NavigationModel::GetInstance()->SetSubtitle(subTitle);
72 }
73 
FfiOHOSAceFrameworkNavigationSetMenus(VectorNavigationItemHandle menus)74 void FfiOHOSAceFrameworkNavigationSetMenus(VectorNavigationItemHandle menus)
75 {
76     const auto &menuVector = *reinterpret_cast<std::vector<NavigationItem> *>(menus);
77     std::vector<NG::BarItem> menuItems;
78     ParseBarItems(menuVector, menuItems);
79     NavigationModel::GetInstance()->SetMenuItems(std::move(menuItems));
80 }
81 
FfiOHOSAceFrameworkNavigationSetMenusWithBuilder(void (* builder)())82 void FfiOHOSAceFrameworkNavigationSetMenusWithBuilder(void (*builder)())
83 {
84     auto builderFunc = CJLambda::Create(builder);
85     RefPtr<NG::UINode> customNode;
86     {
87         NG::ScopedViewStackProcessor builderViewStackProcessor;
88         builderFunc();
89         customNode = NG::ViewStackProcessor::GetInstance()->Finish();
90     }
91     NavigationModel::GetInstance()->SetCustomMenu(customNode);
92 }
93 
FfiOHOSAceFrameworkNavigationSetTitleMode(int32_t titleMode)94 void FfiOHOSAceFrameworkNavigationSetTitleMode(int32_t titleMode)
95 {
96     NavigationModel::GetInstance()->SetTitleMode(static_cast<NG::NavigationTitleMode>(titleMode));
97 }
98 
FfiOHOSAceFrameworkNavigationSetToolBar(VectorNavigationItemHandle toolBars)99 void FfiOHOSAceFrameworkNavigationSetToolBar(VectorNavigationItemHandle toolBars)
100 {
101     const auto &toolBarVector = *reinterpret_cast<std::vector<NavigationItem> *>(toolBars);
102     std::vector<NG::BarItem> toolBarItems;
103     ParseBarItems(toolBarVector, toolBarItems);
104     NavigationModel::GetInstance()->SetToolBarItems(std::move(toolBarItems));
105 }
106 
FfiOHOSAceFrameworkNavigationSetToolBarWithBuilder(void (* builder)())107 void FfiOHOSAceFrameworkNavigationSetToolBarWithBuilder(void (*builder)())
108 {
109     auto builderFunc = CJLambda::Create(builder);
110     RefPtr<NG::UINode> customNode;
111     {
112         NG::ScopedViewStackProcessor builderViewStackProcessor;
113         builderFunc();
114         customNode = NG::ViewStackProcessor::GetInstance()->Finish();
115     }
116     NavigationModel::GetInstance()->SetCustomToolBar(customNode);
117 }
118 
FfiOHOSAceFrameworkNavigationSetHideToolBar(bool isHide)119 void FfiOHOSAceFrameworkNavigationSetHideToolBar(bool isHide)
120 {
121     NavigationModel::GetInstance()->SetHideToolBar(isHide);
122 }
123 
FfiOHOSAceFrameworkNavigationSetHideTitleBar(bool isHide)124 void FfiOHOSAceFrameworkNavigationSetHideTitleBar(bool isHide)
125 {
126     NavigationModel::GetInstance()->SetHideTitleBar(isHide);
127 }
128 
FfiOHOSAceFrameworkNavigationSetHideBackButton(bool isHide)129 void FfiOHOSAceFrameworkNavigationSetHideBackButton(bool isHide)
130 {
131     NavigationModel::GetInstance()->SetHideBackButton(isHide);
132 }
133 
FfiOHOSAceFrameworkNavigationSetOnTitleModeChanged(void (* callback)(int32_t))134 void FfiOHOSAceFrameworkNavigationSetOnTitleModeChanged(void (*callback)(int32_t))
135 {
136     auto onChange = CJLambda::Create(callback);
137     auto onTitleModeChange = [func = std::move(onChange)](NG::NavigationTitleMode mode) {
138         func(static_cast<int32_t>(mode));
139     };
140     NavigationModel::GetInstance()->SetOnTitleModeChange(std::move(onTitleModeChange), [](auto) {});
141 }
142 }
143