1/* 2 * Copyright (c) 2022-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 16import notificationManager from '@ohos.notificationManager'; 17import reminderAgent from '@ohos.reminderAgentManager'; 18import vibrator from '@ohos.vibrator'; 19import AudioPlayer from './AudioPlayer'; 20import Constant from '../common/Constant'; 21import Logger from './Logger'; 22import PreferencesDataManager from './PreferencesDataManager'; 23import { Reminder } from '../common/Reminder'; 24import TimeConversion from './TimeConversion'; 25import common from '@ohos.app.ability.common'; 26import { BusinessError } from '@ohos.base'; 27import { deviceInfo } from '@kit.BasicServicesKit'; 28import { calendarManager } from '@kit.CalendarKit'; 29import { calendarMgr } from '../MainAbility/MainAbility'; 30import { promptAction } from '@kit.ArkUI'; 31 32const TAG: string = 'AlarmClockReminder'; 33let deviceTypeInfo: string = deviceInfo.deviceType; 34let calendar: calendarManager.Calendar | undefined = undefined; 35 36class AlarmClockReminder { 37 public alarmClockReminders: Reminder[] = [] 38 private date: Date = new Date(); 39 40 setCalendarReminder() { 41 let config: calendarManager.CalendarConfig = { 42 // ����������Ϣ 43 enableReminder: true, 44 color: '#aabbcc', 45 }; 46 47 calendarMgr?.getCalendar(async (err: BusinessError, data: calendarManager.Calendar) => { 48 if (err) { 49 Logger.error(TAG, `Failed to get calendar.code: ${JSON.stringify(err.code)}, message: ${JSON.stringify(err.message)}`); 50 } else { 51 Logger.info(TAG, `Succeeded in getting calendar, data ->` + JSON.stringify(data)); 52 calendar = data; 53 // ��������������Ϣ 54 await calendar!.setConfig(config).then(() => { 55 Logger.info(TAG, `Succeeded in setting config, config -> ` + JSON.stringify(config)); 56 }).catch((err: BusinessError) => { 57 Logger.error(TAG, `Failed to set config. code: ${JSON.stringify(err.code)}, message: ${JSON.stringify(err.message)}`); 58 }); 59 } 60 }); 61 } 62 63 async setAlarmReminder(time: TimePickerResult) { 64 let hour = time.hour! < 10 ? `0${time.hour}` : time.hour; 65 let minute = time.minute! < 10 ? `0${time.minute}` : time.minute; 66 let context = getContext(this) as common.UIAbilityContext; 67 let selectTime: string = `${hour}:${minute}` 68 let isExistName = this.alarmClockReminders.find(element => element.reminderName === selectTime) !== undefined 69 if (!isExistName) { 70 let reminder: Reminder = { 71 audioSrc: '', 72 audioTimeouts: 0, 73 isStart: false, 74 isVibrator: false, 75 reminderId: 0, 76 reminderName: '', 77 vibratorTimeouts: 0, 78 reminderRequestAlarm: undefined 79 } 80 await reminderAgent.addNotificationSlot({ 81 notificationType: notificationManager.SlotType.CONTENT_INFORMATION 82 }); 83 reminder.reminderName = selectTime 84 let alarm: reminderAgent.ReminderRequestAlarm = { 85 reminderType: reminderAgent.ReminderType.REMINDER_TYPE_ALARM, 86 hour: time.hour!, 87 minute: time.minute!, 88 actionButton: 89 [ 90 { 91 title: context.resourceManager.getStringSync($r('app.string.alarm_clock_close').id), 92 type: reminderAgent.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE 93 }, 94 { 95 title: context.resourceManager.getStringSync($r('app.string.alarm_clock_postpone').id), 96 type: reminderAgent.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE 97 } 98 ], 99 slotType: notificationManager.SlotType.CONTENT_INFORMATION, 100 ringDuration: Constant.REMINDER_DURATION, 101 wantAgent: { 102 pkgName: 'ohos.samples.reminderagentmanager', 103 abilityName: 'MainAbility' 104 }, 105 title: context.resourceManager.getStringSync($r('app.string.alarm_clock').id), 106 content: context.resourceManager.getStringSync($r('app.string.alarm_clock_reach').id), 107 snoozeTimes: 0, 108 timeInterval: 0, 109 daysOfWeek: [] 110 } 111 Logger.info(TAG, `this alarm clock is ${JSON.stringify(alarm)}`) 112 reminder.reminderRequestAlarm = alarm 113 reminder.isStart = false 114 this.alarmClockReminders.push(reminder) 115 Logger.info(TAG, `setAlarmReminder this all alarmclock is ${JSON.stringify(this.alarmClockReminders)}`) 116 await PreferencesDataManager.putData('alarmClock', this.alarmClockReminders) 117 this.setCalendarReminder(); 118 } else { 119 promptAction.showToast({ 120 message: context.resourceManager.getStringSync($r('app.string.alarm_clock_existence').id), 121 duration: Constant.PROMPT_DURATION 122 }) 123 } 124 } 125 126 async setToggle(isOn: boolean, index: number) { 127 let hour = this.alarmClockReminders[index].reminderRequestAlarm!.hour; 128 let minute = this.alarmClockReminders[index].reminderRequestAlarm!.minute; 129 let selectTime: string = `${hour}:${minute}`; 130 let year = this.date.getFullYear(); 131 let month = this.date.getMonth() + 1; 132 let day = this.date.getDate(); 133 this.alarmClockReminders[index].isStart = isOn 134 if (isOn) { 135 if (deviceTypeInfo === 'default') { 136 await reminderAgent.addNotificationSlot( 137 { notificationType: notificationManager.SlotType.SOCIAL_COMMUNICATION }); 138 let reminderId = await reminderAgent.publishReminder(this.alarmClockReminders[index].reminderRequestAlarm!); 139 this.alarmClockReminders[index].reminderId = reminderId; 140 } else { 141 let context = getContext(this) as common.UIAbilityContext; 142 let selectDate = `${year}-${month}-${day} ${selectTime} `; 143 let event: calendarManager.Event = { 144 type: calendarManager.EventType.NORMAL, 145 title: context.resourceManager.getStringSync($r('app.string.alarm_clock').id), 146 description: context.resourceManager.getStringSync($r('app.string.alarm_clock_reach').id), 147 reminderTime: [0], 148 startTime: Date.parse(selectDate), 149 endTime: Date.parse(selectDate) + 60 * 1000 150 }; 151 await calendar!.addEvent(event) 152 .then((data: number) => { 153 Logger.info(TAG, `Succeeded in adding event, id -> {data}`); 154 this.alarmClockReminders[index].reminderId = data; 155 }) 156 .catch((err: BusinessError) => { 157 Logger.error(TAG, `Failed to add event. 158 code: ${JSON.stringify(err.code)}, message: ${JSON.stringify(err.message)}`); 159 }); 160 } 161 if (this.alarmClockReminders[index].audioSrc) { 162 let audioIndex: number = await AudioPlayer.getAudioID(this.alarmClockReminders[index].audioSrc, 163 TimeConversion.timeToMillisecond(this.alarmClockReminders[index].reminderRequestAlarm!.hour, 164 this.alarmClockReminders[index].reminderRequestAlarm!.minute) * Constant.SECONDS_MILLISECONDS); 165 this.alarmClockReminders[index].audioTimeouts = audioIndex 166 } 167 await PreferencesDataManager.putData('alarmClock', this.alarmClockReminders) 168 if (this.alarmClockReminders[index].isVibrator) { 169 let vibratorId: number = 0; 170 try { 171 vibratorId = setTimeout(() => { 172 vibrator.startVibration({ 173 type: 'time', 174 duration: Constant.VIBRATOR_DURATION 175 }, { 176 id: 0, 177 usage: 'alarm' 178 }) 179 .then(() => { 180 Logger.info(TAG, `succeed in starting vibration`); 181 }, (error: BusinessError) => { 182 Logger.error(TAG, `setToggle this vibrator is failed. 183 code: ${JSON.stringify(error.code)}, message: ${JSON.stringify(error.message)}`); 184 }); 185 }, TimeConversion.timeToMillisecond(this.alarmClockReminders[index].reminderRequestAlarm!.hour, 186 this.alarmClockReminders[index].reminderRequestAlarm!.minute) * Constant.SECONDS_MILLISECONDS); 187 } catch (err) { 188 Logger.error(TAG, `start vibration error occurred. 189 code: ${JSON.stringify(err.code)}, message: ${JSON.stringify(err.message)}`); 190 } 191 this.alarmClockReminders[index].vibratorTimeouts = vibratorId; 192 await PreferencesDataManager.putData('alarmClock', this.alarmClockReminders); 193 } else { 194 clearTimeout(this.alarmClockReminders[index].vibratorTimeouts); 195 await vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME); 196 } 197 } else { 198 clearTimeout(this.alarmClockReminders[index].vibratorTimeouts) 199 clearTimeout(this.alarmClockReminders[index].audioTimeouts) 200 await PreferencesDataManager.putData('alarmClock', this.alarmClockReminders) 201 if (deviceTypeInfo === 'default') { 202 await reminderAgent.cancelReminder(this.alarmClockReminders[index].reminderId); 203 } else { 204 await calendar!.deleteEvent(this.alarmClockReminders[index].reminderId); 205 } 206 await vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME); 207 } 208 } 209 210 async openDialog(dialog: CustomDialogController, index: number) { 211 dialog.open(); 212 } 213 214 async deleteAlarmReminder(index: number) { 215 try { 216 clearTimeout(this.alarmClockReminders[index].vibratorTimeouts) 217 clearTimeout(this.alarmClockReminders[index].audioTimeouts) 218 if (deviceTypeInfo === 'default') { 219 reminderAgent.cancelReminder(this.alarmClockReminders[index].reminderId).then(() => { 220 Logger.info(TAG, `deleteAlarmReminder cancelReminder is succeed`); 221 }).catch((err: BusinessError) => { 222 Logger.info(TAG, `deleteAlarmReminder cancelReminder is not exist err is ${JSON.stringify(err)}`); 223 }) 224 } else { 225 calendar!.deleteEvent(this.alarmClockReminders[index].reminderId).then(() => { 226 Logger.info(TAG, `Succeeded in deleting event`); 227 }).catch((err: BusinessError) => { 228 Logger.error(TAG, `Failed to delete event. Code: ${err.code}, message: ${err.message}`); 229 }); 230 } 231 vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME).then(() => { 232 Logger.info(TAG, `deleteAlarmReminder stop vibrator is succeed`) 233 }).catch((err: BusinessError) => { 234 Logger.error(TAG, `deleteAlarmReminder vibrator is not exist err is ${JSON.stringify(err)}`) 235 }) 236 this.alarmClockReminders[index].isStart = false 237 this.alarmClockReminders[index].reminderName = '' 238 this.alarmClockReminders[index].vibratorTimeouts = 0 239 this.alarmClockReminders[index].reminderRequestAlarm = undefined 240 } catch (err) { 241 Logger.info(TAG, `this cancel not exist err is ${JSON.stringify(err)}`) 242 } 243 this.alarmClockReminders.splice(index, 1) 244 Logger.info(TAG, `deleteAlarmReminder this all alarmclock is ${JSON.stringify(this.alarmClockReminders)}`) 245 PreferencesDataManager.putData('alarmClock', this.alarmClockReminders).then(() => { 246 Logger.info(TAG, `deleteAlarmReminder this put data is successed`) 247 }) 248 } 249} 250 251export default new AlarmClockReminder()