1 /*
2 * Copyright (c) 2025 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 #include "sts_subscriber.h"
16
17 #include "ans_log_wrapper.h"
18 #include "sts_common.h"
19 #include "sts_request.h"
20 #include "sts_sorting_map.h"
21
22 namespace OHOS {
23 namespace NotificationSts {
SetNotificationRequest(ani_env * env,const std::shared_ptr<NotificationSts> & request,ani_object & outObj)24 bool SetNotificationRequest(ani_env *env, const std::shared_ptr<NotificationSts> &request, ani_object &outObj)
25 {
26 ani_status status = ANI_OK;
27 ani_object requestObj;
28 ani_class requestCls;
29 if (!WarpNotificationRequest(env, request->GetNotificationRequestPoint().GetRefPtr(), requestCls, requestObj)
30 || requestObj == nullptr) {
31 ANS_LOGE("WarpNotificationRequest faild");
32 return false;
33 }
34 if (ANI_OK != (status = env->Object_SetPropertyByName_Ref(outObj, "request", requestObj))) {
35 ANS_LOGE("set request faild. status %{public}d", status);
36 return false;
37 }
38 return true;
39 }
40
SetNotificationSortingMap(ani_env * env,const std::shared_ptr<NotificationSortingMap> & sortingMap,ani_object & outObj)41 bool SetNotificationSortingMap(
42 ani_env *env, const std::shared_ptr<NotificationSortingMap> &sortingMap, ani_object &outObj)
43 {
44 ani_status status = ANI_OK;
45 ani_object sortingMapObj;
46 if (!WarpNotificationSortingMap(env, sortingMap, sortingMapObj)) {
47 ANS_LOGE("WarpNotificationSortingMap faild");
48 return false;
49 }
50 if (ANI_OK != (status = env->Object_SetPropertyByName_Ref(outObj, "sortingMap", sortingMapObj))) {
51 ANS_LOGE("set sortingMap faild. status %{public}d", status);
52 return false;
53 }
54 return true;
55 }
56
SetReason(ani_env * env,const int32_t deleteReason,ani_object & outObj)57 bool SetReason(ani_env *env, const int32_t deleteReason, ani_object &outObj)
58 {
59 ani_status status = ANI_OK;
60 if (deleteReason != -1) {
61 ani_object reason = CreateDouble(env, static_cast<ani_double>(deleteReason));
62 if (reason == nullptr) {
63 ANS_LOGE("reason Create faild");
64 return false;
65 }
66 if (ANI_OK != (status = env->Object_SetPropertyByName_Ref(outObj, "reason", reason))) {
67 ANS_LOGE("set reason faild. status %{public}d", status);
68 return false;
69 }
70 }
71 return true;
72 }
73
SetSound(ani_env * env,const std::shared_ptr<NotificationSts> & request,ani_object & outObj)74 bool SetSound(ani_env *env, const std::shared_ptr<NotificationSts> &request, ani_object &outObj)
75 {
76 ani_status status = ANI_OK;
77 if (request->EnableSound()) {
78 std::string sound = request->GetSound().ToString();
79 ani_string soundObj;
80 if (ANI_OK != GetAniStringByString(env, sound, soundObj) || soundObj == nullptr) {
81 ANS_LOGE("sound create faild");
82 return false;
83 }
84 if (ANI_OK != (status = env->Object_SetPropertyByName_Ref(outObj, "sound", soundObj))) {
85 ANS_LOGE("set sound faild. status %{public}d", status);
86 }
87 }
88 return true;
89 }
90
SetVibrationValues(ani_env * env,const std::shared_ptr<NotificationSts> & request,ani_object & outObj)91 bool SetVibrationValues(ani_env *env, const std::shared_ptr<NotificationSts> &request, ani_object &outObj)
92 {
93 ani_status status = ANI_OK;
94 if (request->EnableVibrate()) {
95 ani_object vibrationValuesObj;
96 const std::vector<int64_t> vibrationValues = request->GetVibrationStyle();
97 vibrationValuesObj = newArrayClass(env, vibrationValues.size());
98 if (vibrationValuesObj == nullptr) {
99 ANS_LOGE("CreateArray faild");
100 return false;
101 }
102 for (size_t i = 0; i < vibrationValues.size(); i++) {
103 status = env->Object_CallMethodByName_Void(
104 vibrationValuesObj, "$_set", "ID:V", i, static_cast<ani_double>(vibrationValues[i]));
105 if (status != ANI_OK) {
106 ANS_LOGE("faild. status : %{public}d", status);
107 return false;
108 }
109 }
110 if (ANI_OK != (status = env->Object_SetPropertyByName_Ref(outObj, "vibrationValues", vibrationValuesObj))) {
111 ANS_LOGE("set vibrationValuesObj faild. status %{public}d", status);
112 return false;
113 }
114 }
115 return true;
116 }
117
WarpSubscribeCallbackData(ani_env * env,const std::shared_ptr<NotificationSts> & request,const std::shared_ptr<NotificationSortingMap> & sortingMap,int32_t deleteReason,ani_object & outObj)118 bool WarpSubscribeCallbackData(
119 ani_env *env,
120 const std::shared_ptr<NotificationSts> &request,
121 const std::shared_ptr<NotificationSortingMap> &sortingMap,
122 int32_t deleteReason,
123 ani_object &outObj)
124 {
125 ANS_LOGD("enter");
126 ani_class cls;
127 if (env == nullptr || request == nullptr || sortingMap == nullptr) {
128 ANS_LOGE("invalid parameter value");
129 return false;
130 }
131 if (!CreateClassObjByClassName(
132 env, "Lnotification/notificationSubscriber/SubscribeCallbackDataInner;", cls, outObj)) {
133 ANS_LOGE("CreateClassObjByClassName faild");
134 return false;
135 }
136 // request: NotificationRequest
137 if (!SetNotificationRequest(env, request, outObj)) {
138 ANS_LOGE("SetNotificationRequest faild");
139 return false;
140 }
141 // sortingMap?: NotificationSortingMap
142 if (!SetNotificationSortingMap(env, sortingMap, outObj)) {
143 ANS_LOGE("SetNotificationSortingMap faild");
144 return false;
145 }
146 // reason?: number
147 if (!SetReason(env, deleteReason, outObj)) {
148 ANS_LOGE("SetReason faild");
149 return false;
150 }
151 // sound?: string
152 if (!SetSound(env, request, outObj)) {
153 ANS_LOGE("SetSound faild");
154 return false;
155 }
156 // vibrationValues?: Array<number>
157 if (!SetVibrationValues(env, request, outObj)) {
158 ANS_LOGE("SetSound faild");
159 return false;
160 }
161 return true;
162 }
163
WarpSubscribeCallbackDataArray(ani_env * env,const std::vector<std::shared_ptr<OHOS::Notification::Notification>> & requestList,const std::shared_ptr<NotificationSortingMap> & sortingMap,int32_t deleteReason,ani_object & outObj)164 bool WarpSubscribeCallbackDataArray(
165 ani_env *env,
166 const std::vector<std::shared_ptr<OHOS::Notification::Notification>> &requestList,
167 const std::shared_ptr<NotificationSortingMap> &sortingMap,
168 int32_t deleteReason,
169 ani_object &outObj)
170 {
171 ANS_LOGD("enter");
172 if (env == nullptr || sortingMap == nullptr) {
173 ANS_LOGE("invalid parameter value");
174 return false;
175 }
176 ani_status status;
177 if (env == nullptr) {
178 ANS_LOGE("env is nullptr");
179 return false;
180 }
181 outObj = newArrayClass(env, requestList.size());
182 if (outObj == nullptr) {
183 ANS_LOGE("CreateArray faild");
184 return false;
185 }
186 for (size_t i = 0; i < requestList.size(); i++) {
187 ani_object obj;
188 if (!WarpSubscribeCallbackData(env, requestList[i], sortingMap, deleteReason, obj)) {
189 ANS_LOGE("WarpSubscribeCallbackData faild");
190 return false;
191 }
192 if (ANI_OK != (status = env->Object_CallMethodByName_Void(
193 outObj, "$_set", "ILstd/core/Object;:V", i, obj))) {
194 ANS_LOGE("set object faild. status %{public}d", status);
195 return false;
196 }
197 }
198 return true;
199 }
200
WarpEnabledNotificationCallbackData(ani_env * env,const std::shared_ptr<EnabledNotificationCallbackData> & callbackData,ani_object & outObj)201 bool WarpEnabledNotificationCallbackData(
202 ani_env *env, const std::shared_ptr<EnabledNotificationCallbackData> &callbackData, ani_object &outObj)
203 {
204 ANS_LOGD("enter");
205 if (env == nullptr || callbackData == nullptr) {
206 ANS_LOGE("invalid parameter value");
207 return false;
208 }
209 ani_class cls;
210 ani_status status;
211 const char *className = "Lnotification/notificationSubscriber/EnabledNotificationCallbackDataInner;";
212 if (!CreateClassObjByClassName(env, className, cls, outObj)) {
213 ANS_LOGE("CreateClassObjByClassName faild");
214 return false;
215 }
216 if (!SetFieldString(env, cls, outObj, "bundle", callbackData->GetBundle())) {
217 ANS_LOGE("SetFieldString bundle faild");
218 return false;
219 }
220 if (!CallSetter(env, cls, outObj, "uid", static_cast<ani_double>(callbackData->GetUid()))) {
221 ANS_LOGE("uid set faild.");
222 return false;
223 }
224 if (ANI_OK != (status = env->Object_SetPropertyByName_Boolean(
225 outObj, "enable", BoolToAniBoolean(callbackData->GetEnable())))) {
226 ANS_LOGE("set enable faild. status %{public}d", status);
227 return false;
228 }
229 return true;
230 }
231
WarpBadgeNumberCallbackData(ani_env * env,const std::shared_ptr<BadgeNumberCallbackData> & badgeData,ani_object & outObj)232 bool WarpBadgeNumberCallbackData(
233 ani_env *env, const std::shared_ptr<BadgeNumberCallbackData> &badgeData, ani_object &outObj)
234 {
235 ANS_LOGD("enter");
236 if (env == nullptr || badgeData == nullptr) {
237 ANS_LOGE("invalid parameter value");
238 return false;
239 }
240 ani_class cls;
241 ani_object instanceKeyObj;
242 const char *className = "Lnotification/notificationSubscriber/BadgeNumberCallbackDataInner;";
243 if (!CreateClassObjByClassName(env, className, cls, outObj)) {
244 ANS_LOGE("CreateClassObjByClassName faild");
245 return false;
246 }
247 if (!SetFieldString(env, cls, outObj, "bundle", badgeData->GetBundle())) {
248 ANS_LOGE("SetFieldString bundle faild");
249 return false;
250 }
251 if (!CallSetter(env, cls, outObj, "uid", static_cast<ani_double>(badgeData->GetUid()))) {
252 ANS_LOGE("uid set faild.");
253 return false;
254 }
255 if (!CallSetter(env, cls, outObj, "badgeNumber", static_cast<ani_double>(badgeData->GetBadgeNumber()))) {
256 ANS_LOGE("badgeNumber set faild");
257 return false;
258 }
259 instanceKeyObj = CreateDouble(env, static_cast<ani_double>(badgeData->GetInstanceKey()));
260 if (instanceKeyObj != nullptr) {
261 if (!CallSetter(env, cls, outObj, "instanceKey", instanceKeyObj)) {
262 ANS_LOGE("instanceKey set faild.");
263 return false;
264 }
265 } else {
266 ANS_LOGE("instanceKeyObj createDouble faild");
267 }
268 if (!SetFieldString(env, cls, outObj, "appInstanceKey", badgeData->GetAppInstanceKey())) {
269 ANS_LOGD("SetFieldString appInstanceKey faild");
270 return false;
271 }
272 return true;
273 }
274
275 } // namespace NotificationSts
276 } // OHOS
277