Get rid of system.drawing and uwp notifications pacakge. Remove the AOT/trim stuff for now.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Diagnostics;
|
||||
@@ -662,14 +662,40 @@ public class AccountService : BaseDatabaseService, IAccountService
|
||||
|
||||
private static string GetReadableTextColorHex(string backgroundColorHex)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(backgroundColorHex))
|
||||
if (!TryParseHexColor(backgroundColorHex, out var red, out var green, out var blue))
|
||||
return "#FFFFFF";
|
||||
|
||||
var color = ColorTranslator.FromHtml(backgroundColorHex);
|
||||
var luminance = ((0.299 * color.R) + (0.587 * color.G) + (0.114 * color.B)) / 255d;
|
||||
var luminance = ((0.299 * red) + (0.587 * green) + (0.114 * blue)) / 255d;
|
||||
return luminance > 0.6 ? "#111111" : "#FFFFFF";
|
||||
}
|
||||
|
||||
private static bool TryParseHexColor(string value, out int red, out int green, out int blue)
|
||||
{
|
||||
red = 255;
|
||||
green = 255;
|
||||
blue = 255;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
return false;
|
||||
|
||||
var color = value.Trim();
|
||||
if (color.StartsWith('#'))
|
||||
{
|
||||
color = color[1..];
|
||||
}
|
||||
|
||||
if (color.Length != 6 ||
|
||||
!int.TryParse(color, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out _))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
red = Convert.ToInt32(color.Substring(0, 2), 16);
|
||||
green = Convert.ToInt32(color.Substring(2, 2), 16);
|
||||
blue = Convert.ToInt32(color.Substring(4, 2), 16);
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task UpdateAccountOrdersAsync(Dictionary<Guid, int> accountIdOrderPair)
|
||||
{
|
||||
foreach (var pair in accountIdOrderPair)
|
||||
|
||||
@@ -421,14 +421,14 @@ public sealed class CalDavClient : ICalDavClient
|
||||
var result = new List<CalDavCalendarEvent>();
|
||||
|
||||
var masters = allEvents
|
||||
.Where(e => e != null && !string.IsNullOrWhiteSpace(e.Uid) && e.RecurrenceId == null)
|
||||
.Where(e => e != null && !string.IsNullOrWhiteSpace(e.Uid) && GetRecurrenceId(e) == null)
|
||||
.GroupBy(e => e.Uid, StringComparer.OrdinalIgnoreCase)
|
||||
.Select(g => g.First())
|
||||
.ToList();
|
||||
|
||||
var exceptionMap = allEvents
|
||||
.Where(e => e != null && !string.IsNullOrWhiteSpace(e.Uid) && e.RecurrenceId != null)
|
||||
.GroupBy(e => $"{e.Uid}|{GetOccurrenceKey(e.RecurrenceId)}", StringComparer.OrdinalIgnoreCase)
|
||||
.Where(e => e != null && !string.IsNullOrWhiteSpace(e.Uid) && GetRecurrenceId(e) != null)
|
||||
.GroupBy(e => $"{e.Uid}|{GetOccurrenceKey(GetRecurrenceId(e))}", StringComparer.OrdinalIgnoreCase)
|
||||
.ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
var consumedExceptions = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
@@ -453,7 +453,15 @@ public sealed class CalDavClient : ICalDavClient
|
||||
seriesMasterRemoteEventId: string.Empty,
|
||||
recurrence: BuildRecurrenceString(master)));
|
||||
|
||||
var occurrences = master.GetOccurrences(windowStartUtc.UtcDateTime, windowEndUtc.UtcDateTime);
|
||||
var occurrences = master
|
||||
.GetOccurrences(
|
||||
new CalDateTime(windowStartUtc.UtcDateTime, true),
|
||||
new Ical.Net.Evaluation.EvaluationOptions())
|
||||
.Where(o => Overlaps(
|
||||
ToDateTimeOffset(o.Period.StartTime),
|
||||
ToDateTimeOffset(o.Period.EndTime),
|
||||
windowStartUtc,
|
||||
windowEndUtc));
|
||||
|
||||
foreach (var occurrence in occurrences)
|
||||
{
|
||||
@@ -507,9 +515,10 @@ public sealed class CalDavClient : ICalDavClient
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var exceptionEvent in allEvents.Where(e => e != null && e.RecurrenceId != null && !string.IsNullOrWhiteSpace(e.Uid)))
|
||||
foreach (var exceptionEvent in allEvents.Where(e => e != null && GetRecurrenceId(e) != null && !string.IsNullOrWhiteSpace(e.Uid)))
|
||||
{
|
||||
var key = $"{exceptionEvent.Uid}|{GetOccurrenceKey(exceptionEvent.RecurrenceId)}";
|
||||
var recurrenceId = GetRecurrenceId(exceptionEvent);
|
||||
var key = $"{exceptionEvent.Uid}|{GetOccurrenceKey(recurrenceId)}";
|
||||
if (consumedExceptions.Contains(key))
|
||||
continue;
|
||||
|
||||
@@ -525,7 +534,7 @@ public sealed class CalDavClient : ICalDavClient
|
||||
sourceEvent: exceptionEvent,
|
||||
start: start,
|
||||
end: end,
|
||||
remoteEventId: BuildRemoteEventId(exceptionEvent.Uid, GetOccurrenceKey(exceptionEvent.RecurrenceId)),
|
||||
remoteEventId: BuildRemoteEventId(exceptionEvent.Uid, GetOccurrenceKey(recurrenceId)),
|
||||
resourceHref: resourceHref,
|
||||
eTag: eTag,
|
||||
icsContent: icsContent,
|
||||
@@ -546,16 +555,30 @@ public sealed class CalDavClient : ICalDavClient
|
||||
|
||||
private static bool HasRecurrence(CalendarEvent calendarEvent)
|
||||
=> (calendarEvent.RecurrenceRules?.Any() ?? false)
|
||||
|| (calendarEvent.RecurrenceDates?.Any() ?? false);
|
||||
|| (calendarEvent.RecurrenceDates?.GetAllPeriods().Any() ?? false);
|
||||
|
||||
private static string BuildRemoteEventId(string uid, string occurrenceKey)
|
||||
=> string.IsNullOrWhiteSpace(occurrenceKey) ? uid : $"{uid}::{occurrenceKey}";
|
||||
|
||||
private static string GetOccurrenceKey(IDateTime dateTime)
|
||||
private static CalDateTime GetRecurrenceId(CalendarEvent calendarEvent)
|
||||
=> calendarEvent?.RecurrenceIdentifier?.StartTime;
|
||||
|
||||
private static string GetOccurrenceKey(CalDateTime dateTime)
|
||||
=> dateTime.AsUtc.ToString("yyyyMMdd'T'HHmmss'Z'");
|
||||
|
||||
private static DateTimeOffset ToDateTimeOffset(IDateTime dateTime)
|
||||
=> dateTime?.AsDateTimeOffset ?? default;
|
||||
private static DateTimeOffset ToDateTimeOffset(CalDateTime dateTime)
|
||||
{
|
||||
if (dateTime == null)
|
||||
return default;
|
||||
|
||||
if (dateTime.IsFloating)
|
||||
{
|
||||
var floatingValue = DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Unspecified);
|
||||
return new DateTimeOffset(floatingValue, TimeZoneInfo.Local.GetUtcOffset(floatingValue));
|
||||
}
|
||||
|
||||
return new DateTimeOffset(DateTime.SpecifyKind(dateTime.AsUtc, DateTimeKind.Utc));
|
||||
}
|
||||
|
||||
private static bool Overlaps(DateTimeOffset start, DateTimeOffset end, DateTimeOffset windowStart, DateTimeOffset windowEnd)
|
||||
{
|
||||
@@ -601,7 +624,7 @@ public sealed class CalDavClient : ICalDavClient
|
||||
.Where(a => a?.Trigger != null && a.Trigger.IsRelative && a.Trigger.Duration.HasValue)
|
||||
.Select(a => new CalDavEventReminder
|
||||
{
|
||||
DurationInSeconds = (int)Math.Abs(a.Trigger.Duration.Value.TotalSeconds),
|
||||
DurationInSeconds = (int)Math.Abs(a.Trigger.Duration.Value.ToTimeSpanUnspecified().TotalSeconds),
|
||||
ReminderType = string.Equals(a.Action, "EMAIL", StringComparison.OrdinalIgnoreCase)
|
||||
? CalendarItemReminderType.Email
|
||||
: CalendarItemReminderType.Popup
|
||||
@@ -638,7 +661,7 @@ public sealed class CalDavClient : ICalDavClient
|
||||
};
|
||||
}
|
||||
|
||||
private static string ResolveTimeZoneId(IDateTime sourceDateTime, DateTimeOffset parsedDateTime)
|
||||
private static string ResolveTimeZoneId(CalDateTime sourceDateTime, DateTimeOffset parsedDateTime)
|
||||
{
|
||||
var explicitTimeZoneId = sourceDateTime?.TzId;
|
||||
if (!string.IsNullOrWhiteSpace(explicitTimeZoneId))
|
||||
@@ -664,34 +687,26 @@ public sealed class CalDavClient : ICalDavClient
|
||||
|
||||
if (sourceEvent.ExceptionDates != null)
|
||||
{
|
||||
foreach (var periodList in sourceEvent.ExceptionDates)
|
||||
{
|
||||
var dates = periodList
|
||||
.Where(p => p.StartTime != null)
|
||||
.Select(p => p.StartTime.AsUtc.ToString("yyyyMMdd'T'HHmmss'Z'"))
|
||||
.ToList();
|
||||
var dates = sourceEvent.ExceptionDates
|
||||
.GetAllDates()
|
||||
.Where(d => d != null)
|
||||
.Select(d => d.AsUtc.ToString("yyyyMMdd'T'HHmmss'Z'"))
|
||||
.ToList();
|
||||
|
||||
if (dates.Count > 0)
|
||||
{
|
||||
recurrenceLines.Add($"EXDATE:{string.Join(",", dates)}");
|
||||
}
|
||||
}
|
||||
if (dates.Count > 0)
|
||||
recurrenceLines.Add($"EXDATE:{string.Join(",", dates)}");
|
||||
}
|
||||
|
||||
if (sourceEvent.RecurrenceDates != null)
|
||||
{
|
||||
foreach (var periodList in sourceEvent.RecurrenceDates)
|
||||
{
|
||||
var dates = periodList
|
||||
.Where(p => p.StartTime != null)
|
||||
.Select(p => p.StartTime.AsUtc.ToString("yyyyMMdd'T'HHmmss'Z'"))
|
||||
.ToList();
|
||||
var dates = sourceEvent.RecurrenceDates
|
||||
.GetAllPeriods()
|
||||
.Where(p => p.StartTime != null)
|
||||
.Select(p => p.StartTime.AsUtc.ToString("yyyyMMdd'T'HHmmss'Z'"))
|
||||
.ToList();
|
||||
|
||||
if (dates.Count > 0)
|
||||
{
|
||||
recurrenceLines.Add($"RDATE:{string.Join(",", dates)}");
|
||||
}
|
||||
}
|
||||
if (dates.Count > 0)
|
||||
recurrenceLines.Add($"RDATE:{string.Join(",", dates)}");
|
||||
}
|
||||
|
||||
return recurrenceLines.Count == 0
|
||||
|
||||
Reference in New Issue
Block a user