import { reminderAgentManager } from '@kit.BackgroundTasksKit'
import { notificationManager } from '@kit.NotificationKit'
import { common } from '@kit.AbilityKit'
import { BusinessError } from '@kit.BasicServicesKit'
import { PermissionUtil } from '@hupu/utils'
export class HpCalendarReminderInfo {
startMillis?: number
endMillis?: number
title?: string
desc?: string
}
export class HpReminderManager {
private static reminderManager?: HpReminderManager
private constructor() {
}
static getInstance(): HpReminderManager {
if (!HpReminderManager.reminderManager) {
HpReminderManager.reminderManager = new HpReminderManager()
}
return HpReminderManager.reminderManager
}
async requestNotificationPermission(): Promise<boolean> {
let context = getContext(this) as common.UIAbilityContext;
return new Promise<boolean>((resolve, reject) => {
notificationManager.isNotificationEnabled().then((data: boolean) => {
if (!data) {
notificationManager.requestEnableNotification(context).then(() => {
resolve(true)
}).catch((err: BusinessError) => {
resolve(false)
});
} else {
resolve(true)
}
}).catch((err: BusinessError) => {
resolve(false)
});
})
}
async requestPublishPermission(): Promise<boolean> {
return await PermissionUtil.requestPermissionsList(['ohos.permission.PUBLISH_AGENT_REMINDER'])
}
async requestPermission() {
let notificationPermission = await this.requestNotificationPermission()
if (notificationPermission) {
let publishPermission = await this.requestPublishPermission()
return publishPermission
}
return false
}
async publishCalendarReminder(infoEntity: HpCalendarReminderInfo): Promise<number> {
let permission = await this.requestPermission()
if (!permission) {
return 0
}
let startDate = new Date(infoEntity.startMillis ?? 0)
let endDate = new Date(infoEntity.endMillis ?? 0)
let targetReminderAgent: reminderAgentManager.ReminderRequestCalendar = {
reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_CALENDAR, // 提醒类型为日历类型
dateTime: {
// 指明提醒的目标时间
year: startDate.getFullYear(),
month: startDate.getMonth(),
day: startDate.getDay(),
hour: startDate.getHours(),
minute: startDate.getMinutes(),
second: startDate.getSeconds()
},
endDateTime: {
// 指明提醒的目标时间
year: endDate.getFullYear(),
month: endDate.getMonth(),
day: endDate.getDay(),
hour: endDate.getHours(),
minute: endDate.getMinutes(),
second: endDate.getSeconds()
},
actionButton: [// 设置弹出的提醒通知信息上显示的按钮类型和标题
{
title: 'close',
type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
},
{
title: 'snooze',
type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE
},
],
wantAgent: {
// 点击提醒通知后跳转的目标UIAbility信息
pkgName: 'com.hupu.heroes',
abilityName: 'EntryAbility'
},
maxScreenWantAgent: {
// 全屏显示提醒到达时自动拉起的目标UIAbility信息
pkgName: 'com.hupu.heroes',
abilityName: 'EntryAbility'
},
ringDuration: 5, // 指明响铃时长(单位:秒)
snoozeTimes: 2, // 指明延迟提醒次数
timeInterval: 5, // 执行延迟提醒间隔(单位:秒)
title: infoEntity.title, // 指明提醒标题
content: infoEntity.desc, // 指明提醒内容
expiredContent: 'this reminder has expired', // 指明提醒过期后需要显示的内容
snoozeContent: 'remind later', // 指明延迟提醒时需要显示的内容
notificationId: 99, // 指明提醒使用的通知的ID号,相同ID号的提醒会覆盖
slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION // 指明提醒的Slot类型
}
return new Promise<number>((resolve, reject) => {
reminderAgentManager.publishReminder(targetReminderAgent).then((result) => {
resolve(result)
}).catch(() => {
resolve(0)
})
})
}
async cancelReminder(reminderId?: number) {
return new Promise<void>((resolve, reject) => {
reminderAgentManager.cancelReminder(reminderId).then((result) => {
resolve(result)
}).catch(() => {
resolve()
})
})
}
}
//申请权限如下:
{
"name": "ohos.permission.PUBLISH_AGENT_REMINDER",
"reason": "$string:publish_agent_reminder_reason",
"usedScene": {
"when": "always"
}
}
日程管理接口已开放,日程提醒参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-calendarmanager-V5