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