/// <summary> /// Add new event to a calendar or update an existing event. /// If a new event was added, the ExternalID property will be set on the CalendarEvent object, /// to support future queries/updates. /// Throws if Calendar ID is empty, calendar does not exist, or calendar is read-only. /// </summary> /// <param name="calendar">Destination calendar</param> /// <param name="calendarEvent">Event to add or update</param> /// <exception cref="System.ArgumentException">Calendar is not specified, does not exist on device, or is read-only</exception> /// <exception cref="System.UnauthorizedAccessException">Calendar access denied</exception> /// <exception cref="System.InvalidOperationException">Editing recurring events is not supported</exception> /// <exception cref="System.ArgumentOutOfRangeException">Windows does not support multiple reminders</exception> /// <exception cref="Plugin.Calendars.Abstractions.PlatformException">Unexpected platform-specific error</exception> public async Task AddOrUpdateEventAsync(Calendar calendar, CalendarEvent calendarEvent) { await EnsureInitializedAsync().ConfigureAwait(false); AppointmentCalendar appCalendar = null; if (string.IsNullOrEmpty(calendar.ExternalID)) { throw new ArgumentException("Missing calendar identifier", "calendar"); } else { appCalendar = await GetAndValidateLocalCalendarAsync(calendar.ExternalID).ConfigureAwait(false); } // Android/iOS support multiple reminders, but Windows only allows one if (calendarEvent.Reminders?.Count > 1) { throw new ArgumentOutOfRangeException(nameof(calendarEvent), "Windows does not support multiple reminders"); } Appointment appt = null; // If Event already corresponds to an existing Appointment in the target // Calendar, then edit that instead of creating a new one. // if (!string.IsNullOrEmpty(calendarEvent.ExternalID)) { var existingAppt = await _localApptStore.GetAppointmentAsync(calendarEvent.ExternalID); if (existingAppt?.Recurrence != null) { throw new InvalidOperationException("Editing recurring events is not supported"); } if (existingAppt != null && existingAppt.CalendarId == appCalendar.LocalId) { appt = existingAppt; } } if (appt == null) { appt = new Appointment(); } appt.Subject = calendarEvent.Name; appt.Details = calendarEvent.Description ?? string.Empty; appt.StartTime = calendarEvent.Start; appt.Duration = calendarEvent.End - calendarEvent.Start; appt.AllDay = calendarEvent.AllDay; appt.Location = calendarEvent.Location ?? string.Empty; appt.Reminder = calendarEvent.Reminders?.FirstOrDefault()?.TimeBefore; await appCalendar.SaveAppointmentAsync(appt); calendarEvent.ExternalID = appt.LocalId; }
/// <summary> /// Add new event to a calendar or update an existing event. /// Throws if Calendar ID is empty, calendar does not exist, or calendar is read-only. /// </summary> /// <param name="calendar">Destination calendar</param> /// <param name="calendarEvent">Event to add or update</param> /// <exception cref="System.ArgumentException">Calendar is not specified, does not exist on device, or is read-only</exception> /// <exception cref="System.UnauthorizedAccessException">Calendar access denied</exception> /// <exception cref="Calendars.Plugin.Abstractions.PlatformException">Unexpected platform-specific error</exception> public async Task AddOrUpdateEventAsync(Calendar calendar, CalendarEvent calendarEvent) { await EnsureInitializedAsync().ConfigureAwait(false); AppointmentCalendar appCalendar = null; if (string.IsNullOrEmpty(calendar.ExternalID)) { throw new ArgumentException("Missing calendar identifier", "calendar"); } else { appCalendar = await GetAndValidateLocalCalendarAsync(calendar.ExternalID).ConfigureAwait(false); } Appointment appt = null; // If Event already corresponds to an existing Appointment in the target // Calendar, then edit that instead of creating a new one. // if (!string.IsNullOrEmpty(calendarEvent.ExternalID)) { var existingAppt = await _localApptStore.GetAppointmentAsync(calendarEvent.ExternalID); if (existingAppt != null && existingAppt.CalendarId == appCalendar.LocalId) { appt = existingAppt; } } if (appt == null) { appt = new Appointment(); } appt.Subject = calendarEvent.Name; appt.Details = calendarEvent.Description ?? string.Empty; appt.StartTime = calendarEvent.Start; appt.Duration = calendarEvent.End - calendarEvent.Start; appt.AllDay = calendarEvent.AllDay; appt.Location = calendarEvent.Location ?? string.Empty; await appCalendar.SaveAppointmentAsync(appt); calendarEvent.ExternalID = appt.LocalId; }
/// <summary> /// Gets a single calendar event by platform-specific ID. /// </summary> /// <param name="externalId">Platform-specific calendar event identifier</param> /// <returns>The corresponding calendar event, or null if not found</returns> /// <exception cref="System.UnauthorizedAccessException">Calendar access denied</exception> /// <exception cref="Plugin.Calendars.Abstractions.PlatformException">Unexpected platform-specific error</exception> public async Task <CalendarEvent> GetEventByIdAsync(string externalId) { if (string.IsNullOrWhiteSpace(externalId)) { return(null); } await EnsureInitializedAsync().ConfigureAwait(false); var appt = await _apptStore.GetAppointmentAsync(externalId).ConfigureAwait(false); return(appt == null ? null : appt.ToCalendarEvent()); }
// ******** *********************** *********// // ******** Creates New Appointment *********// // ******** *********************** *********// public static async Task <Appointment> Add(Appointment appointment) { await SetAppointmentStore(); var roamingId = await AppointmentManager.ShowEditNewAppointmentAsync(appointment); if (roamingId == null) { return(null); } var localIDs = await _appointmentStore.FindLocalIdsFromRoamingIdAsync(roamingId); if (localIDs.Count == 0) { return(null); } var localId = localIDs[0]; return(await _appointmentStore.GetAppointmentAsync(localId)); }