diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index 358aaab260..0aa00c91fe 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -449,7 +449,7 @@ public class FragmentAccount extends FragmentBase { @Override public void onClick(View v) { Bundle args = new Bundle(); - args.putString("account", calendar); + args.putString("calendar", calendar); FragmentDialogCalendar fragment = new FragmentDialogCalendar(); fragment.setArguments(args); @@ -1877,7 +1877,12 @@ public class FragmentAccount extends FragmentBase { if (resultCode == RESULT_OK && data != null) { if (ActivityBilling.isPro(getContext())) { Bundle args = data.getBundleExtra("args"); - calendar = args.getString("account"); + JSONObject jobject = new JSONObject(); + jobject.put("id", args.getLong("id")); + jobject.put("account", args.getString("account")); + jobject.put("type", args.getString("type")); + jobject.put("name", args.getString("name")); + calendar = jobject.toString(); } else startActivity(new Intent(getContext(), ActivityBilling.class)); } diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogCalendar.java b/app/src/main/java/eu/faircode/email/FragmentDialogCalendar.java index a057dddcfd..e5262c3e87 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogCalendar.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogCalendar.java @@ -29,12 +29,16 @@ import android.content.DialogInterface; import android.database.Cursor; import android.os.Bundle; import android.provider.CalendarContract; +import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.json.JSONObject; + import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class FragmentDialogCalendar extends FragmentDialogBase { @NonNull @@ -43,14 +47,28 @@ public class FragmentDialogCalendar extends FragmentDialogBase { final Context context = getContext(); final ContentResolver resolver = context.getContentResolver(); - String selectedAccount = getArguments().getString("account"); + String selectedCalendar = getArguments().getString("calendar"); + String selectedAccount; + String selectedName; + try { + JSONObject jselected = new JSONObject(selectedCalendar); + selectedAccount = jselected.getString("account"); + selectedName = jselected.getString("name"); + } catch (Throwable ex) { + Log.i(ex); + selectedAccount = selectedCalendar; + selectedName = null; + } List calendars = new ArrayList<>(); try (Cursor cursor = resolver.query(CalendarContract.Calendars.CONTENT_URI, new String[]{ CalendarContract.Calendars._ID, CalendarContract.Calendars.ACCOUNT_NAME, - CalendarContract.Calendars.ACCOUNT_TYPE + CalendarContract.Calendars.ACCOUNT_TYPE, + CalendarContract.Calendars.IS_PRIMARY, + CalendarContract.Calendars.VISIBLE, + CalendarContract.Calendars.CALENDAR_DISPLAY_NAME }, CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + " = 1", @@ -61,8 +79,11 @@ public class FragmentDialogCalendar extends FragmentDialogBase { long id = cursor.getLong(0); String account = cursor.getString(1); String type = cursor.getString(2); + boolean primary = (cursor.getInt(3) != 0); + boolean visible = (cursor.getInt(4) != 0); + String name = cursor.getString(5); if (account != null) - calendars.add(new Calendar(id, account, type)); + calendars.add(new Calendar(id, account, type, primary, visible, name)); } } @@ -71,7 +92,8 @@ public class FragmentDialogCalendar extends FragmentDialogBase { for (int i = 0; i < calendars.size(); i++) { Calendar calendar = calendars.get(i); names.add(calendar.getTitle()); - if (calendar.account.equals(selectedAccount)) + if (Objects.equals(calendar.account, selectedAccount) && + (selectedName == null || Objects.equals(calendar.name, selectedName))) checkedItem = i; } @@ -86,6 +108,7 @@ public class FragmentDialogCalendar extends FragmentDialogBase { getArguments().putLong("id", calendar.id); getArguments().putString("account", calendar.account); getArguments().putString("type", calendar.type); + getArguments().putString("name", calendar.name); sendResult(RESULT_OK); dismiss(); } @@ -108,18 +131,29 @@ public class FragmentDialogCalendar extends FragmentDialogBase { private class Calendar { - Calendar(long id, String account, String type) { + private long id; + private String account; + private String type; + private boolean primary; + private boolean visible; + private String name; + + Calendar(long id, String account, String type, boolean primary, boolean visible, String name) { this.id = id; this.account = account; this.type = type; + this.primary = primary; + this.visible = visible; + this.name = (Objects.equals(account, name) ? null : name); } - private long id; - private String account; - private String type; - String getTitle() { - return (this.account == null ? "-" : this.account); + return (this.visible ? "" : "(") + + (TextUtils.isEmpty(this.name) ? "" : this.name + ":") + + (this.account == null ? "-" : this.account) + + (BuildConfig.DEBUG && false ? ":" + (this.type == null ? "-" : this.type) : "") + + (this.visible ? "" : ")") + + " " + (this.primary && BuildConfig.DEBUG && false ? "*" : ""); } } } diff --git a/app/src/main/java/eu/faircode/email/FragmentPop.java b/app/src/main/java/eu/faircode/email/FragmentPop.java index dac0491d87..b36254ce5a 100644 --- a/app/src/main/java/eu/faircode/email/FragmentPop.java +++ b/app/src/main/java/eu/faircode/email/FragmentPop.java @@ -265,7 +265,7 @@ public class FragmentPop extends FragmentBase { @Override public void onClick(View v) { Bundle args = new Bundle(); - args.putString("account", calendar); + args.putString("calendar", calendar); FragmentDialogCalendar fragment = new FragmentDialogCalendar(); fragment.setArguments(args); @@ -914,7 +914,12 @@ public class FragmentPop extends FragmentBase { if (resultCode == RESULT_OK && data != null) { if (ActivityBilling.isPro(getContext())) { Bundle args = data.getBundleExtra("args"); - calendar = args.getString("account"); + JSONObject jobject = new JSONObject(); + jobject.put("id", args.getLong("id")); + jobject.put("account", args.getString("account")); + jobject.put("type", args.getString("type")); + jobject.put("name", args.getString("name")); + calendar = jobject.toString(); } else startActivity(new Intent(getContext(), ActivityBilling.class)); } diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 53f40fd56b..263aad0f54 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -64,6 +64,7 @@ import org.apache.commons.compress.archivers.ArchiveInputStream; import org.apache.commons.compress.archivers.ArchiveStreamFactory; import org.apache.commons.compress.archivers.zip.UnsupportedZipFeatureException; import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; +import org.json.JSONObject; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; @@ -3944,18 +3945,35 @@ public class MessageHelper { } } - if (icalendar.getMethod().isRequest()) + if (icalendar.getMethod().isRequest()) { + String selectedAccount; + String selectedName; + try { + JSONObject jselected = new JSONObject(account.calendar); + selectedAccount = jselected.getString("account"); + selectedName = jselected.getString("name"); + } catch (Throwable ex) { + Log.i(ex); + selectedAccount = account.calendar; + selectedName = null; + } + try (Cursor cursor = resolver.query(CalendarContract.Calendars.CONTENT_URI, new String[]{CalendarContract.Calendars._ID}, CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + " = 1 AND " + - CalendarContract.Calendars.ACCOUNT_NAME + " = ?", - new String[]{account.calendar}, + CalendarContract.Calendars.ACCOUNT_NAME + " = ?" + + (selectedName == null + ? "" + : " AND " + CalendarContract.Calendars.CALENDAR_DISPLAY_NAME + " = ?"), + selectedName == null + ? new String[]{selectedAccount} + : new String[]{selectedAccount, selectedName}, null)) { if (cursor.getCount() == 0) EntityLog.log(context, EntityLog.Type.General, message, "Account not found username=" + account.user); - while (cursor.moveToNext()) { + if (cursor.moveToNext()) { // https://developer.android.com/guide/topics/providers/calendar-provider#add-event // https://developer.android.com/reference/android/provider/CalendarContract.EventsColumns ContentValues values = new ContentValues(); @@ -3985,6 +4003,7 @@ public class MessageHelper { " summary=" + summary); } } + } } } } catch (Throwable ex) {