EKCalendar SaveEKCalendar(EKSource source, string calendarName, string color = null) { var calendar = EKCalendar.Create(EKEntityType.Event, _eventStore); //Setup calendar to be inserted calendar.Title = calendarName; NSError error = null; if (!string.IsNullOrEmpty(color)) { calendar.CGColor = ColorConversion.ToCGColor(color); } calendar.Source = source; if (_eventStore.SaveCalendar(calendar, true, out error)) { return(calendar); } _eventStore.Reset(); return(null); }
/// <summary> /// Tries to create a new calendar with the specified source/name/color. /// May fail depending on source. /// </summary> /// <remarks> /// This is only intended as a helper method for CreateEKCalendar, /// not to be called independently. /// </remarks> /// <returns>The created native calendar, or null on failure</returns> /// <param name="source">Calendar source (e.g. iCloud vs local vs gmail)</param> /// <param name="calendarName">Calendar name.</param> /// <param name="color">Calendar color.</param> private EKCalendar SaveEKCalendar(EKSource source, string calendarName, string color = null) { var calendar = EKCalendar.Create(EKEntityType.Event, _eventStore); // Setup calendar to be inserted // calendar.Title = calendarName; if (!string.IsNullOrEmpty(color)) { calendar.CGColor = ColorConversion.ToCGColor(color); } calendar.Source = source; NSError error = null; if (_eventStore.SaveCalendar(calendar, true, out error)) { Console.WriteLine($"Successfully saved calendar with source {source.Title}"); // TODO: Should we try calling GetCalendars to make sure that // the calendar isn't hidden?? // return(calendar); } else { Console.WriteLine($"Tried and failed to save calendar with source {source.Title}"); } _eventStore.Reset(); return(null); }
/// <summary> /// Creates a new calendar or updates the name and color of an existing one. /// </summary> /// <param name="calendar">The calendar to create/update</param> /// <exception cref="System.ArgumentException">Calendar 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 AddOrUpdateCalendarAsync(Calendar calendar) { await RequestCalendarAccess().ConfigureAwait(false); EKCalendar deviceCalendar = null; if (!string.IsNullOrEmpty(calendar.ExternalID)) { deviceCalendar = _eventStore.GetCalendar(calendar.ExternalID); if (deviceCalendar == null) { throw new ArgumentException("Specified calendar does not exist on device", "calendar"); } } if (deviceCalendar == null) { deviceCalendar = CreateEKCalendar(calendar.Name, calendar.Color); calendar.ExternalID = deviceCalendar.CalendarIdentifier; // Update color in case iOS assigned one if (deviceCalendar?.CGColor != null) { calendar.Color = ColorConversion.ToHexColor(deviceCalendar.CGColor); } } else { deviceCalendar.Title = calendar.Name; if (!string.IsNullOrEmpty(calendar.Color)) { deviceCalendar.CGColor = ColorConversion.ToCGColor(calendar.Color); } NSError error = null; if (!_eventStore.SaveCalendar(deviceCalendar, true, out error)) { // Without this, the eventStore will continue to return the "updated" // calendar even though the save failed! // (this obviously also resets any other changes, but since we own the eventStore // we can be pretty confident that won't be an issue) // _eventStore.Reset(); if (error.Domain == _ekErrorDomain && error.Code == (int)EKErrorCode.CalendarIsImmutable) { throw new ArgumentException(error.LocalizedDescription, new NSErrorException(error)); } else { throw new PlatformException(error.LocalizedDescription, new NSErrorException(error)); } } } }
/// <summary> /// Creates a new Calendars.Plugin.Abstractions.Calendar from an EKCalendar /// </summary> /// <param name="ekCalendar">Source EKCalendar</param> /// <returns>Corresponding Calendars.Plugin.Abstractions.Calendar</returns> public static Calendar ToCalendar(this EKCalendar ekCalendar) { return(new Calendar { Name = ekCalendar.Title, ExternalID = ekCalendar.CalendarIdentifier, CanEditCalendar = ekCalendar.AllowsContentModifications, CanEditEvents = ekCalendar.AllowsContentModifications, Color = ColorConversion.ToHexColor(ekCalendar.CGColor) }); }
/// <summary> /// Creates a new Calendars.Plugin.Abstractions.Calendar from an EKCalendar /// </summary> /// <param name="ekCalendar">Source EKCalendar</param> /// <returns>Corresponding Calendars.Plugin.Abstractions.Calendar</returns> public static Calendar ToCalendar(this EKCalendar ekCalendar) { System.Console.WriteLine($"Calendar: {ekCalendar.Title}, Source: {ekCalendar.Source.Title}, {ekCalendar.Source.SourceType}"); return(new Calendar { Name = ekCalendar.Title, ExternalID = ekCalendar.CalendarIdentifier, CanEditCalendar = ekCalendar.AllowsContentModifications, CanEditEvents = ekCalendar.AllowsContentModifications, Color = ColorConversion.ToHexColor(ekCalendar.CGColor) }); }