1/* 2 * Copyright (c) 2022 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 notification from '@ohos.notification' 17import prompt from '@ohos.prompt' 18import reminderAgent from '@ohos.reminderAgentManager'; 19import vibrator from '@ohos.vibrator' 20import AudioPlayer from './AudioPlayer' 21import Constant from '../common/Constant' 22import Logger from './Logger' 23import PreferencesDataManager from './PreferencesDataManager' 24import { Reminder } from '../common/Reminder' 25import TimeConversion from './TimeConversion' 26 27const TAG: string = 'CalendarReminder' 28 29class CalendarReminder { 30 public calendarReminders: Reminder[] = [] 31 32 async setCalendar(date: DatePickerResult) { 33 let month = date.month < 9 ? `0${date.month + 1}` : `${date.month + 1}` 34 let day = date.day < 10 ? `0${date.day}` : date.day 35 let context: any = getContext(this) 36 let selectCalendar: string = `${date.year}-${month}-${day}` 37 let isExistName = this.calendarReminders.find(element => element.reminderName === selectCalendar) !== undefined 38 if (!isExistName) { 39 let reminder: Reminder = { 40 audioSrc: '', 41 audioTimeouts: 0, 42 isStart: false, 43 isVibrator: false, 44 reminderId: 0, 45 reminderName: '', 46 vibratorTimeouts: 0, 47 reminderRequestCalendar: undefined 48 } 49 await reminderAgent.addNotificationSlot({ type: notification.SlotType.SERVICE_INFORMATION }) 50 reminder.reminderName = selectCalendar 51 let calendar: reminderAgent.ReminderRequestCalendar = { 52 reminderType: reminderAgent.ReminderType.REMINDER_TYPE_CALENDAR, 53 dateTime: { 54 year: date.year, 55 month: date.month + 1, 56 day: date.day, 57 hour: 0, 58 minute: 0, 59 }, 60 actionButton: 61 [{ 62 title: context.resourceManager.getStringSync($r('app.string.calendar_close').id), 63 type: reminderAgent.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE 64 }], 65 wantAgent: { pkgName: 'ohos.samples.reminderagentmanager', abilityName: 'MainAbility' }, 66 ringDuration: Constant.REMINDER_DURATION, 67 title: context.resourceManager.getStringSync($r('app.string.calendar').id), 68 content: context.resourceManager.getStringSync($r('app.string.calendar_reach').id), 69 slotType: notification.SlotType.CONTENT_INFORMATION 70 } 71 Logger.info(TAG, `setCalendar this calendar is ${JSON.stringify(calendar)}}`) 72 reminder.reminderRequestCalendar = calendar 73 reminder.isStart = false 74 this.calendarReminders.push(reminder) 75 Logger.info(TAG, `setCalendar this all calendar is ${JSON.stringify(this.calendarReminders)}`) 76 await PreferencesDataManager.putData('Calendar', this.calendarReminders) 77 } else { 78 prompt.showToast({ 79 message: context.resourceManager.getStringSync($r('app.string.calendar_existence').id), 80 duration: Constant.PROMPT_DURATION 81 }) 82 } 83 } 84 85 async setToggle(isOn: boolean, index: number) { 86 this.calendarReminders[index].isStart = isOn 87 if (isOn) { 88 await reminderAgent.addNotificationSlot({ type: notification.SlotType.SERVICE_INFORMATION }); 89 let reminderId = await reminderAgent.publishReminder(this.calendarReminders[index].reminderRequestCalendar) 90 this.calendarReminders[index].reminderId = reminderId; 91 if (this.calendarReminders[index].audioSrc) { 92 let audioIndex: number = await AudioPlayer.getAudioID( 93 this.calendarReminders[index].audioSrc, TimeConversion.dateToMillisecond( 94 this.calendarReminders[index].reminderRequestCalendar.dateTime.year, 95 this.calendarReminders[index].reminderRequestCalendar.dateTime.month, 96 this.calendarReminders[index].reminderRequestCalendar.dateTime.day, 97 this.calendarReminders[index].reminderRequestCalendar.dateTime.hour, 98 this.calendarReminders[index].reminderRequestCalendar.dateTime.minute) * Constant.SECONDS_MILLISECONDS); 99 this.calendarReminders[index].audioTimeouts = audioIndex; 100 } 101 await PreferencesDataManager.putData('Calendar', this.calendarReminders) 102 if (this.calendarReminders[index].isVibrator) { 103 let vibratorId = setTimeout(function () { 104 vibrator.vibrate(Constant.VIBRATOR_DURATION, function (err) { 105 if (err) { 106 Logger.error(TAG, `setToggle this vibrator is failed err is ${JSON.stringify(err)}`) 107 } else { 108 Logger.info(TAG, `setToggle this vibrator is successed`) 109 } 110 }) 111 }, TimeConversion.dateToMillisecond(this.calendarReminders[index].reminderRequestCalendar.dateTime.year, 112 this.calendarReminders[index].reminderRequestCalendar.dateTime.month, 113 this.calendarReminders[index].reminderRequestCalendar.dateTime.day, 114 this.calendarReminders[index].reminderRequestCalendar.dateTime.hour, 115 this.calendarReminders[index].reminderRequestCalendar.dateTime.minute) * Constant.SECONDS_MILLISECONDS) 116 this.calendarReminders[index].vibratorTimeouts = vibratorId 117 await PreferencesDataManager.putData('Calendar', this.calendarReminders) 118 } else { 119 clearTimeout(this.calendarReminders[index].vibratorTimeouts) 120 await vibrator.stop(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME) 121 } 122 } else { 123 clearTimeout(this.calendarReminders[index].vibratorTimeouts) 124 clearTimeout(this.calendarReminders[index].audioTimeouts) 125 await PreferencesDataManager.putData('Calendar', this.calendarReminders); 126 await reminderAgent.cancelReminder(this.calendarReminders[index].reminderId) 127 await vibrator.stop(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME) 128 } 129 } 130 131 async openDialog(dialog: CustomDialogController, index: number) { 132 try { 133 await reminderAgent.cancelReminder(this.calendarReminders[index].reminderId) 134 } catch (err) { 135 Logger.error(TAG, `openDialog this cancelReminder is not exist,err is ${JSON.stringify(err)}`) 136 } 137 dialog.open() 138 } 139 140 async deleteCalendar(index: number) { 141 try { 142 clearTimeout(this.calendarReminders[index].vibratorTimeouts) 143 clearTimeout(this.calendarReminders[index].audioTimeouts) 144 reminderAgent.cancelReminder(this.calendarReminders[index].reminderId).then(() => { 145 Logger.info(TAG, `deleteCalendar cancelReminder is succeed`) 146 }) 147 vibrator.stop(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_TIME).then(() => { 148 Logger.info(TAG, `deleteCalendar stop vibrator is succeed`) 149 }) 150 this.calendarReminders[index].isStart = false 151 this.calendarReminders[index].reminderName = '' 152 this.calendarReminders[index].vibratorTimeouts = 0 153 this.calendarReminders[index].reminderRequestCalendar = undefined 154 } catch (err) { 155 Logger.info(TAG, `deleteCalendar this cancel not exist err is ${JSON.stringify(err)}`) 156 } 157 this.calendarReminders.splice(index, 1) 158 Logger.info(TAG, `deleteCalendar this all calendar is ${JSON.stringify(this.calendarReminders)}`) 159 PreferencesDataManager.putData('Calendar', this.calendarReminders).then(() => { 160 Logger.info(TAG, `deleteCalendar this put data is successed`) 161 }) 162 } 163} 164 165export default new CalendarReminder()