mirror of
https://github.com/aniyomiorg/aniyomi.git
synced 2024-11-23 21:27:40 +03:00
ktlint format
This commit is contained in:
parent
b1f728e54a
commit
6215528c9d
416 changed files with 4604 additions and 1402 deletions
|
@ -1,6 +1,6 @@
|
|||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
import java.io.FileInputStream
|
||||
import java.util.Properties
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
id("com.android.application")
|
||||
|
@ -281,7 +281,9 @@ androidComponents {
|
|||
beforeVariants { variantBuilder ->
|
||||
// Disables standardBenchmark
|
||||
if (variantBuilder.buildType == "benchmark") {
|
||||
variantBuilder.enable = variantBuilder.productFlavors.containsAll(listOf("default" to "dev"))
|
||||
variantBuilder.enable = variantBuilder.productFlavors.containsAll(
|
||||
listOf("default" to "dev")
|
||||
)
|
||||
}
|
||||
}
|
||||
onVariants(selector().withFlavor("default" to "standard")) {
|
||||
|
|
|
@ -74,7 +74,13 @@ private class BandwidthHeroDataSaver(preferences: SourcePreferences) : DataSaver
|
|||
override fun compress(imageUrl: String): String {
|
||||
return if (dataSavedServer.isNotBlank() && !imageUrl.contains(dataSavedServer)) {
|
||||
when {
|
||||
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) imageUrl else getUrl(imageUrl)
|
||||
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) {
|
||||
imageUrl
|
||||
} else {
|
||||
getUrl(
|
||||
imageUrl
|
||||
)
|
||||
}
|
||||
imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl)
|
||||
else -> getUrl(imageUrl)
|
||||
}
|
||||
|
@ -100,7 +106,13 @@ private class WsrvNlDataSaver(preferences: SourcePreferences) : DataSaver {
|
|||
|
||||
override fun compress(imageUrl: String): String {
|
||||
return when {
|
||||
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) imageUrl else getUrl(imageUrl)
|
||||
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) {
|
||||
imageUrl
|
||||
} else {
|
||||
getUrl(
|
||||
imageUrl
|
||||
)
|
||||
}
|
||||
imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl)
|
||||
else -> getUrl(imageUrl)
|
||||
}
|
||||
|
@ -108,7 +120,10 @@ private class WsrvNlDataSaver(preferences: SourcePreferences) : DataSaver {
|
|||
|
||||
private fun getUrl(imageUrl: String): String {
|
||||
// Network Request sent to wsrv
|
||||
return "https://wsrv.nl/?url=$imageUrl" + if (imageUrl.contains(".webp", true) || imageUrl.contains(".gif", true)) {
|
||||
return "https://wsrv.nl/?url=$imageUrl" + if (imageUrl.contains(".webp", true) || imageUrl.contains(
|
||||
".gif",
|
||||
true
|
||||
)) {
|
||||
if (!format) {
|
||||
// Preserve output image extension for animated images(.webp and .gif)
|
||||
"&q=$quality&n=-1"
|
||||
|
@ -140,7 +155,13 @@ private class ReSmushItDataSaver(preferences: SourcePreferences) : DataSaver {
|
|||
|
||||
override fun compress(imageUrl: String): String {
|
||||
return when {
|
||||
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) imageUrl else getUrl(imageUrl)
|
||||
imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) {
|
||||
imageUrl
|
||||
} else {
|
||||
getUrl(
|
||||
imageUrl
|
||||
)
|
||||
}
|
||||
imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl)
|
||||
else -> getUrl(imageUrl)
|
||||
}
|
||||
|
|
|
@ -20,9 +20,14 @@ class BasePreferences(
|
|||
|
||||
fun extensionInstaller() = ExtensionInstallerPreference(context, preferenceStore)
|
||||
|
||||
fun acraEnabled() = preferenceStore.getBoolean("acra.enable", isPreviewBuildType || isReleaseBuildType)
|
||||
fun acraEnabled() = preferenceStore.getBoolean(
|
||||
"acra.enable",
|
||||
isPreviewBuildType || isReleaseBuildType
|
||||
)
|
||||
|
||||
fun deviceHasPip() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && context.packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)
|
||||
fun deviceHasPip() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && context.packageManager.hasSystemFeature(
|
||||
PackageManager.FEATURE_PICTURE_IN_PICTURE
|
||||
)
|
||||
|
||||
enum class ExtensionInstaller(@StringRes val titleResId: Int) {
|
||||
LEGACY(R.string.ext_installer_legacy),
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package eu.kanade.domain.entries.anime.interactor
|
||||
|
||||
import kotlin.math.pow
|
||||
import tachiyomi.domain.entries.anime.model.Anime
|
||||
import tachiyomi.domain.entries.anime.model.AnimeUpdate
|
||||
import tachiyomi.domain.entries.anime.repository.AnimeRepository
|
||||
import kotlin.math.pow
|
||||
|
||||
class SetAnimeViewerFlags(
|
||||
private val animeRepository: AnimeRepository,
|
||||
|
|
|
@ -3,6 +3,8 @@ package eu.kanade.domain.entries.anime.interactor
|
|||
import eu.kanade.domain.entries.anime.model.hasCustomCover
|
||||
import eu.kanade.tachiyomi.animesource.model.SAnime
|
||||
import eu.kanade.tachiyomi.data.cache.AnimeCoverCache
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
import tachiyomi.domain.entries.anime.interactor.SetAnimeFetchInterval
|
||||
import tachiyomi.domain.entries.anime.model.Anime
|
||||
import tachiyomi.domain.entries.anime.model.AnimeUpdate
|
||||
|
@ -10,8 +12,6 @@ import tachiyomi.domain.entries.anime.repository.AnimeRepository
|
|||
import tachiyomi.source.local.entries.anime.isLocal
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
|
||||
class UpdateAnime(
|
||||
private val animeRepository: AnimeRepository,
|
||||
|
@ -91,7 +91,9 @@ class UpdateAnime(
|
|||
}
|
||||
|
||||
suspend fun awaitUpdateCoverLastModified(mangaId: Long): Boolean {
|
||||
return animeRepository.updateAnime(AnimeUpdate(id = mangaId, coverLastModified = Date().time))
|
||||
return animeRepository.updateAnime(
|
||||
AnimeUpdate(id = mangaId, coverLastModified = Date().time)
|
||||
)
|
||||
}
|
||||
|
||||
suspend fun awaitUpdateFavorite(animeId: Long, favorite: Boolean): Boolean {
|
||||
|
|
|
@ -3,6 +3,8 @@ package eu.kanade.domain.entries.manga.interactor
|
|||
import eu.kanade.domain.entries.manga.model.hasCustomCover
|
||||
import eu.kanade.tachiyomi.data.cache.MangaCoverCache
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
import tachiyomi.domain.entries.manga.interactor.SetMangaFetchInterval
|
||||
import tachiyomi.domain.entries.manga.model.Manga
|
||||
import tachiyomi.domain.entries.manga.model.MangaUpdate
|
||||
|
@ -10,8 +12,6 @@ import tachiyomi.domain.entries.manga.repository.MangaRepository
|
|||
import tachiyomi.source.local.entries.manga.isLocal
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
|
||||
class UpdateManga(
|
||||
private val mangaRepository: MangaRepository,
|
||||
|
@ -91,7 +91,9 @@ class UpdateManga(
|
|||
}
|
||||
|
||||
suspend fun awaitUpdateCoverLastModified(mangaId: Long): Boolean {
|
||||
return mangaRepository.updateManga(MangaUpdate(id = mangaId, coverLastModified = Date().time))
|
||||
return mangaRepository.updateManga(
|
||||
MangaUpdate(id = mangaId, coverLastModified = Date().time)
|
||||
)
|
||||
}
|
||||
|
||||
suspend fun awaitUpdateFavorite(mangaId: Long, favorite: Boolean): Boolean {
|
||||
|
|
|
@ -9,6 +9,10 @@ import eu.kanade.tachiyomi.data.download.manga.MangaDownloadProvider
|
|||
import eu.kanade.tachiyomi.source.MangaSource
|
||||
import eu.kanade.tachiyomi.source.model.SChapter
|
||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||
import java.lang.Long.max
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
import java.util.TreeSet
|
||||
import tachiyomi.data.items.chapter.ChapterSanitizer
|
||||
import tachiyomi.domain.entries.manga.model.Manga
|
||||
import tachiyomi.domain.items.chapter.interactor.GetChapterByMangaId
|
||||
|
@ -21,10 +25,6 @@ import tachiyomi.domain.items.chapter.repository.ChapterRepository
|
|||
import tachiyomi.domain.items.chapter.service.ChapterRecognition
|
||||
import tachiyomi.source.local.entries.manga.isLocal
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.lang.Long.max
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
import java.util.TreeSet
|
||||
|
||||
class SyncChaptersWithSource(
|
||||
private val downloadManager: MangaDownloadManager,
|
||||
|
@ -100,7 +100,11 @@ class SyncChaptersWithSource(
|
|||
}
|
||||
|
||||
// Recognize chapter number for the chapter.
|
||||
val chapterNumber = ChapterRecognition.parseChapterNumber(manga.title, chapter.name, chapter.chapterNumber)
|
||||
val chapterNumber = ChapterRecognition.parseChapterNumber(
|
||||
manga.title,
|
||||
chapter.name,
|
||||
chapter.chapterNumber
|
||||
)
|
||||
chapter = chapter.copy(chapterNumber = chapterNumber)
|
||||
|
||||
val dbChapter = dbChapters.find { it.url == chapter.url }
|
||||
|
@ -116,8 +120,16 @@ class SyncChaptersWithSource(
|
|||
toAdd.add(toAddChapter)
|
||||
} else {
|
||||
if (shouldUpdateDbChapter.await(dbChapter, chapter)) {
|
||||
val shouldRenameChapter = downloadProvider.isChapterDirNameChanged(dbChapter, chapter) &&
|
||||
downloadManager.isChapterDownloaded(dbChapter.name, dbChapter.scanlator, manga.title, manga.source)
|
||||
val shouldRenameChapter = downloadProvider.isChapterDirNameChanged(
|
||||
dbChapter,
|
||||
chapter
|
||||
) &&
|
||||
downloadManager.isChapterDownloaded(
|
||||
dbChapter.name,
|
||||
dbChapter.scanlator,
|
||||
manga.title,
|
||||
manga.source
|
||||
)
|
||||
|
||||
if (shouldRenameChapter) {
|
||||
downloadManager.renameChapter(source, manga, dbChapter, chapter)
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package eu.kanade.domain.items.chapter.model
|
||||
|
||||
import data.Chapters
|
||||
import eu.kanade.tachiyomi.data.database.models.manga.Chapter as DbChapter
|
||||
import eu.kanade.tachiyomi.data.database.models.manga.ChapterImpl
|
||||
import eu.kanade.tachiyomi.source.model.SChapter
|
||||
import tachiyomi.domain.items.chapter.model.Chapter
|
||||
import eu.kanade.tachiyomi.data.database.models.manga.Chapter as DbChapter
|
||||
|
||||
// TODO: Remove when all deps are migrated
|
||||
fun Chapter.toSChapter(): SChapter {
|
||||
|
|
|
@ -23,7 +23,12 @@ fun List<Chapter>.applyFilters(manga: Manga, downloadManager: MangaDownloadManag
|
|||
.filter { chapter -> applyFilter(bookmarkedFilter) { chapter.bookmark } }
|
||||
.filter { chapter ->
|
||||
applyFilter(downloadedFilter) {
|
||||
val downloaded = downloadManager.isChapterDownloaded(chapter.name, chapter.scanlator, manga.title, manga.source)
|
||||
val downloaded = downloadManager.isChapterDownloaded(
|
||||
chapter.name,
|
||||
chapter.scanlator,
|
||||
manga.title,
|
||||
manga.source
|
||||
)
|
||||
downloaded || isLocalManga
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,10 @@ import eu.kanade.tachiyomi.animesource.model.SEpisode
|
|||
import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
|
||||
import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager
|
||||
import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadProvider
|
||||
import java.lang.Long.max
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
import java.util.TreeSet
|
||||
import tachiyomi.data.items.episode.EpisodeSanitizer
|
||||
import tachiyomi.domain.entries.anime.model.Anime
|
||||
import tachiyomi.domain.items.episode.interactor.GetEpisodeByAnimeId
|
||||
|
@ -21,10 +25,6 @@ import tachiyomi.domain.items.episode.repository.EpisodeRepository
|
|||
import tachiyomi.domain.items.episode.service.EpisodeRecognition
|
||||
import tachiyomi.source.local.entries.anime.isLocal
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.lang.Long.max
|
||||
import java.time.ZonedDateTime
|
||||
import java.util.Date
|
||||
import java.util.TreeSet
|
||||
|
||||
class SyncEpisodesWithSource(
|
||||
private val downloadManager: AnimeDownloadManager,
|
||||
|
@ -100,7 +100,11 @@ class SyncEpisodesWithSource(
|
|||
}
|
||||
|
||||
// Recognize episode number for the episode.
|
||||
val episodeNumber = EpisodeRecognition.parseEpisodeNumber(anime.title, episode.name, episode.episodeNumber)
|
||||
val episodeNumber = EpisodeRecognition.parseEpisodeNumber(
|
||||
anime.title,
|
||||
episode.name,
|
||||
episode.episodeNumber
|
||||
)
|
||||
episode = episode.copy(episodeNumber = episodeNumber)
|
||||
|
||||
val dbEpisode = dbEpisodes.find { it.url == episode.url }
|
||||
|
@ -116,8 +120,16 @@ class SyncEpisodesWithSource(
|
|||
toAdd.add(toAddEpisode)
|
||||
} else {
|
||||
if (shouldUpdateDbEpisode.await(dbEpisode, episode)) {
|
||||
val shouldRenameEpisode = downloadProvider.isEpisodeDirNameChanged(dbEpisode, episode) &&
|
||||
downloadManager.isEpisodeDownloaded(dbEpisode.name, dbEpisode.scanlator, anime.title, anime.source)
|
||||
val shouldRenameEpisode = downloadProvider.isEpisodeDirNameChanged(
|
||||
dbEpisode,
|
||||
episode
|
||||
) &&
|
||||
downloadManager.isEpisodeDownloaded(
|
||||
dbEpisode.name,
|
||||
dbEpisode.scanlator,
|
||||
anime.title,
|
||||
anime.source
|
||||
)
|
||||
|
||||
if (shouldRenameEpisode) {
|
||||
downloadManager.renameEpisode(source, anime, dbEpisode, episode)
|
||||
|
@ -129,7 +141,9 @@ class SyncEpisodesWithSource(
|
|||
sourceOrder = episode.sourceOrder,
|
||||
)
|
||||
if (episode.dateUpload != 0L) {
|
||||
toChangeEpisode = toChangeEpisode.copy(dateUpload = sourceEpisode.dateUpload)
|
||||
toChangeEpisode = toChangeEpisode.copy(
|
||||
dateUpload = sourceEpisode.dateUpload
|
||||
)
|
||||
}
|
||||
toChange.add(toChangeEpisode)
|
||||
}
|
||||
|
|
|
@ -2,9 +2,9 @@ package eu.kanade.domain.items.episode.model
|
|||
|
||||
import dataanime.Episodes
|
||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||
import eu.kanade.tachiyomi.data.database.models.anime.Episode as DbEpisode
|
||||
import eu.kanade.tachiyomi.data.database.models.anime.EpisodeImpl
|
||||
import tachiyomi.domain.items.episode.model.Episode
|
||||
import eu.kanade.tachiyomi.data.database.models.anime.Episode as DbEpisode
|
||||
|
||||
// TODO: Remove when all deps are migrated
|
||||
fun Episode.toSEpisode(): SEpisode {
|
||||
|
|
|
@ -23,7 +23,12 @@ fun List<Episode>.applyFilters(anime: Anime, downloadManager: AnimeDownloadManag
|
|||
.filter { episode -> applyFilter(bookmarkedFilter) { episode.bookmark } }
|
||||
.filter { episode ->
|
||||
applyFilter(downloadedFilter) {
|
||||
val downloaded = downloadManager.isEpisodeDownloaded(episode.name, episode.scanlator, anime.title, anime.source)
|
||||
val downloaded = downloadManager.isEpisodeDownloaded(
|
||||
episode.name,
|
||||
episode.scanlator,
|
||||
anime.title,
|
||||
anime.source
|
||||
)
|
||||
downloaded || isLocalAnime
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,14 +2,14 @@ package eu.kanade.domain.source.anime.interactor
|
|||
|
||||
import eu.kanade.domain.source.service.SetMigrateSorting
|
||||
import eu.kanade.domain.source.service.SourcePreferences
|
||||
import java.text.Collator
|
||||
import java.util.Collections
|
||||
import java.util.Locale
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import tachiyomi.domain.source.anime.model.AnimeSource
|
||||
import tachiyomi.domain.source.anime.repository.AnimeSourceRepository
|
||||
import tachiyomi.source.local.entries.anime.LocalAnimeSource
|
||||
import java.text.Collator
|
||||
import java.util.Collections
|
||||
import java.util.Locale
|
||||
|
||||
class GetAnimeSourcesWithFavoriteCount(
|
||||
private val repository: AnimeSourceRepository,
|
||||
|
@ -42,7 +42,10 @@ class GetAnimeSourcesWithFavoriteCount(
|
|||
when {
|
||||
a.first.isStub && b.first.isStub.not() -> -1
|
||||
b.first.isStub && a.first.isStub.not() -> 1
|
||||
else -> collator.compare(a.first.name.lowercase(locale), b.first.name.lowercase(locale))
|
||||
else -> collator.compare(
|
||||
a.first.name.lowercase(locale),
|
||||
b.first.name.lowercase(locale)
|
||||
)
|
||||
}
|
||||
}
|
||||
SetMigrateSorting.Mode.TOTAL -> {
|
||||
|
|
|
@ -2,11 +2,11 @@ package eu.kanade.domain.source.anime.interactor
|
|||
|
||||
import eu.kanade.domain.source.service.SourcePreferences
|
||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||
import java.util.SortedMap
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import tachiyomi.domain.source.anime.model.AnimeSource
|
||||
import tachiyomi.domain.source.anime.repository.AnimeSourceRepository
|
||||
import java.util.SortedMap
|
||||
|
||||
class GetLanguagesWithAnimeSources(
|
||||
private val repository: AnimeSourceRepository,
|
||||
|
|
|
@ -21,7 +21,13 @@ class ToggleAnimeSource(
|
|||
fun await(sourceIds: List<Long>, enable: Boolean) {
|
||||
val transformedSourceIds = sourceIds.map { it.toString() }
|
||||
preferences.disabledAnimeSources().getAndSet { disabled ->
|
||||
if (enable) disabled.minus(transformedSourceIds) else disabled.plus(transformedSourceIds)
|
||||
if (enable) {
|
||||
disabled.minus(transformedSourceIds)
|
||||
} else {
|
||||
disabled.plus(
|
||||
transformedSourceIds
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,11 +2,11 @@ package eu.kanade.domain.source.manga.interactor
|
|||
|
||||
import eu.kanade.domain.source.service.SourcePreferences
|
||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||
import java.util.SortedMap
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import tachiyomi.domain.source.manga.model.Source
|
||||
import tachiyomi.domain.source.manga.repository.MangaSourceRepository
|
||||
import java.util.SortedMap
|
||||
|
||||
class GetLanguagesWithMangaSources(
|
||||
private val repository: MangaSourceRepository,
|
||||
|
|
|
@ -2,14 +2,14 @@ package eu.kanade.domain.source.manga.interactor
|
|||
|
||||
import eu.kanade.domain.source.service.SetMigrateSorting
|
||||
import eu.kanade.domain.source.service.SourcePreferences
|
||||
import java.text.Collator
|
||||
import java.util.Collections
|
||||
import java.util.Locale
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import tachiyomi.domain.source.manga.model.Source
|
||||
import tachiyomi.domain.source.manga.repository.MangaSourceRepository
|
||||
import tachiyomi.source.local.entries.manga.LocalMangaSource
|
||||
import java.text.Collator
|
||||
import java.util.Collections
|
||||
import java.util.Locale
|
||||
|
||||
class GetMangaSourcesWithFavoriteCount(
|
||||
private val repository: MangaSourceRepository,
|
||||
|
@ -42,7 +42,10 @@ class GetMangaSourcesWithFavoriteCount(
|
|||
when {
|
||||
a.first.isStub && b.first.isStub.not() -> -1
|
||||
b.first.isStub && a.first.isStub.not() -> 1
|
||||
else -> collator.compare(a.first.name.lowercase(locale), b.first.name.lowercase(locale))
|
||||
else -> collator.compare(
|
||||
a.first.name.lowercase(locale),
|
||||
b.first.name.lowercase(locale)
|
||||
)
|
||||
}
|
||||
}
|
||||
SetMigrateSorting.Mode.TOTAL -> {
|
||||
|
|
|
@ -21,7 +21,13 @@ class ToggleMangaSource(
|
|||
fun await(sourceIds: List<Long>, enable: Boolean) {
|
||||
val transformedSourceIds = sourceIds.map { it.toString() }
|
||||
preferences.disabledMangaSources().getAndSet { disabled ->
|
||||
if (enable) disabled.minus(transformedSourceIds) else disabled.plus(transformedSourceIds)
|
||||
if (enable) {
|
||||
disabled.minus(transformedSourceIds)
|
||||
} else {
|
||||
disabled.plus(
|
||||
transformedSourceIds
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,15 +11,29 @@ class SourcePreferences(
|
|||
|
||||
// Common options
|
||||
|
||||
fun sourceDisplayMode() = preferenceStore.getObject("pref_display_mode_catalogue", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize)
|
||||
fun sourceDisplayMode() = preferenceStore.getObject(
|
||||
"pref_display_mode_catalogue",
|
||||
LibraryDisplayMode.default,
|
||||
LibraryDisplayMode.Serializer::serialize,
|
||||
LibraryDisplayMode.Serializer::deserialize
|
||||
)
|
||||
|
||||
fun enabledLanguages() = preferenceStore.getStringSet("source_languages", LocaleHelper.getDefaultEnabledLanguages())
|
||||
fun enabledLanguages() = preferenceStore.getStringSet(
|
||||
"source_languages",
|
||||
LocaleHelper.getDefaultEnabledLanguages()
|
||||
)
|
||||
|
||||
fun showNsfwSource() = preferenceStore.getBoolean("show_nsfw_source", true)
|
||||
|
||||
fun migrationSortingMode() = preferenceStore.getEnum("pref_migration_sorting", SetMigrateSorting.Mode.ALPHABETICAL)
|
||||
fun migrationSortingMode() = preferenceStore.getEnum(
|
||||
"pref_migration_sorting",
|
||||
SetMigrateSorting.Mode.ALPHABETICAL
|
||||
)
|
||||
|
||||
fun migrationSortingDirection() = preferenceStore.getEnum("pref_migration_direction", SetMigrateSorting.Direction.ASCENDING)
|
||||
fun migrationSortingDirection() = preferenceStore.getEnum(
|
||||
"pref_migration_direction",
|
||||
SetMigrateSorting.Direction.ASCENDING
|
||||
)
|
||||
|
||||
fun trustedSignatures() = preferenceStore.getStringSet("trusted_signatures", emptySet())
|
||||
|
||||
|
@ -37,9 +51,15 @@ class SourcePreferences(
|
|||
fun animeExtensionUpdatesCount() = preferenceStore.getInt("animeext_updates_count", 0)
|
||||
fun mangaExtensionUpdatesCount() = preferenceStore.getInt("ext_updates_count", 0)
|
||||
|
||||
fun hideInAnimeLibraryItems() = preferenceStore.getBoolean("browse_hide_in_anime_library_items", false)
|
||||
fun hideInAnimeLibraryItems() = preferenceStore.getBoolean(
|
||||
"browse_hide_in_anime_library_items",
|
||||
false
|
||||
)
|
||||
|
||||
fun hideInMangaLibraryItems() = preferenceStore.getBoolean("browse_hide_in_library_items", false)
|
||||
fun hideInMangaLibraryItems() = preferenceStore.getBoolean(
|
||||
"browse_hide_in_library_items",
|
||||
false
|
||||
)
|
||||
|
||||
// SY -->
|
||||
|
||||
|
@ -59,7 +79,10 @@ class SourcePreferences(
|
|||
|
||||
fun dataSaverImageQuality() = preferenceStore.getInt("data_saver_image_quality", 80)
|
||||
|
||||
fun dataSaverImageFormatJpeg() = preferenceStore.getBoolean("data_saver_image_format_jpeg", false)
|
||||
fun dataSaverImageFormatJpeg() = preferenceStore.getBoolean(
|
||||
"data_saver_image_format_jpeg",
|
||||
false
|
||||
)
|
||||
|
||||
fun dataSaverServer() = preferenceStore.getString("data_saver_server", "")
|
||||
|
||||
|
|
|
@ -33,7 +33,11 @@ class RefreshAnimeTracks(
|
|||
if (service?.isLoggedIn == true) {
|
||||
val updatedTrack = service.animeService.refresh(track.toDbTrack())
|
||||
insertTrack.await(updatedTrack.toDomainTrack()!!)
|
||||
syncEpisodeProgressWithTrack.await(animeId, track, service.animeService)
|
||||
syncEpisodeProgressWithTrack.await(
|
||||
animeId,
|
||||
track,
|
||||
service.animeService
|
||||
)
|
||||
}
|
||||
null
|
||||
} catch (e: Throwable) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package eu.kanade.domain.track.anime.model
|
||||
|
||||
import tachiyomi.domain.track.anime.model.AnimeTrack
|
||||
import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack as DbAnimeTrack
|
||||
import tachiyomi.domain.track.anime.model.AnimeTrack
|
||||
|
||||
fun AnimeTrack.copyPersonalFrom(other: AnimeTrack): AnimeTrack {
|
||||
return this.copy(
|
||||
|
@ -13,7 +13,9 @@ fun AnimeTrack.copyPersonalFrom(other: AnimeTrack): AnimeTrack {
|
|||
)
|
||||
}
|
||||
|
||||
fun AnimeTrack.toDbTrack(): DbAnimeTrack = eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack.create(syncId).also {
|
||||
fun AnimeTrack.toDbTrack(): DbAnimeTrack = eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack.create(
|
||||
syncId
|
||||
).also {
|
||||
it.id = id
|
||||
it.anime_id = animeId
|
||||
it.media_id = remoteId
|
||||
|
|
|
@ -12,6 +12,8 @@ import eu.kanade.domain.track.anime.model.toDbTrack
|
|||
import eu.kanade.domain.track.anime.store.DelayedAnimeTrackingStore
|
||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||
import eu.kanade.tachiyomi.util.system.workManager
|
||||
import kotlin.time.Duration.Companion.minutes
|
||||
import kotlin.time.toJavaDuration
|
||||
import logcat.LogPriority
|
||||
import tachiyomi.core.util.lang.withIOContext
|
||||
import tachiyomi.core.util.system.logcat
|
||||
|
@ -19,8 +21,6 @@ import tachiyomi.domain.track.anime.interactor.GetAnimeTracks
|
|||
import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import kotlin.time.Duration.Companion.minutes
|
||||
import kotlin.time.toJavaDuration
|
||||
|
||||
class DelayedAnimeTrackingUpdateJob(context: Context, workerParams: WorkerParameters) :
|
||||
CoroutineWorker(context, workerParams) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package eu.kanade.domain.track.manga.model
|
||||
|
||||
import tachiyomi.domain.track.manga.model.MangaTrack
|
||||
import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack as DbMangaTrack
|
||||
import tachiyomi.domain.track.manga.model.MangaTrack
|
||||
|
||||
fun MangaTrack.copyPersonalFrom(other: MangaTrack): MangaTrack {
|
||||
return this.copy(
|
||||
|
@ -13,7 +13,9 @@ fun MangaTrack.copyPersonalFrom(other: MangaTrack): MangaTrack {
|
|||
)
|
||||
}
|
||||
|
||||
fun MangaTrack.toDbTrack(): DbMangaTrack = eu.kanade.tachiyomi.data.database.models.manga.MangaTrack.create(syncId).also {
|
||||
fun MangaTrack.toDbTrack(): DbMangaTrack = eu.kanade.tachiyomi.data.database.models.manga.MangaTrack.create(
|
||||
syncId
|
||||
).also {
|
||||
it.id = id
|
||||
it.manga_id = mangaId
|
||||
it.media_id = remoteId
|
||||
|
|
|
@ -12,6 +12,8 @@ import eu.kanade.domain.track.manga.model.toDbTrack
|
|||
import eu.kanade.domain.track.manga.store.DelayedMangaTrackingStore
|
||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||
import eu.kanade.tachiyomi.util.system.workManager
|
||||
import kotlin.time.Duration.Companion.minutes
|
||||
import kotlin.time.toJavaDuration
|
||||
import logcat.LogPriority
|
||||
import tachiyomi.core.util.lang.withIOContext
|
||||
import tachiyomi.core.util.system.logcat
|
||||
|
@ -19,8 +21,6 @@ import tachiyomi.domain.track.manga.interactor.GetMangaTracks
|
|||
import tachiyomi.domain.track.manga.interactor.InsertMangaTrack
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import kotlin.time.Duration.Companion.minutes
|
||||
import kotlin.time.toJavaDuration
|
||||
|
||||
class DelayedMangaTrackingUpdateJob(context: Context, workerParams: WorkerParameters) :
|
||||
CoroutineWorker(context, workerParams) {
|
||||
|
|
|
@ -25,7 +25,10 @@ class TrackPreferences(
|
|||
|
||||
fun trackOnAddingToLibrary() = preferenceStore.getBoolean("track_on_adding_to_library", true)
|
||||
|
||||
fun showNextEpisodeAiringTime() = preferenceStore.getBoolean("show_next_episode_airing_time", true)
|
||||
fun showNextEpisodeAiringTime() = preferenceStore.getBoolean(
|
||||
"show_next_episode_airing_time",
|
||||
true
|
||||
)
|
||||
|
||||
companion object {
|
||||
fun trackUsername(syncId: Long) = "pref_mangasync_username_$syncId"
|
||||
|
|
|
@ -6,11 +6,11 @@ import eu.kanade.domain.ui.model.TabletUiMode
|
|||
import eu.kanade.domain.ui.model.ThemeMode
|
||||
import eu.kanade.tachiyomi.util.system.DeviceUtil
|
||||
import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable
|
||||
import tachiyomi.core.preference.PreferenceStore
|
||||
import tachiyomi.core.preference.getEnum
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
import tachiyomi.core.preference.PreferenceStore
|
||||
import tachiyomi.core.preference.getEnum
|
||||
|
||||
class UiPreferences(
|
||||
private val preferenceStore: PreferenceStore,
|
||||
|
|
|
@ -25,7 +25,10 @@ fun BaseBrowseItem(
|
|||
onClick = onClickItem,
|
||||
onLongClick = onLongClickItem,
|
||||
)
|
||||
.padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small),
|
||||
.padding(
|
||||
horizontal = MaterialTheme.padding.medium,
|
||||
vertical = MaterialTheme.padding.small
|
||||
),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
icon()
|
||||
|
|
|
@ -236,7 +236,9 @@ private fun DetailsHeader(
|
|||
textAlign = TextAlign.Center,
|
||||
)
|
||||
|
||||
val strippedPkgName = extension.pkgName.substringAfter("eu.kanade.tachiyomi.animeextension.")
|
||||
val strippedPkgName = extension.pkgName.substringAfter(
|
||||
"eu.kanade.tachiyomi.animeextension."
|
||||
)
|
||||
|
||||
Text(
|
||||
text = strippedPkgName,
|
||||
|
|
|
@ -295,7 +295,10 @@ private fun AnimeExtensionItemContent(
|
|||
ProvideTextStyle(value = MaterialTheme.typography.bodySmall) {
|
||||
if (extension is AnimeExtension.Installed && extension.lang.isNotEmpty()) {
|
||||
Text(
|
||||
text = LocaleHelper.getSourceDisplayName(extension.lang, LocalContext.current),
|
||||
text = LocaleHelper.getSourceDisplayName(
|
||||
extension.lang,
|
||||
LocalContext.current
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -101,7 +101,10 @@ private fun AnimeSourceHeader(
|
|||
Text(
|
||||
text = LocaleHelper.getSourceDisplayName(language, context),
|
||||
modifier = modifier
|
||||
.padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small),
|
||||
.padding(
|
||||
horizontal = MaterialTheme.padding.medium,
|
||||
vertical = MaterialTheme.padding.small
|
||||
),
|
||||
style = MaterialTheme.typography.header,
|
||||
)
|
||||
}
|
||||
|
@ -144,7 +147,13 @@ private fun AnimeSourcePinButton(
|
|||
onClick: () -> Unit,
|
||||
) {
|
||||
val icon = if (isPinned) Icons.Filled.PushPin else Icons.Outlined.PushPin
|
||||
val tint = if (isPinned) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onBackground.copy(alpha = SecondaryItemAlpha)
|
||||
val tint = if (isPinned) {
|
||||
MaterialTheme.colorScheme.primary
|
||||
} else {
|
||||
MaterialTheme.colorScheme.onBackground.copy(
|
||||
alpha = SecondaryItemAlpha
|
||||
)
|
||||
}
|
||||
val description = if (isPinned) R.string.action_unpin else R.string.action_pin
|
||||
IconButton(onClick = onClick) {
|
||||
Icon(
|
||||
|
|
|
@ -102,14 +102,26 @@ private fun MigrateAnimeSourceList(
|
|||
|
||||
IconButton(onClick = onToggleSortingMode) {
|
||||
when (sortingMode) {
|
||||
SetMigrateSorting.Mode.ALPHABETICAL -> Icon(Icons.Outlined.SortByAlpha, contentDescription = stringResource(R.string.action_sort_alpha))
|
||||
SetMigrateSorting.Mode.TOTAL -> Icon(Icons.Outlined.Numbers, contentDescription = stringResource(R.string.action_sort_count))
|
||||
SetMigrateSorting.Mode.ALPHABETICAL -> Icon(
|
||||
Icons.Outlined.SortByAlpha,
|
||||
contentDescription = stringResource(R.string.action_sort_alpha)
|
||||
)
|
||||
SetMigrateSorting.Mode.TOTAL -> Icon(
|
||||
Icons.Outlined.Numbers,
|
||||
contentDescription = stringResource(R.string.action_sort_count)
|
||||
)
|
||||
}
|
||||
}
|
||||
IconButton(onClick = onToggleSortingDirection) {
|
||||
when (sortingDirection) {
|
||||
SetMigrateSorting.Direction.ASCENDING -> Icon(Icons.Outlined.ArrowUpward, contentDescription = stringResource(R.string.action_asc))
|
||||
SetMigrateSorting.Direction.DESCENDING -> Icon(Icons.Outlined.ArrowDownward, contentDescription = stringResource(R.string.action_desc))
|
||||
SetMigrateSorting.Direction.ASCENDING -> Icon(
|
||||
Icons.Outlined.ArrowUpward,
|
||||
contentDescription = stringResource(R.string.action_asc)
|
||||
)
|
||||
SetMigrateSorting.Direction.DESCENDING -> Icon(
|
||||
Icons.Outlined.ArrowDownward,
|
||||
contentDescription = stringResource(R.string.action_desc)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -127,7 +127,10 @@ private fun AnimeExtension.getIcon(density: Int = DisplayMetrics.DENSITY_DEFAULT
|
|||
return produceState<Result<ImageBitmap>>(initialValue = Result.Loading, this) {
|
||||
withIOContext {
|
||||
value = try {
|
||||
val appInfo = AnimeExtensionLoader.getAnimeExtensionPackageInfoFromPkgName(context, pkgName)!!.applicationInfo
|
||||
val appInfo = AnimeExtensionLoader.getAnimeExtensionPackageInfoFromPkgName(
|
||||
context,
|
||||
pkgName
|
||||
)!!.applicationInfo
|
||||
val appResources = context.packageManager.getResourcesForApplication(appInfo)
|
||||
Result.Success(
|
||||
appResources.getDrawableForDensity(appInfo.icon, density, null)!!
|
||||
|
|
|
@ -296,7 +296,10 @@ private fun ExtensionItemContent(
|
|||
ProvideTextStyle(value = MaterialTheme.typography.bodySmall) {
|
||||
if (extension is MangaExtension.Installed && extension.lang.isNotEmpty()) {
|
||||
Text(
|
||||
text = LocaleHelper.getSourceDisplayName(extension.lang, LocalContext.current),
|
||||
text = LocaleHelper.getSourceDisplayName(
|
||||
extension.lang,
|
||||
LocalContext.current
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -101,7 +101,10 @@ private fun SourceHeader(
|
|||
Text(
|
||||
text = LocaleHelper.getSourceDisplayName(language, context),
|
||||
modifier = modifier
|
||||
.padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small),
|
||||
.padding(
|
||||
horizontal = MaterialTheme.padding.medium,
|
||||
vertical = MaterialTheme.padding.small
|
||||
),
|
||||
style = MaterialTheme.typography.header,
|
||||
)
|
||||
}
|
||||
|
@ -144,7 +147,13 @@ private fun SourcePinButton(
|
|||
onClick: () -> Unit,
|
||||
) {
|
||||
val icon = if (isPinned) Icons.Filled.PushPin else Icons.Outlined.PushPin
|
||||
val tint = if (isPinned) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onBackground.copy(alpha = SecondaryItemAlpha)
|
||||
val tint = if (isPinned) {
|
||||
MaterialTheme.colorScheme.primary
|
||||
} else {
|
||||
MaterialTheme.colorScheme.onBackground.copy(
|
||||
alpha = SecondaryItemAlpha
|
||||
)
|
||||
}
|
||||
val description = if (isPinned) R.string.action_unpin else R.string.action_pin
|
||||
IconButton(onClick = onClick) {
|
||||
Icon(
|
||||
|
|
|
@ -102,14 +102,26 @@ private fun MigrateSourceList(
|
|||
|
||||
IconButton(onClick = onToggleSortingMode) {
|
||||
when (sortingMode) {
|
||||
SetMigrateSorting.Mode.ALPHABETICAL -> Icon(Icons.Outlined.SortByAlpha, contentDescription = stringResource(R.string.action_sort_alpha))
|
||||
SetMigrateSorting.Mode.TOTAL -> Icon(Icons.Outlined.Numbers, contentDescription = stringResource(R.string.action_sort_count))
|
||||
SetMigrateSorting.Mode.ALPHABETICAL -> Icon(
|
||||
Icons.Outlined.SortByAlpha,
|
||||
contentDescription = stringResource(R.string.action_sort_alpha)
|
||||
)
|
||||
SetMigrateSorting.Mode.TOTAL -> Icon(
|
||||
Icons.Outlined.Numbers,
|
||||
contentDescription = stringResource(R.string.action_sort_count)
|
||||
)
|
||||
}
|
||||
}
|
||||
IconButton(onClick = onToggleSortingDirection) {
|
||||
when (sortingDirection) {
|
||||
SetMigrateSorting.Direction.ASCENDING -> Icon(Icons.Outlined.ArrowUpward, contentDescription = stringResource(R.string.action_asc))
|
||||
SetMigrateSorting.Direction.DESCENDING -> Icon(Icons.Outlined.ArrowDownward, contentDescription = stringResource(R.string.action_desc))
|
||||
SetMigrateSorting.Direction.ASCENDING -> Icon(
|
||||
Icons.Outlined.ArrowUpward,
|
||||
contentDescription = stringResource(R.string.action_asc)
|
||||
)
|
||||
SetMigrateSorting.Direction.DESCENDING -> Icon(
|
||||
Icons.Outlined.ArrowDownward,
|
||||
contentDescription = stringResource(R.string.action_desc)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -127,7 +127,10 @@ private fun MangaExtension.getIcon(density: Int = DisplayMetrics.DENSITY_DEFAULT
|
|||
return produceState<Result<ImageBitmap>>(initialValue = Result.Loading, this) {
|
||||
withIOContext {
|
||||
value = try {
|
||||
val appInfo = MangaExtensionLoader.getMangaExtensionPackageInfoFromPkgName(context, pkgName)!!.applicationInfo
|
||||
val appInfo = MangaExtensionLoader.getMangaExtensionPackageInfoFromPkgName(
|
||||
context,
|
||||
pkgName
|
||||
)!!.applicationInfo
|
||||
val appResources = context.packageManager.getResourcesForApplication(appInfo)
|
||||
Result.Success(
|
||||
appResources.getDrawableForDensity(appInfo.icon, density, null)!!
|
||||
|
|
|
@ -48,7 +48,9 @@ fun AnimeCategoryScreen(
|
|||
CategoryContent(
|
||||
categories = state.categories,
|
||||
lazyListState = lazyListState,
|
||||
paddingValues = contentPadding + topSmallPaddingValues + PaddingValues(horizontal = MaterialTheme.padding.medium),
|
||||
paddingValues = contentPadding + topSmallPaddingValues + PaddingValues(
|
||||
horizontal = MaterialTheme.padding.medium
|
||||
),
|
||||
onClickRename = onClickRename,
|
||||
onClickHide = onClickHide,
|
||||
onClickDelete = onClickDelete,
|
||||
|
|
|
@ -48,7 +48,9 @@ fun MangaCategoryScreen(
|
|||
CategoryContent(
|
||||
categories = state.categories,
|
||||
lazyListState = lazyListState,
|
||||
paddingValues = contentPadding + topSmallPaddingValues + PaddingValues(horizontal = MaterialTheme.padding.medium),
|
||||
paddingValues = contentPadding + topSmallPaddingValues + PaddingValues(
|
||||
horizontal = MaterialTheme.padding.medium
|
||||
),
|
||||
onClickRename = onClickRename,
|
||||
onClickHide = onClickHide,
|
||||
onClickDelete = onClickDelete,
|
||||
|
|
|
@ -15,9 +15,9 @@ import androidx.compose.ui.focus.FocusRequester
|
|||
import androidx.compose.ui.focus.focusRequester
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import eu.kanade.tachiyomi.R
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlinx.coroutines.delay
|
||||
import tachiyomi.domain.category.model.Category
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
@Composable
|
||||
fun CategoryCreateDialog(
|
||||
|
|
|
@ -234,7 +234,9 @@ fun AppBarActions(
|
|||
) {
|
||||
Icon(
|
||||
Icons.Outlined.MoreVert,
|
||||
contentDescription = stringResource(R.string.abc_action_menu_overflow_description),
|
||||
contentDescription = stringResource(
|
||||
R.string.abc_action_menu_overflow_description
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -325,7 +327,9 @@ fun SearchToolbar(
|
|||
placeholder = {
|
||||
Text(
|
||||
modifier = Modifier.secondaryItemAlpha(),
|
||||
text = (placeholderText ?: stringResource(R.string.action_search_hint)),
|
||||
text = (placeholderText ?: stringResource(
|
||||
R.string.action_search_hint
|
||||
)),
|
||||
maxLines = 1,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
style = MaterialTheme.typography.titleMedium.copy(
|
||||
|
|
|
@ -7,6 +7,7 @@ import androidx.compose.material.icons.outlined.ArrowLeft
|
|||
import androidx.compose.material.icons.outlined.ArrowRight
|
||||
import androidx.compose.material.icons.outlined.RadioButtonChecked
|
||||
import androidx.compose.material.icons.outlined.RadioButtonUnchecked
|
||||
import androidx.compose.material3.DropdownMenu as ComposeDropdownMenu
|
||||
import androidx.compose.material3.DropdownMenuItem
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
|
@ -23,7 +24,6 @@ import androidx.compose.ui.unit.LayoutDirection
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.PopupProperties
|
||||
import eu.kanade.tachiyomi.R
|
||||
import androidx.compose.material3.DropdownMenu as ComposeDropdownMenu
|
||||
|
||||
@Composable
|
||||
fun DropdownMenu(
|
||||
|
|
|
@ -5,9 +5,9 @@ import androidx.compose.runtime.remember
|
|||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import eu.kanade.tachiyomi.util.lang.toRelativeString
|
||||
import tachiyomi.presentation.core.components.ListGroupHeader
|
||||
import java.text.DateFormat
|
||||
import java.util.Date
|
||||
import tachiyomi.presentation.core.components.ListGroupHeader
|
||||
|
||||
@Composable
|
||||
fun RelativeDateHeader(
|
||||
|
|
|
@ -63,7 +63,10 @@ fun TabbedDialog(
|
|||
TabRow(
|
||||
modifier = Modifier.weight(1f),
|
||||
selectedTabIndex = pagerState.currentPage,
|
||||
indicator = { TabIndicator(it[pagerState.currentPage], pagerState.currentPageOffsetFraction) },
|
||||
indicator = { TabIndicator(
|
||||
it[pagerState.currentPage],
|
||||
pagerState.currentPageOffsetFraction
|
||||
) },
|
||||
divider = {},
|
||||
) {
|
||||
tabTitles.fastForEachIndexed { i, tab ->
|
||||
|
|
|
@ -98,7 +98,10 @@ fun TabbedScreen(
|
|||
Tab(
|
||||
selected = state.currentPage == index,
|
||||
onClick = { scope.launch { state.animateScrollToPage(index) } },
|
||||
text = { TabText(text = stringResource(tab.titleRes), badgeCount = tab.badgeNumber) },
|
||||
text = { TabText(
|
||||
text = stringResource(tab.titleRes),
|
||||
badgeCount = tab.badgeNumber
|
||||
) },
|
||||
unselectedContentColor = MaterialTheme.colorScheme.onSurface,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -33,7 +33,10 @@ fun CrashScreen(
|
|||
InfoScreen(
|
||||
icon = Icons.Outlined.BugReport,
|
||||
headingText = stringResource(R.string.crash_screen_title),
|
||||
subtitleText = stringResource(R.string.crash_screen_description, stringResource(R.string.app_name)),
|
||||
subtitleText = stringResource(
|
||||
R.string.crash_screen_description,
|
||||
stringResource(R.string.app_name)
|
||||
),
|
||||
acceptText = stringResource(R.string.pref_dump_crash_logs),
|
||||
onAcceptClick = {
|
||||
scope.launch {
|
||||
|
|
|
@ -56,13 +56,13 @@ import androidx.compose.ui.unit.dp
|
|||
import eu.kanade.presentation.components.EntryDownloadDropdownMenu
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.launch
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
@Composable
|
||||
fun EntryBottomActionMenu(
|
||||
|
@ -88,7 +88,10 @@ fun EntryBottomActionMenu(
|
|||
val playerPreferences: PlayerPreferences = Injekt.get()
|
||||
Surface(
|
||||
modifier = modifier,
|
||||
shape = MaterialTheme.shapes.large.copy(bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize),
|
||||
shape = MaterialTheme.shapes.large.copy(
|
||||
bottomEnd = ZeroCornerSize,
|
||||
bottomStart = ZeroCornerSize
|
||||
),
|
||||
tonalElevation = 3.dp,
|
||||
) {
|
||||
val haptic = LocalHapticFeedback.current
|
||||
|
@ -265,7 +268,10 @@ fun LibraryBottomActionMenu(
|
|||
val scope = rememberCoroutineScope()
|
||||
Surface(
|
||||
modifier = modifier,
|
||||
shape = MaterialTheme.shapes.large.copy(bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize),
|
||||
shape = MaterialTheme.shapes.large.copy(
|
||||
bottomEnd = ZeroCornerSize,
|
||||
bottomStart = ZeroCornerSize
|
||||
),
|
||||
tonalElevation = 3.dp,
|
||||
) {
|
||||
val haptic = LocalHapticFeedback.current
|
||||
|
|
|
@ -76,6 +76,9 @@ import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreenModel
|
|||
import eu.kanade.tachiyomi.ui.entries.anime.EpisodeItem
|
||||
import eu.kanade.tachiyomi.util.lang.toRelativeString
|
||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
|
||||
import java.text.DateFormat
|
||||
import java.util.Date
|
||||
import java.util.concurrent.TimeUnit
|
||||
import kotlinx.coroutines.delay
|
||||
import tachiyomi.domain.entries.anime.model.Anime
|
||||
import tachiyomi.domain.items.episode.model.Episode
|
||||
|
@ -89,9 +92,6 @@ import tachiyomi.presentation.core.components.material.PullRefresh
|
|||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
import tachiyomi.presentation.core.util.isScrolledToEnd
|
||||
import tachiyomi.presentation.core.util.isScrollingUp
|
||||
import java.text.DateFormat
|
||||
import java.util.Date
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
@Composable
|
||||
fun AnimeScreen(
|
||||
|
@ -651,7 +651,10 @@ fun AnimeScreenLargeImpl(
|
|||
}
|
||||
Text(text = stringResource(id))
|
||||
},
|
||||
icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) },
|
||||
icon = { Icon(
|
||||
imageVector = Icons.Filled.PlayArrow,
|
||||
contentDescription = null
|
||||
) },
|
||||
onClick = onContinueWatching,
|
||||
expanded = episodeListState.isScrollingUp() || episodeListState.isScrolledToEnd(),
|
||||
)
|
||||
|
@ -883,7 +886,12 @@ private fun LazyListScope.sharedEpisodeItems(
|
|||
onEpisodeItemClick(
|
||||
episodeItem = episodeItem,
|
||||
episodes = episodes,
|
||||
onToggleSelection = { onEpisodeSelected(episodeItem, !episodeItem.selected, true, false) },
|
||||
onToggleSelection = { onEpisodeSelected(
|
||||
episodeItem,
|
||||
!episodeItem.selected,
|
||||
true,
|
||||
false
|
||||
) },
|
||||
onEpisodeClicked = onEpisodeClicked,
|
||||
)
|
||||
},
|
||||
|
|
|
@ -231,7 +231,13 @@ private fun VideoList(
|
|||
)
|
||||
|
||||
val downloadEpisode: (Boolean) -> Unit = {
|
||||
downloadManager.downloadEpisodes(anime, listOf(episode), true, it, selectedVideo)
|
||||
downloadManager.downloadEpisodes(
|
||||
anime,
|
||||
listOf(episode),
|
||||
true,
|
||||
it,
|
||||
selectedVideo
|
||||
)
|
||||
}
|
||||
|
||||
QualityOptions(
|
||||
|
@ -243,7 +249,13 @@ private fun VideoList(
|
|||
},
|
||||
onExtPlayerClicked = {
|
||||
scope.launch {
|
||||
MainActivity.startPlayerActivity(context, anime.id, episode.id, true, selectedVideo)
|
||||
MainActivity.startPlayerActivity(
|
||||
context,
|
||||
anime.id,
|
||||
episode.id,
|
||||
true,
|
||||
selectedVideo
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
|
|
|
@ -122,7 +122,9 @@ fun AnimeCoverDialog(
|
|||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Outlined.Edit,
|
||||
contentDescription = stringResource(R.string.action_edit_cover),
|
||||
contentDescription = stringResource(
|
||||
R.string.action_edit_cover
|
||||
),
|
||||
)
|
||||
}
|
||||
DropdownMenu(
|
||||
|
|
|
@ -51,13 +51,13 @@ import androidx.compose.ui.unit.sp
|
|||
import eu.kanade.presentation.entries.DotSeparatorText
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload
|
||||
import kotlin.math.absoluteValue
|
||||
import me.saket.swipe.SwipeableActionsBox
|
||||
import me.saket.swipe.rememberSwipeableActionsState
|
||||
import tachiyomi.domain.library.service.LibraryPreferences
|
||||
import tachiyomi.presentation.core.components.material.ReadItemAlpha
|
||||
import tachiyomi.presentation.core.components.material.SecondaryItemAlpha
|
||||
import tachiyomi.presentation.core.util.selectedBackground
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
@Composable
|
||||
fun AnimeEpisodeListItem(
|
||||
|
@ -156,9 +156,13 @@ fun AnimeEpisodeListItem(
|
|||
if (bookmark) {
|
||||
Icon(
|
||||
imageVector = Icons.Filled.Bookmark,
|
||||
contentDescription = stringResource(R.string.action_filter_bookmarked),
|
||||
contentDescription = stringResource(
|
||||
R.string.action_filter_bookmarked
|
||||
),
|
||||
modifier = Modifier
|
||||
.sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }),
|
||||
.sizeIn(
|
||||
maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }
|
||||
),
|
||||
tint = MaterialTheme.colorScheme.primary,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -81,13 +81,13 @@ import eu.kanade.presentation.entries.ItemCover
|
|||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.animesource.model.SAnime
|
||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
|
||||
import kotlin.math.absoluteValue
|
||||
import kotlin.math.roundToInt
|
||||
import tachiyomi.domain.entries.anime.model.Anime
|
||||
import tachiyomi.presentation.core.components.material.TextButton
|
||||
import tachiyomi.presentation.core.components.material.padding
|
||||
import tachiyomi.presentation.core.util.clickableNoIndication
|
||||
import tachiyomi.presentation.core.util.secondaryItemAlpha
|
||||
import kotlin.math.absoluteValue
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
private val whitespaceLineRegex = Regex("[\\r\\n]{2,}", setOf(RegexOption.MULTILINE))
|
||||
|
||||
|
@ -193,7 +193,11 @@ fun AnimeActionRow(
|
|||
)
|
||||
if (onEditIntervalClicked != null && fetchInterval != null) {
|
||||
AnimeActionButton(
|
||||
title = pluralStringResource(id = R.plurals.day, count = fetchInterval.absoluteValue, fetchInterval.absoluteValue),
|
||||
title = pluralStringResource(
|
||||
id = R.plurals.day,
|
||||
count = fetchInterval.absoluteValue,
|
||||
fetchInterval.absoluteValue
|
||||
),
|
||||
icon = Icons.Default.HourglassEmpty,
|
||||
color = if (isUserIntervalMode) MaterialTheme.colorScheme.primary else defaultActionButtonColor,
|
||||
onClick = onEditIntervalClicked,
|
||||
|
@ -204,7 +208,11 @@ fun AnimeActionRow(
|
|||
title = if (trackingCount == 0) {
|
||||
stringResource(R.string.manga_tracking_tab)
|
||||
} else {
|
||||
pluralStringResource(id = R.plurals.num_trackers, count = trackingCount, trackingCount)
|
||||
pluralStringResource(
|
||||
id = R.plurals.num_trackers,
|
||||
count = trackingCount,
|
||||
trackingCount
|
||||
)
|
||||
},
|
||||
icon = if (trackingCount == 0) Icons.Outlined.Sync else Icons.Outlined.Done,
|
||||
color = if (trackingCount == 0) defaultActionButtonColor else MaterialTheme.colorScheme.primary,
|
||||
|
@ -237,7 +245,9 @@ fun ExpandableAnimeDescription(
|
|||
mutableStateOf(defaultExpandState)
|
||||
}
|
||||
val desc =
|
||||
description.takeIf { !it.isNullOrBlank() } ?: stringResource(R.string.description_placeholder)
|
||||
description.takeIf { !it.isNullOrBlank() } ?: stringResource(
|
||||
R.string.description_placeholder
|
||||
)
|
||||
val trimmedDescription = remember(desc) {
|
||||
desc
|
||||
.replace(whitespaceLineRegex, "\n")
|
||||
|
@ -415,7 +425,9 @@ private fun AnimeAndSourceTitlesLarge(
|
|||
SAnime.ONGOING.toLong() -> stringResource(R.string.ongoing)
|
||||
SAnime.COMPLETED.toLong() -> stringResource(R.string.completed)
|
||||
SAnime.LICENSED.toLong() -> stringResource(R.string.licensed)
|
||||
SAnime.PUBLISHING_FINISHED.toLong() -> stringResource(R.string.publishing_finished)
|
||||
SAnime.PUBLISHING_FINISHED.toLong() -> stringResource(
|
||||
R.string.publishing_finished
|
||||
)
|
||||
SAnime.CANCELLED.toLong() -> stringResource(R.string.cancelled)
|
||||
SAnime.ON_HIATUS.toLong() -> stringResource(R.string.on_hiatus)
|
||||
else -> stringResource(R.string.unknown)
|
||||
|
@ -548,7 +560,9 @@ private fun AnimeAndSourceTitlesSmall(
|
|||
SAnime.ONGOING.toLong() -> stringResource(R.string.ongoing)
|
||||
SAnime.COMPLETED.toLong() -> stringResource(R.string.completed)
|
||||
SAnime.LICENSED.toLong() -> stringResource(R.string.licensed)
|
||||
SAnime.PUBLISHING_FINISHED.toLong() -> stringResource(R.string.publishing_finished)
|
||||
SAnime.PUBLISHING_FINISHED.toLong() -> stringResource(
|
||||
R.string.publishing_finished
|
||||
)
|
||||
SAnime.CANCELLED.toLong() -> stringResource(R.string.cancelled)
|
||||
SAnime.ON_HIATUS.toLong() -> stringResource(R.string.on_hiatus)
|
||||
else -> stringResource(R.string.unknown)
|
||||
|
@ -612,7 +626,9 @@ private fun AnimeSummary(
|
|||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
}.map { it.measure(constraints) }
|
||||
expandedHeight = expandedPlaceable.maxByOrNull { it.height }?.height?.coerceAtLeast(shrunkHeight) ?: 0
|
||||
expandedHeight = expandedPlaceable.maxByOrNull { it.height }?.height?.coerceAtLeast(
|
||||
shrunkHeight
|
||||
) ?: 0
|
||||
|
||||
val actualPlaceable = subcompose("description") {
|
||||
SelectionContainer {
|
||||
|
@ -635,9 +651,13 @@ private fun AnimeSummary(
|
|||
val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_caret_down)
|
||||
Icon(
|
||||
painter = rememberAnimatedVectorPainter(image, !expanded),
|
||||
contentDescription = stringResource(if (expanded) R.string.manga_info_collapse else R.string.manga_info_expand),
|
||||
contentDescription = stringResource(
|
||||
if (expanded) R.string.manga_info_collapse else R.string.manga_info_expand
|
||||
),
|
||||
tint = MaterialTheme.colorScheme.onBackground,
|
||||
modifier = Modifier.background(Brush.radialGradient(colors = colors.asReversed())),
|
||||
modifier = Modifier.background(
|
||||
Brush.radialGradient(colors = colors.asReversed())
|
||||
),
|
||||
)
|
||||
}
|
||||
}.map { it.measure(Constraints.fixed(width = constraints.maxWidth, height = scrimHeight)) }
|
||||
|
|
|
@ -71,6 +71,8 @@ import eu.kanade.tachiyomi.ui.entries.manga.ChapterItem
|
|||
import eu.kanade.tachiyomi.ui.entries.manga.MangaScreenModel
|
||||
import eu.kanade.tachiyomi.util.lang.toRelativeString
|
||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
|
||||
import java.text.DateFormat
|
||||
import java.util.Date
|
||||
import tachiyomi.domain.entries.manga.model.Manga
|
||||
import tachiyomi.domain.items.chapter.model.Chapter
|
||||
import tachiyomi.domain.items.service.missingItemsCount
|
||||
|
@ -83,8 +85,6 @@ import tachiyomi.presentation.core.components.material.PullRefresh
|
|||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
import tachiyomi.presentation.core.util.isScrolledToEnd
|
||||
import tachiyomi.presentation.core.util.isScrollingUp
|
||||
import java.text.DateFormat
|
||||
import java.util.Date
|
||||
|
||||
@Composable
|
||||
fun MangaScreen(
|
||||
|
@ -593,7 +593,10 @@ fun MangaScreenLargeImpl(
|
|||
}
|
||||
Text(text = stringResource(id))
|
||||
},
|
||||
icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) },
|
||||
icon = { Icon(
|
||||
imageVector = Icons.Filled.PlayArrow,
|
||||
contentDescription = null
|
||||
) },
|
||||
onClick = onContinueReading,
|
||||
expanded = chapterListState.isScrollingUp() || chapterListState.isScrolledToEnd(),
|
||||
)
|
||||
|
@ -791,7 +794,12 @@ private fun LazyListScope.sharedChapterItems(
|
|||
onChapterItemClick(
|
||||
chapterItem = chapterItem,
|
||||
chapters = chapters,
|
||||
onToggleSelection = { onChapterSelected(chapterItem, !chapterItem.selected, true, false) },
|
||||
onToggleSelection = { onChapterSelected(
|
||||
chapterItem,
|
||||
!chapterItem.selected,
|
||||
true,
|
||||
false
|
||||
) },
|
||||
onChapterClicked = onChapterClicked,
|
||||
)
|
||||
},
|
||||
|
|
|
@ -50,13 +50,13 @@ import androidx.compose.ui.unit.sp
|
|||
import eu.kanade.presentation.entries.DotSeparatorText
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload
|
||||
import kotlin.math.absoluteValue
|
||||
import me.saket.swipe.SwipeableActionsBox
|
||||
import me.saket.swipe.rememberSwipeableActionsState
|
||||
import tachiyomi.domain.library.service.LibraryPreferences
|
||||
import tachiyomi.presentation.core.components.material.ReadItemAlpha
|
||||
import tachiyomi.presentation.core.components.material.SecondaryItemAlpha
|
||||
import tachiyomi.presentation.core.util.selectedBackground
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
@Composable
|
||||
fun MangaChapterListItem(
|
||||
|
@ -155,9 +155,13 @@ fun MangaChapterListItem(
|
|||
if (bookmark) {
|
||||
Icon(
|
||||
imageVector = Icons.Filled.Bookmark,
|
||||
contentDescription = stringResource(R.string.action_filter_bookmarked),
|
||||
contentDescription = stringResource(
|
||||
R.string.action_filter_bookmarked
|
||||
),
|
||||
modifier = Modifier
|
||||
.sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }),
|
||||
.sizeIn(
|
||||
maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }
|
||||
),
|
||||
tint = MaterialTheme.colorScheme.primary,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -122,7 +122,9 @@ fun MangaCoverDialog(
|
|||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Outlined.Edit,
|
||||
contentDescription = stringResource(R.string.action_edit_cover),
|
||||
contentDescription = stringResource(
|
||||
R.string.action_edit_cover
|
||||
),
|
||||
)
|
||||
}
|
||||
DropdownMenu(
|
||||
|
|
|
@ -81,13 +81,13 @@ import eu.kanade.presentation.entries.ItemCover
|
|||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.source.model.SManga
|
||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
|
||||
import kotlin.math.absoluteValue
|
||||
import kotlin.math.roundToInt
|
||||
import tachiyomi.domain.entries.manga.model.Manga
|
||||
import tachiyomi.presentation.core.components.material.TextButton
|
||||
import tachiyomi.presentation.core.components.material.padding
|
||||
import tachiyomi.presentation.core.util.clickableNoIndication
|
||||
import tachiyomi.presentation.core.util.secondaryItemAlpha
|
||||
import kotlin.math.absoluteValue
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
private val whitespaceLineRegex = Regex("[\\r\\n]{2,}", setOf(RegexOption.MULTILINE))
|
||||
|
||||
|
@ -193,7 +193,11 @@ fun MangaActionRow(
|
|||
)
|
||||
if (onEditIntervalClicked != null && fetchInterval != null) {
|
||||
MangaActionButton(
|
||||
title = pluralStringResource(id = R.plurals.day, count = fetchInterval.absoluteValue, fetchInterval.absoluteValue),
|
||||
title = pluralStringResource(
|
||||
id = R.plurals.day,
|
||||
count = fetchInterval.absoluteValue,
|
||||
fetchInterval.absoluteValue
|
||||
),
|
||||
icon = Icons.Default.HourglassEmpty,
|
||||
color = if (isUserIntervalMode) MaterialTheme.colorScheme.primary else defaultActionButtonColor,
|
||||
onClick = onEditIntervalClicked,
|
||||
|
@ -204,7 +208,11 @@ fun MangaActionRow(
|
|||
title = if (trackingCount == 0) {
|
||||
stringResource(R.string.manga_tracking_tab)
|
||||
} else {
|
||||
pluralStringResource(id = R.plurals.num_trackers, count = trackingCount, trackingCount)
|
||||
pluralStringResource(
|
||||
id = R.plurals.num_trackers,
|
||||
count = trackingCount,
|
||||
trackingCount
|
||||
)
|
||||
},
|
||||
icon = if (trackingCount == 0) Icons.Outlined.Sync else Icons.Outlined.Done,
|
||||
color = if (trackingCount == 0) defaultActionButtonColor else MaterialTheme.colorScheme.primary,
|
||||
|
@ -237,7 +245,9 @@ fun ExpandableMangaDescription(
|
|||
mutableStateOf(defaultExpandState)
|
||||
}
|
||||
val desc =
|
||||
description.takeIf { !it.isNullOrBlank() } ?: stringResource(R.string.description_placeholder)
|
||||
description.takeIf { !it.isNullOrBlank() } ?: stringResource(
|
||||
R.string.description_placeholder
|
||||
)
|
||||
val trimmedDescription = remember(desc) {
|
||||
desc
|
||||
.replace(whitespaceLineRegex, "\n")
|
||||
|
@ -415,7 +425,9 @@ private fun MangaAndSourceTitlesLarge(
|
|||
SManga.ONGOING.toLong() -> stringResource(R.string.ongoing)
|
||||
SManga.COMPLETED.toLong() -> stringResource(R.string.completed)
|
||||
SManga.LICENSED.toLong() -> stringResource(R.string.licensed)
|
||||
SManga.PUBLISHING_FINISHED.toLong() -> stringResource(R.string.publishing_finished)
|
||||
SManga.PUBLISHING_FINISHED.toLong() -> stringResource(
|
||||
R.string.publishing_finished
|
||||
)
|
||||
SManga.CANCELLED.toLong() -> stringResource(R.string.cancelled)
|
||||
SManga.ON_HIATUS.toLong() -> stringResource(R.string.on_hiatus)
|
||||
else -> stringResource(R.string.unknown)
|
||||
|
@ -548,7 +560,9 @@ private fun MangaAndSourceTitlesSmall(
|
|||
SManga.ONGOING.toLong() -> stringResource(R.string.ongoing)
|
||||
SManga.COMPLETED.toLong() -> stringResource(R.string.completed)
|
||||
SManga.LICENSED.toLong() -> stringResource(R.string.licensed)
|
||||
SManga.PUBLISHING_FINISHED.toLong() -> stringResource(R.string.publishing_finished)
|
||||
SManga.PUBLISHING_FINISHED.toLong() -> stringResource(
|
||||
R.string.publishing_finished
|
||||
)
|
||||
SManga.CANCELLED.toLong() -> stringResource(R.string.cancelled)
|
||||
SManga.ON_HIATUS.toLong() -> stringResource(R.string.on_hiatus)
|
||||
else -> stringResource(R.string.unknown)
|
||||
|
@ -612,7 +626,9 @@ private fun MangaSummary(
|
|||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
}.map { it.measure(constraints) }
|
||||
expandedHeight = expandedPlaceable.maxByOrNull { it.height }?.height?.coerceAtLeast(shrunkHeight) ?: 0
|
||||
expandedHeight = expandedPlaceable.maxByOrNull { it.height }?.height?.coerceAtLeast(
|
||||
shrunkHeight
|
||||
) ?: 0
|
||||
|
||||
val actualPlaceable = subcompose("description") {
|
||||
SelectionContainer {
|
||||
|
@ -635,9 +651,13 @@ private fun MangaSummary(
|
|||
val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_caret_down)
|
||||
Icon(
|
||||
painter = rememberAnimatedVectorPainter(image, !expanded),
|
||||
contentDescription = stringResource(if (expanded) R.string.manga_info_collapse else R.string.manga_info_expand),
|
||||
contentDescription = stringResource(
|
||||
if (expanded) R.string.manga_info_collapse else R.string.manga_info_expand
|
||||
),
|
||||
tint = MaterialTheme.colorScheme.onBackground,
|
||||
modifier = Modifier.background(Brush.radialGradient(colors = colors.asReversed())),
|
||||
modifier = Modifier.background(
|
||||
Brush.radialGradient(colors = colors.asReversed())
|
||||
),
|
||||
)
|
||||
}
|
||||
}.map { it.measure(Constraints.fixed(width = constraints.maxWidth, height = scrimHeight)) }
|
||||
|
|
|
@ -11,7 +11,9 @@ import eu.kanade.tachiyomi.util.storage.DiskUtil
|
|||
*/
|
||||
@Composable
|
||||
fun DiskUtil.RequestStoragePermission() {
|
||||
val permissionState = rememberPermissionState(permission = Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||
val permissionState = rememberPermissionState(
|
||||
permission = Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
LaunchedEffect(Unit) {
|
||||
permissionState.launchPermissionRequest()
|
||||
}
|
||||
|
|
|
@ -9,11 +9,11 @@ import eu.kanade.domain.ui.UiPreferences
|
|||
import eu.kanade.presentation.components.RelativeDateHeader
|
||||
import eu.kanade.presentation.history.anime.AnimeHistoryItem
|
||||
import eu.kanade.presentation.history.anime.AnimeHistoryUiModel
|
||||
import java.text.DateFormat
|
||||
import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations
|
||||
import tachiyomi.presentation.core.components.FastScrollLazyColumn
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.text.DateFormat
|
||||
|
||||
@Composable
|
||||
fun AnimeHistoryContent(
|
||||
|
|
|
@ -41,7 +41,10 @@ fun AnimeHistoryItem(
|
|||
modifier = modifier
|
||||
.clickable(onClick = onClickResume)
|
||||
.height(HISTORY_ITEM_HEIGHT)
|
||||
.padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small),
|
||||
.padding(
|
||||
horizontal = MaterialTheme.padding.medium,
|
||||
vertical = MaterialTheme.padding.small
|
||||
),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
ItemCover.Book(
|
||||
|
|
|
@ -9,11 +9,11 @@ import androidx.compose.ui.Modifier
|
|||
import eu.kanade.presentation.animehistory.components.AnimeHistoryContent
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.history.anime.AnimeHistoryScreenModel
|
||||
import java.util.Date
|
||||
import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations
|
||||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
import tachiyomi.presentation.core.screens.EmptyScreen
|
||||
import tachiyomi.presentation.core.screens.LoadingScreen
|
||||
import java.util.Date
|
||||
|
||||
@Composable
|
||||
fun AnimeHistoryScreen(
|
||||
|
@ -47,7 +47,9 @@ fun AnimeHistoryScreen(
|
|||
contentPadding = contentPadding,
|
||||
onClickCover = { history -> onClickCover(history.animeId) },
|
||||
onClickResume = { history -> onClickResume(history.animeId, history.episodeId) },
|
||||
onClickDelete = { item -> onDialogChange(AnimeHistoryScreenModel.Dialog.Delete(item)) },
|
||||
onClickDelete = { item -> onDialogChange(
|
||||
AnimeHistoryScreenModel.Dialog.Delete(item)
|
||||
) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,11 +7,11 @@ import androidx.compose.runtime.remember
|
|||
import androidx.compose.ui.Modifier
|
||||
import eu.kanade.domain.ui.UiPreferences
|
||||
import eu.kanade.presentation.components.RelativeDateHeader
|
||||
import java.text.DateFormat
|
||||
import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations
|
||||
import tachiyomi.presentation.core.components.FastScrollLazyColumn
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.text.DateFormat
|
||||
|
||||
@Composable
|
||||
fun MangaHistoryContent(
|
||||
|
|
|
@ -41,7 +41,10 @@ fun MangaHistoryItem(
|
|||
modifier = modifier
|
||||
.clickable(onClick = onClickResume)
|
||||
.height(HISTORY_ITEM_HEIGHT)
|
||||
.padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small),
|
||||
.padding(
|
||||
horizontal = MaterialTheme.padding.medium,
|
||||
vertical = MaterialTheme.padding.small
|
||||
),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
ItemCover.Book(
|
||||
|
|
|
@ -8,11 +8,11 @@ import androidx.compose.runtime.Composable
|
|||
import androidx.compose.ui.Modifier
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.ui.history.manga.MangaHistoryScreenModel
|
||||
import java.util.Date
|
||||
import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations
|
||||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
import tachiyomi.presentation.core.screens.EmptyScreen
|
||||
import tachiyomi.presentation.core.screens.LoadingScreen
|
||||
import java.util.Date
|
||||
|
||||
@Composable
|
||||
fun MangaHistoryScreen(
|
||||
|
@ -46,7 +46,9 @@ fun MangaHistoryScreen(
|
|||
contentPadding = contentPadding,
|
||||
onClickCover = { history -> onClickCover(history.mangaId) },
|
||||
onClickResume = { history -> onClickResume(history.mangaId, history.chapterId) },
|
||||
onClickDelete = { item -> onDialogChange(MangaHistoryScreenModel.Dialog.Delete(item)) },
|
||||
onClickDelete = { item -> onDialogChange(
|
||||
MangaHistoryScreenModel.Dialog.Delete(item)
|
||||
) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,10 @@ fun LibraryTabs(
|
|||
ScrollableTabRow(
|
||||
selectedTabIndex = pagerState.currentPage,
|
||||
edgePadding = 0.dp,
|
||||
indicator = { TabIndicator(it[pagerState.currentPage], pagerState.currentPageOffsetFraction) },
|
||||
indicator = { TabIndicator(
|
||||
it[pagerState.currentPage],
|
||||
pagerState.currentPageOffsetFraction
|
||||
) },
|
||||
// TODO: use default when width is fixed upstream
|
||||
// https://issuetracker.google.com/issues/242879624
|
||||
divider = {},
|
||||
|
|
|
@ -18,13 +18,13 @@ import androidx.compose.ui.platform.LocalLayoutDirection
|
|||
import eu.kanade.core.preference.PreferenceMutableState
|
||||
import eu.kanade.presentation.library.LibraryTabs
|
||||
import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryItem
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import tachiyomi.domain.category.model.Category
|
||||
import tachiyomi.domain.library.anime.LibraryAnime
|
||||
import tachiyomi.domain.library.model.LibraryDisplayMode
|
||||
import tachiyomi.presentation.core.components.material.PullRefresh
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
@Composable
|
||||
fun AnimeLibraryContent(
|
||||
|
|
|
@ -115,7 +115,9 @@ private fun ColumnScope.FilterPage(
|
|||
}
|
||||
1 -> {
|
||||
val service = trackServices[0]
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedAnime(service.id.toInt()).collectAsState()
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedAnime(
|
||||
service.id.toInt()
|
||||
).collectAsState()
|
||||
TriStateItem(
|
||||
label = stringResource(R.string.action_filter_tracked),
|
||||
state = filterTracker,
|
||||
|
@ -125,7 +127,9 @@ private fun ColumnScope.FilterPage(
|
|||
else -> {
|
||||
HeadingItem(R.string.action_filter_tracked)
|
||||
trackServices.map { service ->
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedAnime(service.id.toInt()).collectAsState()
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedAnime(
|
||||
service.id.toInt()
|
||||
).collectAsState()
|
||||
TriStateItem(
|
||||
label = service.name,
|
||||
state = filterTracker,
|
||||
|
|
|
@ -18,13 +18,13 @@ import androidx.compose.ui.platform.LocalLayoutDirection
|
|||
import eu.kanade.core.preference.PreferenceMutableState
|
||||
import eu.kanade.presentation.library.LibraryTabs
|
||||
import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryItem
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import tachiyomi.domain.category.model.Category
|
||||
import tachiyomi.domain.library.manga.LibraryManga
|
||||
import tachiyomi.domain.library.model.LibraryDisplayMode
|
||||
import tachiyomi.presentation.core.components.material.PullRefresh
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
@Composable
|
||||
fun MangaLibraryContent(
|
||||
|
|
|
@ -115,7 +115,9 @@ private fun ColumnScope.FilterPage(
|
|||
}
|
||||
1 -> {
|
||||
val service = trackServices[0]
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedManga(service.id.toInt()).collectAsState()
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedManga(
|
||||
service.id.toInt()
|
||||
).collectAsState()
|
||||
TriStateItem(
|
||||
label = stringResource(R.string.action_filter_tracked),
|
||||
state = filterTracker,
|
||||
|
@ -125,7 +127,9 @@ private fun ColumnScope.FilterPage(
|
|||
else -> {
|
||||
HeadingItem(R.string.action_filter_tracked)
|
||||
trackServices.map { service ->
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedManga(service.id.toInt()).collectAsState()
|
||||
val filterTracker by screenModel.libraryPreferences.filterTrackedManga(
|
||||
service.id.toInt()
|
||||
).collectAsState()
|
||||
TriStateItem(
|
||||
label = service.name,
|
||||
state = filterTracker,
|
||||
|
|
|
@ -62,14 +62,18 @@ fun MoreScreen(
|
|||
topBar = {
|
||||
Column(
|
||||
modifier = Modifier.windowInsetsPadding(
|
||||
WindowInsets.systemBars.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal),
|
||||
WindowInsets.systemBars.only(
|
||||
WindowInsetsSides.Top + WindowInsetsSides.Horizontal
|
||||
),
|
||||
),
|
||||
) {
|
||||
if (isFDroid) {
|
||||
WarningBanner(
|
||||
textRes = R.string.fdroid_warning,
|
||||
modifier = Modifier.clickable {
|
||||
uriHandler.openUri("https://aniyomi.org/help/faq/#how-do-i-migrate-from-the-f-droid-version")
|
||||
uriHandler.openUri(
|
||||
"https://aniyomi.org/help/faq/#how-do-i-migrate-from-the-f-droid-version"
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
@ -136,17 +140,21 @@ fun MoreScreen(
|
|||
stringResource(R.string.paused)
|
||||
} else {
|
||||
"${stringResource(R.string.paused)} • ${
|
||||
pluralStringResource(
|
||||
id = R.plurals.download_queue_summary,
|
||||
count = pending,
|
||||
pending,
|
||||
)
|
||||
pluralStringResource(
|
||||
id = R.plurals.download_queue_summary,
|
||||
count = pending,
|
||||
pending,
|
||||
)
|
||||
}"
|
||||
}
|
||||
}
|
||||
is DownloadQueueState.Downloading -> {
|
||||
val pending = downloadQueueState.pending
|
||||
pluralStringResource(id = R.plurals.download_queue_summary, count = pending, pending)
|
||||
pluralStringResource(
|
||||
id = R.plurals.download_queue_summary,
|
||||
count = pending,
|
||||
pending
|
||||
)
|
||||
}
|
||||
},
|
||||
icon = Icons.Outlined.GetApp,
|
||||
|
|
|
@ -73,7 +73,9 @@ sealed class Preference {
|
|||
val entries: Map<T, String>,
|
||||
) : PreferenceItem<T>() {
|
||||
internal fun internalSet(newValue: Any) = pref.set(newValue as T)
|
||||
internal suspend fun internalOnValueChanged(newValue: Any) = onValueChanged(newValue as T)
|
||||
internal suspend fun internalOnValueChanged(newValue: Any) = onValueChanged(
|
||||
newValue as T
|
||||
)
|
||||
|
||||
@Composable
|
||||
internal fun internalSubtitleProvider(value: Any?, entries: Map<out Any?, String>) =
|
||||
|
|
|
@ -13,9 +13,9 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.util.fastForEachIndexed
|
||||
import eu.kanade.presentation.more.settings.screen.SearchableSettings
|
||||
import eu.kanade.presentation.more.settings.widget.PreferenceGroupHeader
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlinx.coroutines.delay
|
||||
import tachiyomi.presentation.core.components.ScrollbarLazyColumn
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
/**
|
||||
* Preference Screen composable which contains a list of [Preference] items
|
||||
|
|
|
@ -31,7 +31,9 @@ fun getCategoriesLabel(
|
|||
|
||||
val includedItemsText = when {
|
||||
// Some selected, but not all
|
||||
includedCategories.isNotEmpty() && includedCategories.size != allCategories.size -> includedCategories.joinToString { it.visualName(context) }
|
||||
includedCategories.isNotEmpty() && includedCategories.size != allCategories.size -> includedCategories.joinToString { it.visualName(
|
||||
context
|
||||
) }
|
||||
// All explicitly selected
|
||||
includedCategories.size == allCategories.size -> stringResource(R.string.all)
|
||||
allExcluded -> stringResource(R.string.none)
|
||||
|
|
|
@ -62,6 +62,7 @@ import eu.kanade.tachiyomi.util.system.isShizukuInstalled
|
|||
import eu.kanade.tachiyomi.util.system.powerManager
|
||||
import eu.kanade.tachiyomi.util.system.setDefaultSettings
|
||||
import eu.kanade.tachiyomi.util.system.toast
|
||||
import java.io.File
|
||||
import kotlinx.coroutines.launch
|
||||
import logcat.LogPriority
|
||||
import okhttp3.Headers
|
||||
|
@ -73,7 +74,6 @@ import tachiyomi.domain.library.service.LibraryPreferences
|
|||
import tachiyomi.presentation.core.util.collectAsState
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.io.File
|
||||
|
||||
object SettingsAdvancedScreen : SearchableSettings {
|
||||
|
||||
|
@ -175,7 +175,9 @@ object SettingsAdvancedScreen : SearchableSettings {
|
|||
}
|
||||
context.startActivity(intent)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
context.toast(R.string.battery_optimization_setting_activity_not_found)
|
||||
context.toast(
|
||||
R.string.battery_optimization_setting_activity_not_found
|
||||
)
|
||||
}
|
||||
} else {
|
||||
context.toast(R.string.battery_optimization_disabled)
|
||||
|
@ -209,13 +211,19 @@ object SettingsAdvancedScreen : SearchableSettings {
|
|||
preferenceItems = listOf(
|
||||
Preference.PreferenceItem.TextPreference(
|
||||
title = stringResource(R.string.pref_clear_chapter_cache),
|
||||
subtitle = stringResource(R.string.used_cache_both, readableAnimeSize, readableSize),
|
||||
subtitle = stringResource(
|
||||
R.string.used_cache_both,
|
||||
readableAnimeSize,
|
||||
readableSize
|
||||
),
|
||||
onClick = {
|
||||
scope.launchNonCancellable {
|
||||
try {
|
||||
val deletedFiles = chapterCache.clear() + episodeCache.clear()
|
||||
withUIContext {
|
||||
context.toast(context.getString(R.string.cache_deleted, deletedFiles))
|
||||
context.toast(
|
||||
context.getString(R.string.cache_deleted, deletedFiles)
|
||||
)
|
||||
readableSizeSema++
|
||||
}
|
||||
} catch (e: Throwable) {
|
||||
|
@ -353,8 +361,14 @@ object SettingsAdvancedScreen : SearchableSettings {
|
|||
Preference.PreferenceItem.TextPreference(
|
||||
title = stringResource(R.string.pref_refresh_library_covers),
|
||||
onClick = {
|
||||
MangaLibraryUpdateJob.startNow(context, target = MangaLibraryUpdateJob.Target.COVERS)
|
||||
AnimeLibraryUpdateJob.startNow(context, target = AnimeLibraryUpdateJob.Target.COVERS)
|
||||
MangaLibraryUpdateJob.startNow(
|
||||
context,
|
||||
target = MangaLibraryUpdateJob.Target.COVERS
|
||||
)
|
||||
AnimeLibraryUpdateJob.startNow(
|
||||
context,
|
||||
target = AnimeLibraryUpdateJob.Target.COVERS
|
||||
)
|
||||
},
|
||||
),
|
||||
Preference.PreferenceItem.TextPreference(
|
||||
|
@ -362,8 +376,14 @@ object SettingsAdvancedScreen : SearchableSettings {
|
|||
subtitle = stringResource(R.string.pref_refresh_library_tracking_summary),
|
||||
enabled = trackManager.hasLoggedServices(),
|
||||
onClick = {
|
||||
MangaLibraryUpdateJob.startNow(context, target = MangaLibraryUpdateJob.Target.TRACKING)
|
||||
AnimeLibraryUpdateJob.startNow(context, target = AnimeLibraryUpdateJob.Target.TRACKING)
|
||||
MangaLibraryUpdateJob.startNow(
|
||||
context,
|
||||
target = MangaLibraryUpdateJob.Target.TRACKING
|
||||
)
|
||||
AnimeLibraryUpdateJob.startNow(
|
||||
context,
|
||||
target = AnimeLibraryUpdateJob.Target.TRACKING
|
||||
)
|
||||
},
|
||||
),
|
||||
Preference.PreferenceItem.TextPreference(
|
||||
|
@ -401,7 +421,9 @@ object SettingsAdvancedScreen : SearchableSettings {
|
|||
AlertDialog(
|
||||
onDismissRequest = dismiss,
|
||||
title = { Text(text = stringResource(R.string.ext_installer_shizuku)) },
|
||||
text = { Text(text = stringResource(R.string.ext_installer_shizuku_unavailable_dialog)) },
|
||||
text = { Text(
|
||||
text = stringResource(R.string.ext_installer_shizuku_unavailable_dialog)
|
||||
) },
|
||||
dismissButton = {
|
||||
TextButton(onClick = dismiss) {
|
||||
Text(text = stringResource(R.string.action_cancel))
|
||||
|
|
|
@ -26,6 +26,7 @@ import eu.kanade.tachiyomi.R
|
|||
import eu.kanade.tachiyomi.ui.home.HomeScreen
|
||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||
import eu.kanade.tachiyomi.util.system.toast
|
||||
import java.util.Date
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.flow.drop
|
||||
import kotlinx.coroutines.flow.merge
|
||||
|
@ -34,7 +35,6 @@ import tachiyomi.domain.library.service.LibraryPreferences
|
|||
import tachiyomi.presentation.core.util.collectAsState
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.util.Date
|
||||
|
||||
object SettingsAppearanceScreen : SearchableSettings {
|
||||
|
||||
|
@ -122,7 +122,9 @@ object SettingsAppearanceScreen : SearchableSettings {
|
|||
uiPreferences: UiPreferences,
|
||||
): Preference.PreferenceGroup {
|
||||
val langs = remember { getLangs(context) }
|
||||
var currentLanguage by remember { mutableStateOf(AppCompatDelegate.getApplicationLocales().get(0)?.toLanguageTag() ?: "") }
|
||||
var currentLanguage by remember { mutableStateOf(
|
||||
AppCompatDelegate.getApplicationLocales().get(0)?.toLanguageTag() ?: ""
|
||||
) }
|
||||
val now = remember { Date().time }
|
||||
|
||||
LaunchedEffect(currentLanguage) {
|
||||
|
|
|
@ -197,8 +197,16 @@ object SettingsBackupScreen : SearchableSettings {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!state.isScrolledToStart()) HorizontalDivider(modifier = Modifier.align(Alignment.TopCenter))
|
||||
if (!state.isScrolledToEnd()) HorizontalDivider(modifier = Modifier.align(Alignment.BottomCenter))
|
||||
if (!state.isScrolledToStart()) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.align(Alignment.TopCenter)
|
||||
)
|
||||
}
|
||||
if (!state.isScrolledToEnd()) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.align(Alignment.BottomCenter)
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
dismissButton = {
|
||||
|
@ -282,7 +290,9 @@ object SettingsBackupScreen : SearchableSettings {
|
|||
val msg = buildString {
|
||||
append(stringResource(R.string.backup_restore_content_full))
|
||||
if (err.sources.isNotEmpty()) {
|
||||
append("\n\n").append(stringResource(R.string.backup_restore_missing_sources))
|
||||
append("\n\n").append(
|
||||
stringResource(R.string.backup_restore_missing_sources)
|
||||
)
|
||||
err.sources.joinTo(
|
||||
this,
|
||||
separator = "\n- ",
|
||||
|
@ -290,7 +300,9 @@ object SettingsBackupScreen : SearchableSettings {
|
|||
)
|
||||
}
|
||||
if (err.trackers.isNotEmpty()) {
|
||||
append("\n\n").append(stringResource(R.string.backup_restore_missing_trackers))
|
||||
append("\n\n").append(
|
||||
stringResource(R.string.backup_restore_missing_trackers)
|
||||
)
|
||||
err.trackers.joinTo(
|
||||
this,
|
||||
separator = "\n- ",
|
||||
|
@ -321,7 +333,10 @@ object SettingsBackupScreen : SearchableSettings {
|
|||
object : ActivityResultContracts.GetContent() {
|
||||
override fun createIntent(context: Context, input: String): Intent {
|
||||
val intent = super.createIntent(context, input)
|
||||
return Intent.createChooser(intent, context.getString(R.string.file_select_backup))
|
||||
return Intent.createChooser(
|
||||
intent,
|
||||
context.getString(R.string.file_select_backup)
|
||||
)
|
||||
}
|
||||
},
|
||||
) {
|
||||
|
@ -338,7 +353,11 @@ object SettingsBackupScreen : SearchableSettings {
|
|||
return@rememberLauncherForActivityResult
|
||||
}
|
||||
|
||||
error = MissingRestoreComponents(it, results.missingSources, results.missingTrackers)
|
||||
error = MissingRestoreComponents(
|
||||
it,
|
||||
results.missingSources,
|
||||
results.missingTrackers
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,9 @@ object SettingsBrowseScreen : SearchableSettings {
|
|||
)
|
||||
},
|
||||
),
|
||||
Preference.PreferenceItem.InfoPreference(stringResource(R.string.parental_controls_info)),
|
||||
Preference.PreferenceItem.InfoPreference(
|
||||
stringResource(R.string.parental_controls_info)
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
|
@ -24,6 +24,7 @@ import eu.kanade.presentation.category.visualName
|
|||
import eu.kanade.presentation.more.settings.Preference
|
||||
import eu.kanade.presentation.more.settings.widget.TriStateListDialog
|
||||
import eu.kanade.tachiyomi.R
|
||||
import java.io.File
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import tachiyomi.domain.category.anime.interactor.GetAnimeCategories
|
||||
import tachiyomi.domain.category.manga.interactor.GetMangaCategories
|
||||
|
@ -32,7 +33,6 @@ import tachiyomi.domain.download.service.DownloadPreferences
|
|||
import tachiyomi.presentation.core.util.collectAsState
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.io.File
|
||||
|
||||
object SettingsDownloadScreen : SearchableSettings {
|
||||
|
||||
|
@ -44,9 +44,13 @@ object SettingsDownloadScreen : SearchableSettings {
|
|||
@Composable
|
||||
override fun getPreferences(): List<Preference> {
|
||||
val getCategories = remember { Injekt.get<GetMangaCategories>() }
|
||||
val allCategories by getCategories.subscribe().collectAsState(initial = runBlocking { getCategories.await() })
|
||||
val allCategories by getCategories.subscribe().collectAsState(
|
||||
initial = runBlocking { getCategories.await() }
|
||||
)
|
||||
val getAnimeCategories = remember { Injekt.get<GetAnimeCategories>() }
|
||||
val allAnimeCategories by getAnimeCategories.subscribe().collectAsState(initial = runBlocking { getAnimeCategories.await() })
|
||||
val allAnimeCategories by getAnimeCategories.subscribe().collectAsState(
|
||||
initial = runBlocking { getAnimeCategories.await() }
|
||||
)
|
||||
|
||||
val downloadPreferences = remember { Injekt.get<DownloadPreferences>() }
|
||||
val basePreferences = remember { Injekt.get<BasePreferences>() }
|
||||
|
@ -82,7 +86,10 @@ object SettingsDownloadScreen : SearchableSettings {
|
|||
allAnimeCategories = allAnimeCategories,
|
||||
),
|
||||
getDownloadAheadGroup(downloadPreferences = downloadPreferences),
|
||||
getExternalDownloaderGroup(downloadPreferences = downloadPreferences, basePreferences = basePreferences),
|
||||
getExternalDownloaderGroup(
|
||||
downloadPreferences = downloadPreferences,
|
||||
basePreferences = basePreferences
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -236,8 +243,12 @@ object SettingsDownloadScreen : SearchableSettings {
|
|||
itemLabel = { it.visualName },
|
||||
onDismissRequest = { showAnimeDialog = false },
|
||||
onValueChanged = { newIncluded, newExcluded ->
|
||||
downloadNewEpisodeCategoriesPref.set(newIncluded.fastMap { it.id.toString() }.toSet())
|
||||
downloadNewEpisodeCategoriesExcludePref.set(newExcluded.fastMap { it.id.toString() }.toSet())
|
||||
downloadNewEpisodeCategoriesPref.set(
|
||||
newIncluded.fastMap { it.id.toString() }.toSet()
|
||||
)
|
||||
downloadNewEpisodeCategoriesExcludePref.set(
|
||||
newExcluded.fastMap { it.id.toString() }.toSet()
|
||||
)
|
||||
showAnimeDialog = false
|
||||
},
|
||||
)
|
||||
|
@ -262,8 +273,12 @@ object SettingsDownloadScreen : SearchableSettings {
|
|||
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())
|
||||
downloadNewChapterCategoriesPref.set(
|
||||
newIncluded.fastMap { it.id.toString() }.toSet()
|
||||
)
|
||||
downloadNewChapterCategoriesExcludePref.set(
|
||||
newExcluded.fastMap { it.id.toString() }.toSet()
|
||||
)
|
||||
showDialog = false
|
||||
},
|
||||
)
|
||||
|
@ -318,7 +333,11 @@ object SettingsDownloadScreen : SearchableSettings {
|
|||
if (it == 0) {
|
||||
stringResource(R.string.disabled)
|
||||
} else {
|
||||
pluralStringResource(id = R.plurals.next_unread_chapters, count = it, it)
|
||||
pluralStringResource(
|
||||
id = R.plurals.next_unread_chapters,
|
||||
count = it,
|
||||
it
|
||||
)
|
||||
}
|
||||
},
|
||||
),
|
||||
|
@ -329,17 +348,26 @@ object SettingsDownloadScreen : SearchableSettings {
|
|||
if (it == 0) {
|
||||
stringResource(R.string.disabled)
|
||||
} else {
|
||||
pluralStringResource(id = R.plurals.next_unseen_episodes, count = it, it)
|
||||
pluralStringResource(
|
||||
id = R.plurals.next_unseen_episodes,
|
||||
count = it,
|
||||
it
|
||||
)
|
||||
}
|
||||
},
|
||||
),
|
||||
Preference.PreferenceItem.InfoPreference(stringResource(R.string.download_ahead_info)),
|
||||
Preference.PreferenceItem.InfoPreference(
|
||||
stringResource(R.string.download_ahead_info)
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun getExternalDownloaderGroup(downloadPreferences: DownloadPreferences, basePreferences: BasePreferences): Preference.PreferenceGroup {
|
||||
private fun getExternalDownloaderGroup(
|
||||
downloadPreferences: DownloadPreferences,
|
||||
basePreferences: BasePreferences
|
||||
): Preference.PreferenceGroup {
|
||||
val useExternalDownloader = downloadPreferences.useExternalDownloader()
|
||||
val externalDownloaderPreference = downloadPreferences.externalDownloaderSelection()
|
||||
|
||||
|
|
|
@ -295,10 +295,16 @@ object SettingsLibraryScreen : SearchableSettings {
|
|||
pref = libraryPreferences.autoUpdateItemRestrictions(),
|
||||
title = stringResource(R.string.pref_library_update_manga_restriction),
|
||||
entries = mapOf(
|
||||
ENTRY_HAS_UNVIEWED to stringResource(R.string.pref_update_only_completely_read),
|
||||
ENTRY_HAS_UNVIEWED to stringResource(
|
||||
R.string.pref_update_only_completely_read
|
||||
),
|
||||
ENTRY_NON_VIEWED to stringResource(R.string.pref_update_only_started),
|
||||
ENTRY_NON_COMPLETED to stringResource(R.string.pref_update_only_non_completed),
|
||||
ENTRY_OUTSIDE_RELEASE_PERIOD to stringResource(R.string.pref_update_only_in_release_period),
|
||||
ENTRY_NON_COMPLETED to stringResource(
|
||||
R.string.pref_update_only_non_completed
|
||||
),
|
||||
ENTRY_OUTSIDE_RELEASE_PERIOD to stringResource(
|
||||
R.string.pref_update_only_in_release_period
|
||||
),
|
||||
),
|
||||
),
|
||||
Preference.PreferenceItem.SwitchPreference(
|
||||
|
@ -320,20 +326,36 @@ object SettingsLibraryScreen : SearchableSettings {
|
|||
pref = libraryPreferences.swipeChapterStartAction(),
|
||||
title = stringResource(R.string.pref_chapter_swipe_start),
|
||||
entries = mapOf(
|
||||
LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(R.string.action_disable),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(R.string.action_bookmark),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(R.string.action_mark_as_read),
|
||||
LibraryPreferences.ChapterSwipeAction.Download to stringResource(R.string.action_download),
|
||||
LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(
|
||||
R.string.action_disable
|
||||
),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(
|
||||
R.string.action_bookmark
|
||||
),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(
|
||||
R.string.action_mark_as_read
|
||||
),
|
||||
LibraryPreferences.ChapterSwipeAction.Download to stringResource(
|
||||
R.string.action_download
|
||||
),
|
||||
),
|
||||
),
|
||||
Preference.PreferenceItem.ListPreference(
|
||||
pref = libraryPreferences.swipeChapterEndAction(),
|
||||
title = stringResource(R.string.pref_chapter_swipe_end),
|
||||
entries = mapOf(
|
||||
LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(R.string.action_disable),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(R.string.action_bookmark),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(R.string.action_mark_as_read),
|
||||
LibraryPreferences.ChapterSwipeAction.Download to stringResource(R.string.action_download),
|
||||
LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(
|
||||
R.string.action_disable
|
||||
),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(
|
||||
R.string.action_bookmark
|
||||
),
|
||||
LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(
|
||||
R.string.action_mark_as_read
|
||||
),
|
||||
LibraryPreferences.ChapterSwipeAction.Download to stringResource(
|
||||
R.string.action_download
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -351,20 +373,36 @@ object SettingsLibraryScreen : SearchableSettings {
|
|||
pref = libraryPreferences.swipeEpisodeStartAction(),
|
||||
title = stringResource(R.string.pref_episode_swipe_start),
|
||||
entries = mapOf(
|
||||
LibraryPreferences.EpisodeSwipeAction.Disabled to stringResource(R.string.action_disable),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleBookmark to stringResource(R.string.action_bookmark_episode),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleSeen to stringResource(R.string.action_mark_as_seen),
|
||||
LibraryPreferences.EpisodeSwipeAction.Download to stringResource(R.string.action_download),
|
||||
LibraryPreferences.EpisodeSwipeAction.Disabled to stringResource(
|
||||
R.string.action_disable
|
||||
),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleBookmark to stringResource(
|
||||
R.string.action_bookmark_episode
|
||||
),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleSeen to stringResource(
|
||||
R.string.action_mark_as_seen
|
||||
),
|
||||
LibraryPreferences.EpisodeSwipeAction.Download to stringResource(
|
||||
R.string.action_download
|
||||
),
|
||||
),
|
||||
),
|
||||
Preference.PreferenceItem.ListPreference(
|
||||
pref = libraryPreferences.swipeEpisodeEndAction(),
|
||||
title = stringResource(R.string.pref_episode_swipe_end),
|
||||
entries = mapOf(
|
||||
LibraryPreferences.EpisodeSwipeAction.Disabled to stringResource(R.string.action_disable),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleBookmark to stringResource(R.string.action_bookmark_episode),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleSeen to stringResource(R.string.action_mark_as_seen),
|
||||
LibraryPreferences.EpisodeSwipeAction.Download to stringResource(R.string.action_download),
|
||||
LibraryPreferences.EpisodeSwipeAction.Disabled to stringResource(
|
||||
R.string.action_disable
|
||||
),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleBookmark to stringResource(
|
||||
R.string.action_bookmark_episode
|
||||
),
|
||||
LibraryPreferences.EpisodeSwipeAction.ToggleSeen to stringResource(
|
||||
R.string.action_mark_as_seen
|
||||
),
|
||||
LibraryPreferences.EpisodeSwipeAction.Download to stringResource(
|
||||
R.string.action_download
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -40,6 +40,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
|||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.graphics.ColorUtils
|
||||
import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen
|
||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||
import cafe.adriel.voyager.navigator.Navigator
|
||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||
|
@ -52,7 +53,6 @@ import eu.kanade.presentation.util.LocalBackPress
|
|||
import eu.kanade.presentation.util.Screen
|
||||
import eu.kanade.tachiyomi.R
|
||||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen
|
||||
|
||||
object SettingsMainScreen : Screen() {
|
||||
@Composable
|
||||
|
@ -146,7 +146,9 @@ object SettingsMainScreen : Screen() {
|
|||
.clip(RoundedCornerShape(24.dp))
|
||||
.then(
|
||||
if (selected) {
|
||||
Modifier.background(MaterialTheme.colorScheme.surfaceVariant)
|
||||
Modifier.background(
|
||||
MaterialTheme.colorScheme.surfaceVariant
|
||||
)
|
||||
} else {
|
||||
Modifier
|
||||
},
|
||||
|
@ -247,7 +249,9 @@ object SettingsMainScreen : Screen() {
|
|||
titleRes = R.string.pref_category_about,
|
||||
subtitleRes = 0,
|
||||
formatSubtitle = {
|
||||
"${stringResource(R.string.app_name)} ${AboutScreen.getVersionName(withBuildDate = false)}"
|
||||
"${stringResource(R.string.app_name)} ${AboutScreen.getVersionName(
|
||||
withBuildDate = false
|
||||
)}"
|
||||
},
|
||||
icon = Icons.Outlined.Info,
|
||||
screen = AboutScreen,
|
||||
|
|
|
@ -77,7 +77,10 @@ object SettingsPlayerScreen : SearchableSettings {
|
|||
getOrientationGroup(playerPreferences = playerPreferences),
|
||||
getSeekingGroup(playerPreferences = playerPreferences),
|
||||
if (deviceSupportsPip) getPipGroup(playerPreferences = playerPreferences) else null,
|
||||
getExternalPlayerGroup(playerPreferences = playerPreferences, basePreferences = basePreferences),
|
||||
getExternalPlayerGroup(
|
||||
playerPreferences = playerPreferences,
|
||||
basePreferences = basePreferences
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -147,13 +150,27 @@ object SettingsPlayerScreen : SearchableSettings {
|
|||
pref = defaultPlayerOrientationType,
|
||||
title = stringResource(R.string.pref_default_player_orientation),
|
||||
entries = mapOf(
|
||||
ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR to stringResource(R.string.rotation_free),
|
||||
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT to stringResource(R.string.rotation_portrait),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT to stringResource(R.string.rotation_reverse_portrait),
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE to stringResource(R.string.rotation_landscape),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE to stringResource(R.string.rotation_reverse_landscape),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT to stringResource(R.string.rotation_sensor_portrait),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE to stringResource(R.string.rotation_sensor_landscape),
|
||||
ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR to stringResource(
|
||||
R.string.rotation_free
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT to stringResource(
|
||||
R.string.rotation_portrait
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT to stringResource(
|
||||
R.string.rotation_reverse_portrait
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE to stringResource(
|
||||
R.string.rotation_landscape
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE to stringResource(
|
||||
R.string.rotation_reverse_landscape
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT to stringResource(
|
||||
R.string.rotation_sensor_portrait
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE to stringResource(
|
||||
R.string.rotation_sensor_landscape
|
||||
),
|
||||
),
|
||||
),
|
||||
Preference.PreferenceItem.SwitchPreference(
|
||||
|
@ -164,18 +181,30 @@ object SettingsPlayerScreen : SearchableSettings {
|
|||
pref = defaultPlayerOrientationPortrait,
|
||||
title = stringResource(R.string.pref_default_portrait_orientation),
|
||||
entries = mapOf(
|
||||
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT to stringResource(R.string.rotation_portrait),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT to stringResource(R.string.rotation_reverse_portrait),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT to stringResource(R.string.rotation_sensor_portrait),
|
||||
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT to stringResource(
|
||||
R.string.rotation_portrait
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT to stringResource(
|
||||
R.string.rotation_reverse_portrait
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT to stringResource(
|
||||
R.string.rotation_sensor_portrait
|
||||
),
|
||||
),
|
||||
),
|
||||
Preference.PreferenceItem.ListPreference(
|
||||
pref = defaultPlayerOrientationLandscape,
|
||||
title = stringResource(R.string.pref_default_landscape_orientation),
|
||||
entries = mapOf(
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE to stringResource(R.string.rotation_landscape),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE to stringResource(R.string.rotation_reverse_landscape),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE to stringResource(R.string.rotation_sensor_landscape),
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE to stringResource(
|
||||
R.string.rotation_landscape
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE to stringResource(
|
||||
R.string.rotation_reverse_landscape
|
||||
),
|
||||
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE to stringResource(
|
||||
R.string.rotation_sensor_landscape
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -309,7 +338,10 @@ object SettingsPlayerScreen : SearchableSettings {
|
|||
}
|
||||
|
||||
@Composable
|
||||
private fun getExternalPlayerGroup(playerPreferences: PlayerPreferences, basePreferences: BasePreferences): Preference.PreferenceGroup {
|
||||
private fun getExternalPlayerGroup(
|
||||
playerPreferences: PlayerPreferences,
|
||||
basePreferences: BasePreferences
|
||||
): Preference.PreferenceGroup {
|
||||
val alwaysUseExternalPlayer = playerPreferences.alwaysUseExternalPlayer()
|
||||
val externalPlayerPreference = playerPreferences.externalPlayerPreference()
|
||||
|
||||
|
|
|
@ -14,10 +14,10 @@ import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
|||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||
import eu.kanade.tachiyomi.util.system.isReleaseBuildType
|
||||
import java.text.NumberFormat
|
||||
import tachiyomi.presentation.core.util.collectAsState
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.text.NumberFormat
|
||||
|
||||
object SettingsReaderScreen : SearchableSettings {
|
||||
|
||||
|
@ -176,9 +176,15 @@ object SettingsReaderScreen : SearchableSettings {
|
|||
title = stringResource(R.string.pref_read_with_tapping_inverted),
|
||||
entries = mapOf(
|
||||
ReaderPreferences.TappingInvertMode.NONE to stringResource(R.string.none),
|
||||
ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal),
|
||||
ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical),
|
||||
ReaderPreferences.TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both),
|
||||
ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(
|
||||
R.string.tapping_inverted_horizontal
|
||||
),
|
||||
ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(
|
||||
R.string.tapping_inverted_vertical
|
||||
),
|
||||
ReaderPreferences.TappingInvertMode.BOTH to stringResource(
|
||||
R.string.tapping_inverted_both
|
||||
),
|
||||
),
|
||||
enabled = navMode != 5,
|
||||
),
|
||||
|
@ -268,9 +274,15 @@ object SettingsReaderScreen : SearchableSettings {
|
|||
title = stringResource(R.string.pref_read_with_tapping_inverted),
|
||||
entries = mapOf(
|
||||
ReaderPreferences.TappingInvertMode.NONE to stringResource(R.string.none),
|
||||
ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal),
|
||||
ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical),
|
||||
ReaderPreferences.TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both),
|
||||
ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(
|
||||
R.string.tapping_inverted_horizontal
|
||||
),
|
||||
ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(
|
||||
R.string.tapping_inverted_vertical
|
||||
),
|
||||
ReaderPreferences.TappingInvertMode.BOTH to stringResource(
|
||||
R.string.tapping_inverted_both
|
||||
),
|
||||
),
|
||||
enabled = navMode != 5,
|
||||
),
|
||||
|
@ -289,10 +301,18 @@ object SettingsReaderScreen : SearchableSettings {
|
|||
pref = readerPreferences.readerHideThreshold(),
|
||||
title = stringResource(R.string.pref_hide_threshold),
|
||||
entries = mapOf(
|
||||
ReaderPreferences.ReaderHideThreshold.HIGHEST to stringResource(R.string.pref_highest),
|
||||
ReaderPreferences.ReaderHideThreshold.HIGH to stringResource(R.string.pref_high),
|
||||
ReaderPreferences.ReaderHideThreshold.LOW to stringResource(R.string.pref_low),
|
||||
ReaderPreferences.ReaderHideThreshold.LOWEST to stringResource(R.string.pref_lowest),
|
||||
ReaderPreferences.ReaderHideThreshold.HIGHEST to stringResource(
|
||||
R.string.pref_highest
|
||||
),
|
||||
ReaderPreferences.ReaderHideThreshold.HIGH to stringResource(
|
||||
R.string.pref_high
|
||||
),
|
||||
ReaderPreferences.ReaderHideThreshold.LOW to stringResource(
|
||||
R.string.pref_low
|
||||
),
|
||||
ReaderPreferences.ReaderHideThreshold.LOWEST to stringResource(
|
||||
R.string.pref_lowest
|
||||
),
|
||||
),
|
||||
),
|
||||
Preference.PreferenceItem.SwitchPreference(
|
||||
|
|
|
@ -48,6 +48,7 @@ import androidx.compose.ui.text.input.TextFieldValue
|
|||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.LayoutDirection
|
||||
import androidx.compose.ui.unit.dp
|
||||
import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen
|
||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||
import eu.kanade.presentation.components.UpIcon
|
||||
|
@ -57,7 +58,6 @@ import eu.kanade.tachiyomi.R
|
|||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
import tachiyomi.presentation.core.screens.EmptyScreen
|
||||
import tachiyomi.presentation.core.util.runOnEnterKeyPressed
|
||||
import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen
|
||||
|
||||
class SettingsSearchScreen : Screen() {
|
||||
@Composable
|
||||
|
@ -87,7 +87,9 @@ class SettingsSearchScreen : Screen() {
|
|||
focusRequester.requestFocus()
|
||||
}
|
||||
|
||||
var textFieldValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue()) }
|
||||
var textFieldValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(
|
||||
TextFieldValue()
|
||||
) }
|
||||
Scaffold(
|
||||
topBar = {
|
||||
Column {
|
||||
|
@ -112,7 +114,9 @@ class SettingsSearchScreen : Screen() {
|
|||
.copy(color = MaterialTheme.colorScheme.onSurface),
|
||||
singleLine = true,
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
|
||||
keyboardActions = KeyboardActions(onSearch = { focusManager.clearFocus() }),
|
||||
keyboardActions = KeyboardActions(
|
||||
onSearch = { focusManager.clearFocus() }
|
||||
),
|
||||
cursorBrush = SolidColor(MaterialTheme.colorScheme.primary),
|
||||
decorationBox = {
|
||||
if (textFieldValue.text.isEmpty()) {
|
||||
|
@ -201,7 +205,11 @@ private fun SearchResult(
|
|||
SearchResultItem(
|
||||
route = settingsData.route,
|
||||
title = p.title,
|
||||
breadcrumbs = getLocalizedBreadcrumb(path = settingsData.title, node = categoryTitle, isLtr = isLtr),
|
||||
breadcrumbs = getLocalizedBreadcrumb(
|
||||
path = settingsData.title,
|
||||
node = categoryTitle,
|
||||
isLtr = isLtr
|
||||
),
|
||||
highlightKey = p.title,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -54,7 +54,11 @@ object SettingsSecurityScreen : SearchableSettings {
|
|||
when (it) {
|
||||
-1 -> stringResource(R.string.lock_never)
|
||||
0 -> stringResource(R.string.lock_always)
|
||||
else -> pluralStringResource(id = R.plurals.lock_after_mins, count = it, it)
|
||||
else -> pluralStringResource(
|
||||
id = R.plurals.lock_after_mins,
|
||||
count = it,
|
||||
it
|
||||
)
|
||||
}
|
||||
},
|
||||
onValueChanged = {
|
||||
|
|
|
@ -139,13 +139,19 @@ object SettingsTrackingScreen : SearchableSettings {
|
|||
Preference.PreferenceItem.TrackingPreference(
|
||||
title = trackManager.myAnimeList.name,
|
||||
service = trackManager.myAnimeList,
|
||||
login = { context.openInBrowser(MyAnimeListApi.authUrl(), forceDefaultBrowser = true) },
|
||||
login = { context.openInBrowser(
|
||||
MyAnimeListApi.authUrl(),
|
||||
forceDefaultBrowser = true
|
||||
) },
|
||||
logout = { dialog = LogoutDialog(trackManager.myAnimeList) },
|
||||
),
|
||||
Preference.PreferenceItem.TrackingPreference(
|
||||
title = trackManager.aniList.name,
|
||||
service = trackManager.aniList,
|
||||
login = { context.openInBrowser(AnilistApi.authUrl(), forceDefaultBrowser = true) },
|
||||
login = { context.openInBrowser(
|
||||
AnilistApi.authUrl(),
|
||||
forceDefaultBrowser = true
|
||||
) },
|
||||
logout = { dialog = LogoutDialog(trackManager.aniList) },
|
||||
),
|
||||
Preference.PreferenceItem.TrackingPreference(
|
||||
|
@ -163,19 +169,28 @@ object SettingsTrackingScreen : SearchableSettings {
|
|||
Preference.PreferenceItem.TrackingPreference(
|
||||
title = trackManager.shikimori.name,
|
||||
service = trackManager.shikimori,
|
||||
login = { context.openInBrowser(ShikimoriApi.authUrl(), forceDefaultBrowser = true) },
|
||||
login = { context.openInBrowser(
|
||||
ShikimoriApi.authUrl(),
|
||||
forceDefaultBrowser = true
|
||||
) },
|
||||
logout = { dialog = LogoutDialog(trackManager.shikimori) },
|
||||
),
|
||||
Preference.PreferenceItem.TrackingPreference(
|
||||
title = trackManager.simkl.name,
|
||||
service = trackManager.simkl,
|
||||
login = { context.openInBrowser(SimklApi.authUrl(), forceDefaultBrowser = true) },
|
||||
login = { context.openInBrowser(
|
||||
SimklApi.authUrl(),
|
||||
forceDefaultBrowser = true
|
||||
) },
|
||||
logout = { dialog = LogoutDialog(trackManager.simkl) },
|
||||
),
|
||||
Preference.PreferenceItem.TrackingPreference(
|
||||
title = trackManager.bangumi.name,
|
||||
service = trackManager.bangumi,
|
||||
login = { context.openInBrowser(BangumiApi.authUrl(), forceDefaultBrowser = true) },
|
||||
login = { context.openInBrowser(
|
||||
BangumiApi.authUrl(),
|
||||
forceDefaultBrowser = true
|
||||
) },
|
||||
logout = { dialog = LogoutDialog(trackManager.bangumi) },
|
||||
),
|
||||
Preference.PreferenceItem.InfoPreference(stringResource(R.string.tracking_info)),
|
||||
|
|
|
@ -42,6 +42,10 @@ import eu.kanade.tachiyomi.util.CrashLogUtil
|
|||
import eu.kanade.tachiyomi.util.lang.toDateTimestampString
|
||||
import eu.kanade.tachiyomi.util.system.copyToClipboard
|
||||
import eu.kanade.tachiyomi.util.system.toast
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
import java.util.TimeZone
|
||||
import kotlinx.coroutines.launch
|
||||
import logcat.LogPriority
|
||||
import tachiyomi.core.util.lang.withIOContext
|
||||
|
@ -53,10 +57,6 @@ import tachiyomi.presentation.core.components.ScrollbarLazyColumn
|
|||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
import java.util.TimeZone
|
||||
|
||||
object AboutScreen : Screen() {
|
||||
|
||||
|
@ -147,7 +147,9 @@ object AboutScreen : Screen() {
|
|||
item {
|
||||
TextPreferenceWidget(
|
||||
title = stringResource(R.string.help_translate),
|
||||
onPreferenceClick = { uriHandler.openUri("https://aniyomi.org/help/contribution/#translation") },
|
||||
onPreferenceClick = { uriHandler.openUri(
|
||||
"https://aniyomi.org/help/contribution/#translation"
|
||||
) },
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -209,7 +211,10 @@ object AboutScreen : Screen() {
|
|||
val updateChecker = AppUpdateChecker()
|
||||
withUIContext {
|
||||
try {
|
||||
when (val result = withIOContext { updateChecker.checkForUpdate(context, forceCheck = true) }) {
|
||||
when (val result = withIOContext { updateChecker.checkForUpdate(
|
||||
context,
|
||||
forceCheck = true
|
||||
) }) {
|
||||
is GetApplicationRelease.Result.NewUpdate -> {
|
||||
onAvailableUpdate(result)
|
||||
}
|
||||
|
@ -272,7 +277,9 @@ object AboutScreen : Screen() {
|
|||
)
|
||||
outputDf.timeZone = TimeZone.getDefault()
|
||||
|
||||
buildTime!!.toDateTimestampString(UiPreferences.dateFormat(Injekt.get<UiPreferences>().dateFormat().get()))
|
||||
buildTime!!.toDateTimestampString(
|
||||
UiPreferences.dateFormat(Injekt.get<UiPreferences>().dateFormat().get())
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
BuildConfig.BUILD_TIME
|
||||
}
|
||||
|
|
|
@ -144,7 +144,9 @@ class ClearAnimeDatabaseScreen : Screen() {
|
|||
source = sourceWithCount.source,
|
||||
count = sourceWithCount.count,
|
||||
isSelected = s.selection.contains(sourceWithCount.id),
|
||||
onClickSelect = { model.toggleSelection(sourceWithCount.source) },
|
||||
onClickSelect = { model.toggleSelection(
|
||||
sourceWithCount.source
|
||||
) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -205,7 +207,9 @@ class ClearAnimeDatabaseScreen : Screen() {
|
|||
}
|
||||
}
|
||||
|
||||
private class ClearAnimeDatabaseScreenModel : StateScreenModel<ClearAnimeDatabaseScreenModel.State>(State.Loading) {
|
||||
private class ClearAnimeDatabaseScreenModel : StateScreenModel<ClearAnimeDatabaseScreenModel.State>(
|
||||
State.Loading
|
||||
) {
|
||||
private val getSourcesWithNonLibraryAnime: GetAnimeSourcesWithNonLibraryAnime = Injekt.get()
|
||||
private val database: AnimeDatabase = Injekt.get()
|
||||
|
||||
|
|
|
@ -144,7 +144,9 @@ class ClearDatabaseScreen : Screen() {
|
|||
source = sourceWithCount.source,
|
||||
count = sourceWithCount.count,
|
||||
isSelected = s.selection.contains(sourceWithCount.id),
|
||||
onClickSelect = { model.toggleSelection(sourceWithCount.source) },
|
||||
onClickSelect = { model.toggleSelection(
|
||||
sourceWithCount.source
|
||||
) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -205,7 +207,9 @@ class ClearDatabaseScreen : Screen() {
|
|||
}
|
||||
}
|
||||
|
||||
private class ClearDatabaseScreenModel : StateScreenModel<ClearDatabaseScreenModel.State>(State.Loading) {
|
||||
private class ClearDatabaseScreenModel : StateScreenModel<ClearDatabaseScreenModel.State>(
|
||||
State.Loading
|
||||
) {
|
||||
private val getSourcesWithNonLibraryManga: GetMangaSourcesWithNonLibraryManga = Injekt.get()
|
||||
private val database: Database = Injekt.get()
|
||||
|
||||
|
|
|
@ -39,7 +39,9 @@ class BackupSchemaScreen : Screen() {
|
|||
val context = LocalContext.current
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
|
||||
val schema = remember { ProtoBufSchemaGenerator.generateSchemaText(Backup.serializer().descriptor) }
|
||||
val schema = remember { ProtoBufSchemaGenerator.generateSchemaText(
|
||||
Backup.serializer().descriptor
|
||||
) }
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
|
|
|
@ -75,7 +75,10 @@ class WorkerInfoScreen : Screen() {
|
|||
title = stringResource(R.string.action_copy_to_clipboard),
|
||||
icon = Icons.Default.ContentCopy,
|
||||
onClick = {
|
||||
context.copyToClipboard(title, enqueued + finished + running)
|
||||
context.copyToClipboard(
|
||||
title,
|
||||
enqueued + finished + running
|
||||
)
|
||||
},
|
||||
),
|
||||
),
|
||||
|
@ -123,7 +126,13 @@ class WorkerInfoScreen : Screen() {
|
|||
private val workManager = context.workManager
|
||||
|
||||
val finished = workManager
|
||||
.getWorkInfosLiveData(WorkQuery.fromStates(WorkInfo.State.SUCCEEDED, WorkInfo.State.FAILED, WorkInfo.State.CANCELLED))
|
||||
.getWorkInfosLiveData(
|
||||
WorkQuery.fromStates(
|
||||
WorkInfo.State.SUCCEEDED,
|
||||
WorkInfo.State.FAILED,
|
||||
WorkInfo.State.CANCELLED
|
||||
)
|
||||
)
|
||||
.asFlow()
|
||||
.map(::constructString)
|
||||
.stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "")
|
||||
|
|
|
@ -32,8 +32,8 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.unit.sp
|
||||
import eu.kanade.presentation.more.settings.LocalPreferenceHighlighted
|
||||
import eu.kanade.presentation.more.settings.LocalPreferenceMinHeight
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
@Composable
|
||||
internal fun BasePreferenceWidget(
|
||||
|
|
|
@ -69,8 +69,16 @@ fun <T> ListPreferenceWidget(
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!state.isScrolledToStart()) HorizontalDivider(modifier = Modifier.align(Alignment.TopCenter))
|
||||
if (!state.isScrolledToEnd()) HorizontalDivider(modifier = Modifier.align(Alignment.BottomCenter))
|
||||
if (!state.isScrolledToStart()) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.align(Alignment.TopCenter)
|
||||
)
|
||||
}
|
||||
if (!state.isScrolledToEnd()) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.align(Alignment.BottomCenter)
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
confirmButton = {
|
||||
|
|
|
@ -115,8 +115,16 @@ fun <T> TriStateListDialog(
|
|||
}
|
||||
}
|
||||
|
||||
if (!listState.isScrolledToStart()) HorizontalDivider(modifier = Modifier.align(Alignment.TopCenter))
|
||||
if (!listState.isScrolledToEnd()) HorizontalDivider(modifier = Modifier.align(Alignment.BottomCenter))
|
||||
if (!listState.isScrolledToStart()) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.align(Alignment.TopCenter)
|
||||
)
|
||||
}
|
||||
if (!listState.isScrolledToEnd()) {
|
||||
HorizontalDivider(
|
||||
modifier = Modifier.align(Alignment.BottomCenter)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -20,10 +20,10 @@ import eu.kanade.presentation.more.stats.components.StatsSection
|
|||
import eu.kanade.presentation.more.stats.data.StatsData
|
||||
import eu.kanade.presentation.util.toDurationString
|
||||
import eu.kanade.tachiyomi.R
|
||||
import tachiyomi.presentation.core.components.material.padding
|
||||
import java.util.Locale
|
||||
import kotlin.time.DurationUnit
|
||||
import kotlin.time.toDuration
|
||||
import tachiyomi.presentation.core.components.material.padding
|
||||
|
||||
@Composable
|
||||
fun AnimeStatsScreenContent(
|
||||
|
|
|
@ -20,10 +20,10 @@ import eu.kanade.presentation.more.stats.components.StatsSection
|
|||
import eu.kanade.presentation.more.stats.data.StatsData
|
||||
import eu.kanade.presentation.util.toDurationString
|
||||
import eu.kanade.tachiyomi.R
|
||||
import tachiyomi.presentation.core.components.material.padding
|
||||
import java.util.Locale
|
||||
import kotlin.time.DurationUnit
|
||||
import kotlin.time.toDuration
|
||||
import tachiyomi.presentation.core.components.material.padding
|
||||
|
||||
@Composable
|
||||
fun MangaStatsScreenContent(
|
||||
|
|
|
@ -19,10 +19,10 @@ import androidx.compose.ui.tooling.preview.Devices
|
|||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import eu.kanade.presentation.util.isTabletUi
|
||||
import kotlin.random.Random
|
||||
import tachiyomi.domain.category.model.Category
|
||||
import tachiyomi.presentation.core.components.material.padding
|
||||
import tachiyomi.presentation.core.screens.LoadingScreen
|
||||
import kotlin.random.Random
|
||||
|
||||
@Composable
|
||||
fun StorageScreenContent(
|
||||
|
|
|
@ -54,7 +54,9 @@ fun BottomReaderBar(
|
|||
|
||||
IconButton(onClick = onClickCropBorder) {
|
||||
Icon(
|
||||
painter = painterResource(if (cropEnabled) R.drawable.ic_crop_24dp else R.drawable.ic_crop_off_24dp),
|
||||
painter = painterResource(
|
||||
if (cropEnabled) R.drawable.ic_crop_24dp else R.drawable.ic_crop_off_24dp
|
||||
),
|
||||
contentDescription = stringResource(R.string.pref_crop_borders),
|
||||
)
|
||||
}
|
||||
|
|
|
@ -77,7 +77,9 @@ fun ChapterNavigator(
|
|||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Outlined.SkipPrevious,
|
||||
contentDescription = stringResource(if (isRtl) R.string.action_next_chapter else R.string.action_previous_chapter),
|
||||
contentDescription = stringResource(
|
||||
if (isRtl) R.string.action_next_chapter else R.string.action_previous_chapter
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -128,7 +130,9 @@ fun ChapterNavigator(
|
|||
) {
|
||||
Icon(
|
||||
imageVector = Icons.Outlined.SkipNext,
|
||||
contentDescription = stringResource(if (isRtl) R.string.action_previous_chapter else R.string.action_next_chapter),
|
||||
contentDescription = stringResource(
|
||||
if (isRtl) R.string.action_previous_chapter else R.string.action_next_chapter
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -67,7 +67,10 @@ fun ChapterTransition(
|
|||
bottomChapter = currChapter,
|
||||
bottomChapterDownloaded = currChapterDownloaded,
|
||||
fallbackLabel = stringResource(R.string.transition_no_previous),
|
||||
chapterGap = calculateChapterGap(currChapter.toDomainChapter(), goingToChapter?.toDomainChapter()),
|
||||
chapterGap = calculateChapterGap(
|
||||
currChapter.toDomainChapter(),
|
||||
goingToChapter?.toDomainChapter()
|
||||
),
|
||||
)
|
||||
}
|
||||
is ChapterTransition.Next -> {
|
||||
|
@ -79,7 +82,10 @@ fun ChapterTransition(
|
|||
bottomChapter = goingToChapter,
|
||||
bottomChapterDownloaded = goingToChapterDownloaded,
|
||||
fallbackLabel = stringResource(R.string.transition_no_next),
|
||||
chapterGap = calculateChapterGap(goingToChapter?.toDomainChapter(), currChapter.toDomainChapter()),
|
||||
chapterGap = calculateChapterGap(
|
||||
goingToChapter?.toDomainChapter(),
|
||||
currChapter.toDomainChapter()
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -193,7 +199,11 @@ private fun ChapterGapWarning(
|
|||
)
|
||||
|
||||
Text(
|
||||
text = pluralStringResource(R.plurals.missing_chapters_warning, count = gapCount, gapCount),
|
||||
text = pluralStringResource(
|
||||
R.plurals.missing_chapters_warning,
|
||||
count = gapCount,
|
||||
gapCount
|
||||
),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
}
|
||||
|
@ -312,7 +322,10 @@ private fun TransitionTextPreview() {
|
|||
TachiyomiTheme {
|
||||
Surface(modifier = Modifier.padding(48.dp)) {
|
||||
ChapterTransition(
|
||||
transition = ChapterTransition.Next(ReaderChapter(FakeChapter), ReaderChapter(FakeChapter)),
|
||||
transition = ChapterTransition.Next(
|
||||
ReaderChapter(FakeChapter),
|
||||
ReaderChapter(FakeChapter)
|
||||
),
|
||||
currChapterDownloaded = false,
|
||||
goingToChapterDownloaded = true,
|
||||
)
|
||||
|
@ -326,7 +339,10 @@ private fun TransitionTextLongTitlePreview() {
|
|||
TachiyomiTheme {
|
||||
Surface(modifier = Modifier.padding(48.dp)) {
|
||||
ChapterTransition(
|
||||
transition = ChapterTransition.Next(ReaderChapter(FakeChapterLongTitle), ReaderChapter(FakeChapter)),
|
||||
transition = ChapterTransition.Next(
|
||||
ReaderChapter(FakeChapterLongTitle),
|
||||
ReaderChapter(FakeChapter)
|
||||
),
|
||||
currChapterDownloaded = true,
|
||||
goingToChapterDownloaded = true,
|
||||
)
|
||||
|
@ -340,7 +356,10 @@ private fun TransitionTextWithGapPreview() {
|
|||
TachiyomiTheme {
|
||||
Surface(modifier = Modifier.padding(48.dp)) {
|
||||
ChapterTransition(
|
||||
transition = ChapterTransition.Next(ReaderChapter(FakeChapter), ReaderChapter(FakeGapChapter)),
|
||||
transition = ChapterTransition.Next(
|
||||
ReaderChapter(FakeChapter),
|
||||
ReaderChapter(FakeGapChapter)
|
||||
),
|
||||
currChapterDownloaded = true,
|
||||
goingToChapterDownloaded = false,
|
||||
)
|
||||
|
|
|
@ -30,7 +30,9 @@ fun OrientationModeSelectDialog(
|
|||
onChange: (Int) -> Unit,
|
||||
) {
|
||||
val manga by screenModel.mangaFlow.collectAsState()
|
||||
val orientationType = remember(manga) { OrientationType.fromPreference(manga?.orientationType?.toInt()) }
|
||||
val orientationType = remember(manga) { OrientationType.fromPreference(
|
||||
manga?.orientationType?.toInt()
|
||||
) }
|
||||
|
||||
AdaptiveSheet(
|
||||
onDismissRequest = onDismissRequest,
|
||||
|
|
|
@ -30,7 +30,9 @@ fun ReadingModeSelectDialog(
|
|||
onChange: (Int) -> Unit,
|
||||
) {
|
||||
val manga by screenModel.mangaFlow.collectAsState()
|
||||
val readingMode = remember(manga) { ReadingModeType.fromPreference(manga?.readingModeType?.toInt()) }
|
||||
val readingMode = remember(manga) { ReadingModeType.fromPreference(
|
||||
manga?.readingModeType?.toInt()
|
||||
) }
|
||||
|
||||
AdaptiveSheet(
|
||||
onDismissRequest = onDismissRequest,
|
||||
|
|
|
@ -17,12 +17,12 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel
|
|||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer
|
||||
import eu.kanade.tachiyomi.util.system.isReleaseBuildType
|
||||
import java.text.NumberFormat
|
||||
import tachiyomi.presentation.core.components.CheckboxItem
|
||||
import tachiyomi.presentation.core.components.HeadingItem
|
||||
import tachiyomi.presentation.core.components.SettingsChipRow
|
||||
import tachiyomi.presentation.core.components.SliderItem
|
||||
import tachiyomi.presentation.core.util.collectAsState
|
||||
import java.text.NumberFormat
|
||||
|
||||
private val readingModeOptions = ReadingModeType.entries.map { it.stringRes to it }
|
||||
private val orientationTypeOptions = OrientationType.entries.map { it.stringRes to it }
|
||||
|
@ -33,7 +33,9 @@ internal fun ColumnScope.ReadingModePage(screenModel: ReaderSettingsScreenModel)
|
|||
HeadingItem(R.string.pref_category_for_this_series)
|
||||
val manga by screenModel.mangaFlow.collectAsState()
|
||||
|
||||
val readingMode = remember(manga) { ReadingModeType.fromPreference(manga?.readingModeType?.toInt()) }
|
||||
val readingMode = remember(manga) { ReadingModeType.fromPreference(
|
||||
manga?.readingModeType?.toInt()
|
||||
) }
|
||||
SettingsChipRow(R.string.pref_category_reading_mode) {
|
||||
readingModeOptions.map { (stringRes, it) ->
|
||||
FilterChip(
|
||||
|
@ -44,7 +46,9 @@ internal fun ColumnScope.ReadingModePage(screenModel: ReaderSettingsScreenModel)
|
|||
}
|
||||
}
|
||||
|
||||
val orientationType = remember(manga) { OrientationType.fromPreference(manga?.orientationType?.toInt()) }
|
||||
val orientationType = remember(manga) { OrientationType.fromPreference(
|
||||
manga?.orientationType?.toInt()
|
||||
) }
|
||||
SettingsChipRow(R.string.rotation_type) {
|
||||
orientationTypeOptions.map { (stringRes, it) ->
|
||||
FilterChip(
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue