mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Allow excluding categories from auto-download
Closes #1412 Supersedes #4121
This commit is contained in:
		| @@ -165,6 +165,7 @@ object PreferenceKeys { | ||||
|     const val downloadNew = "download_new" | ||||
|  | ||||
|     const val downloadNewCategories = "download_new_categories" | ||||
|     const val downloadNewCategoriesExclude = "download_new_categories_exclude" | ||||
|  | ||||
|     const val libraryDisplayMode = "pref_display_mode_library" | ||||
|  | ||||
|   | ||||
| @@ -265,6 +265,7 @@ class PreferencesHelper(val context: Context) { | ||||
|     fun downloadNew() = flowPrefs.getBoolean(Keys.downloadNew, false) | ||||
|  | ||||
|     fun downloadNewCategories() = flowPrefs.getStringSet(Keys.downloadNewCategories, emptySet()) | ||||
|     fun downloadNewCategoriesExclude() = flowPrefs.getStringSet(Keys.downloadNewCategoriesExclude, emptySet()) | ||||
|  | ||||
|     fun lang() = prefs.getString(Keys.lang, "") | ||||
|  | ||||
|   | ||||
| @@ -8,9 +8,9 @@ import android.os.Bundle | ||||
| import android.os.Environment | ||||
| import androidx.core.content.ContextCompat | ||||
| import androidx.core.net.toUri | ||||
| import androidx.core.text.buildSpannedString | ||||
| import androidx.preference.PreferenceScreen | ||||
| import com.afollestad.materialdialogs.MaterialDialog | ||||
| import com.afollestad.materialdialogs.list.listItemsMultiChoice | ||||
| import com.afollestad.materialdialogs.list.listItemsSingleChoice | ||||
| import com.hippo.unifile.UniFile | ||||
| import eu.kanade.tachiyomi.R | ||||
| @@ -28,6 +28,8 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.switchPreference | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import eu.kanade.tachiyomi.widget.materialdialogs.QuadStateCheckBox | ||||
| import eu.kanade.tachiyomi.widget.materialdialogs.listItemsQuadStateMultiChoice | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import uy.kohesive.injekt.Injekt | ||||
| @@ -115,18 +117,37 @@ class SettingsDownloadController : SettingsController() { | ||||
|                 preferences.downloadNew().asImmediateFlow { isVisible = it } | ||||
|                     .launchIn(viewScope) | ||||
|  | ||||
|                 preferences.downloadNewCategories().asFlow() | ||||
|                     .onEach { mutableSet -> | ||||
|                         val selectedCategories = mutableSet | ||||
|                             .mapNotNull { id -> categories.find { it.id == id.toInt() } } | ||||
|                             .sortedBy { it.order } | ||||
|  | ||||
|                         summary = if (selectedCategories.isEmpty()) { | ||||
|                             resources?.getString(R.string.all) | ||||
|                         } else { | ||||
|                             selectedCategories.joinToString { it.name } | ||||
|                         } | ||||
|                 fun updateSummary() { | ||||
|                     val selectedCategories = preferences.downloadNewCategories().get() | ||||
|                         .mapNotNull { id -> categories.find { it.id == id.toInt() } } | ||||
|                         .sortedBy { it.order } | ||||
|                     val includedItemsText = if (selectedCategories.isEmpty()) { | ||||
|                         context.getString(R.string.all) | ||||
|                     } else { | ||||
|                         selectedCategories.joinToString { it.name } | ||||
|                     } | ||||
|  | ||||
|                     val excludedCategories = preferences.downloadNewCategoriesExclude().get() | ||||
|                         .mapNotNull { id -> categories.find { it.id == id.toInt() } } | ||||
|                         .sortedBy { it.order } | ||||
|                     val excludedItemsText = if (excludedCategories.isEmpty()) { | ||||
|                         context.getString(R.string.none) | ||||
|                     } else { | ||||
|                         excludedCategories.joinToString { it.name } | ||||
|                     } | ||||
|  | ||||
|                     summary = buildSpannedString { | ||||
|                         append(context.getString(R.string.include, includedItemsText)) | ||||
|                         appendLine() | ||||
|                         append(context.getString(R.string.exclude, excludedItemsText)) | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 preferences.downloadNewCategories().asFlow() | ||||
|                     .onEach { updateSummary() } | ||||
|                     .launchIn(viewScope) | ||||
|                 preferences.downloadNewCategoriesExclude().asFlow() | ||||
|                     .onEach { updateSummary() } | ||||
|                     .launchIn(viewScope) | ||||
|             } | ||||
|         } | ||||
| @@ -210,19 +231,34 @@ class SettingsDownloadController : SettingsController() { | ||||
|  | ||||
|             val items = categories.map { it.name } | ||||
|             val preselected = categories | ||||
|                 .filter { it.id.toString() in preferences.downloadNewCategories().get() } | ||||
|                 .map { categories.indexOf(it) } | ||||
|                 .map { | ||||
|                     when (it.id.toString()) { | ||||
|                         in preferences.downloadNewCategories().get() -> QuadStateCheckBox.State.CHECKED.ordinal | ||||
|                         in preferences.downloadNewCategoriesExclude().get() -> QuadStateCheckBox.State.INVERSED.ordinal | ||||
|                         else -> QuadStateCheckBox.State.UNCHECKED.ordinal | ||||
|                     } | ||||
|                 } | ||||
|                 .toIntArray() | ||||
|  | ||||
|             return MaterialDialog(activity!!) | ||||
|                 .title(R.string.pref_download_new_categories) | ||||
|                 .listItemsMultiChoice( | ||||
|                 .listItemsQuadStateMultiChoice( | ||||
|                     items = items, | ||||
|                     initialSelection = preselected, | ||||
|                     allowEmptySelection = true | ||||
|                 ) { _, selections, _ -> | ||||
|                     val newCategories = selections.map { categories[it] } | ||||
|                     preferences.downloadNewCategories().set(newCategories.map { it.id.toString() }.toSet()) | ||||
|                     initialSelected = preselected | ||||
|                 ) { selections -> | ||||
|                     val included = selections | ||||
|                         .mapIndexed { index, value -> if (value == QuadStateCheckBox.State.CHECKED.ordinal) index else null } | ||||
|                         .filterNotNull() | ||||
|                         .map { categories[it].id.toString() } | ||||
|                         .toSet() | ||||
|                     val excluded = selections | ||||
|                         .mapIndexed { index, value -> if (value == QuadStateCheckBox.State.INVERSED.ordinal) index else null } | ||||
|                         .filterNotNull() | ||||
|                         .map { categories[it].id.toString() } | ||||
|                         .toSet() | ||||
|  | ||||
|                     preferences.downloadNewCategories().set(included) | ||||
|                     preferences.downloadNewCategoriesExclude().set(excluded) | ||||
|                 } | ||||
|                 .positiveButton(android.R.string.ok) | ||||
|                 .negativeButton(android.R.string.cancel) | ||||
|   | ||||
| @@ -68,5 +68,8 @@ fun Manga.shouldDownloadNewChapters(db: DatabaseHelper, prefs: PreferencesHelper | ||||
|             .mapNotNull { it.id } | ||||
|             .takeUnless { it.isEmpty() } ?: listOf(0) | ||||
|  | ||||
|     val categoriesToExclude = prefs.downloadNewCategoriesExclude().get().map(String::toInt) | ||||
|     if (categoriesForManga.intersect(categoriesToExclude).isNotEmpty()) return false | ||||
|  | ||||
|     return categoriesForManga.intersect(categoriesToDownload).isNotEmpty() | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user