diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e207e8..a0d65fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Fixed importing blacklist files larger than 4000 bytes. +- Fixed occasional crash after deleting blacklist items. ## [0.5.9] - 2020-10-20 diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/BlacklistDataSource.java b/app/src/main/java/dummydomain/yetanothercallblocker/BlacklistDataSource.java index 25795bc..c29f371 100644 --- a/app/src/main/java/dummydomain/yetanothercallblocker/BlacklistDataSource.java +++ b/app/src/main/java/dummydomain/yetanothercallblocker/BlacklistDataSource.java @@ -53,17 +53,36 @@ public class BlacklistDataSource extends PositionalDataSource { @NonNull LoadInitialCallback callback) { LOG.debug("loadInitial({}, {})", params.requestedStartPosition, params.requestedLoadSize); - List items = getQueryBuilder() - .offset(params.requestedStartPosition) - .limit(params.requestedLoadSize) - .list(); + int offset = params.requestedStartPosition; - items = blacklistDao.detach(items); // for DiffUtil to work + List items = loadItems(offset, params.requestedLoadSize); + + Integer totalCount = null; + + if (items.isEmpty()) { + totalCount = (int) blacklistDao.countAll(); + if (totalCount > 0) { + LOG.debug("loadInitial() initial range is empty: totalCount={}, offset={}", + totalCount, offset); + + offset = (totalCount - params.requestedLoadSize) + / params.pageSize * params.pageSize; // align to pageSize using integer math + + if (offset < 0) offset = 0; + + LOG.debug("loadInitial() reloading with offset={}", offset); + items = loadItems(offset, params.requestedLoadSize); + } else { + offset = 0; + } + } if (params.placeholdersEnabled) { - callback.onResult(items, params.requestedStartPosition, (int) blacklistDao.countAll()); + if (totalCount == null) totalCount = (int) blacklistDao.countAll(); + + callback.onResult(items, offset, totalCount); } else { - callback.onResult(items, params.requestedStartPosition); + callback.onResult(items, offset); } } @@ -72,12 +91,16 @@ public class BlacklistDataSource extends PositionalDataSource { @NonNull LoadRangeCallback callback) { LOG.debug("loadRange({}, {})", params.startPosition, params.loadSize); + callback.onResult(loadItems(params.startPosition, params.loadSize)); + } + + private List loadItems(int offset, int limit) { List items = getQueryBuilder() - .offset(params.startPosition) - .limit(params.loadSize) + .offset(offset) + .limit(limit) .list(); - callback.onResult(blacklistDao.detach(items)); + return blacklistDao.detach(items); // for DiffUtil to work } private QueryBuilder getQueryBuilder() {