diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 449dd4270f..3e538305db 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -647,6 +647,9 @@ public interface DaoMessage { " AND NOT ui_snoozed IS NULL") List getSnoozed(Long folder); + @Query("SELECT COUNT(*) FROM message WHERE NOT ui_snoozed IS NULL") + int getSnoozedCount(); + @Query("SELECT id AS _id, subject AS suggestion FROM message" + " WHERE (:account IS NULL OR message.account = :account)" + " AND (:folder IS NULL OR message.folder = :folder)" + diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 8a999ec1ad..bd64c3b943 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -121,6 +121,8 @@ public class EntityMessage implements Serializable { static final Long SWIPE_ACTION_JUNK = -8L; static final Long SWIPE_ACTION_REPLY = -9L; + private static final int MAX_SNOOZED = 300; + @PrimaryKey(autoGenerate = true) public Long id; @NonNull @@ -354,7 +356,7 @@ public class EntityMessage implements Serializable { EntityMessage.SMIME_SIGNENCRYPT.equals(ui_encrypt)); } - boolean isVerifiable(){ + boolean isVerifiable() { return (EntityMessage.PGP_SIGNONLY.equals(encrypt) || EntityMessage.SMIME_SIGNONLY.equals(encrypt)); } @@ -582,6 +584,30 @@ public class EntityMessage implements Serializable { } static void snooze(Context context, long id, Long wakeup) { + if (wakeup != null) { + /* + java.lang.IllegalStateException: Maximum limit of concurrent alarms 500 reached for uid: u0a601, callingPackage: eu.faircode.email + at android.os.Parcel.createExceptionOrNull(Parcel.java:2433) + at android.os.Parcel.createException(Parcel.java:2409) + at android.os.Parcel.readException(Parcel.java:2392) + at android.os.Parcel.readException(Parcel.java:2334) + at android.app.IAlarmManager$Stub$Proxy.set(IAlarmManager.java:359) + at android.app.AlarmManager.setImpl(AlarmManager.java:947) + at android.app.AlarmManager.setImpl(AlarmManager.java:907) + at android.app.AlarmManager.setExactAndAllowWhileIdle(AlarmManager.java:1175) + at androidx.core.app.AlarmManagerCompat$Api23Impl.setExactAndAllowWhileIdle(Unknown Source:0) + at androidx.core.app.AlarmManagerCompat.setExactAndAllowWhileIdle(SourceFile:2) + at eu.faircode.email.AlarmManagerCompatEx.setAndAllowWhileIdle(SourceFile:2) + at eu.faircode.email.EntityMessage.snooze(SourceFile:7) + */ + DB db = DB.getInstance(context); + int count = db.message().getSnoozedCount(); + Log.i("Snoozed=" + count + "/" + MAX_SNOOZED); + if (count > MAX_SNOOZED) + throw new IllegalArgumentException( + String.format("Due to Android limitations, no more than %d messages can be snoozed or delayed", MAX_SNOOZED)); + } + Intent snoozed = new Intent(context, ServiceSynchronize.class); snoozed.setAction("unsnooze:" + id); PendingIntent pi = PendingIntentCompat.getForegroundService( diff --git a/app/src/main/java/eu/faircode/email/ServiceSend.java b/app/src/main/java/eu/faircode/email/ServiceSend.java index 8d1662e1a9..7931915f65 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSend.java +++ b/app/src/main/java/eu/faircode/email/ServiceSend.java @@ -500,6 +500,8 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar } db.setTransactionSuccessful(); + } catch (IllegalArgumentException ex) { + Log.w(ex); } finally { db.endTransaction(); } diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 5d12b09fd7..6bfdeb8ccb 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -3002,6 +3002,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences EntityMessage.snooze(context, message.id, message.ui_snoozed); db.setTransactionSuccessful(); + } catch (IllegalArgumentException ex) { + Log.w(ex); } finally { db.endTransaction(); } diff --git a/app/src/main/java/eu/faircode/email/WorkerCleanup.java b/app/src/main/java/eu/faircode/email/WorkerCleanup.java index a6a8e9cc3a..bcb6c0bc7f 100644 --- a/app/src/main/java/eu/faircode/email/WorkerCleanup.java +++ b/app/src/main/java/eu/faircode/email/WorkerCleanup.java @@ -154,8 +154,12 @@ public class WorkerCleanup extends Worker { } // Restore alarms - for (EntityMessage message : db.message().getSnoozed(null)) - EntityMessage.snooze(context, message.id, message.ui_snoozed); + try { + for (EntityMessage message : db.message().getSnoozed(null)) + EntityMessage.snooze(context, message.id, message.ui_snoozed); + } catch (IllegalArgumentException ex) { + Log.w(ex); + } ServiceSynchronize.reschedule(context);