I'm trying to load messages from database but consistently getting IllegalArgumentException, my data source looks like this
@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<ConversationMessage> callback) {
long start = System.currentTimeMillis();
MmsSmsDatabase db = DatabaseFactory.getMmsSmsDatabase(context);
List<MessageRecord> records = new ArrayList<>();
int totalCount = db.getConversationCount();
int effectiveCount = params.requestedStartPosition;
try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversationForCalls(threadId, params.requestedStartPosition, params.requestedLoadSize))) {
MessageRecord record;
while ((record = reader.getNext()) != null && effectiveCount < totalCount && !isInvalid()) {
records.add(record);
effectiveCount++;
}
}
SizeFixResult<MessageRecord> result = SizeFixResult.ensureMultipleOfPageSize(records, params.requestedStartPosition, params.pageSize, totalCount);
List<ConversationMessage> items = Stream.of(result.getItems())
.map(ConversationMessageFactory::createWithResolvedData)
.toList();
callback.onResult(items, params.requestedStartPosition, result.getTotal());
Log.d(TAG, "[Initial Load] effectiveCount: " + effectiveCount + ", totalCount: " + totalCount );
Log.d(TAG, "[Initial Load] " + (System.currentTimeMillis() - start) + " ms | thread: " + threadId + ", start: " + params.requestedStartPosition + ", requestedSize: " + params.requestedLoadSize + ", actualSize: " + result.getItems().size() + ", totalCount: " + result.getTotal());
}
@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<ConversationMessage> callback) {
long start = System.currentTimeMillis();
MmsSmsDatabase db = DatabaseFactory.getMmsSmsDatabase(context);
List<MessageRecord> records = new ArrayList<>(params.loadSize);
Log.d(TAG, "[Update] " + (System.currentTimeMillis() - start) + " ms | thread: " + threadId + ", start: " + params.startPosition + ", size: "+ params.loadSize);
try (MmsSmsDatabase.Reader reader = db.readerFor(db.getConversationForCalls(threadId, params.startPosition, params.loadSize))) {
MessageRecord record;
while ((record = reader.getNext()) != null && !isInvalid()) {
records.add(record);
}
}
List<ConversationMessage> items = Stream.of(records)
.map(ConversationMessageFactory::createWithResolvedData)
.toList();
callback.onResult(items);
}
Initial page load corrctly but when I'm scrollling, I'm facing java.lang.IllegalArgumentException: page introduces incorrect tiling at androidx.paging.PagedStorage.insertPage(PagedStorage.java:545)
My page configuration look like this
DataSource.Factory<Integer, ConversationMessage> factory = new CallsDataSource.Factory(context, -1, invalidator);
PagedList.Config config = new PagedList.Config.Builder()
.setPageSize(15)
.setInitialLoadSizeHint(30)
.build();
this.messages = new LivePagedListBuilder<>(factory, config).setFetchExecutor(CallsDataSource.EXECUTOR)
.setInitialLoadKey(0)
.build();