mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-12 20:19:05 +01:00
Move default category into database (#7676)
This commit is contained in:
@@ -35,7 +35,7 @@ class CategoryPresenter(
|
||||
getCategories.subscribe()
|
||||
.collectLatest {
|
||||
state.isLoading = false
|
||||
state.categories = it
|
||||
state.categories = it.filterNot(Category::isSystemCategory)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ import androidx.compose.ui.platform.LocalContext
|
||||
import com.bluelinelabs.conductor.ControllerChangeHandler
|
||||
import com.bluelinelabs.conductor.ControllerChangeType
|
||||
import eu.kanade.domain.category.model.Category
|
||||
import eu.kanade.domain.category.model.toDbCategory
|
||||
import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.domain.manga.model.toDbManga
|
||||
import eu.kanade.presentation.library.LibraryScreen
|
||||
@@ -119,12 +118,8 @@ class LibraryController(
|
||||
}
|
||||
|
||||
fun showSettingsSheet() {
|
||||
if (presenter.categories.isNotEmpty()) {
|
||||
presenter.categories[presenter.activeCategory].let { category ->
|
||||
settingsSheet?.show(category.toDbCategory())
|
||||
}
|
||||
} else {
|
||||
settingsSheet?.show()
|
||||
presenter.categories[presenter.activeCategory].let { category ->
|
||||
settingsSheet?.show(category)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.domain.manga.model.MangaUpdate
|
||||
import eu.kanade.domain.manga.model.isLocal
|
||||
import eu.kanade.domain.track.interactor.GetTracks
|
||||
import eu.kanade.presentation.category.visualName
|
||||
import eu.kanade.presentation.library.LibraryState
|
||||
import eu.kanade.presentation.library.LibraryStateImpl
|
||||
import eu.kanade.presentation.library.components.LibraryToolbarTitle
|
||||
@@ -94,15 +95,9 @@ class LibraryPresenter(
|
||||
private val trackManager: TrackManager = Injekt.get(),
|
||||
) : BasePresenter<LibraryController>(), LibraryState by state {
|
||||
|
||||
private val context = preferences.context
|
||||
|
||||
var loadedManga by mutableStateOf(emptyMap<Long, List<LibraryItem>>())
|
||||
private set
|
||||
|
||||
val isPerCategory by preferences.categorizedDisplaySettings().asState()
|
||||
|
||||
var currentDisplayMode by preferences.libraryDisplayMode().asState()
|
||||
|
||||
val tabVisibility by preferences.categoryTabs().asState()
|
||||
|
||||
val mangaCountVisibility by preferences.categoryNumberOfItems().asState()
|
||||
@@ -412,8 +407,8 @@ class LibraryPresenter(
|
||||
*/
|
||||
private fun getLibraryObservable(): Observable<Library> {
|
||||
return combine(getCategoriesFlow(), getLibraryMangasFlow()) { dbCategories, libraryManga ->
|
||||
val categories = if (libraryManga.containsKey(0) || libraryManga.isEmpty()) {
|
||||
arrayListOf(Category.default(context)) + dbCategories
|
||||
val categories = if (libraryManga.isNotEmpty() && libraryManga.containsKey(0).not()) {
|
||||
dbCategories.filterNot { it.id == Category.UNCATEGORIZED_ID }
|
||||
} else {
|
||||
dbCategories
|
||||
}
|
||||
@@ -642,10 +637,12 @@ class LibraryPresenter(
|
||||
val category = categories.getOrNull(activeCategory)
|
||||
|
||||
val defaultTitle = stringResource(id = R.string.label_library)
|
||||
val categoryName = category?.visualName ?: defaultTitle
|
||||
|
||||
val default = remember { LibraryToolbarTitle(defaultTitle) }
|
||||
|
||||
return produceState(initialValue = default, category, loadedManga, mangaCountVisibility, tabVisibility) {
|
||||
val title = if (tabVisibility.not()) category?.name ?: defaultTitle else defaultTitle
|
||||
val title = if (tabVisibility.not()) categoryName else defaultTitle
|
||||
|
||||
value = when {
|
||||
category == null -> default
|
||||
@@ -681,11 +678,7 @@ class LibraryPresenter(
|
||||
fun getDisplayMode(index: Int): androidx.compose.runtime.State<DisplayModeSetting> {
|
||||
val category = categories[index]
|
||||
return derivedStateOf {
|
||||
if (isPerCategory.not() || category.id == 0L) {
|
||||
currentDisplayMode
|
||||
} else {
|
||||
DisplayModeSetting.fromFlag(category.displayMode)
|
||||
}
|
||||
DisplayModeSetting.fromFlag(category.displayMode)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,11 +4,10 @@ import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import com.bluelinelabs.conductor.Router
|
||||
import eu.kanade.domain.category.interactor.UpdateCategory
|
||||
import eu.kanade.domain.category.model.CategoryUpdate
|
||||
import eu.kanade.domain.category.interactor.SetDisplayModeForCategory
|
||||
import eu.kanade.domain.category.interactor.SetSortModeForCategory
|
||||
import eu.kanade.domain.category.model.Category
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.database.models.Category
|
||||
import eu.kanade.tachiyomi.data.database.models.toDomainCategory
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||
import eu.kanade.tachiyomi.data.track.TrackService
|
||||
@@ -29,7 +28,8 @@ import uy.kohesive.injekt.injectLazy
|
||||
class LibrarySettingsSheet(
|
||||
router: Router,
|
||||
private val trackManager: TrackManager = Injekt.get(),
|
||||
private val updateCategory: UpdateCategory = Injekt.get(),
|
||||
private val setDisplayModeForCategory: SetDisplayModeForCategory = Injekt.get(),
|
||||
private val setSortModeForCategory: SetSortModeForCategory = Injekt.get(),
|
||||
onGroupClickListener: (ExtendedNavigationView.Group) -> Unit,
|
||||
) : TabbedBottomSheetDialog(router.activity!!) {
|
||||
|
||||
@@ -202,8 +202,8 @@ class LibrarySettingsSheet(
|
||||
override val footer = null
|
||||
|
||||
override fun initModels() {
|
||||
val sorting = SortModeSetting.get(preferences, currentCategory?.toDomainCategory())
|
||||
val order = if (SortDirectionSetting.get(preferences, currentCategory?.toDomainCategory()) == SortDirectionSetting.ASCENDING) {
|
||||
val sorting = SortModeSetting.get(preferences, currentCategory)
|
||||
val order = if (SortDirectionSetting.get(preferences, currentCategory) == SortDirectionSetting.ASCENDING) {
|
||||
Item.MultiSort.SORT_ASC
|
||||
} else {
|
||||
Item.MultiSort.SORT_DESC
|
||||
@@ -256,18 +256,8 @@ class LibrarySettingsSheet(
|
||||
SortDirectionSetting.DESCENDING
|
||||
}
|
||||
|
||||
if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
|
||||
currentCategory?.sortDirection = flag.flag.toInt()
|
||||
sheetScope.launchIO {
|
||||
updateCategory.await(
|
||||
CategoryUpdate(
|
||||
id = currentCategory!!.id?.toLong()!!,
|
||||
flags = currentCategory!!.flags.toLong(),
|
||||
),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
preferences.librarySortingAscending().set(flag)
|
||||
sheetScope.launchIO {
|
||||
setSortModeForCategory.await(currentCategory!!, flag)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,18 +274,8 @@ class LibrarySettingsSheet(
|
||||
else -> throw NotImplementedError("Unknown display mode")
|
||||
}
|
||||
|
||||
if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
|
||||
currentCategory?.sortMode = flag.flag.toInt()
|
||||
sheetScope.launchIO {
|
||||
updateCategory.await(
|
||||
CategoryUpdate(
|
||||
id = currentCategory!!.id?.toLong()!!,
|
||||
flags = currentCategory!!.flags.toLong(),
|
||||
),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
preferences.librarySortingMode().set(flag)
|
||||
sheetScope.launchIO {
|
||||
setSortModeForCategory.await(currentCategory!!, flag)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -327,8 +307,8 @@ class LibrarySettingsSheet(
|
||||
|
||||
// Gets user preference of currently selected display mode at current category
|
||||
private fun getDisplayModePreference(): DisplayModeSetting {
|
||||
return if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
|
||||
DisplayModeSetting.fromFlag(currentCategory?.displayMode?.toLong())
|
||||
return if (currentCategory != null && preferences.categorizedDisplaySettings().get()) {
|
||||
DisplayModeSetting.fromFlag(currentCategory!!.displayMode)
|
||||
} else {
|
||||
preferences.libraryDisplayMode().get()
|
||||
}
|
||||
@@ -379,18 +359,8 @@ class LibrarySettingsSheet(
|
||||
else -> throw NotImplementedError("Unknown display mode")
|
||||
}
|
||||
|
||||
if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
|
||||
currentCategory?.displayMode = flag.flag.toInt()
|
||||
sheetScope.launchIO {
|
||||
updateCategory.await(
|
||||
CategoryUpdate(
|
||||
id = currentCategory!!.id?.toLong()!!,
|
||||
flags = currentCategory!!.flags.toLong(),
|
||||
),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
preferences.libraryDisplayMode().set(flag)
|
||||
sheetScope.launchIO {
|
||||
setDisplayModeForCategory.await(currentCategory!!, flag)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ enum class SortModeSetting(val flag: Long) {
|
||||
}
|
||||
|
||||
fun get(preferences: PreferencesHelper, category: Category?): SortModeSetting {
|
||||
return if (preferences.categorizedDisplaySettings().get() && category != null && category.id != 0L) {
|
||||
return if (category != null && preferences.categorizedDisplaySettings().get()) {
|
||||
fromFlag(category.sortMode)
|
||||
} else {
|
||||
preferences.librarySortingMode().get()
|
||||
|
||||
@@ -12,7 +12,7 @@ import androidx.preference.PreferenceScreen
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.hippo.unifile.UniFile
|
||||
import eu.kanade.domain.category.interactor.GetCategories
|
||||
import eu.kanade.domain.category.model.Category
|
||||
import eu.kanade.presentation.category.visualName
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||
@@ -46,8 +46,7 @@ class SettingsDownloadController : SettingsController() {
|
||||
override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
|
||||
titleRes = R.string.pref_category_downloads
|
||||
|
||||
val dbCategories = runBlocking { getCategories.await() }
|
||||
val categories = listOf(Category.default(context)) + dbCategories
|
||||
val categories = runBlocking { getCategories.await() }
|
||||
|
||||
preference {
|
||||
bindTo(preferences.downloadsDirectory())
|
||||
@@ -111,7 +110,7 @@ class SettingsDownloadController : SettingsController() {
|
||||
multiSelectListPreference {
|
||||
bindTo(preferences.removeExcludeCategories())
|
||||
titleRes = R.string.pref_remove_exclude_categories
|
||||
entries = categories.map { it.name }.toTypedArray()
|
||||
entries = categories.map { it.visualName(context) }.toTypedArray()
|
||||
entryValues = categories.map { it.id.toString() }.toTypedArray()
|
||||
|
||||
preferences.removeExcludeCategories().asFlow()
|
||||
@@ -255,10 +254,9 @@ class SettingsDownloadController : SettingsController() {
|
||||
private val getCategories: GetCategories = Injekt.get()
|
||||
|
||||
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
||||
val dbCategories = runBlocking { getCategories.await() }
|
||||
val categories = listOf(Category.default(activity!!)) + dbCategories
|
||||
val categories = runBlocking { getCategories.await() }
|
||||
|
||||
val items = categories.map { it.name }
|
||||
val items = categories.map { it.visualName(activity!!) }
|
||||
var selected = categories
|
||||
.map {
|
||||
when (it.id.toString()) {
|
||||
|
||||
@@ -8,7 +8,9 @@ import androidx.core.text.buildSpannedString
|
||||
import androidx.preference.PreferenceScreen
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import eu.kanade.domain.category.interactor.GetCategories
|
||||
import eu.kanade.domain.category.interactor.ResetCategoryFlags
|
||||
import eu.kanade.domain.category.model.Category
|
||||
import eu.kanade.presentation.category.visualName
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
||||
import eu.kanade.tachiyomi.data.preference.DEVICE_BATTERY_NOT_LOW
|
||||
@@ -51,12 +53,13 @@ class SettingsLibraryController : SettingsController() {
|
||||
|
||||
private val getCategories: GetCategories by injectLazy()
|
||||
private val trackManager: TrackManager by injectLazy()
|
||||
private val resetCategoryFlags: ResetCategoryFlags by injectLazy()
|
||||
|
||||
override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
|
||||
titleRes = R.string.pref_category_library
|
||||
|
||||
val dbCategories = runBlocking { getCategories.await() }
|
||||
val categories = listOf(Category.default(context)) + dbCategories
|
||||
val allCategories = runBlocking { getCategories.await() }
|
||||
val userCategories = allCategories.filterNot(Category::isSystemCategory)
|
||||
|
||||
preferenceCategory {
|
||||
titleRes = R.string.pref_category_display
|
||||
@@ -94,7 +97,7 @@ class SettingsLibraryController : SettingsController() {
|
||||
key = "pref_action_edit_categories"
|
||||
titleRes = R.string.action_edit_categories
|
||||
|
||||
val catCount = dbCategories.size
|
||||
val catCount = userCategories.size
|
||||
summary = context.resources.getQuantityString(R.plurals.num_categories, catCount, catCount)
|
||||
|
||||
onClick {
|
||||
@@ -107,15 +110,15 @@ class SettingsLibraryController : SettingsController() {
|
||||
titleRes = R.string.default_category
|
||||
|
||||
entries = arrayOf(context.getString(R.string.default_category_summary)) +
|
||||
categories.map { it.name }.toTypedArray()
|
||||
entryValues = arrayOf("-1") + categories.map { it.id.toString() }.toTypedArray()
|
||||
allCategories.map { it.visualName(context) }.toTypedArray()
|
||||
entryValues = arrayOf("-1") + allCategories.map { it.id.toString() }.toTypedArray()
|
||||
defaultValue = "-1"
|
||||
|
||||
val selectedCategory = categories.find { it.id == preferences.defaultCategory().toLong() }
|
||||
val selectedCategory = allCategories.find { it.id == preferences.defaultCategory().toLong() }
|
||||
summary = selectedCategory?.name
|
||||
?: context.getString(R.string.default_category_summary)
|
||||
onChange { newValue ->
|
||||
summary = categories.find {
|
||||
summary = allCategories.find {
|
||||
it.id == (newValue as String).toLong()
|
||||
}?.name ?: context.getString(R.string.default_category_summary)
|
||||
true
|
||||
@@ -125,6 +128,14 @@ class SettingsLibraryController : SettingsController() {
|
||||
switchPreference {
|
||||
bindTo(preferences.categorizedDisplaySettings())
|
||||
titleRes = R.string.categorized_display_settings
|
||||
|
||||
preferences.categorizedDisplaySettings().asFlow()
|
||||
.onEach {
|
||||
if (it.not()) {
|
||||
resetCategoryFlags.await()
|
||||
}
|
||||
}
|
||||
.launchIn(viewScope)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,19 +240,19 @@ class SettingsLibraryController : SettingsController() {
|
||||
|
||||
fun updateSummary() {
|
||||
val includedCategories = preferences.libraryUpdateCategories().get()
|
||||
.mapNotNull { id -> categories.find { it.id == id.toLong() } }
|
||||
.mapNotNull { id -> allCategories.find { it.id == id.toLong() } }
|
||||
.sortedBy { it.order }
|
||||
val excludedCategories = preferences.libraryUpdateCategoriesExclude().get()
|
||||
.mapNotNull { id -> categories.find { it.id == id.toLong() } }
|
||||
.mapNotNull { id -> allCategories.find { it.id == id.toLong() } }
|
||||
.sortedBy { it.order }
|
||||
|
||||
val allExcluded = excludedCategories.size == categories.size
|
||||
val allExcluded = excludedCategories.size == allCategories.size
|
||||
|
||||
val includedItemsText = when {
|
||||
// Some selected, but not all
|
||||
includedCategories.isNotEmpty() && includedCategories.size != categories.size -> includedCategories.joinToString { it.name }
|
||||
includedCategories.isNotEmpty() && includedCategories.size != allCategories.size -> includedCategories.joinToString { it.name }
|
||||
// All explicitly selected
|
||||
includedCategories.size == categories.size -> context.getString(R.string.all)
|
||||
includedCategories.size == allCategories.size -> context.getString(R.string.all)
|
||||
allExcluded -> context.getString(R.string.none)
|
||||
else -> context.getString(R.string.all)
|
||||
}
|
||||
@@ -331,10 +342,9 @@ class SettingsLibraryController : SettingsController() {
|
||||
private val getCategories: GetCategories = Injekt.get()
|
||||
|
||||
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
||||
val dbCategories = runBlocking { getCategories.await() }
|
||||
val categories = listOf(Category.default(activity!!)) + dbCategories
|
||||
val categories = runBlocking { getCategories.await() }
|
||||
|
||||
val items = categories.map { it.name }
|
||||
val items = categories.map { it.visualName(activity!!) }
|
||||
var selected = categories
|
||||
.map {
|
||||
when (it.id.toString()) {
|
||||
|
||||
Reference in New Issue
Block a user