mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Use SQLDelight for a Category related queries (#7438)
This commit is contained in:
		@@ -11,7 +11,11 @@ class CategoryRepositoryImpl(
 | 
			
		||||
    private val handler: DatabaseHandler,
 | 
			
		||||
) : CategoryRepository {
 | 
			
		||||
 | 
			
		||||
    override fun getAll(): Flow<List<Category>> {
 | 
			
		||||
    override suspend fun getAll(): List<Category> {
 | 
			
		||||
        return handler.awaitList { categoriesQueries.getCategories(categoryMapper) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getAllAsFlow(): Flow<List<Category>> {
 | 
			
		||||
        return handler.subscribeToList { categoriesQueries.getCategories(categoryMapper) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,13 +9,17 @@ class GetCategories(
 | 
			
		||||
) {
 | 
			
		||||
 | 
			
		||||
    fun subscribe(): Flow<List<Category>> {
 | 
			
		||||
        return categoryRepository.getAll()
 | 
			
		||||
        return categoryRepository.getAllAsFlow()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun subscribe(mangaId: Long): Flow<List<Category>> {
 | 
			
		||||
        return categoryRepository.getCategoriesByMangaIdAsFlow(mangaId)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    suspend fun await(): List<Category> {
 | 
			
		||||
        return categoryRepository.getAll()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    suspend fun await(mangaId: Long): List<Category> {
 | 
			
		||||
        return categoryRepository.getCategoriesByMangaId(mangaId)
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
package eu.kanade.domain.category.model
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import java.io.Serializable
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category as DbCategory
 | 
			
		||||
 | 
			
		||||
@@ -8,7 +10,19 @@ data class Category(
 | 
			
		||||
    val name: String,
 | 
			
		||||
    val order: Long,
 | 
			
		||||
    val flags: Long,
 | 
			
		||||
) : Serializable
 | 
			
		||||
) : Serializable {
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        val default = { context: Context ->
 | 
			
		||||
            Category(
 | 
			
		||||
                id = 0,
 | 
			
		||||
                name = context.getString(R.string.default_category),
 | 
			
		||||
                order = 0,
 | 
			
		||||
                flags = 0,
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun Category.toDbCategory(): DbCategory = DbCategory.create(name).also {
 | 
			
		||||
    it.id = id.toInt()
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,9 @@ import kotlinx.coroutines.flow.Flow
 | 
			
		||||
 | 
			
		||||
interface CategoryRepository {
 | 
			
		||||
 | 
			
		||||
    fun getAll(): Flow<List<Category>>
 | 
			
		||||
    suspend fun getAll(): List<Category>
 | 
			
		||||
 | 
			
		||||
    fun getAllAsFlow(): Flow<List<Category>>
 | 
			
		||||
 | 
			
		||||
    suspend fun getCategoriesByMangaId(mangaId: Long): List<Category>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.MangaCategory
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.queries.CategoryQueries
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.queries.ChapterQueries
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.queries.MangaCategoryQueries
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.queries.MangaQueries
 | 
			
		||||
@@ -21,7 +20,7 @@ import eu.kanade.tachiyomi.data.database.queries.MangaQueries
 | 
			
		||||
class DatabaseHelper(
 | 
			
		||||
    openHelper: SupportSQLiteOpenHelper,
 | 
			
		||||
) :
 | 
			
		||||
    MangaQueries, ChapterQueries, CategoryQueries, MangaCategoryQueries {
 | 
			
		||||
    MangaQueries, ChapterQueries, MangaCategoryQueries {
 | 
			
		||||
 | 
			
		||||
    override val db = DefaultStorIOSQLite.builder()
 | 
			
		||||
        .sqliteOpenHelper(openHelper)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.database.queries
 | 
			
		||||
 | 
			
		||||
import com.pushtorefresh.storio.sqlite.queries.Query
 | 
			
		||||
import com.pushtorefresh.storio.sqlite.queries.RawQuery
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.DbProvider
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.tables.CategoryTable
 | 
			
		||||
 | 
			
		||||
interface CategoryQueries : DbProvider {
 | 
			
		||||
 | 
			
		||||
    fun getCategories() = db.get()
 | 
			
		||||
        .listOfObjects(Category::class.java)
 | 
			
		||||
        .withQuery(
 | 
			
		||||
            Query.builder()
 | 
			
		||||
                .table(CategoryTable.TABLE)
 | 
			
		||||
                .orderBy(CategoryTable.COL_ORDER)
 | 
			
		||||
                .build(),
 | 
			
		||||
        )
 | 
			
		||||
        .prepare()
 | 
			
		||||
 | 
			
		||||
    fun getCategoriesForManga(mangaId: Long) = db.get()
 | 
			
		||||
        .listOfObjects(Category::class.java)
 | 
			
		||||
        .withQuery(
 | 
			
		||||
            RawQuery.builder()
 | 
			
		||||
                .query(getCategoriesForMangaQuery())
 | 
			
		||||
                .args(mangaId)
 | 
			
		||||
                .build(),
 | 
			
		||||
        )
 | 
			
		||||
        .prepare()
 | 
			
		||||
}
 | 
			
		||||
@@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.download
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import com.hippo.unifile.UniFile
 | 
			
		||||
import com.jakewharton.rxrelay.BehaviorRelay
 | 
			
		||||
import eu.kanade.domain.category.interactor.GetCategories
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
@@ -32,6 +33,7 @@ import uy.kohesive.injekt.injectLazy
 | 
			
		||||
class DownloadManager(
 | 
			
		||||
    private val context: Context,
 | 
			
		||||
    private val db: DatabaseHelper = Injekt.get(),
 | 
			
		||||
    private val getCategories: GetCategories = Injekt.get(),
 | 
			
		||||
) {
 | 
			
		||||
 | 
			
		||||
    private val sourceManager: SourceManager by injectLazy()
 | 
			
		||||
@@ -362,8 +364,9 @@ class DownloadManager(
 | 
			
		||||
    private fun getChaptersToDelete(chapters: List<Chapter>, manga: Manga): List<Chapter> {
 | 
			
		||||
        // Retrieve the categories that are set to exclude from being deleted on read
 | 
			
		||||
        val categoriesToExclude = preferences.removeExcludeCategories().get().map(String::toInt)
 | 
			
		||||
        val categoriesForManga = db.getCategoriesForManga(manga.id!!).executeAsBlocking()
 | 
			
		||||
            .mapNotNull { it.id }
 | 
			
		||||
 | 
			
		||||
        val categoriesForManga = runBlocking { getCategories.await(manga.id!!) }
 | 
			
		||||
            .map { it.id }
 | 
			
		||||
            .takeUnless { it.isEmpty() }
 | 
			
		||||
            ?: listOf(0)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import android.os.IBinder
 | 
			
		||||
import android.os.PowerManager
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import eu.kanade.data.chapter.NoChaptersException
 | 
			
		||||
import eu.kanade.domain.category.interactor.GetCategories
 | 
			
		||||
import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
 | 
			
		||||
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
 | 
			
		||||
import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
 | 
			
		||||
@@ -92,6 +93,7 @@ class LibraryUpdateService(
 | 
			
		||||
    private val getMangaById: GetMangaById = Injekt.get(),
 | 
			
		||||
    private val updateManga: UpdateManga = Injekt.get(),
 | 
			
		||||
    private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(),
 | 
			
		||||
    private val getCategories: GetCategories = Injekt.get(),
 | 
			
		||||
    private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(),
 | 
			
		||||
    private val getTracks: GetTracks = Injekt.get(),
 | 
			
		||||
    private val insertTrack: InsertTrack = Injekt.get(),
 | 
			
		||||
@@ -346,7 +348,8 @@ class LibraryUpdateService(
 | 
			
		||||
                                                    val newDbChapters = newChapters.map { it.toDbChapter() }
 | 
			
		||||
 | 
			
		||||
                                                    if (newChapters.isNotEmpty()) {
 | 
			
		||||
                                                        if (mangaWithNotif.shouldDownloadNewChapters(db, preferences)) {
 | 
			
		||||
                                                        val categoryIds = getCategories.await(domainManga.id).map { it.id }
 | 
			
		||||
                                                        if (domainManga.shouldDownloadNewChapters(categoryIds, preferences)) {
 | 
			
		||||
                                                            downloadChapters(mangaWithNotif, newDbChapters)
 | 
			
		||||
                                                            hasDownloads.set(true)
 | 
			
		||||
                                                        }
 | 
			
		||||
 
 | 
			
		||||
@@ -372,9 +372,9 @@ open class BrowseSourcePresenter(
 | 
			
		||||
     * @param manga the manga to get categories from.
 | 
			
		||||
     * @return Array of category ids the manga is in, if none returns default id
 | 
			
		||||
     */
 | 
			
		||||
    fun getMangaCategoryIds(manga: Manga): Array<Long?> {
 | 
			
		||||
        val categories = db.getCategoriesForManga(manga.id!!).executeAsBlocking()
 | 
			
		||||
        return categories.mapNotNull { it?.id?.toLong() }.toTypedArray()
 | 
			
		||||
    suspend fun getMangaCategoryIds(manga: Manga): Array<Long?> {
 | 
			
		||||
        val categories = getCategories.await(manga.id!!)
 | 
			
		||||
        return categories.map { it.id }.toTypedArray()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,8 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity
 | 
			
		||||
import eu.kanade.tachiyomi.ui.recent.history.HistoryController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.launchIO
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.launchUI
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.logcat
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.toast
 | 
			
		||||
import eu.kanade.tachiyomi.widget.materialdialogs.QuadStateTextView
 | 
			
		||||
@@ -249,18 +251,22 @@ class MangaController :
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun onCategoriesClick() {
 | 
			
		||||
        val manga = presenter.manga ?: return
 | 
			
		||||
        val categories = presenter.getCategories()
 | 
			
		||||
        viewScope.launchIO {
 | 
			
		||||
            val manga = presenter.manga ?: return@launchIO
 | 
			
		||||
            val categories = presenter.getCategories()
 | 
			
		||||
 | 
			
		||||
        val ids = presenter.getMangaCategoryIds(manga)
 | 
			
		||||
        val preselected = categories.map {
 | 
			
		||||
            if (it.id in ids) {
 | 
			
		||||
                QuadStateTextView.State.CHECKED.ordinal
 | 
			
		||||
            } else {
 | 
			
		||||
                QuadStateTextView.State.UNCHECKED.ordinal
 | 
			
		||||
            val ids = presenter.getMangaCategoryIds(manga)
 | 
			
		||||
            val preselected = categories.map {
 | 
			
		||||
                if (it.id in ids) {
 | 
			
		||||
                    QuadStateTextView.State.CHECKED.ordinal
 | 
			
		||||
                } else {
 | 
			
		||||
                    QuadStateTextView.State.UNCHECKED.ordinal
 | 
			
		||||
                }
 | 
			
		||||
            }.toTypedArray()
 | 
			
		||||
            launchUI {
 | 
			
		||||
                showChangeCategoryDialog(manga.toDbManga(), categories, preselected)
 | 
			
		||||
            }
 | 
			
		||||
        }.toTypedArray()
 | 
			
		||||
        showChangeCategoryDialog(manga.toDbManga(), categories, preselected)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun showChangeCategoryDialog(manga: Manga, categories: List<Category>, preselected: Array<Int>) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import android.os.Bundle
 | 
			
		||||
import androidx.compose.runtime.Immutable
 | 
			
		||||
import eu.kanade.domain.category.interactor.GetCategories
 | 
			
		||||
import eu.kanade.domain.category.interactor.SetMangaCategories
 | 
			
		||||
import eu.kanade.domain.category.model.toDbCategory
 | 
			
		||||
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
 | 
			
		||||
import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
 | 
			
		||||
import eu.kanade.domain.chapter.interactor.UpdateChapter
 | 
			
		||||
@@ -22,7 +23,6 @@ import eu.kanade.domain.track.interactor.GetTracks
 | 
			
		||||
import eu.kanade.domain.track.interactor.InsertTrack
 | 
			
		||||
import eu.kanade.domain.track.model.toDbTrack
 | 
			
		||||
import eu.kanade.domain.track.model.toDomainTrack
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
@@ -78,7 +78,6 @@ class MangaPresenter(
 | 
			
		||||
    val mangaId: Long,
 | 
			
		||||
    val isFromSource: Boolean,
 | 
			
		||||
    private val preferences: PreferencesHelper = Injekt.get(),
 | 
			
		||||
    private val db: DatabaseHelper = Injekt.get(),
 | 
			
		||||
    private val trackManager: TrackManager = Injekt.get(),
 | 
			
		||||
    private val downloadManager: DownloadManager = Injekt.get(),
 | 
			
		||||
    private val getMangaAndChapters: GetMangaWithChapters = Injekt.get(),
 | 
			
		||||
@@ -326,8 +325,8 @@ class MangaPresenter(
 | 
			
		||||
     *
 | 
			
		||||
     * @return List of categories, not including the default category
 | 
			
		||||
     */
 | 
			
		||||
    fun getCategories(): List<Category> {
 | 
			
		||||
        return db.getCategories().executeAsBlocking()
 | 
			
		||||
    suspend fun getCategories(): List<Category> {
 | 
			
		||||
        return getCategories.await().map { it.toDbCategory() }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -597,9 +596,12 @@ class MangaPresenter(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun downloadNewChapters(chapters: List<Chapter>) {
 | 
			
		||||
        val manga = successState?.manga ?: return
 | 
			
		||||
        if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(db, preferences)) return
 | 
			
		||||
        downloadChapters(chapters.map { it.toDomainChapter()!! })
 | 
			
		||||
        presenterScope.launchIO {
 | 
			
		||||
            val manga = successState?.manga ?: return@launchIO
 | 
			
		||||
            val categories = getCategories.await(manga.id).map { it.id }
 | 
			
		||||
            if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(categories, preferences)) return@launchIO
 | 
			
		||||
            downloadChapters(chapters.map { it.toDomainChapter()!! })
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -11,9 +11,9 @@ import androidx.core.text.buildSpannedString
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
 | 
			
		||||
import com.hippo.unifile.UniFile
 | 
			
		||||
import eu.kanade.domain.category.interactor.GetCategories
 | 
			
		||||
import eu.kanade.domain.category.model.Category
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
@@ -32,6 +32,7 @@ import eu.kanade.tachiyomi.widget.materialdialogs.QuadStateTextView
 | 
			
		||||
import eu.kanade.tachiyomi.widget.materialdialogs.setQuadStateMultiChoiceItems
 | 
			
		||||
import kotlinx.coroutines.flow.launchIn
 | 
			
		||||
import kotlinx.coroutines.flow.onEach
 | 
			
		||||
import kotlinx.coroutines.runBlocking
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
@@ -40,13 +41,13 @@ import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
 | 
			
		||||
 | 
			
		||||
class SettingsDownloadController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
    private val db: DatabaseHelper by injectLazy()
 | 
			
		||||
    private val getCategories: GetCategories by injectLazy()
 | 
			
		||||
 | 
			
		||||
    override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
 | 
			
		||||
        titleRes = R.string.pref_category_downloads
 | 
			
		||||
 | 
			
		||||
        val dbCategories = db.getCategories().executeAsBlocking()
 | 
			
		||||
        val categories = listOf(Category.createDefault(context)) + dbCategories
 | 
			
		||||
        val dbCategories = runBlocking { getCategories.await() }
 | 
			
		||||
        val categories = listOf(Category.default(context)) + dbCategories
 | 
			
		||||
 | 
			
		||||
        preference {
 | 
			
		||||
            bindTo(preferences.downloadsDirectory())
 | 
			
		||||
@@ -116,7 +117,7 @@ class SettingsDownloadController : SettingsController() {
 | 
			
		||||
                preferences.removeExcludeCategories().asFlow()
 | 
			
		||||
                    .onEach { mutable ->
 | 
			
		||||
                        val selected = mutable
 | 
			
		||||
                            .mapNotNull { id -> categories.find { it.id == id.toInt() } }
 | 
			
		||||
                            .mapNotNull { id -> categories.find { it.id == id.toLong() } }
 | 
			
		||||
                            .sortedBy { it.order }
 | 
			
		||||
 | 
			
		||||
                        summary = if (selected.isEmpty()) {
 | 
			
		||||
@@ -146,7 +147,7 @@ class SettingsDownloadController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
                fun updateSummary() {
 | 
			
		||||
                    val selectedCategories = preferences.downloadNewChapterCategories().get()
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toInt() } }
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toLong() } }
 | 
			
		||||
                        .sortedBy { it.order }
 | 
			
		||||
                    val includedItemsText = if (selectedCategories.isEmpty()) {
 | 
			
		||||
                        context.getString(R.string.all)
 | 
			
		||||
@@ -155,7 +156,7 @@ class SettingsDownloadController : SettingsController() {
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    val excludedCategories = preferences.downloadNewChapterCategoriesExclude().get()
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toInt() } }
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toLong() } }
 | 
			
		||||
                        .sortedBy { it.order }
 | 
			
		||||
                    val excludedItemsText = if (excludedCategories.isEmpty()) {
 | 
			
		||||
                        context.getString(R.string.none)
 | 
			
		||||
@@ -251,11 +252,11 @@ class SettingsDownloadController : SettingsController() {
 | 
			
		||||
    class DownloadCategoriesDialog : DialogController() {
 | 
			
		||||
 | 
			
		||||
        private val preferences: PreferencesHelper = Injekt.get()
 | 
			
		||||
        private val db: DatabaseHelper = Injekt.get()
 | 
			
		||||
        private val getCategories: GetCategories = Injekt.get()
 | 
			
		||||
 | 
			
		||||
        override fun onCreateDialog(savedViewState: Bundle?): Dialog {
 | 
			
		||||
            val dbCategories = db.getCategories().executeAsBlocking()
 | 
			
		||||
            val categories = listOf(Category.createDefault(activity!!)) + dbCategories
 | 
			
		||||
            val dbCategories = runBlocking { getCategories.await() }
 | 
			
		||||
            val categories = listOf(Category.default(activity!!)) + dbCategories
 | 
			
		||||
 | 
			
		||||
            val items = categories.map { it.name }
 | 
			
		||||
            var selected = categories
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,9 @@ import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.text.buildSpannedString
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
 | 
			
		||||
import eu.kanade.domain.category.interactor.GetCategories
 | 
			
		||||
import eu.kanade.domain.category.model.Category
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.DEVICE_BATTERY_NOT_LOW
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.DEVICE_CHARGING
 | 
			
		||||
@@ -41,6 +41,7 @@ import eu.kanade.tachiyomi.widget.materialdialogs.setQuadStateMultiChoiceItems
 | 
			
		||||
import kotlinx.coroutines.flow.combine
 | 
			
		||||
import kotlinx.coroutines.flow.launchIn
 | 
			
		||||
import kotlinx.coroutines.flow.onEach
 | 
			
		||||
import kotlinx.coroutines.runBlocking
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
@@ -48,14 +49,14 @@ import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
 | 
			
		||||
 | 
			
		||||
class SettingsLibraryController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
    private val db: DatabaseHelper = Injekt.get()
 | 
			
		||||
    private val getCategories: GetCategories by injectLazy()
 | 
			
		||||
    private val trackManager: TrackManager by injectLazy()
 | 
			
		||||
 | 
			
		||||
    override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
 | 
			
		||||
        titleRes = R.string.pref_category_library
 | 
			
		||||
 | 
			
		||||
        val dbCategories = db.getCategories().executeAsBlocking()
 | 
			
		||||
        val categories = listOf(Category.createDefault(context)) + dbCategories
 | 
			
		||||
        val dbCategories = runBlocking { getCategories.await() }
 | 
			
		||||
        val categories = listOf(Category.default(context)) + dbCategories
 | 
			
		||||
 | 
			
		||||
        preferenceCategory {
 | 
			
		||||
            titleRes = R.string.pref_category_display
 | 
			
		||||
@@ -110,12 +111,12 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
                entryValues = arrayOf("-1") + categories.map { it.id.toString() }.toTypedArray()
 | 
			
		||||
                defaultValue = "-1"
 | 
			
		||||
 | 
			
		||||
                val selectedCategory = categories.find { it.id == preferences.defaultCategory() }
 | 
			
		||||
                val selectedCategory = categories.find { it.id == preferences.defaultCategory().toLong() }
 | 
			
		||||
                summary = selectedCategory?.name
 | 
			
		||||
                    ?: context.getString(R.string.default_category_summary)
 | 
			
		||||
                onChange { newValue ->
 | 
			
		||||
                    summary = categories.find {
 | 
			
		||||
                        it.id == (newValue as String).toInt()
 | 
			
		||||
                        it.id == (newValue as String).toLong()
 | 
			
		||||
                    }?.name ?: context.getString(R.string.default_category_summary)
 | 
			
		||||
                    true
 | 
			
		||||
                }
 | 
			
		||||
@@ -228,10 +229,10 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
                fun updateSummary() {
 | 
			
		||||
                    val includedCategories = preferences.libraryUpdateCategories().get()
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toInt() } }
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toLong() } }
 | 
			
		||||
                        .sortedBy { it.order }
 | 
			
		||||
                    val excludedCategories = preferences.libraryUpdateCategoriesExclude().get()
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toInt() } }
 | 
			
		||||
                        .mapNotNull { id -> categories.find { it.id == id.toLong() } }
 | 
			
		||||
                        .sortedBy { it.order }
 | 
			
		||||
 | 
			
		||||
                    val allExcluded = excludedCategories.size == categories.size
 | 
			
		||||
@@ -327,11 +328,11 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
    class LibraryGlobalUpdateCategoriesDialog : DialogController() {
 | 
			
		||||
 | 
			
		||||
        private val preferences: PreferencesHelper = Injekt.get()
 | 
			
		||||
        private val db: DatabaseHelper = Injekt.get()
 | 
			
		||||
        private val getCategories: GetCategories = Injekt.get()
 | 
			
		||||
 | 
			
		||||
        override fun onCreateDialog(savedViewState: Bundle?): Dialog {
 | 
			
		||||
            val dbCategories = db.getCategories().executeAsBlocking()
 | 
			
		||||
            val categories = listOf(Category.createDefault(activity!!)) + dbCategories
 | 
			
		||||
            val dbCategories = runBlocking { getCategories.await() }
 | 
			
		||||
            val categories = listOf(Category.default(activity!!)) + dbCategories
 | 
			
		||||
 | 
			
		||||
            val items = categories.map { it.name }
 | 
			
		||||
            var selected = categories
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,7 @@ import eu.kanade.domain.manga.interactor.UpdateManga
 | 
			
		||||
import eu.kanade.domain.manga.model.isLocal
 | 
			
		||||
import eu.kanade.domain.manga.model.toDbManga
 | 
			
		||||
import eu.kanade.tachiyomi.data.cache.CoverCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.toDomainManga
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.source.LocalSource
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.SManga
 | 
			
		||||
@@ -56,37 +54,27 @@ fun Manga.removeCovers(coverCache: CoverCache = Injekt.get()): Int {
 | 
			
		||||
    return coverCache.deleteFromCache(this, true)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun Manga.shouldDownloadNewChapters(db: DatabaseHelper, prefs: PreferencesHelper): Boolean {
 | 
			
		||||
    return toDomainManga()?.shouldDownloadNewChapters(db, prefs) ?: false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun DomainManga.shouldDownloadNewChapters(db: DatabaseHelper, prefs: PreferencesHelper): Boolean {
 | 
			
		||||
fun DomainManga.shouldDownloadNewChapters(categories: List<Long>, prefs: PreferencesHelper): Boolean {
 | 
			
		||||
    if (!favorite) return false
 | 
			
		||||
 | 
			
		||||
    // Boolean to determine if user wants to automatically download new chapters.
 | 
			
		||||
    val downloadNewChapter = prefs.downloadNewChapter().get()
 | 
			
		||||
    if (!downloadNewChapter) return false
 | 
			
		||||
 | 
			
		||||
    val includedCategories = prefs.downloadNewChapterCategories().get().map { it.toInt() }
 | 
			
		||||
    val excludedCategories = prefs.downloadNewChapterCategoriesExclude().get().map { it.toInt() }
 | 
			
		||||
    val includedCategories = prefs.downloadNewChapterCategories().get().map { it.toLong() }
 | 
			
		||||
    val excludedCategories = prefs.downloadNewChapterCategoriesExclude().get().map { it.toLong() }
 | 
			
		||||
 | 
			
		||||
    // Default: Download from all categories
 | 
			
		||||
    if (includedCategories.isEmpty() && excludedCategories.isEmpty()) return true
 | 
			
		||||
 | 
			
		||||
    // Get all categories, else default category (0)
 | 
			
		||||
    val categoriesForManga =
 | 
			
		||||
        db.getCategoriesForManga(id).executeAsBlocking()
 | 
			
		||||
            .mapNotNull { it.id }
 | 
			
		||||
            .takeUnless { it.isEmpty() } ?: listOf(0)
 | 
			
		||||
 | 
			
		||||
    // In excluded category
 | 
			
		||||
    if (categoriesForManga.any { it in excludedCategories }) return false
 | 
			
		||||
    if (categories.any { it in excludedCategories }) return false
 | 
			
		||||
 | 
			
		||||
    // Included category not selected
 | 
			
		||||
    if (includedCategories.isEmpty()) return true
 | 
			
		||||
 | 
			
		||||
    // In included category
 | 
			
		||||
    return categoriesForManga.any { it in includedCategories }
 | 
			
		||||
    return categories.any { it in includedCategories }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
suspend fun DomainManga.editCover(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user