• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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