• 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 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()