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_texttimer_ffi.h"
17 
18 #include "cj_lambda.h"
19 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_view_abstract_ffi.h"
20 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
21 #include "bridge/common/utils/utils.h"
22 
23 using namespace OHOS::Ace;
24 using namespace OHOS::FFI;
25 using namespace OHOS::Ace::Framework;
26 
27 namespace OHOS::Ace::Framework {
28 
NativeTextTimerController()29 NativeTextTimerController::NativeTextTimerController() : FFIData()
30 {
31     LOGI("Native TextAreaController constructed: %{public}" PRId64, GetID());
32 }
33 
Start()34 void NativeTextTimerController::Start()
35 {
36     if (controller_) {
37         controller_->Start();
38     }
39 }
40 
Pause()41 void NativeTextTimerController::Pause()
42 {
43     if (controller_) {
44         controller_->Pause();
45     }
46 }
47 
Reset()48 void NativeTextTimerController::Reset()
49 {
50     if (controller_) {
51         controller_->Reset();
52     }
53 }
54 
55 namespace {
56 const std::vector<FontStyle> FONT_STYLES = { FontStyle::NORMAL, FontStyle::ITALIC };
57 constexpr double MAX_COUNT_DOWN = 86400000.0;
58 } // namespace
59 
60 } // namespace OHOS::Ace::Framework
61 
62 extern "C" {
FfiOHOSAceFrameworkTextTimerCreate(bool isCountDown,int64_t count,int64_t controllerId)63 void FfiOHOSAceFrameworkTextTimerCreate(bool isCountDown, int64_t count, int64_t controllerId)
64 {
65     auto textTimer = TextTimerModel::GetInstance()->Create();
66 
67     TextTimerModel::GetInstance()->SetIsCountDown(isCountDown);
68     if (isCountDown) {
69         if (count > 0 && count < MAX_COUNT_DOWN) {
70             TextTimerModel::GetInstance()->SetInputCount(count);
71         } else {
72             LOGE("Parameter out of range, use default value.");
73         }
74     }
75 
76     auto controller = FFIData::GetData<NativeTextTimerController>(controllerId);
77     if (controller != nullptr) {
78         controller->SetController(textTimer);
79     } else {
80         LOGE("textTimerControllerId is invalid ");
81     }
82 }
83 
FfiOHOSAceFrameworkTextTimerSetFormat(const char * value)84 void FfiOHOSAceFrameworkTextTimerSetFormat(const char* value)
85 {
86     std::string valueString = static_cast<std::string>(value);
87     std::regex pattern(
88         R"(^([Yy]*[_|\W\s]*[M]*[_|\W\s]*[d]*[_|\W\s]*[D]*[_|\W\s]*[Hh]*[_|\W\s]*[m]*[_|\W\s]*[s]*[_|\W\s]*[S]*)$)");
89     if (!std::regex_match(value, pattern)) {
90         LOGE("The arg is wrong, because of format matching error.");
91         return;
92     }
93     TextTimerModel::GetInstance()->SetFormat(valueString);
94 }
95 
FfiOHOSAceFrameworkTextTimerSetFontSize(double fontSize,int32_t unit)96 void FfiOHOSAceFrameworkTextTimerSetFontSize(double fontSize, int32_t unit)
97 {
98     Dimension value(fontSize, static_cast<DimensionUnit>(unit));
99     TextTimerModel::GetInstance()->SetFontSize(value);
100 }
101 
FfiOHOSAceFrameworkTextTimerSetFontWeight(const char * fontWeight)102 void FfiOHOSAceFrameworkTextTimerSetFontWeight(const char* fontWeight)
103 {
104     TextTimerModel::GetInstance()->SetFontWeight(ConvertStrToFontWeight(fontWeight));
105 }
106 
FfiOHOSAceFrameworkTextTimerSetFontColor(uint32_t textColor)107 void FfiOHOSAceFrameworkTextTimerSetFontColor(uint32_t textColor)
108 {
109     TextTimerModel::GetInstance()->SetTextColor(Color(textColor));
110 }
111 
FfiOHOSAceFrameworkTextTimerSetFontStyle(int32_t fontStyle)112 void FfiOHOSAceFrameworkTextTimerSetFontStyle(int32_t fontStyle)
113 {
114     if (!Utils::CheckParamsValid(fontStyle, FONT_STYLES.size())) {
115         LOGE("invalid value for font style");
116         return;
117     }
118     TextTimerModel::GetInstance()->SetItalicFontStyle(FONT_STYLES[fontStyle]);
119 }
120 
FfiOHOSAceFrameworkTextTimerSetFontFamily(const char * fontFamily)121 void FfiOHOSAceFrameworkTextTimerSetFontFamily(const char* fontFamily)
122 {
123     std::vector<std::string> fontFamilies;
124     fontFamilies = ConvertStrToFontFamilies(fontFamily);
125     TextTimerModel::GetInstance()->SetFontFamily(fontFamilies);
126 }
127 
FfiOHOSAceFrameworkTextTimerSetOnTimer(void (* callback)(int64_t utc,int64_t elapsedTime))128 void FfiOHOSAceFrameworkTextTimerSetOnTimer(void (*callback)(int64_t utc, int64_t elapsedTime))
129 {
130     auto lambda = [lambda = CJLambda::Create(callback)](const long utc,
131                       const long elapsedTime) -> void { lambda(utc, elapsedTime); };
132     TextTimerModel::GetInstance()->SetOnTimer(lambda);
133 }
134 
FfiOHOSAceFrameworkTextTimerControllerCtor()135 int64_t FfiOHOSAceFrameworkTextTimerControllerCtor()
136 {
137     auto controller = FFIData::Create<NativeTextTimerController>();
138     if (controller == nullptr) {
139         return FFI_ERROR_CODE;
140     }
141     return controller->GetID();
142 }
143 
FfiOHOSAceFrameworkTextTimerControllerStart(int64_t selfID)144 void FfiOHOSAceFrameworkTextTimerControllerStart(int64_t selfID)
145 {
146     auto self = FFIData::GetData<NativeTextTimerController>(selfID);
147     if (self != nullptr) {
148         self->Start();
149     } else {
150         LOGE("FfiTextArea: invalid textTimerController");
151     }
152 }
153 
FfiOHOSAceFrameworkTextTimerControllerPause(int64_t selfID)154 void FfiOHOSAceFrameworkTextTimerControllerPause(int64_t selfID)
155 {
156     auto self = FFIData::GetData<NativeTextTimerController>(selfID);
157     if (self != nullptr) {
158         self->Pause();
159     } else {
160         LOGE("FfiTextArea: invalid textTimerController");
161     }
162 }
163 
FfiOHOSAceFrameworkTextTimerControllerReset(int64_t selfID)164 void FfiOHOSAceFrameworkTextTimerControllerReset(int64_t selfID)
165 {
166     auto self = FFIData::GetData<NativeTextTimerController>(selfID);
167     if (self != nullptr) {
168         self->Reset();
169     } else {
170         LOGE("FfiTextArea: invalid textTimerController");
171     }
172 }
173 }