Release 4.0.0-preview1-00051
[platform/core/csapi/tizenfx.git] / src / Tizen.Pims.Calendar / Tizen.Pims.Calendar / CalendarReminder.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 using System;
18 using static Interop.Calendar.Reminder;
19
20 namespace Tizen.Pims.Calendar
21 {
22     /// <summary>
23     /// A class for reminder for event.
24     /// </summary>
25     /// <remarks>
26     /// The client who wants to be alerted at specific time should register MIME("application/x-tizen.calendar.reminder") type in manifest.xml file.
27     /// </remarks>
28     public class CalendarReminder : IDisposable
29     {
30 #region IDisposable Support
31         private bool disposedValue = false;
32
33         internal CalendarReminder()
34         {
35         }
36
37         protected virtual void Dispose(bool disposing)
38         {
39             if (!disposedValue)
40             {
41                 disposedValue = true;
42             }
43         }
44
45         /// <summary>
46         /// Releases all resources used by the CalendarReminder.
47         /// It should be called after finished using of the object.
48         /// </summary>
49         public void Dispose()
50         {
51             Dispose(true);
52         }
53 #endregion
54
55         private static readonly Interop.Calendar.Reminder.ReminderAlertedCallback _reminderAlertedCallback = (string param, IntPtr userData) =>
56         {
57             ReminderAlertedEventArgs args = new ReminderAlertedEventArgs(param);
58             s_reminderAlerted?.Invoke(null, args);
59         };
60
61         private static event EventHandler<ReminderAlertedEventArgs> s_reminderAlerted;
62
63         /// <summary>
64         /// Reminder event is triggered when the alarm is alerted.
65         /// </summary>
66         public static event EventHandler<ReminderAlertedEventArgs> ReminderAlerted
67         {
68             add
69             {
70                 Log.Debug(Globals.LogTag, "Add Reminder");
71
72                 if (s_reminderAlerted == null)
73                 {
74                     int error = Interop.Calendar.Reminder.Add(_reminderAlertedCallback, IntPtr.Zero);
75                     if (CalendarError.None != (CalendarError)error)
76                     {
77                         Log.Error(Globals.LogTag, "Add reminder Failed with error " + error);
78                         throw CalendarErrorFactory.GetException(error);
79                     }
80                 }
81                 s_reminderAlerted += value;
82             }
83
84             remove
85             {
86                 Log.Debug(Globals.LogTag, "Remove Reminder");
87
88                 s_reminderAlerted -= value;
89                 if (s_reminderAlerted == null)
90                 {
91                     /// _reminderAlertedCallback is removed by .Net Core
92                     int error = Interop.Calendar.Reminder.Remove(_reminderAlertedCallback, IntPtr.Zero);
93                     if (CalendarError.None != (CalendarError)error)
94                     {
95                         Log.Error(Globals.LogTag, "Remove reminder Failed with error " + error);
96                         throw CalendarErrorFactory.GetException(error);
97                     }
98                 }
99             }
100         }
101     }
102 }