diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 752ed6f3fb..b4bddb3ae4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -114,6 +114,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swSortAnswers; private SwitchCompat swExternalAnswer; private SwitchCompat swShortcuts; + private SwitchCompat swICalTentative; private SwitchCompat swFts; private SwitchCompat swClassification; private TextView tvClassMinProbability; @@ -291,7 +292,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private static final long MIN_FILE_SIZE = 1024 * 1024L; private final static String[] RESET_OPTIONS = new String[]{ - "sort_answers", "shortcuts", "fts", + "sort_answers", "shortcuts", "ical_tentative", "fts", "classification", "class_min_probability", "class_min_difference", "show_filtered", "language", @@ -381,6 +382,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swSortAnswers = view.findViewById(R.id.swSortAnswers); swExternalAnswer = view.findViewById(R.id.swExternalAnswer); swShortcuts = view.findViewById(R.id.swShortcuts); + swICalTentative = view.findViewById(R.id.swICalTentative); swFts = view.findViewById(R.id.swFts); swClassification = view.findViewById(R.id.swClassification); ibClassification = view.findViewById(R.id.ibClassification); @@ -608,6 +610,14 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swICalTentative.setVisibility(BuildConfig.PLAY_STORE_RELEASE ? View.GONE : View.VISIBLE); + swICalTentative.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("ical_tentative", checked).apply(); // apply won't work here + } + }); + swFts.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -2597,6 +2607,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swExternalSearch.setChecked(Helper.isComponentEnabled(getContext(), ActivitySearch.class)); swExternalAnswer.setChecked(Helper.isComponentEnabled(getContext(), ActivityAnswer.class)); swShortcuts.setChecked(prefs.getBoolean("shortcuts", true)); + swICalTentative.setChecked(prefs.getBoolean("ical_tentative", true)); swFts.setChecked(prefs.getBoolean("fts", false)); swClassification.setChecked(prefs.getBoolean("classification", false)); diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index fe3fb534a0..1f99463d05 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -159,6 +159,7 @@ import biweekly.Biweekly; import biweekly.ICalendar; import biweekly.component.VEvent; import biweekly.property.Method; +import biweekly.property.Status; import ezvcard.VCard; import ezvcard.VCardVersion; import ezvcard.io.text.VCardWriter; @@ -4416,6 +4417,9 @@ public class MessageHelper { private void decodeICalendar(Context context, EntityAttachment local) { DB db = DB.getInstance(context); try { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean ical_tentative = prefs.getBoolean("ical_tentative", true); + boolean permission = Helper.hasPermission(context, Manifest.permission.WRITE_CALENDAR); EntityMessage message = db.message().getMessage(local.message); @@ -4447,6 +4451,21 @@ public class MessageHelper { if (method != null && method.isCancel()) CalendarHelper.delete(context, event, message); else if (method == null || method.isRequest() || method.isReply()) { + int status = CalendarContract.Events.STATUS_TENTATIVE; + if (method != null && method.isReply()) { + Status istatus = event.getStatus(); + if (istatus != null) + if (Status.ACCEPTED.equals(istatus.getValue())) + status = CalendarContract.Events.STATUS_CONFIRMED; + else if (Status.CANCELLED.equals(istatus.getValue())) + status = CalendarContract.Events.STATUS_CANCELED; + } + + if (status == CalendarContract.Events.STATUS_TENTATIVE && !ical_tentative) { + EntityLog.log(context, "Tentative event not processed"); + return; + } + String selectedAccount; String selectedName; try { @@ -4459,9 +4478,7 @@ public class MessageHelper { selectedName = null; } - CalendarHelper.insert(context, icalendar, event, - CalendarContract.Events.STATUS_TENTATIVE, - selectedAccount, selectedName, message); + CalendarHelper.insert(context, icalendar, event, status, selectedAccount, selectedName, message); } else EntityLog.log(context, "Unknown event method=" + method.getValue()); } catch (Throwable ex) { diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index eaa101f50b..5ac084ce9e 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -156,6 +156,18 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swShortcuts" /> + + Sort reply templates by frequency of use Provide reply templates to other apps Show frequently used contacts in Android share menu + Store received invitations as tentative Build search index %1$d / %2$d messages indexed (%3$s) Classify messages