From d81d76059f6fef29d1ca6207bfd02aee711ab5d3 Mon Sep 17 00:00:00 2001 From: heguokai <275503077@qq.com> Date: Wed, 20 Aug 2025 10:05:21 +0800 Subject: [PATCH] =?UTF-8?q?getNotificationSetting=20=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: heguokai <275503077@qq.com> --- frameworks/ets/ani/include/manager/ani_slot.h | 1 + frameworks/ets/ani/include/sts_slot.h | 1 + .../ets/ani/src/manager/ani_manager.cpp | 3 +- frameworks/ets/ani/src/manager/ani_slot.cpp | 21 ++++++++++ frameworks/ets/ani/src/sts_request.cpp | 40 +++++++++++++++++-- frameworks/ets/ani/src/sts_slot.cpp | 29 ++++++++++++++ .../ets/ets/@ohos.notificationManager.ets | 26 ++++++++++++ .../ets/notification/notificationRequest.ets | 2 + .../notification/notificationSubscriber.ets | 1 + 9 files changed, 120 insertions(+), 4 deletions(-) diff --git a/frameworks/ets/ani/include/manager/ani_slot.h b/frameworks/ets/ani/include/manager/ani_slot.h index 7fc0c6053..596786a3d 100644 --- a/frameworks/ets/ani/include/manager/ani_slot.h +++ b/frameworks/ets/ani/include/manager/ani_slot.h @@ -37,6 +37,7 @@ void AniRemoveSlot(ani_env *env, ani_enum_item enumObj); void AniRemoveAllSlots(ani_env *env); void AniSetSlotByBundle(ani_env *env, ani_object bundleOptionObj, ani_object slotObj); ani_long AniGetSlotNumByBundle(ani_env *env, ani_object bundleOption); +ani_object AniGetNotificationSetting(ani_env *env); } // namespace NotificationManagerSts } // namespace OHOS #endif diff --git a/frameworks/ets/ani/include/sts_slot.h b/frameworks/ets/ani/include/sts_slot.h index 12a8eeef0..87ee56b9f 100644 --- a/frameworks/ets/ani/include/sts_slot.h +++ b/frameworks/ets/ani/include/sts_slot.h @@ -38,6 +38,7 @@ bool ParseNotificationSlotByBasicType(ani_env *env, ani_object notificationSlotO bool UnwrapNotificationSlot(ani_env *env, ani_object notificationSlotObj, NotificationSlot &slot); bool UnwrapNotificationSlotArrayByAniObj(ani_env *env, ani_object notificationSlotArrayObj, std::vector &slots); +bool WrapGetNotificationSetting(ani_env *env, uint32_t slotFlags, ani_object &outAniObj); } // namespace NotificationSts } // OHOS #endif diff --git a/frameworks/ets/ani/src/manager/ani_manager.cpp b/frameworks/ets/ani/src/manager/ani_manager.cpp index 7b024fa20..1ed51741b 100644 --- a/frameworks/ets/ani/src/manager/ani_manager.cpp +++ b/frameworks/ets/ani/src/manager/ani_manager.cpp @@ -95,7 +95,8 @@ static std::array kitManagerFunctions = { ani_native_function {"nativeRequestEnableNotification", "Lapplication/UIAbilityContext/UIAbilityContext;:Lstd/core/Promise;", reinterpret_cast(AniRequestEnableNotification)}, - + ani_native_function {"nativeGetNotificationSetting", nullptr, reinterpret_cast(AniGetNotificationSetting)}, + #ifdef ANS_FEATURE_BADGE_MANAGER ani_native_function {"nativeDisplayBadge", nullptr, reinterpret_cast(AniDisplayBadge)}, ani_native_function {"nativeIsBadgeDisplayed", nullptr, reinterpret_cast(AniIsBadgeDisplayed)}, diff --git a/frameworks/ets/ani/src/manager/ani_slot.cpp b/frameworks/ets/ani/src/manager/ani_slot.cpp index bcd6fc42f..2c899e899 100644 --- a/frameworks/ets/ani/src/manager/ani_slot.cpp +++ b/frameworks/ets/ani/src/manager/ani_slot.cpp @@ -382,5 +382,26 @@ ani_object AniGetSlotByBundle(ani_env *env, ani_object bundleOption, ani_enum_it } return infoObj; } + +ani_object AniGetNotificationSetting(ani_env *env) +{ + ANS_LOGD("AniGetNotificationSetting enter"); + uint32_t slotFlags = 0; + int returncode = Notification::NotificationHelper::GetNotificationSettings(slotFlags); + ANS_LOGD("AniGetNotificationSetting slotFlags: %{public}d", slotFlags); + if (returncode != ERR_OK) { + int externalCode = NotificationSts::GetExternalCode(returncode); + ANS_LOGE("GetNotificationSetting -> error, errorCode: %{public}d", externalCode); + NotificationSts::ThrowError(env, externalCode, NotificationSts::FindAnsErrMsg(externalCode)); + return nullptr; + } + ani_object infoObj; + if (!NotificationSts::WrapGetNotificationSetting(env, slotFlags, infoObj) || infoObj == nullptr) { + NotificationSts::ThrowStsErroWithMsg(env, "WrapGetNotificationSetting Failed"); + return nullptr; + } + + return infoObj; +} } } \ No newline at end of file diff --git a/frameworks/ets/ani/src/sts_request.cpp b/frameworks/ets/ani/src/sts_request.cpp index 79690cd5b..47dabb7ea 100644 --- a/frameworks/ets/ani/src/sts_request.cpp +++ b/frameworks/ets/ani/src/sts_request.cpp @@ -542,7 +542,7 @@ void GetNotificationExtraInfo(ani_env *env, ani_object obj, std::shared_ptrSetAdditionalData(extras); } +void GetNotificationExtendInfo(ani_env *env, ani_object obj, std::shared_ptr &request) +{ + ani_boolean isUndefined = ANI_TRUE; + ani_ref extendInfoRef = {}; + if (ANI_OK != GetPropertyRef(env, obj, "extendInfo", isUndefined, extendInfoRef) + || isUndefined == ANI_TRUE || extendInfoRef == nullptr) { + ANS_LOGE("GetNotificationExtendInfo: get ref failed"); + return; + } + WantParams wantParams = {}; + UnwrapWantParams(env, extendInfoRef, wantParams); + std::shared_ptr extends = std::make_shared(wantParams); + request->SetExtendInfo(extends); +} + void GetNotificationRemovalWantAgent(ani_env *env, ani_object obj, std::shared_ptr &request) { @@ -724,6 +739,7 @@ ani_status GetNotificationRequestByCustom(ani_env *env, ani_object obj, GetNotificationSlotType(env, obj, notificationRequest); GetNotificationWantAgent(env, obj, notificationRequest); GetNotificationExtraInfo(env, obj, notificationRequest); + GetNotificationExtendInfo(env, obj, notificationRequest); GetNotificationRemovalWantAgent(env, obj, notificationRequest); GetNotificationActionButtons(env, obj, notificationRequest); GetNotificationSmallIcon(env, obj, notificationRequest); @@ -970,12 +986,26 @@ bool SetRequestExtraInfo(ani_env *env, const OHOS::Notification::NotificationReq return true; } ani_ref extraInfo = OHOS::AppExecFwk::WrapWantParams(env, *additionalData); - if (extraInfo == nullptr || !SetPropertyByRef(env, object, "extendInfo", extraInfo)) { + if (extraInfo == nullptr || !SetPropertyByRef(env, object, "extraInfo", extraInfo)) { ANS_LOGD("SetNotificationRequestByCustom: set extraInfo failed"); } return true; } +bool SetRequestExtendInfo(ani_env *env, const OHOS::Notification::NotificationRequest *request, ani_object &object) +{ + std::shared_ptr extendInfoData = request->GetExtendInfo(); + if (extendInfoData == nullptr) { + ANS_LOGD("extendInfo is Undefine"); + return true; + } + ani_ref extendInfo = OHOS::AppExecFwk::WrapWantParams(env, *extendInfoData); + if (extendInfo == nullptr || !SetPropertyByRef(env, object, "extendInfo", extendInfo)) { + ANS_LOGD("SetNotificationRequestByCustom: set extendInfo failed"); + } + return true; +} + bool SetRequestActionButtons(ani_env *env, const OHOS::Notification::NotificationRequest *request, ani_object &object) { std::vector> actionButtons = request->GetActionButtons(); @@ -1074,10 +1104,14 @@ bool SetNotificationRequestByCustom(ani_env* env, ani_class cls, ANS_LOGE("SetNotificationRequestByCustom: set content failed"); return false; } - // extraInfo?: {[key:string] : any} + // extraInfo?: Record if (!SetRequestExtraInfo(env, request, object)) { ANS_LOGE("set extraInfo faild"); } + // extendInfo?: Record + if (!SetRequestExtendInfo(env, request, object)) { + ANS_LOGE("set extendInfo faild"); + } // actionButtons?: Array if (!SetRequestActionButtons(env, request, object)) { ANS_LOGD("set actionButtons faild"); diff --git a/frameworks/ets/ani/src/sts_slot.cpp b/frameworks/ets/ani/src/sts_slot.cpp index 43f29248d..14816206a 100644 --- a/frameworks/ets/ani/src/sts_slot.cpp +++ b/frameworks/ets/ani/src/sts_slot.cpp @@ -142,6 +142,35 @@ bool WrapNotificationSlotByInt(ani_env *env, sptrObject_SetPropertyByName_Boolean( + outAniObj, "vibrationEnabled", BoolToAniBoolean(vibrationEnabled)))) { + ANS_LOGE("Set vibrationEnabled fail, status %{public}d", status); + return false; + } + if (ANI_OK != (status = env->Object_SetPropertyByName_Boolean( + outAniObj, "soundEnabled", BoolToAniBoolean(soundEnabled)))) { + ANS_LOGE("Set soundEnabled fail, status %{public}d", status); + return false; + } + return true; +} + bool WrapNotificationSlot(ani_env *env, sptr slot, ani_object &outAniObj) { ANS_LOGD("WrapNotificationSlot call"); diff --git a/frameworks/ets/ets/@ohos.notificationManager.ets b/frameworks/ets/ets/@ohos.notificationManager.ets index fb535ac7b..82c069c67 100644 --- a/frameworks/ets/ets/@ohos.notificationManager.ets +++ b/frameworks/ets/ets/@ohos.notificationManager.ets @@ -95,6 +95,16 @@ export default namespace notificationManager { end: Date; } + export interface NotificationSetting { + vibrationEnabled: boolean; + soundEnabled: boolean; + } + + class NotificationSettingInner implements NotificationSetting { + vibrationEnabled: boolean = false; + soundEnabled: boolean = false; + } + export interface DoNotDisturbProfile { id: long; name: string; @@ -222,6 +232,7 @@ export default namespace notificationManager { type: 'checkNotification', callback: CallbackForCheckInfo, checkRequest?: NotificationCheckRequest): int; export native function nativeOff( type: 'checkNotification', callback?: CallbackForCheckInfo): int; + export native function nativeGetNotificationSetting(): NotificationSetting; function isInvalidParameter(doNotDisturbDate: DoNotDisturbDate): BusinessError { @@ -2609,4 +2620,19 @@ export default namespace notificationManager { callback(err, undefined); }) } + + export function getNotificationSetting(): Promise { + let pPromise = new Promise( + (resolve: ResolveCallback, reject: RejectCallback): void => { + let p = taskpool.execute((): NotificationSetting => + { return nativeGetNotificationSetting(); }); + p.then((data: NullishType): void => { + let ret : NotificationSetting = data as NotificationSetting; + resolve(ret); + }, (error: Error): void => { + reject(error); + }); + }); + return pPromise; + } } diff --git a/frameworks/ets/ets/notification/notificationRequest.ets b/frameworks/ets/ets/notification/notificationRequest.ets index c74b7a302..b0fb1fb8c 100644 --- a/frameworks/ets/ets/notification/notificationRequest.ets +++ b/frameworks/ets/ets/notification/notificationRequest.ets @@ -89,6 +89,7 @@ export interface NotificationRequest { tapDismissed?: boolean; autoDeletedTime?: long; wantAgent?: WantAgent; + extraInfo?: Record; extendInfo?: Record; color?: long; colorEnabled?: boolean; @@ -140,6 +141,7 @@ class NotificationRequestInner implements NotificationRequest { public tapDismissed?: boolean | undefined; public autoDeletedTime?: long | undefined; public wantAgent?: WantAgent | undefined; + public extraInfo?: Record | undefined; public extendInfo?: Record | undefined; public color?: long | undefined; public colorEnabled?: boolean | undefined; diff --git a/frameworks/ets/ets/notification/notificationSubscriber.ets b/frameworks/ets/ets/notification/notificationSubscriber.ets index 1b9371a0d..af2b5def2 100644 --- a/frameworks/ets/ets/notification/notificationSubscriber.ets +++ b/frameworks/ets/ets/notification/notificationSubscriber.ets @@ -97,6 +97,7 @@ class SubscribeCallbackDataInner implements SubscribeCallbackData { tapDismissed: undefined, autoDeletedTime: undefined, wantAgent: undefined, + extraInfo: undefined, extendInfo: undefined, color: undefined, colorEnabled: undefined, -- Gitee