Fix scheduled messages being sent out of order.

This commit is contained in:
Cody Henthorne 2023-01-27 15:02:41 -05:00 committed by Greyson Parrelli
parent c37bad0f7a
commit 661fff7a0e
2 changed files with 12 additions and 5 deletions

View file

@ -4589,10 +4589,13 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
return getReadableDatabase().query(TABLE_NAME, MMS_PROJECTION, selection, args, null, null, order, limitStr);
}
/**
* Returns messages ordered for display in a reverse list (newest first).
*/
public List<MessageRecord> getScheduledMessagesInThread(long threadId) {
String selection = THREAD_ID + " = ? AND " + STORY_TYPE + " = ? AND " + PARENT_STORY_ID + " <= ? AND " + SCHEDULED_DATE + " != ?";
String[] args = SqlUtil.buildArgs(threadId, 0, 0, -1);
String order = SCHEDULED_DATE + " DESC";
String order = SCHEDULED_DATE + " DESC, " + ID + " DESC";
try (MmsReader reader = mmsReaderFor(getReadableDatabase().query(TABLE_NAME + " INDEXED BY " + INDEX_THREAD_STORY_SCHEDULED_DATE, MMS_PROJECTION, selection, args, null, null, order))) {
List<MessageRecord> results = new ArrayList<>(reader.getCount());
@ -4604,10 +4607,13 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
}
}
/**
* Returns messages order for sending (oldest first).
*/
public List<MessageRecord> getScheduledMessagesBefore(long time) {
String selection = STORY_TYPE + " = ? AND " + PARENT_STORY_ID + " <= ? AND " + SCHEDULED_DATE + " != ? AND " + SCHEDULED_DATE + " <= ?";
String[] args = SqlUtil.buildArgs(0, 0, -1, time);
String order = SCHEDULED_DATE + " DESC";
String order = SCHEDULED_DATE + " ASC, " + ID + " ASC";
try (MmsReader reader = mmsReaderFor(getReadableDatabase().query(TABLE_NAME, MMS_PROJECTION, selection, args, null, null, order))) {
List<MessageRecord> results = new ArrayList<>(reader.getCount());
@ -4623,7 +4629,7 @@ public class MessageTable extends DatabaseTable implements MessageTypes, Recipie
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";
String order = SCHEDULED_DATE + " ASC, " + ID + " ASC";
String limit = "1";
try (Cursor cursor = getReadableDatabase().query(TABLE_NAME, columns, selection, args, null, null, order, limit)) {

View file

@ -28,9 +28,10 @@ class ScheduledMessageManager(
scheduleIfNecessary()
}
@Suppress("UsePropertyAccessSyntax")
@WorkerThread
override fun getNextClosestEvent(): Event? {
val oldestTimestamp = messagesTable.oldestScheduledSendTimestamp ?: return null
val oldestTimestamp = messagesTable.getOldestScheduledSendTimestamp() ?: return null
val delay = (oldestTimestamp - System.currentTimeMillis()).coerceAtLeast(0)
Log.i(TAG, "The next scheduled message needs to be sent in $delay ms.")