From 1b2f964f32375359474e0535572f7aafe325e82b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 19 May 2020 16:19:21 -0400 Subject: [PATCH] Fix possible crash around loading initial conversation pages. --- .../conversation/ConversationDataSource.java | 44 ++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java index 3042205049..f7085983b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java @@ -59,29 +59,17 @@ class ConversationDataSource extends PositionalDataSource { public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) { long start = System.currentTimeMillis(); - MmsSmsDatabase db = DatabaseFactory.getMmsSmsDatabase(context); - List records = new ArrayList<>(params.requestedLoadSize); + MmsSmsDatabase db = DatabaseFactory.getMmsSmsDatabase(context); + List records = new ArrayList<>(params.requestedLoadSize); + int totalCount = db.getConversationCount(threadId); + int effectiveCount = params.requestedStartPosition; - if (!isInvalid()) { - try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversation(threadId, params.requestedStartPosition, params.requestedLoadSize))) { - MessageRecord record; - while ((record = reader.getNext()) != null && !isInvalid()) { - records.add(record); - } + try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversation(threadId, params.requestedStartPosition, params.requestedLoadSize))) { + MessageRecord record; + while ((record = reader.getNext()) != null && effectiveCount < totalCount && !isInvalid()) { + records.add(record); + effectiveCount++; } - } else { - Log.i(TAG, "[Initial Load] Invalidated before we could even query!"); - } - - int effectiveCount = records.size() + params.requestedStartPosition; - int totalCount = db.getConversationCount(threadId); - - if (effectiveCount > totalCount) { - Log.w(TAG, String.format(Locale.ENGLISH, "Miscalculation! Records: %d, Start Position: %d, Total: %d. Adjusting total.", - records.size(), - params.requestedStartPosition, - totalCount)); - totalCount = effectiveCount; } records = ensureMultipleOfPageSize(records, params.pageSize, totalCount); @@ -99,15 +87,11 @@ class ConversationDataSource extends PositionalDataSource { MmsSmsDatabase db = DatabaseFactory.getMmsSmsDatabase(context); List records = new ArrayList<>(params.loadSize); - if (!isInvalid()) { - try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversation(threadId, params.startPosition, params.loadSize))) { - MessageRecord record; - while ((record = reader.getNext()) != null && !isInvalid()) { - records.add(record); - } + try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversation(threadId, params.startPosition, params.loadSize))) { + MessageRecord record; + while ((record = reader.getNext()) != null && !isInvalid()) { + records.add(record); } - } else { - Log.i(TAG, "[Update] Invalidated before we could even query!"); } callback.onResult(records); @@ -117,7 +101,7 @@ class ConversationDataSource extends PositionalDataSource { } private static @NonNull List ensureMultipleOfPageSize(@NonNull List records, int pageSize, int total) { - if (records.size() != total && records.size() % pageSize != 0) { + if (records.size() != total && records.size() > pageSize && records.size() % pageSize != 0) { int overflow = records.size() % pageSize; return records.subList(0, records.size() - overflow); } else {