diff --git a/frameworks/ets/ani/include/sts_common.h b/frameworks/ets/ani/include/sts_common.h index aa6600ef6fd278b8cf7e8438b2ce29f728cabe87..dfc0799de57b69a716ddea267cc053b9d3266d9a 100644 --- a/frameworks/ets/ani/include/sts_common.h +++ b/frameworks/ets/ani/include/sts_common.h @@ -64,7 +64,8 @@ ani_status GetPropertyNumberArray(ani_env *env, ani_object param, const char *na ani_boolean &isUndefined, std::vector &res); ani_status GetPropertyLongArray(ani_env *env, ani_object param, const char *name, ani_boolean &isUndefined, std::vector &res); - +ani_status GetPropertyEnumItemArray(ani_env *env, ani_object param, const char *name, + ani_boolean &isUndefined, std::vector &res); void GetPropertyRefValue(ani_env *env, ani_object obj, const char *name, ani_boolean &isUndefined, ani_ref &outRef); bool SetFieldString(ani_env *env, ani_class cls, ani_object &object, diff --git a/frameworks/ets/ani/include/sts_subscribe.h b/frameworks/ets/ani/include/sts_subscribe.h index e2e7b5a1a6ad281f274a3cc3846238660befa2c0..be90cc4717418bcc4215cf021bacff5b0679e800 100644 --- a/frameworks/ets/ani/include/sts_subscribe.h +++ b/frameworks/ets/ani/include/sts_subscribe.h @@ -82,6 +82,7 @@ public: bool SetObject(ani_env *env, ani_object obj); bool IsInit(); bool Compare(ani_env *env, ani_object obj); + bool Compare(ani_env *env, ani_ref ref); bool Compare(std::shared_ptr instance); private: @@ -106,7 +107,7 @@ public: bool HasNotificationSubscriber( ani_env *env, ani_object value, std::shared_ptr &subscriberInfo); bool AddSubscriberInstancesInfo(ani_env *env, std::shared_ptr &subscriberInfo); - bool DelSubscriberInstancesInfo(ani_env *env, ani_object obj); + bool DelSubscriberInstancesInfo(ani_env *env, ani_ref ref); bool AddDeletingSubscriber(std::shared_ptr subscriber); void DelDeletingSubscriber(std::shared_ptr subscriber); diff --git a/frameworks/ets/ani/include/sts_subscribe_info.h b/frameworks/ets/ani/include/sts_subscribe_info.h index 5342188b8f488620623f94e672027254fe6edefc..f3ee551f16a50064c1b5b5614eaf4278c50a2f39 100644 --- a/frameworks/ets/ani/include/sts_subscribe_info.h +++ b/frameworks/ets/ani/include/sts_subscribe_info.h @@ -16,11 +16,13 @@ #ifndef BASE_NOTIFICATION_DISTRIBUTED_NOTIFICATION_SERVICE_FRAMEWORKS_ETS_ANI_INCLUDE_STS_SORTING_H #define BASE_NOTIFICATION_DISTRIBUTED_NOTIFICATION_SERVICE_FRAMEWORKS_ETS_ANI_INCLUDE_STS_SORTING_H #include "ani.h" +#include "notification_constant.h" #include "notification_subscribe_info.h" namespace OHOS { namespace NotificationSts { using NotificationSubscribeInfo = OHOS::Notification::NotificationSubscribeInfo; +using SlotType = OHOS::Notification::NotificationConstant::SlotType; bool UnwarpNotificationSubscribeInfo(ani_env *env, ani_object value, NotificationSubscribeInfo &info); } // namespace NotificationSts diff --git a/frameworks/ets/ani/src/sts_common.cpp b/frameworks/ets/ani/src/sts_common.cpp index f97998b853323ff0841549e689f132c558259f51..de9b0e085aa9465b2cb63daeea8332467630e443 100644 --- a/frameworks/ets/ani/src/sts_common.cpp +++ b/frameworks/ets/ani/src/sts_common.cpp @@ -324,6 +324,40 @@ ani_status GetPropertyStringArray(ani_env *env, ani_object param, const char *na return status; } +ani_status GetPropertyEnumItemArray(ani_env *env, ani_object param, const char *name, + ani_boolean &isUndefined, std::vector &res) +{ + if (env == nullptr || param == nullptr || name == nullptr) { + ANS_LOGE("GetPropertyEnumItemArray fail, has nullptr"); + return ANI_INVALID_ARGS; + } + ANS_LOGD("GetPropertyEnumItemArray: %{public}s", name); + ani_ref arrayObj = nullptr; + ani_status status; + ani_int length; + if ((status = GetPropertyRef(env, param, name, isUndefined, arrayObj)) != ANI_OK || + isUndefined == ANI_TRUE) { + ANS_LOGE("GetPropertyRef fail, status = %{public}d, isUndefind = %{public}d", status, isUndefined); + return ANI_INVALID_ARGS; + } + status = env->Object_GetPropertyByName_Int(static_cast(arrayObj), "length", &length); + if (status != ANI_OK) { + ANS_LOGE("status: %{public}d", status); + return status; + } + for (int i = 0; i < static_cast(length); i++) { + ani_ref enumItemRef; + status = env->Object_CallMethodByName_Ref(static_cast(arrayObj), + "$_get", "I:Lstd/core/Object;", &enumItemRef, (ani_int)i); + if (status != ANI_OK) { + ANS_LOGE("status: %{public}d, index: %{public}d", status, i); + return status; + } + res.push_back(static_cast(enumItemRef)); + } + return ANI_OK; +} + ani_status GetPropertyNumberArray(ani_env *env, ani_object param, const char *name, ani_boolean &isUndefined, std::vector &res) { diff --git a/frameworks/ets/ani/src/sts_subscribe.cpp b/frameworks/ets/ani/src/sts_subscribe.cpp index 27cfc4a195a1952a064632c27e5c59ff0eb3b62b..524ed688f2a8c0699994b989d557ea3c367b86ea 100644 --- a/frameworks/ets/ani/src/sts_subscribe.cpp +++ b/frameworks/ets/ani/src/sts_subscribe.cpp @@ -214,7 +214,7 @@ void StsSubscriberInstance::OnDisconnected() } std::vector vec; CallFunction(etsEnv, "onDisconnect", vec); - if (!SubscriberInstanceManager::GetInstance()->DelSubscriberInstancesInfo(etsEnv, obj_)) { + if (!SubscriberInstanceManager::GetInstance()->DelSubscriberInstancesInfo(etsEnv, ref_)) { ANS_LOGD("DelSubscriberInstancesInfo faild"); } else { ANS_LOGD("DelSubscriberInstancesInfo suc.."); @@ -433,7 +433,9 @@ bool StsSubscriberInstance::SetObject(ani_env *env, ani_object obj) { ANS_LOGD("enter"); std::lock_guard l(lock_); - if (env == nullptr || obj == nullptr) return false; + if (env == nullptr || obj == nullptr) { + return false; + } if (ANI_OK != env->GetVM(&vm_)) { ANS_LOGD("GetVM faild"); return false; @@ -448,25 +450,45 @@ bool StsSubscriberInstance::SetObject(ani_env *env, ani_object obj) bool StsSubscriberInstance::IsInit() { ANS_LOGD("enter"); - std::lock_guard l(lock_); return (ref_ != nullptr && vm_ != nullptr); } bool StsSubscriberInstance::Compare(ani_env *env, ani_object obj) { ANS_LOGD("enter"); - if (!IsInit()) return false; - if (obj == nullptr || env == nullptr) return false; + if (!IsInit()) { + return false; + } + if (obj == nullptr || env == nullptr) { + return false; + } ani_ref ref; - if (env->GlobalReference_Create(obj, &ref) != ANI_OK) return false; + if (env->GlobalReference_Create(obj, &ref) != ANI_OK) { + return false; + } ani_boolean result = ANI_FALSE; env->Reference_StrictEquals(ref, ref_, &result); env->GlobalReference_Delete(ref); return (result == ANI_TRUE) ? true : false; } +bool StsSubscriberInstance::Compare(ani_env *env, ani_ref ref) +{ + ANS_LOGD("enter"); + if (!IsInit()) { + return false; + } + if (ref == nullptr || env == nullptr) { + return false; + } + ani_boolean result = ANI_FALSE; + env->Reference_StrictEquals(ref, ref_, &result); + return (result == ANI_TRUE) ? true : false; +} bool StsSubscriberInstance::Compare(std::shared_ptr instance) { ANS_LOGD("enter"); - if (instance == nullptr) return false; + if (instance == nullptr) { + return false; + } if (instance->obj_ == obj_) { ANS_LOGD("Compare is ture"); return true; @@ -477,7 +499,9 @@ bool StsSubscriberInstance::Compare(std::shared_ptr insta bool StsSubscriberInstance::CallFunction(ani_env *env, const char *func, std::vector &parm) { ANS_LOGD("enter"); - if (env == nullptr) return false; + if (env == nullptr) { + return false; + } ani_ref fn_ref; ani_status aniResult = env->Object_GetPropertyByName_Ref(static_cast(ref_), func, &fn_ref); if (ANI_OK != aniResult) { @@ -524,17 +548,16 @@ bool SubscriberInstanceManager::AddSubscriberInstancesInfo( subscriberInstances_.emplace_back(subscriberInfo); return true; } -bool SubscriberInstanceManager::DelSubscriberInstancesInfo( - ani_env *env, ani_object obj) +bool SubscriberInstanceManager::DelSubscriberInstancesInfo(ani_env *env, ani_ref ref) { ANS_LOGD("enter"); - if (obj == nullptr) { - ANS_LOGE("obj is null"); + if (ref == nullptr) { + ANS_LOGE("ref is null"); return false; } std::lock_guard lock(mutex_); for (auto it = subscriberInstances_.begin(); it != subscriberInstances_.end(); ++it) { - if ((*it)->Compare(env, obj)) { + if ((*it)->Compare(env, ref)) { DelDeletingSubscriber((*it)); subscriberInstances_.erase(it); return true; @@ -557,7 +580,9 @@ bool SubscriberInstanceManager::AddDeletingSubscriber(std::shared_ptr lock(delMutex_); - if (subscriber == nullptr) return false; + if (subscriber == nullptr) { + return false; + } auto iter = std::find(DeletingSubscriber.begin(), DeletingSubscriber.end(), subscriber); if (iter != DeletingSubscriber.end()) { return false; diff --git a/frameworks/ets/ani/src/sts_subscribe_info.cpp b/frameworks/ets/ani/src/sts_subscribe_info.cpp index 98f4ff9e2b15299f61558dbd8f07bdc7ffd7637c..d741216810fbf67bc00cd87c9d8c44cc0c958a34 100644 --- a/frameworks/ets/ani/src/sts_subscribe_info.cpp +++ b/frameworks/ets/ani/src/sts_subscribe_info.cpp @@ -16,9 +16,33 @@ #include "sts_common.h" #include "ans_log_wrapper.h" +#include "sts_notification_manager.h" namespace OHOS { namespace NotificationSts { +bool GetSlotTypes(ani_env *env, ani_object value, NotificationSubscribeInfo &info) +{ + ani_boolean isUndefined = ANI_TRUE; + std::vector slotTypesEnum = {}; + if (ANI_OK != GetPropertyEnumItemArray(env, value, "slotTypes", isUndefined, slotTypesEnum) + || isUndefined == ANI_TRUE || slotTypesEnum.empty()) { + ANS_LOGE("GetPropertyEnumItemArray fail or undefined"); + return false; + } + std::vector slotTypes = {}; + for (auto slotTypeEnum : slotTypesEnum) { + SlotType slotType = SlotType::OTHER; + if (!SlotTypeEtsToC(env, slotTypeEnum, slotType)) { + ANS_LOGE("Enum conversion failed"); + return false; + } + slotTypes.push_back(slotType); + } + + info.SetSlotTypes(slotTypes); + + return true; +} bool UnwarpNotificationSubscribeInfo(ani_env *env, ani_object value, NotificationSubscribeInfo &info) { ANS_LOGD("enter"); @@ -49,6 +73,9 @@ bool UnwarpNotificationSubscribeInfo(ani_env *env, ani_object value, Notificatio if (ANI_OK != GetPropertyLong(env, value, "filterLimit", isUndefined, filterLimit) || isUndefined == ANI_TRUE) { ANS_LOGE("GetPropertyLong faild"); } + if (!GetSlotTypes(env, value, info)) { + ANS_LOGE("GetSlotTypes faild"); + } info.AddAppNames(bundleNames); info.AddAppUserId(userId); info.SetFilterType(static_cast(filterLimit)); diff --git a/frameworks/ets/ets/notification/notificationSubscribeInfo.ets b/frameworks/ets/ets/notification/notificationSubscribeInfo.ets index 5011aeb7c7d7e5713a0b35b5f308d764fa566cad..793435f554a9f332c9ff3e66618b4f76a53dc147 100644 --- a/frameworks/ets/ets/notification/notificationSubscribeInfo.ets +++ b/frameworks/ets/ets/notification/notificationSubscribeInfo.ets @@ -13,11 +13,14 @@ * limitations under the License. */ +import type notificationManager from '@ohos.notificationManager'; + export interface NotificationSubscribeInfo { bundleNames?: Array; userId?: int; deviceType?: string; filterLimit?: long; + slotTypes?: Array; } class NotificationSubscribeInfoInner implements NotificationSubscribeInfo { @@ -25,4 +28,5 @@ class NotificationSubscribeInfoInner implements NotificationSubscribeInfo { public userId?: int; public deviceType?: string; public filterLimit?: long; + public slotTypes?: Array; } \ No newline at end of file