diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 76d10e057b..651c862f5a 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -4094,7 +4094,7 @@ public class AdapterMessage extends RecyclerView.Adapter getSelectedCalendar(EntityAccount account) { try { JSONObject jselected = new JSONObject(account.calendar); - selectedAccount = jselected.getString("account"); - selectedName = jselected.optString("name", null); + return new Pair<>( + jselected.getString("account"), + jselected.optString("name", null)); } catch (Throwable ex) { Log.i(ex); - selectedAccount = account.calendar; - selectedName = null; + return new Pair<>(account.calendar, null); } + } - return insert(context, icalendar, event, status, selectedAccount, selectedName, message); + static Long insert(Context context, ICalendar icalendar, VEvent event, int status, + EntityAccount account, EntityMessage message) { + Pair selected = getSelectedCalendar(account); + return insert(context, icalendar, event, status, selected.first, selected.second, message); } static Long insert(Context context, ICalendar icalendar, VEvent event, int status, @@ -493,11 +496,36 @@ public class CalendarHelper { } } - static void delete(Context context, VEvent event, EntityMessage message) { + static void delete(Context context, ICalendar icalendar, VEvent event, EntityAccount account, EntityMessage message) { String uid = (event.getUid() == null ? null : event.getUid().getValue()); if (TextUtils.isEmpty(uid)) return; + RecurrenceId recurrenceId = event.getProperty(biweekly.property.RecurrenceId.class); + if (recurrenceId != null) { + ICalDate start = recurrenceId.getValue(); + if (!start.hasTime()) + return; + + Pair selected = getSelectedCalendar(account); + Long existId = exists(context, selected.first, selected.second, uid); + if (existId == null) + return; + + ContentValues values = new ContentValues(); + values.put(CalendarContract.Events.ORIGINAL_INSTANCE_TIME, start.getTime()); + values.put(CalendarContract.Events.EVENT_TIMEZONE, "UTC"); + values.put(CalendarContract.Events.STATUS, CalendarContract.Events.STATUS_CANCELED); + Uri uri = Uri.withAppendedPath(CalendarContract.Events.CONTENT_EXCEPTION_URI, + String.valueOf(existId)); + ContentResolver resolver = context.getContentResolver(); + Uri cancel = resolver.insert(uri, values); + EntityLog.log(context, EntityLog.Type.General, message, "Inserted recurring event cancel" + + " start=" + new Date(start.getTime()) + + " uri=" + cancel); + return; + } + ContentResolver resolver = context.getContentResolver(); try (Cursor cursor = resolver.query(CalendarContract.Events.CONTENT_URI, new String[]{CalendarContract.Events._ID}, diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 0b5d5a077a..105af38460 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -4760,7 +4760,7 @@ public class MessageHelper { // https://www.rfc-editor.org/rfc/rfc5546#section-3.2 Method method = icalendar.getMethod(); if (method != null && method.isCancel()) - CalendarHelper.delete(context, event, message); + CalendarHelper.delete(context, icalendar, event, account, message); else if (method == null || method.isRequest()) { if (ical_tentative) CalendarHelper.insert(context, icalendar, event,