Split library preferences from PreferencesHelper (#8036)

(cherry picked from commit c740558327f0f40f1b58d04ca5d5baed9285f048)

# Conflicts:
#	app/src/main/java/eu/kanade/domain/category/interactor/SetDisplayModeForCategory.kt
#	app/src/main/java/eu/kanade/domain/category/interactor/SetSortModeForCategory.kt
#	app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt
#	app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt
This commit is contained in:
Andreas 2022-09-20 05:55:07 +02:00 committed by Jobobby04
parent d73e7aee9d
commit b7363706d7
43 changed files with 322 additions and 272 deletions

View File

@ -3,7 +3,7 @@ package eu.kanade.domain.category.interactor
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.category.model.anyWithName import eu.kanade.domain.category.model.anyWithName
import eu.kanade.domain.category.repository.CategoryRepository import eu.kanade.domain.category.repository.CategoryRepository
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.tachiyomi.util.system.logcat import eu.kanade.tachiyomi.util.system.logcat
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -11,7 +11,7 @@ import logcat.LogPriority
class CreateCategoryWithName( class CreateCategoryWithName(
private val categoryRepository: CategoryRepository, private val categoryRepository: CategoryRepository,
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
) { ) {
private val initialFlags: Long private val initialFlags: Long

View File

@ -1,11 +1,11 @@
package eu.kanade.domain.category.interactor package eu.kanade.domain.category.interactor
import eu.kanade.domain.category.repository.CategoryRepository import eu.kanade.domain.category.repository.CategoryRepository
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.model.plus
import eu.kanade.tachiyomi.ui.library.setting.plus import eu.kanade.domain.library.service.LibraryPreferences
class ResetCategoryFlags( class ResetCategoryFlags(
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
private val categoryRepository: CategoryRepository, private val categoryRepository: CategoryRepository,
) { ) {

View File

@ -3,13 +3,13 @@ package eu.kanade.domain.category.interactor
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.category.model.CategoryUpdate import eu.kanade.domain.category.model.CategoryUpdate
import eu.kanade.domain.category.repository.CategoryRepository import eu.kanade.domain.category.repository.CategoryRepository
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.tachiyomi.ui.library.LibraryGroup import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode import eu.kanade.domain.library.model.plus
import eu.kanade.tachiyomi.ui.library.setting.plus import eu.kanade.domain.library.service.LibraryPreferences
class SetDisplayModeForCategory( class SetDisplayModeForCategory(
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
private val categoryRepository: CategoryRepository, private val categoryRepository: CategoryRepository,
) { ) {

View File

@ -3,13 +3,13 @@ package eu.kanade.domain.category.interactor
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.category.model.CategoryUpdate import eu.kanade.domain.category.model.CategoryUpdate
import eu.kanade.domain.category.repository.CategoryRepository import eu.kanade.domain.category.repository.CategoryRepository
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.tachiyomi.ui.library.LibraryGroup import eu.kanade.domain.library.model.LibrarySort
import eu.kanade.tachiyomi.ui.library.setting.LibrarySort import eu.kanade.domain.library.model.plus
import eu.kanade.tachiyomi.ui.library.setting.plus import eu.kanade.domain.library.service.LibraryPreferences
class SetSortModeForCategory( class SetSortModeForCategory(
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
private val categoryRepository: CategoryRepository, private val categoryRepository: CategoryRepository,
) { ) {

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.ui.library.setting package eu.kanade.domain.library.model
interface Flag { interface Flag {
val flag: Long val flag: Long

View File

@ -0,0 +1,7 @@
package eu.kanade.domain.library.model
enum class GroupLibraryMode {
GLOBAL,
ALL_BUT_UNGROUPED,
ALL,
}

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.ui.library.setting package eu.kanade.domain.library.model
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.ui.library package eu.kanade.domain.library.model
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.ui.library.setting package eu.kanade.domain.library.model
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category

View File

@ -0,0 +1,95 @@
package eu.kanade.domain.library.service
import eu.kanade.domain.library.model.GroupLibraryMode
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.domain.library.model.LibrarySort
import eu.kanade.tachiyomi.core.preference.PreferenceStore
import eu.kanade.tachiyomi.core.preference.getEnum
import eu.kanade.tachiyomi.data.preference.DEVICE_ONLY_ON_WIFI
import eu.kanade.tachiyomi.data.preference.MANGA_HAS_UNREAD
import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED
import eu.kanade.tachiyomi.data.preference.MANGA_NON_READ
import eu.kanade.tachiyomi.widget.ExtendedNavigationView
class LibraryPreferences(
private val preferenceStore: PreferenceStore,
) {
fun libraryDisplayMode() = this.preferenceStore.getObject("pref_display_mode_library", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize)
fun librarySortingMode() = this.preferenceStore.getObject("library_sorting_mode", LibrarySort.default, LibrarySort.Serializer::serialize, LibrarySort.Serializer::deserialize)
fun portraitColumns() = this.preferenceStore.getInt("pref_library_columns_portrait_key", 0)
fun landscapeColumns() = this.preferenceStore.getInt("pref_library_columns_landscape_key", 0)
fun libraryUpdateInterval() = this.preferenceStore.getInt("pref_library_update_interval_key", 24)
fun libraryUpdateLastTimestamp() = this.preferenceStore.getLong("library_update_last_timestamp", 0L)
fun libraryUpdateDeviceRestriction() = this.preferenceStore.getStringSet("library_update_restriction", setOf(DEVICE_ONLY_ON_WIFI))
fun libraryUpdateMangaRestriction() = this.preferenceStore.getStringSet("library_update_manga_restriction", setOf(MANGA_HAS_UNREAD, MANGA_NON_COMPLETED, MANGA_NON_READ))
// region Filter
fun filterDownloaded() = this.preferenceStore.getInt("pref_filter_library_downloaded", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterUnread() = this.preferenceStore.getInt("pref_filter_library_unread", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterStarted() = this.preferenceStore.getInt("pref_filter_library_started", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterCompleted() = this.preferenceStore.getInt("pref_filter_library_completed", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
// SY -->
fun filterLewd() = this.preferenceStore.getInt("pref_filter_library_lewd", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
// SY <--
fun filterTracking(name: Int) = this.preferenceStore.getInt("pref_filter_library_tracked_$name", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
// endregion
// region Badges
fun downloadBadge() = this.preferenceStore.getBoolean("display_download_badge", false)
fun localBadge() = this.preferenceStore.getBoolean("display_local_badge", true)
fun unreadBadge() = this.preferenceStore.getBoolean("display_unread_badge", true)
fun languageBadge() = this.preferenceStore.getBoolean("display_language_badge", false)
fun showUpdatesNavBadge() = this.preferenceStore.getBoolean("library_update_show_tab_badge", false)
fun unreadUpdatesCount() = this.preferenceStore.getInt("library_unread_updates_count", 0)
// endregion
// region Category
fun defaultCategory() = this.preferenceStore.getInt("default_category", -1)
fun lastUsedCategory() = this.preferenceStore.getInt("last_used_category", 0)
fun categoryTabs() = this.preferenceStore.getBoolean("display_category_tabs", true)
fun categoryNumberOfItems() = this.preferenceStore.getBoolean("display_number_of_items", false)
fun categorizedDisplaySettings() = this.preferenceStore.getBoolean("categorized_display", false)
fun libraryUpdateCategories() = this.preferenceStore.getStringSet("library_update_categories", emptySet())
fun libraryUpdateCategoriesExclude() = this.preferenceStore.getStringSet("library_update_categories_exclude", emptySet())
// endregion
// SY -->
fun sortTagsForLibrary() = this.preferenceStore.getStringSet("sort_tags_for_library", mutableSetOf())
fun groupLibraryUpdateType() = this.preferenceStore.getEnum("group_library_update_type", GroupLibraryMode.GLOBAL)
fun startReadingButton() = this.preferenceStore.getBoolean("start_reading_button", true)
fun groupLibraryBy() = this.preferenceStore.getInt("group_library_by", LibraryGroup.BY_DEFAULT)
// SY <--
}

View File

@ -1,10 +1,10 @@
package eu.kanade.domain.manga.interactor package eu.kanade.domain.manga.interactor
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.tachiyomi.util.preference.plusAssign import eu.kanade.tachiyomi.util.preference.plusAssign
class CreateSortTag( class CreateSortTag(
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
private val getSortTag: GetSortTag, private val getSortTag: GetSortTag,
) { ) {

View File

@ -1,10 +1,10 @@
package eu.kanade.domain.manga.interactor package eu.kanade.domain.manga.interactor
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.tachiyomi.util.preference.minusAssign import eu.kanade.tachiyomi.util.preference.minusAssign
class DeleteSortTag( class DeleteSortTag(
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
private val getSortTag: GetSortTag, private val getSortTag: GetSortTag,
) { ) {

View File

@ -1,10 +1,10 @@
package eu.kanade.domain.manga.interactor package eu.kanade.domain.manga.interactor
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.service.LibraryPreferences
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
class GetSortTag(private val preferences: PreferencesHelper) { class GetSortTag(private val preferences: LibraryPreferences) {
fun subscribe(): Flow<List<String>> { fun subscribe(): Flow<List<String>> {
return preferences.sortTagsForLibrary().changes() return preferences.sortTagsForLibrary().changes()
@ -14,7 +14,7 @@ class GetSortTag(private val preferences: PreferencesHelper) {
fun await() = getSortTags(preferences).let(::mapSortTags) fun await() = getSortTags(preferences).let(::mapSortTags)
companion object { companion object {
fun getSortTags(preferences: PreferencesHelper) = preferences.sortTagsForLibrary().get() fun getSortTags(preferences: LibraryPreferences) = preferences.sortTagsForLibrary().get()
fun mapSortTags(tags: Set<String>) = tags.mapNotNull { fun mapSortTags(tags: Set<String>) = tags.mapNotNull {
val index = it.indexOf('|') val index = it.indexOf('|')

View File

@ -1,9 +1,9 @@
package eu.kanade.domain.manga.interactor package eu.kanade.domain.manga.interactor
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.domain.library.service.LibraryPreferences
class ReorderSortTag( class ReorderSortTag(
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
private val getSortTag: GetSortTag, private val getSortTag: GetSortTag,
) { ) {

View File

@ -1,5 +1,6 @@
package eu.kanade.domain.source.service package eu.kanade.domain.source.service
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.domain.source.interactor.SetMigrateSorting
import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.core.preference.PreferenceStore
import eu.kanade.tachiyomi.core.preference.getEnum import eu.kanade.tachiyomi.core.preference.getEnum
@ -9,6 +10,8 @@ class SourcePreferences(
private val preferenceStore: PreferenceStore, private val preferenceStore: PreferenceStore,
) { ) {
fun sourceDisplayMode() = this.preferenceStore.getObject("pref_display_mode_catalogue", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize)
fun enabledLanguages() = this.preferenceStore.getStringSet("source_languages", LocaleHelper.getDefaultEnabledLanguages()) fun enabledLanguages() = this.preferenceStore.getStringSet("source_languages", LocaleHelper.getDefaultEnabledLanguages())
fun disabledSources() = this.preferenceStore.getStringSet("hidden_catalogues", emptySet()) fun disabledSources() = this.preferenceStore.getStringSet("hidden_catalogues", emptySet())

View File

@ -1,15 +1,15 @@
package eu.kanade.domain.updates.interactor package eu.kanade.domain.updates.interactor
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.updates.model.UpdatesWithRelations import eu.kanade.domain.updates.model.UpdatesWithRelations
import eu.kanade.domain.updates.repository.UpdatesRepository import eu.kanade.domain.updates.repository.UpdatesRepository
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import java.util.Calendar import java.util.Calendar
class GetUpdates( class GetUpdates(
private val repository: UpdatesRepository, private val repository: UpdatesRepository,
private val preferences: PreferencesHelper, private val preferences: LibraryPreferences,
) { ) {
fun subscribe(calendar: Calendar): Flow<List<UpdatesWithRelations>> = subscribe(calendar.time.time) fun subscribe(calendar: Calendar): Flow<List<UpdatesWithRelations>> = subscribe(calendar.time.time)

View File

@ -7,12 +7,12 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.model.Manga
import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar
import eu.kanade.presentation.components.Scaffold import eu.kanade.presentation.components.Scaffold
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourcePresenter import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourcePresenter
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
@Composable @Composable
fun BrowseMangadexFollowsScreen( fun BrowseMangadexFollowsScreen(

View File

@ -35,6 +35,7 @@ import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import eu.kanade.data.source.NoResultsException import eu.kanade.data.source.NoResultsException
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.source.interactor.GetRemoteManga import eu.kanade.domain.source.interactor.GetRemoteManga
import eu.kanade.presentation.browse.components.BrowseSourceComfortableGrid import eu.kanade.presentation.browse.components.BrowseSourceComfortableGrid
@ -50,7 +51,6 @@ import eu.kanade.presentation.components.Scaffold
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourcePresenter import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourcePresenter
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
import eu.kanade.tachiyomi.ui.more.MoreController import eu.kanade.tachiyomi.ui.more.MoreController
import eu.kanade.tachiyomi.widget.EmptyView import eu.kanade.tachiyomi.widget.EmptyView
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata

View File

@ -13,11 +13,11 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.AppBarActions
import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.DropdownMenu
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
@Composable @Composable
fun BrowseSourceSimpleToolbar( fun BrowseSourceSimpleToolbar(

View File

@ -20,6 +20,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.presentation.browse.BrowseSourceState import eu.kanade.presentation.browse.BrowseSourceState
import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.AppBarActions
@ -29,7 +30,6 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
import exh.source.anyIs import exh.source.anyIs
@Composable @Composable

View File

@ -6,8 +6,8 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.tachiyomi.data.database.models.LibraryManga import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.ui.library.LibraryGroup
import eu.kanade.tachiyomi.ui.library.LibraryPresenter import eu.kanade.tachiyomi.ui.library.LibraryPresenter
import exh.source.PERV_EDEN_EN_SOURCE_ID import exh.source.PERV_EDEN_EN_SOURCE_ID
import exh.source.PERV_EDEN_IT_SOURCE_ID import exh.source.PERV_EDEN_IT_SOURCE_ID

View File

@ -20,13 +20,13 @@ import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import eu.kanade.core.prefs.PreferenceMutableState import eu.kanade.core.prefs.PreferenceMutableState
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.presentation.components.EmptyScreen import eu.kanade.presentation.components.EmptyScreen
import eu.kanade.presentation.components.SwipeRefreshIndicator import eu.kanade.presentation.components.SwipeRefreshIndicator
import eu.kanade.presentation.library.LibraryState import eu.kanade.presentation.library.LibraryState
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.LibraryManga import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.ui.library.LibraryItem import eu.kanade.tachiyomi.ui.library.LibraryItem
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
import eu.kanade.tachiyomi.widget.EmptyView import eu.kanade.tachiyomi.widget.EmptyView
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@ -12,9 +12,9 @@ import androidx.compose.ui.platform.LocalConfiguration
import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.PagerState
import eu.kanade.core.prefs.PreferenceMutableState import eu.kanade.core.prefs.PreferenceMutableState
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.tachiyomi.data.database.models.LibraryManga import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.ui.library.LibraryItem import eu.kanade.tachiyomi.ui.library.LibraryItem
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
@Composable @Composable
fun LibraryPager( fun LibraryPager(

View File

@ -16,6 +16,7 @@ import eu.kanade.data.dateAdapter
import eu.kanade.data.listOfLongsAdapter import eu.kanade.data.listOfLongsAdapter
import eu.kanade.data.listOfStringsAdapter import eu.kanade.data.listOfStringsAdapter
import eu.kanade.data.listOfStringsAndAdapter import eu.kanade.data.listOfStringsAndAdapter
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore
import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.core.preference.PreferenceStore
@ -174,6 +175,9 @@ class PreferenceModule(val application: Application) : InjektModule {
addSingletonFactory { addSingletonFactory {
SecurityPreferences(get()) SecurityPreferences(get())
} }
addSingletonFactory {
LibraryPreferences(get())
}
addSingletonFactory { addSingletonFactory {
PreferencesHelper( PreferencesHelper(
context = application, context = application,

View File

@ -4,12 +4,12 @@ import android.content.Context
import android.os.Build import android.os.Build
import androidx.core.content.edit import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.core.security.SecurityPreferences
import eu.kanade.tachiyomi.data.backup.BackupCreatorJob import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED
import eu.kanade.tachiyomi.data.preference.PreferenceKeys
import eu.kanade.tachiyomi.data.preference.PreferenceValues import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
@ -43,6 +43,7 @@ object Migrations {
networkPreferences: NetworkPreferences, networkPreferences: NetworkPreferences,
sourcePreferences: SourcePreferences, sourcePreferences: SourcePreferences,
securityPreferences: SecurityPreferences, securityPreferences: SecurityPreferences,
libraryPreferences: LibraryPreferences,
): Boolean { ): Boolean {
val oldVersion = preferences.lastVersionCode().get() val oldVersion = preferences.lastVersionCode().get()
if (oldVersion < BuildConfig.VERSION_CODE) { if (oldVersion < BuildConfig.VERSION_CODE) {
@ -109,11 +110,11 @@ object Migrations {
} }
if (oldVersion < 44) { if (oldVersion < 44) {
// Reset sorting preference if using removed sort by source // Reset sorting preference if using removed sort by source
val oldSortingMode = prefs.getInt(PreferenceKeys.librarySortingMode, 0) val oldSortingMode = prefs.getInt(libraryPreferences.librarySortingMode().key(), 0)
if (oldSortingMode == 5) { // SOURCE = 5 if (oldSortingMode == 5) { // SOURCE = 5
prefs.edit { prefs.edit {
putInt(PreferenceKeys.librarySortingMode, 0) // ALPHABETICAL = 0 putInt(libraryPreferences.librarySortingMode().key(), 0) // ALPHABETICAL = 0
} }
} }
} }
@ -128,13 +129,13 @@ object Migrations {
} }
} }
prefs.edit { prefs.edit {
putInt(PreferenceKeys.filterDownloaded, convertBooleanPrefToTriState("pref_filter_downloaded_key")) putInt(libraryPreferences.filterDownloaded().key(), convertBooleanPrefToTriState("pref_filter_downloaded_key"))
remove("pref_filter_downloaded_key") remove("pref_filter_downloaded_key")
putInt(PreferenceKeys.filterUnread, convertBooleanPrefToTriState("pref_filter_unread_key")) putInt(libraryPreferences.filterUnread().key(), convertBooleanPrefToTriState("pref_filter_unread_key"))
remove("pref_filter_unread_key") remove("pref_filter_unread_key")
putInt(PreferenceKeys.filterCompleted, convertBooleanPrefToTriState("pref_filter_completed_key")) putInt(libraryPreferences.filterCompleted().key(), convertBooleanPrefToTriState("pref_filter_completed_key"))
remove("pref_filter_completed_key") remove("pref_filter_completed_key")
} }
} }
@ -199,14 +200,14 @@ object Migrations {
} }
if (oldVersion < 61) { if (oldVersion < 61) {
// Handle removed every 1 or 2 hour library updates // Handle removed every 1 or 2 hour library updates
val updateInterval = preferences.libraryUpdateInterval().get() val updateInterval = libraryPreferences.libraryUpdateInterval().get()
if (updateInterval == 1 || updateInterval == 2) { if (updateInterval == 1 || updateInterval == 2) {
preferences.libraryUpdateInterval().set(3) libraryPreferences.libraryUpdateInterval().set(3)
LibraryUpdateJob.setupTask(context, 3) LibraryUpdateJob.setupTask(context, 3)
} }
} }
if (oldVersion < 64) { if (oldVersion < 64) {
val oldSortingMode = prefs.getInt(PreferenceKeys.librarySortingMode, 0) val oldSortingMode = prefs.getInt(libraryPreferences.librarySortingMode().key(), 0)
val oldSortingDirection = prefs.getBoolean("library_sorting_ascending", true) val oldSortingDirection = prefs.getBoolean("library_sorting_ascending", true)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@ -228,12 +229,12 @@ object Migrations {
} }
prefs.edit(commit = true) { prefs.edit(commit = true) {
remove(PreferenceKeys.librarySortingMode) remove(libraryPreferences.librarySortingMode().key())
remove("library_sorting_ascending") remove("library_sorting_ascending")
} }
prefs.edit { prefs.edit {
putString(PreferenceKeys.librarySortingMode, newSortingMode) putString(libraryPreferences.librarySortingMode().key(), newSortingMode)
putString("library_sorting_ascending", newSortingDirection) putString("library_sorting_ascending", newSortingDirection)
} }
} }
@ -244,16 +245,16 @@ object Migrations {
} }
if (oldVersion < 71) { if (oldVersion < 71) {
// Handle removed every 3, 4, 6, and 8 hour library updates // Handle removed every 3, 4, 6, and 8 hour library updates
val updateInterval = preferences.libraryUpdateInterval().get() val updateInterval = libraryPreferences.libraryUpdateInterval().get()
if (updateInterval in listOf(3, 4, 6, 8)) { if (updateInterval in listOf(3, 4, 6, 8)) {
preferences.libraryUpdateInterval().set(12) libraryPreferences.libraryUpdateInterval().set(12)
LibraryUpdateJob.setupTask(context, 12) LibraryUpdateJob.setupTask(context, 12)
} }
} }
if (oldVersion < 72) { if (oldVersion < 72) {
val oldUpdateOngoingOnly = prefs.getBoolean("pref_update_only_non_completed_key", true) val oldUpdateOngoingOnly = prefs.getBoolean("pref_update_only_non_completed_key", true)
if (!oldUpdateOngoingOnly) { if (!oldUpdateOngoingOnly) {
preferences.libraryUpdateMangaRestriction() -= MANGA_NON_COMPLETED libraryPreferences.libraryUpdateMangaRestriction() -= MANGA_NON_COMPLETED
} }
} }
if (oldVersion < 75) { if (oldVersion < 75) {
@ -278,20 +279,20 @@ object Migrations {
if (oldVersion < 81) { if (oldVersion < 81) {
// Handle renamed enum values // Handle renamed enum values
prefs.edit { prefs.edit {
val newSortingMode = when (val oldSortingMode = prefs.getString(PreferenceKeys.librarySortingMode, "ALPHABETICAL")) { val newSortingMode = when (val oldSortingMode = prefs.getString(libraryPreferences.librarySortingMode().key(), "ALPHABETICAL")) {
"LAST_CHECKED" -> "LAST_MANGA_UPDATE" "LAST_CHECKED" -> "LAST_MANGA_UPDATE"
"UNREAD" -> "UNREAD_COUNT" "UNREAD" -> "UNREAD_COUNT"
"DATE_FETCHED" -> "CHAPTER_FETCH_DATE" "DATE_FETCHED" -> "CHAPTER_FETCH_DATE"
else -> oldSortingMode else -> oldSortingMode
} }
putString(PreferenceKeys.librarySortingMode, newSortingMode) putString(libraryPreferences.librarySortingMode().key(), newSortingMode)
} }
} }
if (oldVersion < 82) { if (oldVersion < 82) {
prefs.edit { prefs.edit {
val sort = prefs.getString(PreferenceKeys.librarySortingMode, null) ?: return@edit val sort = prefs.getString(libraryPreferences.librarySortingMode().key(), null) ?: return@edit
val direction = prefs.getString("library_sorting_ascending", "ASCENDING")!! val direction = prefs.getString("library_sorting_ascending", "ASCENDING")!!
putString(PreferenceKeys.librarySortingMode, "$sort,$direction") putString(libraryPreferences.librarySortingMode().key(), "$sort,$direction")
remove("library_sorting_ascending") remove("library_sorting_ascending")
} }
} }

View File

@ -12,6 +12,7 @@ import eu.kanade.data.manga.mangaMapper
import eu.kanade.domain.category.interactor.GetCategories import eu.kanade.domain.category.interactor.GetCategories
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.history.model.HistoryUpdate import eu.kanade.domain.history.model.HistoryUpdate
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetFavorites import eu.kanade.domain.manga.interactor.GetFavorites
import eu.kanade.domain.manga.interactor.GetFlatMetadataById import eu.kanade.domain.manga.interactor.GetFlatMetadataById
import eu.kanade.domain.manga.interactor.GetMergedManga import eu.kanade.domain.manga.interactor.GetMergedManga
@ -76,6 +77,7 @@ class BackupManager(
private val handler: DatabaseHandler = Injekt.get() private val handler: DatabaseHandler = Injekt.get()
private val sourceManager: SourceManager = Injekt.get() private val sourceManager: SourceManager = Injekt.get()
private val preferences: PreferencesHelper = Injekt.get() private val preferences: PreferencesHelper = Injekt.get()
private val libraryPreferences: LibraryPreferences = Injekt.get()
private val getCategories: GetCategories = Injekt.get() private val getCategories: GetCategories = Injekt.get()
private val getFavorites: GetFavorites = Injekt.get() private val getFavorites: GetFavorites = Injekt.get()
@ -329,7 +331,7 @@ class BackupManager(
category category
} }
preferences.categorizedDisplaySettings().set( libraryPreferences.categorizedDisplaySettings().set(
(dbCategories + categories) (dbCategories + categories)
.distinctBy { it.flags } .distinctBy { it.flags }
.size > 1, .size > 1,

View File

@ -8,11 +8,11 @@ import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import androidx.work.Worker import androidx.work.Worker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.tachiyomi.data.preference.DEVICE_BATTERY_NOT_LOW import eu.kanade.tachiyomi.data.preference.DEVICE_BATTERY_NOT_LOW
import eu.kanade.tachiyomi.data.preference.DEVICE_CHARGING import eu.kanade.tachiyomi.data.preference.DEVICE_CHARGING
import eu.kanade.tachiyomi.data.preference.DEVICE_NETWORK_NOT_METERED import eu.kanade.tachiyomi.data.preference.DEVICE_NETWORK_NOT_METERED
import eu.kanade.tachiyomi.data.preference.DEVICE_ONLY_ON_WIFI import eu.kanade.tachiyomi.data.preference.DEVICE_ONLY_ON_WIFI
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.util.system.isConnectedToWifi import eu.kanade.tachiyomi.util.system.isConnectedToWifi
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -22,7 +22,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
Worker(context, workerParams) { Worker(context, workerParams) {
override fun doWork(): Result { override fun doWork(): Result {
val preferences = Injekt.get<PreferencesHelper>() val preferences = Injekt.get<LibraryPreferences>()
val restrictions = preferences.libraryUpdateDeviceRestriction().get() val restrictions = preferences.libraryUpdateDeviceRestriction().get()
if ((DEVICE_ONLY_ON_WIFI in restrictions) && !context.isConnectedToWifi()) { if ((DEVICE_ONLY_ON_WIFI in restrictions) && !context.isConnectedToWifi()) {
return Result.failure() return Result.failure()
@ -39,7 +39,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
private const val TAG = "LibraryUpdate" private const val TAG = "LibraryUpdate"
fun setupTask(context: Context, prefInterval: Int? = null) { fun setupTask(context: Context, prefInterval: Int? = null) {
val preferences = Injekt.get<PreferencesHelper>() val preferences = Injekt.get<LibraryPreferences>()
val interval = prefInterval ?: preferences.libraryUpdateInterval().get() val interval = prefInterval ?: preferences.libraryUpdateInterval().get()
if (interval > 0) { if (interval > 0) {
val restrictions = preferences.libraryUpdateDeviceRestriction().get() val restrictions = preferences.libraryUpdateDeviceRestriction().get()

View File

@ -13,6 +13,9 @@ import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.chapter.model.toDbChapter
import eu.kanade.domain.library.model.GroupLibraryMode
import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetFavorites import eu.kanade.domain.manga.interactor.GetFavorites
import eu.kanade.domain.manga.interactor.GetLibraryManga import eu.kanade.domain.manga.interactor.GetLibraryManga
import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.interactor.GetManga
@ -40,7 +43,6 @@ import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.MANGA_HAS_UNREAD import eu.kanade.tachiyomi.data.preference.MANGA_HAS_UNREAD
import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED
import eu.kanade.tachiyomi.data.preference.MANGA_NON_READ import eu.kanade.tachiyomi.data.preference.MANGA_NON_READ
import eu.kanade.tachiyomi.data.preference.PreferenceValues.GroupLibraryMode
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.EnhancedTrackService import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
@ -50,7 +52,6 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.UnmeteredSource import eu.kanade.tachiyomi.source.UnmeteredSource
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.source.online.all.MergedSource
import eu.kanade.tachiyomi.ui.library.LibraryGroup
import eu.kanade.tachiyomi.ui.manga.track.TrackItem import eu.kanade.tachiyomi.ui.manga.track.TrackItem
import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.lang.withIOContext
import eu.kanade.tachiyomi.util.prepUpdateCover import eu.kanade.tachiyomi.util.prepUpdateCover
@ -104,6 +105,7 @@ import eu.kanade.domain.manga.model.Manga as DomainManga
class LibraryUpdateService( class LibraryUpdateService(
val sourceManager: SourceManager = Injekt.get(), val sourceManager: SourceManager = Injekt.get(),
val preferences: PreferencesHelper = Injekt.get(), val preferences: PreferencesHelper = Injekt.get(),
val libraryPreferences: LibraryPreferences = Injekt.get(),
val downloadManager: DownloadManager = Injekt.get(), val downloadManager: DownloadManager = Injekt.get(),
val trackManager: TrackManager = Injekt.get(), val trackManager: TrackManager = Injekt.get(),
val coverCache: CoverCache = Injekt.get(), val coverCache: CoverCache = Injekt.get(),
@ -268,7 +270,7 @@ class LibraryUpdateService(
// If this is a chapter update; set the last update time to now // If this is a chapter update; set the last update time to now
if (target == Target.CHAPTERS) { if (target == Target.CHAPTERS) {
preferences.libraryUpdateLastTimestamp().set(Date().time) libraryPreferences.libraryUpdateLastTimestamp().set(Date().time)
} }
// Update favorite manga // Update favorite manga
@ -307,7 +309,7 @@ class LibraryUpdateService(
fun addMangaToQueue(categoryId: Long, group: Int, groupExtra: String?) { fun addMangaToQueue(categoryId: Long, group: Int, groupExtra: String?) {
val libraryManga = runBlocking { getLibraryManga.await() } val libraryManga = runBlocking { getLibraryManga.await() }
// SY --> // SY -->
val groupLibraryUpdateType = preferences.groupLibraryUpdateType().get() val groupLibraryUpdateType = libraryPreferences.groupLibraryUpdateType().get()
// SY <-- // SY <--
val listToUpdate = if (categoryId != -1L) { val listToUpdate = if (categoryId != -1L) {
@ -318,14 +320,14 @@ class LibraryUpdateService(
groupLibraryUpdateType == GroupLibraryMode.GLOBAL || groupLibraryUpdateType == GroupLibraryMode.GLOBAL ||
(groupLibraryUpdateType == GroupLibraryMode.ALL_BUT_UNGROUPED && group == LibraryGroup.UNGROUPED) (groupLibraryUpdateType == GroupLibraryMode.ALL_BUT_UNGROUPED && group == LibraryGroup.UNGROUPED)
) { ) {
val categoriesToUpdate = preferences.libraryUpdateCategories().get().map(String::toInt) val categoriesToUpdate = libraryPreferences.libraryUpdateCategories().get().map(String::toInt)
val listToInclude = if (categoriesToUpdate.isNotEmpty()) { val listToInclude = if (categoriesToUpdate.isNotEmpty()) {
libraryManga.filter { it.category in categoriesToUpdate } libraryManga.filter { it.category in categoriesToUpdate }
} else { } else {
libraryManga libraryManga
} }
val categoriesToExclude = preferences.libraryUpdateCategoriesExclude().get().map(String::toInt) val categoriesToExclude = libraryPreferences.libraryUpdateCategoriesExclude().get().map(String::toInt)
val listToExclude = if (categoriesToExclude.isNotEmpty()) { val listToExclude = if (categoriesToExclude.isNotEmpty()) {
libraryManga.filter { it.category in categoriesToExclude }.toSet() libraryManga.filter { it.category in categoriesToExclude }.toSet()
} else { } else {
@ -398,8 +400,8 @@ class LibraryUpdateService(
val failedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>() val failedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>()
val hasDownloads = AtomicBoolean(false) val hasDownloads = AtomicBoolean(false)
val loggedServices by lazy { trackManager.services.filter { it.isLogged } } val loggedServices by lazy { trackManager.services.filter { it.isLogged } }
val currentUnreadUpdatesCount = preferences.unreadUpdatesCount().get() val currentUnreadUpdatesCount = libraryPreferences.unreadUpdatesCount().get()
val restrictions = preferences.libraryUpdateMangaRestriction().get() val restrictions = libraryPreferences.libraryUpdateMangaRestriction().get()
withIOContext { withIOContext {
mangaToUpdate.groupBy { it.source } mangaToUpdate.groupBy { it.source }
@ -483,7 +485,7 @@ class LibraryUpdateService(
if (newUpdates.isNotEmpty()) { if (newUpdates.isNotEmpty()) {
notifier.showUpdateNotifications(newUpdates) notifier.showUpdateNotifications(newUpdates)
val newChapterCount = newUpdates.sumOf { it.second.size } val newChapterCount = newUpdates.sumOf { it.second.size }
preferences.unreadUpdatesCount().set(currentUnreadUpdatesCount + newChapterCount) libraryPreferences.unreadUpdatesCount().set(currentUnreadUpdatesCount + newChapterCount)
if (hasDownloads.get()) { if (hasDownloads.get()) {
DownloadService.start(this) DownloadService.start(this)
} }

View File

@ -25,28 +25,12 @@ object PreferenceKeys {
const val removeBookmarkedChapters = "pref_remove_bookmarked" const val removeBookmarkedChapters = "pref_remove_bookmarked"
const val filterDownloaded = "pref_filter_library_downloaded"
const val filterUnread = "pref_filter_library_unread"
const val filterStarted = "pref_filter_library_started"
const val filterCompleted = "pref_filter_library_completed"
const val filterTracked = "pref_filter_library_tracked"
const val filterLewd = "pref_filter_library_lewd"
const val librarySortingMode = "library_sorting_mode"
const val autoUpdateMetadata = "auto_update_metadata" const val autoUpdateMetadata = "auto_update_metadata"
const val autoUpdateTrackers = "auto_update_trackers" const val autoUpdateTrackers = "auto_update_trackers"
const val dateFormat = "app_date_format" const val dateFormat = "app_date_format"
const val defaultCategory = "default_category"
const val skipRead = "skip_read" const val skipRead = "skip_read"
const val skipFiltered = "skip_filtered" const val skipFiltered = "skip_filtered"

View File

@ -78,12 +78,4 @@ object PreferenceValues {
PACKAGEINSTALLER(R.string.ext_installer_packageinstaller), PACKAGEINSTALLER(R.string.ext_installer_packageinstaller),
SHIZUKU(R.string.ext_installer_shizuku), SHIZUKU(R.string.ext_installer_shizuku),
} }
// SY -->
enum class GroupLibraryMode {
GLOBAL,
ALL_BUT_UNGROUPED,
ALL,
}
// SY <--
} }

View File

@ -10,16 +10,12 @@ import eu.kanade.tachiyomi.core.preference.getEnum
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.anilist.Anilist import eu.kanade.tachiyomi.data.track.anilist.Anilist
import eu.kanade.tachiyomi.ui.library.LibraryGroup
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
import eu.kanade.tachiyomi.ui.library.setting.LibrarySort
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig
import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable
import eu.kanade.tachiyomi.widget.ExtendedNavigationView
import java.io.File import java.io.File
import java.text.DateFormat import java.text.DateFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -153,18 +149,10 @@ class PreferencesHelper(
fun readerHideThreshold() = this.preferenceStore.getEnum("reader_hide_threshold", Values.ReaderHideThreshold.LOW) fun readerHideThreshold() = this.preferenceStore.getEnum("reader_hide_threshold", Values.ReaderHideThreshold.LOW)
fun portraitColumns() = this.preferenceStore.getInt("pref_library_columns_portrait_key", 0)
fun landscapeColumns() = this.preferenceStore.getInt("pref_library_columns_landscape_key", 0)
fun autoUpdateTrack() = this.preferenceStore.getBoolean(Keys.autoUpdateTrack, true) fun autoUpdateTrack() = this.preferenceStore.getBoolean(Keys.autoUpdateTrack, true)
fun lastUsedCategory() = this.preferenceStore.getInt("last_used_category", 0)
fun lastVersionCode() = this.preferenceStore.getInt("last_version_code", 0) fun lastVersionCode() = this.preferenceStore.getInt("last_version_code", 0)
fun sourceDisplayMode() = this.preferenceStore.getObject("pref_display_mode_catalogue", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize)
fun trackUsername(sync: TrackService) = this.preferenceStore.getString(Keys.trackUsername(sync.id), "") fun trackUsername(sync: TrackService) = this.preferenceStore.getString(Keys.trackUsername(sync.id), "")
fun trackPassword(sync: TrackService) = this.preferenceStore.getString(Keys.trackPassword(sync.id), "") fun trackPassword(sync: TrackService) = this.preferenceStore.getString(Keys.trackPassword(sync.id), "")
@ -209,50 +197,8 @@ class PreferencesHelper(
fun removeExcludeCategories() = this.preferenceStore.getStringSet("remove_exclude_categories", emptySet()) fun removeExcludeCategories() = this.preferenceStore.getStringSet("remove_exclude_categories", emptySet())
fun libraryUpdateInterval() = this.preferenceStore.getInt("pref_library_update_interval_key", 24)
fun libraryUpdateLastTimestamp() = this.preferenceStore.getLong("library_update_last_timestamp", 0L)
fun libraryUpdateDeviceRestriction() = this.preferenceStore.getStringSet("library_update_restriction", setOf(DEVICE_ONLY_ON_WIFI))
fun libraryUpdateMangaRestriction() = this.preferenceStore.getStringSet("library_update_manga_restriction", setOf(MANGA_HAS_UNREAD, MANGA_NON_COMPLETED, MANGA_NON_READ))
fun showUpdatesNavBadge() = this.preferenceStore.getBoolean("library_update_show_tab_badge", false)
fun unreadUpdatesCount() = this.preferenceStore.getInt("library_unread_updates_count", 0)
fun libraryUpdateCategories() = this.preferenceStore.getStringSet("library_update_categories", emptySet())
fun libraryUpdateCategoriesExclude() = this.preferenceStore.getStringSet("library_update_categories_exclude", emptySet())
fun libraryDisplayMode() = this.preferenceStore.getObject("pref_display_mode_library", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize)
fun downloadBadge() = this.preferenceStore.getBoolean("display_download_badge", false)
fun localBadge() = this.preferenceStore.getBoolean("display_local_badge", true)
fun downloadedOnly() = this.preferenceStore.getBoolean("pref_downloaded_only", false) fun downloadedOnly() = this.preferenceStore.getBoolean("pref_downloaded_only", false)
fun unreadBadge() = this.preferenceStore.getBoolean("display_unread_badge", true)
fun languageBadge() = this.preferenceStore.getBoolean("display_language_badge", false)
fun categoryTabs() = this.preferenceStore.getBoolean("display_category_tabs", true)
fun categoryNumberOfItems() = this.preferenceStore.getBoolean("display_number_of_items", false)
fun filterDownloaded() = this.preferenceStore.getInt(Keys.filterDownloaded, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterUnread() = this.preferenceStore.getInt(Keys.filterUnread, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterStarted() = this.preferenceStore.getInt(Keys.filterStarted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterCompleted() = this.preferenceStore.getInt(Keys.filterCompleted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterTracking(name: Long) = this.preferenceStore.getInt("${Keys.filterTracked}_$name", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterLewd() = this.preferenceStore.getInt(Keys.filterLewd, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun filterTracking(name: Int) = this.preferenceStore.getInt("${Keys.filterTracked}_$name", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
fun librarySortingMode() = this.preferenceStore.getObject(Keys.librarySortingMode, LibrarySort.default, LibrarySort.Serializer::serialize, LibrarySort.Serializer::deserialize)
fun automaticExtUpdates() = this.preferenceStore.getBoolean("automatic_ext_updates", true) fun automaticExtUpdates() = this.preferenceStore.getBoolean("automatic_ext_updates", true)
fun lastAppCheck() = this.preferenceStore.getLong("last_app_check", 0) fun lastAppCheck() = this.preferenceStore.getLong("last_app_check", 0)
@ -265,10 +211,6 @@ class PreferencesHelper(
fun autoDownloadWhileReading() = this.preferenceStore.getInt("auto_download_while_reading", 0) fun autoDownloadWhileReading() = this.preferenceStore.getInt("auto_download_while_reading", 0)
fun defaultCategory() = this.preferenceStore.getInt(Keys.defaultCategory, -1)
fun categorizedDisplaySettings() = this.preferenceStore.getBoolean("categorized_display", false)
fun skipRead() = this.preferenceStore.getBoolean(Keys.skipRead, false) fun skipRead() = this.preferenceStore.getBoolean(Keys.skipRead, false)
fun skipFiltered() = this.preferenceStore.getBoolean(Keys.skipFiltered, true) fun skipFiltered() = this.preferenceStore.getBoolean(Keys.skipFiltered, true)
@ -409,14 +351,8 @@ class PreferencesHelper(
fun webtoonEnableZoomOut() = this.preferenceStore.getBoolean("webtoon_enable_zoom_out", false) fun webtoonEnableZoomOut() = this.preferenceStore.getBoolean("webtoon_enable_zoom_out", false)
fun startReadingButton() = this.preferenceStore.getBoolean("start_reading_button", true)
fun groupLibraryBy() = this.preferenceStore.getInt("group_library_by", LibraryGroup.BY_DEFAULT)
fun continuousVerticalTappingByPage() = this.preferenceStore.getBoolean("continuous_vertical_tapping_by_page", false) fun continuousVerticalTappingByPage() = this.preferenceStore.getBoolean("continuous_vertical_tapping_by_page", false)
fun groupLibraryUpdateType() = this.preferenceStore.getEnum("group_library_update_type", Values.GroupLibraryMode.GLOBAL)
fun useNewSourceNavigation() = this.preferenceStore.getBoolean("use_new_source_navigation", true) fun useNewSourceNavigation() = this.preferenceStore.getBoolean("use_new_source_navigation", true)
fun preferredMangaDexId() = this.preferenceStore.getString("preferred_mangaDex_id", "0") fun preferredMangaDexId() = this.preferenceStore.getString("preferred_mangaDex_id", "0")
@ -425,8 +361,6 @@ class PreferencesHelper(
fun allowLocalSourceHiddenFolders() = this.preferenceStore.getBoolean("allow_local_source_hidden_folders", false) fun allowLocalSourceHiddenFolders() = this.preferenceStore.getBoolean("allow_local_source_hidden_folders", false)
fun sortTagsForLibrary() = this.preferenceStore.getStringSet("sort_tags_for_library", mutableSetOf())
fun extensionRepos() = this.preferenceStore.getStringSet("extension_repos", emptySet()) fun extensionRepos() = this.preferenceStore.getStringSet("extension_repos", emptySet())
fun cropBordersContinuousVertical() = this.preferenceStore.getBoolean("crop_borders_continues_vertical", false) fun cropBordersContinuousVertical() = this.preferenceStore.getBoolean("crop_borders_continues_vertical", false)

View File

@ -23,6 +23,7 @@ import eu.kanade.domain.category.interactor.GetCategories
import eu.kanade.domain.category.interactor.SetMangaCategories import eu.kanade.domain.category.interactor.SetMangaCategories
import eu.kanade.domain.chapter.interactor.GetChapterByMangaId import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga
import eu.kanade.domain.manga.interactor.GetFlatMetadataById import eu.kanade.domain.manga.interactor.GetFlatMetadataById
import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.interactor.GetManga
@ -35,6 +36,7 @@ import eu.kanade.domain.source.interactor.GetExhSavedSearch
import eu.kanade.domain.source.interactor.GetRemoteManga import eu.kanade.domain.source.interactor.GetRemoteManga
import eu.kanade.domain.source.interactor.InsertSavedSearch import eu.kanade.domain.source.interactor.InsertSavedSearch
import eu.kanade.domain.source.model.SourcePagingSourceType import eu.kanade.domain.source.model.SourcePagingSourceType
import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.domain.track.interactor.InsertTrack import eu.kanade.domain.track.interactor.InsertTrack
import eu.kanade.domain.track.model.toDomainTrack import eu.kanade.domain.track.model.toDomainTrack
import eu.kanade.presentation.browse.BrowseSourceState import eu.kanade.presentation.browse.BrowseSourceState
@ -111,6 +113,8 @@ open class BrowseSourcePresenter(
private val state: BrowseSourceStateImpl = BrowseSourceState(searchQuery) as BrowseSourceStateImpl, private val state: BrowseSourceStateImpl = BrowseSourceState(searchQuery) as BrowseSourceStateImpl,
private val sourceManager: SourceManager = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(),
private val preferences: PreferencesHelper = Injekt.get(), private val preferences: PreferencesHelper = Injekt.get(),
private val sourcePreferences: SourcePreferences = Injekt.get(),
private val libraryPreferences: LibraryPreferences = Injekt.get(),
private val coverCache: CoverCache = Injekt.get(), private val coverCache: CoverCache = Injekt.get(),
private val getRemoteManga: GetRemoteManga = Injekt.get(), private val getRemoteManga: GetRemoteManga = Injekt.get(),
private val getManga: GetManga = Injekt.get(), private val getManga: GetManga = Injekt.get(),
@ -133,7 +137,7 @@ open class BrowseSourcePresenter(
private val loggedServices by lazy { Injekt.get<TrackManager>().services.filter { it.isLogged } } private val loggedServices by lazy { Injekt.get<TrackManager>().services.filter { it.isLogged } }
var displayMode by preferences.sourceDisplayMode().asState() var displayMode by sourcePreferences.sourceDisplayMode().asState()
val isDownloadOnly: Boolean by preferences.downloadedOnly().asState() val isDownloadOnly: Boolean by preferences.downloadedOnly().asState()
val isIncognitoMode: Boolean by preferences.incognitoMode().asState() val isIncognitoMode: Boolean by preferences.incognitoMode().asState()
@ -146,7 +150,7 @@ open class BrowseSourcePresenter(
fun getColumnsPreferenceForCurrentOrientation(): State<GridCells> { fun getColumnsPreferenceForCurrentOrientation(): State<GridCells> {
val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE
return produceState<GridCells>(initialValue = GridCells.Adaptive(128.dp), isLandscape) { return produceState<GridCells>(initialValue = GridCells.Adaptive(128.dp), isLandscape) {
(if (isLandscape) preferences.landscapeColumns() else preferences.portraitColumns()) (if (isLandscape) libraryPreferences.landscapeColumns() else libraryPreferences.portraitColumns())
.changes() .changes()
.collectLatest { columns -> .collectLatest { columns ->
value = if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns) value = if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns)
@ -342,7 +346,7 @@ open class BrowseSourcePresenter(
fun addFavorite(manga: DomainManga) { fun addFavorite(manga: DomainManga) {
presenterScope.launch { presenterScope.launch {
val categories = getCategories() val categories = getCategories()
val defaultCategoryId = preferences.defaultCategory().get() val defaultCategoryId = libraryPreferences.defaultCategory().get()
val defaultCategory = categories.find { it.id == defaultCategoryId.toLong() } val defaultCategory = categories.find { it.id == defaultCategoryId.toLong() }
when { when {

View File

@ -12,6 +12,7 @@ import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.core.prefs.CheckboxState import eu.kanade.core.prefs.CheckboxState
import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.manga.model.isLocal import eu.kanade.domain.manga.model.isLocal
import eu.kanade.domain.manga.model.toDbManga import eu.kanade.domain.manga.model.toDbManga

View File

@ -26,6 +26,12 @@ import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId
import eu.kanade.domain.chapter.interactor.SetReadStatus import eu.kanade.domain.chapter.interactor.SetReadStatus
import eu.kanade.domain.chapter.model.Chapter import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.chapter.model.toDbChapter
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.domain.library.model.LibrarySort
import eu.kanade.domain.library.model.display
import eu.kanade.domain.library.model.sort
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetIdsOfFavoriteMangaWithMetadata import eu.kanade.domain.manga.interactor.GetIdsOfFavoriteMangaWithMetadata
import eu.kanade.domain.manga.interactor.GetLibraryManga import eu.kanade.domain.manga.interactor.GetLibraryManga
import eu.kanade.domain.manga.interactor.GetMergedMangaById import eu.kanade.domain.manga.interactor.GetMergedMangaById
@ -58,10 +64,6 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.source.online.all.MergedSource
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
import eu.kanade.tachiyomi.ui.library.setting.LibrarySort
import eu.kanade.tachiyomi.ui.library.setting.display
import eu.kanade.tachiyomi.ui.library.setting.sort
import eu.kanade.tachiyomi.util.lang.combineLatest import eu.kanade.tachiyomi.util.lang.combineLatest
import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellableIO import eu.kanade.tachiyomi.util.lang.launchNonCancellableIO
@ -130,6 +132,7 @@ class LibraryPresenter(
private val updateManga: UpdateManga = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(),
private val setMangaCategories: SetMangaCategories = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(),
private val preferences: PreferencesHelper = Injekt.get(), private val preferences: PreferencesHelper = Injekt.get(),
private val libraryPreferences: LibraryPreferences = Injekt.get(),
private val coverCache: CoverCache = Injekt.get(), private val coverCache: CoverCache = Injekt.get(),
private val sourceManager: SourceManager = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(),
private val downloadManager: DownloadManager = Injekt.get(), private val downloadManager: DownloadManager = Injekt.get(),
@ -150,10 +153,10 @@ class LibraryPresenter(
val isLibraryEmpty by derivedStateOf { loadedManga.isEmpty() } val isLibraryEmpty by derivedStateOf { loadedManga.isEmpty() }
val tabVisibility by preferences.categoryTabs().asState() val tabVisibility by libraryPreferences.categoryTabs().asState()
val mangaCountVisibility by preferences.categoryNumberOfItems().asState() val mangaCountVisibility by libraryPreferences.categoryNumberOfItems().asState()
var activeCategory: Int by preferences.lastUsedCategory().asState() var activeCategory: Int by libraryPreferences.lastUsedCategory().asState()
val isDownloadOnly: Boolean by preferences.downloadedOnly().asState() val isDownloadOnly: Boolean by preferences.downloadedOnly().asState()
val isIncognitoMode: Boolean by preferences.incognitoMode().asState() val isIncognitoMode: Boolean by preferences.incognitoMode().asState()
@ -248,7 +251,7 @@ class LibraryPresenter(
.asFlow() .asFlow()
.collectLatest { .collectLatest {
// SY --> // SY -->
state.groupType = preferences.groupLibraryBy().get() state.groupType = libraryPreferences.groupLibraryBy().get()
state.categories = it.categories state.categories = it.categories
// SY <-- // SY <--
state.isLoading = false state.isLoading = false
@ -265,17 +268,17 @@ class LibraryPresenter(
*/ */
private fun applyFilters(map: LibraryMap, trackMap: Map<Long, Map<Long, Boolean>>): LibraryMap { private fun applyFilters(map: LibraryMap, trackMap: Map<Long, Map<Long, Boolean>>): LibraryMap {
val downloadedOnly = preferences.downloadedOnly().get() val downloadedOnly = preferences.downloadedOnly().get()
val filterDownloaded = preferences.filterDownloaded().get() val filterDownloaded = libraryPreferences.filterDownloaded().get()
val filterUnread = preferences.filterUnread().get() val filterUnread = libraryPreferences.filterUnread().get()
val filterStarted = preferences.filterStarted().get() val filterStarted = libraryPreferences.filterStarted().get()
val filterCompleted = preferences.filterCompleted().get() val filterCompleted = libraryPreferences.filterCompleted().get()
val loggedInServices = trackManager.services.filter { trackService -> trackService.isLogged } val loggedInServices = trackManager.services.filter { trackService -> trackService.isLogged }
.associate { trackService -> .associate { trackService ->
Pair(trackService.id, preferences.filterTracking(trackService.id).get()) Pair(trackService.id, libraryPreferences.filterTracking(trackService.id.toInt()).get())
} }
val isNotAnyLoggedIn = !loggedInServices.values.any() val isNotAnyLoggedIn = !loggedInServices.values.any()
// SY --> // SY -->
val filterLewd = preferences.filterLewd().get() val filterLewd = libraryPreferences.filterLewd().get()
// SY <-- // SY <--
val filterFnDownloaded: (LibraryItem) -> Boolean = downloaded@{ item -> val filterFnDownloaded: (LibraryItem) -> Boolean = downloaded@{ item ->
@ -386,7 +389,7 @@ class LibraryPresenter(
* @param map the map of manga. * @param map the map of manga.
*/ */
private fun setButtons(map: LibraryMap) { private fun setButtons(map: LibraryMap) {
val startReadingButton = preferences.startReadingButton().get() val startReadingButton = libraryPreferences.startReadingButton().get()
for ((_, itemList) in map) { for ((_, itemList) in map) {
for (item in itemList) { for (item in itemList) {
@ -402,10 +405,10 @@ class LibraryPresenter(
* @param map the map of manga. * @param map the map of manga.
*/ */
private fun setBadges(map: LibraryMap) { private fun setBadges(map: LibraryMap) {
val showDownloadBadges = preferences.downloadBadge().get() val showDownloadBadges = libraryPreferences.downloadBadge().get()
val showUnreadBadges = preferences.unreadBadge().get() val showUnreadBadges = libraryPreferences.unreadBadge().get()
val showLocalBadges = preferences.localBadge().get() val showLocalBadges = libraryPreferences.localBadge().get()
val showLanguageBadges = preferences.languageBadge().get() val showLanguageBadges = libraryPreferences.languageBadge().get()
for ((_, itemList) in map) { for ((_, itemList) in map) {
for (item in itemList) { for (item in itemList) {
@ -485,7 +488,7 @@ class LibraryPresenter(
// SY --> // SY -->
val listOfTags by lazy { val listOfTags by lazy {
preferences.sortTagsForLibrary().get() libraryPreferences.sortTagsForLibrary().get()
.asSequence() .asSequence()
.mapNotNull { .mapNotNull {
val list = it.split("|") val list = it.split("|")
@ -498,8 +501,8 @@ class LibraryPresenter(
// SY <-- // SY <--
// SY --> // SY -->
val groupType = preferences.groupLibraryBy().get() val groupType = libraryPreferences.groupLibraryBy().get()
val groupSort = preferences.librarySortingMode().get() val groupSort = libraryPreferences.librarySortingMode().get()
// SY <-- // SY <--
val sortModes = categories.associate { category -> val sortModes = categories.associate { category ->
// SY --> // SY -->
@ -614,7 +617,7 @@ class LibraryPresenter(
// SY --> // SY -->
private fun applyGrouping(map: LibraryMap, categories: List<Category>): Pair<LibraryMap, List<Category>> { private fun applyGrouping(map: LibraryMap, categories: List<Category>): Pair<LibraryMap, List<Category>> {
val groupType = preferences.groupLibraryBy().get() val groupType = libraryPreferences.groupLibraryBy().get()
var editedCategories = categories var editedCategories = categories
val items = when (groupType) { val items = when (groupType) {
LibraryGroup.BY_DEFAULT -> map LibraryGroup.BY_DEFAULT -> map
@ -899,7 +902,7 @@ class LibraryPresenter(
} }
fun getColumnsPreferenceForCurrentOrientation(isLandscape: Boolean): PreferenceMutableState<Int> { fun getColumnsPreferenceForCurrentOrientation(isLandscape: Boolean): PreferenceMutableState<Int> {
return (if (isLandscape) preferences.landscapeColumns() else preferences.portraitColumns()).asState() return (if (isLandscape) libraryPreferences.landscapeColumns() else libraryPreferences.portraitColumns()).asState()
} }
// TODO: This is good but should we separate title from count or get categories with count from db // TODO: This is good but should we separate title from count or get categories with count from db
@ -1114,7 +1117,7 @@ class LibraryPresenter(
} }
} }
private val libraryDisplayMode by preferences.libraryDisplayMode().asState() private val libraryDisplayMode by libraryPreferences.libraryDisplayMode().asState()
// SY <-- // SY <--
@Composable @Composable

View File

@ -8,14 +8,16 @@ import eu.kanade.domain.category.interactor.GetCategories
import eu.kanade.domain.category.interactor.SetDisplayModeForCategory import eu.kanade.domain.category.interactor.SetDisplayModeForCategory
import eu.kanade.domain.category.interactor.SetSortModeForCategory import eu.kanade.domain.category.interactor.SetSortModeForCategory
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.domain.library.model.LibrarySort
import eu.kanade.domain.library.model.display
import eu.kanade.domain.library.model.sort
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode
import eu.kanade.tachiyomi.ui.library.setting.LibrarySort
import eu.kanade.tachiyomi.ui.library.setting.display
import eu.kanade.tachiyomi.ui.library.setting.sort
import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.widget.ExtendedNavigationView import eu.kanade.tachiyomi.widget.ExtendedNavigationView
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
@ -141,18 +143,18 @@ class LibrarySettingsSheet(
downloaded.state = State.INCLUDE.value downloaded.state = State.INCLUDE.value
downloaded.enabled = false downloaded.enabled = false
} else { } else {
downloaded.state = preferences.filterDownloaded().get() downloaded.state = libraryPreferences.filterDownloaded().get()
} }
unread.state = preferences.filterUnread().get() unread.state = libraryPreferences.filterUnread().get()
started.state = preferences.filterStarted().get() started.state = libraryPreferences.filterStarted().get()
completed.state = preferences.filterCompleted().get() completed.state = libraryPreferences.filterCompleted().get()
trackFilters.forEach { trackFilter -> trackFilters.forEach { trackFilter ->
trackFilter.value.state = preferences.filterTracking(trackFilter.key).get() trackFilter.value.state = libraryPreferences.filterTracking(trackFilter.key.toInt()).get()
} }
// SY --> // SY -->
lewd.state = preferences.filterLewd().get() lewd.state = libraryPreferences.filterLewd().get()
// SY <-- // SY <--
} }
@ -166,17 +168,17 @@ class LibrarySettingsSheet(
} }
item.state = newState item.state = newState
when (item) { when (item) {
downloaded -> preferences.filterDownloaded().set(newState) downloaded -> libraryPreferences.filterDownloaded().set(newState)
unread -> preferences.filterUnread().set(newState) unread -> libraryPreferences.filterUnread().set(newState)
started -> preferences.filterStarted().set(newState) started -> libraryPreferences.filterStarted().set(newState)
completed -> preferences.filterCompleted().set(newState) completed -> libraryPreferences.filterCompleted().set(newState)
// SY --> // SY -->
lewd -> preferences.filterLewd().set(newState) lewd -> libraryPreferences.filterLewd().set(newState)
// SY <-- // SY <--
else -> { else -> {
trackFilters.forEach { trackFilter -> trackFilters.forEach { trackFilter ->
if (trackFilter.value == item) { if (trackFilter.value == item) {
preferences.filterTracking(trackFilter.key).set(newState) libraryPreferences.filterTracking(trackFilter.key.toInt()).set(newState)
} }
} }
} }
@ -223,15 +225,15 @@ class LibrarySettingsSheet(
override val header = null override val header = null
override val items = override val items =
listOf(alphabetically, lastRead, lastChecked, unread, total, latestChapter, chapterFetchDate, dateAdded /* SY --> */) + if (preferences.sortTagsForLibrary().get().isNotEmpty()) listOf(tagList) else emptyList() // SY <-- listOf(alphabetically, lastRead, lastChecked, unread, total, latestChapter, chapterFetchDate, dateAdded /* SY --> */) + if (libraryPreferences.sortTagsForLibrary().get().isNotEmpty()) listOf(tagList) else emptyList() // SY <--
override val footer = null override val footer = null
override fun initModels() { override fun initModels() {
// SY --> // SY -->
val sort = if (preferences.groupLibraryBy().get() == LibraryGroup.BY_DEFAULT) { val sort = if (libraryPreferences.groupLibraryBy().get() == LibraryGroup.BY_DEFAULT) {
currentCategory?.sort ?: LibrarySort.default currentCategory?.sort ?: LibrarySort.default
} else { } else {
preferences.librarySortingMode().get() libraryPreferences.librarySortingMode().get()
} }
// SY <-- // SY <--
val order = if (sort.isAscending) Item.MultiSort.SORT_ASC else Item.MultiSort.SORT_DESC val order = if (sort.isAscending) Item.MultiSort.SORT_ASC else Item.MultiSort.SORT_DESC
@ -349,10 +351,10 @@ class LibrarySettingsSheet(
// Gets user preference of currently selected display mode at current category // Gets user preference of currently selected display mode at current category
private fun getDisplayModePreference(): LibraryDisplayMode { private fun getDisplayModePreference(): LibraryDisplayMode {
// SY --> // SY -->
return if (preferences.groupLibraryBy().get() == LibraryGroup.BY_DEFAULT) { return if (libraryPreferences.groupLibraryBy().get() == LibraryGroup.BY_DEFAULT) {
currentCategory?.display ?: LibraryDisplayMode.default currentCategory?.display ?: LibraryDisplayMode.default
} else { } else {
preferences.libraryDisplayMode().get() libraryPreferences.libraryDisplayMode().get()
} }
// SY <-- // SY <--
} }
@ -419,20 +421,20 @@ class LibrarySettingsSheet(
override val footer = null override val footer = null
override fun initModels() { override fun initModels() {
downloadBadge.checked = preferences.downloadBadge().get() downloadBadge.checked = libraryPreferences.downloadBadge().get()
unreadBadge.checked = preferences.unreadBadge().get() unreadBadge.checked = libraryPreferences.unreadBadge().get()
localBadge.checked = preferences.localBadge().get() localBadge.checked = libraryPreferences.localBadge().get()
languageBadge.checked = preferences.languageBadge().get() languageBadge.checked = libraryPreferences.languageBadge().get()
} }
override fun onItemClicked(item: Item) { override fun onItemClicked(item: Item) {
item as Item.CheckboxGroup item as Item.CheckboxGroup
item.checked = !item.checked item.checked = !item.checked
when (item) { when (item) {
downloadBadge -> preferences.downloadBadge().set((item.checked)) downloadBadge -> libraryPreferences.downloadBadge().set((item.checked))
unreadBadge -> preferences.unreadBadge().set((item.checked)) unreadBadge -> libraryPreferences.unreadBadge().set((item.checked))
localBadge -> preferences.localBadge().set((item.checked)) localBadge -> libraryPreferences.localBadge().set((item.checked))
languageBadge -> preferences.languageBadge().set((item.checked)) languageBadge -> libraryPreferences.languageBadge().set((item.checked))
else -> {} else -> {}
} }
adapter.notifyItemChanged(item) adapter.notifyItemChanged(item)
@ -448,14 +450,14 @@ class LibrarySettingsSheet(
override val footer = null override val footer = null
override fun initModels() { override fun initModels() {
startReadingButton.checked = preferences.startReadingButton().get() startReadingButton.checked = libraryPreferences.startReadingButton().get()
} }
override fun onItemClicked(item: Item) { override fun onItemClicked(item: Item) {
item as Item.CheckboxGroup item as Item.CheckboxGroup
item.checked = !item.checked item.checked = !item.checked
when (item) { when (item) {
startReadingButton -> preferences.startReadingButton().set((item.checked)) startReadingButton -> libraryPreferences.startReadingButton().set((item.checked))
else -> Unit else -> Unit
} }
adapter.notifyItemChanged(item) adapter.notifyItemChanged(item)
@ -472,16 +474,16 @@ class LibrarySettingsSheet(
override val footer = null override val footer = null
override fun initModels() { override fun initModels() {
showTabs.checked = preferences.categoryTabs().get() showTabs.checked = libraryPreferences.categoryTabs().get()
showNumberOfItems.checked = preferences.categoryNumberOfItems().get() showNumberOfItems.checked = libraryPreferences.categoryNumberOfItems().get()
} }
override fun onItemClicked(item: Item) { override fun onItemClicked(item: Item) {
item as Item.CheckboxGroup item as Item.CheckboxGroup
item.checked = !item.checked item.checked = !item.checked
when (item) { when (item) {
showTabs -> preferences.categoryTabs().set(item.checked) showTabs -> libraryPreferences.categoryTabs().set(item.checked)
showNumberOfItems -> preferences.categoryNumberOfItems().set(item.checked) showNumberOfItems -> libraryPreferences.categoryNumberOfItems().set(item.checked)
else -> {} else -> {}
} }
adapter.notifyItemChanged(item) adapter.notifyItemChanged(item)
@ -531,7 +533,7 @@ class LibrarySettingsSheet(
override val footer = null override val footer = null
override fun initModels() { override fun initModels() {
val groupType = preferences.groupLibraryBy().get() val groupType = libraryPreferences.groupLibraryBy().get()
items.forEach { items.forEach {
it.state = if (it.id == groupType) { it.state = if (it.id == groupType) {
@ -550,7 +552,7 @@ class LibrarySettingsSheet(
} }
item.state = Item.DrawableSelection.SELECTED item.state = Item.DrawableSelection.SELECTED
preferences.groupLibraryBy().set(item.id) libraryPreferences.groupLibraryBy().set(item.id)
item.group.items.forEach { adapter.notifyItemChanged(it) } item.group.items.forEach { adapter.notifyItemChanged(it) }
} }
@ -562,6 +564,7 @@ class LibrarySettingsSheet(
ExtendedNavigationView(context, attrs) { ExtendedNavigationView(context, attrs) {
val preferences: PreferencesHelper by injectLazy() val preferences: PreferencesHelper by injectLazy()
val libraryPreferences: LibraryPreferences by injectLazy()
lateinit var adapter: Adapter lateinit var adapter: Adapter
/** /**

View File

@ -33,6 +33,7 @@ import com.bluelinelabs.conductor.RouterTransaction
import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationBarView
import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@ -88,6 +89,7 @@ import java.util.LinkedList
class MainActivity : BaseActivity() { class MainActivity : BaseActivity() {
private val sourcePreferences: SourcePreferences by injectLazy() private val sourcePreferences: SourcePreferences by injectLazy()
private val libraryPreferences: LibraryPreferences by injectLazy()
lateinit var binding: MainActivityBinding lateinit var binding: MainActivityBinding
@ -144,6 +146,7 @@ class MainActivity : BaseActivity() {
networkPreferences = Injekt.get(), networkPreferences = Injekt.get(),
sourcePreferences = sourcePreferences, sourcePreferences = sourcePreferences,
securityPreferences = Injekt.get(), securityPreferences = Injekt.get(),
libraryPreferences = libraryPreferences,
) )
} else { } else {
false false
@ -303,7 +306,7 @@ class MainActivity : BaseActivity() {
} }
// SY --> // SY -->
merge(preferences.showUpdatesNavBadge().changes(), preferences.unreadUpdatesCount().changes()) merge(libraryPreferences.showUpdatesNavBadge().changes(), libraryPreferences.unreadUpdatesCount().changes())
.onEach { setUnreadUpdatesBadge() } .onEach { setUnreadUpdatesBadge() }
.launchIn(lifecycleScope) .launchIn(lifecycleScope)
@ -439,7 +442,7 @@ class MainActivity : BaseActivity() {
} }
private fun setUnreadUpdatesBadge() { private fun setUnreadUpdatesBadge() {
val updates = if (preferences.showUpdatesNavBadge().get()) preferences.unreadUpdatesCount().get() else 0 val updates = if (libraryPreferences.showUpdatesNavBadge().get()) libraryPreferences.unreadUpdatesCount().get() else 0
if (updates > 0) { if (updates > 0) {
nav.getOrCreateBadge(R.id.nav_updates).apply { nav.getOrCreateBadge(R.id.nav_updates).apply {
number = updates number = updates

View File

@ -16,6 +16,7 @@ import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
import eu.kanade.domain.chapter.interactor.UpdateChapter import eu.kanade.domain.chapter.interactor.UpdateChapter
import eu.kanade.domain.chapter.model.ChapterUpdate import eu.kanade.domain.chapter.model.ChapterUpdate
import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.chapter.model.toDbChapter
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.DeleteByMergeId import eu.kanade.domain.manga.interactor.DeleteByMergeId
import eu.kanade.domain.manga.interactor.DeleteMangaById import eu.kanade.domain.manga.interactor.DeleteMangaById
import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga
@ -125,6 +126,7 @@ class MangaPresenter(
val isFromSource: Boolean, val isFromSource: Boolean,
val smartSearched: Boolean, val smartSearched: Boolean,
private val preferences: PreferencesHelper = Injekt.get(), private val preferences: PreferencesHelper = Injekt.get(),
private val libraryPreferences: LibraryPreferences = Injekt.get(),
private val trackManager: TrackManager = Injekt.get(), private val trackManager: TrackManager = Injekt.get(),
private val sourceManager: SourceManager = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(),
private val downloadManager: DownloadManager = Injekt.get(), private val downloadManager: DownloadManager = Injekt.get(),
@ -686,7 +688,7 @@ class MangaPresenter(
// Now check if user previously set categories, when available // Now check if user previously set categories, when available
val categories = getCategories() val categories = getCategories()
val defaultCategoryId = preferences.defaultCategory().get().toLong() val defaultCategoryId = libraryPreferences.defaultCategory().get().toLong()
val defaultCategory = categories.find { it.id == defaultCategoryId } val defaultCategory = categories.find { it.id == defaultCategoryId }
when { when {
// Default category set // Default category set

View File

@ -10,6 +10,7 @@ import eu.kanade.domain.chapter.interactor.SetReadStatus
import eu.kanade.domain.chapter.interactor.UpdateChapter import eu.kanade.domain.chapter.interactor.UpdateChapter
import eu.kanade.domain.chapter.model.ChapterUpdate import eu.kanade.domain.chapter.model.ChapterUpdate
import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.chapter.model.toDbChapter
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.interactor.GetManga
import eu.kanade.domain.updates.interactor.GetUpdates import eu.kanade.domain.updates.interactor.GetUpdates
import eu.kanade.domain.updates.model.UpdatesWithRelations import eu.kanade.domain.updates.model.UpdatesWithRelations
@ -53,12 +54,13 @@ class UpdatesPresenter(
private val downloadManager: DownloadManager = Injekt.get(), private val downloadManager: DownloadManager = Injekt.get(),
private val getChapter: GetChapter = Injekt.get(), private val getChapter: GetChapter = Injekt.get(),
preferences: PreferencesHelper = Injekt.get(), preferences: PreferencesHelper = Injekt.get(),
libraryPreferences: LibraryPreferences = Injekt.get(),
) : BasePresenter<UpdatesController>(), UpdatesState by state { ) : BasePresenter<UpdatesController>(), UpdatesState by state {
val isDownloadOnly: Boolean by preferences.downloadedOnly().asState() val isDownloadOnly: Boolean by preferences.downloadedOnly().asState()
val isIncognitoMode: Boolean by preferences.incognitoMode().asState() val isIncognitoMode: Boolean by preferences.incognitoMode().asState()
val lastUpdated by preferences.libraryUpdateLastTimestamp().asState() val lastUpdated by libraryPreferences.libraryUpdateLastTimestamp().asState()
val relativeTime: Int by preferences.relativeTime().asState() val relativeTime: Int by preferences.relativeTime().asState()
val dateFormat: DateFormat by mutableStateOf(preferences.dateFormat()) val dateFormat: DateFormat by mutableStateOf(preferences.dateFormat())

View File

@ -6,6 +6,7 @@ import android.provider.Settings
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat import androidx.core.os.LocaleListCompat
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.preference.bindTo import eu.kanade.tachiyomi.util.preference.bindTo
import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.defaultValue
@ -19,15 +20,18 @@ import eu.kanade.tachiyomi.util.preference.switchPreference
import eu.kanade.tachiyomi.util.preference.titleRes import eu.kanade.tachiyomi.util.preference.titleRes
import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.LocaleHelper
import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParser
import uy.kohesive.injekt.injectLazy
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
class SettingsGeneralController : SettingsController() { class SettingsGeneralController : SettingsController() {
private val libraryPreferences: LibraryPreferences by injectLazy()
override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply { override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
titleRes = R.string.pref_category_general titleRes = R.string.pref_category_general
switchPreference { switchPreference {
bindTo(preferences.showUpdatesNavBadge()) bindTo(libraryPreferences.showUpdatesNavBadge())
titleRes = R.string.pref_library_update_show_tab_badge titleRes = R.string.pref_library_update_show_tab_badge
} }
switchPreference { switchPreference {

View File

@ -10,6 +10,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.domain.category.interactor.GetCategories import eu.kanade.domain.category.interactor.GetCategories
import eu.kanade.domain.category.interactor.ResetCategoryFlags import eu.kanade.domain.category.interactor.ResetCategoryFlags
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.library.model.GroupLibraryMode
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.presentation.category.visualName import eu.kanade.presentation.category.visualName
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
@ -20,8 +22,6 @@ import eu.kanade.tachiyomi.data.preference.DEVICE_ONLY_ON_WIFI
import eu.kanade.tachiyomi.data.preference.MANGA_HAS_UNREAD import eu.kanade.tachiyomi.data.preference.MANGA_HAS_UNREAD
import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED
import eu.kanade.tachiyomi.data.preference.MANGA_NON_READ import eu.kanade.tachiyomi.data.preference.MANGA_NON_READ
import eu.kanade.tachiyomi.data.preference.PreferenceValues.GroupLibraryMode
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.databinding.PrefLibraryColumnsBinding import eu.kanade.tachiyomi.databinding.PrefLibraryColumnsBinding
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
@ -57,6 +57,7 @@ class SettingsLibraryController : SettingsController() {
private val getCategories: GetCategories by injectLazy() private val getCategories: GetCategories by injectLazy()
private val trackManager: TrackManager by injectLazy() private val trackManager: TrackManager by injectLazy()
private val resetCategoryFlags: ResetCategoryFlags by injectLazy() private val resetCategoryFlags: ResetCategoryFlags by injectLazy()
private val libraryPreferences: LibraryPreferences by injectLazy()
override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply { override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
titleRes = R.string.pref_category_library titleRes = R.string.pref_category_library
@ -82,7 +83,7 @@ class SettingsLibraryController : SettingsController() {
} }
} }
combine(preferences.portraitColumns().changes(), preferences.landscapeColumns().changes()) { portraitCols, landscapeCols -> Pair(portraitCols, landscapeCols) } combine(libraryPreferences.portraitColumns().changes(), libraryPreferences.landscapeColumns().changes()) { portraitCols, landscapeCols -> Pair(portraitCols, landscapeCols) }
.onEach { (portraitCols, landscapeCols) -> .onEach { (portraitCols, landscapeCols) ->
val portrait = getColumnValue(portraitCols) val portrait = getColumnValue(portraitCols)
val landscape = getColumnValue(landscapeCols) val landscape = getColumnValue(landscapeCols)
@ -109,15 +110,15 @@ class SettingsLibraryController : SettingsController() {
} }
intListPreference { intListPreference {
key = Keys.defaultCategory val defaultCategory = libraryPreferences.defaultCategory()
bindTo(defaultCategory)
titleRes = R.string.default_category titleRes = R.string.default_category
entries = arrayOf(context.getString(R.string.default_category_summary)) + entries = arrayOf(context.getString(R.string.default_category_summary)) +
allCategories.map { it.visualName(context) }.toTypedArray() allCategories.map { it.visualName(context) }.toTypedArray()
entryValues = arrayOf("-1") + allCategories.map { it.id.toString() }.toTypedArray() entryValues = arrayOf(defaultCategory.defaultValue().toString()) + allCategories.map { it.id.toString() }.toTypedArray()
defaultValue = "-1"
val selectedCategory = allCategories.find { it.id == preferences.defaultCategory().get().toLong() } val selectedCategory = allCategories.find { it.id == defaultCategory.get().toLong() }
summary = selectedCategory?.visualName(context) summary = selectedCategory?.visualName(context)
?: context.getString(R.string.default_category_summary) ?: context.getString(R.string.default_category_summary)
onChange { newValue -> onChange { newValue ->
@ -129,10 +130,10 @@ class SettingsLibraryController : SettingsController() {
} }
switchPreference { switchPreference {
bindTo(preferences.categorizedDisplaySettings()) bindTo(libraryPreferences.categorizedDisplaySettings())
titleRes = R.string.categorized_display_settings titleRes = R.string.categorized_display_settings
preferences.categorizedDisplaySettings().changes() libraryPreferences.categorizedDisplaySettings().changes()
.onEach { .onEach {
if (it.not()) { if (it.not()) {
resetCategoryFlags.await() resetCategoryFlags.await()
@ -146,7 +147,7 @@ class SettingsLibraryController : SettingsController() {
titleRes = R.string.pref_category_library_update titleRes = R.string.pref_category_library_update
intListPreference { intListPreference {
bindTo(preferences.libraryUpdateInterval()) bindTo(libraryPreferences.libraryUpdateInterval())
titleRes = R.string.pref_library_update_interval titleRes = R.string.pref_library_update_interval
entriesRes = arrayOf( entriesRes = arrayOf(
R.string.update_never, R.string.update_never,
@ -166,12 +167,12 @@ class SettingsLibraryController : SettingsController() {
} }
} }
multiSelectListPreference { multiSelectListPreference {
bindTo(preferences.libraryUpdateDeviceRestriction()) bindTo(libraryPreferences.libraryUpdateDeviceRestriction())
titleRes = R.string.pref_library_update_restriction titleRes = R.string.pref_library_update_restriction
entriesRes = arrayOf(R.string.connected_to_wifi, R.string.network_not_metered, R.string.charging, R.string.battery_not_low) entriesRes = arrayOf(R.string.connected_to_wifi, R.string.network_not_metered, R.string.charging, R.string.battery_not_low)
entryValues = arrayOf(DEVICE_ONLY_ON_WIFI, DEVICE_NETWORK_NOT_METERED, DEVICE_CHARGING, DEVICE_BATTERY_NOT_LOW) entryValues = arrayOf(DEVICE_ONLY_ON_WIFI, DEVICE_NETWORK_NOT_METERED, DEVICE_CHARGING, DEVICE_BATTERY_NOT_LOW)
visibleIf(preferences.libraryUpdateInterval()) { it > 0 } visibleIf(libraryPreferences.libraryUpdateInterval()) { it > 0 }
onChange { onChange {
// Post to event looper to allow the preference to be updated. // Post to event looper to allow the preference to be updated.
@ -180,7 +181,7 @@ class SettingsLibraryController : SettingsController() {
} }
fun updateSummary() { fun updateSummary() {
val restrictions = preferences.libraryUpdateDeviceRestriction().get() val restrictions = libraryPreferences.libraryUpdateDeviceRestriction().get()
.sorted() .sorted()
.map { .map {
when (it) { when (it) {
@ -200,18 +201,18 @@ class SettingsLibraryController : SettingsController() {
summary = context.getString(R.string.restrictions, restrictionsText) summary = context.getString(R.string.restrictions, restrictionsText)
} }
preferences.libraryUpdateDeviceRestriction().changes() libraryPreferences.libraryUpdateDeviceRestriction().changes()
.onEach { updateSummary() } .onEach { updateSummary() }
.launchIn(viewScope) .launchIn(viewScope)
} }
multiSelectListPreference { multiSelectListPreference {
bindTo(preferences.libraryUpdateMangaRestriction()) bindTo(libraryPreferences.libraryUpdateMangaRestriction())
titleRes = R.string.pref_library_update_manga_restriction titleRes = R.string.pref_library_update_manga_restriction
entriesRes = arrayOf(R.string.pref_update_only_completely_read, R.string.pref_update_only_started, R.string.pref_update_only_non_completed) entriesRes = arrayOf(R.string.pref_update_only_completely_read, R.string.pref_update_only_started, R.string.pref_update_only_non_completed)
entryValues = arrayOf(MANGA_HAS_UNREAD, MANGA_NON_READ, MANGA_NON_COMPLETED) entryValues = arrayOf(MANGA_HAS_UNREAD, MANGA_NON_READ, MANGA_NON_COMPLETED)
fun updateSummary() { fun updateSummary() {
val restrictions = preferences.libraryUpdateMangaRestriction().get().sorted() val restrictions = libraryPreferences.libraryUpdateMangaRestriction().get().sorted()
.map { .map {
when (it) { when (it) {
MANGA_NON_READ -> context.getString(R.string.pref_update_only_started) MANGA_NON_READ -> context.getString(R.string.pref_update_only_started)
@ -229,12 +230,12 @@ class SettingsLibraryController : SettingsController() {
summary = restrictionsText summary = restrictionsText
} }
preferences.libraryUpdateMangaRestriction().changes() libraryPreferences.libraryUpdateMangaRestriction().changes()
.onEach { updateSummary() } .onEach { updateSummary() }
.launchIn(viewScope) .launchIn(viewScope)
} }
preference { preference {
bindTo(preferences.libraryUpdateCategories()) bindTo(libraryPreferences.libraryUpdateCategories())
titleRes = R.string.categories titleRes = R.string.categories
onClick { onClick {
@ -242,10 +243,10 @@ class SettingsLibraryController : SettingsController() {
} }
fun updateSummary() { fun updateSummary() {
val includedCategories = preferences.libraryUpdateCategories().get() val includedCategories = libraryPreferences.libraryUpdateCategories().get()
.mapNotNull { id -> allCategories.find { it.id == id.toLong() } } .mapNotNull { id -> allCategories.find { it.id == id.toLong() } }
.sortedBy { it.order } .sortedBy { it.order }
val excludedCategories = preferences.libraryUpdateCategoriesExclude().get() val excludedCategories = libraryPreferences.libraryUpdateCategoriesExclude().get()
.mapNotNull { id -> allCategories.find { it.id == id.toLong() } } .mapNotNull { id -> allCategories.find { it.id == id.toLong() } }
.sortedBy { it.order } .sortedBy { it.order }
@ -272,16 +273,16 @@ class SettingsLibraryController : SettingsController() {
} }
} }
preferences.libraryUpdateCategories().changes() libraryPreferences.libraryUpdateCategories().changes()
.onEach { updateSummary() } .onEach { updateSummary() }
.launchIn(viewScope) .launchIn(viewScope)
preferences.libraryUpdateCategoriesExclude().changes() libraryPreferences.libraryUpdateCategoriesExclude().changes()
.onEach { updateSummary() } .onEach { updateSummary() }
.launchIn(viewScope) .launchIn(viewScope)
} }
// SY --> // SY -->
listPreference { listPreference {
bindTo(preferences.groupLibraryUpdateType()) bindTo(libraryPreferences.groupLibraryUpdateType())
titleRes = R.string.library_group_updates titleRes = R.string.library_group_updates
entriesRes = arrayOf( entriesRes = arrayOf(
R.string.library_group_updates_global, R.string.library_group_updates_global,
@ -318,7 +319,7 @@ class SettingsLibraryController : SettingsController() {
preference { preference {
key = "pref_tag_sorting" key = "pref_tag_sorting"
titleRes = R.string.pref_tag_sorting titleRes = R.string.pref_tag_sorting
val count = preferences.sortTagsForLibrary().get().size val count = libraryPreferences.sortTagsForLibrary().get().size
summary = context.resources.getQuantityString(R.plurals.pref_tag_sorting_desc, count, count) summary = context.resources.getQuantityString(R.plurals.pref_tag_sorting_desc, count, count)
onClick { onClick {
router.pushController(SortTagController()) router.pushController(SortTagController())
@ -344,7 +345,7 @@ class SettingsLibraryController : SettingsController() {
class LibraryColumnsDialog : DialogController() { class LibraryColumnsDialog : DialogController() {
private val preferences: PreferencesHelper = Injekt.get() private val preferences: LibraryPreferences = Injekt.get()
private var portrait = preferences.portraitColumns().get() private var portrait = preferences.portraitColumns().get()
private var landscape = preferences.landscapeColumns().get() private var landscape = preferences.landscapeColumns().get()
@ -387,7 +388,7 @@ class SettingsLibraryController : SettingsController() {
class LibraryGlobalUpdateCategoriesDialog : DialogController() { class LibraryGlobalUpdateCategoriesDialog : DialogController() {
private val preferences: PreferencesHelper = Injekt.get() private val preferences: LibraryPreferences = Injekt.get()
private val getCategories: GetCategories = Injekt.get() private val getCategories: GetCategories = Injekt.get()
override fun onCreateDialog(savedViewState: Bundle?): Dialog { override fun onCreateDialog(savedViewState: Bundle?): Dialog {

View File

@ -11,6 +11,7 @@ import eu.kanade.data.chapter.chapterMapper
import eu.kanade.domain.chapter.interactor.DeleteChapters import eu.kanade.domain.chapter.interactor.DeleteChapters
import eu.kanade.domain.chapter.interactor.UpdateChapter import eu.kanade.domain.chapter.interactor.UpdateChapter
import eu.kanade.domain.chapter.model.ChapterUpdate import eu.kanade.domain.chapter.model.ChapterUpdate
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.interactor.GetManga
import eu.kanade.domain.manga.interactor.GetMangaBySource import eu.kanade.domain.manga.interactor.GetMangaBySource
import eu.kanade.domain.manga.interactor.InsertMergedReference import eu.kanade.domain.manga.interactor.InsertMergedReference
@ -25,7 +26,6 @@ import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED
import eu.kanade.tachiyomi.data.preference.PreferenceKeys
import eu.kanade.tachiyomi.data.preference.PreferenceValues import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
@ -97,6 +97,7 @@ object EXHMigrations {
networkPreferences: NetworkPreferences, networkPreferences: NetworkPreferences,
sourcePreferences: SourcePreferences, sourcePreferences: SourcePreferences,
securityPreferences: SecurityPreferences, securityPreferences: SecurityPreferences,
libraryPreferences: LibraryPreferences,
): Boolean { ): Boolean {
val oldVersion = preferences.ehLastVersionCode().get() val oldVersion = preferences.ehLastVersionCode().get()
try { try {
@ -268,15 +269,15 @@ object EXHMigrations {
if (readerTheme == 4) { if (readerTheme == 4) {
preferences.readerTheme().set(3) preferences.readerTheme().set(3)
} }
val updateInterval = preferences.libraryUpdateInterval().get() val updateInterval = libraryPreferences.libraryUpdateInterval().get()
if (updateInterval == 1 || updateInterval == 2) { if (updateInterval == 1 || updateInterval == 2) {
preferences.libraryUpdateInterval().set(3) libraryPreferences.libraryUpdateInterval().set(3)
LibraryUpdateJob.setupTask(context, 3) LibraryUpdateJob.setupTask(context, 3)
} }
} }
if (oldVersion under 20) { if (oldVersion under 20) {
try { try {
val oldSortingMode = prefs.getInt(PreferenceKeys.librarySortingMode, 0 /* ALPHABETICAL */) val oldSortingMode = prefs.getInt(libraryPreferences.librarySortingMode().key(), 0 /* ALPHABETICAL */)
val oldSortingDirection = prefs.getBoolean("library_sorting_ascending", true) val oldSortingDirection = prefs.getBoolean("library_sorting_ascending", true)
val newSortingMode = when (oldSortingMode) { val newSortingMode = when (oldSortingMode) {
@ -299,12 +300,12 @@ object EXHMigrations {
} }
prefs.edit(commit = true) { prefs.edit(commit = true) {
remove(PreferenceKeys.librarySortingMode) remove(libraryPreferences.librarySortingMode().key())
remove("library_sorting_ascending") remove("library_sorting_ascending")
} }
prefs.edit { prefs.edit {
putString(PreferenceKeys.librarySortingMode, newSortingMode) putString(libraryPreferences.librarySortingMode().key(), newSortingMode)
putString("library_sorting_ascending", newSortingDirection) putString("library_sorting_ascending", newSortingDirection)
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -321,16 +322,16 @@ object EXHMigrations {
} }
if (oldVersion under 22) { if (oldVersion under 22) {
// Handle removed every 3, 4, 6, and 8 hour library updates // Handle removed every 3, 4, 6, and 8 hour library updates
val updateInterval = preferences.libraryUpdateInterval().get() val updateInterval = libraryPreferences.libraryUpdateInterval().get()
if (updateInterval in listOf(3, 4, 6, 8)) { if (updateInterval in listOf(3, 4, 6, 8)) {
preferences.libraryUpdateInterval().set(12) libraryPreferences.libraryUpdateInterval().set(12)
LibraryUpdateJob.setupTask(context, 12) LibraryUpdateJob.setupTask(context, 12)
} }
} }
if (oldVersion under 23) { if (oldVersion under 23) {
val oldUpdateOngoingOnly = prefs.getBoolean("pref_update_only_non_completed_key", true) val oldUpdateOngoingOnly = prefs.getBoolean("pref_update_only_non_completed_key", true)
if (!oldUpdateOngoingOnly) { if (!oldUpdateOngoingOnly) {
preferences.libraryUpdateMangaRestriction() -= MANGA_NON_COMPLETED libraryPreferences.libraryUpdateMangaRestriction() -= MANGA_NON_COMPLETED
} }
} }
if (oldVersion under 24) { if (oldVersion under 24) {
@ -424,7 +425,7 @@ object EXHMigrations {
if (oldVersion under 38) { if (oldVersion under 38) {
// Handle renamed enum values // Handle renamed enum values
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
val newSortingMode = when (val oldSortingMode = prefs.getString(PreferenceKeys.librarySortingMode, "ALPHABETICAL")) { val newSortingMode = when (val oldSortingMode = prefs.getString(libraryPreferences.librarySortingMode().key(), "ALPHABETICAL")) {
"LAST_CHECKED" -> "LAST_MANGA_UPDATE" "LAST_CHECKED" -> "LAST_MANGA_UPDATE"
"UNREAD" -> "UNREAD_COUNT" "UNREAD" -> "UNREAD_COUNT"
"DATE_FETCHED" -> "CHAPTER_FETCH_DATE" "DATE_FETCHED" -> "CHAPTER_FETCH_DATE"
@ -432,7 +433,7 @@ object EXHMigrations {
else -> oldSortingMode else -> oldSortingMode
} }
prefs.edit { prefs.edit {
putString(PreferenceKeys.librarySortingMode, newSortingMode) putString(libraryPreferences.librarySortingMode().key(), newSortingMode)
} }
runBlocking { runBlocking {
handler.await(true) { handler.await(true) {
@ -451,9 +452,9 @@ object EXHMigrations {
} }
if (oldVersion under 39) { if (oldVersion under 39) {
prefs.edit { prefs.edit {
val sort = prefs.getString(PreferenceKeys.librarySortingMode, null) ?: return@edit val sort = prefs.getString(libraryPreferences.librarySortingMode().key(), null) ?: return@edit
val direction = prefs.getString("library_sorting_ascending", "ASCENDING")!! val direction = prefs.getString("library_sorting_ascending", "ASCENDING")!!
putString(PreferenceKeys.librarySortingMode, "$sort,$direction") putString(libraryPreferences.librarySortingMode().key(), "$sort,$direction")
remove("library_sorting_ascending") remove("library_sorting_ascending")
} }
} }

View File

@ -3,6 +3,7 @@ package exh.debug
import android.app.Application import android.app.Application
import androidx.work.WorkManager import androidx.work.WorkManager
import eu.kanade.data.DatabaseHandler import eu.kanade.data.DatabaseHandler
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetAllManga import eu.kanade.domain.manga.interactor.GetAllManga
import eu.kanade.domain.manga.interactor.GetExhFavoriteMangaWithMetadata import eu.kanade.domain.manga.interactor.GetExhFavoriteMangaWithMetadata
import eu.kanade.domain.manga.interactor.GetFavorites import eu.kanade.domain.manga.interactor.GetFavorites
@ -36,6 +37,7 @@ object DebugFunctions {
val networkPrefs: NetworkPreferences by injectLazy() val networkPrefs: NetworkPreferences by injectLazy()
val sourcePrefs: SourcePreferences by injectLazy() val sourcePrefs: SourcePreferences by injectLazy()
val securityPrefs: SecurityPreferences by injectLazy() val securityPrefs: SecurityPreferences by injectLazy()
val libraryPrefs: LibraryPreferences by injectLazy()
val sourceManager: SourceManager by injectLazy() val sourceManager: SourceManager by injectLazy()
val updateManga: UpdateManga by injectLazy() val updateManga: UpdateManga by injectLazy()
val getFavorites: GetFavorites by injectLazy() val getFavorites: GetFavorites by injectLazy()
@ -47,12 +49,12 @@ object DebugFunctions {
fun forceUpgradeMigration() { fun forceUpgradeMigration() {
prefs.ehLastVersionCode().set(1) prefs.ehLastVersionCode().set(1)
EXHMigrations.upgrade(app, prefs, networkPrefs, sourcePrefs, securityPrefs) EXHMigrations.upgrade(app, prefs, networkPrefs, sourcePrefs, securityPrefs, libraryPrefs)
} }
fun forceSetupJobs() { fun forceSetupJobs() {
prefs.ehLastVersionCode().set(0) prefs.ehLastVersionCode().set(0)
EXHMigrations.upgrade(app, prefs, networkPrefs, sourcePrefs, securityPrefs) EXHMigrations.upgrade(app, prefs, networkPrefs, sourcePrefs, securityPrefs, libraryPrefs)
} }
fun resetAgedFlagInEXHManga() { fun resetAgedFlagInEXHManga() {

View File

@ -1,8 +1,8 @@
package eu.kanade.tachiyomi.util.chapter package eu.kanade.tachiyomi.util.chapter
import eu.kanade.tachiyomi.ui.library.setting.LibraryDisplayMode import eu.kanade.domain.library.model.LibraryDisplayMode
import eu.kanade.tachiyomi.ui.library.setting.LibrarySort import eu.kanade.domain.library.model.LibrarySort
import eu.kanade.tachiyomi.ui.library.setting.plus import eu.kanade.domain.library.model.plus
import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotEquals import org.junit.jupiter.api.Assertions.assertNotEquals
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test