• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()