diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackPreparer.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackPreparer.java index 532534afca..968432dc4d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackPreparer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackPreparer.java @@ -147,7 +147,11 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP if (holderIndex != -1) { queueDataAdapter.remove(holderIndex); - queueDataAdapter.remove(holderIndex); + + if (!queueDataAdapter.isEmpty()) { + queueDataAdapter.remove(holderIndex); + } + queueDataAdapter.add(holderIndex, createNextClone(description)); queueDataAdapter.add(holderIndex, description); @@ -157,7 +161,10 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP } if (currentIndex != holderIndex + 1) { - dataSource.removeMediaSource(holderIndex + 1); + if (dataSource.getSize() > 1) { + dataSource.removeMediaSource(holderIndex + 1); + } + dataSource.addMediaSource(holderIndex + 1, mediaSourceFactory.createMediaSource(next)); } } else { @@ -175,12 +182,15 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP MediaDescriptionCompat last = queueDataAdapter.getMediaDescription(lastIndex); if (Objects.equals(last.getMediaUri(), NEXT_URI)) { - MediaDescriptionCompat end = createEndClone(last); - queueDataAdapter.remove(lastIndex); - queueDataAdapter.add(lastIndex, end); dataSource.removeMediaSource(lastIndex); - dataSource.addMediaSource(lastIndex, mediaSourceFactory.createMediaSource(end)); + + if (queueDataAdapter.size() > 1) { + MediaDescriptionCompat end = createEndClone(last); + + queueDataAdapter.add(lastIndex, end); + dataSource.addMediaSource(lastIndex, mediaSourceFactory.createMediaSource(end)); + } } } @@ -239,10 +249,9 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP @WorkerThread private @NonNull List loadMediaDescriptionsForConsecutivePlayback(long messageId) { try { - List recordsBefore = DatabaseFactory.getMmsSmsDatabase(context).getMessagesBeforeVoiceNoteExclusive(messageId, LIMIT); List recordsAfter = DatabaseFactory.getMmsSmsDatabase(context).getMessagesAfterVoiceNoteInclusive(messageId, LIMIT); - return Stream.of(buildFilteredMessageRecordList(recordsBefore, recordsAfter)) + return Stream.of(buildFilteredMessageRecordList(recordsAfter)) .map(record -> VoiceNoteMediaDescriptionCompatFactory.buildMediaDescription(context, record)) .toList(); } catch (NoSuchMessageException e) { @@ -251,20 +260,9 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP } } - @VisibleForTesting - static @NonNull List buildFilteredMessageRecordList(@NonNull List recordsBefore, @NonNull List recordsAfter) { - Collections.reverse(recordsBefore); - List filteredBefore = Stream.of(recordsBefore) - .takeWhile(MessageRecordUtil::hasAudio) - .toList(); - Collections.reverse(filteredBefore); - - List filteredAfter = Stream.of(recordsAfter) - .takeWhile(MessageRecordUtil::hasAudio) - .toList(); - - filteredBefore.addAll(filteredAfter); - - return filteredBefore; + private static @NonNull List buildFilteredMessageRecordList(@NonNull List recordsAfter) { + return Stream.of(recordsAfter) + .takeWhile(MessageRecordUtil::hasAudio) + .toList(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java index be816148bd..f25e5b4c70 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java @@ -145,7 +145,6 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns abstract void deleteAllThreads(); abstract void deleteAbandonedMessages(); - public abstract List getMessagesInThreadBeforeExclusive(long threadId, long timestamp, long limit); public abstract List getMessagesInThreadAfterInclusive(long threadId, long timestamp, long limit); public abstract SQLiteDatabase beginTransaction(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index 355a091923..2c1162cf5b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -1618,23 +1618,6 @@ public class MmsDatabase extends MessageDatabase { db.delete(TABLE_NAME, where, null); } - @Override - public List getMessagesInThreadBeforeExclusive(long threadId, long timestamp, long limit) { - String where = TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? AND " + - TABLE_NAME + "." + getDateReceivedColumnName() + " < ?"; - String[] args = SqlUtil.buildArgs(threadId, timestamp); - - try (Reader reader = readerFor(rawQuery(where, args, true, limit))) { - List results = new ArrayList<>(reader.cursor.getCount()); - - while (reader.getNext() != null) { - results.add(reader.getCurrent()); - } - - return results; - } - } - @Override public List getMessagesInThreadAfterInclusive(long threadId, long timestamp, long limit) { String where = TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? AND " + diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index d2cef3e100..56f67079a5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -162,18 +162,6 @@ public class MmsSmsDatabase extends Database { return null; } - - public @NonNull List getMessagesBeforeVoiceNoteExclusive(long messageId, long limit) throws NoSuchMessageException { - MessageRecord origin = DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId); - List mms = DatabaseFactory.getMmsDatabase(context).getMessagesInThreadBeforeExclusive(origin.getThreadId(), origin.getDateReceived(), limit); - List sms = DatabaseFactory.getSmsDatabase(context).getMessagesInThreadBeforeExclusive(origin.getThreadId(), origin.getDateReceived(), limit); - - mms.addAll(sms); - Collections.sort(mms, (a, b) -> Long.compare(a.getDateReceived(), b.getDateReceived())); - - return Stream.of(mms).skip(Math.max(0, mms.size() - limit)).toList(); - } - public @NonNull List getMessagesAfterVoiceNoteInclusive(long messageId, long limit) throws NoSuchMessageException { MessageRecord origin = DatabaseFactory.getMmsDatabase(context).getMessageRecord(messageId); List mms = DatabaseFactory.getMmsDatabase(context).getMessagesInThreadAfterInclusive(origin.getThreadId(), origin.getDateReceived(), limit); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index c8913de5e3..1a96ac39d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -985,23 +985,6 @@ public class SmsDatabase extends MessageDatabase { db.delete(TABLE_NAME, where, null); } - @Override - public List getMessagesInThreadBeforeExclusive(long threadId, long timestamp, long limit) { - String where = TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? AND " + - TABLE_NAME + "." + getDateReceivedColumnName() + " < ?"; - String[] args = SqlUtil.buildArgs(threadId, timestamp); - - try (Reader reader = readerFor(queryMessages(where, args, true, limit))) { - List results = new ArrayList<>(reader.cursor.getCount()); - - while (reader.getNext() != null) { - results.add(reader.getCurrent()); - } - - return results; - } - } - @Override public List getMessagesInThreadAfterInclusive(long threadId, long timestamp, long limit) { String where = TABLE_NAME + "." + MmsSmsColumns.THREAD_ID + " = ? AND " +