diff --git a/app/build.gradle b/app/build.gradle index 307a886cb..ed341f8f6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,11 +16,12 @@ android { applicationId 'org.koitharu.kotatsu' minSdk = 21 targetSdk = 34 - versionCode = 589 - versionName = '6.2.2' + versionCode = 590 + versionName = '6.2.3' generatedDensities = [] testInstrumentationRunner "org.koitharu.kotatsu.HiltTestRunner" ksp { +// arg("room.generateKotlin", "true") TODO: enable later arg("room.schemaLocation", "$projectDir/schemas") } androidResources { @@ -81,7 +82,7 @@ afterEvaluate { } dependencies { //noinspection GradleDependency - implementation('com.github.KotatsuApp:kotatsu-parsers:0054d06e6e') { + implementation('com.github.KotatsuApp:kotatsu-parsers:6bf0ae92e4') { exclude group: 'org.json', module: 'json' } @@ -98,7 +99,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-process:2.6.2' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - implementation 'androidx.recyclerview:recyclerview:1.3.1' + implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02' implementation 'androidx.preference:preference-ktx:1.2.1' implementation 'androidx.biometric:biometric-ktx:1.2.0-alpha05' @@ -114,9 +115,9 @@ dependencies { exclude group: 'com.google.j2objc', module: 'j2objc-annotations' } - implementation 'androidx.room:room-runtime:2.5.2' - implementation 'androidx.room:room-ktx:2.5.2' - ksp 'androidx.room:room-compiler:2.5.2' + implementation 'androidx.room:room-runtime:2.6.0' + implementation 'androidx.room:room-ktx:2.6.0' + ksp 'androidx.room:room-compiler:2.6.0' implementation 'com.squareup.okhttp3:okhttp:4.11.0' implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.11.0' @@ -152,7 +153,7 @@ dependencies { androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3' - androidTestImplementation 'androidx.room:room-testing:2.5.2' + androidTestImplementation 'androidx.room:room-testing:2.6.0' androidTestImplementation 'com.squareup.moshi:moshi-kotlin:1.15.0' androidTestImplementation 'com.google.dagger:hilt-android-testing:2.48.1' diff --git a/app/src/androidTest/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgentTest.kt b/app/src/androidTest/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgentTest.kt index 9984821cc..40e97ea7c 100644 --- a/app/src/androidTest/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgentTest.kt +++ b/app/src/androidTest/kotlin/org/koitharu/kotatsu/settings/backup/AppBackupAgentTest.kt @@ -82,7 +82,7 @@ class AppBackupAgentTest { assertEquals(history, historyRepository.getOne(SampleData.manga)) assertEquals(listOf(SampleData.manga), favouritesRepository.getManga(category.id)) - val allTags = database.tagsDao.findTags(SampleData.tag.source.name).toMangaTags() + val allTags = database.getTagsDao().findTags(SampleData.tag.source.name).toMangaTags() assertTrue(SampleData.tag in allTags) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt index b170bb6ff..768fd4e5a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/bookmarks/domain/BookmarksRepository.kt @@ -25,15 +25,15 @@ class BookmarksRepository @Inject constructor( ) { fun observeBookmark(manga: Manga, chapterId: Long, page: Int): Flow { - return db.bookmarksDao.observe(manga.id, chapterId, page).map { it?.toBookmark(manga) } + return db.getBookmarksDao().observe(manga.id, chapterId, page).map { it?.toBookmark(manga) } } fun observeBookmarks(manga: Manga): Flow> { - return db.bookmarksDao.observe(manga.id).mapItems { it.toBookmark(manga) } + return db.getBookmarksDao().observe(manga.id).mapItems { it.toBookmark(manga) } } fun observeBookmarks(): Flow>> { - return db.bookmarksDao.observe().map { map -> + return db.getBookmarksDao().observe().map { map -> val res = LinkedHashMap>(map.size) for ((k, v) in map) { val manga = k.toManga() @@ -46,9 +46,9 @@ class BookmarksRepository @Inject constructor( suspend fun addBookmark(bookmark: Bookmark) { db.withTransaction { val tags = bookmark.manga.tags.toEntities() - db.tagsDao.upsert(tags) - db.mangaDao.upsert(bookmark.manga.toEntity(), tags) - db.bookmarksDao.insert(bookmark.toEntity()) + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(bookmark.manga.toEntity(), tags) + db.getBookmarksDao().insert(bookmark.toEntity()) } } @@ -56,11 +56,11 @@ class BookmarksRepository @Inject constructor( val entity = bookmark.toEntity().copy( imageUrl = imageUrl, ) - db.bookmarksDao.upsert(listOf(entity)) + db.getBookmarksDao().upsert(listOf(entity)) } suspend fun removeBookmark(mangaId: Long, chapterId: Long, page: Int) { - check(db.bookmarksDao.delete(mangaId, chapterId, page) != 0) { + check(db.getBookmarksDao().delete(mangaId, chapterId, page) != 0) { "Bookmark not found" } } @@ -72,7 +72,7 @@ class BookmarksRepository @Inject constructor( suspend fun removeBookmarks(ids: Set): ReversibleHandle { val entities = ArrayList(ids.size) db.withTransaction { - val dao = db.bookmarksDao + val dao = db.getBookmarksDao() for (pageId in ids) { val e = dao.find(pageId) if (e != null) { @@ -92,7 +92,7 @@ class BookmarksRepository @Inject constructor( db.withTransaction { for (e in entities) { try { - db.bookmarksDao.insert(e) + db.getBookmarksDao().insert(e) } catch (e: SQLException) { e.printStackTraceDebug() } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt index 231866047..1ced43f5f 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/backup/BackupRepository.kt @@ -22,7 +22,7 @@ class BackupRepository @Inject constructor( var offset = 0 val entry = BackupEntry(BackupEntry.HISTORY, JSONArray()) while (true) { - val history = db.historyDao.findAll(offset, PAGE_SIZE) + val history = db.getHistoryDao().findAll(offset, PAGE_SIZE) if (history.isEmpty()) { break } @@ -42,7 +42,7 @@ class BackupRepository @Inject constructor( suspend fun dumpCategories(): BackupEntry { val entry = BackupEntry(BackupEntry.CATEGORIES, JSONArray()) - val categories = db.favouriteCategoriesDao.findAll() + val categories = db.getFavouriteCategoriesDao().findAll() for (item in categories) { entry.data.put(JsonSerializer(item).toJson()) } @@ -53,7 +53,7 @@ class BackupRepository @Inject constructor( var offset = 0 val entry = BackupEntry(BackupEntry.FAVOURITES, JSONArray()) while (true) { - val favourites = db.favouritesDao.findAll(offset, PAGE_SIZE) + val favourites = db.getFavouritesDao().findAll(offset, PAGE_SIZE) if (favourites.isEmpty()) { break } @@ -73,7 +73,7 @@ class BackupRepository @Inject constructor( suspend fun dumpBookmarks(): BackupEntry { val entry = BackupEntry(BackupEntry.BOOKMARKS, JSONArray()) - val all = db.bookmarksDao.findAll() + val all = db.getBookmarksDao().findAll() for ((m, b) in all) { val json = JSONObject() val manga = JsonSerializer(m.manga).toJson() @@ -122,9 +122,9 @@ class BackupRepository @Inject constructor( val history = JsonDeserializer(item).toHistoryEntity() result += runCatchingCancellable { db.withTransaction { - db.tagsDao.upsert(tags) - db.mangaDao.upsert(manga, tags) - db.historyDao.upsert(history) + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(manga, tags) + db.getHistoryDao().upsert(history) } } } @@ -136,7 +136,7 @@ class BackupRepository @Inject constructor( for (item in entry.data.JSONIterator()) { val category = JsonDeserializer(item).toFavouriteCategoryEntity() result += runCatchingCancellable { - db.favouriteCategoriesDao.upsert(category) + db.getFavouriteCategoriesDao().upsert(category) } } return result @@ -153,9 +153,9 @@ class BackupRepository @Inject constructor( val favourite = JsonDeserializer(item).toFavouriteEntity() result += runCatchingCancellable { db.withTransaction { - db.tagsDao.upsert(tags) - db.mangaDao.upsert(manga, tags) - db.favouritesDao.upsert(favourite) + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(manga, tags) + db.getFavouritesDao().upsert(favourite) } } } @@ -175,9 +175,9 @@ class BackupRepository @Inject constructor( } result += runCatchingCancellable { db.withTransaction { - db.tagsDao.upsert(tags) - db.mangaDao.upsert(manga, tags) - db.bookmarksDao.upsert(bookmarks) + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(manga, tags) + db.getBookmarksDao().upsert(bookmarks) } } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/db/MangaDatabase.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/db/MangaDatabase.kt index d23f8a615..1a6adcea1 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/db/MangaDatabase.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/db/MangaDatabase.kt @@ -66,29 +66,29 @@ const val DATABASE_VERSION = 17 ) abstract class MangaDatabase : RoomDatabase() { - abstract val historyDao: HistoryDao + abstract fun getHistoryDao(): HistoryDao - abstract val tagsDao: TagsDao + abstract fun getTagsDao(): TagsDao - abstract val mangaDao: MangaDao + abstract fun getMangaDao(): MangaDao - abstract val favouritesDao: FavouritesDao + abstract fun getFavouritesDao(): FavouritesDao - abstract val preferencesDao: PreferencesDao + abstract fun getPreferencesDao(): PreferencesDao - abstract val favouriteCategoriesDao: FavouriteCategoriesDao + abstract fun getFavouriteCategoriesDao(): FavouriteCategoriesDao - abstract val tracksDao: TracksDao + abstract fun getTracksDao(): TracksDao - abstract val trackLogsDao: TrackLogsDao + abstract fun getTrackLogsDao(): TrackLogsDao - abstract val suggestionDao: SuggestionDao + abstract fun getSuggestionDao(): SuggestionDao - abstract val bookmarksDao: BookmarksDao + abstract fun getBookmarksDao(): BookmarksDao - abstract val scrobblingDao: ScrobblingDao + abstract fun getScrobblingDao(): ScrobblingDao - abstract val sourcesDao: MangaSourcesDao + abstract fun getSourcesDao(): MangaSourcesDao } fun getDatabaseMigrations(context: Context): Array = arrayOf( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt index f110024ef..bf10e6b3c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/MangaDataRepository.kt @@ -28,16 +28,16 @@ class MangaDataRepository @Inject constructor( suspend fun saveReaderMode(manga: Manga, mode: ReaderMode) { db.withTransaction { storeManga(manga) - val entity = db.preferencesDao.find(manga.id) ?: newEntity(manga.id) - db.preferencesDao.upsert(entity.copy(mode = mode.id)) + val entity = db.getPreferencesDao().find(manga.id) ?: newEntity(manga.id) + db.getPreferencesDao().upsert(entity.copy(mode = mode.id)) } } suspend fun saveColorFilter(manga: Manga, colorFilter: ReaderColorFilter?) { db.withTransaction { storeManga(manga) - val entity = db.preferencesDao.find(manga.id) ?: newEntity(manga.id) - db.preferencesDao.upsert( + val entity = db.getPreferencesDao().find(manga.id) ?: newEntity(manga.id) + db.getPreferencesDao().upsert( entity.copy( cfBrightness = colorFilter?.brightness ?: 0f, cfContrast = colorFilter?.contrast ?: 0f, @@ -48,25 +48,25 @@ class MangaDataRepository @Inject constructor( } suspend fun getReaderMode(mangaId: Long): ReaderMode? { - return db.preferencesDao.find(mangaId)?.let { ReaderMode.valueOf(it.mode) } + return db.getPreferencesDao().find(mangaId)?.let { ReaderMode.valueOf(it.mode) } } suspend fun getColorFilter(mangaId: Long): ReaderColorFilter? { - return db.preferencesDao.find(mangaId)?.getColorFilterOrNull() + return db.getPreferencesDao().find(mangaId)?.getColorFilterOrNull() } fun observeColorFilter(mangaId: Long): Flow { - return db.preferencesDao.observe(mangaId) + return db.getPreferencesDao().observe(mangaId) .map { it?.getColorFilterOrNull() } .distinctUntilChanged() } suspend fun findMangaById(mangaId: Long): Manga? { - return db.mangaDao.find(mangaId)?.toManga() + return db.getMangaDao().find(mangaId)?.toManga() } suspend fun findMangaByPublicUrl(publicUrl: String): Manga? { - return db.mangaDao.findByPublicUrl(publicUrl)?.toManga() + return db.getMangaDao().findByPublicUrl(publicUrl)?.toManga() } suspend fun resolveIntent(intent: MangaIntent): Manga? = when { @@ -79,13 +79,13 @@ class MangaDataRepository @Inject constructor( suspend fun storeManga(manga: Manga) { val tags = manga.tags.toEntities() db.withTransaction { - db.tagsDao.upsert(tags) - db.mangaDao.upsert(manga.toEntity(), tags) + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(manga.toEntity(), tags) } } suspend fun findTags(source: MangaSource): Set { - return db.tagsDao.findTags(source.name).toMangaTags() + return db.getTagsDao().findTags(source.name).toMangaTags() } private fun MangaPrefsEntity.getColorFilterOrNull(): ReaderColorFilter? { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/ProgressUpdateUseCase.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/ProgressUpdateUseCase.kt index 5b65235bb..b82965f10 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/ProgressUpdateUseCase.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/ProgressUpdateUseCase.kt @@ -16,7 +16,7 @@ class ProgressUpdateUseCase @Inject constructor( ) { suspend operator fun invoke(manga: Manga): Float { - val history = database.historyDao.find(manga.id) ?: return PROGRESS_NONE + val history = database.getHistoryDao().find(manga.id) ?: return PROGRESS_NONE val seed = if (manga.isLocal) { localMangaRepository.getRemoteManga(manga) ?: manga } else { @@ -43,7 +43,7 @@ class ProgressUpdateUseCase @Inject constructor( val ppc = 1f / chaptersCount val result = ppc * chapterIndex + ppc * pagePercent if (result != history.percent) { - database.historyDao.update( + database.getHistoryDao().update( history.copy( chapterId = chapter.id, percent = result, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/explore/data/MangaSourcesRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/explore/data/MangaSourcesRepository.kt index fc677c35c..f2780b6ab 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/explore/data/MangaSourcesRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/explore/data/MangaSourcesRepository.kt @@ -30,7 +30,7 @@ class MangaSourcesRepository @Inject constructor( ) { private val dao: MangaSourcesDao - get() = db.sourcesDao + get() = db.getSourcesDao() private val remoteSources = EnumSet.allOf(MangaSource::class.java).apply { remove(MangaSource.LOCAL) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt index b61713cb8..4069cb3c8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/domain/FavouritesRepository.kt @@ -31,27 +31,27 @@ class FavouritesRepository @Inject constructor( ) { suspend fun getAllManga(): List { - val entities = db.favouritesDao.findAll() + val entities = db.getFavouritesDao().findAll() return entities.toMangaList() } suspend fun getLastManga(limit: Int): List { - val entities = db.favouritesDao.findLast(limit) + val entities = db.getFavouritesDao().findLast(limit) return entities.toMangaList() } fun observeAll(order: ListSortOrder): Flow> { - return db.favouritesDao.observeAll(order) + return db.getFavouritesDao().observeAll(order) .mapItems { it.toManga() } } suspend fun getManga(categoryId: Long): List { - val entities = db.favouritesDao.findAll(categoryId) + val entities = db.getFavouritesDao().findAll(categoryId) return entities.toMangaList() } fun observeAll(categoryId: Long, order: ListSortOrder): Flow> { - return db.favouritesDao.observeAll(categoryId, order) + return db.getFavouritesDao().observeAll(categoryId, order) .mapItems { it.toManga() } } @@ -61,25 +61,25 @@ class FavouritesRepository @Inject constructor( } fun observeCategories(): Flow> { - return db.favouriteCategoriesDao.observeAll().mapItems { + return db.getFavouriteCategoriesDao().observeAll().mapItems { it.toFavouriteCategory() }.distinctUntilChanged() } fun observeCategoriesForLibrary(): Flow> { - return db.favouriteCategoriesDao.observeAllForLibrary().mapItems { + return db.getFavouriteCategoriesDao().observeAllForLibrary().mapItems { it.toFavouriteCategory() }.distinctUntilChanged() } fun observeCategoriesWithCovers(): Flow>> { - return db.favouriteCategoriesDao.observeAll() + return db.getFavouriteCategoriesDao().observeAll() .map { db.withTransaction { val res = LinkedHashMap>() for (entity in it) { val cat = entity.toFavouriteCategory() - res[cat] = db.favouritesDao.findCovers( + res[cat] = db.getFavouritesDao().findCovers( categoryId = cat.id, order = cat.order, ) @@ -90,16 +90,16 @@ class FavouritesRepository @Inject constructor( } fun observeCategory(id: Long): Flow { - return db.favouriteCategoriesDao.observe(id) + return db.getFavouriteCategoriesDao().observe(id) .map { it?.toFavouriteCategory() } } fun observeCategoriesIds(mangaId: Long): Flow> { - return db.favouritesDao.observeIds(mangaId).map { it.toSet() } + return db.getFavouritesDao().observeIds(mangaId).map { it.toSet() } } suspend fun getCategory(id: Long): FavouriteCategory { - return db.favouriteCategoriesDao.find(id.toInt()).toFavouriteCategory() + return db.getFavouriteCategoriesDao().find(id.toInt()).toFavouriteCategory() } suspend fun createCategory( @@ -111,14 +111,14 @@ class FavouritesRepository @Inject constructor( val entity = FavouriteCategoryEntity( title = title, createdAt = System.currentTimeMillis(), - sortKey = db.favouriteCategoriesDao.getNextSortKey(), + sortKey = db.getFavouriteCategoriesDao().getNextSortKey(), categoryId = 0, order = sortOrder.name, track = isTrackerEnabled, deletedAt = 0L, isVisibleInLibrary = isVisibleOnShelf, ) - val id = db.favouriteCategoriesDao.insert(entity) + val id = db.getFavouriteCategoriesDao().insert(entity) val category = entity.toFavouriteCategory(id) channels.createChannel(category) return category @@ -131,22 +131,22 @@ class FavouritesRepository @Inject constructor( isTrackerEnabled: Boolean, isVisibleOnShelf: Boolean, ) { - db.favouriteCategoriesDao.update(id, title, sortOrder.name, isTrackerEnabled, isVisibleOnShelf) + db.getFavouriteCategoriesDao().update(id, title, sortOrder.name, isTrackerEnabled, isVisibleOnShelf) } suspend fun updateCategory(id: Long, isVisibleInLibrary: Boolean) { - db.favouriteCategoriesDao.updateLibVisibility(id, isVisibleInLibrary) + db.getFavouriteCategoriesDao().updateLibVisibility(id, isVisibleInLibrary) } suspend fun updateCategoryTracking(id: Long, isTrackingEnabled: Boolean) { - db.favouriteCategoriesDao.updateTracking(id, isTrackingEnabled) + db.getFavouriteCategoriesDao().updateTracking(id, isTrackingEnabled) } suspend fun removeCategories(ids: Collection) { db.withTransaction { for (id in ids) { - db.favouritesDao.deleteAll(id) - db.favouriteCategoriesDao.delete(id) + db.getFavouritesDao().deleteAll(id) + db.getFavouriteCategoriesDao().delete(id) } } // run after transaction success @@ -156,11 +156,11 @@ class FavouritesRepository @Inject constructor( } suspend fun setCategoryOrder(id: Long, order: ListSortOrder) { - db.favouriteCategoriesDao.updateOrder(id, order.name) + db.getFavouriteCategoriesDao().updateOrder(id, order.name) } suspend fun reorderCategories(orderedIds: List) { - val dao = db.favouriteCategoriesDao + val dao = db.getFavouriteCategoriesDao() db.withTransaction { for ((i, id) in orderedIds.withIndex()) { dao.updateSortKey(id, i) @@ -172,8 +172,8 @@ class FavouritesRepository @Inject constructor( db.withTransaction { for (manga in mangas) { val tags = manga.tags.toEntities() - db.tagsDao.upsert(tags) - db.mangaDao.upsert(manga.toEntity(), tags) + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(manga.toEntity(), tags) val entity = FavouriteEntity( mangaId = manga.id, categoryId = categoryId, @@ -181,7 +181,7 @@ class FavouritesRepository @Inject constructor( sortKey = 0, deletedAt = 0L, ) - db.favouritesDao.insert(entity) + db.getFavouritesDao().insert(entity) } } } @@ -189,7 +189,7 @@ class FavouritesRepository @Inject constructor( suspend fun removeFromFavourites(ids: Collection): ReversibleHandle { db.withTransaction { for (id in ids) { - db.favouritesDao.delete(mangaId = id) + db.getFavouritesDao().delete(mangaId = id) } } return ReversibleHandle { recoverToFavourites(ids) } @@ -198,14 +198,14 @@ class FavouritesRepository @Inject constructor( suspend fun removeFromCategory(categoryId: Long, ids: Collection): ReversibleHandle { db.withTransaction { for (id in ids) { - db.favouritesDao.delete(categoryId = categoryId, mangaId = id) + db.getFavouritesDao().delete(categoryId = categoryId, mangaId = id) } } return ReversibleHandle { recoverToCategory(categoryId, ids) } } private fun observeOrder(categoryId: Long): Flow { - return db.favouriteCategoriesDao.observe(categoryId) + return db.getFavouriteCategoriesDao().observe(categoryId) .filterNotNull() .map { x -> ListSortOrder(x.order, ListSortOrder.NEWEST) } .distinctUntilChanged() @@ -214,7 +214,7 @@ class FavouritesRepository @Inject constructor( private suspend fun recoverToFavourites(ids: Collection) { db.withTransaction { for (id in ids) { - db.favouritesDao.recover(mangaId = id) + db.getFavouritesDao().recover(mangaId = id) } } } @@ -222,7 +222,7 @@ class FavouritesRepository @Inject constructor( private suspend fun recoverToCategory(categoryId: Long, ids: Collection) { db.withTransaction { for (id in ids) { - db.favouritesDao.recover(mangaId = id, categoryId = categoryId) + db.getFavouritesDao().recover(mangaId = id, categoryId = categoryId) } } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryDao.kt b/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryDao.kt index 25636902b..ed2deec64 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryDao.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryDao.kt @@ -23,7 +23,7 @@ abstract class HistoryDao { @Transaction @Query("SELECT * FROM history WHERE deleted_at = 0 AND manga_id IN (:ids)") - abstract suspend fun findAll(ids: Collection): List + abstract suspend fun findAll(ids: Collection): List @Transaction @Query("SELECT * FROM history WHERE deleted_at = 0 ORDER BY updated_at DESC") diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt index 689c4c0f6..fd64610e1 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/history/data/HistoryRepository.kt @@ -38,36 +38,36 @@ class HistoryRepository @Inject constructor( ) { suspend fun getList(offset: Int, limit: Int): List { - val entities = db.historyDao.findAll(offset, limit) + val entities = db.getHistoryDao().findAll(offset, limit) return entities.map { it.manga.toManga(it.tags.toMangaTags()) } } suspend fun getLastOrNull(): Manga? { - val entity = db.historyDao.findAll(0, 1).firstOrNull() ?: return null + val entity = db.getHistoryDao().findAll(0, 1).firstOrNull() ?: return null return entity.manga.toManga(entity.tags.toMangaTags()) } fun observeLast(): Flow { - return db.historyDao.observeAll(1).map { + return db.getHistoryDao().observeAll(1).map { val first = it.firstOrNull() first?.manga?.toManga(first.tags.toMangaTags()) } } fun observeAll(): Flow> { - return db.historyDao.observeAll().mapItems { + return db.getHistoryDao().observeAll().mapItems { it.manga.toManga(it.tags.toMangaTags()) } } fun observeAll(limit: Int): Flow> { - return db.historyDao.observeAll(limit).mapItems { + return db.getHistoryDao().observeAll(limit).mapItems { it.manga.toManga(it.tags.toMangaTags()) } } fun observeAllWithHistory(order: ListSortOrder): Flow> { - return db.historyDao.observeAll(order).mapItems { + return db.getHistoryDao().observeAll(order).mapItems { MangaWithHistory( it.manga.toManga(it.tags.toMangaTags()), it.history.toMangaHistory(), @@ -76,13 +76,13 @@ class HistoryRepository @Inject constructor( } fun observeOne(id: Long): Flow { - return db.historyDao.observe(id).map { + return db.getHistoryDao().observe(id).map { it?.toMangaHistory() } } fun observeHasItems(): Flow { - return db.historyDao.observeCount() + return db.getHistoryDao().observeCount() .map { it > 0 } .distinctUntilChanged() } @@ -93,12 +93,12 @@ class HistoryRepository @Inject constructor( } val tags = manga.tags.toEntities() db.withTransaction { - val existing = db.mangaDao.find(manga.id)?.manga + val existing = db.getMangaDao().find(manga.id)?.manga if (existing == null || existing.source == manga.source.name) { - db.tagsDao.upsert(tags) - db.mangaDao.upsert(manga.toEntity(), tags) + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(manga.toEntity(), tags) } - db.historyDao.upsert( + db.getHistoryDao().upsert( HistoryEntity( mangaId = manga.id, createdAt = System.currentTimeMillis(), @@ -119,29 +119,29 @@ class HistoryRepository @Inject constructor( } suspend fun getOne(manga: Manga): MangaHistory? { - return db.historyDao.find(manga.id)?.recoverIfNeeded(manga)?.toMangaHistory() + return db.getHistoryDao().find(manga.id)?.recoverIfNeeded(manga)?.toMangaHistory() } suspend fun getProgress(mangaId: Long): Float { - return db.historyDao.findProgress(mangaId) ?: PROGRESS_NONE + return db.getHistoryDao().findProgress(mangaId) ?: PROGRESS_NONE } suspend fun clear() { - db.historyDao.clear() + db.getHistoryDao().clear() } suspend fun delete(manga: Manga) { - db.historyDao.delete(manga.id) + db.getHistoryDao().delete(manga.id) } suspend fun deleteAfter(minDate: Long) { - db.historyDao.deleteAfter(minDate) + db.getHistoryDao().deleteAfter(minDate) } suspend fun delete(ids: Collection): ReversibleHandle { db.withTransaction { for (id in ids) { - db.historyDao.delete(id) + db.getHistoryDao().delete(id) } } return ReversibleHandle { @@ -154,13 +154,13 @@ class HistoryRepository @Inject constructor( * Useful for replacing saved manga on deleting it with remote source */ suspend fun deleteOrSwap(manga: Manga, alternative: Manga?) { - if (alternative == null || db.mangaDao.update(alternative.toEntity()) <= 0) { - db.historyDao.delete(manga.id) + if (alternative == null || db.getMangaDao().update(alternative.toEntity()) <= 0) { + db.getHistoryDao().delete(manga.id) } } suspend fun getPopularTags(limit: Int): List { - return db.historyDao.findPopularTags(limit).map { x -> x.toMangaTag() } + return db.getHistoryDao().findPopularTags(limit).map { x -> x.toMangaTag() } } fun shouldSkip(manga: Manga): Boolean { @@ -178,7 +178,7 @@ class HistoryRepository @Inject constructor( private suspend fun recover(ids: Collection) { db.withTransaction { for (id in ids) { - db.historyDao.recover(id) + db.getHistoryDao().recover(id) } } } @@ -192,7 +192,7 @@ class HistoryRepository @Inject constructor( (chapters.size * percent).toInt(), )?.id ?: return this val newEntity = copy(chapterId = newChapterId) - db.historyDao.update(newEntity) + db.getHistoryDao().update(newEntity) return newEntity } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/data/AniListRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/data/AniListRepository.kt index a1a3da59c..bd4852bf5 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/data/AniListRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/data/AniListRepository.kt @@ -106,7 +106,7 @@ class AniListRepository @Inject constructor( } override suspend fun unregister(mangaId: Long) { - return db.scrobblingDao.delete(ScrobblerService.ANILIST.id, mangaId) + return db.getScrobblingDao().delete(ScrobblerService.ANILIST.id, mangaId) } override fun logout() { @@ -223,7 +223,7 @@ class AniListRepository @Inject constructor( comment = json.getString("notes"), rating = scoreFormat.normalize(json.getDouble("score").toFloat()), ) - db.scrobblingDao.upsert(entity) + db.getScrobblingDao().upsert(entity) } private fun ScrobblerManga(json: JSONObject): ScrobblerManga { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/domain/AniListScrobbler.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/domain/AniListScrobbler.kt index 05b10da0a..ef4612950 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/domain/AniListScrobbler.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/anilist/domain/AniListScrobbler.kt @@ -29,7 +29,7 @@ class AniListScrobbler @Inject constructor( status: ScrobblingStatus?, comment: String?, ) { - val entity = db.scrobblingDao.find(scrobblerService.id, mangaId) + val entity = db.getScrobblingDao().find(scrobblerService.id, mangaId) requireNotNull(entity) { "Scrobbling info for manga $mangaId not found" } repository.updateRate( rateId = entity.id, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt index 52cb7a107..0a89ecaf6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/domain/Scrobbler.kt @@ -67,24 +67,24 @@ abstract class Scrobbler( } suspend fun scrobble(mangaId: Long, chapter: MangaChapter) { - val entity = db.scrobblingDao.find(scrobblerService.id, mangaId) ?: return + val entity = db.getScrobblingDao().find(scrobblerService.id, mangaId) ?: return repository.updateRate(entity.id, entity.mangaId, chapter) } suspend fun getScrobblingInfoOrNull(mangaId: Long): ScrobblingInfo? { - val entity = db.scrobblingDao.find(scrobblerService.id, mangaId) ?: return null + val entity = db.getScrobblingDao().find(scrobblerService.id, mangaId) ?: return null return entity.toScrobblingInfo() } abstract suspend fun updateScrobblingInfo(mangaId: Long, rating: Float, status: ScrobblingStatus?, comment: String?) fun observeScrobblingInfo(mangaId: Long): Flow { - return db.scrobblingDao.observe(scrobblerService.id, mangaId) + return db.getScrobblingDao().observe(scrobblerService.id, mangaId) .map { it?.toScrobblingInfo() } } fun observeAllScrobblingInfo(): Flow> { - return db.scrobblingDao.observe(scrobblerService.id) + return db.getScrobblingDao().observe(scrobblerService.id) .map { entities -> coroutineScope { entities.map { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/data/MALRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/data/MALRepository.kt index 9e7d3f57f..d2887c30c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/data/MALRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/data/MALRepository.kt @@ -85,7 +85,7 @@ class MALRepository @Inject constructor( } override suspend fun unregister(mangaId: Long) { - return db.scrobblingDao.delete(ScrobblerService.MAL.id, mangaId) + return db.getScrobblingDao().delete(ScrobblerService.MAL.id, mangaId) } override suspend fun findManga(query: String, offset: Int): List { @@ -176,7 +176,7 @@ class MALRepository @Inject constructor( comment = json.getString("comments"), rating = (json.getDouble("score").toFloat() / 10f).coerceIn(0f, 1f), ) - db.scrobblingDao.upsert(entity) + db.getScrobblingDao().upsert(entity) } override fun logout() { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/domain/MALScrobbler.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/domain/MALScrobbler.kt index ce5d040ee..3f83625e9 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/domain/MALScrobbler.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/mal/domain/MALScrobbler.kt @@ -30,7 +30,7 @@ class MALScrobbler @Inject constructor( status: ScrobblingStatus?, comment: String?, ) { - val entity = db.scrobblingDao.find(scrobblerService.id, mangaId) + val entity = db.getScrobblingDao().find(scrobblerService.id, mangaId) requireNotNull(entity) { "Scrobbling info for manga $mangaId not found" } repository.updateRate( rateId = entity.id, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt index 3f833596b..41624a070 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt @@ -84,7 +84,7 @@ class ShikimoriRepository @Inject constructor( } override suspend fun unregister(mangaId: Long) { - return db.scrobblingDao.delete(ScrobblerService.SHIKIMORI.id, mangaId) + return db.getScrobblingDao().delete(ScrobblerService.SHIKIMORI.id, mangaId) } override fun logout() { @@ -192,7 +192,7 @@ class ShikimoriRepository @Inject constructor( comment = json.getString("text"), rating = (json.getDouble("score").toFloat() / 10f).coerceIn(0f, 1f), ) - db.scrobblingDao.upsert(entity) + db.getScrobblingDao().upsert(entity) } private fun ScrobblerManga(json: JSONObject) = ScrobblerManga( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt index e7a06d53c..b0d720359 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt @@ -31,7 +31,7 @@ class ShikimoriScrobbler @Inject constructor( status: ScrobblingStatus?, comment: String?, ) { - val entity = db.scrobblingDao.find(scrobblerService.id, mangaId) + val entity = db.getScrobblingDao().find(scrobblerService.id, mangaId) requireNotNull(entity) { "Scrobbling info for manga $mangaId not found" } repository.updateRate( rateId = entity.id, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt index 4eca29a0d..48a79dbb2 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt @@ -40,9 +40,9 @@ class MangaSearchRepository @Inject constructor( } val skipNsfw = settings.isNsfwContentDisabled return if (source != null) { - db.mangaDao.searchByTitle("%$query%", source.name, limit) + db.getMangaDao().searchByTitle("%$query%", source.name, limit) } else { - db.mangaDao.searchByTitle("%$query%", limit) + db.getMangaDao().searchByTitle("%$query%", limit) }.let { if (skipNsfw) it.filterNot { x -> x.manga.isNsfw } else it } @@ -83,7 +83,7 @@ class MangaSearchRepository @Inject constructor( if (query.isEmpty()) { return emptyList() } - val titles = db.suggestionDao.getTitles("$query%") + val titles = db.getSuggestionDao().getTitles("$query%") if (titles.isEmpty()) { return emptyList() } @@ -92,19 +92,20 @@ class MangaSearchRepository @Inject constructor( suspend fun getTagsSuggestion(query: String, limit: Int, source: MangaSource?): List { return when { - query.isNotEmpty() && source != null -> db.tagsDao.findTags(source.name, "%$query%", limit) - query.isNotEmpty() -> db.tagsDao.findTags("%$query%", limit) - source != null -> db.tagsDao.findPopularTags(source.name, limit) - else -> db.tagsDao.findPopularTags(limit) + query.isNotEmpty() && source != null -> db.getTagsDao() + .findTags(source.name, "%$query%", limit) + query.isNotEmpty() -> db.getTagsDao().findTags("%$query%", limit) + source != null -> db.getTagsDao().findPopularTags(source.name, limit) + else -> db.getTagsDao().findPopularTags(limit) }.toMangaTagsList() } suspend fun getTagsSuggestion(tags: Set): List { val ids = tags.mapToSet { it.toEntity().id } return if (ids.size == 1) { - db.tagsDao.findRelatedTags(ids.first()) + db.getTagsDao().findRelatedTags(ids.first()) } else { - db.tagsDao.findRelatedTags(ids) + db.getTagsDao().findRelatedTags(ids) }.mapNotNull { x -> if (x.id in ids) null else x.toMangaTag() } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/TagsAutoCompleteProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/TagsAutoCompleteProvider.kt index 27de0056d..28e9c76a8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/TagsAutoCompleteProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/utils/TagsAutoCompleteProvider.kt @@ -11,7 +11,7 @@ class TagsAutoCompleteProvider @Inject constructor( if (query.isEmpty()) { return emptyList() } - val tags = db.tagsDao.findTags(query = "$query%", limit = 6) + val tags = db.getTagsDao().findTags(query = "$query%", limit = 6) val set = HashSet() val result = ArrayList(tags.size) for (tag in tags) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt index 1759239d2..389fb96da 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/suggestions/domain/SuggestionRepository.kt @@ -17,39 +17,39 @@ class SuggestionRepository @Inject constructor( ) { fun observeAll(): Flow> { - return db.suggestionDao.observeAll().mapItems { + return db.getSuggestionDao().observeAll().mapItems { it.manga.toManga(it.tags.toMangaTags()) } } fun observeAll(limit: Int): Flow> { - return db.suggestionDao.observeAll(limit).mapItems { + return db.getSuggestionDao().observeAll(limit).mapItems { it.manga.toManga(it.tags.toMangaTags()) } } suspend fun getRandom(): Manga? { - return db.suggestionDao.getRandom()?.let { + return db.getSuggestionDao().getRandom()?.let { it.manga.toManga(it.tags.toMangaTags()) } } suspend fun clear() { - db.suggestionDao.deleteAll() + db.getSuggestionDao().deleteAll() } suspend fun isEmpty(): Boolean { - return db.suggestionDao.count() == 0 + return db.getSuggestionDao().count() == 0 } suspend fun replace(suggestions: Iterable) { db.withTransaction { - db.suggestionDao.deleteAll() + db.getSuggestionDao().deleteAll() suggestions.forEach { (manga, relevance) -> val tags = manga.tags.toEntities() - db.tagsDao.upsert(tags) - db.mangaDao.upsert(manga.toEntity(), tags) - db.suggestionDao.upsert( + db.getTagsDao().upsert(tags) + db.getMangaDao().upsert(manga.toEntity(), tags) + db.getSuggestionDao().upsert( SuggestionEntity( mangaId = manga.id, relevance = relevance, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/sync/domain/SyncController.kt b/app/src/main/kotlin/org/koitharu/kotatsu/sync/domain/SyncController.kt index dff6ca7c6..e5646f7f4 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/sync/domain/SyncController.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/sync/domain/SyncController.kt @@ -120,11 +120,11 @@ class SyncController @Inject constructor( private suspend fun MangaDatabase.gc(favourites: Boolean, history: Boolean) = withTransaction { val deletedAt = System.currentTimeMillis() - defaultGcPeriod if (history) { - historyDao.gc(deletedAt) + getHistoryDao().gc(deletedAt) } if (favourites) { - favouritesDao.gc(deletedAt) - favouriteCategoriesDao.gc(deletedAt) + getFavouritesDao().gc(deletedAt) + getFavouriteCategoriesDao().gc(deletedAt) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt index cc98636f5..eb8228d13 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt @@ -20,11 +20,11 @@ import org.koitharu.kotatsu.core.db.entity.MangaEntity class TrackEntity( @PrimaryKey(autoGenerate = false) @ColumnInfo(name = "manga_id") val mangaId: Long, - @get:Deprecated(message = "Should not be used", level = DeprecationLevel.ERROR) + @get:Deprecated(message = "Should not be used", level = DeprecationLevel.WARNING) @ColumnInfo(name = "chapters_total") val totalChapters: Int, @ColumnInfo(name = "last_chapter_id") val lastChapterId: Long, @ColumnInfo(name = "chapters_new") val newChapters: Int, @ColumnInfo(name = "last_check") val lastCheck: Long, - @get:Deprecated(message = "Should not be used", level = DeprecationLevel.ERROR) + @get:Deprecated(message = "Should not be used", level = DeprecationLevel.WARNING) @ColumnInfo(name = "last_notified_id") val lastNotifiedChapterId: Long ) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt index ada8a266f..663fd9e19 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt @@ -41,23 +41,23 @@ class TrackingRepository @Inject constructor( private var isGcCalled = AtomicBoolean(false) suspend fun getNewChaptersCount(mangaId: Long): Int { - return db.tracksDao.findNewChapters(mangaId) ?: 0 + return db.getTracksDao().findNewChapters(mangaId) ?: 0 } fun observeNewChaptersCount(mangaId: Long): Flow { - return db.tracksDao.observeNewChapters(mangaId).map { it ?: 0 } + return db.getTracksDao().observeNewChapters(mangaId).map { it ?: 0 } } fun observeUpdatedMangaCount(): Flow { - return db.tracksDao.observeNewChapters().map { list -> list.count { it > 0 } } + return db.getTracksDao().observeNewChapters().map { list -> list.count { it > 0 } } .onStart { gcIfNotCalled() } } fun observeUpdatedManga(limit: Int = 0): Flow> { return if (limit == 0) { - db.tracksDao.observeUpdatedManga() + db.getTracksDao().observeUpdatedManga() } else { - db.tracksDao.observeUpdatedManga(limit) + db.getTracksDao().observeUpdatedManga(limit) }.mapItems { it.toManga() } .distinctUntilChanged() .onStart { gcIfNotCalled() } @@ -65,7 +65,7 @@ class TrackingRepository @Inject constructor( suspend fun getTracks(mangaList: Collection): List { val ids = mangaList.mapToSet { it.id } - val tracks = db.tracksDao.findAll(ids).groupBy { it.mangaId } + val tracks = db.getTracksDao().findAll(ids).groupBy { it.mangaId } val idSet = HashSet() val result = ArrayList(mangaList.size) for (item in mangaList) { @@ -89,7 +89,7 @@ class TrackingRepository @Inject constructor( @VisibleForTesting suspend fun getTrack(manga: Manga): MangaTracking { - val track = db.tracksDao.find(manga.id) + val track = db.getTracksDao().find(manga.id) return MangaTracking( manga = manga, lastChapterId = track?.lastChapterId ?: NO_ID, @@ -99,14 +99,14 @@ class TrackingRepository @Inject constructor( @VisibleForTesting suspend fun deleteTrack(mangaId: Long) { - db.tracksDao.delete(mangaId) + db.getTracksDao().delete(mangaId) } fun observeTrackingLog(limit: Flow): Flow> { return limit.flatMapLatest { limitValue -> combine( - db.tracksDao.observeNewChaptersMap(), - db.trackLogsDao.observeAll(limitValue), + db.getTracksDao().observeNewChaptersMap(), + db.getTrackLogsDao().observeAll(limitValue), ) { counters, entities -> val countersMap = counters.toMutableMap() entities.map { x -> x.toTrackingLogItem(countersMap) } @@ -116,21 +116,21 @@ class TrackingRepository @Inject constructor( } } - suspend fun getLogsCount() = db.trackLogsDao.count() + suspend fun getLogsCount() = db.getTrackLogsDao().count() - suspend fun clearLogs() = db.trackLogsDao.clear() + suspend fun clearLogs() = db.getTrackLogsDao().clear() - suspend fun clearCounters() = db.tracksDao.clearCounters() + suspend fun clearCounters() = db.getTracksDao().clearCounters() suspend fun gc() { - db.tracksDao.gc() - db.trackLogsDao.gc() + db.getTracksDao().gc() + db.getTrackLogsDao().gc() } suspend fun saveUpdates(updates: MangaUpdates.Success) { db.withTransaction { val track = getOrCreateTrack(updates.manga.id).mergeWith(updates) - db.tracksDao.upsert(track) + db.getTracksDao().upsert(track) if (updates.isValid && updates.newChapters.isNotEmpty()) { updatePercent(updates) val logEntity = TrackLogEntity( @@ -138,7 +138,7 @@ class TrackingRepository @Inject constructor( chapters = updates.newChapters.joinToString("\n") { x -> x.name }, createdAt = System.currentTimeMillis(), ) - db.trackLogsDao.insert(logEntity) + db.getTrackLogsDao().insert(logEntity) } } } @@ -146,10 +146,10 @@ class TrackingRepository @Inject constructor( suspend fun clearUpdates(ids: Collection) { when { ids.isEmpty() -> return - ids.size == 1 -> db.tracksDao.clearCounter(ids.single()) + ids.size == 1 -> db.getTracksDao().clearCounter(ids.single()) else -> db.withTransaction { for (id in ids) { - db.tracksDao.clearCounter(id) + db.getTracksDao().clearCounter(id) } } } @@ -174,11 +174,11 @@ class TrackingRepository @Inject constructor( lastCheck = System.currentTimeMillis(), lastNotifiedChapterId = lastChapterId, ) - db.tracksDao.upsert(entity) + db.getTracksDao().upsert(entity) } suspend fun getCategoriesCount(): IntArray { - val categories = db.favouriteCategoriesDao.findAll() + val categories = db.getFavouriteCategoriesDao().findAll() return intArrayOf( categories.count { it.track }, categories.size, @@ -186,19 +186,19 @@ class TrackingRepository @Inject constructor( } suspend fun getAllFavouritesManga(): Map> { - val categories = db.favouriteCategoriesDao.findAll() + val categories = db.getFavouriteCategoriesDao().findAll() return categories.associateTo(LinkedHashMap(categories.size)) { categoryEntity -> categoryEntity.toFavouriteCategory() to - db.favouritesDao.findAllManga(categoryEntity.categoryId).toMangaList() + db.getFavouritesDao().findAllManga(categoryEntity.categoryId).toMangaList() } } suspend fun getAllHistoryManga(): List { - return db.historyDao.findAllManga().toMangaList() + return db.getHistoryDao().findAllManga().toMangaList() } private suspend fun getOrCreateTrack(mangaId: Long): TrackEntity { - return db.tracksDao.find(mangaId) ?: TrackEntity( + return db.getTracksDao().find(mangaId) ?: TrackEntity( mangaId = mangaId, totalChapters = 0, lastChapterId = 0L, @@ -209,7 +209,7 @@ class TrackingRepository @Inject constructor( } private suspend fun updatePercent(updates: MangaUpdates.Success) { - val history = db.historyDao.find(updates.manga.id) ?: return + val history = db.getHistoryDao().find(updates.manga.id) ?: return val chapters = updates.manga.chapters if (chapters.isNullOrEmpty()) { return @@ -220,7 +220,7 @@ class TrackingRepository @Inject constructor( } val position = (chapters.size - updates.newChapters.size) * history.percent val newPercent = position / chapters.size.toFloat() - db.historyDao.update(history.copy(percent = newPercent)) + db.getHistoryDao().update(history.copy(percent = newPercent)) } private fun TrackEntity.mergeWith(updates: MangaUpdates.Success): TrackEntity {