From 3a0dbe6e670f82ddc549378b804d019bedb97924 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 6 Feb 2023 19:48:11 -0500 Subject: [PATCH] Use alarm clock for scheduling message sends. --- .../securesms/database/MessageTable.java | 10 ++++--- .../revealable/ViewOnceMessageManager.java | 2 +- .../service/ExpiringStoriesManager.kt | 2 +- .../service/PendingRetryReceiptManager.java | 2 +- .../service/ScheduledMessageManager.kt | 27 ++++++++++++++----- .../securesms/service/TimedEventManager.java | 15 +++++------ .../service/TrimThreadsByDateManager.java | 2 +- 7 files changed, 38 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java index 62b997f54c..c2e424fd53 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.java @@ -4648,16 +4648,20 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie } } - public @Nullable Long getOldestScheduledSendTimestamp() { + public @Nullable MessageRecord getOldestScheduledSendTimestamp() { String[] columns = new String[] { SCHEDULED_DATE }; String selection = STORY_TYPE + " = ? AND " + PARENT_STORY_ID + " <= ? AND " + SCHEDULED_DATE + " != ?"; String[] args = SqlUtil.buildArgs(0, 0, -1); String order = SCHEDULED_DATE + " ASC, " + ID + " ASC"; String limit = "1"; - try (Cursor cursor = getReadableDatabase().query(TABLE_NAME, columns, selection, args, null, null, order, limit)) { - return cursor != null && cursor.moveToNext() ? cursor.getLong(0) : null; + try (MmsReader reader = mmsReaderFor(getReadableDatabase().query(TABLE_NAME, MMS_PROJECTION, selection, args, null, null, order, limit))) { + if (reader.getNext() != null) { + return reader.getCurrent(); + } } + + return null; } public Cursor getMessagesForNotificationState(Collection stickyThreads) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java index b3147168e4..79ecfde489 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageManager.java @@ -68,7 +68,7 @@ public class ViewOnceMessageManager extends TimedEventManager { scheduleIfNecessary(); }, delay); - scheduleAlarm(application, delay); + scheduleAlarm(application, event, delay); } }); } @@ -82,12 +83,12 @@ public abstract class TimedEventManager { * use {@link #setAlarm(Context, long, Class)} as a helper method. */ @AnyThread - protected abstract void scheduleAlarm(@NonNull Application application, long delay); + protected abstract void scheduleAlarm(@NonNull Application application, E event, long delay); /** * Helper method to set an alarm. */ - protected static void setAlarm(@NonNull Context context, long delay, @NonNull Class alarmClass) { + protected static void setAlarm(@NonNull Context context, long delay, @NonNull Class alarmClass) { Intent intent = new Intent(context, alarmClass); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.mutable()); AlarmManager alarmManager = ServiceUtil.getAlarmManager(context); @@ -96,7 +97,7 @@ public abstract class TimedEventManager { alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delay, pendingIntent); } - protected static void trySetExactAlarm(@NonNull Context context, long timestamp, @NonNull Class alarmClass) { + protected static void trySetExactAlarm(@NonNull Context context, long timestamp, @NonNull Class alarmClass, @NonNull PendingIntent showIntent) { Intent intent = new Intent(context, alarmClass); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntentFlags.mutable()); AlarmManager alarmManager = ServiceUtil.getAlarmManager(context); @@ -106,11 +107,7 @@ public abstract class TimedEventManager { boolean hasManagerPermission = Build.VERSION.SDK_INT < 31 || alarmManager.canScheduleExactAlarms(); if (hasManagerPermission) { try { - if (Build.VERSION.SDK_INT >= 23) { - alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, pendingIntent); - } else { - alarmManager.setExact(AlarmManager.RTC_WAKEUP, timestamp, pendingIntent); - } + alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(timestamp, showIntent), pendingIntent); return; } catch (Exception e) { Log.w(TAG, e); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/TrimThreadsByDateManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/TrimThreadsByDateManager.java index 73c49ef2a8..dfc672c9a0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/TrimThreadsByDateManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/TrimThreadsByDateManager.java @@ -75,7 +75,7 @@ public class TrimThreadsByDateManager extends TimedEventManager