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 "cj_side_bar_container_ffi.h"
17 
18 #include "base/geometry/dimension.h"
19 #include "cj_lambda.h"
20 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
21 #include "core/components_ng/base/view_abstract.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/side_bar/side_bar_container_model.h"
24 
25 using namespace OHOS::Ace;
26 using namespace OHOS::Ace::Framework;
27 
28 namespace {
29 constexpr Dimension DEFAULT_CONTROL_BUTTON_WIDTH = 32.0_vp;
30 constexpr Dimension DEFAULT_CONTROL_BUTTON_HEIGHT = 32.0_vp;
31 constexpr Dimension DEFAULT_SIDE_BAR_WIDTH = 200.0_vp;
32 constexpr Dimension DEFAULT_MIN_SIDE_BAR_WIDTH = 200.0_vp;
33 constexpr Dimension DEFAULT_MAX_SIDE_BAR_WIDTH = 280.0_vp;
34 
35 enum class CJWidthType : uint32_t {
36     SIDEBAR_WIDTH = 0,
37     MIN_SIDEBAR_WIDTH,
38     MAX_SIDEBAR_WIDTH,
39 };
40 
41 const std::vector<SideBarContainerType> SIDE_BAR_TYPE = { SideBarContainerType::EMBED, SideBarContainerType::OVERLAY };
42 const std::vector<SideBarPosition> SIDE_BAR_POSITION = { SideBarPosition::START, SideBarPosition::END };
43 
ParseAndSetWidth(Dimension dimension,CJWidthType widthType)44 void ParseAndSetWidth(Dimension dimension, CJWidthType widthType)
45 {
46     switch (widthType) {
47         case CJWidthType::SIDEBAR_WIDTH:
48             SideBarContainerModel::GetInstance()->SetSideBarWidth(
49                 dimension.IsNonNegative() ? dimension : DEFAULT_SIDE_BAR_WIDTH);
50             break;
51         case CJWidthType::MIN_SIDEBAR_WIDTH:
52             SideBarContainerModel::GetInstance()->SetMinSideBarWidth(
53                 dimension.IsNonNegative() ? dimension : DEFAULT_MIN_SIDE_BAR_WIDTH);
54             break;
55         case CJWidthType::MAX_SIDEBAR_WIDTH:
56             SideBarContainerModel::GetInstance()->SetMaxSideBarWidth(
57                 dimension.IsNonNegative() ? dimension : DEFAULT_MAX_SIDE_BAR_WIDTH);
58             break;
59         default:
60             break;
61     }
62 }
63 } // namespace
64 
65 extern "C" {
FfiOHOSAceFrameworkSideBarCreate(int32_t type)66 void FfiOHOSAceFrameworkSideBarCreate(int32_t type)
67 {
68     if (!Utils::CheckParamsValid(type, SIDE_BAR_TYPE.size())) {
69         LOGE("invalid value for sidebar type");
70         return;
71     }
72     SideBarContainerModel::GetInstance()->Create();
73     SideBarContainerType style = static_cast<SideBarContainerType>(type);
74     SideBarContainerModel::GetInstance()->SetSideBarContainerType(style);
75 }
FfiOHOSAceFrameworkSideBarShowSideBar(bool isShow)76 void FfiOHOSAceFrameworkSideBarShowSideBar(bool isShow)
77 {
78     SideBarContainerModel::GetInstance()->SetShowSideBar(isShow);
79 }
FfiOHOSAceFrameworkSideBarControlButton(CJSideBarButtonStyle style)80 void FfiOHOSAceFrameworkSideBarControlButton(CJSideBarButtonStyle style)
81 {
82     auto controlButtonWidth = Dimension(style.width, DimensionUnit::VP);
83     if (LessNotEqual(controlButtonWidth.Value(), 0.0)) {
84         controlButtonWidth = DEFAULT_CONTROL_BUTTON_WIDTH;
85     }
86     SideBarContainerModel::GetInstance()->SetControlButtonWidth(controlButtonWidth);
87 
88     auto controlButtonHeight = Dimension(style.height, DimensionUnit::VP);
89     if (LessNotEqual(controlButtonHeight.Value(), 0.0)) {
90         controlButtonHeight = DEFAULT_CONTROL_BUTTON_HEIGHT;
91     }
92     SideBarContainerModel::GetInstance()->SetControlButtonHeight(controlButtonHeight);
93     SideBarContainerModel::GetInstance()->SetControlButtonLeft(Dimension(style.left, DimensionUnit::VP));
94     SideBarContainerModel::GetInstance()->SetControlButtonTop(Dimension(style.top, DimensionUnit::VP));
95 
96     auto iconsInfo = style.icons;
97     if (iconsInfo.shown) {
98         SideBarContainerModel::GetInstance()->SetControlButtonShowIconInfo(iconsInfo.shown, false, nullptr);
99     }
100     if (iconsInfo.hidden) {
101         SideBarContainerModel::GetInstance()->SetControlButtonHiddenIconInfo(iconsInfo.hidden, false, nullptr);
102     }
103     if (iconsInfo.switching) {
104         SideBarContainerModel::GetInstance()->SetControlButtonSwitchingIconInfo(iconsInfo.switching, false, nullptr);
105     }
106 }
FfiOHOSAceFrameworkSideBarShowControlButton(bool isShow)107 void FfiOHOSAceFrameworkSideBarShowControlButton(bool isShow)
108 {
109     SideBarContainerModel::GetInstance()->SetShowControlButton(isShow);
110 }
FfiOHOSAceFrameworkSideBarOnChange(void (* callback)(bool isShow))111 void FfiOHOSAceFrameworkSideBarOnChange(void (*callback)(bool isShow))
112 {
113     auto onChange = [ffiCallback = CJLambda::Create(callback)](bool isShow) { ffiCallback(isShow); };
114     SideBarContainerModel::GetInstance()->SetOnChange(std::move(onChange));
115 }
116 
FfiOHOSAceFrameworkSideBarSideBarWidth(double width,int32_t unit)117 void FfiOHOSAceFrameworkSideBarSideBarWidth(double width, int32_t unit)
118 {
119     ParseAndSetWidth(Dimension(width, static_cast<DimensionUnit>(unit)), CJWidthType::SIDEBAR_WIDTH);
120 }
121 
FfiOHOSAceFrameworkSideBarMinSideBarWidth(double width,int32_t unit)122 void FfiOHOSAceFrameworkSideBarMinSideBarWidth(double width, int32_t unit)
123 {
124     ParseAndSetWidth(Dimension(width, static_cast<DimensionUnit>(unit)), CJWidthType::MIN_SIDEBAR_WIDTH);
125 }
FfiOHOSAceFrameworkSideBarMaxSideBarWidth(double width,int32_t unit)126 void FfiOHOSAceFrameworkSideBarMaxSideBarWidth(double width, int32_t unit)
127 {
128     ParseAndSetWidth(Dimension(width, static_cast<DimensionUnit>(unit)), CJWidthType::MAX_SIDEBAR_WIDTH);
129 }
FfiOHOSAceFrameworkSideBarAutoHide(bool autoHide)130 void FfiOHOSAceFrameworkSideBarAutoHide(bool autoHide)
131 {
132     SideBarContainerModel::GetInstance()->SetAutoHide(autoHide);
133 }
FfiOHOSAceFrameworkSideBarSideBarPosition(int32_t position)134 void FfiOHOSAceFrameworkSideBarSideBarPosition(int32_t position)
135 {
136     if (!Utils::CheckParamsValid(position, SIDE_BAR_POSITION.size())) {
137         LOGE("invalid value for sidebar position");
138         return;
139     }
140     SideBarPosition sideBarPosition = static_cast<SideBarPosition>(position);
141     SideBarContainerModel::GetInstance()->SetSideBarPosition(sideBarPosition);
142 }
FfiOHOSAceFrameworkSideBarPop()143 void FfiOHOSAceFrameworkSideBarPop()
144 {
145     NG::ViewStackProcessor::GetInstance()->PopContainer();
146 }
147 }
148