mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-06-23 22:06:05 +02:00
![arkon](/assets/img/avatar_default.png)
- Show bar representation of used/total space - Handle all mounted storages - Also included a bunch of unrelated immutables changes, sorry
194 lines
8.7 KiB
Kotlin
194 lines
8.7 KiB
Kotlin
package eu.kanade.presentation.more.settings.screen
|
|
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.ReadOnlyComposable
|
|
import androidx.compose.runtime.collectAsState
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.saveable.rememberSaveable
|
|
import androidx.compose.runtime.setValue
|
|
import androidx.compose.ui.util.fastMap
|
|
import eu.kanade.presentation.category.visualName
|
|
import eu.kanade.presentation.more.settings.Preference
|
|
import eu.kanade.presentation.more.settings.widget.TriStateListDialog
|
|
import kotlinx.collections.immutable.persistentListOf
|
|
import kotlinx.collections.immutable.persistentMapOf
|
|
import kotlinx.collections.immutable.toImmutableMap
|
|
import kotlinx.coroutines.runBlocking
|
|
import tachiyomi.domain.category.interactor.GetCategories
|
|
import tachiyomi.domain.category.model.Category
|
|
import tachiyomi.domain.download.service.DownloadPreferences
|
|
import tachiyomi.i18n.MR
|
|
import tachiyomi.presentation.core.i18n.pluralStringResource
|
|
import tachiyomi.presentation.core.i18n.stringResource
|
|
import tachiyomi.presentation.core.util.collectAsState
|
|
import uy.kohesive.injekt.Injekt
|
|
import uy.kohesive.injekt.api.get
|
|
|
|
object SettingsDownloadScreen : SearchableSettings {
|
|
|
|
@ReadOnlyComposable
|
|
@Composable
|
|
override fun getTitleRes() = MR.strings.pref_category_downloads
|
|
|
|
@Composable
|
|
override fun getPreferences(): List<Preference> {
|
|
val getCategories = remember { Injekt.get<GetCategories>() }
|
|
val allCategories by getCategories.subscribe().collectAsState(initial = runBlocking { getCategories.await() })
|
|
|
|
val downloadPreferences = remember { Injekt.get<DownloadPreferences>() }
|
|
return listOf(
|
|
Preference.PreferenceItem.SwitchPreference(
|
|
pref = downloadPreferences.downloadOnlyOverWifi(),
|
|
title = stringResource(MR.strings.connected_to_wifi),
|
|
),
|
|
Preference.PreferenceItem.SwitchPreference(
|
|
pref = downloadPreferences.saveChaptersAsCBZ(),
|
|
title = stringResource(MR.strings.save_chapter_as_cbz),
|
|
),
|
|
Preference.PreferenceItem.SwitchPreference(
|
|
pref = downloadPreferences.splitTallImages(),
|
|
title = stringResource(MR.strings.split_tall_images),
|
|
subtitle = stringResource(MR.strings.split_tall_images_summary),
|
|
),
|
|
getDeleteChaptersGroup(
|
|
downloadPreferences = downloadPreferences,
|
|
categories = allCategories,
|
|
),
|
|
getAutoDownloadGroup(
|
|
downloadPreferences = downloadPreferences,
|
|
allCategories = allCategories,
|
|
),
|
|
getDownloadAheadGroup(downloadPreferences = downloadPreferences),
|
|
)
|
|
}
|
|
|
|
@Composable
|
|
private fun getDeleteChaptersGroup(
|
|
downloadPreferences: DownloadPreferences,
|
|
categories: List<Category>,
|
|
): Preference.PreferenceGroup {
|
|
return Preference.PreferenceGroup(
|
|
title = stringResource(MR.strings.pref_category_delete_chapters),
|
|
preferenceItems = persistentListOf(
|
|
Preference.PreferenceItem.SwitchPreference(
|
|
pref = downloadPreferences.removeAfterMarkedAsRead(),
|
|
title = stringResource(MR.strings.pref_remove_after_marked_as_read),
|
|
),
|
|
Preference.PreferenceItem.ListPreference(
|
|
pref = downloadPreferences.removeAfterReadSlots(),
|
|
title = stringResource(MR.strings.pref_remove_after_read),
|
|
entries = persistentMapOf(
|
|
-1 to stringResource(MR.strings.disabled),
|
|
0 to stringResource(MR.strings.last_read_chapter),
|
|
1 to stringResource(MR.strings.second_to_last),
|
|
2 to stringResource(MR.strings.third_to_last),
|
|
3 to stringResource(MR.strings.fourth_to_last),
|
|
4 to stringResource(MR.strings.fifth_to_last),
|
|
),
|
|
),
|
|
Preference.PreferenceItem.SwitchPreference(
|
|
pref = downloadPreferences.removeBookmarkedChapters(),
|
|
title = stringResource(MR.strings.pref_remove_bookmarked_chapters),
|
|
),
|
|
getExcludedCategoriesPreference(
|
|
downloadPreferences = downloadPreferences,
|
|
categories = { categories },
|
|
),
|
|
),
|
|
)
|
|
}
|
|
|
|
@Composable
|
|
private fun getExcludedCategoriesPreference(
|
|
downloadPreferences: DownloadPreferences,
|
|
categories: () -> List<Category>,
|
|
): Preference.PreferenceItem.MultiSelectListPreference {
|
|
return Preference.PreferenceItem.MultiSelectListPreference(
|
|
pref = downloadPreferences.removeExcludeCategories(),
|
|
title = stringResource(MR.strings.pref_remove_exclude_categories),
|
|
entries = categories()
|
|
.associate { it.id.toString() to it.visualName }
|
|
.toImmutableMap(),
|
|
)
|
|
}
|
|
|
|
@Composable
|
|
private fun getAutoDownloadGroup(
|
|
downloadPreferences: DownloadPreferences,
|
|
allCategories: List<Category>,
|
|
): Preference.PreferenceGroup {
|
|
val downloadNewChaptersPref = downloadPreferences.downloadNewChapters()
|
|
val downloadNewChapterCategoriesPref = downloadPreferences.downloadNewChapterCategories()
|
|
val downloadNewChapterCategoriesExcludePref = downloadPreferences.downloadNewChapterCategoriesExclude()
|
|
|
|
val downloadNewChapters by downloadNewChaptersPref.collectAsState()
|
|
|
|
val included by downloadNewChapterCategoriesPref.collectAsState()
|
|
val excluded by downloadNewChapterCategoriesExcludePref.collectAsState()
|
|
var showDialog by rememberSaveable { mutableStateOf(false) }
|
|
if (showDialog) {
|
|
TriStateListDialog(
|
|
title = stringResource(MR.strings.categories),
|
|
message = stringResource(MR.strings.pref_download_new_categories_details),
|
|
items = allCategories,
|
|
initialChecked = included.mapNotNull { id -> allCategories.find { it.id.toString() == id } },
|
|
initialInversed = excluded.mapNotNull { id -> allCategories.find { it.id.toString() == id } },
|
|
itemLabel = { it.visualName },
|
|
onDismissRequest = { showDialog = false },
|
|
onValueChanged = { newIncluded, newExcluded ->
|
|
downloadNewChapterCategoriesPref.set(newIncluded.fastMap { it.id.toString() }.toSet())
|
|
downloadNewChapterCategoriesExcludePref.set(newExcluded.fastMap { it.id.toString() }.toSet())
|
|
showDialog = false
|
|
},
|
|
)
|
|
}
|
|
|
|
return Preference.PreferenceGroup(
|
|
title = stringResource(MR.strings.pref_category_auto_download),
|
|
preferenceItems = persistentListOf(
|
|
Preference.PreferenceItem.SwitchPreference(
|
|
pref = downloadNewChaptersPref,
|
|
title = stringResource(MR.strings.pref_download_new),
|
|
),
|
|
Preference.PreferenceItem.TextPreference(
|
|
title = stringResource(MR.strings.categories),
|
|
subtitle = getCategoriesLabel(
|
|
allCategories = allCategories,
|
|
included = included,
|
|
excluded = excluded,
|
|
),
|
|
onClick = { showDialog = true },
|
|
enabled = downloadNewChapters,
|
|
),
|
|
),
|
|
)
|
|
}
|
|
|
|
@Composable
|
|
private fun getDownloadAheadGroup(
|
|
downloadPreferences: DownloadPreferences,
|
|
): Preference.PreferenceGroup {
|
|
return Preference.PreferenceGroup(
|
|
title = stringResource(MR.strings.download_ahead),
|
|
preferenceItems = persistentListOf(
|
|
Preference.PreferenceItem.ListPreference(
|
|
pref = downloadPreferences.autoDownloadWhileReading(),
|
|
title = stringResource(MR.strings.auto_download_while_reading),
|
|
entries = listOf(0, 2, 3, 5, 10)
|
|
.associateWith {
|
|
if (it == 0) {
|
|
stringResource(MR.strings.disabled)
|
|
} else {
|
|
pluralStringResource(MR.plurals.next_unread_chapters, count = it, it)
|
|
}
|
|
}
|
|
.toImmutableMap(),
|
|
),
|
|
Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.download_ahead_info)),
|
|
),
|
|
)
|
|
}
|
|
}
|