From 518831dc223df38df8cc08b7f133462924013a60 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 18:53:11 +0600 Subject: [PATCH 001/247] fix(deps): update dependency io.coil-kt.coil3:coil-bom to v3.0.0-alpha09 (#1039) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit ca784cbe3267e94e652e4c54f91b7107cc53c307) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f3190da956..16b8a2876e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -41,7 +41,7 @@ preferencektx = "androidx.preference:preference-ktx:1.2.1" injekt-core = "com.github.inorichi.injekt:injekt-core:65b0440" -coil-bom = { module = "io.coil-kt.coil3:coil-bom", version = "3.0.0-alpha08" } +coil-bom = { module = "io.coil-kt.coil3:coil-bom", version = "3.0.0-alpha09" } coil-core = { module = "io.coil-kt.coil3:coil" } coil-gif = { module = "io.coil-kt.coil3:coil-gif" } coil-compose = { module = "io.coil-kt.coil3:coil-compose" } From d9d54d14b569093862f7d34638d0f743bce22101 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+fooibar@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:09:29 +0200 Subject: [PATCH 002/247] Remove obsolete workaround Co-authored-by: FooIbar <118464521+FooIbar@users.noreply.github.com> --- settings.gradle.kts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 83d7b1191d..e47d864644 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,16 +13,6 @@ pluginManagement { mavenCentral() maven(url = "https://www.jitpack.io") } - // https://issuetracker.google.com/344363457 - // TODO: Remove when AGP's bundled R8 is updated - buildscript { - repositories { - maven("https://storage.googleapis.com/r8-releases/raw") - } - dependencies { - classpath("com.android.tools:r8:8.5.31") - } - } } dependencyResolutionManagement { From ecc492f5c9bae19f20979feb107531eb188a58a6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 15:09:53 +0200 Subject: [PATCH 003/247] chore(deps): update softprops/action-gh-release action to v2.0.8 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build_push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index 0412a954f7..2ecd96e174 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -98,7 +98,7 @@ jobs: - name: Create Release if: startsWith(github.ref, 'refs/tags/') && github.repository == 'aniyomiorg/aniyomi' - uses: softprops/action-gh-release@a74c6b72af54cfa997e81df42d94703d6313a2d0 # v2.0.6 + uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 with: tag_name: ${{ env.VERSION_TAG }} name: Aniyomi ${{ env.VERSION_TAG }} From a2c6335adfdd1f1da2a127bf9ad7fb312d963d08 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 01:14:44 +0600 Subject: [PATCH 004/247] fix(deps): update dependency androidx.activity:activity-compose to v1.9.1 (#1042) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit e48dbdbf2356c0e6e148313dc6610e865cd8e995) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index ea9e52efde..2e64c51b59 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -3,7 +3,7 @@ compose-bom = "2024.07.00-alpha01" accompanist = "0.35.1-alpha" [libraries] -activity = "androidx.activity:activity-compose:1.9.0" +activity = "androidx.activity:activity-compose:1.9.1" bom = { group = "dev.chrisbanes.compose", name = "compose-bom", version.ref = "compose-bom" } foundation = { module = "androidx.compose.foundation:foundation" } animation = { module = "androidx.compose.animation:animation" } From 3f7401465d6dc78e9793caf41ff4cc878d77fa71 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 01:15:21 +0600 Subject: [PATCH 005/247] fix(deps): update dependency androidx.annotation:annotation to v1.8.1 (#1043) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 602b58f364b95b83a3148be34cd4c90d95d7d405) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 0e6a06d151..926dd49480 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -7,7 +7,7 @@ interpolator_version = "1.0.0" [libraries] gradle = { module = "com.android.tools.build:gradle", version.ref = "agp_version" } -annotation = "androidx.annotation:annotation:1.8.0" +annotation = "androidx.annotation:annotation:1.8.1" appcompat = "androidx.appcompat:appcompat:1.7.0" biometricktx = "androidx.biometric:biometric-ktx:1.2.0-alpha05" constraintlayout = "androidx.constraintlayout:constraintlayout:2.1.4" From d7457e4436f69f6950b44092beed80fb442ccba9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 21:35:38 +0600 Subject: [PATCH 006/247] fix(deps): update lifecycle.version to v2.8.4 (#1045) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit b7849d714698900a25188bdbfd77bf24936f2dd7) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 926dd49480..ff0d3f46ec 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,6 +1,6 @@ [versions] agp_version = "8.5.1" -lifecycle_version = "2.8.3" +lifecycle_version = "2.8.4" paging_version = "3.3.0" interpolator_version = "1.0.0" From 0d712f8df46aa66e0330a73598846ba229b41cf6 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 18 Sep 2024 08:54:02 +0200 Subject: [PATCH 007/247] Format Category String on Subtitle Display * Fixes #1029 * Max Line Length Fix * Update SettingsLibraryScreen.kt No idea how this works. Co-authored-by: Foolbar <118464521+Foolbar@users.noreply.github.com> --------- Co-authored-by: Foolbar <118464521+Foolbar@users.noreply.github.com> Co-authored-by: Roshan Varughese <40583749+Animeboynz@users.noreply.github.com> --- .../more/settings/screen/SettingsLibraryScreen.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt index caa1ca1588..9ac42ce876 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt @@ -85,12 +85,6 @@ object SettingsLibraryScreen : SearchableSettings { val userCategoriesCount = allCategories.filterNot(Category::isSystemCategory).size val userAnimeCategoriesCount = allAnimeCategories.filterNot(Category::isSystemCategory).size - val defaultCategory by libraryPreferences.defaultMangaCategory().collectAsState() - val selectedCategory = allCategories.find { it.id == defaultCategory.toLong() } - val defaultAnimeCategory by libraryPreferences.defaultAnimeCategory().collectAsState() - val selectedAnimeCategory = - allAnimeCategories.find { it.id == defaultAnimeCategory.toLong() } - // For default category val mangaIds = listOf(libraryPreferences.defaultMangaCategory().defaultValue()) + allCategories.fastMap { it.id.toInt() } @@ -117,8 +111,6 @@ object SettingsLibraryScreen : SearchableSettings { Preference.PreferenceItem.ListPreference( pref = libraryPreferences.defaultAnimeCategory(), title = stringResource(MR.strings.default_anime_category), - subtitle = selectedAnimeCategory?.visualName - ?: stringResource(MR.strings.default_category_summary), entries = animeIds.zip(animeLabels).toMap().toImmutableMap(), ), Preference.PreferenceItem.TextPreference( @@ -133,7 +125,6 @@ object SettingsLibraryScreen : SearchableSettings { Preference.PreferenceItem.ListPreference( pref = libraryPreferences.defaultMangaCategory(), title = stringResource(MR.strings.default_manga_category), - subtitle = selectedCategory?.visualName ?: stringResource(MR.strings.default_category_summary), entries = mangaIds.zip(mangaLabels).toMap().toImmutableMap(), ), Preference.PreferenceItem.SwitchPreference( From 9c677d2ed775d471af7a847b481e447a1c622ac1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 22:00:41 +0600 Subject: [PATCH 008/247] fix(deps): update paging.version to v3.3.1 (#1046) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 41e2dc7ae80250d9166fc637c1170667afdb0a9e) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index ff0d3f46ec..5efbc45342 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,7 +1,7 @@ [versions] agp_version = "8.5.1" lifecycle_version = "2.8.4" -paging_version = "3.3.0" +paging_version = "3.3.1" interpolator_version = "1.0.0" [libraries] From 2b49201752d3e71aea5ce9ad7e438fc3ebe30b96 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 19:23:23 +0600 Subject: [PATCH 009/247] fix(deps): update dependency dev.chrisbanes.compose:compose-bom to v2024.07.00-alpha02 (#1051) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 04aa5b36a5893ef9991312d61f84f830b83535f7) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index 2e64c51b59..29dc3acf00 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,5 +1,5 @@ [versions] -compose-bom = "2024.07.00-alpha01" +compose-bom = "2024.07.00-alpha02" accompanist = "0.35.1-alpha" [libraries] From 4f3509cbaec9b57311993696352b5bcf08005c44 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 18 Sep 2024 09:03:57 +0200 Subject: [PATCH 010/247] Fix disappearance items when fast scrolling * Don't use animateItem's fade-in/fade-out in FastScrollLazyColumn * Move to extension function Avoid using animateItemPlacement name since it's shadowed by compose-bom's deprecated one Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> --- .../presentation/browse/anime/AnimeExtensionsScreen.kt | 7 ++++--- .../presentation/browse/anime/AnimeSourcesFilterScreen.kt | 5 +++-- .../presentation/browse/manga/MangaExtensionsScreen.kt | 7 ++++--- .../presentation/browse/manga/MangaSourcesFilterScreen.kt | 5 +++-- .../presentation/history/anime/AnimeHistoryScreen.kt | 5 +++-- .../presentation/history/manga/MangaHistoryScreen.kt | 5 +++-- .../presentation/updates/anime/AnimeUpdatesUiItem.kt | 7 ++++--- .../presentation/updates/manga/MangaUpdatesUiItem.kt | 7 ++++--- .../eu/kanade/presentation/util/FastScrollAnimateItem.kt | 8 ++++++++ 9 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt diff --git a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt index bc0ae578dd..45f1348812 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt @@ -47,6 +47,7 @@ import eu.kanade.presentation.browse.manga.ExtensionTrustDialog import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.entries.components.DotSeparatorNoSpaceText import eu.kanade.presentation.more.settings.screen.browse.AnimeExtensionReposScreen +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension @@ -185,14 +186,14 @@ private fun AnimeExtensionContent( } ExtensionHeader( textRes = header.textRes, - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), action = action, ) } is AnimeExtensionUiModel.Header.Text -> { ExtensionHeader( text = header.text, - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), ) } } @@ -211,7 +212,7 @@ private fun AnimeExtensionContent( ) { item -> AnimeExtensionItem( item = item, - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), onClickItem = { when (it) { is AnimeExtension.Available -> onInstallExtension(it) diff --git a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesFilterScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesFilterScreen.kt index 8aafc1a4e2..538979c401 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesFilterScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesFilterScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.browse.anime.components.BaseAnimeSourceItem import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.browse.anime.source.AnimeSourcesFilterScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.anime.model.AnimeSource @@ -68,7 +69,7 @@ private fun AnimeSourcesFilterContent( contentType = "source-filter-header", ) { AnimeSourcesFilterHeader( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), language = language, enabled = enabled, onClickItem = onClickLanguage, @@ -81,7 +82,7 @@ private fun AnimeSourcesFilterContent( contentType = { "source-filter-item" }, ) { source -> AnimeSourcesFilterItem( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), source = source, isEnabled = "${source.id}" !in state.disabledSources, onClickItem = onClickSource, diff --git a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt index f3862c14c6..9386bc0a15 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt @@ -48,6 +48,7 @@ import eu.kanade.presentation.browse.manga.components.MangaExtensionIcon import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.entries.components.DotSeparatorNoSpaceText import eu.kanade.presentation.more.settings.screen.browse.MangaExtensionReposScreen +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.model.MangaExtension @@ -187,14 +188,14 @@ private fun ExtensionContent( } ExtensionHeader( textRes = header.textRes, - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), action = action, ) } is MangaExtensionUiModel.Header.Text -> { ExtensionHeader( text = header.text, - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), ) } } @@ -212,7 +213,7 @@ private fun ExtensionContent( }, ) { item -> ExtensionItem( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), item = item, onClickItem = { when (it) { diff --git a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesFilterScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesFilterScreen.kt index b61f9c4106..4d860ed2b4 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesFilterScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesFilterScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.browse.manga.components.BaseMangaSourceItem import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.browse.manga.source.MangaSourcesFilterScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.manga.model.Source @@ -68,7 +69,7 @@ private fun SourcesFilterContent( contentType = "source-filter-header", ) { SourcesFilterHeader( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), language = language, enabled = enabled, onClickItem = onClickLanguage, @@ -81,7 +82,7 @@ private fun SourcesFilterContent( contentType = { "source-filter-item" }, ) { source -> SourcesFilterItem( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), source = source, enabled = "${source.id}" !in state.disabledSources, onClickItem = onClickSource, diff --git a/app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreen.kt b/app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreen.kt index 0fb37b7a89..6afb689a37 100644 --- a/app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import eu.kanade.presentation.components.relativeDateTimeText import eu.kanade.presentation.history.anime.components.AnimeHistoryItem import eu.kanade.presentation.theme.TachiyomiPreviewTheme +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.history.anime.AnimeHistoryScreenModel import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations import tachiyomi.i18n.MR @@ -84,14 +85,14 @@ private fun AnimeHistoryScreenContent( when (item) { is AnimeHistoryUiModel.Header -> { ListGroupHeader( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), text = relativeDateTimeText(item.date), ) } is AnimeHistoryUiModel.Item -> { val value = item.item AnimeHistoryItem( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), history = value, onClickCover = { onClickCover(value) }, onClickResume = { onClickResume(value) }, diff --git a/app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreen.kt b/app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreen.kt index 3f85f9e42c..a11d5490bf 100644 --- a/app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import eu.kanade.presentation.components.relativeDateTimeText import eu.kanade.presentation.history.manga.components.MangaHistoryItem import eu.kanade.presentation.theme.TachiyomiPreviewTheme +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.history.manga.MangaHistoryScreenModel import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations import tachiyomi.i18n.MR @@ -84,14 +85,14 @@ private fun MangaHistoryScreenContent( when (item) { is MangaHistoryUiModel.Header -> { ListGroupHeader( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), text = relativeDateTimeText(item.date), ) } is MangaHistoryUiModel.Item -> { val value = item.item MangaHistoryItem( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), history = value, onClickCover = { onClickCover(value) }, onClickResume = { onClickResume(value) }, diff --git a/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt b/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt index d42157e139..c0b3c602a1 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt @@ -37,6 +37,7 @@ import eu.kanade.presentation.entries.anime.components.EpisodeDownloadAction import eu.kanade.presentation.entries.anime.components.EpisodeDownloadIndicator import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.entries.components.ItemCover +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.relativeTimeSpanString import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.ui.updates.anime.AnimeUpdatesItem @@ -55,7 +56,7 @@ internal fun LazyListScope.animeUpdatesLastUpdatedItem( item(key = "animeUpdates-lastUpdated") { Box( modifier = Modifier - .animateItem() + .animateItem(fadeInSpec = null, fadeOutSpec = null) .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, @@ -95,14 +96,14 @@ internal fun LazyListScope.animeUpdatesUiItems( when (item) { is AnimeUpdatesUiModel.Header -> { ListGroupHeader( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), text = relativeDateText(item.date), ) } is AnimeUpdatesUiModel.Item -> { val updatesItem = item.item AnimeUpdatesUiItem( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), update = updatesItem.update, selected = updatesItem.selected, watchProgress = updatesItem.update.lastSecondSeen diff --git a/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt b/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt index 546af1f1e1..a26b8f43e4 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt @@ -37,6 +37,7 @@ import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.entries.manga.components.ChapterDownloadAction import eu.kanade.presentation.entries.manga.components.ChapterDownloadIndicator +import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.relativeTimeSpanString import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.ui.updates.manga.MangaUpdatesItem @@ -54,7 +55,7 @@ internal fun LazyListScope.mangaUpdatesLastUpdatedItem( item(key = "mangaUpdates-lastUpdated") { Box( modifier = Modifier - .animateItem() + .animateItem(fadeInSpec = null, fadeOutSpec = null) .padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small), ) { Text( @@ -91,14 +92,14 @@ internal fun LazyListScope.mangaUpdatesUiItems( when (item) { is MangaUpdatesUiModel.Header -> { ListGroupHeader( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), text = relativeDateText(item.date), ) } is MangaUpdatesUiModel.Item -> { val updatesItem = item.item MangaUpdatesUiItem( - modifier = Modifier.animateItem(), + modifier = Modifier.animateItemFastScroll(), update = updatesItem.update, selected = updatesItem.selected, readProgress = updatesItem.update.lastPageRead diff --git a/app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt b/app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt new file mode 100644 index 0000000000..a6c9f70198 --- /dev/null +++ b/app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt @@ -0,0 +1,8 @@ +package eu.kanade.presentation.util + +import androidx.compose.foundation.lazy.LazyItemScope +import androidx.compose.ui.Modifier + +// https://issuetracker.google.com/352584409 +context(LazyItemScope) +fun Modifier.animateItemFastScroll() = this.animateItem(fadeInSpec = null, fadeOutSpec = null) From 98941fe2d870c2ad887155ddf800690cefc63896 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Wed, 18 Sep 2024 09:12:21 +0200 Subject: [PATCH 011/247] Adds Option to Copy Panel to Clipboard * Add Copy to Clipboard * Removing Unused Import * Reusing onShare function * Commit Suggestion * Early Return on null Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --------- Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Co-authored-by: Roshan Varughese <40583749+Animeboynz@users.noreply.github.com> --- .../presentation/reader/ReaderPageActionsDialog.kt | 14 ++++++++++++-- .../kanade/tachiyomi/ui/reader/ReaderActivity.kt | 12 ++++++++++++ .../kanade/tachiyomi/ui/reader/ReaderViewModel.kt | 5 +++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt b/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt index b83e8d6adf..9e9afde8d6 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.ContentCopy import androidx.compose.material.icons.outlined.Photo import androidx.compose.material.icons.outlined.Save import androidx.compose.material.icons.outlined.Share @@ -28,7 +29,7 @@ import tachiyomi.presentation.core.i18n.stringResource fun ReaderPageActionsDialog( onDismissRequest: () -> Unit, onSetAsCover: () -> Unit, - onShare: () -> Unit, + onShare: (Boolean) -> Unit, onSave: () -> Unit, ) { var showSetCoverDialog by remember { mutableStateOf(false) } @@ -44,12 +45,21 @@ fun ReaderPageActionsDialog( icon = Icons.Outlined.Photo, onClick = { showSetCoverDialog = true }, ) + ActionButton( + modifier = Modifier.weight(1f), + title = stringResource(MR.strings.action_copy_to_clipboard), + icon = Icons.Outlined.ContentCopy, + onClick = { + onShare(true) + onDismissRequest() + }, + ) ActionButton( modifier = Modifier.weight(1f), title = stringResource(MR.strings.action_share), icon = Icons.Outlined.Share, onClick = { - onShare() + onShare(false) onDismissRequest() }, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 940c4c5f47..cc32ac083a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -3,6 +3,8 @@ package eu.kanade.tachiyomi.ui.reader import android.annotation.SuppressLint import android.app.Activity import android.app.assist.AssistContent +import android.content.ClipData +import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.graphics.Color @@ -28,6 +30,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.unit.dp +import androidx.core.content.getSystemService import androidx.core.graphics.ColorUtils import androidx.core.net.toUri import androidx.core.transition.doOnEnd @@ -229,6 +232,9 @@ class ReaderActivity : BaseActivity() { is ReaderViewModel.Event.ShareImage -> { onShareImageResult(event.uri, event.page) } + is ReaderViewModel.Event.CopyImage -> { + onCopyImageResult(event.uri) + } is ReaderViewModel.Event.SetCoverResult -> { onSetAsCoverResult(event.result) } @@ -728,6 +734,12 @@ class ReaderActivity : BaseActivity() { startActivity(Intent.createChooser(intent, stringResource(MR.strings.action_share))) } + private fun onCopyImageResult(uri: Uri) { + val clipboardManager = applicationContext.getSystemService() ?: return + val clipData = ClipData.newUri(applicationContext.contentResolver, "", uri) + clipboardManager.setPrimaryClip(clipData) + } + /** * Called from the presenter when a page is saved or fails. It shows a message or logs the * event depending on the [result]. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 2d9e05443c..61b9b551e3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -819,7 +819,7 @@ class ReaderViewModel @JvmOverloads constructor( * get a path to the file and it has to be decompressed somewhere first. Only the last shared * image will be kept so it won't be taking lots of internal disk space. */ - fun shareImage() { + fun shareImage(copyToClipboard: Boolean) { val page = (state.value.dialog as? Dialog.PageActions)?.page if (page?.status != Page.State.READY) return val manga = manga ?: return @@ -839,7 +839,7 @@ class ReaderViewModel @JvmOverloads constructor( location = Location.Cache, ), ) - eventChannel.send(Event.ShareImage(uri, page)) + eventChannel.send(if (copyToClipboard) Event.CopyImage(uri) else Event.ShareImage(uri, page)) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) @@ -962,5 +962,6 @@ class ReaderViewModel @JvmOverloads constructor( data class SavedImage(val result: SaveImageResult) : Event data class ShareImage(val uri: Uri, val page: ReaderPage) : Event + data class CopyImage(val uri: Uri) : Event } } From 83a10d384e5ccd72ef0da555d126e48e03a86d99 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Thu, 19 Sep 2024 10:43:31 +0200 Subject: [PATCH 012/247] Fix library is backed up when disabled and make categories backup/restore independent Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../screen/data/CreateBackupScreen.kt | 5 ++-- .../screen/data/RestoreBackupScreen.kt | 2 +- .../data/backup/create/BackupCreator.kt | 20 ++++++++------ .../data/backup/create/BackupOptions.kt | 13 +++++----- .../create/creators/SourcesBackupCreator.kt | 12 ++++----- .../data/backup/restore/BackupRestorer.kt | 15 ++++++----- .../data/backup/restore/RestoreOptions.kt | 26 ++++++++++++------- 7 files changed, 53 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt index 758be43fa7..7815825433 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt @@ -6,7 +6,6 @@ import android.content.Intent import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.layout.ColumnScope import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState @@ -69,7 +68,7 @@ class CreateBackupScreen : Screen() { LazyColumnWithAction( contentPadding = contentPadding, actionLabel = stringResource(MR.strings.action_create), - actionEnabled = state.options.anyEnabled(), + actionEnabled = state.options.canCreate(), onClickAction = { if (!BackupCreateJob.isManualJobRunning(context)) { try { @@ -110,7 +109,7 @@ class CreateBackupScreen : Screen() { } @Composable - private fun ColumnScope.Options( + private fun Options( options: ImmutableList, state: CreateBackupScreenModel.State, model: CreateBackupScreenModel, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/RestoreBackupScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/RestoreBackupScreen.kt index 1e5e36169e..489ff96b4c 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/RestoreBackupScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/RestoreBackupScreen.kt @@ -63,7 +63,7 @@ class RestoreBackupScreen( LazyColumnWithAction( contentPadding = contentPadding, actionLabel = stringResource(MR.strings.action_restore), - actionEnabled = state.canRestore && state.options.anyEnabled(), + actionEnabled = state.canRestore && state.options.canRestore(), onClickAction = { model.startRestore() navigator.pop() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt index b4c20c06d1..6908e1ed01 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt @@ -84,15 +84,15 @@ class BackupCreator( throw IllegalStateException(context.stringResource(MR.strings.create_backup_file_error)) } - val databaseAnime = getAnimeFavorites.await() - val databaseManga = getMangaFavorites.await() + val backupAnime = backupAnimes(getAnimeFavorites.await(), options) + val backupManga = backupMangas(getMangaFavorites.await(), options) val backup = Backup( - backupManga = backupMangas(databaseManga, options), + backupManga = backupManga, backupCategories = backupMangaCategories(options), - backupAnime = backupAnimes(databaseAnime, options), + backupAnime = backupAnime, backupAnimeCategories = backupAnimeCategories(options), - backupSources = backupMangaSources(databaseManga), - backupAnimeSources = backupAnimeSources(databaseAnime), + backupSources = backupMangaSources(backupManga), + backupAnimeSources = backupAnimeSources(backupAnime), backupPreferences = backupAppPreferences(options), backupSourcePreferences = backupSourcePreferences(options), backupExtensions = backupExtensions(options), @@ -141,17 +141,21 @@ class BackupCreator( } private suspend fun backupMangas(mangas: List, options: BackupOptions): List { + if (!options.libraryEntries) return emptyList() + return mangaBackupCreator.backupMangas(mangas, options) } private suspend fun backupAnimes(animes: List, options: BackupOptions): List { + if (!options.libraryEntries) return emptyList() + return animeBackupCreator.backupAnimes(animes, options) } - private fun backupAnimeSources(animes: List): List { + private fun backupAnimeSources(animes: List): List { return sourcesBackupCreator.backupAnimeSources(animes) } - private fun backupMangaSources(mangas: List): List { + private fun backupMangaSources(mangas: List): List { return sourcesBackupCreator.backupMangaSources(mangas) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt index b1a2ebf066..094ac95de7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt @@ -28,7 +28,7 @@ data class BackupOptions( extensions, ) - fun anyEnabled() = libraryEntries || appSettings || sourceSettings + fun canCreate() = libraryEntries || categories || appSettings || sourceSettings companion object { val libraryOptions = persistentListOf( @@ -37,12 +37,6 @@ data class BackupOptions( getter = BackupOptions::libraryEntries, setter = { options, enabled -> options.copy(libraryEntries = enabled) }, ), - Entry( - label = MR.strings.categories, - getter = BackupOptions::categories, - setter = { options, enabled -> options.copy(categories = enabled) }, - enabled = { it.libraryEntries }, - ), Entry( label = MR.strings.chapters_episodes, getter = BackupOptions::chapters, @@ -61,6 +55,11 @@ data class BackupOptions( setter = { options, enabled -> options.copy(history = enabled) }, enabled = { it.libraryEntries }, ), + Entry( + label = MR.strings.categories, + getter = BackupOptions::categories, + setter = { options, enabled -> options.copy(categories = enabled) }, + ), ) val settingsOptions = persistentListOf( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt index 4be3159421..55a98f7b6e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt @@ -1,11 +1,11 @@ package eu.kanade.tachiyomi.data.backup.create.creators +import eu.kanade.tachiyomi.data.backup.models.BackupAnime +import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource import eu.kanade.tachiyomi.data.backup.models.BackupSource import eu.kanade.tachiyomi.source.MangaSource -import tachiyomi.domain.entries.anime.model.Anime -import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt @@ -16,20 +16,20 @@ class SourcesBackupCreator( private val mangaSourceManager: MangaSourceManager = Injekt.get(), ) { - fun backupAnimeSources(animes: List): List { + fun backupAnimeSources(animes: List): List { return animes .asSequence() - .map(Anime::source) + .map(BackupAnime::source) .distinct() .map(animeSourceManager::getOrStub) .map { it.toBackupSource() } .toList() } - fun backupMangaSources(mangas: List): List { + fun backupMangaSources(mangas: List): List { return mangas .asSequence() - .map(Manga::source) + .map(BackupManga::source) .distinct() .map(mangaSourceManager::getOrStub) .map { it.toBackupSource() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt index 165d93b8f8..8f551cdefb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt @@ -76,8 +76,11 @@ class BackupRestorer( val backupMangaMaps = backup.backupSources + backup.backupBrokenSources.map { it.toBackupSource() } mangaSourceMapping = backupMangaMaps.associate { it.sourceId to it.name } - if (options.library) { - restoreAmount += backup.backupManga.size + backup.backupAnime.size + 2 // +2 for anime and manga categories + if (options.libraryEntries) { + restoreAmount += backup.backupManga.size + backup.backupAnime.size + } + if (options.categories) { + restoreAmount += 2 // +2 for anime and manga categories } if (options.appSettings) { restoreAmount += 1 @@ -90,7 +93,7 @@ class BackupRestorer( } coroutineScope { - if (options.library) { + if (options.categories) { restoreCategories( backupAnimeCategories = backup.backupAnimeCategories, backupMangaCategories = backup.backupCategories, @@ -102,9 +105,9 @@ class BackupRestorer( if (options.sourceSettings) { restoreSourcePreferences(backup.backupSourcePreferences) } - if (options.library) { - restoreAnime(backup.backupAnime, backup.backupAnimeCategories) - restoreManga(backup.backupManga, backup.backupCategories) + if (options.libraryEntries) { + restoreAnime(backup.backupAnime, if (options.categories) backup.backupAnimeCategories else emptyList()) + restoreManga(backup.backupManga, if (options.categories) backup.backupCategories else emptyList()) } if (options.extensions) { restoreExtensions(backup.backupExtensions) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt index 75b2ec0712..a8ef405365 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt @@ -5,27 +5,34 @@ import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR data class RestoreOptions( - val library: Boolean = true, + val libraryEntries: Boolean = true, + val categories: Boolean = true, val appSettings: Boolean = true, val sourceSettings: Boolean = true, val extensions: Boolean = false, ) { fun asBooleanArray() = booleanArrayOf( - library, + libraryEntries, + categories, appSettings, sourceSettings, extensions, ) - fun anyEnabled() = library || appSettings || sourceSettings || extensions + fun canRestore() = libraryEntries || categories || appSettings || sourceSettings || extensions companion object { val options = persistentListOf( Entry( label = MR.strings.label_library, - getter = RestoreOptions::library, - setter = { options, enabled -> options.copy(library = enabled) }, + getter = RestoreOptions::libraryEntries, + setter = { options, enabled -> options.copy(libraryEntries = enabled) }, + ), + Entry( + label = MR.strings.categories, + getter = RestoreOptions::categories, + setter = { options, enabled -> options.copy(categories = enabled) }, ), Entry( label = MR.strings.app_settings, @@ -45,10 +52,11 @@ data class RestoreOptions( ) fun fromBooleanArray(array: BooleanArray) = RestoreOptions( - library = array[0], - appSettings = array[1], - sourceSettings = array[2], - extensions = array[3], + libraryEntries = array[0], + categories = array[1], + appSettings = array[2], + sourceSettings = array[3], + extensions = array[4], ) } From 5eb1bf700b7d665b049675a0a655b22fdbc5e71a Mon Sep 17 00:00:00 2001 From: Secozzi Date: Thu, 19 Sep 2024 11:09:57 +0200 Subject: [PATCH 013/247] Cleanup backup/restore related code Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../data/backup/create/BackupCreator.kt | 62 +++++++++---------- .../create/creators/AnimeBackupCreator.kt | 2 +- ...tor.kt => AnimeCategoriesBackupCreator.kt} | 12 +--- .../creators/AnimeSourcesBackupCreator.kt | 29 +++++++++ .../creators/ExtensionsBackupCreator.kt | 2 +- .../create/creators/MangaBackupCreator.kt | 2 +- .../creators/MangaCategoriesBackupCreator.kt | 19 ++++++ .../creators/MangaSourcesBackupCreator.kt | 29 +++++++++ .../creators/PreferenceBackupCreator.kt | 4 +- .../create/creators/SourcesBackupCreator.kt | 50 --------------- .../data/backup/restore/BackupRestorer.kt | 18 +++--- ...Restorer.kt => AnimeCategoriesRestorer.kt} | 35 +---------- .../backup/restore/restorers/AnimeRestorer.kt | 2 +- .../restorers/MangaCategoriesRestorer.kt | 42 +++++++++++++ .../backup/restore/restorers/MangaRestorer.kt | 2 +- .../restore/restorers/PreferenceRestorer.kt | 4 +- 16 files changed, 173 insertions(+), 141 deletions(-) rename app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/{CategoriesBackupCreator.kt => AnimeCategoriesBackupCreator.kt} (57%) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaCategoriesBackupCreator.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaSourcesBackupCreator.kt delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt rename app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/{CategoriesRestorer.kt => AnimeCategoriesRestorer.kt} (52%) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaCategoriesRestorer.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt index 6908e1ed01..0a11acae07 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt @@ -6,11 +6,13 @@ import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.backup.BackupFileValidator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeBackupCreator -import eu.kanade.tachiyomi.data.backup.create.creators.CategoriesBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.AnimeCategoriesBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.AnimeSourcesBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.MangaCategoriesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.ExtensionsBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.MangaSourcesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.PreferenceBackupCreator -import eu.kanade.tachiyomi.data.backup.create.creators.SourcesBackupCreator import eu.kanade.tachiyomi.data.backup.models.Backup import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource @@ -50,35 +52,33 @@ class BackupCreator( private val getMangaFavorites: GetMangaFavorites = Injekt.get(), private val backupPreferences: BackupPreferences = Injekt.get(), - private val categoriesBackupCreator: CategoriesBackupCreator = CategoriesBackupCreator(), + private val animeCategoriesBackupCreator: AnimeCategoriesBackupCreator = AnimeCategoriesBackupCreator(), + private val mangaCategoriesBackupCreator: MangaCategoriesBackupCreator = MangaCategoriesBackupCreator(), private val animeBackupCreator: AnimeBackupCreator = AnimeBackupCreator(), private val mangaBackupCreator: MangaBackupCreator = MangaBackupCreator(), private val preferenceBackupCreator: PreferenceBackupCreator = PreferenceBackupCreator(), - private val sourcesBackupCreator: SourcesBackupCreator = SourcesBackupCreator(), + private val animeSourcesBackupCreator: AnimeSourcesBackupCreator = AnimeSourcesBackupCreator(), + private val mangaSourcesBackupCreator: MangaSourcesBackupCreator = MangaSourcesBackupCreator(), private val extensionsBackupCreator: ExtensionsBackupCreator = ExtensionsBackupCreator(context), ) { suspend fun backup(uri: Uri, options: BackupOptions): String { var file: UniFile? = null try { - file = ( - if (isAutoBackup) { - // Get dir of file and create - val dir = UniFile.fromUri(context, uri) - - // Delete older backups - dir?.listFiles { _, filename -> FILENAME_REGEX.matches(filename) } - .orEmpty() - .sortedByDescending { it.name } - .drop(MAX_AUTO_BACKUPS - 1) - .forEach { it.delete() } - - // Create new file to place backup - dir?.createFile(getFilename()) - } else { - UniFile.fromUri(context, uri) - } - ) + file = if (isAutoBackup) { + // Get dir of file and create + val dir = UniFile.fromUri(context, uri) + // Delete older backups + dir?.listFiles { _, filename -> FILENAME_REGEX.matches(filename) } + .orEmpty() + .sortedByDescending { it.name } + .drop(MAX_AUTO_BACKUPS - 1) + .forEach { it.delete() } + // Create new file to place backup + dir?.createFile(getFilename()) + } else { + UniFile.fromUri(context, uri) + } if (file == null || !file.isFile) { throw IllegalStateException(context.stringResource(MR.strings.create_backup_file_error)) @@ -131,50 +131,50 @@ class BackupCreator( private suspend fun backupAnimeCategories(options: BackupOptions): List { if (!options.categories) return emptyList() - return categoriesBackupCreator.backupAnimeCategories() + return animeCategoriesBackupCreator() } private suspend fun backupMangaCategories(options: BackupOptions): List { if (!options.categories) return emptyList() - return categoriesBackupCreator.backupMangaCategories() + return mangaCategoriesBackupCreator() } private suspend fun backupMangas(mangas: List, options: BackupOptions): List { if (!options.libraryEntries) return emptyList() - return mangaBackupCreator.backupMangas(mangas, options) + return mangaBackupCreator(mangas, options) } private suspend fun backupAnimes(animes: List, options: BackupOptions): List { if (!options.libraryEntries) return emptyList() - return animeBackupCreator.backupAnimes(animes, options) + return animeBackupCreator(animes, options) } private fun backupAnimeSources(animes: List): List { - return sourcesBackupCreator.backupAnimeSources(animes) + return animeSourcesBackupCreator(animes) } private fun backupMangaSources(mangas: List): List { - return sourcesBackupCreator.backupMangaSources(mangas) + return mangaSourcesBackupCreator(mangas) } private fun backupAppPreferences(options: BackupOptions): List { if (!options.appSettings) return emptyList() - return preferenceBackupCreator.backupAppPreferences(includePrivatePreferences = options.privateSettings) + return preferenceBackupCreator.createApp(includePrivatePreferences = options.privateSettings) } private fun backupSourcePreferences(options: BackupOptions): List { if (!options.sourceSettings) return emptyList() - return preferenceBackupCreator.backupSourcePreferences(includePrivatePreferences = options.privateSettings) + return preferenceBackupCreator.createSource(includePrivatePreferences = options.privateSettings) } private fun backupExtensions(options: BackupOptions): List { if (!options.extensions) return emptyList() - return extensionsBackupCreator.backupExtensions() + return extensionsBackupCreator() } companion object { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeBackupCreator.kt index 196173c76b..1a46e29f36 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeBackupCreator.kt @@ -19,7 +19,7 @@ class AnimeBackupCreator( private val getHistory: GetAnimeHistory = Injekt.get(), ) { - suspend fun backupAnimes(animes: List, options: BackupOptions): List { + suspend operator fun invoke(animes: List, options: BackupOptions): List { return animes.map { backupAnime(it, options) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/CategoriesBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeCategoriesBackupCreator.kt similarity index 57% rename from app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/CategoriesBackupCreator.kt rename to app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeCategoriesBackupCreator.kt index 6c4507c7e2..b9d1dfcf73 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/CategoriesBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeCategoriesBackupCreator.kt @@ -3,25 +3,17 @@ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.backupCategoryMapper import tachiyomi.domain.category.anime.interactor.GetAnimeCategories -import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.model.Category import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class CategoriesBackupCreator( +class AnimeCategoriesBackupCreator( private val getAnimeCategories: GetAnimeCategories = Injekt.get(), - private val getMangaCategories: GetMangaCategories = Injekt.get(), ) { - suspend fun backupAnimeCategories(): List { + suspend operator fun invoke(): List { return getAnimeCategories.await() .filterNot(Category::isSystemCategory) .map(backupCategoryMapper) } - - suspend fun backupMangaCategories(): List { - return getMangaCategories.await() - .filterNot(Category::isSystemCategory) - .map(backupCategoryMapper) - } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt new file mode 100644 index 0000000000..120f375d1d --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt @@ -0,0 +1,29 @@ +package eu.kanade.tachiyomi.data.backup.create.creators + +import eu.kanade.tachiyomi.data.backup.models.BackupAnime +import eu.kanade.tachiyomi.animesource.AnimeSource +import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource +import tachiyomi.domain.source.anime.service.AnimeSourceManager +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class AnimeSourcesBackupCreator( + private val animeSourceManager: AnimeSourceManager = Injekt.get(), +) { + + operator fun invoke(animes: List): List { + return animes + .asSequence() + .map(BackupAnime::source) + .distinct() + .map(animeSourceManager::getOrStub) + .map { it.toBackupSource() } + .toList() + } +} + +private fun AnimeSource.toBackupSource() = + BackupAnimeSource( + name = this.name, + sourceId = this.id, + ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionsBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionsBackupCreator.kt index 325ff173d0..58b729f4d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionsBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionsBackupCreator.kt @@ -15,7 +15,7 @@ class ExtensionsBackupCreator( private val mangaExtensionManager: MangaExtensionManager = Injekt.get(), ) { - fun backupExtensions(): List { + operator fun invoke(): List { val installedExtensions = mutableListOf() animeExtensionManager.installedExtensionsFlow.value.forEach { val packageName = it.pkgName diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt index f8a9743307..50de6747ae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt @@ -20,7 +20,7 @@ class MangaBackupCreator( private val getHistory: GetMangaHistory = Injekt.get(), ) { - suspend fun backupMangas(mangas: List, options: BackupOptions): List { + suspend operator fun invoke(mangas: List, options: BackupOptions): List { return mangas.map { backupManga(it, options) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaCategoriesBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaCategoriesBackupCreator.kt new file mode 100644 index 0000000000..2a06d452eb --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaCategoriesBackupCreator.kt @@ -0,0 +1,19 @@ +package eu.kanade.tachiyomi.data.backup.create.creators + +import eu.kanade.tachiyomi.data.backup.models.BackupCategory +import eu.kanade.tachiyomi.data.backup.models.backupCategoryMapper +import tachiyomi.domain.category.manga.interactor.GetMangaCategories +import tachiyomi.domain.category.model.Category +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MangaCategoriesBackupCreator( + private val getMangaCategories: GetMangaCategories = Injekt.get(), +) { + + suspend operator fun invoke(): List { + return getMangaCategories.await() + .filterNot(Category::isSystemCategory) + .map(backupCategoryMapper) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaSourcesBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaSourcesBackupCreator.kt new file mode 100644 index 0000000000..7f5be0bfc9 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaSourcesBackupCreator.kt @@ -0,0 +1,29 @@ +package eu.kanade.tachiyomi.data.backup.create.creators + +import eu.kanade.tachiyomi.data.backup.models.BackupManga +import eu.kanade.tachiyomi.data.backup.models.BackupSource +import eu.kanade.tachiyomi.source.MangaSource +import tachiyomi.domain.source.manga.service.MangaSourceManager +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MangaSourcesBackupCreator( + private val mangaSourceManager: MangaSourceManager = Injekt.get(), +) { + + operator fun invoke(mangas: List): List { + return mangas + .asSequence() + .map(BackupManga::source) + .distinct() + .map(mangaSourceManager::getOrStub) + .map { it.toBackupSource() } + .toList() + } +} + +private fun MangaSource.toBackupSource() = + BackupSource( + name = this.name, + sourceId = this.id, + ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt index 77b5c5798f..5df4124ffb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt @@ -27,12 +27,12 @@ class PreferenceBackupCreator( private val preferenceStore: PreferenceStore = Injekt.get(), ) { - fun backupAppPreferences(includePrivatePreferences: Boolean): List { + fun createApp(includePrivatePreferences: Boolean): List { return preferenceStore.getAll().toBackupPreferences() .withPrivatePreferences(includePrivatePreferences) } - fun backupSourcePreferences(includePrivatePreferences: Boolean): List { + fun createSource(includePrivatePreferences: Boolean): List { val animePreferences = animeSourceManager.getCatalogueSources() .filterIsInstance() .map { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt deleted file mode 100644 index 55a98f7b6e..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SourcesBackupCreator.kt +++ /dev/null @@ -1,50 +0,0 @@ -package eu.kanade.tachiyomi.data.backup.create.creators - -import eu.kanade.tachiyomi.data.backup.models.BackupAnime -import eu.kanade.tachiyomi.data.backup.models.BackupManga -import eu.kanade.tachiyomi.animesource.AnimeSource -import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource -import eu.kanade.tachiyomi.data.backup.models.BackupSource -import eu.kanade.tachiyomi.source.MangaSource -import tachiyomi.domain.source.anime.service.AnimeSourceManager -import tachiyomi.domain.source.manga.service.MangaSourceManager -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get - -class SourcesBackupCreator( - private val animeSourceManager: AnimeSourceManager = Injekt.get(), - private val mangaSourceManager: MangaSourceManager = Injekt.get(), -) { - - fun backupAnimeSources(animes: List): List { - return animes - .asSequence() - .map(BackupAnime::source) - .distinct() - .map(animeSourceManager::getOrStub) - .map { it.toBackupSource() } - .toList() - } - - fun backupMangaSources(mangas: List): List { - return mangas - .asSequence() - .map(BackupManga::source) - .distinct() - .map(mangaSourceManager::getOrStub) - .map { it.toBackupSource() } - .toList() - } -} - -private fun AnimeSource.toBackupSource() = - BackupAnimeSource( - name = this.name, - sourceId = this.id, - ) - -private fun MangaSource.toBackupSource() = - BackupSource( - name = this.name, - sourceId = this.id, - ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt index 8f551cdefb..41d9391d93 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt @@ -10,9 +10,10 @@ import eu.kanade.tachiyomi.data.backup.models.BackupExtension import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSourcePreferences +import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeCategoriesRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeRestorer -import eu.kanade.tachiyomi.data.backup.restore.restorers.CategoriesRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.ExtensionsRestorer +import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaCategoriesRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.PreferenceRestorer import eu.kanade.tachiyomi.util.system.createFileInCacheDir @@ -32,7 +33,8 @@ class BackupRestorer( private val notifier: BackupNotifier, private val isSync: Boolean, - private val categoriesRestorer: CategoriesRestorer = CategoriesRestorer(), + private val animeCategoriesRestorer: AnimeCategoriesRestorer = AnimeCategoriesRestorer(), + private val mangaCategoriesRestorer: MangaCategoriesRestorer = MangaCategoriesRestorer(), private val preferenceRestorer: PreferenceRestorer = PreferenceRestorer(context), private val animeRestorer: AnimeRestorer = AnimeRestorer(), private val mangaRestorer: MangaRestorer = MangaRestorer(), @@ -122,8 +124,8 @@ class BackupRestorer( backupMangaCategories: List, ) = launch { ensureActive() - categoriesRestorer.restoreAnimeCategories(backupAnimeCategories) - categoriesRestorer.restoreMangaCategories(backupMangaCategories) + animeCategoriesRestorer(backupAnimeCategories) + mangaCategoriesRestorer(backupMangaCategories) restoreProgress += 1 notifier.showRestoreProgress( @@ -143,7 +145,7 @@ class BackupRestorer( ensureActive() try { - animeRestorer.restoreAnime(it, backupAnimeCategories) + animeRestorer.restore(it, backupAnimeCategories) } catch (e: Exception) { val sourceName = animeSourceMapping[it.source] ?: it.source.toString() errors.add(Date() to "${it.title} [$sourceName]: ${e.message}") @@ -163,7 +165,7 @@ class BackupRestorer( ensureActive() try { - mangaRestorer.restoreManga(it, backupMangaCategories) + mangaRestorer.restore(it, backupMangaCategories) } catch (e: Exception) { val sourceName = mangaSourceMapping[it.source] ?: it.source.toString() errors.add(Date() to "${it.title} [$sourceName]: ${e.message}") @@ -176,7 +178,7 @@ class BackupRestorer( private fun CoroutineScope.restoreAppPreferences(preferences: List) = launch { ensureActive() - preferenceRestorer.restoreAppPreferences(preferences) + preferenceRestorer.restoreApp(preferences) restoreProgress += 1 notifier.showRestoreProgress( @@ -189,7 +191,7 @@ class BackupRestorer( private fun CoroutineScope.restoreSourcePreferences(preferences: List) = launch { ensureActive() - preferenceRestorer.restoreSourcePreferences(preferences) + preferenceRestorer.restoreSource(preferences) restoreProgress += 1 notifier.showRestoreProgress( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/CategoriesRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeCategoriesRestorer.kt similarity index 52% rename from app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/CategoriesRestorer.kt rename to app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeCategoriesRestorer.kt index b889f63971..6a067ac59c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/CategoriesRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeCategoriesRestorer.kt @@ -2,22 +2,18 @@ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.tachiyomi.data.backup.models.BackupCategory import tachiyomi.data.handlers.anime.AnimeDatabaseHandler -import tachiyomi.data.handlers.manga.MangaDatabaseHandler import tachiyomi.domain.category.anime.interactor.GetAnimeCategories -import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.library.service.LibraryPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class CategoriesRestorer( +class AnimeCategoriesRestorer( private val animeHandler: AnimeDatabaseHandler = Injekt.get(), - private val mangaHandler: MangaDatabaseHandler = Injekt.get(), private val getAnimeCategories: GetAnimeCategories = Injekt.get(), - private val getMangaCategories: GetMangaCategories = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), ) { - suspend fun restoreAnimeCategories(backupCategories: List) { + suspend operator fun invoke(backupCategories: List) { if (backupCategories.isNotEmpty()) { val dbCategories = getAnimeCategories.await() val dbCategoriesByName = dbCategories.associateBy { it.name } @@ -43,31 +39,4 @@ class CategoriesRestorer( ) } } - - suspend fun restoreMangaCategories(backupCategories: List) { - if (backupCategories.isNotEmpty()) { - val dbCategories = getMangaCategories.await() - val dbCategoriesByName = dbCategories.associateBy { it.name } - var nextOrder = dbCategories.maxOfOrNull { it.order }?.plus(1) ?: 0 - - val categories = backupCategories - .sortedBy { it.order } - .map { - val dbCategory = dbCategoriesByName[it.name] - if (dbCategory != null) return@map dbCategory - val order = nextOrder++ - mangaHandler.awaitOneExecutable { - categoriesQueries.insert(it.name, order, it.flags) - categoriesQueries.selectLastInsertedRowId() - } - .let { id -> it.toCategory(id).copy(order = order) } - } - - libraryPreferences.categorizedDisplaySettings().set( - (dbCategories + categories) - .distinctBy { it.flags } - .size > 1, - ) - } - } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeRestorer.kt index 188c90a409..0c16b2798b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeRestorer.kt @@ -53,7 +53,7 @@ class AnimeRestorer( ) } - suspend fun restoreAnime( + suspend fun restore( backupAnime: BackupAnime, backupCategories: List, ) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaCategoriesRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaCategoriesRestorer.kt new file mode 100644 index 0000000000..2ffdcd4690 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaCategoriesRestorer.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.data.backup.restore.restorers + +import eu.kanade.tachiyomi.data.backup.models.BackupCategory +import tachiyomi.data.handlers.manga.MangaDatabaseHandler +import tachiyomi.domain.category.manga.interactor.GetMangaCategories +import tachiyomi.domain.library.service.LibraryPreferences +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MangaCategoriesRestorer( + private val mangaHandler: MangaDatabaseHandler = Injekt.get(), + private val getMangaCategories: GetMangaCategories = Injekt.get(), + private val libraryPreferences: LibraryPreferences = Injekt.get(), +) { + + suspend operator fun invoke(backupCategories: List) { + if (backupCategories.isNotEmpty()) { + val dbCategories = getMangaCategories.await() + val dbCategoriesByName = dbCategories.associateBy { it.name } + var nextOrder = dbCategories.maxOfOrNull { it.order }?.plus(1) ?: 0 + + val categories = backupCategories + .sortedBy { it.order } + .map { + val dbCategory = dbCategoriesByName[it.name] + if (dbCategory != null) return@map dbCategory + val order = nextOrder++ + mangaHandler.awaitOneExecutable { + categoriesQueries.insert(it.name, order, it.flags) + categoriesQueries.selectLastInsertedRowId() + } + .let { id -> it.toCategory(id).copy(order = order) } + } + + libraryPreferences.categorizedDisplaySettings().set( + (dbCategories + categories) + .distinctBy { it.flags } + .size > 1, + ) + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt index b7a3eabf6a..57dafc29d0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt @@ -53,7 +53,7 @@ class MangaRestorer( ) } - suspend fun restoreManga( + suspend fun restore( backupManga: BackupManga, backupCategories: List, ) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt index 694a0cce37..79ba85fadd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt @@ -23,7 +23,7 @@ class PreferenceRestorer( private val preferenceStore: PreferenceStore = Injekt.get(), ) { - fun restoreAppPreferences(preferences: List) { + fun restoreApp(preferences: List) { restorePreferences(preferences, preferenceStore) AnimeLibraryUpdateJob.setupTask(context) @@ -31,7 +31,7 @@ class PreferenceRestorer( BackupCreateJob.setupTask(context) } - fun restoreSourcePreferences(preferences: List) { + fun restoreSource(preferences: List) { preferences.forEach { val sourcePrefs = AndroidPreferenceStore(context, sourcePreferences(it.sourceKey)) restorePreferences(it.prefs, sourcePrefs) From ab3d974089b88684d9b5616ae20df43941d116d1 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:09:56 +0600 Subject: [PATCH 014/247] Bump default user agent string (cherry picked from commit 8160b47ff5fbbd9b32caeb462b5be881fabd3449) --- .../main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/common/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt b/core/common/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt index c32864aec6..23b02e3154 100644 --- a/core/common/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt +++ b/core/common/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt @@ -19,7 +19,7 @@ class NetworkPreferences( fun defaultUserAgent(): Preference { return preferenceStore.getString( "default_user_agent", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0", ) } } From f5eb3e044edd7b80c15c67889b9f794d84d53abb Mon Sep 17 00:00:00 2001 From: Secozzi Date: Thu, 19 Sep 2024 11:15:36 +0200 Subject: [PATCH 015/247] Improve error message if restoring from JSON file * Improve error message if restoring from JSON file * Replace Exception with IOException * Use more generic error message if protobuf fails * fix lint Co-authored-by: Vetle Ledaal <13540478+vetleledaal@users.noreply.github.com> --- .../tachiyomi/data/backup/BackupDecoder.kt | 27 ++++++++++++++----- .../moko-resources/base/strings.xml | 2 ++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupDecoder.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupDecoder.kt index 34f862548f..55553082fc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupDecoder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupDecoder.kt @@ -3,18 +3,21 @@ package eu.kanade.tachiyomi.data.backup import android.content.Context import android.net.Uri import eu.kanade.tachiyomi.data.backup.models.Backup +import kotlinx.serialization.SerializationException import kotlinx.serialization.protobuf.ProtoBuf import okio.buffer import okio.gzip import okio.source +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.IOException class BackupDecoder( private val context: Context, private val parser: ProtoBuf = Injekt.get(), ) { - /** * Decode a potentially-gzipped backup. */ @@ -26,13 +29,25 @@ class BackupDecoder( require(2) } val id1id2 = peeked.readShort() - val backupString = if (id1id2.toInt() == 0x1f8b) { // 0x1f8b is gzip magic bytes - source.gzip().buffer() - } else { - source + val backupString = when (id1id2.toInt()) { + 0x1f8b -> source.gzip().buffer() // 0x1f8b is gzip magic bytes + MAGIC_JSON_SIGNATURE1, MAGIC_JSON_SIGNATURE2, MAGIC_JSON_SIGNATURE3 -> { + throw IOException(context.stringResource(MR.strings.invalid_backup_file_json)) + } + else -> source }.use { it.readByteArray() } - parser.decodeFromByteArray(Backup.serializer(), backupString) + try { + parser.decodeFromByteArray(Backup.serializer(), backupString) + } catch (_: SerializationException) { + throw IOException(context.stringResource(MR.strings.invalid_backup_file_unknown)) + } } } + + companion object { + private const val MAGIC_JSON_SIGNATURE1 = 0x7b7d // `{}` + private const val MAGIC_JSON_SIGNATURE2 = 0x7b22 // `{"` + private const val MAGIC_JSON_SIGNATURE3 = 0x7b0a // `{\n` + } } diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index ed9c857332..b539cc68b8 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -470,6 +470,8 @@ Invalid backup file: Full error: Backup does not contain any library entries. + JSON backup not supported + Backup file is corrupted Missing sources: Trackers not logged into: You may need to install any missing extensions and log in to tracking services afterwards to use them. From 1d2dcac6015af071660f1693287dc89f8ac9cecd Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Sun, 4 Aug 2024 23:45:11 +0800 Subject: [PATCH 016/247] Match extra layout space with scroll distance (#1076) And increase recycler item view cache size. (cherry picked from commit a3dfd2efe6ace7a2a4d79bd09fb1a729989f1094) --- .../reader/viewer/webtoon/WebtoonLayoutManager.kt | 8 ++------ .../ui/reader/viewer/webtoon/WebtoonViewer.kt | 15 +++++++++------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonLayoutManager.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonLayoutManager.kt index 63be4007b3..71db61ebe8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonLayoutManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonLayoutManager.kt @@ -13,12 +13,7 @@ import androidx.recyclerview.widget.RecyclerView.NO_POSITION * This layout manager uses the same package name as the support library in order to use a package * protected method. */ -class WebtoonLayoutManager(context: Context) : LinearLayoutManager(context) { - - /** - * Extra layout space is set to half the screen height. - */ - private val extraLayoutSpace = context.resources.displayMetrics.heightPixels / 2 +class WebtoonLayoutManager(context: Context, private val extraLayoutSpace: Int) : LinearLayoutManager(context) { init { isItemPrefetchEnabled = false @@ -27,6 +22,7 @@ class WebtoonLayoutManager(context: Context) : LinearLayoutManager(context) { /** * Returns the custom extra layout space. */ + @Deprecated("Deprecated in Java") override fun getExtraLayoutSpace(state: RecyclerView.State): Int { return extraLayoutSpace } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index 0831087c41..260897b972 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -47,10 +47,15 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr */ private val frame = WebtoonFrame(activity) + /** + * Distance to scroll when the user taps on one side of the recycler view. + */ + private val scrollDistance = activity.resources.displayMetrics.heightPixels * 3 / 4 + /** * Layout manager of the recycler view. */ - private val layoutManager = WebtoonLayoutManager(activity) + private val layoutManager = WebtoonLayoutManager(activity, scrollDistance) /** * Configuration used by this viewer, like allow taps, or crop image borders. @@ -62,11 +67,6 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr */ private val adapter = WebtoonAdapter(this) - /** - * Distance to scroll when the user taps on one side of the recycler view. - */ - private var scrollDistance = activity.resources.displayMetrics.heightPixels * 3 / 4 - /** * Currently active item. It can be a chapter page or a chapter transition. */ @@ -79,6 +79,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr .threshold init { + recycler.setItemViewCacheSize(RecyclerViewCacheSize) recycler.isVisible = false // Don't let the recycler layout yet recycler.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT) recycler.isFocusable = false @@ -359,3 +360,5 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr ) } } + +private const val RecyclerViewCacheSize = 4 From 0b6a9cee14012105b457663d34e5b5b5819d126d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 20:38:13 +0600 Subject: [PATCH 017/247] chore(deps): update actions/setup-java action to v4.2.2 (#1080) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 3f6bd5f010532d292310c0c0f14bf11832277f2e) --- .github/workflows/build_pull_request.yml | 2 +- .github/workflows/build_push.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index 00d3391362..7f74d3fab3 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -31,7 +31,7 @@ jobs: uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # v4.3.4 - name: Set up JDK - uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1 + uses: actions/setup-java@6a0805fcefea3d4657a47ac4c165951e33482018 # v4.2.2 with: java-version: 17 distribution: adopt diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index 2ecd96e174..2343357304 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -28,7 +28,7 @@ jobs: uses: gradle/actions/wrapper-validation@d9c87d481d55275bb5441eef3fe0e46805f9ef70 # v3.5.0 - name: Set up JDK - uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1 + uses: actions/setup-java@6a0805fcefea3d4657a47ac4c165951e33482018 # v4.2.2 with: java-version: 17 distribution: adopt From 965772300a67bae1428e828e948bb88943916cd6 Mon Sep 17 00:00:00 2001 From: "Tran M. Cuong" Date: Tue, 6 Aug 2024 16:38:56 +0200 Subject: [PATCH 018/247] fix: drawScrollbar crash on list with 0 item but only sticky header Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> --- .../main/java/tachiyomi/presentation/core/util/Scrollbar.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt index 82bf7fbf3e..063c4cbfd0 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Scrollbar.kt @@ -120,12 +120,12 @@ private fun Modifier.drawScrollbar( 0f } else { items - .fastFirstOrNull { (it.key as? String)?.startsWith(STICKY_HEADER_KEY_PREFIX)?.not() ?: true }!! - .run { + .fastFirstOrNull { (it.key as? String)?.startsWith(STICKY_HEADER_KEY_PREFIX)?.not() ?: true } + ?.run { val startPadding = if (reverseDirection) layoutInfo.afterContentPadding else layoutInfo.beforeContentPadding startPadding + ((estimatedItemSize * index - offset) / totalSize * viewportSize) - } + } ?: 0f } val drawScrollbar = onDrawScrollbar( orientation, reverseDirection, atEnd, showScrollbar, From f09e56335983f9b0c755ea407ff63c31fbd6a66b Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Tue, 6 Aug 2024 22:39:49 +0800 Subject: [PATCH 019/247] Don't crash on ill-formed URLs (#1084) (cherry picked from commit 854474f85ffc41eccdc2b3a6cf105fa2805ebc3c) --- .../eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt index 38dca6ac35..af5eadad6e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt @@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import logcat.LogPriority -import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.source.manga.service.MangaSourceManager @@ -57,7 +57,9 @@ class WebViewScreenModel( } fun clearCookies(url: String) { - val cleared = network.cookieJar.remove(url.toHttpUrl()) - logcat { "Cleared $cleared cookies for: $url" } + url.toHttpUrlOrNull()?.let { + val cleared = network.cookieJar.remove(it) + logcat { "Cleared $cleared cookies for: $url" } + } } } From 694873912b2b67645ac9a634396e2ba5b956cee2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 20:41:28 +0600 Subject: [PATCH 020/247] chore(deps): update kotlin monorepo to v2.0.10 (#1085) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit edb8201f74e516c296b62e04a13802e1bd9e0b6b) --- gradle/kotlinx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/kotlinx.versions.toml b/gradle/kotlinx.versions.toml index 4f4a6cec88..0ac3547a00 100644 --- a/gradle/kotlinx.versions.toml +++ b/gradle/kotlinx.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin_version = "2.0.0" +kotlin_version = "2.0.10" serialization_version = "1.7.1" xml_serialization_version = "0.90.1" From 4c4c20700cbdfff59031072c57d376eac19e6ce3 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Thu, 19 Sep 2024 11:19:43 +0200 Subject: [PATCH 021/247] Rename backup restore error log file Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt index 41d9391d93..e5621683b1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt @@ -218,7 +218,7 @@ class BackupRestorer( private fun writeErrorLog(): File { try { if (errors.isNotEmpty()) { - val file = context.createFileInCacheDir("tachiyomi_restore.txt") + val file = context.createFileInCacheDir("aniyomi_restore_error.txt") val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()) file.bufferedWriter().use { out -> From 8f2466d61e45aff55f4999bd2bb51f7c96cffcdf Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sat, 26 Oct 2024 10:12:39 +0200 Subject: [PATCH 022/247] Add Backup and Restore of Extension Repos (#1057) * Backup/Restore Extension Repos * Refactor * Moving to Under App Settings * Sort by URL, Check existing by SHA and Error Logging Untested. Currently in a lecture and can't test if the changes really work. * Changes to logic * Don't ask me what's happening here * Renaming Variables * Fixing restoreAmount & changes to logic Co-Authored-By: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --------- Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Co-authored-by: Roshan Varughese <40583749+Animeboynz@users.noreply.github.com> --- .../data/backup/create/BackupCreator.kt | 19 +++++++ .../data/backup/create/BackupOptions.kt | 16 ++++-- .../AnimeExtensionRepoBackupCreator.kt | 17 ++++++ .../MangaExtensionRepoBackupCreator.kt | 17 ++++++ .../tachiyomi/data/backup/models/Backup.kt | 3 ++ .../backup/models/BackupExtensionRepos.kt | 25 +++++++++ .../data/backup/restore/BackupRestorer.kt | 54 +++++++++++++++++++ .../data/backup/restore/RestoreOptions.kt | 14 +++-- .../restorers/AnimeExtensionRepoRestorer.kt | 38 +++++++++++++ .../restorers/MangaExtensionRepoRestorer.kt | 38 +++++++++++++ .../moko-resources/base/strings.xml | 1 + 11 files changed, 235 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeExtensionRepoBackupCreator.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaExtensionRepoBackupCreator.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt index 0a11acae07..0d600520f4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt @@ -7,10 +7,12 @@ import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.backup.BackupFileValidator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeCategoriesBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.AnimeExtensionRepoBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeSourcesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaCategoriesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.ExtensionsBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.MangaExtensionRepoBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaSourcesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.PreferenceBackupCreator import eu.kanade.tachiyomi.data.backup.models.Backup @@ -18,6 +20,7 @@ import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupExtension +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSource @@ -57,6 +60,8 @@ class BackupCreator( private val animeBackupCreator: AnimeBackupCreator = AnimeBackupCreator(), private val mangaBackupCreator: MangaBackupCreator = MangaBackupCreator(), private val preferenceBackupCreator: PreferenceBackupCreator = PreferenceBackupCreator(), + private val animeExtensionRepoBackupCreator: AnimeExtensionRepoBackupCreator = AnimeExtensionRepoBackupCreator(), + private val mangaExtensionRepoBackupCreator: MangaExtensionRepoBackupCreator = MangaExtensionRepoBackupCreator(), private val animeSourcesBackupCreator: AnimeSourcesBackupCreator = AnimeSourcesBackupCreator(), private val mangaSourcesBackupCreator: MangaSourcesBackupCreator = MangaSourcesBackupCreator(), private val extensionsBackupCreator: ExtensionsBackupCreator = ExtensionsBackupCreator(context), @@ -94,6 +99,8 @@ class BackupCreator( backupSources = backupMangaSources(backupManga), backupAnimeSources = backupAnimeSources(backupAnime), backupPreferences = backupAppPreferences(options), + backupAnimeExtensionRepo = backupAnimeExtensionRepos(options), + backupMangaExtensionRepo = backupMangaExtensionRepos(options), backupSourcePreferences = backupSourcePreferences(options), backupExtensions = backupExtensions(options), ) @@ -165,6 +172,18 @@ class BackupCreator( return preferenceBackupCreator.createApp(includePrivatePreferences = options.privateSettings) } + private suspend fun backupAnimeExtensionRepos(options: BackupOptions): List { + if (!options.extensionRepoSettings) return emptyList() + + return animeExtensionRepoBackupCreator() + } + + private suspend fun backupMangaExtensionRepos(options: BackupOptions): List { + if (!options.extensionRepoSettings) return emptyList() + + return mangaExtensionRepoBackupCreator() + } + private fun backupSourcePreferences(options: BackupOptions): List { if (!options.sourceSettings) return emptyList() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt index 094ac95de7..80840edba9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt @@ -11,6 +11,7 @@ data class BackupOptions( val tracking: Boolean = true, val history: Boolean = true, val appSettings: Boolean = true, + val extensionRepoSettings: Boolean = true, val sourceSettings: Boolean = true, val privateSettings: Boolean = false, val extensions: Boolean = false, @@ -23,12 +24,13 @@ data class BackupOptions( tracking, history, appSettings, + extensionRepoSettings, sourceSettings, privateSettings, extensions, ) - fun canCreate() = libraryEntries || categories || appSettings || sourceSettings + fun canCreate() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings companion object { val libraryOptions = persistentListOf( @@ -68,6 +70,11 @@ data class BackupOptions( getter = BackupOptions::appSettings, setter = { options, enabled -> options.copy(appSettings = enabled) }, ), + Entry( + label = MR.strings.extensionRepo_settings, + getter = BackupOptions::extensionRepoSettings, + setter = { options, enabled -> options.copy(extensionRepoSettings = enabled) }, + ), Entry( label = MR.strings.source_settings, getter = BackupOptions::sourceSettings, @@ -96,9 +103,10 @@ data class BackupOptions( tracking = array[3], history = array[4], appSettings = array[5], - sourceSettings = array[6], - privateSettings = array[7], - extensions = array[8], + extensionRepoSettings = array[6], + sourceSettings = array[7], + privateSettings = array[8], + extensions = array[9], ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeExtensionRepoBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeExtensionRepoBackupCreator.kt new file mode 100644 index 0000000000..dafe2b6cf5 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeExtensionRepoBackupCreator.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.data.backup.create.creators + +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos +import eu.kanade.tachiyomi.data.backup.models.backupExtensionReposMapper +import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepo +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class AnimeExtensionRepoBackupCreator( + private val getAnimeExtensionRepos: GetAnimeExtensionRepo = Injekt.get(), +) { + + suspend operator fun invoke(): List { + return getAnimeExtensionRepos.getAll() + .map(backupExtensionReposMapper) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaExtensionRepoBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaExtensionRepoBackupCreator.kt new file mode 100644 index 0000000000..6a387d19fa --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaExtensionRepoBackupCreator.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.data.backup.create.creators + +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos +import eu.kanade.tachiyomi.data.backup.models.backupExtensionReposMapper +import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepo +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MangaExtensionRepoBackupCreator( + private val getMangaExtensionRepos: GetMangaExtensionRepo = Injekt.get(), +) { + + suspend operator fun invoke(): List { + return getMangaExtensionRepos.getAll() + .map(backupExtensionReposMapper) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt index 67ea342fa0..347e17a0fe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber +@Suppress("MagicNumber") @Serializable data class Backup( @ProtoNumber(1) val backupManga: List = emptyList(), @@ -17,4 +18,6 @@ data class Backup( @ProtoNumber(104) var backupPreferences: List = emptyList(), @ProtoNumber(105) var backupSourcePreferences: List = emptyList(), @ProtoNumber(106) var backupExtensions: List = emptyList(), + @ProtoNumber(107) var backupAnimeExtensionRepo: List = emptyList(), + @ProtoNumber(108) var backupMangaExtensionRepo: List = emptyList(), ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt new file mode 100644 index 0000000000..fa99686676 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt @@ -0,0 +1,25 @@ +package eu.kanade.tachiyomi.data.backup.models + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber +import mihon.domain.extensionrepo.model.ExtensionRepo + +@Suppress("MagicNumber") +@Serializable +class BackupExtensionRepos( + @ProtoNumber(1) var baseUrl: String, + @ProtoNumber(2) var name: String, + @ProtoNumber(3) var shortName: String?, + @ProtoNumber(4) var website: String, + @ProtoNumber(5) var signingKeyFingerprint: String, +) + +val backupExtensionReposMapper = { repo: ExtensionRepo -> + BackupExtensionRepos( + baseUrl = repo.baseUrl, + name = repo.name, + shortName = repo.shortName, + website = repo.website, + signingKeyFingerprint = repo.signingKeyFingerprint, + ) +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt index e5621683b1..98272b30a1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt @@ -7,13 +7,16 @@ import eu.kanade.tachiyomi.data.backup.BackupNotifier import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupExtension +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSourcePreferences import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeCategoriesRestorer +import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeExtensionRepoRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.ExtensionsRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaCategoriesRestorer +import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaExtensionRepoRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.PreferenceRestorer import eu.kanade.tachiyomi.util.system.createFileInCacheDir @@ -36,6 +39,8 @@ class BackupRestorer( private val animeCategoriesRestorer: AnimeCategoriesRestorer = AnimeCategoriesRestorer(), private val mangaCategoriesRestorer: MangaCategoriesRestorer = MangaCategoriesRestorer(), private val preferenceRestorer: PreferenceRestorer = PreferenceRestorer(context), + private val animeExtensionRepoRestorer: AnimeExtensionRepoRestorer = AnimeExtensionRepoRestorer(), + private val mangaExtensionRepoRestorer: MangaExtensionRepoRestorer = MangaExtensionRepoRestorer(), private val animeRestorer: AnimeRestorer = AnimeRestorer(), private val mangaRestorer: MangaRestorer = MangaRestorer(), private val extensionsRestorer: ExtensionsRestorer = ExtensionsRestorer(context), @@ -87,6 +92,9 @@ class BackupRestorer( if (options.appSettings) { restoreAmount += 1 } + if (options.extensionRepoSettings) { + restoreAmount += backup.backupAnimeExtensionRepo.size + backup.backupMangaExtensionRepo.size + } if (options.sourceSettings) { restoreAmount += 1 } @@ -111,6 +119,9 @@ class BackupRestorer( restoreAnime(backup.backupAnime, if (options.categories) backup.backupAnimeCategories else emptyList()) restoreManga(backup.backupManga, if (options.categories) backup.backupCategories else emptyList()) } + if (options.extensionRepoSettings) { + restoreExtensionRepos(backup.backupAnimeExtensionRepo, backup.backupMangaExtensionRepo) + } if (options.extensions) { restoreExtensions(backup.backupExtensions) } @@ -202,6 +213,49 @@ class BackupRestorer( ) } + private fun CoroutineScope.restoreExtensionRepos( + backupAnimeExtensionRepo: List, + backupMangaExtensionRepo: List, + ) = launch { + backupAnimeExtensionRepo + .forEach { + ensureActive() + + try { + animeExtensionRepoRestorer(it) + } catch (e: Exception) { + errors.add(Date() to "Error Adding Anime Repo: ${it.name} : ${e.message}") + } + + restoreProgress += 1 + notifier.showRestoreProgress( + context.stringResource(MR.strings.extensionRepo_settings), + restoreProgress, + restoreAmount, + isSync, + ) + } + + backupMangaExtensionRepo + .forEach { + ensureActive() + + try { + mangaExtensionRepoRestorer(it) + } catch (e: Exception) { + errors.add(Date() to "Error Adding Manga Repo: ${it.name} : ${e.message}") + } + + restoreProgress += 1 + notifier.showRestoreProgress( + context.stringResource(MR.strings.extensionRepo_settings), + restoreProgress, + restoreAmount, + isSync, + ) + } + } + private fun CoroutineScope.restoreExtensions(extensions: List) = launch { ensureActive() extensionsRestorer.restoreExtensions(extensions) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt index a8ef405365..14740c5502 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt @@ -8,6 +8,7 @@ data class RestoreOptions( val libraryEntries: Boolean = true, val categories: Boolean = true, val appSettings: Boolean = true, + val extensionRepoSettings: Boolean = true, val sourceSettings: Boolean = true, val extensions: Boolean = false, ) { @@ -16,11 +17,12 @@ data class RestoreOptions( libraryEntries, categories, appSettings, + extensionRepoSettings, sourceSettings, extensions, ) - fun canRestore() = libraryEntries || categories || appSettings || sourceSettings || extensions + fun canRestore() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings || extensions companion object { val options = persistentListOf( @@ -39,6 +41,11 @@ data class RestoreOptions( getter = RestoreOptions::appSettings, setter = { options, enabled -> options.copy(appSettings = enabled) }, ), + Entry( + label = MR.strings.extensionRepo_settings, + getter = RestoreOptions::extensionRepoSettings, + setter = { options, enabled -> options.copy(extensionRepoSettings = enabled) }, + ), Entry( label = MR.strings.source_settings, getter = RestoreOptions::sourceSettings, @@ -55,8 +62,9 @@ data class RestoreOptions( libraryEntries = array[0], categories = array[1], appSettings = array[2], - sourceSettings = array[3], - extensions = array[4], + extensionRepoSettings = array[3], + sourceSettings = array[4], + extensions = array[5], ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt new file mode 100644 index 0000000000..65daea3e7e --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt @@ -0,0 +1,38 @@ +package eu.kanade.tachiyomi.data.backup.restore.restorers + +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos +import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepo +import tachiyomi.data.handlers.anime.AnimeDatabaseHandler +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class AnimeExtensionRepoRestorer( + private val animeHandler: AnimeDatabaseHandler = Injekt.get(), + private val getExtensionRepos: GetAnimeExtensionRepo = Injekt.get(), +) { + + suspend operator fun invoke( + backupRepo: BackupExtensionRepos, + ) { + val dbRepos = getExtensionRepos.getAll() + val existingReposBySHA = dbRepos.associateBy { it.signingKeyFingerprint } + val existingReposByUrl = dbRepos.associateBy { it.baseUrl } + val urlExists = existingReposByUrl[backupRepo.baseUrl] + val shaExists = existingReposBySHA[backupRepo.signingKeyFingerprint] + if (urlExists != null && urlExists.signingKeyFingerprint != backupRepo.signingKeyFingerprint) { + error("Already Exists with different signing key fingerprint") + } else if (shaExists != null) { + error("${shaExists.name} has the same signing key fingerprint") + } else { + animeHandler.await { + extension_reposQueries.insert( + backupRepo.baseUrl, + backupRepo.name, + backupRepo.shortName, + backupRepo.website, + backupRepo.signingKeyFingerprint + ) + } + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt new file mode 100644 index 0000000000..ede044a9fc --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt @@ -0,0 +1,38 @@ +package eu.kanade.tachiyomi.data.backup.restore.restorers + +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos +import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepo +import tachiyomi.data.handlers.manga.MangaDatabaseHandler +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MangaExtensionRepoRestorer( + private val mangaHandler: MangaDatabaseHandler = Injekt.get(), + private val getExtensionRepos: GetMangaExtensionRepo = Injekt.get() +) { + + suspend operator fun invoke( + backupRepo: BackupExtensionRepos, + ) { + val dbRepos = getExtensionRepos.getAll() + val existingReposBySHA = dbRepos.associateBy { it.signingKeyFingerprint } + val existingReposByUrl = dbRepos.associateBy { it.baseUrl } + val urlExists = existingReposByUrl[backupRepo.baseUrl] + val shaExists = existingReposBySHA[backupRepo.signingKeyFingerprint] + if (urlExists != null && urlExists.signingKeyFingerprint != backupRepo.signingKeyFingerprint) { + error("Already Exists with different signing key fingerprint") + } else if (shaExists != null) { + error("${shaExists.name} has the same signing key fingerprint") + } else { + mangaHandler.await { + extension_reposQueries.insert( + backupRepo.baseUrl, + backupRepo.name, + backupRepo.shortName, + backupRepo.website, + backupRepo.signingKeyFingerprint + ) + } + } + } +} diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index b539cc68b8..604c52758d 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -481,6 +481,7 @@ What do you want to backup? App settings Source settings + Extension Repos Include sensitive settings (e.g., tracker login tokens) Creating backup Backup failed From 80f038fb785452dcfd0b7c56a0e2b1db6113c6a0 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sat, 26 Oct 2024 10:15:15 +0200 Subject: [PATCH 023/247] ExpandableMangaDescription: Adjust size transform anim spec Co-authored-by: ivan <12537387+ivaniskandar@users.noreply.github.com> Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../presentation/entries/anime/components/AnimeInfoHeader.kt | 4 +++- .../presentation/entries/manga/components/MangaInfoHeader.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt index 0d2c9317bc..f4f0bbe910 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt @@ -2,6 +2,7 @@ package eu.kanade.presentation.entries.anime.components import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.spring import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector @@ -276,7 +277,8 @@ fun ExpandableAnimeDescription( modifier = Modifier .padding(top = 8.dp) .padding(vertical = 12.dp) - .animateContentSize(), + .animateContentSize(animationSpec = spring()) + .fillMaxWidth(), ) { var showMenu by remember { mutableStateOf(false) } var tagSelected by remember { mutableStateOf("") } diff --git a/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt index 56d79df5f1..5585cd9fdb 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt @@ -2,6 +2,7 @@ package eu.kanade.presentation.entries.manga.components import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.spring import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector @@ -275,7 +276,8 @@ fun ExpandableMangaDescription( modifier = Modifier .padding(top = 8.dp) .padding(vertical = 12.dp) - .animateContentSize(), + .animateContentSize(animationSpec = spring()) + .fillMaxWidth(), ) { var showMenu by remember { mutableStateOf(false) } var tagSelected by remember { mutableStateOf("") } From 6924944b03d9998f4273728458349cdc1f463123 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 01:44:48 +0600 Subject: [PATCH 024/247] fix(deps): update paging.version to v3.3.2 (#1093) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 8e40146f96704c3dc98bbb4f9f89d470ffa32f69) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 5efbc45342..1592e5f728 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,7 +1,7 @@ [versions] agp_version = "8.5.1" lifecycle_version = "2.8.4" -paging_version = "3.3.1" +paging_version = "3.3.2" interpolator_version = "1.0.0" [libraries] From 9ea121ea0334fb936d7a4b47bed5142611ce42a5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 22:33:30 +0200 Subject: [PATCH 025/247] chore(deps): update gradle/actions action to v4 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build_pull_request.yml | 4 ++-- .github/workflows/build_push.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index 7f74d3fab3..dbad611417 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Validate Gradle Wrapper - uses: gradle/actions/wrapper-validation@d9c87d481d55275bb5441eef3fe0e46805f9ef70 # v3.5.0 + uses: gradle/actions/wrapper-validation@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 - name: Dependency Review uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # v4.3.4 @@ -37,7 +37,7 @@ jobs: distribution: adopt - name: Build app and run unit tests - uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 # v3.5.0 + uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 with: arguments: detekt assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index 2343357304..da8caaf881 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Validate Gradle Wrapper - uses: gradle/actions/wrapper-validation@d9c87d481d55275bb5441eef3fe0e46805f9ef70 # v3.5.0 + uses: gradle/actions/wrapper-validation@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 - name: Set up JDK uses: actions/setup-java@6a0805fcefea3d4657a47ac4c165951e33482018 # v4.2.2 @@ -34,7 +34,7 @@ jobs: distribution: adopt - name: Build app and run unit tests - uses: gradle/actions/setup-gradle@d9c87d481d55275bb5441eef3fe0e46805f9ef70 # v3.5.0 + uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 with: arguments: detekt assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest From 9aaab63ef3f1ffb06646e14086f3cc8644ce8323 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 04:22:33 +0600 Subject: [PATCH 026/247] fix(deps): update dependency androidx.annotation:annotation to v1.8.2 (#1090) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 36b9caeea8baf15f0d0ed37abc12638d44194c09) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 1592e5f728..4df8803814 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -7,7 +7,7 @@ interpolator_version = "1.0.0" [libraries] gradle = { module = "com.android.tools.build:gradle", version.ref = "agp_version" } -annotation = "androidx.annotation:annotation:1.8.1" +annotation = "androidx.annotation:annotation:1.8.2" appcompat = "androidx.appcompat:appcompat:1.7.0" biometricktx = "androidx.biometric:biometric-ktx:1.2.0-alpha05" constraintlayout = "androidx.constraintlayout:constraintlayout:2.1.4" From 2076e0d4d0b7c2763171891b563475cfbc6672c6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 04:23:36 +0600 Subject: [PATCH 027/247] fix(deps): update dependency androidx.work:work-runtime to v2.9.1 (#1091) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit af77083660000e7378587dbc8d44e44bd8b196ec) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 4df8803814..a6c6ce27f3 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -22,7 +22,7 @@ lifecycle-common = { module = "androidx.lifecycle:lifecycle-common", version.ref lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.ref = "lifecycle_version" } lifecycle-runtimektx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle_version" } -workmanager = "androidx.work:work-runtime:2.9.0" +workmanager = "androidx.work:work-runtime:2.9.1" paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "paging_version" } paging-compose = { module = "androidx.paging:paging-compose", version.ref = "paging_version" } From 4db364f7f8fe900dd9256dcc1a86b3fcbd165319 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 04:29:35 +0600 Subject: [PATCH 028/247] fix(deps): update dependency io.coil-kt.coil3:coil-bom to v3.0.0-alpha10 (#1092) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit e8b7c3e24bb677d289554b972ef2496a976c79aa) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 16b8a2876e..090f887290 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -41,7 +41,7 @@ preferencektx = "androidx.preference:preference-ktx:1.2.1" injekt-core = "com.github.inorichi.injekt:injekt-core:65b0440" -coil-bom = { module = "io.coil-kt.coil3:coil-bom", version = "3.0.0-alpha09" } +coil-bom = { module = "io.coil-kt.coil3:coil-bom", version = "3.0.0-alpha10" } coil-core = { module = "io.coil-kt.coil3:coil" } coil-gif = { module = "io.coil-kt.coil3:coil-gif" } coil-compose = { module = "io.coil-kt.coil3:coil-compose" } From c709c072d081f5a42255978db1a31c7cf6c26401 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 04:31:56 +0600 Subject: [PATCH 029/247] fix(deps): update dependency dev.chrisbanes.compose:compose-bom to v2024.08.00-alpha01 (#1094) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit dca9bf105770890e015b8e2f9fbf22f05665e343) --- gradle/compose.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index 29dc3acf00..35374b8d31 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,5 +1,5 @@ [versions] -compose-bom = "2024.07.00-alpha02" +compose-bom = "2024.08.00-alpha01" accompanist = "0.35.1-alpha" [libraries] From f4b040663ea9981e607858ba1e3e412eec6137f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 09:51:28 +0600 Subject: [PATCH 030/247] fix(deps): update dependency com.android.tools.build:gradle to v8.5.2 (#1099) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 4828c54245dd6532c0e7a2b6c8cf5d8a703d3376) --- gradle/androidx.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index a6c6ce27f3..1417861f29 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,5 +1,5 @@ [versions] -agp_version = "8.5.1" +agp_version = "8.5.2" lifecycle_version = "2.8.4" paging_version = "3.3.2" interpolator_version = "1.0.0" From 23b8a0627163ef565175c3a7dc28c4df268da458 Mon Sep 17 00:00:00 2001 From: Catting <5874051+mm12@users.noreply.github.com> Date: Sat, 10 Aug 2024 16:58:02 -0500 Subject: [PATCH 031/247] Contributing: ktLintFormat -> detekt (#1102) * Contributing: ktLintFormat -> detekt update Contributing info to use detekt instead of ktLintFormat * Update CONTRIBUTING.md --------- Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> (cherry picked from commit 14ae57d78b31f0bb3b58d19c1d8cfcebcc8e2253) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8cca4def05..db282fdf10 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,7 @@ Before you start, please note that the ability to use following technologies is ## Linting -To auto-fix some linting errors, run the `ktlintFormat` Gradle task. +Run the `detekt` gradle task. If the build fails, a report of issues can be found in `app/build/reports/detekt/`. The report is availble in several formats and details each issue that needs attention. ## Getting help From 2e6b1642e9aba3a8ffc0fb5c1b15ca0dcaa1dfb1 Mon Sep 17 00:00:00 2001 From: MajorTanya <39014446+majortanya@users.noreply.github.com> Date: Sun, 11 Aug 2024 18:40:28 +0200 Subject: [PATCH 032/247] Change Kitsu to kitsu.app domain cf. hummingbird-me/kitsu-server@244fdcc Co-authored-by: MajorTanya <39014446+MajorTanya@users.noreply.github.com> --- README.md | 2 +- .../eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ab36a21f99..bbd46ceca9 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Discover and watch anime, cartoons, series, and more – easier than ever on you * Local reading and watching of content. * A configurable reader with multiple viewers, reading directions and other settings. * A configurable player built on mpv-android with multiple options and settings. -* Tracker support: [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.io/), [MangaUpdates](https://mangaupdates.com), [Shikimori](https://shikimori.one), [Simkl](https://simkl.com/), and [Bangumi](https://bgm.tv/) support. +* Tracker support: [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.app/), [MangaUpdates](https://mangaupdates.com), [Shikimori](https://shikimori.one), [Simkl](https://simkl.com/), and [Bangumi](https://bgm.tv/) support. * Categories to organize your library. * Light and dark themes. * Schedule updating your library for new chapters/episodes. diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt index e4bb52397a..5da9a86173 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt @@ -475,11 +475,11 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) private const val clientSecret = "54d7307928f63414defd96399fc31ba847961ceaecef3a5fd93144e960c0e151" - private const val baseUrl = "https://kitsu.io/api/edge/" - private const val loginUrl = "https://kitsu.io/api/oauth/token" - private const val baseMangaUrl = "https://kitsu.io/manga/" - private const val baseAnimeUrl = "https://kitsu.io/anime/" - private const val algoliaKeyUrl = "https://kitsu.io/api/edge/algolia-keys/media/" + private const val baseUrl = "https://kitsu.app/api/edge/" + private const val loginUrl = "https://kitsu.app/api/oauth/token" + private const val baseMangaUrl = "https://kitsu.app/manga/" + private const val baseAnimeUrl = "https://kitsu.app/anime/" + private const val algoliaKeyUrl = "https://kitsu.app/api/edge/algolia-keys/media/" private const val algoliaUrl = "https://AWQO5J657S-dsn.algolia.net/1/indexes/production_media/query/" From 973a137716354c0904327951237711eca39bc421 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sat, 26 Oct 2024 10:22:35 +0200 Subject: [PATCH 033/247] Fix MAL search results not showing start dates The previous approach would always throw an Exception because `SimpleDateFormat.format()` expects the input to be of type `Date` or `Number`, not `String`. Co-authored-by: MajorTanya <39014446+MajorTanya@users.noreply.github.com> --- .../data/track/myanimelist/MyAnimeListApi.kt | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt index 47d0982925..bdbd1273c6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt @@ -157,12 +157,7 @@ class MyAnimeListApi( obj["status"]!!.jsonPrimitive.content.replace("_", " ") publishing_type = obj["media_type"]!!.jsonPrimitive.content.replace("_", " ") - start_date = try { - val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) - outputDf.format(obj["start_date"]!!) - } catch (e: Exception) { - "" - } + start_date = obj["start_date"]?.jsonPrimitive?.content ?: "" } } } @@ -198,12 +193,7 @@ class MyAnimeListApi( obj["status"]!!.jsonPrimitive.content.replace("_", " ") publishing_type = obj["media_type"]!!.jsonPrimitive.content.replace("_", " ") - start_date = try { - val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) - outputDf.format(obj["start_date"]!!) - } catch (e: Exception) { - "" - } + start_date = obj["start_date"]?.jsonPrimitive?.content ?: "" } } } From 5501da9d5cd51300c04d68c0860aa7fc02076e19 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sun, 11 Aug 2024 18:55:47 +0200 Subject: [PATCH 034/247] Translations update from Hosted Weblate (#939) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ar/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ca/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/cs/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/de/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/es/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/fil/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/id/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ja/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ml/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/ru/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/sv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon-plurals/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/am/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ar/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/be/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/bg/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/bn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ca/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ceb/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/cs/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/cv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/da/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/de/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/el/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/eo/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/es/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/eu/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fa/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fi/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fil/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/fr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/gl/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/he/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hi/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/hu/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/id/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/it/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ja/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/jv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ka/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/kk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/km/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/kn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ko/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/lt/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/lv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ml/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/mr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ms/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/nb_NO/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ne/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/nl/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/nn/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/pl/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/pt/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ro/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/ru/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sa/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sah/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sc/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sdh/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sq/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/sv/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/te/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/th/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/tr/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/uk/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/uz/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/vi/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/mihon/mihon/zh_Hant/ Translation: Mihon/Mihon Translation: Mihon/Mihon Plurals Co-authored-by: Ahmed seif al-nasr Co-authored-by: Ajeje Brazorf Co-authored-by: Akhil Raj Co-authored-by: Animeboynz <40583749+Animeboynz@users.noreply.github.com> Co-authored-by: David Katrinka Co-authored-by: Dexroneum Co-authored-by: Eduard Ereza Martínez Co-authored-by: Eji-san Co-authored-by: FateXBlood Co-authored-by: Giorgio Sanna Co-authored-by: Iker Lerones Co-authored-by: Infy's Tagalog Translations Co-authored-by: Lyfja <45209212+lyfja@users.noreply.github.com> Co-authored-by: Matyáš Caras Co-authored-by: Norsze Co-authored-by: Pitpe11 Co-authored-by: TheKingTermux Co-authored-by: abc0922001 Co-authored-by: bittin1ddc447d824349b2 Co-authored-by: gallegonovato Co-authored-by: gekka <1778962971@qq.com> Co-authored-by: sebastians17 Co-authored-by: vodkapmp Co-authored-by: ɴᴇᴋᴏ Co-authored-by: Артём Голуб (cherry picked from commit b1b15a93eec15a82e2e83650abf97c1b9f0c501c) --- i18n/src/commonMain/moko-resources/ca/plurals.xml | 5 +++++ i18n/src/commonMain/moko-resources/cs/plurals.xml | 5 +++++ i18n/src/commonMain/moko-resources/de/plurals.xml | 4 ++++ i18n/src/commonMain/moko-resources/es/plurals.xml | 7 ++++++- i18n/src/commonMain/moko-resources/in/plurals.xml | 3 +++ i18n/src/commonMain/moko-resources/ja/plurals.xml | 3 +++ i18n/src/commonMain/moko-resources/ml/plurals.xml | 10 +++++++++- i18n/src/commonMain/moko-resources/ru/plurals.xml | 6 ++++++ i18n/src/commonMain/moko-resources/zh-rTW/plurals.xml | 3 +++ 9 files changed, 44 insertions(+), 2 deletions(-) diff --git a/i18n/src/commonMain/moko-resources/ca/plurals.xml b/i18n/src/commonMain/moko-resources/ca/plurals.xml index 272e01a2a2..1cbbf626e3 100644 --- a/i18n/src/commonMain/moko-resources/ca/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ca/plurals.xml @@ -108,4 +108,9 @@ + + 1 pàgina + %1$s pàgines + %1$s pàgines + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/cs/plurals.xml b/i18n/src/commonMain/moko-resources/cs/plurals.xml index 15665bcaec..545f9f81cd 100644 --- a/i18n/src/commonMain/moko-resources/cs/plurals.xml +++ b/i18n/src/commonMain/moko-resources/cs/plurals.xml @@ -115,4 +115,9 @@ Za %1$d dny Za %1$d dnů + + 1 stránka + %1$s stránky + %1$s stránek + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/de/plurals.xml b/i18n/src/commonMain/moko-resources/de/plurals.xml index 58bcf3a901..502e325427 100644 --- a/i18n/src/commonMain/moko-resources/de/plurals.xml +++ b/i18n/src/commonMain/moko-resources/de/plurals.xml @@ -92,4 +92,8 @@ Morgen In %1$d Tagen + + 1 Seite + %1$s Seiten + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/es/plurals.xml b/i18n/src/commonMain/moko-resources/es/plurals.xml index fae5acc2dc..435401e915 100644 --- a/i18n/src/commonMain/moko-resources/es/plurals.xml +++ b/i18n/src/commonMain/moko-resources/es/plurals.xml @@ -1,7 +1,7 @@ - Tras %1$s minutos + Tras %1$s minuto Tras %1$s minutos Tras %1$s minutos @@ -115,4 +115,9 @@ Próximos %d episodios Próximos %d episodios + + 1 página + %1$s páginas + %1$s páginas + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/in/plurals.xml b/i18n/src/commonMain/moko-resources/in/plurals.xml index f641630316..60dd04c10f 100644 --- a/i18n/src/commonMain/moko-resources/in/plurals.xml +++ b/i18n/src/commonMain/moko-resources/in/plurals.xml @@ -69,4 +69,7 @@ %d Episode selanjutnya + + %1$s halaman + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/ja/plurals.xml b/i18n/src/commonMain/moko-resources/ja/plurals.xml index 9ff06d69ce..9ebfbccaa9 100644 --- a/i18n/src/commonMain/moko-resources/ja/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ja/plurals.xml @@ -51,4 +51,7 @@ %1$d 日後 + + %1$s ページ + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/ml/plurals.xml b/i18n/src/commonMain/moko-resources/ml/plurals.xml index 589be4b616..6101ae6000 100644 --- a/i18n/src/commonMain/moko-resources/ml/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ml/plurals.xml @@ -62,10 +62,18 @@ അധ്യായങ്ങൾ %1$s-ഉം പിന്നെ 1-ഉം - %1$s-ഉം %2$d-ഉം അധ്യായങ്ങൾ + %1$s അധ്യായങ്ങളും പിന്നെ %2$d-ഉം %d റിപ്പോ %d റിപ്പോകൾ + + 1 പേജ് + %1$s പേജ് + + + %d എൻട്രിക്ക് + %d എൻട്രികൾക്കായി + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/ru/plurals.xml b/i18n/src/commonMain/moko-resources/ru/plurals.xml index 9efe9c047a..457b9ecc98 100644 --- a/i18n/src/commonMain/moko-resources/ru/plurals.xml +++ b/i18n/src/commonMain/moko-resources/ru/plurals.xml @@ -138,4 +138,10 @@ + + 1 страница + %1$s страницы + %1$s страниц + %1$s страниц + \ No newline at end of file diff --git a/i18n/src/commonMain/moko-resources/zh-rTW/plurals.xml b/i18n/src/commonMain/moko-resources/zh-rTW/plurals.xml index 7d5f2bbfc0..49e1721e9d 100644 --- a/i18n/src/commonMain/moko-resources/zh-rTW/plurals.xml +++ b/i18n/src/commonMain/moko-resources/zh-rTW/plurals.xml @@ -51,4 +51,7 @@ %1$d 天後 + + %1$s pages + \ No newline at end of file From 8c75d6ccba8c78e80f67e6a8ad68d2ee2c1e7ea7 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sat, 26 Oct 2024 10:38:27 +0200 Subject: [PATCH 035/247] Add Copy Tracker URL on icon long press * Add Copy Tracker URL on icon long press Signed-off-by: Catt0s <5874051+mm12@users.noreply.github.com> * Add 'Copy To Clipboard' to tracker item menu Signed-off-by: Catt0s <5874051+mm12@users.noreply.github.com> * Add 'Copy link' to locales. Signed-off-by: Catt0s <5874051+mm12@users.noreply.github.com> * Implement code review suggestions > > Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Signed-off-by: Catt0s <5874051+mm12@users.noreply.github.com> * Update app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt --------- Signed-off-by: Catt0s <5874051+mm12@users.noreply.github.com> Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../track/anime/AnimeTrackInfoDialogHome.kt | 5 +++++ .../AnimeTrackInfoDialogHomePreviewProvider.kt | 2 ++ .../presentation/track/components/TrackLogoIcon.kt | 4 +++- .../track/manga/MangaTrackInfoDialogHome.kt | 13 +++++++++++++ .../MangaTrackInfoDialogHomePreviewProvider.kt | 2 ++ .../ui/entries/anime/track/AnimeTrackInfoDialog.kt | 9 +++++++++ .../ui/entries/manga/track/MangaTrackInfoDialog.kt | 9 +++++++++ i18n/src/commonMain/moko-resources/base/strings.xml | 1 + 8 files changed, 44 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt b/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt index 972f0ab65c..99bc81023a 100644 --- a/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt +++ b/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt @@ -61,6 +61,7 @@ fun AnimeTrackInfoDialogHome( onNewSearch: (AnimeTrackItem) -> Unit, onOpenInBrowser: (AnimeTrackItem) -> Unit, onRemoved: (AnimeTrackItem) -> Unit, + onCopyLink: (AnimeTrackItem) -> Unit, ) { Column( modifier = Modifier @@ -109,6 +110,7 @@ fun AnimeTrackInfoDialogHome( onNewSearch = { onNewSearch(item) }, onOpenInBrowser = { onOpenInBrowser(item) }, onRemoved = { onRemoved(item) }, + onCopyLink = { onCopyLink(item) }, ) } else { TrackInfoItemEmpty( @@ -137,6 +139,7 @@ private fun TrackInfoItem( onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, + onCopyLink: () -> Unit, ) { val context = LocalContext.current Column { @@ -146,6 +149,7 @@ private fun TrackInfoItem( TrackLogoIcon( tracker = tracker, onClick = onOpenInBrowser, + onLongClick = onCopyLink, ) Box( modifier = Modifier @@ -172,6 +176,7 @@ private fun TrackInfoItem( TrackInfoItemMenu( onOpenInBrowser = onOpenInBrowser, onRemoved = onRemoved, + onCopyLink = onCopyLink, ) } diff --git a/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHomePreviewProvider.kt b/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHomePreviewProvider.kt index 375829c5f0..ef907fb3cd 100644 --- a/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHomePreviewProvider.kt +++ b/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHomePreviewProvider.kt @@ -56,6 +56,7 @@ internal class AnimeTrackInfoDialogHomePreviewProvider : onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, + onCopyLink = {}, ) } @@ -71,6 +72,7 @@ internal class AnimeTrackInfoDialogHomePreviewProvider : onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, + onCopyLink = {}, ) } diff --git a/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt b/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt index 4dd03ecc71..7488d0da96 100644 --- a/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt +++ b/app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt @@ -22,9 +22,10 @@ import tachiyomi.presentation.core.util.clickableNoIndication fun TrackLogoIcon( tracker: Tracker, onClick: (() -> Unit)? = null, + onLongClick: (() -> Unit)? = null, ) { val modifier = if (onClick != null) { - Modifier.clickableNoIndication(onClick = onClick) + Modifier.clickableNoIndication(onClick = onClick, onLongClick = onLongClick) } else { Modifier } @@ -53,6 +54,7 @@ private fun TrackLogoIconPreviews( TrackLogoIcon( tracker = tracker, onClick = null, + onLongClick = null, ) } } diff --git a/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt b/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt index 7843458475..a684ce00f0 100644 --- a/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt +++ b/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt @@ -72,6 +72,7 @@ fun MangaTrackInfoDialogHome( onNewSearch: (MangaTrackItem) -> Unit, onOpenInBrowser: (MangaTrackItem) -> Unit, onRemoved: (MangaTrackItem) -> Unit, + onCopyLink: (MangaTrackItem) -> Unit, ) { Column( modifier = Modifier @@ -120,6 +121,7 @@ fun MangaTrackInfoDialogHome( onNewSearch = { onNewSearch(item) }, onOpenInBrowser = { onOpenInBrowser(item) }, onRemoved = { onRemoved(item) }, + onCopyLink = { onCopyLink(item) }, ) } else { TrackInfoItemEmpty( @@ -148,6 +150,7 @@ private fun TrackInfoItem( onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, + onCopyLink: () -> Unit, ) { val context = LocalContext.current Column { @@ -157,6 +160,7 @@ private fun TrackInfoItem( TrackLogoIcon( tracker = tracker, onClick = onOpenInBrowser, + onLongClick = onCopyLink, ) Box( modifier = Modifier @@ -183,6 +187,7 @@ private fun TrackInfoItem( TrackInfoItemMenu( onOpenInBrowser = onOpenInBrowser, onRemoved = onRemoved, + onCopyLink = onCopyLink, ) } @@ -291,6 +296,7 @@ private fun TrackInfoItemEmpty( fun TrackInfoItemMenu( onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, + onCopyLink: () -> Unit, ) { var expanded by remember { mutableStateOf(false) } Box(modifier = Modifier.wrapContentSize(Alignment.TopStart)) { @@ -311,6 +317,13 @@ fun TrackInfoItemMenu( expanded = false }, ) + DropdownMenuItem( + text = { Text(stringResource(MR.strings.action_copy_link)) }, + onClick = { + onCopyLink() + expanded = false + }, + ) DropdownMenuItem( text = { Text(stringResource(MR.strings.action_remove)) }, onClick = { diff --git a/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHomePreviewProvider.kt b/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHomePreviewProvider.kt index eebcb9ea56..ef46f97275 100644 --- a/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHomePreviewProvider.kt +++ b/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHomePreviewProvider.kt @@ -56,6 +56,7 @@ internal class MangaTrackInfoDialogHomePreviewProvider : onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, + onCopyLink = {}, ) } @@ -71,6 +72,7 @@ internal class MangaTrackInfoDialogHomePreviewProvider : onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, + onCopyLink = {}, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/track/AnimeTrackInfoDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/track/AnimeTrackInfoDialog.kt index a9052d64ff..753c266649 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/track/AnimeTrackInfoDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/track/AnimeTrackInfoDialog.kt @@ -55,6 +55,7 @@ import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone +import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList @@ -175,6 +176,7 @@ data class AnimeTrackInfoDialogHomeScreen( ), ) }, + onCopyLink = { context.copyTrackerLink(it) }, ) } @@ -188,6 +190,13 @@ data class AnimeTrackInfoDialogHomeScreen( } } + private fun Context.copyTrackerLink(trackItem: AnimeTrackItem) { + val url = trackItem.track?.remoteUrl ?: return + if (url.isNotBlank()) { + copyToClipboard(url, url) + } + } + private class Model( private val animeId: Long, private val sourceId: Long, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/track/MangaTrackInfoDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/track/MangaTrackInfoDialog.kt index 53a2c4fa1e..ec6f330367 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/track/MangaTrackInfoDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/track/MangaTrackInfoDialog.kt @@ -55,6 +55,7 @@ import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone +import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList @@ -175,6 +176,7 @@ data class MangaTrackInfoDialogHomeScreen( ), ) }, + onCopyLink = { context.copyTrackerLink(it) }, ) } @@ -188,6 +190,13 @@ data class MangaTrackInfoDialogHomeScreen( } } + private fun Context.copyTrackerLink(trackItem: MangaTrackItem) { + val url = trackItem.track?.remoteUrl ?: return + if (url.isNotBlank()) { + copyToClipboard(url, url) + } + } + private class Model( private val mangaId: Long, private val sourceId: Long, diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 604c52758d..9cb062779c 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -99,6 +99,7 @@ Resume Open in browser Copy to clipboard + Copy link Open in WebView WebView Migrate From 364fbc516128047cb8ed47d574b35845f2ebf645 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Mon, 12 Aug 2024 02:50:45 +0600 Subject: [PATCH 036/247] Add a button to select all scanlators Resolves #943 Closes #1109 (cherry picked from commit 84b2164787a795f3fd757c325cbfb6ef660ac3a3) --- .../entries/manga/components/ScanlatorFilterDialog.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/entries/manga/components/ScanlatorFilterDialog.kt b/app/src/main/java/eu/kanade/presentation/entries/manga/components/ScanlatorFilterDialog.kt index aef644c6c0..ae905e943f 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/manga/components/ScanlatorFilterDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/manga/components/ScanlatorFilterDialog.kt @@ -108,8 +108,14 @@ fun ScanlatorFilterDialog( } } else { FlowRow { - TextButton(onClick = mutableExcludedScanlators::clear) { - Text(text = stringResource(MR.strings.action_reset)) + if (mutableExcludedScanlators.isEmpty()) { + TextButton(onClick = { mutableExcludedScanlators.addAll(availableScanlators) }) { + Text(text = stringResource(MR.strings.action_select_all)) + } + } else { + TextButton(onClick = mutableExcludedScanlators::clear) { + Text(text = stringResource(MR.strings.action_reset)) + } } Spacer(modifier = Modifier.weight(1f)) TextButton(onClick = onDismissRequest) { From e40b81b077515ffdaa221f9386554e6c7aceffaa Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Mon, 12 Aug 2024 03:21:17 +0600 Subject: [PATCH 037/247] Fix UI freeze after migration Fixes #938 (cherry picked from commit 3f1d28c3833e6b868152149ed02b3fb8c54eccef) --- .../java/mihon/core/migration/MigrationStrategyFactory.kt | 4 +--- app/src/main/java/mihon/core/migration/Migrator.kt | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/mihon/core/migration/MigrationStrategyFactory.kt b/app/src/main/java/mihon/core/migration/MigrationStrategyFactory.kt index 7e06fecb3d..0905cc086a 100644 --- a/app/src/main/java/mihon/core/migration/MigrationStrategyFactory.kt +++ b/app/src/main/java/mihon/core/migration/MigrationStrategyFactory.kt @@ -6,15 +6,13 @@ class MigrationStrategyFactory( ) { fun create(old: Int, new: Int): MigrationStrategy { - val versions = (old + 1)..new val strategy = when { old == 0 -> InitialMigrationStrategy( strategy = DefaultMigrationStrategy(factory, migrationCompletedListener, Migrator.scope), ) - old >= new -> NoopMigrationStrategy(false) else -> VersionRangeMigrationStrategy( - versions = versions, + versions = (old + 1)..new, strategy = DefaultMigrationStrategy(factory, migrationCompletedListener, Migrator.scope), ) } diff --git a/app/src/main/java/mihon/core/migration/Migrator.kt b/app/src/main/java/mihon/core/migration/Migrator.kt index 11f22a8c9b..2296aa0747 100644 --- a/app/src/main/java/mihon/core/migration/Migrator.kt +++ b/app/src/main/java/mihon/core/migration/Migrator.kt @@ -10,7 +10,7 @@ import kotlinx.coroutines.runBlocking object Migrator { private var result: Deferred? = null - val scope = CoroutineScope(Dispatchers.Main + Job()) + val scope = CoroutineScope(Dispatchers.IO + Job()) fun initialize( old: Int, From b2e91517e74d9ef5f20f8e6c0bc795683855050b Mon Sep 17 00:00:00 2001 From: Catting <5874051+mm12@users.noreply.github.com> Date: Sun, 11 Aug 2024 16:52:47 -0500 Subject: [PATCH 038/247] Add an "open in browser" button to reader menu (#1110) * Add an "open in browser" button to reader menu Signed-off-by: Catting <5874051+mm12@users.noreply.github.com> * fixup! Add an "open in browser" button to reader menu Signed-off-by: Catting <5874051+mm12@users.noreply.github.com> --------- Signed-off-by: Catting <5874051+mm12@users.noreply.github.com> (cherry picked from commit c5994e057b37484fec3a5300491946afe377a90a) --- .../kanade/presentation/reader/appbars/ReaderAppBars.kt | 9 +++++++++ .../java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt index 9641724837..124f3a6c35 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt @@ -45,6 +45,7 @@ fun ReaderAppBars( onClickTopAppBar: () -> Unit, bookmarked: Boolean, onToggleBookmarked: () -> Unit, + onOpenInBrowser: (() -> Unit)?, onOpenInWebView: (() -> Unit)?, onShare: (() -> Unit)?, @@ -119,6 +120,14 @@ fun ReaderAppBars( onClick = onToggleBookmarked, ), ) + onOpenInBrowser?.let { + add( + AppBar.OverflowAction( + title = stringResource(MR.strings.action_open_in_browser), + onClick = it, + ), + ) + } onOpenInWebView?.let { add( AppBar.OverflowAction( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index cc32ac083a..c93f3658ea 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -76,6 +76,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.ReaderProgressIndicator import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.util.system.hasDisplayCutout import eu.kanade.tachiyomi.util.system.isNightMode +import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.setComposeContent @@ -395,6 +396,7 @@ class ReaderActivity : BaseActivity() { onClickTopAppBar = ::openMangaScreen, bookmarked = state.bookmarked, onToggleBookmarked = viewModel::toggleChapterBookmark, + onOpenInBrowser = ::openChapterInBrowser.takeIf { isHttpSource }, onOpenInWebView = ::openChapterInWebView.takeIf { isHttpSource }, onShare = ::shareChapter.takeIf { isHttpSource }, @@ -570,6 +572,12 @@ class ReaderActivity : BaseActivity() { } } + private fun openChapterInBrowser() { + assistUrl?.let { + openInBrowser(it.toUri(), forceDefaultBrowser = false) + } + } + private fun openChapterInWebView() { val manga = viewModel.manga ?: return val source = viewModel.getSource() ?: return From 0cf8a7cdfe65558799e496d3486e44ab1f86cb8d Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Mon, 12 Aug 2024 05:22:56 +0600 Subject: [PATCH 039/247] Handle Android SDK 35 API collision Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../tachiyomi/extension/anime/installer/InstallerAnime.kt | 2 +- .../tachiyomi/extension/manga/installer/InstallerManga.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/InstallerAnime.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/InstallerAnime.kt index eaa6c45e51..a894f3c8e5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/InstallerAnime.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/InstallerAnime.kt @@ -102,7 +102,7 @@ abstract class InstallerAnime(private val service: Service) { } val nextEntry = queue.first() if (waitingInstall.compareAndSet(null, nextEntry)) { - queue.removeFirst() + queue.removeAt(0) processEntry(nextEntry) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/InstallerManga.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/InstallerManga.kt index 37c9edbbc6..2c90443abc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/InstallerManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/InstallerManga.kt @@ -102,7 +102,7 @@ abstract class InstallerManga(private val service: Service) { } val nextEntry = queue.first() if (waitingInstall.compareAndSet(null, nextEntry)) { - queue.removeFirst() + queue.removeAt(0) processEntry(nextEntry) } } From 3da7fbb281331fcbefb5184ce7e565a2dc5dbe6d Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sun, 27 Oct 2024 10:27:04 +0100 Subject: [PATCH 040/247] Fix some migrations never running Both `SetupBackupCreateMigration` and `SetupLibraryUpdateMigration` were trying to get the `App` class from Injekt which is never provided via the `AppModule`. Using `Application` instead works since the `workManager` property used by the respective `setupTask` functions is an extension property on `Context`. Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Co-authored-by: MajorTanya <39014446+MajorTanya@users.noreply.github.com> --- .../migration/migrations/SetupAnimeLibraryUpdateMigration.kt | 4 ++-- .../core/migration/migrations/SetupBackupCreateMigration.kt | 4 ++-- .../migration/migrations/SetupMangaLibraryUpdateMigration.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/mihon/core/migration/migrations/SetupAnimeLibraryUpdateMigration.kt b/app/src/main/java/mihon/core/migration/migrations/SetupAnimeLibraryUpdateMigration.kt index 73e5d43809..67fe4495fc 100644 --- a/app/src/main/java/mihon/core/migration/migrations/SetupAnimeLibraryUpdateMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/SetupAnimeLibraryUpdateMigration.kt @@ -1,6 +1,6 @@ package mihon.core.migration.migrations -import eu.kanade.tachiyomi.App +import android.app.Application import eu.kanade.tachiyomi.data.library.anime.AnimeLibraryUpdateJob import mihon.core.migration.Migration import mihon.core.migration.MigrationContext @@ -9,7 +9,7 @@ class SetupAnimeLibraryUpdateMigration : Migration { override val version: Float = Migration.ALWAYS override suspend fun invoke(migrationContext: MigrationContext): Boolean { - val context = migrationContext.get() ?: return false + val context = migrationContext.get() ?: return false AnimeLibraryUpdateJob.setupTask(context) diff --git a/app/src/main/java/mihon/core/migration/migrations/SetupBackupCreateMigration.kt b/app/src/main/java/mihon/core/migration/migrations/SetupBackupCreateMigration.kt index 8b637a3263..f5361d9c49 100644 --- a/app/src/main/java/mihon/core/migration/migrations/SetupBackupCreateMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/SetupBackupCreateMigration.kt @@ -1,6 +1,6 @@ package mihon.core.migration.migrations -import eu.kanade.tachiyomi.App +import android.app.Application import eu.kanade.tachiyomi.data.backup.create.BackupCreateJob import mihon.core.migration.Migration import mihon.core.migration.MigrationContext @@ -9,7 +9,7 @@ class SetupBackupCreateMigration : Migration { override val version: Float = Migration.ALWAYS override suspend fun invoke(migrationContext: MigrationContext): Boolean { - val context = migrationContext.get() ?: return false + val context = migrationContext.get() ?: return false BackupCreateJob.setupTask(context) diff --git a/app/src/main/java/mihon/core/migration/migrations/SetupMangaLibraryUpdateMigration.kt b/app/src/main/java/mihon/core/migration/migrations/SetupMangaLibraryUpdateMigration.kt index 6df1c138ce..3620fcc2a4 100644 --- a/app/src/main/java/mihon/core/migration/migrations/SetupMangaLibraryUpdateMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/SetupMangaLibraryUpdateMigration.kt @@ -1,6 +1,6 @@ package mihon.core.migration.migrations -import eu.kanade.tachiyomi.App +import android.app.Application import eu.kanade.tachiyomi.data.library.manga.MangaLibraryUpdateJob import mihon.core.migration.Migration import mihon.core.migration.MigrationContext @@ -9,7 +9,7 @@ class SetupMangaLibraryUpdateMigration : Migration { override val version: Float = Migration.ALWAYS override suspend fun invoke(migrationContext: MigrationContext): Boolean { - val context = migrationContext.get() ?: return false + val context = migrationContext.get() ?: return false MangaLibraryUpdateJob.setupTask(context) From a3da2d6daa3870bb5042112de6d4ba95b8fb9095 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sun, 27 Oct 2024 10:27:31 +0100 Subject: [PATCH 041/247] Create CHANGELOG.md --- CHANGELOG.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..193e0ddac7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,65 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is a modified version of [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +- `Added` - for new features. +- `Changed ` - for changes in existing functionality. +- `Improved` - for enhancement or optimization in existing functionality. +- `Removed` - for now removed features. +- `Fixed` - for any bug fixes. +- `Other` - for technical stuff. + +## [Unreleased] +### Added + +- feat(external-players): add mpvKt ([@Secozzi](https://github.com/Secozzi)) ([#1674](https://github.com/aniyomiorg/aniyomi/pull/1674)) +- feat(player): video filters ([@abdallahmehiz](https://github.com/abdallahmehiz)) ([#1698](https://github.com/aniyomiorg/aniyomi/pull/1698)) +- feat(player): Add better auto sub select ([@Secozzi](https://github.com/Secozzi)) ([#1706](https://github.com/aniyomiorg/aniyomi/pull/1706)) +- feat(downloader): Copy the file location when using ext downloader ([@quickdesh](https://github.com/quickdesh)) ([#1758](https://github.com/aniyomiorg/aniyomi/pull/1758)) + +### Improved + +- feat(entry): show "Now" instead of "0 minutes ago" ([@Secozzi](https://github.com/Secozzi)) ([#1715](https://github.com/aniyomiorg/aniyomi/pull/1715)) + +### Fixed + +- Fix enhanced tracking for jellyfin ([@Secozzi](https://github.com/Secozzi)) ([#1656](https://github.com/aniyomiorg/aniyomi/pull/1656), [#1658](https://github.com/aniyomiorg/aniyomi/pull/1658)) +- fix(animescreen): Fix airing time not showing ([@Secozzi](https://github.com/Secozzi)) ([#1720](https://github.com/aniyomiorg/aniyomi/pull/1720)) +- fix hidden categories getting reset after delete/reorder ([@cuong-tran](https://github.com/cuong-tran)) ([#1780](https://github.com/aniyomiorg/aniyomi/pull/1780)) +- Fix episode progress not being saved and duplicate tracks ([@perokhe](https://github.com/perokhe)) ([#1784](https://github.com/aniyomiorg/aniyomi/pull/1784), [#1785](https://github.com/aniyomiorg/aniyomi/pull/1785)) + +### Other + +- Merge from mihon until 0.16.5 ([@Secozzi](https://github.com/Secozzi)) ([#1663](https://github.com/aniyomiorg/aniyomi/pull/1663)) + - Merge until latest mihon commits ([@Secozzi](https://github.com/Secozzi)) ([#1693](https://github.com/aniyomiorg/aniyomi/pull/1693)) + +## [v0.16.4.3] - 2024-07-01 +### Fixed + +- Fix extensions disappearing due to errors with the ClassLoader ([@jmir1](https://github.com/jmir1)) ([`959f84a`](https://github.com/aniyomiorg/aniyomi/commit/959f84ab41859f90c458c076d83d363ae086e47f)) + +## [v0.16.4.2] - 2024-07-01 +### Fixed + +- Hotfix to eliminate all proguard issues causing errors and crashes ([@jmir1](https://github.com/jmir1)) ([`a8cd723`](https://github.com/aniyomiorg/aniyomi/commit/a8cd7233dfdf26c98ff86b1871a7ac5774379b5e), [`a7644c2`](https://github.com/aniyomiorg/aniyomi/commit/a7644c268153fc0b9f10c27202591f960c6f6384), [`5045fa1`](https://github.com/aniyomiorg/aniyomi/commit/5045fa18ce5a1faa2130f1a33609e43d8453f078)) + +## [v0.16.4.1] - 2024-07-01 +### Fixed + +- Hotfix release to address errors with extensions ([@jmir1](https://github.com/jmir1)) ([`98d2528`](https://github.com/aniyomiorg/aniyomi/commit/98d252866e17beba7d9a4d094797e23c05ead6c1)) + +## [v0.16.4.0] - 2024-07-01 +### Fixed + +- fix(pip): pip not broadcasting intent in A14+ ([@quickdesh](https://github.com/quickdesh)) ([#1603](https://github.com/aniyomiorg/aniyomi/pull/1603)) +- fix: advanced player settings crash in android ≤ 10 ([@perokhe](https://github.com/perokhe)) ([#1627](https://github.com/aniyomiorg/aniyomi/pull/1627)) + +### Improved + +- feat: hide the skip intro button if the skipped amount == 0 ([@abdallahmehiz](https://github.com/abdallahmehiz)) ([#1598](https://github.com/aniyomiorg/aniyomi/pull/1598)) + +### Other + +- Merge from mihon until mihon 0.16.2 ([@Secozzi](https://github.com/Secozzi)) ([#1578](https://github.com/aniyomiorg/aniyomi/pull/1578)) + - Merge from mihon until 0.16.4 ([@Secozzi](https://github.com/Secozzi)) ([#1601](https://github.com/aniyomiorg/aniyomi/pull/1601)) \ No newline at end of file From c2945c3e620ed55b82cd9c24bfd3f56c9255b865 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+antsylich@users.noreply.github.com> Date: Tue, 13 Aug 2024 08:42:32 +0200 Subject: [PATCH 042/247] Sync compose theme with MDC theme (cherry picked from commit 9a34ace09c66274e6c2b3f9446058a0fa99d4bd0) --- app/src/main/res/values-night/themes.xml | 9 +- app/src/main/res/values/themes.xml | 172 +++++++++++++----- .../main/res/values-night/color_lavender.xml | 46 +++-- .../src/main/res/values-night/colors.xml | 5 - .../res/values-night/colors_greenapple.xml | 53 ++++-- .../res/values-night/colors_midnightdusk.xml | 19 +- .../src/main/res/values-night/colors_nord.xml | 20 +- .../res/values-night/colors_strawberry.xml | 49 +++-- .../res/values-night/colors_tachiyomi.xml | 49 +++-- .../src/main/res/values-night/colors_tako.xml | 21 ++- .../res/values-night/colors_tealturqoise.xml | 16 +- .../res/values-night/colors_tidalwave.xml | 15 +- .../main/res/values-night/colors_yinyang.xml | 14 +- .../main/res/values-night/colors_yotsuba.xml | 14 +- .../src/main/res/values/color_lavender.xml | 42 +++-- .../src/main/res/values/colors.xml | 14 +- .../src/main/res/values/colors_greenapple.xml | 51 ++++-- .../main/res/values/colors_midnightdusk.xml | 19 +- .../src/main/res/values/colors_nord.xml | 15 +- .../src/main/res/values/colors_strawberry.xml | 51 ++++-- .../src/main/res/values/colors_tachiyomi.xml | 45 +++-- .../src/main/res/values/colors_tako.xml | 15 +- .../main/res/values/colors_tealturqoise.xml | 18 +- .../src/main/res/values/colors_tidalwave.xml | 16 +- .../src/main/res/values/colors_yinyang.xml | 14 +- .../src/main/res/values/colors_yotsuba.xml | 16 +- 26 files changed, 536 insertions(+), 282 deletions(-) diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 24200c4077..c79fcf02ae 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -4,8 +4,13 @@ diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 14d86a2473..1957ed3863 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -15,6 +15,7 @@ @color/tachiyomi_onPrimary @color/tachiyomi_primaryContainer @color/tachiyomi_onPrimaryContainer + @color/tachiyomi_inversePrimary @color/tachiyomi_secondary @color/tachiyomi_onSecondary @color/tachiyomi_secondaryContainer @@ -29,14 +30,20 @@ @color/tachiyomi_onSurface @color/tachiyomi_surfaceVariant @color/tachiyomi_onSurfaceVariant - @color/tachiyomi_outline - @color/tachiyomi_inverseOnSurface + @color/tachiyomi_surfaceTint @color/tachiyomi_inverseSurface - @color/tachiyomi_primaryInverse - @color/error - @color/onError - @color/errorContainer - @color/onErrorContainer + @color/tachiyomi_inverseOnSurface + @color/tachiyomi_error + @color/tachiyomi_onError + @color/tachiyomi_errorContainer + @color/tachiyomi_onErrorContainer + @color/tachiyomi_outline + @color/tachiyomi_outlineVariant + @color/tachiyomi_surfaceContainer + @color/tachiyomi_surfaceContainerHigh + @color/tachiyomi_surfaceContainerHighest + @color/tachiyomi_surfaceContainerLow + @color/tachiyomi_surfaceContainerLowest @color/divider_default @drawable/line_divider @@ -52,7 +59,7 @@ @bool/lightStatusBar @android:color/transparent - @color/surface_amoled + @color/amoled_surface @null false false @@ -119,6 +126,7 @@ @color/greenapple_onPrimary @color/greenapple_primaryContainer @color/greenapple_onPrimaryContainer + @color/greenapple_inversePrimary @color/greenapple_secondary @color/greenapple_onSecondary @color/greenapple_secondaryContainer @@ -133,10 +141,22 @@ @color/greenapple_onSurface @color/greenapple_surfaceVariant @color/greenapple_onSurfaceVariant - @color/greenapple_outline - @color/greenapple_inverseOnSurface @color/greenapple_inverseSurface - @color/greenapple_primaryInverse + @color/greenapple_inverseOnSurface + @color/greenapple_error + @color/greenapple_onError + @color/greenapple_errorContainer + @color/greenapple_onErrorContainer + @color/greenapple_outline + @color/greenapple_outlineVariant + @color/greenapple_scrim + @color/greenapple_surfaceBright + @color/greenapple_surfaceDim + @color/greenapple_surfaceContainer + @color/greenapple_surfaceContainerHigh + @color/greenapple_surfaceContainerHighest + @color/greenapple_surfaceContainerLow + @color/greenapple_surfaceContainerLowest @@ -146,6 +166,7 @@ @color/lavender_onPrimary @color/lavender_primaryContainer @color/lavender_onPrimaryContainer + @color/lavender_inversePrimary @color/lavender_secondary @color/lavender_onSecondary @color/lavender_secondaryContainer @@ -160,11 +181,22 @@ @color/lavender_onSurface @color/lavender_surfaceVariant @color/lavender_onSurfaceVariant - @color/lavender_outline - @color/lavender_inverseOnSurface @color/lavender_inverseSurface - @color/lavender_primaryInverse - @color/lavender_elevationOverlay + @color/lavender_inverseOnSurface + @color/lavender_error + @color/lavender_onError + @color/lavender_errorContainer + @color/lavender_onErrorContainer + @color/lavender_outline + @color/lavender_outlineVariant + @color/lavender_scrim + @color/lavender_surfaceBright + @color/lavender_surfaceDim + @color/lavender_surfaceContainer + @color/lavender_surfaceContainerHigh + @color/lavender_surfaceContainerHighest + @color/lavender_surfaceContainerLow + @color/lavender_surfaceContainerLowest @@ -174,6 +206,7 @@ @color/midnightdusk_onPrimary @color/midnightdusk_primaryContainer @color/midnightdusk_onPrimaryContainer + @color/midnightdusk_inversePrimary @color/midnightdusk_secondary @color/midnightdusk_onSecondary @color/midnightdusk_secondaryContainer @@ -188,11 +221,15 @@ @color/midnightdusk_onSurface @color/midnightdusk_surfaceVariant @color/midnightdusk_onSurfaceVariant - @color/midnightdusk_outline - @color/midnightdusk_inverseOnSurface + @color/midnightdusk_surfaceTint @color/midnightdusk_inverseSurface - @color/midnightdusk_primaryInverse - @color/midnightdusk_elevationOverlay + @color/midnightdusk_inverseOnSurface + @color/midnightdusk_outline + @color/midnightdusk_surfaceContainer + @color/midnightdusk_surfaceContainerHigh + @color/midnightdusk_surfaceContainerHighest + @color/midnightdusk_surfaceContainerLow + @color/midnightdusk_surfaceContainerLowest @@ -229,6 +266,7 @@ @color/strawberry_onPrimary @color/strawberry_primaryContainer @color/strawberry_onPrimaryContainer + @color/strawberry_inversePrimary @color/strawberry_secondary @color/strawberry_onSecondary @color/strawberry_secondaryContainer @@ -243,10 +281,22 @@ @color/strawberry_onSurface @color/strawberry_surfaceVariant @color/strawberry_onSurfaceVariant - @color/strawberry_outline - @color/strawberry_inverseOnSurface @color/strawberry_inverseSurface - @color/strawberry_primaryInverse + @color/strawberry_inverseOnSurface + @color/strawberry_error + @color/strawberry_onError + @color/strawberry_errorContainer + @color/strawberry_onErrorContainer + @color/strawberry_outline + @color/strawberry_outlineVariant + @color/strawberry_scrim + @color/strawberry_surfaceBright + @color/strawberry_surfaceDim + @color/strawberry_surfaceContainer + @color/strawberry_surfaceContainerHigh + @color/strawberry_surfaceContainerHighest + @color/strawberry_surfaceContainerLow + @color/strawberry_surfaceContainerLowest @@ -256,6 +306,7 @@ @color/tako_onPrimary @color/tako_primaryContainer @color/tako_onPrimaryContainer + @color/tako_inversePrimary @color/tako_secondary @color/tako_onSecondary @color/tako_secondaryContainer @@ -270,11 +321,15 @@ @color/tako_onSurface @color/tako_surfaceVariant @color/tako_onSurfaceVariant - @color/tako_outline - @color/tako_inverseOnSurface + @color/tako_surfaceTint @color/tako_inverseSurface - @color/tako_primaryInverse - @color/tako_elevationOverlay + @color/tako_inverseOnSurface + @color/tako_outline + @color/tako_surfaceContainer + @color/tako_surfaceContainerHigh + @color/tako_surfaceContainerHighest + @color/tako_surfaceContainerLow + @color/tako_surfaceContainerLowest @@ -284,6 +339,7 @@ @color/tealturquoise_onPrimary @color/tealturquoise_primaryContainer @color/tealturquoise_onPrimaryContainer + @color/tealturquoise_inversePrimary @color/tealturquoise_secondary @color/tealturquoise_onSecondary @color/tealturquoise_secondaryContainer @@ -298,13 +354,15 @@ @color/tealturquoise_onSurface @color/tealturquoise_surfaceVariant @color/tealturquoise_onSurfaceVariant - @color/tealturquoise_outline - @color/tealturquoise_inverseOnSurface + @color/tealturquoise_surfaceTint @color/tealturquoise_inverseSurface - @color/tealturquoise_primaryInverse - @color/tealturquoise_tertiary - @color/tealturquoise_onTertiary - @color/tealturquoise_elevationOverlay + @color/tealturquoise_inverseOnSurface + @color/tealturquoise_outline + @color/tealturquoise_surfaceContainer + @color/tealturquoise_surfaceContainerHigh + @color/tealturquoise_surfaceContainerHighest + @color/tealturquoise_surfaceContainerLow + @color/tealturquoise_surfaceContainerLowest @@ -314,6 +372,7 @@ @color/yinyang_onPrimary @color/yinyang_primaryContainer @color/yinyang_onPrimaryContainer + @color/yinyang_inversePrimary @color/yinyang_secondary @color/yinyang_onSecondary @color/yinyang_secondaryContainer @@ -328,10 +387,15 @@ @color/yinyang_onSurface @color/yinyang_surfaceVariant @color/yinyang_onSurfaceVariant - @color/yinyang_outline - @color/yinyang_inverseOnSurface + @color/yinyang_surfaceTint @color/yinyang_inverseSurface - @color/yinyang_primaryInverse + @color/yinyang_inverseOnSurface + @color/yinyang_outline + @color/yinyang_surfaceContainer + @color/yinyang_surfaceContainerHigh + @color/yinyang_surfaceContainerHighest + @color/yinyang_surfaceContainerLow + @color/yinyang_surfaceContainerLowest @@ -341,6 +405,7 @@ @color/yotsuba_onPrimary @color/yotsuba_primaryContainer @color/yotsuba_onPrimaryContainer + @color/yotsuba_inversePrimary @color/yotsuba_secondary @color/yotsuba_onSecondary @color/yotsuba_secondaryContainer @@ -355,10 +420,15 @@ @color/yotsuba_onSurface @color/yotsuba_surfaceVariant @color/yotsuba_onSurfaceVariant - @color/yotsuba_outline - @color/yotsuba_inverseOnSurface + @color/yotsuba_surfaceTint @color/yotsuba_inverseSurface - @color/yotsuba_primaryInverse + @color/yotsuba_inverseOnSurface + @color/yotsuba_outline + @color/yotsuba_surfaceContainer + @color/yotsuba_surfaceContainerHigh + @color/yotsuba_surfaceContainerHighest + @color/yotsuba_surfaceContainerLow + @color/yotsuba_surfaceContainerLowest @@ -476,6 +546,7 @@ @color/tidalwave_onPrimary @color/tidalwave_primaryContainer @color/tidalwave_onPrimaryContainer + @color/tidalwave_inversePrimary @color/tidalwave_secondary @color/tidalwave_onSecondary @color/tidalwave_secondaryContainer @@ -490,10 +561,15 @@ @color/tidalwave_onSurface @color/tidalwave_surfaceVariant @color/tidalwave_onSurfaceVariant - @color/tidalwave_outline - @color/tidalwave_inverseOnSurface + @color/tidalwave_surfaceTint @color/tidalwave_inverseSurface - @color/tidalwave_primaryInverse + @color/tidalwave_inverseOnSurface + @color/tidalwave_outline + @color/tidalwave_surfaceContainer + @color/tidalwave_surfaceContainerHigh + @color/tidalwave_surfaceContainerHighest + @color/tidalwave_surfaceContainerLow + @color/tidalwave_surfaceContainerLowest @@ -503,6 +579,7 @@ @color/nord_onPrimary @color/nord_primaryContainer @color/nord_onPrimaryContainer + @color/nord_inversePrimary @color/nord_secondary @color/nord_onSecondary @color/nord_secondaryContainer @@ -517,14 +594,19 @@ @color/nord_onSurface @color/nord_surfaceVariant @color/nord_onSurfaceVariant - @color/nord_outline - @color/nord_inverseOnSurface + @color/nord_surfaceTint @color/nord_inverseSurface - @color/nord_primaryInverse + @color/nord_inverseOnSurface @color/nord_onError @color/nord_errorContainer @color/nord_onErrorContainer - @color/nord_elevationOverlay + @color/nord_outline + @color/nord_outlineVariant + @color/nord_surfaceContainer + @color/nord_surfaceContainerHigh + @color/nord_surfaceContainerHighest + @color/nord_surfaceContainerLow + @color/nord_surfaceContainerLowest diff --git a/presentation-core/src/main/res/values-night/color_lavender.xml b/presentation-core/src/main/res/values-night/color_lavender.xml index f9d558025a..54cdbd4502 100644 --- a/presentation-core/src/main/res/values-night/color_lavender.xml +++ b/presentation-core/src/main/res/values-night/color_lavender.xml @@ -12,26 +12,38 @@ --> #A177FF - #111129 + #3D0090 #A177FF - #111129 + #FFFFFF #A177FF - #111129 + #FFFFFF #423271 - #111129 - #5E25E1 - #E8E8E8 - #111129 - #DEE8FF + #A177FF + #CDBDFF + #360096 + #5512D8 + #EFE6FF + #FFB4AB + #690005 + #93000A + #FFDAD6 #111129 - #DEE8FF + #E7E0EC #111129 - #DEE8FF - #2CB6B6B6 - #E8E8E8 - #A8905FFF - #DEE8FF - #221247 - #A177FF - @color/lavender_primary + #E7E0EC + #3D2F6B + #CBC3D6 + #958E9F + #4A4453 + #000000 + #E7E0EC + #322F38 + #6D41C8 + #111129 + #3B3841 + #15132d + #171531 + #1D193B + #241f41 + #282446 diff --git a/presentation-core/src/main/res/values-night/colors.xml b/presentation-core/src/main/res/values-night/colors.xml index 9d6a4a86a6..5f79e77f6b 100644 --- a/presentation-core/src/main/res/values-night/colors.xml +++ b/presentation-core/src/main/res/values-night/colors.xml @@ -2,11 +2,6 @@ #202125 - #FFB4A9 - #930006 - #680003 - #FFDAD4 - @color/md_white_1000_12 diff --git a/presentation-core/src/main/res/values-night/colors_greenapple.xml b/presentation-core/src/main/res/values-night/colors_greenapple.xml index ecc50b64b8..2d83e66e28 100644 --- a/presentation-core/src/main/res/values-night/colors_greenapple.xml +++ b/presentation-core/src/main/res/values-night/colors_greenapple.xml @@ -12,25 +12,38 @@ --> #7ADB8F - #003915 - #005322 - #96F8A9 + #003917 + #017737 + #FFFFFF #7ADB8F - #003915 - #005322 - #96F8A9 - #FFB3AA - #680006 - #93000D - #FFDAD5 - #1A1C19 - #E1E3DD - #1A1C19 - #E1E3DD - #414941 - #C1C8BE - #8B9389 - #1A1C19 - #E1E3DD - #006D2F + #003917 + #017737 + #FFFFFF + #FFB3AC + #680008 + #C7282A + #FFFFFF + #FFB4AB + #690005 + #93000A + #FFDAD6 + #0F1510 + #DFE4DB + #0F1510 + #DFE4DB + #3F493F + #BECABC + #889487 + #3F493F + #000000 + #DFE4DB + #2C322C + #006D32 + #0F1510 + #353B35 + #0A0F0B + #181D18 + #1C211C + #262B26 + #313630 diff --git a/presentation-core/src/main/res/values-night/colors_midnightdusk.xml b/presentation-core/src/main/res/values-night/colors_midnightdusk.xml index f10e846622..b245b1e7aa 100644 --- a/presentation-core/src/main/res/values-night/colors_midnightdusk.xml +++ b/presentation-core/src/main/res/values-night/colors_midnightdusk.xml @@ -15,23 +15,28 @@ #FFFFFF #BD1C5C #FFFFFF + #F02475 #F02475 - #FFFFFF + #16151D #66183C - #FFFFFF + #F02475 #55971C - #FFFFFF + #16151D #386412 #E5E1E5 #16151D #E5E1E5 #16151D #E5E1E5 - #524346 + #281624 #D6C1C4 - #9F8C8F + #F02475 #333043 #FFFFFF - #F02475 - #2C0013 + #9F8C8F + #221320 + #251522 + #281624 + #2D1C2A + #2F1F2C \ No newline at end of file diff --git a/presentation-core/src/main/res/values-night/colors_nord.xml b/presentation-core/src/main/res/values-night/colors_nord.xml index 058d52a4a6..0aeb36cf9d 100644 --- a/presentation-core/src/main/res/values-night/colors_nord.xml +++ b/presentation-core/src/main/res/values-night/colors_nord.xml @@ -5,26 +5,32 @@ #2E3440 #88C0D0 #2E3440 + #397E91 #81A1C1 #2E3440 #506275 - #2E3440 + #88C0D0 #5E81AC #000000 #5E81AC #000000 #2E3440 #ECEFF4 - #3B4252 + #2E3440 #ECEFF4 - #2E3440 + #414C5C #ECEFF4 - #D8DEE9 - #2E3440 + #88C0D0 #D8DEE9 - #397E91 - #434C5E + #2E3440 + #6d717b + #90939a #2E3440 #BF616A #000000 + #373F4D + #3E4756 + #414C5C + #4E5766 + #505968 diff --git a/presentation-core/src/main/res/values-night/colors_strawberry.xml b/presentation-core/src/main/res/values-night/colors_strawberry.xml index 79071bd14f..f1a7b4b73a 100644 --- a/presentation-core/src/main/res/values-night/colors_strawberry.xml +++ b/presentation-core/src/main/res/values-night/colors_strawberry.xml @@ -11,26 +11,39 @@ ~ Neutral #655C5C --> - #FFB2B9 - #67001B - #91002A - #FFDADD - #FFB2B9 - #67001B + #FFB2B8 + #67001D + #D53855 + #FFFFFF + #ED4A65 + #201A1A #91002A - #FFDADD + #FFFFFF #E8C08E - #432C06 - #5D421B - #FFDDB1 + #201A1A + #775930 + #FFF7F1 + #FFB4AB + #690005 + #93000A + #FFDAD6 #201A1A - #ECDFDF + #F7DCDD #201A1A - #ECDFDF - #534344 - #D7C1C2 - #A08C8D - #201A1A - #ECDFDF - #B61E40 + #F7DCDD + #322727 + #E1BEC0 + #A9898B + #594042 + #000000 + #F7DCDD + #3D2C2D + #B61F40 + #1D1011 + #463536 + #2C2222 + #302525 + #322727 + #3C2F2F + #463737 diff --git a/presentation-core/src/main/res/values-night/colors_tachiyomi.xml b/presentation-core/src/main/res/values-night/colors_tachiyomi.xml index 40f5befccf..6af256bed8 100644 --- a/presentation-core/src/main/res/values-night/colors_tachiyomi.xml +++ b/presentation-core/src/main/res/values-night/colors_tachiyomi.xml @@ -10,26 +10,37 @@ ~ Neutral #5E5E62 --> - #AEC6FF - #002C71 - #00419E - #D8E2FF - #AEC6FF - #002C71 - #00419E - #D8E2FF + #B0C6FF + #002D6E + #00429B + #D9E2FF + #0058CA + #B0C6FF + #002D6E + #00429B + #D9E2FF #7ADC77 - #003907 - #00530D + #003909 + #005312 #95F990 - #1B1B1E - #E4E2E6 - #1B1B1E - #E4E2E6 - #44464E + #1B1B1F + #E3E2E6 + #1B1B1F + #E3E2E6 + #211F26 #C5C6D0 - #8E9099 - #1B1B1E - #E4E2E6 - #0057CE + #B0C6FF + #E3E2E6 + #1B1B1F + #FFB4AB + #690005 + #93000A + #FFDAD6 + #8F9099 + #44464F + #1A181D + #1E1C22 + #211F26 + #292730 + #302E38 diff --git a/presentation-core/src/main/res/values-night/colors_tako.xml b/presentation-core/src/main/res/values-night/colors_tako.xml index 63c2db1ce0..0824df1af8 100644 --- a/presentation-core/src/main/res/values-night/colors_tako.xml +++ b/presentation-core/src/main/res/values-night/colors_tako.xml @@ -15,10 +15,11 @@ #38294E #F3B375 #38294E + #84531E #F3B375 - #5C4D4B - #F3B375 - #38294E + #38294E + #5C4D4B + #F3B375 #66577E #F3B375 #4E4065 @@ -27,11 +28,15 @@ #E3E0F2 #21212E #E3E0F2 - #49454E + #2A2A3C #CBC4CE - #958F99 - #1B1B1E + #66577E #E5E1E6 - #84531E - @color/tako_tertiary + #1B1B1E + #958F99 + #20202E + #262636 + #2A2A3C + #303044 + #36364D diff --git a/presentation-core/src/main/res/values-night/colors_tealturqoise.xml b/presentation-core/src/main/res/values-night/colors_tealturqoise.xml index 69d3e4d4eb..21bff2b260 100644 --- a/presentation-core/src/main/res/values-night/colors_tealturqoise.xml +++ b/presentation-core/src/main/res/values-night/colors_tealturqoise.xml @@ -1,10 +1,10 @@ - #40E0D0 #000000 #40E0D0 #000000 + #008080 #40E0D0 #000000 #18544E @@ -17,11 +17,15 @@ #DFDEDA #202125 #DFDEDA - #3F4947 + #233133 #DFDEDA - #899391 - #202125 + #40E0D0 #DFDEDA - #008080 - #18544E + #202125 + #899391 + #202C2E + #222F31 + #233133 + #28383A + #2F4244 diff --git a/presentation-core/src/main/res/values-night/colors_tidalwave.xml b/presentation-core/src/main/res/values-night/colors_tidalwave.xml index 7cf425d555..c2eb634361 100644 --- a/presentation-core/src/main/res/values-night/colors_tidalwave.xml +++ b/presentation-core/src/main/res/values-night/colors_tidalwave.xml @@ -14,6 +14,7 @@ #003544 #004d61 #b8eaff + #a12b03 #5ed4fc #003544 #004d61 @@ -26,11 +27,15 @@ #d5e3ff #001c3b #d5e3ff - #40484c + #082b4b #bfc8cc - #8a9296 - #001c3b + #5ed4fc #ffe3c4 - #a12b03 - + #001c3b + #8a9296 + #072642 + #072947 + #082b4b + #093257 + #0A3861 \ No newline at end of file diff --git a/presentation-core/src/main/res/values-night/colors_yinyang.xml b/presentation-core/src/main/res/values-night/colors_yinyang.xml index 0a34a2da67..1dccc74e39 100644 --- a/presentation-core/src/main/res/values-night/colors_yinyang.xml +++ b/presentation-core/src/main/res/values-night/colors_yinyang.xml @@ -9,6 +9,7 @@ #5A5A5A #FFFFFF #000000 + #CECECE #FFFFFF #5A5A5A #717171 @@ -21,10 +22,15 @@ #E6E6E6 #1E1E1E #E6E6E6 - #4E4E4E + #313131 #D1D1D1 - #999999 - #1E1E1E + #FFFFFF #E6E6E6 - #CECECE + #1E1E1E + #999999 + #2A2A2A + #2D2D2D + #313131 + #383838 + #3F3F3F diff --git a/presentation-core/src/main/res/values-night/colors_yotsuba.xml b/presentation-core/src/main/res/values-night/colors_yotsuba.xml index 4ca498a189..74ddae02d8 100644 --- a/presentation-core/src/main/res/values-night/colors_yotsuba.xml +++ b/presentation-core/src/main/res/values-night/colors_yotsuba.xml @@ -15,6 +15,7 @@ #5F1600 #862200 #FFDBCF + #AE3200 #FFB59D #5F1600 #862200 @@ -27,10 +28,15 @@ #EDE0DD #211A18 #EDE0DD - #53433F + #332723 #D8C2BC - #A08C87 - #211A18 + #FFB59D #EDE0DD - #AE3200 + #211A18 + #A08C87 + #2E221F + #312521 + #332723 + #413531 + #4C403D diff --git a/presentation-core/src/main/res/values/color_lavender.xml b/presentation-core/src/main/res/values/color_lavender.xml index 02d6274e35..dd763c2ebd 100644 --- a/presentation-core/src/main/res/values/color_lavender.xml +++ b/presentation-core/src/main/res/values/color_lavender.xml @@ -10,27 +10,39 @@ ~ Neutral #EDE2FF --> - #7B46AF - #EDE2FF + #6D41C8 + #FFFFFF #7B46AF - #EDE2FF + #130038 #7B46AF #EDE2FF #C9B0E6 - #EDE2FF + #7B46AF #EDE2FF #7B46AF - #EDE2FF - #7B46AF + #6D3BF0 + #FFFFFF + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 #EDE2FF - #1B1B22 + #1D1A22 #EDE2FF - #1B1B22 - #B9B0CC - #D849454E - #7B46AF - #F3EFF4 - #313033 - #D6BAFF - @color/lavender_primary + #1D1A22 + #E4D5F8 + #4A4453 + #7B7485 + #CBC3D6 + #000000 + #322F38 + #F5EEFA + #A177FF + #DED7E3 + #EDE2FF + #DACCEC + #DED0F1 + #E4D5F8 + #EADCFD + #EEE2FF diff --git a/presentation-core/src/main/res/values/colors.xml b/presentation-core/src/main/res/values/colors.xml index 551dcc0a7e..f8acc3cf46 100644 --- a/presentation-core/src/main/res/values/colors.xml +++ b/presentation-core/src/main/res/values/colors.xml @@ -4,11 +4,6 @@ #1F888888 - #BA1B1B - #FFDAD4 - #FFFFFF - #410001 - @color/md_black_1000_12 @@ -16,8 +11,13 @@ #54759E - #000001 - #000000 + #000000 + #FFFFFF + #000000 + #FFFFFF + #0C0C0C + #131313 + #1B1B1B #1F000000 diff --git a/presentation-core/src/main/res/values/colors_greenapple.xml b/presentation-core/src/main/res/values/colors_greenapple.xml index 13dbf83dc5..df06d61e5f 100644 --- a/presentation-core/src/main/res/values/colors_greenapple.xml +++ b/presentation-core/src/main/res/values/colors_greenapple.xml @@ -11,26 +11,39 @@ ~ Neutral #5D5F5B --> - #006D2F + #005927 #FFFFFF - #96F8A9 - #002109 - #006D2F + #188140 + #FFFFFF + #005927 #FFFFFF - #96F8A9 - #002109 - #B91D22 + #97f7a9 + #000000 + #9D0012 #FFFFFF - #FFDAD5 - #410003 - #FBFDF7 - #1A1C19 - #FBFDF7 - #1A1C19 - #DDE5DA - #414941 - #717970 - #F0F2EC - #2F312E - #7ADB8F + #D33131 + #FFFFFF + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 + #F6FBF2 + #181D18 + #F6FBF2 + #181D18 + #DAE6D7 + #3F493F + #6F7A6E + #BECABC + #000000 + #2C322C + #EDF2E9 + #7ADB8F + #D6DCD3 + #F6FBF2 + #FFFFFF + #F0F5EC + #EAEFE6 + #E4EAE1 + #DFE4DB diff --git a/presentation-core/src/main/res/values/colors_midnightdusk.xml b/presentation-core/src/main/res/values/colors_midnightdusk.xml index f78b6849e8..5474063605 100644 --- a/presentation-core/src/main/res/values/colors_midnightdusk.xml +++ b/presentation-core/src/main/res/values/colors_midnightdusk.xml @@ -15,10 +15,11 @@ #FFFFFF #FFD9E1 #3F0017 + #FFB1C4 #BB0054 #FFFFFF - #FFD9E1 - #3F0017 + #EFBAD4 + #D1377C #006638 #FFFFFF #00894b @@ -27,11 +28,15 @@ #1C1B1F #FFFBFF #1C1B1F - #F3DDE0 + #F9E6F1 #524346 - #847376 - #F4F0F4 + #BB0054 #313033 - #FFB1C4 - @color/midnightdusk_primary + #F4F0F4 + #847376 + #DAC0CD + #E8D1DD + #F9E6F1 + #FCF3F8 + #FEF9FC diff --git a/presentation-core/src/main/res/values/colors_nord.xml b/presentation-core/src/main/res/values/colors_nord.xml index b04ae3eecf..4cb1d411f9 100644 --- a/presentation-core/src/main/res/values/colors_nord.xml +++ b/presentation-core/src/main/res/values/colors_nord.xml @@ -6,6 +6,7 @@ #000000 #5E81AC #000000 + #8CA8CD #81A1C1 #2E3440 #91B4D7 @@ -18,14 +19,18 @@ #2E3440 #E5E9F0 #2E3440 - #ffffff + #DAE0EA #2E3440 - #4C566A - #ECEFF4 + #5E81AC #3B4252 - #8CA8CD - #D8DEE9 + #ECEFF4 + #2E3440 #ECEFF4 #BF616A #000000 + #D1D7E0 + #D6DCE6 + #DAE0EA + #E9EDF3 + #F2F4F8 diff --git a/presentation-core/src/main/res/values/colors_strawberry.xml b/presentation-core/src/main/res/values/colors_strawberry.xml index 97e45ba773..2a430c4530 100644 --- a/presentation-core/src/main/res/values/colors_strawberry.xml +++ b/presentation-core/src/main/res/values/colors_strawberry.xml @@ -11,26 +11,39 @@ ~ Neutral #655C5C --> - #B61E40 + #A10833 #FFFFFF - #FFDADD - #40000D - #B61E40 + #D53855 + #FFFFFF + #A10833 #FFFFFF - #FFDADD - #40000D - #775930 + #D53855 + #F6EAED + #5F441D #FFFFFF - #FFDDB1 - #2A1800 - #FCFCFC - #201A1A - #FCFCFC - #201A1A - #F4DDDD - #534344 - #857374 - #FBEDED - #362F2F - #FFB2B9 + #87683D + #FFFFFF + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 + #FAFAFA + #261819 + #FAFAFA + #261819 + #F6EAED + #594042 + #8D7071 + #E1BEC0 + #000000 + #3D2C2D + #FFECED + #FFB2B8 + #EED4D5 + #FFF8F7 + #F7DCDD + #FDE2E3 + #F6EAED + #FFF0F0 + #FFFFFF diff --git a/presentation-core/src/main/res/values/colors_tachiyomi.xml b/presentation-core/src/main/res/values/colors_tachiyomi.xml index e5f4f5ed83..37f2a9ff03 100644 --- a/presentation-core/src/main/res/values/colors_tachiyomi.xml +++ b/presentation-core/src/main/res/values/colors_tachiyomi.xml @@ -10,26 +10,37 @@ ~ Neutral #5E5E62 --> - #0057CE + #0058CA #FFFFFF - #D8E2FF - #001947 - #0057CE + #D9E2FF + #001945 + #B0C6FF + #0058CA #FFFFFF - #D8E2FF - #001947 - #006E17 + #D9E2FF + #001945 + #006E1B #FFFFFF #95F990 - #002202 - #FDFBFF - #1B1B1E - #FDFBFF - #1B1B1E - #E1E2EC - #44464E - #757780 + #002203 + #FEFBFF + #1B1B1F + #FEFBFF + #1B1B1F + #F3EDF7 + #44464F + #0058CA + #303034 #F2F0F4 - #303033 - #AEC6FF + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 + #757780 + #C5C6D0 + #F5F1F8 + #F7F2FA + #F3EDF7 + #FCF7FF + #FCF7FF diff --git a/presentation-core/src/main/res/values/colors_tako.xml b/presentation-core/src/main/res/values/colors_tako.xml index 6a002cd2cc..373970a044 100644 --- a/presentation-core/src/main/res/values/colors_tako.xml +++ b/presentation-core/src/main/res/values/colors_tako.xml @@ -15,10 +15,11 @@ #F3B375 #66577E #F3B375 + #D6BAFF #66577E #F3B375 #C8BED0 - #F3B375 + #66577E #F3B375 #574360 #FDD6B0 @@ -29,9 +30,13 @@ #1B1B22 #E8E0EB #49454E - #7A757E - #F3EFF4 + #66577E #313033 - #D6BAFF - @color/tako_primary + #F3EFF4 + #7A757E + #D7D0DA + #DFD8E2 + #E8E0EB + #EEE6F1 + #F7EEFA diff --git a/presentation-core/src/main/res/values/colors_tealturqoise.xml b/presentation-core/src/main/res/values/colors_tealturqoise.xml index c9b1e0a9dc..0bff8baaa3 100644 --- a/presentation-core/src/main/res/values/colors_tealturqoise.xml +++ b/presentation-core/src/main/res/values/colors_tealturqoise.xml @@ -1,13 +1,13 @@ - #008080 #FFFFFF #008080 #FFFFFF + #40E0D0 #008080 #FFFFFF - #BFDFDF + #CFE5E4 #008080 #FF7F7F #000000 @@ -17,11 +17,15 @@ #050505 #FAFAFA #050505 - #DAE5E2 + #EBF3F1 #050505 - #6F7977 - #FAFAFA + #BFDFDF #050505 - #40E0D0 - #BFDFDF + #FAFAFA + #6F7977 + #E1E9E7 + #E6EEEC + #EBF3F1 + #F0F8F6 + #F7FFFD diff --git a/presentation-core/src/main/res/values/colors_tidalwave.xml b/presentation-core/src/main/res/values/colors_tidalwave.xml index 8ae6942d5f..e66f7aed50 100644 --- a/presentation-core/src/main/res/values/colors_tidalwave.xml +++ b/presentation-core/src/main/res/values/colors_tidalwave.xml @@ -15,9 +15,10 @@ #ffffff #B4D4DF #001f28 + #ff987f #006780 #ffffff - #b8eaff + #9AE1FF #001f28 #92f7bc #001c3b @@ -27,10 +28,15 @@ #001c3b #fdfbff #001c3b - #dce4e8 + #e8eff5 #40484c - #70787c - #ffe3c4 + #006780 #020400 - #ff987f + #ffe3c4 + #70787c + #e2e8ec + #e5ecf1 + #e8eff5 + #edf4fA + #f5faff \ No newline at end of file diff --git a/presentation-core/src/main/res/values/colors_yinyang.xml b/presentation-core/src/main/res/values/colors_yinyang.xml index c6d2cefbdd..e54ea0f6f8 100644 --- a/presentation-core/src/main/res/values/colors_yinyang.xml +++ b/presentation-core/src/main/res/values/colors_yinyang.xml @@ -9,6 +9,7 @@ #FFFFFF #000000 #FFFFFF + #A6A6A6 #000000 #FFFFFF #DDDDDD @@ -21,10 +22,15 @@ #222222 #FDFDFD #222222 - #EDEDED + #E8E8E8 #515151 - #838383 - #F4F4F4 + #000000 #333333 - #A6A6A6 + #F4F4F4 + #838383 + #CFCFCF + #DADADA + #E8E8E8 + #ECECEC + #EFEFEF diff --git a/presentation-core/src/main/res/values/colors_yotsuba.xml b/presentation-core/src/main/res/values/colors_yotsuba.xml index 79c662f7fb..81fd136114 100644 --- a/presentation-core/src/main/res/values/colors_yotsuba.xml +++ b/presentation-core/src/main/res/values/colors_yotsuba.xml @@ -15,9 +15,10 @@ #FFFFFF #FFDBCF #3B0A00 + #FFB59D #AE3200 #FFFFFF - #FFDBCF + #EBCDC2 #3B0A00 #6B5E2F #FFFFFF @@ -27,10 +28,15 @@ #211A18 #FCFCFC #211A18 - #F5DED8 + #F6EBE7 #53433F - #85736E - #FBEEEB + #AE3200 #362F2D - #FFB59D + #FBEEEB + #85736E + #ECE3E0 + #F1E7E4 + #F6EBE7 + #FAF4F2 + #FBF6F4 From 748ac38599f98b928ed75579166df3228c6211f0 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+antsylich@users.noreply.github.com> Date: Tue, 13 Aug 2024 09:42:14 +0200 Subject: [PATCH 043/247] Remove WebViewClientCompat (cherry picked from commit f4348df8709529b7b2319485fc8eb54c6e8173c7) --- .../interceptor/CloudflareInterceptor.kt | 18 ++-- .../util/system/WebViewClientCompat.kt | 91 ------------------- 2 files changed, 7 insertions(+), 102 deletions(-) delete mode 100644 core/common/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt diff --git a/core/common/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt b/core/common/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt index 9a6ccbb50d..923042d646 100644 --- a/core/common/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt +++ b/core/common/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt @@ -2,11 +2,13 @@ package eu.kanade.tachiyomi.network.interceptor import android.annotation.SuppressLint import android.content.Context +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest import android.webkit.WebView +import android.webkit.WebViewClient import android.widget.Toast import androidx.core.content.ContextCompat import eu.kanade.tachiyomi.network.AndroidCookieJar -import eu.kanade.tachiyomi.util.system.WebViewClientCompat import eu.kanade.tachiyomi.util.system.isOutdated import eu.kanade.tachiyomi.util.system.toast import okhttp3.Cookie @@ -69,7 +71,7 @@ class CloudflareInterceptor( executor.execute { webview = createWebView(originalRequest) - webview?.webViewClient = object : WebViewClientCompat() { + webview?.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView, url: String) { fun isCloudFlareBypassed(): Boolean { return cookieManager.get(origRequestUrl.toHttpUrl()) @@ -88,15 +90,9 @@ class CloudflareInterceptor( } } - override fun onReceivedErrorCompat( - view: WebView, - errorCode: Int, - description: String?, - failingUrl: String, - isMainFrame: Boolean, - ) { - if (isMainFrame) { - if (errorCode in ERROR_CODES) { + override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { + if (request.isForMainFrame) { + if (error.errorCode in ERROR_CODES) { // Found the Cloudflare challenge page. challengeFound = true } else { diff --git a/core/common/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt b/core/common/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt deleted file mode 100644 index 1846d6d7ca..0000000000 --- a/core/common/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt +++ /dev/null @@ -1,91 +0,0 @@ -package eu.kanade.tachiyomi.util.system - -import android.webkit.WebResourceError -import android.webkit.WebResourceRequest -import android.webkit.WebResourceResponse -import android.webkit.WebView -import android.webkit.WebViewClient - -@Suppress("OverridingDeprecatedMember") -abstract class WebViewClientCompat : WebViewClient() { - - open fun shouldOverrideUrlCompat(view: WebView, url: String): Boolean { - return false - } - - open fun shouldInterceptRequestCompat(view: WebView, url: String): WebResourceResponse? { - return null - } - - open fun onReceivedErrorCompat( - view: WebView, - errorCode: Int, - description: String?, - failingUrl: String, - isMainFrame: Boolean, - ) { - } - - final override fun shouldOverrideUrlLoading( - view: WebView, - request: WebResourceRequest, - ): Boolean { - return shouldOverrideUrlCompat(view, request.url.toString()) - } - - final override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { - return shouldOverrideUrlCompat(view, url) - } - - final override fun shouldInterceptRequest( - view: WebView, - request: WebResourceRequest, - ): WebResourceResponse? { - return shouldInterceptRequestCompat(view, request.url.toString()) - } - - final override fun shouldInterceptRequest( - view: WebView, - url: String, - ): WebResourceResponse? { - return shouldInterceptRequestCompat(view, url) - } - - final override fun onReceivedError( - view: WebView, - request: WebResourceRequest, - error: WebResourceError, - ) { - onReceivedErrorCompat( - view, - error.errorCode, - error.description?.toString(), - request.url.toString(), - request.isForMainFrame, - ) - } - - final override fun onReceivedError( - view: WebView, - errorCode: Int, - description: String?, - failingUrl: String, - ) { - onReceivedErrorCompat(view, errorCode, description, failingUrl, failingUrl == view.url) - } - - final override fun onReceivedHttpError( - view: WebView, - request: WebResourceRequest, - error: WebResourceResponse, - ) { - onReceivedErrorCompat( - view, - error.statusCode, - error.reasonPhrase, - request.url - .toString(), - request.isForMainFrame, - ) - } -} From fa3966151e4b58fdb19e6c36a483450e0104866e Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 14 Aug 2024 00:03:10 +0800 Subject: [PATCH 044/247] Add comment about RecyclerView cache size (#1119) Note for forks: Increasing cache size may cause OOM on API < 26, better to make it API 26+ only. (cherry picked from commit 1c47a6b9b35c622200c731cdbbc076f5263e8d06) --- .../kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index 260897b972..de1578bfe6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -361,4 +361,5 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr } } +// Double the cache size to reduce rebinds/recycles incurred by the extra layout space on scroll direction changes private const val RecyclerViewCacheSize = 4 From c1dc6b5e0e997d2c72fc286a009ab6b84924c046 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 20:16:39 +0600 Subject: [PATCH 045/247] fix(deps): update dependency org.junit.jupiter:junit-jupiter to v5.11.0 (#1121) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 6f4e3f776f98d7a47dfa33b2cdfe992fc211ec28) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 090f887290..d276bb8c20 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -87,7 +87,7 @@ sqldelight-android-paging = { module = "app.cash.sqldelight:androidx-paging3-ext sqldelight-dialects-sql = { module = "app.cash.sqldelight:sqlite-3-38-dialect", version.ref = "sqldelight" } sqldelight-gradle = { module = "app.cash.sqldelight:gradle-plugin", version.ref = "sqldelight" } -junit = "org.junit.jupiter:junit-jupiter:5.10.3" +junit = "org.junit.jupiter:junit-jupiter:5.11.0" kotest-assertions = "io.kotest:kotest-assertions-core:5.9.1" mockk = "io.mockk:mockk:1.13.12" From 8a46384e709379c2b7347b878974b466cc70f6b9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 20:18:25 +0600 Subject: [PATCH 046/247] chore(deps): update dependency gradle to v8.10 (#1122) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit 3f050a83dd0907e0ffb56a1e1833f9de5b10b329) --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0e54..9355b41557 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 410832fba6adc517765ed2f572562dd9f22187e8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 10:59:11 +0600 Subject: [PATCH 047/247] fix(deps): update dependency org.conscrypt:conscrypt-android to v2.5.3 (#1135) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> (cherry picked from commit b2f1719c50365279e157a3b9ee015fc6c13a9a92) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d276bb8c20..8534421ce1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ okhttp-brotli = { module = "com.squareup.okhttp3:okhttp-brotli", version.ref = " okhttp-dnsoverhttps = { module = "com.squareup.okhttp3:okhttp-dnsoverhttps", version.ref = "okhttp_version" } okio = "com.squareup.okio:okio:3.9.0" -conscrypt-android = "org.conscrypt:conscrypt-android:2.5.2" +conscrypt-android = "org.conscrypt:conscrypt-android:2.5.3" quickjs-android = "app.cash.quickjs:quickjs-android:0.9.2" From aeb17fa859762c45004747943ffb15ced7846fa5 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+antsylich@users.noreply.github.com> Date: Mon, 19 Aug 2024 08:51:37 +0200 Subject: [PATCH 048/247] Remove detekt (#1130) Annoying. More annoying in this project. (cherry picked from commit 777ae2461e1eb277a3aa0c998ff69e4f100387a1) --- .github/workflows/build_pull_request.yml | 9 +- .github/workflows/build_push.yml | 7 +- CONTRIBUTING.md | 4 - .../eu/kanade/presentation/util/Navigator.kt | 1 - app/src/main/java/eu/kanade/tachiyomi/App.kt | 1 - .../tachiyomi/data/backup/models/Backup.kt | 1 - .../data/backup/models/BackupChapter.kt | 1 - .../backup/models/BackupExtensionRepos.kt | 1 - .../data/backup/models/BackupManga.kt | 5 +- .../tachiyomi/data/coil/MangaCoverFetcher.kt | 1 - .../core/migration/MigrationJobFactory.kt | 1 - buildSrc/build.gradle.kts | 1 - .../mihon.android.application.gradle.kts | 1 - .../main/kotlin/mihon.benchmark.gradle.kts | 1 - .../main/kotlin/mihon.code.detekt.gradle.kts | 47 - .../kotlin/mihon.library.compose.gradle.kts | 1 - .../src/main/kotlin/mihon.library.gradle.kts | 1 - config/detekt/baseline.xml | 2332 ----------------- config/detekt/detekt.yml | 22 - .../data/entries/manga/MangaMapper.kt | 2 - .../data/entries/manga/MangaRepositoryImpl.kt | 1 - .../items/chapter/ChapterRepositoryImpl.kt | 1 - .../interactor/CreateMangaExtensionRepo.kt | 1 - .../service/ExtensionRepoService.kt | 1 - gradle/libs.versions.toml | 6 - .../core/components/material/Scaffold.kt | 1 - 26 files changed, 10 insertions(+), 2441 deletions(-) delete mode 100644 buildSrc/src/main/kotlin/mihon.code.detekt.gradle.kts delete mode 100644 config/detekt/baseline.xml delete mode 100644 config/detekt/detekt.yml diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index dbad611417..d67f556894 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -36,10 +36,11 @@ jobs: java-version: 17 distribution: adopt - - name: Build app and run unit tests + - name: Set up gradle uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 - with: - arguments: detekt assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest + + - name: Build app and run unit tests + run: ./gradlew assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest - name: Upload APK uses: actions/upload-artifact@v4 @@ -51,4 +52,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: mapping-${{ github.sha }} - path: app/build/outputs/mapping/standardRelease \ No newline at end of file + path: app/build/outputs/mapping/standardRelease diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index da8caaf881..c7ae34ae79 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -33,10 +33,11 @@ jobs: java-version: 17 distribution: adopt - - name: Build app and run unit tests + - name: Set up gradle uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 - with: - arguments: detekt assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest + + - name: Build app and run unit tests + run: ./gradlew assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest - name: Upload APK uses: actions/upload-artifact@v4 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index db282fdf10..ac547fe313 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,10 +24,6 @@ Before you start, please note that the ability to use following technologies is - [Android Studio](https://developer.android.com/studio) - Emulator or phone with developer options enabled to test changes. -## Linting - -Run the `detekt` gradle task. If the build fails, a report of issues can be found in `app/build/reports/detekt/`. The report is availble in several formats and details each issue that needs attention. - ## Getting help - Join [the Discord server](https://discord.gg/F32UjdJZrR) for online help and to ask questions while developing. diff --git a/app/src/main/java/eu/kanade/presentation/util/Navigator.kt b/app/src/main/java/eu/kanade/presentation/util/Navigator.kt index 0cb117cc74..e566b820bc 100644 --- a/app/src/main/java/eu/kanade/presentation/util/Navigator.kt +++ b/app/src/main/java/eu/kanade/presentation/util/Navigator.kt @@ -33,7 +33,6 @@ import uy.kohesive.injekt.api.get /** * For invoking back press to the parent activity */ -@SuppressLint("ComposeCompositionLocalUsage") val LocalBackPress: ProvidableCompositionLocal<(() -> Unit)?> = staticCompositionLocalOf { null } private val uiPreferences: UiPreferences = Injekt.get() diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 26d3c5c9f7..82a2258097 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -165,7 +165,6 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor ) } - @Suppress("MagicNumber") override fun newImageLoader(context: Context): ImageLoader { return ImageLoader.Builder(this).apply { val callFactoryLazy = lazy { Injekt.get().client } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt index 347e17a0fe..02c3dcdefa 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber -@Suppress("MagicNumber") @Serializable data class Backup( @ProtoNumber(1) val backupManga: List = emptyList(), diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt index 465bf87345..1d183ca34c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt @@ -4,7 +4,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.items.chapter.model.Chapter -@Suppress("MagicNumber") @Serializable data class BackupChapter( // in 1.x some of these values have different names diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt index fa99686676..256def7b55 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt @@ -4,7 +4,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import mihon.domain.extensionrepo.model.ExtensionRepo -@Suppress("MagicNumber") @Serializable class BackupExtensionRepos( @ProtoNumber(1) var baseUrl: String, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt index f5ba1dcb8c..6688ed63a0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt @@ -5,10 +5,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.entries.manga.model.Manga -@Suppress( - "DEPRECATION", - "MagicNumber", -) +@Suppress("DEPRECATION") @Serializable data class BackupManga( // in 1.x some of these values have different names diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt index e959c3e6c1..026b888dd3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt @@ -45,7 +45,6 @@ import java.io.IOException * Available request parameter: * - [USE_CUSTOM_COVER_KEY]: Use custom cover if set by user, default is true */ -@Suppress("LongParameterList") class MangaCoverFetcher( private val url: String?, private val isLibraryManga: Boolean, diff --git a/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt b/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt index 801411013a..c452707d54 100644 --- a/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt +++ b/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt @@ -12,7 +12,6 @@ class MigrationJobFactory( private val scope: CoroutineScope ) { - @SuppressWarnings("MaxLineLength") fun create(migrations: List): Deferred = with(scope) { return migrations.sortedBy { it.version } .fold(CompletableDeferred(true)) { acc: Deferred, migration: Migration -> diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index b72b8a98b3..b825b41720 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -6,7 +6,6 @@ dependencies { implementation(androidx.gradle) implementation(kotlinx.gradle) implementation(kotlinx.compose.compiler.gradle) - implementation(libs.detekt.gradlePlugin) implementation(gradleApi()) implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) diff --git a/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts b/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts index 3c4c00ac33..7ba9c60fb5 100644 --- a/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts @@ -3,7 +3,6 @@ import mihon.buildlogic.configureAndroid import mihon.buildlogic.configureTest plugins { - id("mihon.code.detekt") id("com.android.application") kotlin("android") } diff --git a/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts b/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts index b857c43432..3a43a2aa10 100644 --- a/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts @@ -2,7 +2,6 @@ import mihon.buildlogic.configureAndroid import mihon.buildlogic.configureTest plugins { - id("mihon.code.detekt") id("com.android.test") kotlin("android") } diff --git a/buildSrc/src/main/kotlin/mihon.code.detekt.gradle.kts b/buildSrc/src/main/kotlin/mihon.code.detekt.gradle.kts deleted file mode 100644 index 986138ee63..0000000000 --- a/buildSrc/src/main/kotlin/mihon.code.detekt.gradle.kts +++ /dev/null @@ -1,47 +0,0 @@ -import io.gitlab.arturbosch.detekt.Detekt -import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask -import org.gradle.accessors.dm.LibrariesForLibs - -plugins { - id("io.gitlab.arturbosch.detekt") -} - -val libs = the() -dependencies { - detektPlugins(libs.detekt.rules.formatting) - detektPlugins(libs.detekt.rules.compose) -} - -private val configFile = files("$rootDir/config/detekt/detekt.yml") -private val baselineFile = file("$rootDir/config/detekt/baseline.xml") -private val kotlinFiles = "**/*.kt" -private val resourceFiles = "**/resources/**" -private val buildFiles = "**/build/**" -private val generatedFiles = "**/generated/**" -private val scriptsFiles = "**/*.kts" - -detekt { - buildUponDefaultConfig = true - parallel = true - autoCorrect = false - ignoreFailures = false - config.setFrom(configFile) - baseline = file(baselineFile) -} - -tasks.withType().configureEach { - include(kotlinFiles) - exclude(resourceFiles, buildFiles, generatedFiles, scriptsFiles) - reports { - html.required.set(true) - xml.required.set(false) - txt.required.set(false) - } -} - -tasks.withType().configureEach { - jvmTarget = JavaVersion.VERSION_17.toString() -} -tasks.withType().configureEach { - jvmTarget = JavaVersion.VERSION_17.toString() -} diff --git a/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts b/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts index 9f39d77377..0c37a3256f 100644 --- a/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts @@ -1,7 +1,6 @@ import mihon.buildlogic.configureCompose plugins { - id("mihon.code.detekt") id("com.android.library") } diff --git a/buildSrc/src/main/kotlin/mihon.library.gradle.kts b/buildSrc/src/main/kotlin/mihon.library.gradle.kts index 0ea4961725..743bf07e32 100644 --- a/buildSrc/src/main/kotlin/mihon.library.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.library.gradle.kts @@ -2,7 +2,6 @@ import mihon.buildlogic.configureAndroid import mihon.buildlogic.configureTest plugins { - id("mihon.code.detekt") id("com.android.library") } diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml deleted file mode 100644 index a1ef5419ef..0000000000 --- a/config/detekt/baseline.xml +++ /dev/null @@ -1,2332 +0,0 @@ - - - - - ComplexCondition:AnimeScreenModel.kt$AnimeScreenModel$(selectedItem.selected && selected) || (!selectedItem.selected && !selected) - ComplexCondition:ExternalIntents.kt$ExternalIntents$episode.seen && (!preserveWatchPos || (preserveWatchPos && isEpisodeWatched)) - ComplexCondition:ExternalIntents.kt$ExternalIntents$tracker != null && tracker.isLoggedIn && tracker is AnimeTracker && episodeNumber > track.lastEpisodeSeen - ComplexCondition:GestureHandler.kt$GestureHandler$SeekState.mode == SeekState.LOCKED || SeekState.mode != SeekState.DOUBLE_TAP || activity.player.timePos == null || activity.player.duration == null - ComplexCondition:MainActivity.kt$MainActivity$( currentScreen is BrowseMangaSourceScreen || (currentScreen is MangaScreen && currentScreen.fromSource) ) || ( currentScreen is BrowseAnimeSourceScreen || (currentScreen is AnimeScreen && currentScreen.fromSource) ) - ComplexCondition:MangaScreenModel.kt$MangaScreenModel$(selectedItem.selected && selected) || (!selectedItem.selected && !selected) - ComplexCondition:ReaderNavigationOverlayView.kt$ReaderNavigationOverlayView$isVisible || (!showOnStart && firstLaunch) || navigation is DisabledNavigation - ComplexCondition:ReaderPageImageView.kt$ReaderPageImageView$config != null && config!!.landscapeZoom && config!!.minimumScaleType == SCALE_TYPE_CENTER_INSIDE && sWidth > sHeight && scale == minScale - ComposableParamOrder:ChapterSettingsDialog.kt$ChapterSettingsDialog - ComposableParamOrder:CommonEntryItem.kt$EntryComfortableGridItem - ComposableParamOrder:CommonEntryItem.kt$EntryListItem - ComposableParamOrder:EpisodeSettingsDialog.kt$EpisodeSettingsDialog - ComposableParamOrder:LazyLibraryGrid.kt$LazyLibraryGrid - ComposableParamOrder:PlayerDialog.kt$PlayerDialog - ComposableParamOrder:PlayerSettingsScreenModel.kt$PlayerSettingsScreenModel$ToggleableRow - ComposableParamOrder:StorageScreenContent.kt$StorageScreenContent - ComposableParamOrder:SwitchPreferenceWidget.kt$SwitchPreferenceWidget - ComposableParamOrder:TrackingPreferenceWidget.kt$TrackingPreferenceWidget - ComposableParamOrder:TriStateListDialog.kt$TriStateListDialog - CompositionLocalAllowlist:Navigator.kt$LocalBackPress - CompositionLocalAllowlist:PreferenceItem.kt$LocalPreferenceHighlighted - CompositionLocalAllowlist:PreferenceItem.kt$LocalPreferenceMinHeight - ConstructorParameterNaming:AnilistModels.kt$ALAnime$val average_score: Int - ConstructorParameterNaming:AnilistModels.kt$ALAnime$val image_url_lge: String - ConstructorParameterNaming:AnilistModels.kt$ALAnime$val publishing_status: String - ConstructorParameterNaming:AnilistModels.kt$ALAnime$val remote_id: Long - ConstructorParameterNaming:AnilistModels.kt$ALAnime$val start_date_fuzzy: Long - ConstructorParameterNaming:AnilistModels.kt$ALAnime$val title_user_pref: String - ConstructorParameterNaming:AnilistModels.kt$ALAnime$val total_episodes: Long - ConstructorParameterNaming:AnilistModels.kt$ALManga$val average_score: Int - ConstructorParameterNaming:AnilistModels.kt$ALManga$val image_url_lge: String - ConstructorParameterNaming:AnilistModels.kt$ALManga$val publishing_status: String - ConstructorParameterNaming:AnilistModels.kt$ALManga$val remote_id: Long - ConstructorParameterNaming:AnilistModels.kt$ALManga$val start_date_fuzzy: Long - ConstructorParameterNaming:AnilistModels.kt$ALManga$val title_user_pref: String - ConstructorParameterNaming:AnilistModels.kt$ALManga$val total_chapters: Long - ConstructorParameterNaming:AnilistModels.kt$ALUserAnime$val completed_date_fuzzy: Long - ConstructorParameterNaming:AnilistModels.kt$ALUserAnime$val episodes_seen: Int - ConstructorParameterNaming:AnilistModels.kt$ALUserAnime$val library_id: Long - ConstructorParameterNaming:AnilistModels.kt$ALUserAnime$val list_status: String - ConstructorParameterNaming:AnilistModels.kt$ALUserAnime$val score_raw: Int - ConstructorParameterNaming:AnilistModels.kt$ALUserAnime$val start_date_fuzzy: Long - ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val chapters_read: Int - ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val completed_date_fuzzy: Long - ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val library_id: Long - ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val list_status: String - ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val score_raw: Int - ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val start_date_fuzzy: Long - ConstructorParameterNaming:AnilistModels.kt$OAuth$val access_token: String - ConstructorParameterNaming:AnilistModels.kt$OAuth$val expires_in: Long - ConstructorParameterNaming:AnilistModels.kt$OAuth$val token_type: String - ConstructorParameterNaming:AnimeExtensionDetailsScreenModel.kt$AnimeExtensionDetailsScreenModel.State$private val _sources: ImmutableList<AnimeExtensionSourceItem>? = null - ConstructorParameterNaming:BackupAnime.kt$BackupAnime$@ProtoNumber(103) var viewer_flags: Int = 0 - ConstructorParameterNaming:BackupManga.kt$BackupManga$@ProtoNumber(103) var viewer_flags: Int? = null - ConstructorParameterNaming:BangumiModels.kt$Collection$val ep_status: Int? = 0 - ConstructorParameterNaming:BangumiModels.kt$Collection$val vol_status: Int? = 0 - ConstructorParameterNaming:BangumiModels.kt$OAuth$val access_token: String - ConstructorParameterNaming:BangumiModels.kt$OAuth$val created_at: Long = System.currentTimeMillis() / 1000 - ConstructorParameterNaming:BangumiModels.kt$OAuth$val expires_in: Long - ConstructorParameterNaming:BangumiModels.kt$OAuth$val refresh_token: String? - ConstructorParameterNaming:BangumiModels.kt$OAuth$val token_type: String - ConstructorParameterNaming:BangumiModels.kt$OAuth$val user_id: Long? - ConstructorParameterNaming:KavitaModels.kt$SeriesDto$val thumbnail_url: String? = "" - ConstructorParameterNaming:KitsuModels.kt$OAuth$val access_token: String - ConstructorParameterNaming:KitsuModels.kt$OAuth$val created_at: Long - ConstructorParameterNaming:KitsuModels.kt$OAuth$val expires_in: Long - ConstructorParameterNaming:KitsuModels.kt$OAuth$val refresh_token: String? - ConstructorParameterNaming:KitsuModels.kt$OAuth$val token_type: String - ConstructorParameterNaming:MangaExtensionDetailsScreenModel.kt$MangaExtensionDetailsScreenModel.State$private val _sources: ImmutableList<MangaExtensionSourceItem>? = null - ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val access_token: String - ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val created_at: Long = System.currentTimeMillis() - ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val expires_in: Long - ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val refresh_token: String - ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val token_type: String - ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val access_token: String - ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val created_at: Long - ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val expires_in: Long - ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val refresh_token: String? - ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val token_type: String - ConstructorParameterNaming:SimklModels.kt$OAuth$val access_token: String - ConstructorParameterNaming:SimklModels.kt$OAuth$val token_type: String - ConstructorParameterNaming:WebViewScreenModel.kt$WebViewScreenModel$private val AnimeSourceManager: AnimeSourceManager = Injekt.get() - ConstructorParameterNaming:WebViewScreenModel.kt$WebViewScreenModel$private val MangaSourceManager: MangaSourceManager = Injekt.get() - ContentTrailingLambda:TabbedDialog.kt$content - ContentTrailingLambda:TrackInfoDialogSelector.kt$content - CyclomaticComplexMethod:AniChartApi.kt$AniChartApi$internal suspend fun loadAiringTime( anime: Anime, trackItems: List<AnimeTrackItem>, manualFetch: Boolean, ): Pair<Int, Long> - CyclomaticComplexMethod:AnilistModels.kt$fun DomainAnimeTrack.toAnilistScore(): String - CyclomaticComplexMethod:AnilistModels.kt$fun DomainMangaTrack.toAnilistScore(): String - CyclomaticComplexMethod:AnimeDownloadCache.kt$AnimeDownloadCache$private fun renewCache() - CyclomaticComplexMethod:AnimeDownloader.kt$AnimeDownloader$private fun ffmpegDownload( download: AnimeDownload, tmpDir: UniFile, filename: String, ): UniFile - CyclomaticComplexMethod:AnimeDownloader.kt$AnimeDownloader$private suspend fun attemptDownload( download: AnimeDownload, tmpDir: UniFile, filename: String, safe: Boolean, ): UniFile - CyclomaticComplexMethod:AnimeDownloader.kt$AnimeDownloader$private suspend fun httpDownload( download: AnimeDownload, tmpDir: UniFile, filename: String, threadNumber: Int, safeDownload: Boolean, ): UniFile - CyclomaticComplexMethod:AnimeExtensionLoader.kt$AnimeExtensionLoader$private fun loadExtension(context: Context, extensionInfo: AnimeExtensionInfo): AnimeLoadResult - CyclomaticComplexMethod:AnimeExtensionsScreen.kt$@Composable private fun AnimeExtensionContent( state: AnimeExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (AnimeExtension) -> Unit, onOpenWebView: (AnimeExtension.Available) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onInstallExtension: (AnimeExtension.Available) -> Unit, onUninstallExtension: (AnimeExtension) -> Unit, onUpdateExtension: (AnimeExtension.Installed) -> Unit, onTrustExtension: (AnimeExtension.Untrusted) -> Unit, onOpenExtension: (AnimeExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) - CyclomaticComplexMethod:AnimeExtensionsScreen.kt$@Composable private fun AnimeExtensionItemContent( extension: AnimeExtension, installStep: InstallStep, modifier: Modifier = Modifier, ) - CyclomaticComplexMethod:AnimeInfoHeader.kt$@Composable private fun ColumnScope.AnimeContentInfo( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) - CyclomaticComplexMethod:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$private fun AnimeLibraryMap.applySort( // Map<MangaId, List<Track>> trackMap: Map<Long, List<AnimeTrack>>, ): AnimeLibraryMap - CyclomaticComplexMethod:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$private suspend fun AnimeLibraryMap.applyFilters( trackMap: Map<Long, List<AnimeTrack>>, loggedInTrackers: Map<Long, TriState>, ): AnimeLibraryMap - CyclomaticComplexMethod:AnimeLibraryTab.kt$AnimeLibraryTab$@OptIn(ExperimentalMaterial3Api::class) @Composable override fun Content() - CyclomaticComplexMethod:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$private suspend fun addAnimeToQueue(categoryId: Long) - CyclomaticComplexMethod:AnimeScreen.kt$AnimeScreen$@Composable override fun Content() - CyclomaticComplexMethod:AnimeScreenModel.kt$AnimeScreenModel$fun toggleSelection( item: EpisodeList.Item, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) - CyclomaticComplexMethod:AnimeSourcesScreenModel.kt$AnimeSourcesScreenModel$private fun collectLatestAnimeSources(sources: List<AnimeSource>) - CyclomaticComplexMethod:AnimeUpdatesScreenModel.kt$AnimeUpdatesScreenModel$fun toggleSelection( item: AnimeUpdatesItem, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) - CyclomaticComplexMethod:BrowseAnimeSourceScreen.kt$@Composable fun BrowseAnimeSourceContent( source: AnimeSource?, animeList: LazyPagingItems<StateFlow<Anime>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalAnimeSourceHelpClick: () -> Unit, onAnimeClick: (Anime) -> Unit, onAnimeLongClick: (Anime) -> Unit, ) - CyclomaticComplexMethod:BrowseAnimeSourceScreen.kt$BrowseAnimeSourceScreen$@Composable override fun Content() - CyclomaticComplexMethod:BrowseAnimeSourceScreenModel.kt$BrowseAnimeSourceScreenModel$fun searchGenre(genreName: String) - CyclomaticComplexMethod:BrowseMangaSourceScreen.kt$@Composable fun BrowseSourceContent( source: MangaSource?, mangaList: LazyPagingItems<StateFlow<Manga>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalSourceHelpClick: () -> Unit, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) - CyclomaticComplexMethod:BrowseMangaSourceScreen.kt$BrowseMangaSourceScreen$@Composable override fun Content() - CyclomaticComplexMethod:BrowseMangaSourceScreenModel.kt$BrowseMangaSourceScreenModel$fun searchGenre(genreName: String) - CyclomaticComplexMethod:DownloadsTab.kt$DownloadsTab$@Composable override fun Content() - CyclomaticComplexMethod:EntryBottomActionMenu.kt$@Composable fun EntryBottomActionMenu( visible: Boolean, isManga: Boolean, modifier: Modifier = Modifier, onBookmarkClicked: (() -> Unit)? = null, onRemoveBookmarkClicked: (() -> Unit)? = null, onMarkAsViewedClicked: (() -> Unit)? = null, onMarkAsUnviewedClicked: (() -> Unit)? = null, onMarkPreviousAsViewedClicked: (() -> Unit)? = null, onDownloadClicked: (() -> Unit)? = null, onDeleteClicked: (() -> Unit)? = null, onExternalClicked: (() -> Unit)? = null, onInternalClicked: (() -> Unit)? = null, ) - CyclomaticComplexMethod:GestureHandler.kt$GestureHandler$override fun onScroll( e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float, ): Boolean - CyclomaticComplexMethod:GetAnimeSourcesWithFavoriteCount.kt$GetAnimeSourcesWithFavoriteCount$private fun sortFn( direction: SetMigrateSorting.Direction, sorting: SetMigrateSorting.Mode, ): java.util.Comparator<Pair<AnimeSource, Long>> - CyclomaticComplexMethod:GetMangaSourcesWithFavoriteCount.kt$GetMangaSourcesWithFavoriteCount$private fun sortFn( direction: SetMigrateSorting.Direction, sorting: SetMigrateSorting.Mode, ): java.util.Comparator<Pair<Source, Long>> - CyclomaticComplexMethod:HomeScreen.kt$HomeScreen$@Composable override fun Content() - CyclomaticComplexMethod:MainActivity.kt$MainActivity$override fun onCreate(savedInstanceState: Bundle?) - CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean - CyclomaticComplexMethod:MangaDownloadCache.kt$MangaDownloadCache$private fun renewCache() - CyclomaticComplexMethod:MangaExtensionLoader.kt$MangaExtensionLoader$private fun loadMangaExtension(context: Context, extensionInfo: MangaExtensionInfo): MangaLoadResult - CyclomaticComplexMethod:MangaExtensionsScreen.kt$@Composable private fun ExtensionContent( state: MangaExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (MangaExtension) -> Unit, onOpenWebView: (MangaExtension.Available) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onInstallExtension: (MangaExtension.Available) -> Unit, onUninstallExtension: (MangaExtension) -> Unit, onUpdateExtension: (MangaExtension.Installed) -> Unit, onTrustExtension: (MangaExtension.Untrusted) -> Unit, onOpenExtension: (MangaExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) - CyclomaticComplexMethod:MangaExtensionsScreen.kt$@Composable private fun ExtensionItemContent( extension: MangaExtension, installStep: InstallStep, modifier: Modifier = Modifier, ) - CyclomaticComplexMethod:MangaInfoHeader.kt$@Composable private fun ColumnScope.MangaContentInfo( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) - CyclomaticComplexMethod:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$private fun MangaLibraryMap.applySort( // Map<MangaId, List<Track>> trackMap: Map<Long, List<MangaTrack>>, ): MangaLibraryMap - CyclomaticComplexMethod:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$private suspend fun MangaLibraryMap.applyFilters( trackMap: Map<Long, List<MangaTrack>>, loggedInTrackers: Map<Long, TriState>, ): MangaLibraryMap - CyclomaticComplexMethod:MangaLibraryTab.kt$MangaLibraryTab$@OptIn(ExperimentalMaterial3Api::class) @Composable override fun Content() - CyclomaticComplexMethod:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$private suspend fun addMangaToQueue(categoryId: Long) - CyclomaticComplexMethod:MangaScreen.kt$MangaScreen$@Composable override fun Content() - CyclomaticComplexMethod:MangaScreenModel.kt$MangaScreenModel$fun toggleSelection( item: ChapterList.Item, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) - CyclomaticComplexMethod:MangaSourcesScreenModel.kt$MangaSourcesScreenModel$private fun collectLatestSources(sources: List<Source>) - CyclomaticComplexMethod:MangaUpdatesScreenModel.kt$MangaUpdatesScreenModel$fun toggleSelection( item: MangaUpdatesItem, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) - CyclomaticComplexMethod:MigrateAnimeDialog.kt$MigrateAnimeDialogScreenModel$private suspend fun migrateAnimeInternal( oldSource: AnimeSource?, newSource: AnimeSource, oldAnime: Anime, newAnime: Anime, sourceEpisodes: List<SEpisode>, replace: Boolean, flags: Int, ) - CyclomaticComplexMethod:MigrateMangaDialog.kt$MigrateMangaDialogScreenModel$private suspend fun migrateMangaInternal( oldSource: MangaSource?, newSource: MangaSource, oldManga: Manga, newManga: Manga, sourceChapters: List<SChapter>, replace: Boolean, flags: Int, ) - CyclomaticComplexMethod:Migrations.kt$Migrations$fun upgrade( context: Context, preferenceStore: PreferenceStore, basePreferences: BasePreferences, uiPreferences: UiPreferences, networkPreferences: NetworkPreferences, sourcePreferences: SourcePreferences, securityPreferences: SecurityPreferences, libraryPreferences: LibraryPreferences, readerPreferences: ReaderPreferences, playerPreferences: PlayerPreferences, backupPreferences: BackupPreferences, trackerManager: TrackerManager, ): Boolean - CyclomaticComplexMethod:NotificationReceiver.kt$NotificationReceiver$override fun onReceive(context: Context, intent: Intent) - CyclomaticComplexMethod:PagerViewer.kt$PagerViewer$override fun handleKeyEvent(event: KeyEvent): Boolean - CyclomaticComplexMethod:PagerViewerAdapter.kt$PagerViewerAdapter$fun setChapters(chapters: ViewerChapters, forceTransition: Boolean) - CyclomaticComplexMethod:PlayerActivity.kt$PlayerActivity$@SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) - CyclomaticComplexMethod:PlayerActivity.kt$PlayerActivity$@SuppressLint("SourceLockedOrientationActivity") internal suspend fun fileLoaded() - CyclomaticComplexMethod:PlayerActivity.kt$PlayerActivity$fun doubleTapSeek( time: Int, event: MotionEvent? = null, isDoubleTap: Boolean = true, videoChapterText: String? = null, chapterSeek: String? = null, ) - CyclomaticComplexMethod:PlayerActivity.kt$PlayerActivity$private fun updateChapters(stamps: List<Stamp>? = null, duration: Int? = null) - CyclomaticComplexMethod:PlayerViewModel.kt$PlayerViewModel$private fun filterEpisodeList(episodes: List<Episode>): List<Episode> - CyclomaticComplexMethod:PreferenceItem.kt$@Composable internal fun PreferenceItem( item: Preference.PreferenceItem<*>, highlightKey: String?, ) - CyclomaticComplexMethod:ReaderActivity.kt$ReaderActivity$override fun onCreate(savedInstanceState: Bundle?) - CyclomaticComplexMethod:ReaderActivity.kt$ReaderActivity$private fun initializeMenu() - CyclomaticComplexMethod:SyncChaptersWithSource.kt$SyncChaptersWithSource$suspend fun await( rawSourceChapters: List<SChapter>, manga: Manga, source: MangaSource, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Chapter> - CyclomaticComplexMethod:SyncEpisodesWithSource.kt$SyncEpisodesWithSource$suspend fun await( rawSourceEpisodes: List<SEpisode>, anime: Anime, source: AnimeSource, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Episode> - CyclomaticComplexMethod:TriStateListDialog.kt$@SuppressLint("ComposeParameterOrder") @Composable fun <T> TriStateListDialog( title: String, message: String? = null, items: List<T>, initialChecked: List<T>, initialInversed: List<T>, itemLabel: @Composable (T) -> String, onDismissRequest: () -> Unit, onValueChanged: (newIncluded: List<T>, newExcluded: List<T>) -> Unit, ) - CyclomaticComplexMethod:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean - CyclomaticComplexMethod:WebtoonViewer.kt$WebtoonViewer$override fun handleKeyEvent(event: KeyEvent): Boolean - DestructuringDeclarationWithTooManyEntries:AnimeExtensionsScreenModel.kt$AnimeExtensionsScreenModel$(_updates, _installed, _available, _untrusted) - DestructuringDeclarationWithTooManyEntries:AnimeInfoHeader.kt$(shrunk, expanded, actual, scrim) - DestructuringDeclarationWithTooManyEntries:MangaExtensionsScreenModel.kt$MangaExtensionsScreenModel$(_updates, _installed, _available, _untrusted) - DestructuringDeclarationWithTooManyEntries:MangaInfoHeader.kt$(shrunk, expanded, actual, scrim) - EmptyCatchBlock:RarPageLoader.kt$RarPageLoader${ } - EmptyFunctionBlock:IgnoreFirstSpinnerListener.kt$IgnoreFirstSpinnerListener${ } - EmptyFunctionBlock:PlayerObserver.kt$PlayerObserver${} - EmptyFunctionBlock:SimpleSeekBarListener.kt$SimpleSeekBarListener${ } - ExplicitItLambdaParameter:AnimeDownloader.kt$AnimeDownloader${ it: AnimeDownload -> it.source !is UnmeteredSource } - ExplicitItLambdaParameter:AnimeLibraryTab.kt$AnimeLibraryTab${ it: LibraryAnime -> scope.launchIO { val episode = screenModel.getNextUnseenEpisode(it.anime) if (episode != null) openEpisode(episode) } Unit } - ExplicitItLambdaParameter:ColorFilterPage.kt${ index, it -> FilterChip( selected = colorFilterMode == index, onClick = { screenModel.preferences.colorFilterMode().set(index) }, label = { Text(stringResource(it.first)) }, ) } - ExplicitItLambdaParameter:MangaDownloader.kt$MangaDownloader${ it: MangaDownload -> it.source !is UnmeteredSource } - ExplicitItLambdaParameter:MangaLibraryTab.kt$MangaLibraryTab${ it: LibraryManga -> scope.launchIO { val chapter = screenModel.getNextUnreadChapter(it.manga) if (chapter != null) { context.startActivity( ReaderActivity.newIntent( context, chapter.mangaId, chapter.id, ), ) } else { snackbarHostState.showSnackbar( context.stringResource(MR.strings.no_next_chapter), ) } } Unit } - ExplicitItLambdaParameter:PlayerActivity.kt$PlayerActivity${ i, it -> if (i == 0 && it.time < 1.0) { VideoChapter( it.index, it.title, 0.0, ) } else { it } } - ExplicitItLambdaParameter:PlayerActivity.kt$PlayerActivity${ i, it -> val startTime = if (i == 0 && it.interval.startTime < 1.0) { 0.0 } else { it.interval.startTime } val startChapter = VideoChapter( index = -2, // Index -2 is used to indicate that this is an AniSkip chapter title = it.skipType.getString(), time = startTime, ) val nextStart = sortedAniskipStamps.getOrNull(i + 1)?.interval?.startTime val isNotLastChapter = abs(it.interval.endTime - (duration?.toDouble() ?: -2.0)) > 1.0 val isNotAdjacent = nextStart == null || (abs(it.interval.endTime - nextStart) > 1.0) if (isNotLastChapter && isNotAdjacent) { val endChapter = VideoChapter( index = -1, title = null, time = it.interval.endTime, ) return@mapIndexed listOf(startChapter, endChapter) } else { listOf(startChapter) } } - ExplicitItLambdaParameter:ReadingModePage.kt${ index, it -> FilterChip( selected = imageScaleType == index + 1, onClick = { screenModel.preferences.imageScaleType().set(index + 1) }, label = { Text(stringResource(it)) }, ) } - ExplicitItLambdaParameter:ReadingModePage.kt${ index, it -> FilterChip( selected = selected == index, onClick = { onSelect(index) }, label = { Text(stringResource(it)) }, ) } - ExplicitItLambdaParameter:ReadingModePage.kt${ index, it -> FilterChip( selected = zoomStart == index + 1, onClick = { screenModel.preferences.zoomStart().set(index + 1) }, label = { Text(stringResource(it)) }, ) } - ExplicitItLambdaParameter:SettingsReaderScreen.kt$SettingsReaderScreen${ index, it -> index + 1 to stringResource(it) } - ExplicitItLambdaParameter:SettingsReaderScreen.kt$SettingsReaderScreen${ index, it -> index to stringResource(it) } - ForEachOnRange:EntryBottomActionMenu.kt$0..<5 - ForEachOnRange:EntryBottomActionMenu.kt$0..<9 - ForbiddenComment:AddAnimeTracks.kt$AddAnimeTracks$// TODO: merge into [SyncChapterProgressWithTrack]? - ForbiddenComment:AddAnimeTracks.kt$AddAnimeTracks$// TODO: update all trackers based on common data - ForbiddenComment:AddMangaTracks.kt$AddMangaTracks$// TODO: merge into [SyncChapterProgressWithTrack]? - ForbiddenComment:AddMangaTracks.kt$AddMangaTracks$// TODO: update all trackers based on common data - ForbiddenComment:Anime.kt$// TODO: move these into the domain model - ForbiddenComment:AnimeCoverScreenModel.kt$AnimeCoverScreenModel$// TODO: Handle animated cover - ForbiddenComment:AnimeDownloader.kt$AnimeDownloader$// TODO: show warnings in stable - ForbiddenComment:AnimeDownloader.kt$AnimeDownloader$// TODO: support other file formats!! - ForbiddenComment:AnimeInfoHeader.kt$// TODO: show something better when using custom interval - ForbiddenComment:AnimeLibrarySettingsDialog.kt$// TODO: re-enable when custom intervals are ready for stable - ForbiddenComment:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$// TODO: surface skipped reasons to user? - ForbiddenComment:AnimeTracker.kt$AnimeTracker$// TODO: Store all scores as 10 point in the future maybe? - ForbiddenComment:AnimeTracker.kt$AnimeTracker$// TODO: move this to an interactor, and update all trackers based on common data - ForbiddenComment:BackupRestorer.kt$BackupRestorer$// TODO: optionally trigger online library + tracker update - ForbiddenComment:BangumiApi.kt$BangumiApi$// TODO: get user readed chapter here - ForbiddenComment:BrowseTab.kt$BrowseTab$// TODO: Find a way to let it open Global Anime/Manga Search depending on what Tab(e.g. Anime/Manga Source Tab) is open - ForbiddenComment:CategoryDialogs.kt$// TODO: https://issuetracker.google.com/issues/204502668 - ForbiddenComment:Chapter.kt$// TODO: Remove when all deps are migrated - ForbiddenComment:DisplayExtensions.kt$// TODO: move the logic to `isTabletUi()` when main activity is rewritten in Compose - ForbiddenComment:Episode.kt$// TODO: Remove when all deps are migrated - ForbiddenComment:ExtensionReposDialogs.kt$// TODO: https://issuetracker.google.com/issues/204502668 - ForbiddenComment:GlobalAnimeSearchToolbar.kt$// TODO: make this UX better; it only applies when triggering a new search - ForbiddenComment:GlobalMangaSearchToolbar.kt$// TODO: make this UX better; it only applies when triggering a new search - ForbiddenComment:HomeScreen.kt$HomeScreen$// TODO: https://issuetracker.google.com/u/0/issues/316327367 - ForbiddenComment:LibraryTabs.kt$// TODO: use default when width is fixed upstream - ForbiddenComment:MainActivity.kt$MainActivity$// TODO: replace with ComponentActivity#enableEdgeToEdge - ForbiddenComment:Manga.kt$// TODO: move these into the domain model - ForbiddenComment:MangaCoverScreenModel.kt$MangaCoverScreenModel$// TODO: Handle animated cover - ForbiddenComment:MangaInfoHeader.kt$// TODO: show something better when using custom interval - ForbiddenComment:MangaLibrarySettingsDialog.kt$// TODO: re-enable when custom intervals are ready for stable - ForbiddenComment:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$// TODO: surface skipped reasons to user? - ForbiddenComment:MangaLibraryUpdateNotifier.kt$MangaLibraryUpdateNotifier.Companion$// TODO: Change when implemented on Aniyomi website - ForbiddenComment:MangaTracker.kt$MangaTracker$// TODO: Store all scores as 10 point in the future maybe? - ForbiddenComment:PictureInPictureHandler.kt$// TODO: https://developer.android.com/develop/ui/views/picture-in-picture#setautoenterenabled - ForbiddenComment:PlayerActivity.kt$PlayerActivity$// TODO: I think this is a bad hack. - ForbiddenComment:PlayerActivity.kt$PlayerActivity$// TODO: Move into function once compose is implemented - ForbiddenComment:PlayerActivity.kt$PlayerActivity$// TODO: exception java.util.ConcurrentModificationException: - ForbiddenComment:PlayerDialog.kt$// TODO: (Merge_Change) stringResource "MR.strings.action_ok" to be replaced with - ForbiddenComment:PlayerSettingsSheet.kt$// TODO: (Merge_Change) below two Columns to be switched to using 'SettingsChipRow' - ForbiddenComment:PlayerSettingsSheet.kt$// TODO: Shift to MPV-Lib - ForbiddenComment:PreferenceItem.kt$// TODO: use different composable? - ForbiddenComment:ReaderPreferences.kt$ReaderPreferences$// TODO: default this to true if reader long strip ever goes stable - ForbiddenComment:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$// TODO: allow private option in stable versions once URL handling is more fleshed out - FunctionNaming:AnimeDownloader.kt$AnimeDownloader$private fun _clearQueue() - FunctionNaming:MangaDownloader.kt$MangaDownloader$private fun _clearQueue() - FunctionParameterNaming:AnimeScreen.kt$AnimeScreen$anime_: Anime? - FunctionParameterNaming:AnimeScreen.kt$AnimeScreen$source_: AnimeSource? - FunctionParameterNaming:MangaScreen.kt$MangaScreen$manga_: Manga? - FunctionParameterNaming:MangaScreen.kt$MangaScreen$source_: MangaSource? - FunctionParameterNaming:ShikimoriApi.kt$ShikimoriApi$user_id: String - ImplicitDefaultLocale:AnimeScreen.kt$String.format( "%d:%02d", TimeUnit.MILLISECONDS.toMinutes(milliseconds), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) - ImplicitDefaultLocale:AnimeScreen.kt$String.format( "%d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds), TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) - ImplicitDefaultLocale:AnimeScreen.kt$String.format( "Airing in %02dd %02dh %02dm %02ds", TimeUnit.MILLISECONDS.toDays(milliseconds), TimeUnit.MILLISECONDS.toHours(milliseconds) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(milliseconds)), TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) - ImplicitDefaultLocale:AnimeUpdatesUiItem.kt$String.format( "%d:%02d", TimeUnit.MILLISECONDS.toMinutes(milliseconds), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) - ImplicitDefaultLocale:AnimeUpdatesUiItem.kt$String.format( "%d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds), TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) - ImplicitDefaultLocale:SubtitleColorPage.kt$String.format("%02X", toAlpha(this)) - ImplicitDefaultLocale:SubtitleColorPage.kt$String.format("%02X", toBlue(this)) - ImplicitDefaultLocale:SubtitleColorPage.kt$String.format("%02X", toGreen(this)) - ImplicitDefaultLocale:SubtitleColorPage.kt$String.format("%02X", toRed(this)) - ImplicitDefaultLocale:SubtitleColorPage.kt$String.format("%03d", argb.toValue(colorCode)) - InstanceOfCheckForException:AnimeDownloader.kt$AnimeDownloader$e is CancellationException - InstanceOfCheckForException:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$e is CancellationException - InstanceOfCheckForException:AnimeMetadataUpdateJob.kt$AnimeMetadataUpdateJob$e is CancellationException - InstanceOfCheckForException:AnimeScreenModel.kt$AnimeScreenModel$e is HttpException - InstanceOfCheckForException:AnimeScreenModel.kt$AnimeScreenModel$e is NoEpisodesException - InstanceOfCheckForException:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$e is CancellationException - InstanceOfCheckForException:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$e is StreamResetException - InstanceOfCheckForException:BackupRestoreJob.kt$BackupRestoreJob$e is CancellationException - InstanceOfCheckForException:HttpPageLoader.kt$HttpPageLoader$e is CancellationException - InstanceOfCheckForException:MangaDownloader.kt$MangaDownloader$e is CancellationException - InstanceOfCheckForException:MangaDownloader.kt$MangaDownloader$error is CancellationException - InstanceOfCheckForException:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$e is CancellationException - InstanceOfCheckForException:MangaMetadataUpdateJob.kt$MangaMetadataUpdateJob$e is CancellationException - InstanceOfCheckForException:MangaScreenModel.kt$MangaScreenModel$e is HttpException - InstanceOfCheckForException:MangaScreenModel.kt$MangaScreenModel$e is NoChaptersException - InstanceOfCheckForException:ReaderViewModel.kt$ReaderViewModel$e is CancellationException - LambdaParameterInRestartableEffect:AnimeLibraryContent.kt$onChangeCurrentPage - LambdaParameterInRestartableEffect:MangaLibraryContent.kt$onChangeCurrentPage - LambdaParameterInRestartableEffect:ReaderSettingsDialog.kt$onHideMenus - LambdaParameterInRestartableEffect:ReaderSettingsDialog.kt$onShowMenus - LargeClass:AnimeDownloader.kt$AnimeDownloader - LargeClass:AnimeScreenModel.kt$AnimeScreenModel : StateScreenModel - LargeClass:MangaScreenModel.kt$MangaScreenModel : StateScreenModel - LargeClass:PlayerActivity.kt$PlayerActivity : BaseActivity - LongMethod:AboutScreen.kt$AboutScreen$@Composable override fun Content() - LongMethod:AdvancedPlayerSettingsScreen.kt$AdvancedPlayerSettingsScreen$@SuppressLint("InlinedApi") @Composable override fun getPreferences(): List<Preference> - LongMethod:AnilistApi.kt$AnilistApi$suspend fun findLibAnime(track: AnimeTrack, userid: Int): AnimeTrack? - LongMethod:AnilistApi.kt$AnilistApi$suspend fun findLibManga(track: MangaTrack, userid: Int): MangaTrack? - LongMethod:AnimeCategoryTab.kt$@Composable fun Screen.animeCategoryTab(): TabContent - LongMethod:AnimeCoverDialog.kt$@Composable fun AnimeCoverDialog( coverDataProvider: () -> Anime, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) - LongMethod:AnimeDownloadCache.kt$AnimeDownloadCache$private fun renewCache() - LongMethod:AnimeDownloader.kt$AnimeDownloader$private fun downloadVideoExternal( video: Video, source: AnimeHttpSource, tmpDir: UniFile, filename: String, ): UniFile - LongMethod:AnimeDownloader.kt$AnimeDownloader$private suspend fun httpDownload( download: AnimeDownload, tmpDir: UniFile, filename: String, threadNumber: Int, safeDownload: Boolean, ): UniFile - LongMethod:AnimeEpisodeListItem.kt$@Composable fun AnimeEpisodeListItem( title: String, date: String?, watchProgress: String?, scanlator: String?, seen: Boolean, bookmark: Boolean, selected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((EpisodeDownloadAction) -> Unit)?, onEpisodeSwipe: (LibraryPreferences.EpisodeSwipeAction) -> Unit, modifier: Modifier = Modifier, ) - LongMethod:AnimeExtensionDetailsScreen.kt$@Composable fun AnimeExtensionDetailsScreen( navigateUp: () -> Unit, state: AnimeExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) - LongMethod:AnimeExtensionDetailsScreen.kt$@Composable private fun DetailsHeader( extension: AnimeExtension, onClickAgeRating: () -> Unit, onClickUninstall: () -> Unit, onClickAppInfo: (() -> Unit)?, ) - LongMethod:AnimeExtensionLoader.kt$AnimeExtensionLoader$private fun loadExtension(context: Context, extensionInfo: AnimeExtensionInfo): AnimeLoadResult - LongMethod:AnimeExtensionsScreen.kt$@Composable private fun AnimeExtensionContent( state: AnimeExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (AnimeExtension) -> Unit, onOpenWebView: (AnimeExtension.Available) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onInstallExtension: (AnimeExtension.Available) -> Unit, onUninstallExtension: (AnimeExtension) -> Unit, onUpdateExtension: (AnimeExtension.Installed) -> Unit, onTrustExtension: (AnimeExtension.Untrusted) -> Unit, onOpenExtension: (AnimeExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) - LongMethod:AnimeExtensionsScreen.kt$@Composable private fun AnimeExtensionItemActions( extension: AnimeExtension, installStep: InstallStep, modifier: Modifier = Modifier, onClickItemCancel: (AnimeExtension) -> Unit = {}, onClickItemAction: (AnimeExtension) -> Unit = {}, onClickItemSecondaryAction: (AnimeExtension) -> Unit = {}, ) - LongMethod:AnimeHistoryTab.kt$@Composable fun Screen.animeHistoryTab( context: Context, fromMore: Boolean, ): TabContent - LongMethod:AnimeInfoHeader.kt$@Composable fun ExpandableAnimeDescription( defaultExpandState: Boolean, description: String?, tagsProvider: () -> List<String>?, onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, modifier: Modifier = Modifier, ) - LongMethod:AnimeInfoHeader.kt$@Composable private fun AnimeSummary( expandedDescription: String, shrunkDescription: String, expanded: Boolean, modifier: Modifier = Modifier, ) - LongMethod:AnimeInfoHeader.kt$@Composable private fun ColumnScope.AnimeContentInfo( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) - LongMethod:AnimeLibraryContent.kt$@Composable fun AnimeLibraryContent( categories: List<Category>, searchQuery: String?, selection: List<LibraryAnime>, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onAnimeClicked: (Long) -> Unit, onContinueWatchingClicked: ((LibraryAnime) -> Unit)?, onToggleSelection: (LibraryAnime) -> Unit, onToggleRangeSelection: (LibraryAnime) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfAnimeForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getAnimeLibraryForPage: (Int) -> List<AnimeLibraryItem>, ) - LongMethod:AnimeLibraryPager.kt$@Composable fun AnimeLibraryPager( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedAnime: List<LibraryAnime>, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<AnimeLibraryItem>, onClickAnime: (LibraryAnime) -> Unit, onLongClickAnime: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, ) - LongMethod:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$private fun AnimeLibraryMap.applySort( // Map<MangaId, List<Track>> trackMap: Map<Long, List<AnimeTrack>>, ): AnimeLibraryMap - LongMethod:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$private suspend fun AnimeLibraryMap.applyFilters( trackMap: Map<Long, List<AnimeTrack>>, loggedInTrackers: Map<Long, TriState>, ): AnimeLibraryMap - LongMethod:AnimeLibrarySettingsDialog.kt$@Composable private fun ColumnScope.DisplayPage( screenModel: AnimeLibrarySettingsScreenModel, ) - LongMethod:AnimeLibrarySettingsDialog.kt$@Composable private fun ColumnScope.FilterPage( screenModel: AnimeLibrarySettingsScreenModel, ) - LongMethod:AnimeLibraryTab.kt$AnimeLibraryTab$@OptIn(ExperimentalMaterial3Api::class) @Composable override fun Content() - LongMethod:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$private suspend fun addAnimeToQueue(categoryId: Long) - LongMethod:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$private suspend fun updateEpisodeList() - LongMethod:AnimeScreen.kt$@Composable fun AnimeScreen( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, onBackClicked: () -> Unit, onEpisodeClicked: (episode: Episode, alt: Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Episode>, bookmarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<Episode>, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List<Episode>) -> Unit, // For episode swipe onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongMethod:AnimeScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun AnimeScreenLargeImpl( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, onBackClicked: () -> Unit, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Episode>, bookmarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<Episode>, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List<Episode>) -> Unit, // For swipe actions onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongMethod:AnimeScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun AnimeScreenSmallImpl( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, onBackClicked: () -> Unit, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Episode>, bookmarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<Episode>, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List<Episode>) -> Unit, // For episode swipe onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongMethod:AnimeScreen.kt$AnimeScreen$@Composable override fun Content() - LongMethod:AnimeScreen.kt$private fun LazyListScope.sharedEpisodeItems( anime: Anime, episodes: List<EpisodeList>, isAnyEpisodeSelected: Boolean, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, ) - LongMethod:AnimeSourceSearchScreen.kt$AnimeSourceSearchScreen$@Composable override fun Content() - LongMethod:AnimeTrackInfoDialog.kt$AnimeTrackInfoDialogHomeScreen$@Composable override fun Content() - LongMethod:AnimeTrackInfoDialog.kt$TrackDateRemoverScreen$@Composable override fun Content() - LongMethod:AnimeTrackInfoDialog.kt$TrackerAnimeRemoveScreen$@Composable override fun Content() - LongMethod:AnimeTrackInfoDialogHome.kt$@Composable private fun TrackInfoItem( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, episodes: String, onEpisodesClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, ) - LongMethod:AnimeTrackerSearch.kt$@Composable fun AnimeTrackerSearch( query: TextFieldValue, onQueryChange: (TextFieldValue) -> Unit, onDispatchQuery: () -> Unit, queryResult: Result<List<AnimeTrackSearch>>?, selected: AnimeTrackSearch?, onSelectedChange: (AnimeTrackSearch) -> Unit, onConfirmSelection: () -> Unit, onDismissRequest: () -> Unit, ) - LongMethod:AnimeTrackerSearch.kt$@Composable private fun SearchResultItem( trackSearch: AnimeTrackSearch, selected: Boolean, onClick: () -> Unit, ) - LongMethod:AnimeUpdatesTab.kt$@Composable fun Screen.animeUpdatesTab( context: Context, fromMore: Boolean, ): TabContent - LongMethod:AnimeUpdatesUiItem.kt$@Composable private fun AnimeUpdatesUiItem( update: AnimeUpdatesWithRelations, selected: Boolean, watchProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadEpisode: ((EpisodeDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) - LongMethod:AnimeUpdatesUiItem.kt$internal fun LazyListScope.animeUpdatesUiItems( uiModels: List<AnimeUpdatesUiModel>, selectionMode: Boolean, onUpdateSelected: (AnimeUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onClickCover: (AnimeUpdatesItem) -> Unit, onClickUpdate: (AnimeUpdatesItem, altPlayer: Boolean) -> Unit, onDownloadEpisode: (List<AnimeUpdatesItem>, EpisodeDownloadAction) -> Unit, ) - LongMethod:AppBar.kt$@Composable fun AppBarActions( actions: ImmutableList<AppBar.AppBarAction>, ) - LongMethod:AppBar.kt$@Composable fun SearchToolbar( searchQuery: String?, onChangeSearchQuery: (String?) -> Unit, modifier: Modifier = Modifier, titleContent: @Composable () -> Unit = {}, navigateUp: (() -> Unit)? = null, searchEnabled: Boolean = true, placeholderText: String? = null, onSearch: (String) -> Unit = {}, onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) }, actions: @Composable RowScope.() -> Unit = {}, scrollBehavior: TopAppBarScrollBehavior? = null, visualTransformation: VisualTransformation = VisualTransformation.None, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, ) - LongMethod:AppModule.kt$AppModule$override fun InjektRegistrar.registerInjectables() - LongMethod:AppThemePreferenceWidget.kt$@Composable fun AppThemePreviewItem( selected: Boolean, onClick: () -> Unit, ) - LongMethod:BrowseAnimeSourceScreen.kt$@Composable fun BrowseAnimeSourceContent( source: AnimeSource?, animeList: LazyPagingItems<StateFlow<Anime>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalAnimeSourceHelpClick: () -> Unit, onAnimeClick: (Anime) -> Unit, onAnimeLongClick: (Anime) -> Unit, ) - LongMethod:BrowseAnimeSourceScreen.kt$BrowseAnimeSourceScreen$@Composable override fun Content() - LongMethod:BrowseAnimeSourceToolbar.kt$@Composable fun BrowseAnimeSourceToolbar( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: AnimeSource?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) - LongMethod:BrowseMangaSourceScreen.kt$@Composable fun BrowseSourceContent( source: MangaSource?, mangaList: LazyPagingItems<StateFlow<Manga>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalSourceHelpClick: () -> Unit, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) - LongMethod:BrowseMangaSourceScreen.kt$BrowseMangaSourceScreen$@Composable override fun Content() - LongMethod:BrowseMangaSourceToolbar.kt$@Composable fun BrowseMangaSourceToolbar( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: MangaSource?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) - LongMethod:CategoryDialogs.kt$@Composable fun ChangeCategoryDialog( initialSelection: ImmutableList<CheckboxState<Category>>, onDismissRequest: () -> Unit, onEditCategories: () -> Unit, onConfirm: (List<Long>, List<Long>) -> Unit, ) - LongMethod:CategoryListItem.kt$@Composable fun CategoryListItem( category: Category, canMoveUp: Boolean, canMoveDown: Boolean, onMoveUp: (Category) -> Unit, onMoveDown: (Category) -> Unit, onRename: () -> Unit, onHide: () -> Unit, onDelete: () -> Unit, modifier: Modifier = Modifier, ) - LongMethod:ChapterDownloadIndicator.kt$@Composable private fun DownloadingIndicator( enabled: Boolean, downloadState: MangaDownload.State, downloadProgressProvider: () -> Int, onClick: (ChapterDownloadAction) -> Unit, modifier: Modifier = Modifier, ) - LongMethod:ChapterNavigator.kt$@Composable fun ChapterNavigator( isRtl: Boolean, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, ) - LongMethod:ChapterSettingsDialog.kt$@Composable fun ChapterSettingsDialog( onDismissRequest: () -> Unit, manga: Manga? = null, onDownloadFilterChanged: (TriState) -> Unit, onUnreadFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), onSortModeChanged: (Long) -> Unit, onDisplayModeChanged: (Long) -> Unit, onSetAsDefault: (applyToExistingManga: Boolean) -> Unit, onResetToDefault: () -> Unit, ) - LongMethod:ClearAnimeDatabaseScreen.kt$ClearAnimeDatabaseScreen$@Composable override fun Content() - LongMethod:ClearDatabaseScreen.kt$ClearDatabaseScreen$@Composable override fun Content() - LongMethod:ColorFilterPage.kt$@Composable internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel) - LongMethod:CreateBackupScreen.kt$CreateBackupScreen$@Composable override fun Content() - LongMethod:DomainModule.kt$DomainModule$override fun InjektRegistrar.registerInjectables() - LongMethod:DownloadsTab.kt$DownloadsTab$@Composable override fun Content() - LongMethod:DownloadsTab.kt$DownloadsTab$@Composable private fun AnimeActions( animeScreenModel: AnimeDownloadQueueScreenModel, animeDownloadList: List<AnimeDownloadHeaderItem>, ) - LongMethod:DownloadsTab.kt$DownloadsTab$@Composable private fun MangaActions( mangaScreenModel: MangaDownloadQueueScreenModel, mangaDownloadList: List<MangaDownloadHeaderItem>, ) - LongMethod:EditTextPreferenceWidget.kt$@Composable fun EditTextPreferenceWidget( title: String, subtitle: String?, icon: ImageVector?, value: String, onConfirm: suspend (String) -> Boolean, singleLine: Boolean = true, canBeBlank: Boolean = false, ) - LongMethod:EntryBottomActionMenu.kt$@Composable fun EntryBottomActionMenu( visible: Boolean, isManga: Boolean, modifier: Modifier = Modifier, onBookmarkClicked: (() -> Unit)? = null, onRemoveBookmarkClicked: (() -> Unit)? = null, onMarkAsViewedClicked: (() -> Unit)? = null, onMarkAsUnviewedClicked: (() -> Unit)? = null, onMarkPreviousAsViewedClicked: (() -> Unit)? = null, onDownloadClicked: (() -> Unit)? = null, onDeleteClicked: (() -> Unit)? = null, onExternalClicked: (() -> Unit)? = null, onInternalClicked: (() -> Unit)? = null, ) - LongMethod:EntryBottomActionMenu.kt$@Composable fun LibraryBottomActionMenu( visible: Boolean, onChangeCategoryClicked: () -> Unit, onMarkAsViewedClicked: () -> Unit, onMarkAsUnviewedClicked: () -> Unit, onDownloadClicked: ((DownloadAction) -> Unit)?, onDeleteClicked: () -> Unit, isManga: Boolean, modifier: Modifier = Modifier, ) - LongMethod:EntryToolbar.kt$@Composable fun EntryToolbar( title: String, titleAlphaProvider: () -> Float, hasFilters: Boolean, onBackClicked: () -> Unit, onClickFilter: () -> Unit, onClickShare: (() -> Unit)?, onClickDownload: ((DownloadAction) -> Unit)?, onClickEditCategory: (() -> Unit)?, onClickRefresh: () -> Unit, onClickMigrate: (() -> Unit)?, onClickSettings: (() -> Unit)?, // Anime only changeAnimeSkipIntro: (() -> Unit)?, // For action mode actionModeCounter: Int, onSelectAll: () -> Unit, onInvertSelection: () -> Unit, isManga: Boolean, modifier: Modifier = Modifier, backgroundAlphaProvider: () -> Float = titleAlphaProvider, ) - LongMethod:EpisodeDownloadIndicator.kt$@Composable private fun DownloadingIndicator( enabled: Boolean, downloadState: AnimeDownload.State, downloadProgressProvider: () -> Int, onClick: (EpisodeDownloadAction) -> Unit, modifier: Modifier = Modifier, ) - LongMethod:EpisodeListDialog.kt$@Composable private fun EpisodeListItem( episode: Episode, isCurrentEpisode: Boolean, title: String, date: String?, onBookmarkClicked: (Long?, Boolean) -> Unit, onEpisodeClicked: (Long?) -> Unit, ) - LongMethod:EpisodeOptionsDialogScreen.kt$@Composable private fun VideoList( useExternalDownloader: Boolean, episode: Episode, anime: Anime, videoList: List<Video>, ) - LongMethod:GlobalAnimeSearchToolbar.kt$@Composable fun GlobalAnimeSearchToolbar( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: AnimeSourceFilter, onChangeSearchFilter: (AnimeSourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) - LongMethod:GlobalMangaSearchToolbar.kt$@Composable fun GlobalMangaSearchToolbar( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: MangaSourceFilter, onChangeSearchFilter: (MangaSourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) - LongMethod:HomeScreen.kt$HomeScreen$@Composable override fun Content() - LongMethod:HomeScreen.kt$HomeScreen$@Composable private fun NavigationIconItem(tab: eu.kanade.presentation.util.Tab) - LongMethod:ItemsDialogs.kt$@Composable fun SetIntervalDialog( interval: Int, nextUpdate: Instant?, onDismissRequest: () -> Unit, isManga: Boolean, onValueChanged: ((Int) -> Unit)? = null, ) - LongMethod:MainActivity.kt$MainActivity$override fun onCreate(savedInstanceState: Bundle?) - LongMethod:MainActivity.kt$MainActivity$private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean - LongMethod:MangaCategoryTab.kt$@Composable fun Screen.mangaCategoryTab(): TabContent - LongMethod:MangaChapterListItem.kt$@Composable fun MangaChapterListItem( title: String, date: String?, readProgress: String?, scanlator: String?, read: Boolean, bookmark: Boolean, selected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> MangaDownload.State, downloadProgressProvider: () -> Int, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((ChapterDownloadAction) -> Unit)?, onChapterSwipe: (LibraryPreferences.ChapterSwipeAction) -> Unit, modifier: Modifier = Modifier, ) - LongMethod:MangaCoverDialog.kt$@Composable fun MangaCoverDialog( coverDataProvider: () -> Manga, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) - LongMethod:MangaDownloadCache.kt$MangaDownloadCache$private fun renewCache() - LongMethod:MangaDownloader.kt$MangaDownloader$private suspend fun downloadChapter(download: MangaDownload) - LongMethod:MangaExtensionDetailsScreen.kt$@Composable fun MangaExtensionDetailsScreen( navigateUp: () -> Unit, state: MangaExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) - LongMethod:MangaExtensionDetailsScreen.kt$@Composable private fun DetailsHeader( extension: MangaExtension, onClickAgeRating: () -> Unit, onClickUninstall: () -> Unit, onClickAppInfo: (() -> Unit)?, ) - LongMethod:MangaExtensionLoader.kt$MangaExtensionLoader$private fun loadMangaExtension(context: Context, extensionInfo: MangaExtensionInfo): MangaLoadResult - LongMethod:MangaExtensionsScreen.kt$@Composable private fun ExtensionContent( state: MangaExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (MangaExtension) -> Unit, onOpenWebView: (MangaExtension.Available) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onInstallExtension: (MangaExtension.Available) -> Unit, onUninstallExtension: (MangaExtension) -> Unit, onUpdateExtension: (MangaExtension.Installed) -> Unit, onTrustExtension: (MangaExtension.Untrusted) -> Unit, onOpenExtension: (MangaExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) - LongMethod:MangaExtensionsScreen.kt$@Composable private fun ExtensionItemActions( extension: MangaExtension, installStep: InstallStep, modifier: Modifier = Modifier, onClickItemCancel: (MangaExtension) -> Unit = {}, onClickItemAction: (MangaExtension) -> Unit = {}, onClickItemSecondaryAction: (MangaExtension) -> Unit = {}, ) - LongMethod:MangaHistoryTab.kt$@Composable fun Screen.mangaHistoryTab( context: Context, fromMore: Boolean, ): TabContent - LongMethod:MangaInfoHeader.kt$@Composable fun ExpandableMangaDescription( defaultExpandState: Boolean, description: String?, tagsProvider: () -> List<String>?, onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, modifier: Modifier = Modifier, ) - LongMethod:MangaInfoHeader.kt$@Composable private fun ColumnScope.MangaContentInfo( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) - LongMethod:MangaInfoHeader.kt$@Composable private fun MangaSummary( expandedDescription: String, shrunkDescription: String, expanded: Boolean, modifier: Modifier = Modifier, ) - LongMethod:MangaLibraryContent.kt$@Composable fun MangaLibraryContent( categories: List<Category>, searchQuery: String?, selection: List<LibraryManga>, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onMangaClicked: (Long) -> Unit, onContinueReadingClicked: ((LibraryManga) -> Unit)?, onToggleSelection: (LibraryManga) -> Unit, onToggleRangeSelection: (LibraryManga) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfMangaForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<MangaLibraryItem>, ) - LongMethod:MangaLibraryPager.kt$@Composable fun MangaLibraryPager( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedManga: List<LibraryManga>, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<MangaLibraryItem>, onClickManga: (LibraryManga) -> Unit, onLongClickManga: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, ) - LongMethod:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$private fun MangaLibraryMap.applySort( // Map<MangaId, List<Track>> trackMap: Map<Long, List<MangaTrack>>, ): MangaLibraryMap - LongMethod:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$private suspend fun MangaLibraryMap.applyFilters( trackMap: Map<Long, List<MangaTrack>>, loggedInTrackers: Map<Long, TriState>, ): MangaLibraryMap - LongMethod:MangaLibrarySettingsDialog.kt$@Composable private fun ColumnScope.DisplayPage( screenModel: MangaLibrarySettingsScreenModel, ) - LongMethod:MangaLibrarySettingsDialog.kt$@Composable private fun ColumnScope.FilterPage( screenModel: MangaLibrarySettingsScreenModel, ) - LongMethod:MangaLibraryTab.kt$MangaLibraryTab$@OptIn(ExperimentalMaterial3Api::class) @Composable override fun Content() - LongMethod:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$private suspend fun addMangaToQueue(categoryId: Long) - LongMethod:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$private suspend fun updateChapterList() - LongMethod:MangaScreen.kt$@Composable fun MangaScreen( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongMethod:MangaScreen.kt$@Composable fun MangaScreenLargeImpl( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For swipe actions onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongMethod:MangaScreen.kt$@Composable private fun MangaScreenSmallImpl( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongMethod:MangaScreen.kt$MangaScreen$@Composable override fun Content() - LongMethod:MangaScreen.kt$private fun LazyListScope.sharedChapterItems( manga: Manga, chapters: List<ChapterList>, isAnyChapterSelected: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, ) - LongMethod:MangaSourceSearchScreen.kt$MangaSourceSearchScreen$@Composable override fun Content() - LongMethod:MangaSourcesTab.kt$@Composable fun Screen.mangaSourcesTab(): TabContent - LongMethod:MangaTrackInfoDialog.kt$MangaTrackInfoDialogHomeScreen$@Composable override fun Content() - LongMethod:MangaTrackInfoDialog.kt$TrackDateRemoverScreen$@Composable override fun Content() - LongMethod:MangaTrackInfoDialog.kt$TrackerMangaRemoveScreen$@Composable override fun Content() - LongMethod:MangaTrackInfoDialogHome.kt$@Composable private fun TrackInfoItem( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, chapters: String, onChaptersClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, ) - LongMethod:MangaTrackerSearch.kt$@Composable fun MangaTrackerSearch( query: TextFieldValue, onQueryChange: (TextFieldValue) -> Unit, onDispatchQuery: () -> Unit, queryResult: Result<List<MangaTrackSearch>>?, selected: MangaTrackSearch?, onSelectedChange: (MangaTrackSearch) -> Unit, onConfirmSelection: () -> Unit, onDismissRequest: () -> Unit, ) - LongMethod:MangaTrackerSearch.kt$@Composable private fun SearchResultItem( trackSearch: MangaTrackSearch, selected: Boolean, onClick: () -> Unit, ) - LongMethod:MangaUpdatesTab.kt$@Composable fun Screen.mangaUpdatesTab( context: Context, fromMore: Boolean, ): TabContent - LongMethod:MangaUpdatesUiItem.kt$@Composable private fun MangaUpdatesUiItem( update: MangaUpdatesWithRelations, selected: Boolean, readProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadChapter: ((ChapterDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> MangaDownload.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) - LongMethod:MangaUpdatesUiItem.kt$internal fun LazyListScope.mangaUpdatesUiItems( uiModels: List<MangaUpdatesUiModel>, selectionMode: Boolean, onUpdateSelected: (MangaUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onClickCover: (MangaUpdatesItem) -> Unit, onClickUpdate: (MangaUpdatesItem) -> Unit, onDownloadChapter: (List<MangaUpdatesItem>, ChapterDownloadAction) -> Unit, ) - LongMethod:MigrateAnimeDialog.kt$@Composable internal fun MigrateAnimeDialog( oldAnime: Anime, newAnime: Anime, screenModel: MigrateAnimeDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, ) - LongMethod:MigrateAnimeDialog.kt$MigrateAnimeDialogScreenModel$private suspend fun migrateAnimeInternal( oldSource: AnimeSource?, newSource: AnimeSource, oldAnime: Anime, newAnime: Anime, sourceEpisodes: List<SEpisode>, replace: Boolean, flags: Int, ) - LongMethod:MigrateMangaDialog.kt$@Composable internal fun MigrateMangaDialog( oldManga: Manga, newManga: Manga, screenModel: MigrateMangaDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, ) - LongMethod:MigrateMangaDialog.kt$MigrateMangaDialogScreenModel$private suspend fun migrateMangaInternal( oldSource: MangaSource?, newSource: MangaSource, oldManga: Manga, newManga: Manga, sourceChapters: List<SChapter>, replace: Boolean, flags: Int, ) - LongMethod:Migrations.kt$Migrations$fun upgrade( context: Context, preferenceStore: PreferenceStore, basePreferences: BasePreferences, uiPreferences: UiPreferences, networkPreferences: NetworkPreferences, sourcePreferences: SourcePreferences, securityPreferences: SecurityPreferences, libraryPreferences: LibraryPreferences, readerPreferences: ReaderPreferences, playerPreferences: PlayerPreferences, backupPreferences: BackupPreferences, trackerManager: TrackerManager, ): Boolean - LongMethod:MoreScreen.kt$@Composable fun MoreScreen( downloadQueueStateProvider: () -> DownloadQueueState, downloadedOnly: Boolean, onDownloadedOnlyChange: (Boolean) -> Unit, incognitoMode: Boolean, onIncognitoModeChange: (Boolean) -> Unit, isFDroid: Boolean, navStyle: NavStyle, onClickAlt: () -> Unit, onClickDownloadQueue: () -> Unit, onClickCategories: () -> Unit, onClickStats: () -> Unit, onClickStorage: () -> Unit, onClickDataAndStorage: () -> Unit, onClickSettings: () -> Unit, onClickAbout: () -> Unit, ) - LongMethod:NotificationReceiver.kt$NotificationReceiver$override fun onReceive(context: Context, intent: Intent) - LongMethod:Notifications.kt$Notifications$fun createChannels(context: Context) - LongMethod:PlayerActivity.kt$PlayerActivity$@SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) - LongMethod:PlayerActivity.kt$PlayerActivity$@SuppressLint("SourceLockedOrientationActivity") internal suspend fun fileLoaded() - LongMethod:PlayerActivity.kt$PlayerActivity$fun doubleTapSeek( time: Int, event: MotionEvent? = null, isDoubleTap: Boolean = true, videoChapterText: String? = null, chapterSeek: String? = null, ) - LongMethod:PlayerActivity.kt$PlayerActivity$private fun updateChapters(stamps: List<Stamp>? = null, duration: Int? = null) - LongMethod:PlayerSettingsSheet.kt$@Composable fun PlayerSettingsSheet( screenModel: PlayerSettingsScreenModel, onDismissRequest: () -> Unit, ) - LongMethod:PreferenceItem.kt$@Composable internal fun PreferenceItem( item: Preference.PreferenceItem<*>, highlightKey: String?, ) - LongMethod:ReaderActivity.kt$ReaderActivity$override fun onCreate(savedInstanceState: Bundle?) - LongMethod:ReaderActivity.kt$ReaderActivity$private fun initializeMenu() - LongMethod:ReaderAppBars.kt$@Composable fun ReaderAppBars( visible: Boolean, fullscreen: Boolean, mangaTitle: String?, chapterTitle: String?, navigateUp: () -> Unit, onClickTopAppBar: () -> Unit, bookmarked: Boolean, onToggleBookmarked: () -> Unit, onOpenInWebView: (() -> Unit)?, onShare: (() -> Unit)?, viewer: Viewer?, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) - LongMethod:ReadingModePage.kt$@Composable private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenModel) - LongMethod:ScanlatorFilterDialog.kt$@Composable fun ScanlatorFilterDialog( availableScanlators: Set<String>, excludedScanlators: Set<String>, onDismissRequest: () -> Unit, onConfirm: (Set<String>) -> Unit, ) - LongMethod:ScreenshotOptionsSheet.kt$@Composable fun ScreenshotOptionsSheet( screenModel: PlayerSettingsScreenModel, cachePath: String, onSetAsCover: (() -> InputStream) -> Unit, onShare: (() -> InputStream) -> Unit, onSave: (() -> InputStream) -> Unit, onDismissRequest: () -> Unit, ) - LongMethod:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$@Composable private fun getDataSaverGroup(): Preference.PreferenceGroup - LongMethod:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$@Composable private fun getExtensionsGroup( basePreferences: BasePreferences, ): Preference.PreferenceGroup - LongMethod:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$@Composable private fun getNetworkGroup( networkPreferences: NetworkPreferences, ): Preference.PreferenceGroup - LongMethod:SettingsAppearanceScreen.kt$SettingsAppearanceScreen$@Composable private fun getDisplayGroup( uiPreferences: UiPreferences, ): Preference.PreferenceGroup - LongMethod:SettingsBrowseScreen.kt$SettingsBrowseScreen$@Composable override fun getPreferences(): List<Preference> - LongMethod:SettingsDataScreen.kt$SettingsDataScreen$@Composable private fun getBackupAndRestoreGroup(backupPreferences: BackupPreferences): Preference.PreferenceGroup - LongMethod:SettingsDownloadScreen.kt$SettingsDownloadScreen$@Composable override fun getPreferences(): List<Preference> - LongMethod:SettingsDownloadScreen.kt$SettingsDownloadScreen$@Composable private fun getAutoDownloadGroup( downloadPreferences: DownloadPreferences, allAnimeCategories: ImmutableList<Category>, allMangaCategories: ImmutableList<Category>, ): Preference.PreferenceGroup - LongMethod:SettingsLibraryScreen.kt$SettingsLibraryScreen$@Composable private fun getCategoriesGroup( navigator: Navigator, allCategories: List<Category>, allAnimeCategories: List<Category>, libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup - LongMethod:SettingsLibraryScreen.kt$SettingsLibraryScreen$@Composable private fun getGlobalUpdateGroup( allMangaCategories: List<Category>, allAnimeCategories: List<Category>, libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup - LongMethod:SettingsMainScreen.kt$SettingsMainScreen$@Composable fun Content(twoPane: Boolean) - LongMethod:SettingsPlayerScreen.kt$SettingsPlayerScreen$@Composable private fun getOrientationGroup(playerPreferences: PlayerPreferences): Preference.PreferenceGroup - LongMethod:SettingsPlayerScreen.kt$SettingsPlayerScreen$@Composable private fun getSeekingGroup(playerPreferences: PlayerPreferences): Preference.PreferenceGroup - LongMethod:SettingsReaderScreen.kt$SettingsReaderScreen$@Composable private fun getPagedGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup - LongMethod:SettingsReaderScreen.kt$SettingsReaderScreen$@Composable private fun getWebtoonGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup - LongMethod:SettingsSearchScreen.kt$@Composable private fun SearchResult( searchKey: String, modifier: Modifier = Modifier, listState: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(), onItemClick: (SearchResultItem) -> Unit, ) - LongMethod:SettingsSearchScreen.kt$SettingsSearchScreen$@Composable override fun Content() - LongMethod:SettingsTrackingScreen.kt$SettingsTrackingScreen$@Composable override fun getPreferences(): List<Preference> - LongMethod:SettingsTrackingScreen.kt$SettingsTrackingScreen$@Composable private fun TrackingLoginDialog( tracker: Tracker, uNameStringRes: StringResource, onDismissRequest: () -> Unit, ) - LongMethod:SourceFilterAnimeDialog.kt$@Composable private fun FilterItem(filter: AnimeFilter<*>, onUpdate: () -> Unit) - LongMethod:SourceFilterMangaDialog.kt$@Composable private fun FilterItem(filter: Filter<*>, onUpdate: () -> Unit) - LongMethod:StorageItem.kt$@Composable fun StorageItem( item: StorageItem, isManga: Boolean, modifier: Modifier = Modifier, onDelete: (Long) -> Unit, ) - LongMethod:StorageStep.kt$StorageStep$@Composable override fun Content() - LongMethod:StreamsCatalogSheet.kt$@Composable private fun StreamsPageBuilder( externalTrackCode: String?, stream: PlayerViewModel.VideoStreams.Stream, openContentFd: (Uri) -> String?, onTrackSelected: (Int) -> Unit, ) - LongMethod:SubtitleColorPage.kt$@Composable private fun SubtitleColors( screenModel: PlayerSettingsScreenModel, ) - LongMethod:SubtitleDelayPage.kt$@Composable fun StreamsDelayPage( screenModel: PlayerSettingsScreenModel, ) - LongMethod:SubtitleFontPage.kt$@Composable private fun SubtitleFont( screenModel: PlayerSettingsScreenModel, ) - LongMethod:SyncChaptersWithSource.kt$SyncChaptersWithSource$suspend fun await( rawSourceChapters: List<SChapter>, manga: Manga, source: MangaSource, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Chapter> - LongMethod:SyncEpisodesWithSource.kt$SyncEpisodesWithSource$suspend fun await( rawSourceEpisodes: List<SEpisode>, anime: Anime, source: AnimeSource, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Episode> - LongMethod:TabbedScreen.kt$@Composable fun TabbedScreen( titleRes: StringResource?, tabs: ImmutableList<TabContent>, modifier: Modifier = Modifier, startIndex: Int? = null, mangaSearchQuery: String? = null, onChangeMangaSearchQuery: (String?) -> Unit = {}, scrollable: Boolean = false, animeSearchQuery: String? = null, onChangeAnimeSearchQuery: (String?) -> Unit = {}, ) - LongMethod:TriStateListDialog.kt$@SuppressLint("ComposeParameterOrder") @Composable fun <T> TriStateListDialog( title: String, message: String? = null, items: List<T>, initialChecked: List<T>, initialInversed: List<T>, itemLabel: @Composable (T) -> String, onDismissRequest: () -> Unit, onValueChanged: (newIncluded: List<T>, newExcluded: List<T>) -> Unit, ) - LongMethod:WebViewScreenContent.kt$@Composable fun WebViewScreenContent( onNavigateUp: () -> Unit, initialTitle: String?, url: String, onShare: (String) -> Unit, onOpenInBrowser: (String) -> Unit, onClearCookies: (String) -> Unit, headers: Map<String, String> = emptyMap(), onUrlChange: (String) -> Unit = {}, ) - LongMethod:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean - LongParameterList:AnimeCategoryScreen.kt$( categories: List<Category>, lazyListState: LazyListState, paddingValues: PaddingValues, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onMoveUp: (Category) -> Unit, onMoveDown: (Category) -> Unit, ) - LongParameterList:AnimeCategoryScreen.kt$( state: AnimeCategoryScreenState.Success, onClickCreate: () -> Unit, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onClickMoveUp: (Category) -> Unit, onClickMoveDown: (Category) -> Unit, ) - LongParameterList:AnimeCoverDialog.kt$( coverDataProvider: () -> Anime, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) - LongParameterList:AnimeCoverFetcher.kt$AnimeCoverFetcher$( private val url: String?, private val isLibraryAnime: Boolean, private val options: Options, private val coverFileLazy: Lazy<File?>, private val customCoverFileLazy: Lazy<File>, private val diskCacheKeyLazy: Lazy<String>, private val sourceLazy: Lazy<AnimeHttpSource?>, private val callFactoryLazy: Lazy<Call.Factory>, private val diskCacheLazy: Lazy<DiskCache>, ) - LongParameterList:AnimeEpisodeListItem.kt$( action: LibraryPreferences.EpisodeSwipeAction, seen: Boolean, bookmark: Boolean, downloadState: AnimeDownload.State, background: Color, onSwipe: () -> Unit, ) - LongParameterList:AnimeEpisodeListItem.kt$( title: String, date: String?, watchProgress: String?, scanlator: String?, seen: Boolean, bookmark: Boolean, selected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((EpisodeDownloadAction) -> Unit)?, onEpisodeSwipe: (LibraryPreferences.EpisodeSwipeAction) -> Unit, modifier: Modifier = Modifier, ) - LongParameterList:AnimeExtensionDetailsScreen.kt$( contentPadding: PaddingValues, extension: AnimeExtension.Installed, sources: ImmutableList<AnimeExtensionSourceItem>, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) - LongParameterList:AnimeExtensionDetailsScreen.kt$( navigateUp: () -> Unit, state: AnimeExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) - LongParameterList:AnimeExtensionsScreen.kt$( item: AnimeExtensionUiModel.Item, onClickItem: (AnimeExtension) -> Unit, onLongClickItem: (AnimeExtension) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onClickItemAction: (AnimeExtension) -> Unit, modifier: Modifier = Modifier, onClickItemSecondaryAction: (AnimeExtension) -> Unit, ) - LongParameterList:AnimeExtensionsScreen.kt$( state: AnimeExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (AnimeExtension) -> Unit, onOpenWebView: (AnimeExtension.Available) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onInstallExtension: (AnimeExtension.Available) -> Unit, onUninstallExtension: (AnimeExtension) -> Unit, onUpdateExtension: (AnimeExtension.Installed) -> Unit, onTrustExtension: (AnimeExtension.Untrusted) -> Unit, onOpenExtension: (AnimeExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) - LongParameterList:AnimeExtensionsScreen.kt$( state: AnimeExtensionsScreenModel.State, contentPadding: PaddingValues, searchQuery: String?, onLongClickItem: (AnimeExtension) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onOpenWebView: (AnimeExtension.Available) -> Unit, onInstallExtension: (AnimeExtension.Available) -> Unit, onUninstallExtension: (AnimeExtension) -> Unit, onUpdateExtension: (AnimeExtension.Installed) -> Unit, onTrustExtension: (AnimeExtension.Untrusted) -> Unit, onOpenExtension: (AnimeExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, onRefresh: () -> Unit, ) - LongParameterList:AnimeInfoHeader.kt$( appBarPadding: Dp, coverDataProvider: () -> Anime, onCoverClick: () -> Unit, title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, ) - LongParameterList:AnimeInfoHeader.kt$( favorite: Boolean, trackingCount: Int, nextUpdate: Instant?, isUserIntervalMode: Boolean, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, onEditIntervalClicked: (() -> Unit)?, onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) - LongParameterList:AnimeInfoHeader.kt$( isTabletUi: Boolean, appBarPadding: Dp, title: String, author: String?, artist: String?, sourceName: String, isStubSource: Boolean, coverDataProvider: () -> Anime, status: Long, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, modifier: Modifier = Modifier, ) - LongParameterList:AnimeInfoHeader.kt$( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) - LongParameterList:AnimeLibraryComfortableGrid.kt$( items: List<AnimeLibraryItem>, columns: Int, contentPadding: PaddingValues, selection: List<LibraryAnime>, onClick: (LibraryAnime) -> Unit, onLongClick: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) - LongParameterList:AnimeLibraryCompactGrid.kt$( items: List<AnimeLibraryItem>, showTitle: Boolean, columns: Int, contentPadding: PaddingValues, selection: List<LibraryAnime>, onClick: (LibraryAnime) -> Unit, onLongClick: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) - LongParameterList:AnimeLibraryContent.kt$( categories: List<Category>, searchQuery: String?, selection: List<LibraryAnime>, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onAnimeClicked: (Long) -> Unit, onContinueWatchingClicked: ((LibraryAnime) -> Unit)?, onToggleSelection: (LibraryAnime) -> Unit, onToggleRangeSelection: (LibraryAnime) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfAnimeForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getAnimeLibraryForPage: (Int) -> List<AnimeLibraryItem>, ) - LongParameterList:AnimeLibraryList.kt$( items: List<AnimeLibraryItem>, contentPadding: PaddingValues, selection: List<LibraryAnime>, onClick: (LibraryAnime) -> Unit, onLongClick: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) - LongParameterList:AnimeLibraryPager.kt$( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedAnime: List<LibraryAnime>, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<AnimeLibraryItem>, onClickAnime: (LibraryAnime) -> Unit, onLongClickAnime: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, ) - LongParameterList:AnimeRestorer.kt$AnimeRestorer$( anime: Anime, episodes: List<BackupEpisode>, categories: List<Long>, backupCategories: List<BackupCategory>, history: List<BackupAnimeHistory>, tracks: List<BackupAnimeTracking>, ) - LongParameterList:AnimeScreen.kt$( anime: Anime, episodes: List<EpisodeList>, isAnyEpisodeSelected: Boolean, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, ) - LongParameterList:AnimeScreen.kt$( selected: List<EpisodeList.Item>, onEpisodeClicked: (Episode, Boolean) -> Unit, onMultiBookmarkClicked: (List<Episode>, bookmarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<Episode>, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onMultiDeleteClicked: (List<Episode>) -> Unit, fillFraction: Float, alwaysUseExternalPlayer: Boolean, modifier: Modifier = Modifier, ) - LongParameterList:AnimeScreen.kt$( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, onBackClicked: () -> Unit, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Episode>, bookmarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<Episode>, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List<Episode>) -> Unit, // For swipe actions onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongParameterList:AnimeScreen.kt$( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, onBackClicked: () -> Unit, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Episode>, bookmarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<Episode>, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List<Episode>) -> Unit, // For episode swipe onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongParameterList:AnimeScreen.kt$( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, onBackClicked: () -> Unit, onEpisodeClicked: (episode: Episode, alt: Boolean) -> Unit, onDownloadEpisode: ((List<EpisodeList.Item>, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Episode>, bookmarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<Episode>, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List<Episode>) -> Unit, // For episode swipe onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongParameterList:AnimeTrackInfoDialogHome.kt$( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, episodes: String, onEpisodesClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, ) - LongParameterList:AnimeTrackInfoDialogHome.kt$( trackItems: List<AnimeTrackItem>, dateFormat: DateTimeFormatter, onStatusClick: (AnimeTrackItem) -> Unit, onEpisodeClick: (AnimeTrackItem) -> Unit, onScoreClick: (AnimeTrackItem) -> Unit, onStartDateEdit: (AnimeTrackItem) -> Unit, onEndDateEdit: (AnimeTrackItem) -> Unit, onNewSearch: (AnimeTrackItem) -> Unit, onOpenInBrowser: (AnimeTrackItem) -> Unit, onRemoved: (AnimeTrackItem) -> Unit, ) - LongParameterList:AnimeTrackerSearch.kt$( query: TextFieldValue, onQueryChange: (TextFieldValue) -> Unit, onDispatchQuery: () -> Unit, queryResult: Result<List<AnimeTrackSearch>>?, selected: AnimeTrackSearch?, onSelectedChange: (AnimeTrackSearch) -> Unit, onConfirmSelection: () -> Unit, onDismissRequest: () -> Unit, ) - LongParameterList:AnimeUpdatesScreen.kt$( selected: List<AnimeUpdatesItem>, onDownloadEpisode: (List<AnimeUpdatesItem>, EpisodeDownloadAction) -> Unit, onMultiBookmarkClicked: (List<AnimeUpdatesItem>, bookmark: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<AnimeUpdatesItem>, seen: Boolean) -> Unit, onMultiDeleteClicked: (List<AnimeUpdatesItem>) -> Unit, onOpenEpisode: (AnimeUpdatesItem, altPlayer: Boolean) -> Unit, ) - LongParameterList:AnimeUpdatesScreen.kt$( state: AnimeUpdatesScreenModel.State, snackbarHostState: SnackbarHostState, lastUpdated: Long, onClickCover: (AnimeUpdatesItem) -> Unit, onSelectAll: (Boolean) -> Unit, onInvertSelection: () -> Unit, onUpdateLibrary: () -> Boolean, onDownloadEpisode: (List<AnimeUpdatesItem>, EpisodeDownloadAction) -> Unit, onMultiBookmarkClicked: (List<AnimeUpdatesItem>, bookmark: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List<AnimeUpdatesItem>, seen: Boolean) -> Unit, onMultiDeleteClicked: (List<AnimeUpdatesItem>) -> Unit, onUpdateSelected: (AnimeUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onOpenEpisode: (AnimeUpdatesItem, altPlayer: Boolean) -> Unit, ) - LongParameterList:AnimeUpdatesUiItem.kt$( uiModels: List<AnimeUpdatesUiModel>, selectionMode: Boolean, onUpdateSelected: (AnimeUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onClickCover: (AnimeUpdatesItem) -> Unit, onClickUpdate: (AnimeUpdatesItem, altPlayer: Boolean) -> Unit, onDownloadEpisode: (List<AnimeUpdatesItem>, EpisodeDownloadAction) -> Unit, ) - LongParameterList:AnimeUpdatesUiItem.kt$( update: AnimeUpdatesWithRelations, selected: Boolean, watchProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadEpisode: ((EpisodeDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) - LongParameterList:BottomReaderBar.kt$( backgroundColor: Color, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) - LongParameterList:BrowseAnimeSourceScreen.kt$( source: AnimeSource?, animeList: LazyPagingItems<StateFlow<Anime>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalAnimeSourceHelpClick: () -> Unit, onAnimeClick: (Anime) -> Unit, onAnimeLongClick: (Anime) -> Unit, ) - LongParameterList:BrowseAnimeSourceToolbar.kt$( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: AnimeSource?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) - LongParameterList:BrowseMangaSourceScreen.kt$( source: MangaSource?, mangaList: LazyPagingItems<StateFlow<Manga>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalSourceHelpClick: () -> Unit, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) - LongParameterList:BrowseMangaSourceToolbar.kt$( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: MangaSource?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) - LongParameterList:CategoryListItem.kt$( category: Category, canMoveUp: Boolean, canMoveDown: Boolean, onMoveUp: (Category) -> Unit, onMoveDown: (Category) -> Unit, onRename: () -> Unit, onHide: () -> Unit, onDelete: () -> Unit, modifier: Modifier = Modifier, ) - LongParameterList:ChapterNavigator.kt$( isRtl: Boolean, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, ) - LongParameterList:ChapterSettingsDialog.kt$( downloadFilter: TriState, onDownloadFilterChanged: ((TriState) -> Unit)?, unreadFilter: TriState, onUnreadFilterChanged: (TriState) -> Unit, bookmarkedFilter: TriState, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), ) - LongParameterList:ChapterSettingsDialog.kt$( onDismissRequest: () -> Unit, manga: Manga? = null, onDownloadFilterChanged: (TriState) -> Unit, onUnreadFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), onSortModeChanged: (Long) -> Unit, onDisplayModeChanged: (Long) -> Unit, onSetAsDefault: (applyToExistingManga: Boolean) -> Unit, onResetToDefault: () -> Unit, ) - LongParameterList:ChapterTransition.kt$( topLabel: String, topChapter: Chapter?, topChapterDownloaded: Boolean, bottomLabel: String, bottomChapter: Chapter?, bottomChapterDownloaded: Boolean, fallbackLabel: String, chapterGap: Int, ) - LongParameterList:CommonStorageScreenModel.kt$CommonStorageScreenModel$( private val downloadCacheChanges: SharedFlow<Unit>, private val downloadCacheIsInitializing: StateFlow<Boolean>, private val libraries: Flow<List<T>>, private val categories: (Boolean) -> Flow<List<Category>>, private val getDownloadSize: T.() -> Long, private val getDownloadCount: T.() -> Int, private val getId: T.() -> Long, private val getCategoryId: T.() -> Long, private val getTitle: T.() -> String, private val getThumbnail: T.() -> String?, private val libraryPreferences: LibraryPreferences = Injekt.get(), ) - LongParameterList:EntryBottomActionMenu.kt$( visible: Boolean, onChangeCategoryClicked: () -> Unit, onMarkAsViewedClicked: () -> Unit, onMarkAsUnviewedClicked: () -> Unit, onDownloadClicked: ((DownloadAction) -> Unit)?, onDeleteClicked: () -> Unit, isManga: Boolean, modifier: Modifier = Modifier, ) - LongParameterList:EntryToolbar.kt$( title: String, titleAlphaProvider: () -> Float, hasFilters: Boolean, onBackClicked: () -> Unit, onClickFilter: () -> Unit, onClickShare: (() -> Unit)?, onClickDownload: ((DownloadAction) -> Unit)?, onClickEditCategory: (() -> Unit)?, onClickRefresh: () -> Unit, onClickMigrate: (() -> Unit)?, onClickSettings: (() -> Unit)?, // Anime only changeAnimeSkipIntro: (() -> Unit)?, // For action mode actionModeCounter: Int, onSelectAll: () -> Unit, onInvertSelection: () -> Unit, isManga: Boolean, modifier: Modifier = Modifier, backgroundAlphaProvider: () -> Float = titleAlphaProvider, ) - LongParameterList:EpisodeListDialog.kt$( displayMode: Long, currentEpisodeIndex: Int, episodeList: List<Episode>, dateRelativeTime: Boolean, dateFormat: DateTimeFormatter, onBookmarkClicked: (Long?, Boolean) -> Unit, onEpisodeClicked: (Long?) -> Unit, onDismissRequest: () -> Unit, ) - LongParameterList:EpisodeListDialog.kt$( episode: Episode, isCurrentEpisode: Boolean, title: String, date: String?, onBookmarkClicked: (Long?, Boolean) -> Unit, onEpisodeClicked: (Long?) -> Unit, ) - LongParameterList:EpisodeSettingsDialog.kt$( downloadFilter: TriState, onDownloadFilterChanged: ((TriState) -> Unit)?, unseenFilter: TriState, onUnseenFilterChanged: (TriState) -> Unit, bookmarkedFilter: TriState, onBookmarkedFilterChanged: (TriState) -> Unit, ) - LongParameterList:EpisodeSettingsDialog.kt$( onDismissRequest: () -> Unit, anime: Anime? = null, onDownloadFilterChanged: (TriState) -> Unit, onUnseenFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, onSortModeChanged: (Long) -> Unit, onDisplayModeChanged: (Long) -> Unit, onSetAsDefault: (applyToExistingAnime: Boolean) -> Unit, ) - LongParameterList:GlobalAnimeSearchScreen.kt$( items: Map<AnimeCatalogueSource, AnimeSearchItemResult>, contentPadding: PaddingValues, getAnime: @Composable (Anime) -> State<Anime>, onClickSource: (AnimeCatalogueSource) -> Unit, onClickItem: (Anime) -> Unit, onLongClickItem: (Anime) -> Unit, fromSourceId: Long? = null, ) - LongParameterList:GlobalAnimeSearchScreen.kt$( state: AnimeSearchScreenModel.State, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (AnimeSourceFilter) -> Unit, onToggleResults: () -> Unit, getAnime: @Composable (Anime) -> State<Anime>, onClickSource: (AnimeCatalogueSource) -> Unit, onClickItem: (Anime) -> Unit, onLongClickItem: (Anime) -> Unit, ) - LongParameterList:GlobalAnimeSearchToolbar.kt$( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: AnimeSourceFilter, onChangeSearchFilter: (AnimeSourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) - LongParameterList:GlobalMangaSearchScreen.kt$( items: Map<CatalogueSource, MangaSearchItemResult>, contentPadding: PaddingValues, getManga: @Composable (Manga) -> State<Manga>, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, fromSourceId: Long? = null, ) - LongParameterList:GlobalMangaSearchScreen.kt$( state: MangaSearchScreenModel.State, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (MangaSourceFilter) -> Unit, onToggleResults: () -> Unit, getManga: @Composable (Manga) -> State<Manga>, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, ) - LongParameterList:GlobalMangaSearchToolbar.kt$( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: MangaSourceFilter, onChangeSearchFilter: (MangaSourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) - LongParameterList:LibraryToolbar.kt$( hasActiveFilters: Boolean, selectedCount: Int, title: LibraryToolbarTitle, onClickUnselectAll: () -> Unit, onClickSelectAll: () -> Unit, onClickInvertSelection: () -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, onClickGlobalUpdate: () -> Unit, onClickOpenRandomEntry: () -> Unit, searchQuery: String?, onSearchQueryChange: (String?) -> Unit, scrollBehavior: TopAppBarScrollBehavior?, navigateUp: (() -> Unit)? = null, ) - LongParameterList:LibraryToolbar.kt$( title: LibraryToolbarTitle, hasFilters: Boolean, searchQuery: String?, onSearchQueryChange: (String?) -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, onClickGlobalUpdate: () -> Unit, onClickOpenRandomEntry: () -> Unit, scrollBehavior: TopAppBarScrollBehavior?, navigateUp: (() -> Unit)?, ) - LongParameterList:ListPreferenceWidget.kt$( value: T, title: String, subtitle: String?, icon: ImageVector?, entries: Map<out T, String>, onValueChange: (T) -> Unit, ) - LongParameterList:MangaCategoryScreen.kt$( categories: List<Category>, lazyListState: LazyListState, paddingValues: PaddingValues, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onMoveUp: (Category) -> Unit, onMoveDown: (Category) -> Unit, ) - LongParameterList:MangaCategoryScreen.kt$( state: MangaCategoryScreenState.Success, onClickCreate: () -> Unit, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onClickMoveUp: (Category) -> Unit, onClickMoveDown: (Category) -> Unit, ) - LongParameterList:MangaChapterListItem.kt$( action: LibraryPreferences.ChapterSwipeAction, read: Boolean, bookmark: Boolean, downloadState: MangaDownload.State, background: Color, onSwipe: () -> Unit, ) - LongParameterList:MangaChapterListItem.kt$( title: String, date: String?, readProgress: String?, scanlator: String?, read: Boolean, bookmark: Boolean, selected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> MangaDownload.State, downloadProgressProvider: () -> Int, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((ChapterDownloadAction) -> Unit)?, onChapterSwipe: (LibraryPreferences.ChapterSwipeAction) -> Unit, modifier: Modifier = Modifier, ) - LongParameterList:MangaCoverDialog.kt$( coverDataProvider: () -> Manga, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) - LongParameterList:MangaCoverFetcher.kt$MangaCoverFetcher$( private val url: String?, private val isLibraryManga: Boolean, private val options: Options, private val coverFileLazy: Lazy<File?>, private val customCoverFileLazy: Lazy<File>, private val diskCacheKeyLazy: Lazy<String>, private val sourceLazy: Lazy<HttpSource?>, private val callFactoryLazy: Lazy<Call.Factory>, private val diskCacheLazy: Lazy<DiskCache>, ) - LongParameterList:MangaExtensionDetailsScreen.kt$( contentPadding: PaddingValues, extension: MangaExtension.Installed, sources: ImmutableList<MangaExtensionSourceItem>, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) - LongParameterList:MangaExtensionDetailsScreen.kt$( navigateUp: () -> Unit, state: MangaExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) - LongParameterList:MangaExtensionsScreen.kt$( item: MangaExtensionUiModel.Item, onClickItem: (MangaExtension) -> Unit, onLongClickItem: (MangaExtension) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onClickItemAction: (MangaExtension) -> Unit, onClickItemSecondaryAction: (MangaExtension) -> Unit, modifier: Modifier = Modifier, ) - LongParameterList:MangaExtensionsScreen.kt$( state: MangaExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (MangaExtension) -> Unit, onOpenWebView: (MangaExtension.Available) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onInstallExtension: (MangaExtension.Available) -> Unit, onUninstallExtension: (MangaExtension) -> Unit, onUpdateExtension: (MangaExtension.Installed) -> Unit, onTrustExtension: (MangaExtension.Untrusted) -> Unit, onOpenExtension: (MangaExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) - LongParameterList:MangaExtensionsScreen.kt$( state: MangaExtensionsScreenModel.State, contentPadding: PaddingValues, searchQuery: String?, onLongClickItem: (MangaExtension) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onOpenWebView: (MangaExtension.Available) -> Unit, onInstallExtension: (MangaExtension.Available) -> Unit, onUninstallExtension: (MangaExtension) -> Unit, onUpdateExtension: (MangaExtension.Installed) -> Unit, onTrustExtension: (MangaExtension.Untrusted) -> Unit, onOpenExtension: (MangaExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, onRefresh: () -> Unit, ) - LongParameterList:MangaInfoHeader.kt$( appBarPadding: Dp, coverDataProvider: () -> Manga, onCoverClick: () -> Unit, title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, ) - LongParameterList:MangaInfoHeader.kt$( favorite: Boolean, trackingCount: Int, nextUpdate: Instant?, isUserIntervalMode: Boolean, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, onEditIntervalClicked: (() -> Unit)?, onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) - LongParameterList:MangaInfoHeader.kt$( isTabletUi: Boolean, appBarPadding: Dp, title: String, author: String?, artist: String?, sourceName: String, isStubSource: Boolean, coverDataProvider: () -> Manga, status: Long, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, modifier: Modifier = Modifier, ) - LongParameterList:MangaInfoHeader.kt$( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) - LongParameterList:MangaLibraryComfortableGrid.kt$( items: List<MangaLibraryItem>, columns: Int, contentPadding: PaddingValues, selection: List<LibraryManga>, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) - LongParameterList:MangaLibraryCompactGrid.kt$( items: List<MangaLibraryItem>, showTitle: Boolean, columns: Int, contentPadding: PaddingValues, selection: List<LibraryManga>, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) - LongParameterList:MangaLibraryContent.kt$( categories: List<Category>, searchQuery: String?, selection: List<LibraryManga>, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onMangaClicked: (Long) -> Unit, onContinueReadingClicked: ((LibraryManga) -> Unit)?, onToggleSelection: (LibraryManga) -> Unit, onToggleRangeSelection: (LibraryManga) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfMangaForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<MangaLibraryItem>, ) - LongParameterList:MangaLibraryList.kt$( items: List<MangaLibraryItem>, contentPadding: PaddingValues, selection: List<LibraryManga>, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) - LongParameterList:MangaLibraryPager.kt$( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedManga: List<LibraryManga>, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<MangaLibraryItem>, onClickManga: (LibraryManga) -> Unit, onLongClickManga: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, ) - LongParameterList:MangaRestorer.kt$MangaRestorer$( manga: Manga, chapters: List<BackupChapter>, categories: List<Long>, backupCategories: List<BackupCategory>, history: List<BackupHistory>, tracks: List<BackupTracking>, excludedScanlators: List<String>, ) - LongParameterList:MangaScreen.kt$( manga: Manga, chapters: List<ChapterList>, isAnyChapterSelected: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, ) - LongParameterList:MangaScreen.kt$( selected: List<ChapterList.Item>, onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onMultiDeleteClicked: (List<Chapter>) -> Unit, fillFraction: Float, modifier: Modifier = Modifier, ) - LongParameterList:MangaScreen.kt$( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For swipe actions onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongParameterList:MangaScreen.kt$( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongParameterList:MangaScreen.kt$( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) - LongParameterList:MangaTrackInfoDialogHome.kt$( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, chapters: String, onChaptersClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, ) - LongParameterList:MangaTrackInfoDialogHome.kt$( trackItems: List<MangaTrackItem>, dateFormat: DateTimeFormatter, onStatusClick: (MangaTrackItem) -> Unit, onChapterClick: (MangaTrackItem) -> Unit, onScoreClick: (MangaTrackItem) -> Unit, onStartDateEdit: (MangaTrackItem) -> Unit, onEndDateEdit: (MangaTrackItem) -> Unit, onNewSearch: (MangaTrackItem) -> Unit, onOpenInBrowser: (MangaTrackItem) -> Unit, onRemoved: (MangaTrackItem) -> Unit, ) - LongParameterList:MangaTrackerSearch.kt$( query: TextFieldValue, onQueryChange: (TextFieldValue) -> Unit, onDispatchQuery: () -> Unit, queryResult: Result<List<MangaTrackSearch>>?, selected: MangaTrackSearch?, onSelectedChange: (MangaTrackSearch) -> Unit, onConfirmSelection: () -> Unit, onDismissRequest: () -> Unit, ) - LongParameterList:MangaUpdatesScreen.kt$( state: MangaUpdatesScreenModel.State, snackbarHostState: SnackbarHostState, lastUpdated: Long, onClickCover: (MangaUpdatesItem) -> Unit, onSelectAll: (Boolean) -> Unit, onInvertSelection: () -> Unit, onUpdateLibrary: () -> Boolean, onDownloadChapter: (List<MangaUpdatesItem>, ChapterDownloadAction) -> Unit, onMultiBookmarkClicked: (List<MangaUpdatesItem>, bookmark: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<MangaUpdatesItem>, read: Boolean) -> Unit, onMultiDeleteClicked: (List<MangaUpdatesItem>) -> Unit, onUpdateSelected: (MangaUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onOpenChapter: (MangaUpdatesItem) -> Unit, ) - LongParameterList:MangaUpdatesUiItem.kt$( uiModels: List<MangaUpdatesUiModel>, selectionMode: Boolean, onUpdateSelected: (MangaUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onClickCover: (MangaUpdatesItem) -> Unit, onClickUpdate: (MangaUpdatesItem) -> Unit, onDownloadChapter: (List<MangaUpdatesItem>, ChapterDownloadAction) -> Unit, ) - LongParameterList:MangaUpdatesUiItem.kt$( update: MangaUpdatesWithRelations, selected: Boolean, readProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadChapter: ((ChapterDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> MangaDownload.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) - LongParameterList:MigrateAnimeDialog.kt$( oldAnime: Anime, newAnime: Anime, screenModel: MigrateAnimeDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, ) - LongParameterList:MigrateAnimeDialog.kt$MigrateAnimeDialogScreenModel$( oldSource: AnimeSource?, newSource: AnimeSource, oldAnime: Anime, newAnime: Anime, sourceEpisodes: List<SEpisode>, replace: Boolean, flags: Int, ) - LongParameterList:MigrateAnimeSearchScreen.kt$( state: AnimeSearchScreenModel.State, fromSourceId: Long?, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (AnimeSourceFilter) -> Unit, onToggleResults: () -> Unit, getAnime: @Composable (Anime) -> State<Anime>, onClickSource: (AnimeCatalogueSource) -> Unit, onClickItem: (Anime) -> Unit, onLongClickItem: (Anime) -> Unit, ) - LongParameterList:MigrateAnimeSourceScreen.kt$( list: ImmutableList<Pair<AnimeSource, Long>>, contentPadding: PaddingValues, onClickItem: (AnimeSource) -> Unit, onLongClickItem: (AnimeSource) -> Unit, sortingMode: SetMigrateSorting.Mode, onToggleSortingMode: () -> Unit, sortingDirection: SetMigrateSorting.Direction, onToggleSortingDirection: () -> Unit, ) - LongParameterList:MigrateMangaDialog.kt$( oldManga: Manga, newManga: Manga, screenModel: MigrateMangaDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, ) - LongParameterList:MigrateMangaDialog.kt$MigrateMangaDialogScreenModel$( oldSource: MangaSource?, newSource: MangaSource, oldManga: Manga, newManga: Manga, sourceChapters: List<SChapter>, replace: Boolean, flags: Int, ) - LongParameterList:MigrateMangaSearchScreen.kt$( state: MangaSearchScreenModel.State, fromSourceId: Long?, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (MangaSourceFilter) -> Unit, onToggleResults: () -> Unit, getManga: @Composable (Manga) -> State<Manga>, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, ) - LongParameterList:MigrateMangaSourceScreen.kt$( list: ImmutableList<Pair<Source, Long>>, contentPadding: PaddingValues, onClickItem: (Source) -> Unit, onLongClickItem: (Source) -> Unit, sortingMode: SetMigrateSorting.Mode, onToggleSortingMode: () -> Unit, sortingDirection: SetMigrateSorting.Direction, onToggleSortingDirection: () -> Unit, ) - LongParameterList:Migrations.kt$Migrations$( context: Context, preferenceStore: PreferenceStore, basePreferences: BasePreferences, uiPreferences: UiPreferences, networkPreferences: NetworkPreferences, sourcePreferences: SourcePreferences, securityPreferences: SecurityPreferences, libraryPreferences: LibraryPreferences, readerPreferences: ReaderPreferences, playerPreferences: PlayerPreferences, backupPreferences: BackupPreferences, trackerManager: TrackerManager, ) - LongParameterList:MoreScreen.kt$( downloadQueueStateProvider: () -> DownloadQueueState, downloadedOnly: Boolean, onDownloadedOnlyChange: (Boolean) -> Unit, incognitoMode: Boolean, onIncognitoModeChange: (Boolean) -> Unit, isFDroid: Boolean, navStyle: NavStyle, onClickAlt: () -> Unit, onClickDownloadQueue: () -> Unit, onClickCategories: () -> Unit, onClickStats: () -> Unit, onClickStorage: () -> Unit, onClickDataAndStorage: () -> Unit, onClickSettings: () -> Unit, onClickAbout: () -> Unit, ) - LongParameterList:PictureInPictureHandler.kt$PictureInPictureHandler$( context: Context, title: String, subtitle: String, paused: Boolean, replaceWithPrevious: Boolean, pipOnExit: Boolean, videoAspect: Double, playlistCount: Int, playlistPosition: Int, ) - LongParameterList:ReaderAppBars.kt$( visible: Boolean, fullscreen: Boolean, mangaTitle: String?, chapterTitle: String?, navigateUp: () -> Unit, onClickTopAppBar: () -> Unit, bookmarked: Boolean, onToggleBookmarked: () -> Unit, onOpenInWebView: (() -> Unit)?, onShare: (() -> Unit)?, viewer: Viewer?, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) - LongParameterList:ScreenshotOptionsSheet.kt$( screenModel: PlayerSettingsScreenModel, cachePath: String, onSetAsCover: (() -> InputStream) -> Unit, onShare: (() -> InputStream) -> Unit, onSave: (() -> InputStream) -> Unit, onDismissRequest: () -> Unit, ) - LongParameterList:StreamsCatalogSheet.kt$( isEpisodeOnline: Boolean?, videoStreams: PlayerViewModel.VideoStreams, openContentFd: (Uri) -> String?, onQualitySelected: (Int) -> Unit, onSubtitleSelected: (Int) -> Unit, onAudioSelected: (Int) -> Unit, onSettingsClicked: () -> Unit, onDismissRequest: () -> Unit, ) - LongParameterList:SubtitleSettingsSheet.kt$( font: String, isBold: Boolean, isItalic: Boolean, textColor: Color, borderColor: Color, backgroundColor: Color, ) - LongParameterList:SyncChaptersWithSource.kt$SyncChaptersWithSource$( private val downloadManager: MangaDownloadManager, private val downloadProvider: MangaDownloadProvider, private val chapterRepository: ChapterRepository, private val shouldUpdateDbChapter: ShouldUpdateDbChapter, private val updateManga: UpdateManga, private val updateChapter: UpdateChapter, private val getChaptersByMangaId: GetChaptersByMangaId, private val getExcludedScanlators: GetExcludedScanlators, ) - LongParameterList:SyncEpisodesWithSource.kt$SyncEpisodesWithSource$( private val downloadManager: AnimeDownloadManager, private val downloadProvider: AnimeDownloadProvider, private val episodeRepository: EpisodeRepository, private val shouldUpdateDbEpisode: ShouldUpdateDbEpisode, private val updateAnime: UpdateAnime, private val updateEpisode: UpdateEpisode, private val getEpisodesByAnimeId: GetEpisodesByAnimeId, ) - LongParameterList:TrackInfoDialogSelector.kt$( selection: Int, onSelectionChange: (Int) -> Unit, range: Iterable<Int>, onConfirm: () -> Unit, onDismissRequest: () -> Unit, isManga: Boolean, ) - LongParameterList:TrackInfoDialogSelector.kt$( title: String, initialSelectedDateMillis: Long, selectableDates: SelectableDates, onConfirm: (Long) -> Unit, onRemove: (() -> Unit)?, onDismissRequest: () -> Unit, ) - LongParameterList:TriStateListDialog.kt$( title: String, message: String? = null, items: List<T>, initialChecked: List<T>, initialInversed: List<T>, itemLabel: @Composable (T) -> String, onDismissRequest: () -> Unit, onValueChanged: (newIncluded: List<T>, newExcluded: List<T>) -> Unit, ) - LongParameterList:WebViewScreenContent.kt$( onNavigateUp: () -> Unit, initialTitle: String?, url: String, onShare: (String) -> Unit, onOpenInBrowser: (String) -> Unit, onClearCookies: (String) -> Unit, headers: Map<String, String> = emptyMap(), onUrlChange: (String) -> Unit = {}, ) - LongParameterList:WebtoonRecyclerView.kt$WebtoonRecyclerView$( fromRate: Float, toRate: Float, fromX: Float, toX: Float, fromY: Float, toY: Float, ) - LoopWithTooManyJumpStatements:AnimeDownloadStore.kt$AnimeDownloadStore$for - LoopWithTooManyJumpStatements:AnimeUpdatesScreenModel.kt$AnimeUpdatesScreenModel$for - LoopWithTooManyJumpStatements:Kavita.kt$Kavita$for - LoopWithTooManyJumpStatements:MangaDownloadStore.kt$MangaDownloadStore$for - LoopWithTooManyJumpStatements:MangaUpdatesScreenModel.kt$MangaUpdatesScreenModel$for - LoopWithTooManyJumpStatements:PlayerActivity.kt$PlayerActivity$for - MagicNumber:AdaptiveSheet.kt$220 - MagicNumber:AdaptiveSheet.kt$90 - MagicNumber:AniChartApi.kt$AniChartApi$1000 - MagicNumber:AniSkipApi.kt$AniSkipApi.PlayerUtils$0.15f - MagicNumber:AniSkipApi.kt$AniSkipApi.PlayerUtils$100 - MagicNumber:AniSkipApi.kt$AniSkipApi.PlayerUtils$500 - MagicNumber:Anilist.kt$Anilist$10 - MagicNumber:Anilist.kt$Anilist$10.0 - MagicNumber:Anilist.kt$Anilist$100 - MagicNumber:Anilist.kt$Anilist$10f - MagicNumber:Anilist.kt$Anilist$18 - MagicNumber:Anilist.kt$Anilist$20 - MagicNumber:Anilist.kt$Anilist$20.0 - MagicNumber:Anilist.kt$Anilist$25 - MagicNumber:Anilist.kt$Anilist$25.0 - MagicNumber:Anilist.kt$Anilist$35 - MagicNumber:Anilist.kt$Anilist$5 - MagicNumber:Anilist.kt$Anilist$60 - MagicNumber:AnilistApi.kt$AnilistApi$31536000000 - MagicNumber:AnilistModels.kt$10 - MagicNumber:AnilistModels.kt$30 - MagicNumber:AnilistModels.kt$35 - MagicNumber:AnilistModels.kt$50 - MagicNumber:AnilistModels.kt$60 - MagicNumber:AnilistModels.kt$70 - MagicNumber:AnilistModels.kt$90 - MagicNumber:AnimeDownload.kt$AnimeDownload$100 - MagicNumber:AnimeDownload.kt$AnimeDownload.State.DOWNLOADED$3 - MagicNumber:AnimeDownload.kt$AnimeDownload.State.ERROR$4 - MagicNumber:AnimeDownloadHolder.kt$AnimeDownloadHolder$100 - MagicNumber:AnimeDownloadNotifier.kt$AnimeDownloadNotifier$100 - MagicNumber:AnimeDownloadNotifier.kt$AnimeDownloadNotifier$15 - MagicNumber:AnimeDownloadNotifier.kt$AnimeDownloadNotifier$30 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$1.01F - MagicNumber:AnimeDownloader.kt$AnimeDownloader$10 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$100 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$100.0 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$1000L - MagicNumber:AnimeDownloader.kt$AnimeDownloader$1024 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$10L - MagicNumber:AnimeDownloader.kt$AnimeDownloader$3 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$3600 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$3600000L - MagicNumber:AnimeDownloader.kt$AnimeDownloader$4 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$50 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$60 - MagicNumber:AnimeDownloader.kt$AnimeDownloader$60000L - MagicNumber:AnimeExtensionDetailsScreen.kt$1.5f - MagicNumber:AnimeExtensionInstallService.kt$AnimeExtensionInstallService$100 - MagicNumber:AnimeInfoHeader.kt$0.2f - MagicNumber:AnimeInfoHeader.kt$0.65f - MagicNumber:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$10 - MagicNumber:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$25 - MagicNumber:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$5 - MagicNumber:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$5 - MagicNumber:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob.Companion$10 - MagicNumber:AnimeLibraryUpdateNotifier.kt$AnimeLibraryUpdateNotifier$40 - MagicNumber:AnimeMetadataUpdateJob.kt$AnimeMetadataUpdateJob$5 - MagicNumber:AnimeScreen.kt$1000L - MagicNumber:AnimeScreen.kt$3600000L - MagicNumber:AnimeScreenModel.kt$AnimeScreenModel$10 - MagicNumber:AnimeScreenModel.kt$AnimeScreenModel$103 - MagicNumber:AnimeScreenModel.kt$AnimeScreenModel$25 - MagicNumber:AnimeScreenModel.kt$AnimeScreenModel$5 - MagicNumber:AnimeTrackInfoDialog.kt$TrackEpisodeSelectorScreen.Model$10000 - MagicNumber:AnimeTrackerSearchPreviewProvider.kt$AnimeTrackerSearchPreviewProvider$10 - MagicNumber:AnimeTrackerSearchPreviewProvider.kt$AnimeTrackerSearchPreviewProvider$100 - MagicNumber:AnimeTrackerSearchPreviewProvider.kt$AnimeTrackerSearchPreviewProvider$1000L - MagicNumber:AnimeTrackerSearchPreviewProvider.kt$AnimeTrackerSearchPreviewProvider$100L - MagicNumber:AnimeTrackerSearchPreviewProvider.kt$AnimeTrackerSearchPreviewProvider$30 - MagicNumber:AnimeTrackerSearchPreviewProvider.kt$AnimeTrackerSearchPreviewProvider$365 - MagicNumber:AnimeTrackerSearchPreviewProvider.kt$AnimeTrackerSearchPreviewProvider$40 - MagicNumber:AnimeUpdatesScreenModel.kt$AnimeUpdatesScreenModel$3 - MagicNumber:AnimeUpdatesUiItem.kt$3600000L - MagicNumber:App.kt$App$300 - MagicNumber:App.kt$App$8 - MagicNumber:AppBar.kt$0.08f - MagicNumber:AppBar.kt$0.12f - MagicNumber:AppThemePreferenceWidget.kt$0.3f - MagicNumber:AppThemePreferenceWidget.kt$0.5f - MagicNumber:AppThemePreferenceWidget.kt$0.6f - MagicNumber:AppThemePreferenceWidget.kt$0.7f - MagicNumber:AppThemePreferenceWidget.kt$0.8f - MagicNumber:AppThemePreferenceWidget.kt$16f - MagicNumber:AppThemePreferenceWidget.kt$9f - MagicNumber:AppUpdateDownloadJob.kt$AppUpdateDownloadJob.<no name provided>$100 - MagicNumber:AppUpdateDownloadJob.kt$AppUpdateDownloadJob.<no name provided>$200 - MagicNumber:AppUpdateNotifier.kt$AppUpdateNotifier$100 - MagicNumber:Backup.kt$Backup$100 - MagicNumber:Backup.kt$Backup$101 - MagicNumber:Backup.kt$Backup$102 - MagicNumber:Backup.kt$Backup$103 - MagicNumber:Backup.kt$Backup$104 - MagicNumber:Backup.kt$Backup$105 - MagicNumber:Backup.kt$Backup$106 - MagicNumber:Backup.kt$Backup$3 - MagicNumber:Backup.kt$Backup$4 - MagicNumber:BackupAnime.kt$BackupAnime$100 - MagicNumber:BackupAnime.kt$BackupAnime$101 - MagicNumber:BackupAnime.kt$BackupAnime$102 - MagicNumber:BackupAnime.kt$BackupAnime$103 - MagicNumber:BackupAnime.kt$BackupAnime$104 - MagicNumber:BackupAnime.kt$BackupAnime$105 - MagicNumber:BackupAnime.kt$BackupAnime$106 - MagicNumber:BackupAnime.kt$BackupAnime$107 - MagicNumber:BackupAnime.kt$BackupAnime$13 - MagicNumber:BackupAnime.kt$BackupAnime$16 - MagicNumber:BackupAnime.kt$BackupAnime$17 - MagicNumber:BackupAnime.kt$BackupAnime$18 - MagicNumber:BackupAnime.kt$BackupAnime$3 - MagicNumber:BackupAnime.kt$BackupAnime$4 - MagicNumber:BackupAnime.kt$BackupAnime$5 - MagicNumber:BackupAnime.kt$BackupAnime$6 - MagicNumber:BackupAnime.kt$BackupAnime$7 - MagicNumber:BackupAnime.kt$BackupAnime$8 - MagicNumber:BackupAnime.kt$BackupAnime$9 - MagicNumber:BackupAnimeHistory.kt$BackupAnimeHistory$3 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$10 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$100 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$11 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$3 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$4 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$5 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$6 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$7 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$8 - MagicNumber:BackupAnimeTracking.kt$BackupAnimeTracking$9 - MagicNumber:BackupCategory.kt$BackupCategory$100 - MagicNumber:BackupChapter.kt$BackupChapter$10 - MagicNumber:BackupChapter.kt$BackupChapter$11 - MagicNumber:BackupChapter.kt$BackupChapter$3 - MagicNumber:BackupChapter.kt$BackupChapter$4 - MagicNumber:BackupChapter.kt$BackupChapter$5 - MagicNumber:BackupChapter.kt$BackupChapter$6 - MagicNumber:BackupChapter.kt$BackupChapter$7 - MagicNumber:BackupChapter.kt$BackupChapter$8 - MagicNumber:BackupChapter.kt$BackupChapter$9 - MagicNumber:BackupCreateJob.kt$BackupCreateJob.Companion$10 - MagicNumber:BackupDecoder.kt$BackupDecoder$0x1f8b - MagicNumber:BackupEpisode.kt$BackupEpisode$10 - MagicNumber:BackupEpisode.kt$BackupEpisode$11 - MagicNumber:BackupEpisode.kt$BackupEpisode$16 - MagicNumber:BackupEpisode.kt$BackupEpisode$3 - MagicNumber:BackupEpisode.kt$BackupEpisode$4 - MagicNumber:BackupEpisode.kt$BackupEpisode$5 - MagicNumber:BackupEpisode.kt$BackupEpisode$6 - MagicNumber:BackupEpisode.kt$BackupEpisode$7 - MagicNumber:BackupEpisode.kt$BackupEpisode$8 - MagicNumber:BackupEpisode.kt$BackupEpisode$9 - MagicNumber:BackupHistory.kt$BackupHistory$3 - MagicNumber:BackupManga.kt$BackupManga$100 - MagicNumber:BackupManga.kt$BackupManga$101 - MagicNumber:BackupManga.kt$BackupManga$102 - MagicNumber:BackupManga.kt$BackupManga$103 - MagicNumber:BackupManga.kt$BackupManga$104 - MagicNumber:BackupManga.kt$BackupManga$105 - MagicNumber:BackupManga.kt$BackupManga$106 - MagicNumber:BackupManga.kt$BackupManga$107 - MagicNumber:BackupManga.kt$BackupManga$108 - MagicNumber:BackupManga.kt$BackupManga$13 - MagicNumber:BackupManga.kt$BackupManga$14 - MagicNumber:BackupManga.kt$BackupManga$16 - MagicNumber:BackupManga.kt$BackupManga$17 - MagicNumber:BackupManga.kt$BackupManga$18 - MagicNumber:BackupManga.kt$BackupManga$3 - MagicNumber:BackupManga.kt$BackupManga$4 - MagicNumber:BackupManga.kt$BackupManga$5 - MagicNumber:BackupManga.kt$BackupManga$6 - MagicNumber:BackupManga.kt$BackupManga$7 - MagicNumber:BackupManga.kt$BackupManga$8 - MagicNumber:BackupManga.kt$BackupManga$9 - MagicNumber:BackupTracking.kt$BackupTracking$10 - MagicNumber:BackupTracking.kt$BackupTracking$100 - MagicNumber:BackupTracking.kt$BackupTracking$11 - MagicNumber:BackupTracking.kt$BackupTracking$3 - MagicNumber:BackupTracking.kt$BackupTracking$4 - MagicNumber:BackupTracking.kt$BackupTracking$5 - MagicNumber:BackupTracking.kt$BackupTracking$6 - MagicNumber:BackupTracking.kt$BackupTracking$7 - MagicNumber:BackupTracking.kt$BackupTracking$8 - MagicNumber:BackupTracking.kt$BackupTracking$9 - MagicNumber:Bangumi.kt$Bangumi$145 - MagicNumber:Bangumi.kt$Bangumi$153 - MagicNumber:Bangumi.kt$Bangumi$240 - MagicNumber:BangumiInterceptor.kt$BangumiInterceptor$1000 - MagicNumber:BangumiModels.kt$1000 - MagicNumber:BangumiModels.kt$3600 - MagicNumber:BangumiModels.kt$OAuth$1000 - MagicNumber:BasePreferenceWidget.kt$200 - MagicNumber:BrowseAnimeIcons.kt$0x1F888888 - MagicNumber:BrowseMangaIcons.kt$0x1F888888 - MagicNumber:ChapterDownloadIndicator.kt$0.5f - MagicNumber:ColorFilterPage.kt$16 - MagicNumber:ColorFilterPage.kt$24 - MagicNumber:ColorFilterPage.kt$8 - MagicNumber:CommonEntryItem.kt$0.33f - MagicNumber:CommonEntryItem.kt$0xAA000000 - MagicNumber:CommonStorageScreenModel.kt$CommonStorageScreenModel$255 - MagicNumber:ContextExtensions.kt$3 - MagicNumber:ContextExtensions.kt$50 - MagicNumber:CumulativeStorage.kt$180f - MagicNumber:CumulativeStorage.kt$4 - MagicNumber:CurrentChapter.kt$CurrentChapter$25 - MagicNumber:DateExtensions.kt$7 - MagicNumber:DelayedAnimeTrackingUpdateJob.kt$DelayedAnimeTrackingUpdateJob$3 - MagicNumber:DelayedMangaTrackingUpdateJob.kt$DelayedMangaTrackingUpdateJob$3 - MagicNumber:DelayedMangaTrackingUpdateJob.kt$DelayedMangaTrackingUpdateJob.Companion$5 - MagicNumber:DoubleTapSecondsView.kt$DoubleTapSecondsView.CustomValueAnimator$5 - MagicNumber:DownloadsTab.kt$DownloadsTab$0.08f - MagicNumber:DownloadsTab.kt$DownloadsTab$0.12f - MagicNumber:DropdownMenu.kt$56 - MagicNumber:EntryBottomActionMenu.kt$3 - MagicNumber:EntryBottomActionMenu.kt$4 - MagicNumber:EntryBottomActionMenu.kt$5 - MagicNumber:EntryBottomActionMenu.kt$6 - MagicNumber:EntryBottomActionMenu.kt$7 - MagicNumber:EntryBottomActionMenu.kt$8 - MagicNumber:EntryBottomActionMenu.kt$9 - MagicNumber:EntryDownloadDropdownMenu.kt$10 - MagicNumber:EntryDownloadDropdownMenu.kt$25 - MagicNumber:EntryDownloadDropdownMenu.kt$5 - MagicNumber:EpisodeDownloadIndicator.kt$0.5f - MagicNumber:GestureHandler.kt$GestureHandler$0.05F - MagicNumber:GestureHandler.kt$GestureHandler$0.4F - MagicNumber:GestureHandler.kt$GestureHandler$0.6F - MagicNumber:GestureHandler.kt$GestureHandler$0.95F - MagicNumber:GestureHandler.kt$GestureHandler$1.5F - MagicNumber:GestureHandler.kt$GestureHandler$150F - MagicNumber:GlobalSearchItem.kt$99f - MagicNumber:ItemCover.kt$ItemCover.Book$3f - MagicNumber:Jellyfin.kt$Jellyfin$11 - MagicNumber:Jellyfin.kt$Jellyfin$37 - MagicNumber:JellyfinApi.kt$JellyfinApi$0.001 - MagicNumber:JellyfinApi.kt$JellyfinApi$3 - MagicNumber:Kavita.kt$Kavita$0xff - MagicNumber:Kavita.kt$Kavita$148 - MagicNumber:Kavita.kt$Kavita$198 - MagicNumber:Kavita.kt$Kavita$3 - MagicNumber:Kavita.kt$Kavita$7 - MagicNumber:Kavita.kt$Kavita$74 - MagicNumber:Kavita.kt$Kavita$8 - MagicNumber:KavitaApi.kt$KavitaApi$200 - MagicNumber:KavitaApi.kt$KavitaApi$204 - MagicNumber:KavitaApi.kt$KavitaApi$401 - MagicNumber:KavitaApi.kt$KavitaApi$500 - MagicNumber:KavitaModels.kt$OAuth$3 - MagicNumber:Kitsu.kt$Kitsu$20 - MagicNumber:Kitsu.kt$Kitsu$37 - MagicNumber:Kitsu.kt$Kitsu$50 - MagicNumber:Kitsu.kt$Kitsu$51 - MagicNumber:KitsuModels.kt$1000 - MagicNumber:KitsuModels.kt$3600 - MagicNumber:Komga.kt$Komga$37 - MagicNumber:Komga.kt$Komga$50 - MagicNumber:Komga.kt$Komga$51 - MagicNumber:LibraryToolbar.kt$0.08f - MagicNumber:LibraryToolbar.kt$0.12f - MagicNumber:MangaDownload.kt$MangaDownload.State.DOWNLOADED$3 - MagicNumber:MangaDownload.kt$MangaDownload.State.ERROR$4 - MagicNumber:MangaDownloadCache.kt$MangaDownloadCache$1000 - MagicNumber:MangaDownloadHolder.kt$MangaDownloadHolder$100 - MagicNumber:MangaDownloadNotifier.kt$MangaDownloadNotifier$15 - MagicNumber:MangaDownloadNotifier.kt$MangaDownloadNotifier$30 - MagicNumber:MangaDownloadProvider.kt$MangaDownloadProvider$4 - MagicNumber:MangaDownloadQueueScreenModel.kt$MangaDownloadQueueScreenModel$50 - MagicNumber:MangaDownloader.kt$MangaDownloader$100 - MagicNumber:MangaDownloader.kt$MangaDownloader$1000 - MagicNumber:MangaDownloader.kt$MangaDownloader$1024 - MagicNumber:MangaDownloader.kt$MangaDownloader$3 - MagicNumber:MangaDownloader.kt$MangaDownloader$5 - MagicNumber:MangaExtensionDetailsScreen.kt$1.5f - MagicNumber:MangaExtensionInstallService.kt$MangaExtensionInstallService$100 - MagicNumber:MangaInfoHeader.kt$0.2f - MagicNumber:MangaInfoHeader.kt$0.65f - MagicNumber:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$10 - MagicNumber:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$25 - MagicNumber:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$5 - MagicNumber:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$5 - MagicNumber:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob.Companion$10 - MagicNumber:MangaLibraryUpdateNotifier.kt$MangaLibraryUpdateNotifier$40 - MagicNumber:MangaMetadataUpdateJob.kt$MangaMetadataUpdateJob$5 - MagicNumber:MangaScreenModel.kt$MangaScreenModel$10 - MagicNumber:MangaScreenModel.kt$MangaScreenModel$103 - MagicNumber:MangaScreenModel.kt$MangaScreenModel$25 - MagicNumber:MangaScreenModel.kt$MangaScreenModel$5 - MagicNumber:MangaTrackInfoDialog.kt$TrackChapterSelectorScreen.Model$10000 - MagicNumber:MangaTrackerSearchPreviewProvider.kt$MangaTrackerSearchPreviewProvider$10 - MagicNumber:MangaTrackerSearchPreviewProvider.kt$MangaTrackerSearchPreviewProvider$100 - MagicNumber:MangaTrackerSearchPreviewProvider.kt$MangaTrackerSearchPreviewProvider$1000L - MagicNumber:MangaTrackerSearchPreviewProvider.kt$MangaTrackerSearchPreviewProvider$100L - MagicNumber:MangaTrackerSearchPreviewProvider.kt$MangaTrackerSearchPreviewProvider$30 - MagicNumber:MangaTrackerSearchPreviewProvider.kt$MangaTrackerSearchPreviewProvider$365 - MagicNumber:MangaTrackerSearchPreviewProvider.kt$MangaTrackerSearchPreviewProvider$40 - MagicNumber:MangaUpdates.kt$MangaUpdates$146 - MagicNumber:MangaUpdates.kt$MangaUpdates$160 - MagicNumber:MangaUpdates.kt$MangaUpdates$173 - MagicNumber:MangaUpdatesApi.kt$MangaUpdatesApi$200 - MagicNumber:MangaUpdatesScreenModel.kt$MangaUpdatesScreenModel$3 - MagicNumber:Migrations.kt$Migrations$105 - MagicNumber:Migrations.kt$Migrations$106 - MagicNumber:Migrations.kt$Migrations$113 - MagicNumber:Migrations.kt$Migrations$114 - MagicNumber:Migrations.kt$Migrations$116 - MagicNumber:Migrations.kt$Migrations$117 - MagicNumber:Migrations.kt$Migrations$12 - MagicNumber:Migrations.kt$Migrations$120 - MagicNumber:Migrations.kt$Migrations$121 - MagicNumber:Migrations.kt$Migrations$123 - MagicNumber:Migrations.kt$Migrations$15 - MagicNumber:Migrations.kt$Migrations$19 - MagicNumber:Migrations.kt$Migrations$26 - MagicNumber:Migrations.kt$Migrations$3 - MagicNumber:Migrations.kt$Migrations$4 - MagicNumber:Migrations.kt$Migrations$44 - MagicNumber:Migrations.kt$Migrations$5 - MagicNumber:Migrations.kt$Migrations$52 - MagicNumber:Migrations.kt$Migrations$54 - MagicNumber:Migrations.kt$Migrations$57 - MagicNumber:Migrations.kt$Migrations$59 - MagicNumber:Migrations.kt$Migrations$6 - MagicNumber:Migrations.kt$Migrations$60 - MagicNumber:Migrations.kt$Migrations$61 - MagicNumber:Migrations.kt$Migrations$64 - MagicNumber:Migrations.kt$Migrations$7 - MagicNumber:Migrations.kt$Migrations$70 - MagicNumber:Migrations.kt$Migrations$71 - MagicNumber:Migrations.kt$Migrations$72 - MagicNumber:Migrations.kt$Migrations$75 - MagicNumber:Migrations.kt$Migrations$77 - MagicNumber:Migrations.kt$Migrations$8 - MagicNumber:Migrations.kt$Migrations$81 - MagicNumber:Migrations.kt$Migrations$82 - MagicNumber:Migrations.kt$Migrations$84 - MagicNumber:Migrations.kt$Migrations$85 - MagicNumber:Migrations.kt$Migrations$86 - MagicNumber:Migrations.kt$Migrations$92 - MagicNumber:Migrations.kt$Migrations$93 - MagicNumber:Migrations.kt$Migrations$96 - MagicNumber:Migrations.kt$Migrations$97 - MagicNumber:Migrations.kt$Migrations$99 - MagicNumber:MonetColorScheme.kt$MonetColorScheme.Companion$128 - MagicNumber:MyAnimeList.kt$MyAnimeList$162 - MagicNumber:MyAnimeList.kt$MyAnimeList$46 - MagicNumber:MyAnimeList.kt$MyAnimeList$81 - MagicNumber:MyAnimeListApi.kt$MyAnimeListApi$64 - MagicNumber:MyAnimeListInterceptor.kt$MyAnimeListInterceptor$401 - MagicNumber:PageIndicatorText.kt$235 - MagicNumber:PageIndicatorText.kt$45 - MagicNumber:PagerConfig.kt$PagerConfig$3 - MagicNumber:PagerConfig.kt$PagerConfig$4 - MagicNumber:PagerConfig.kt$PagerConfig$5 - MagicNumber:PagerPageHolder.kt$PagerPageHolder$16 - MagicNumber:PagerPageHolder.kt$PagerPageHolder$90f - MagicNumber:PagerViewer.kt$PagerViewer$5 - MagicNumber:PictureInPictureHandler.kt$PictureInPictureHandler$10000 - MagicNumber:PictureInPictureHandler.kt$PictureInPictureHandler$23899 - MagicNumber:PictureInPictureHandler.kt$PictureInPictureHandler$23900 - MagicNumber:PictureInPictureHandler.kt$PictureInPictureHandler$4184 - MagicNumber:PictureInPictureHandler.kt$PictureInPictureHandler$4185 - MagicNumber:PkceUtil.kt$PkceUtil$50 - MagicNumber:PlayerActivity.kt$PlayerActivity$0.02F - MagicNumber:PlayerActivity.kt$PlayerActivity$0.15f - MagicNumber:PlayerActivity.kt$PlayerActivity$0.2F - MagicNumber:PlayerActivity.kt$PlayerActivity$0.5F - MagicNumber:PlayerActivity.kt$PlayerActivity$0.75F - MagicNumber:PlayerActivity.kt$PlayerActivity$0.8F - MagicNumber:PlayerActivity.kt$PlayerActivity$100 - MagicNumber:PlayerActivity.kt$PlayerActivity$1000 - MagicNumber:PlayerActivity.kt$PlayerActivity$1000.0 - MagicNumber:PlayerActivity.kt$PlayerActivity$1000F - MagicNumber:PlayerActivity.kt$PlayerActivity$1000L - MagicNumber:PlayerActivity.kt$PlayerActivity$2 - MagicNumber:PlayerActivity.kt$PlayerActivity$2.0 - MagicNumber:PlayerActivity.kt$PlayerActivity$256 - MagicNumber:PlayerActivity.kt$PlayerActivity$500 - MagicNumber:PlayerActivity.kt$PlayerActivity$500L - MagicNumber:PlayerActivity.kt$PlayerActivity$70000000 - MagicNumber:PlayerActivity.kt$PlayerActivity$750L - MagicNumber:PlayerControlsView.kt$PlayerControlsView$100 - MagicNumber:PlayerControlsView.kt$PlayerControlsView$1000L - MagicNumber:PlayerControlsView.kt$PlayerControlsView$3500L - MagicNumber:PlayerControlsView.kt$PlayerControlsView$500L - MagicNumber:PlayerControlsView.kt$PlayerControlsView$75 - MagicNumber:PlayerControlsView.kt$PlayerControlsView$750L - MagicNumber:PlayerPreferences.kt$PlayerPreferences$0.85F - MagicNumber:PlayerPreferences.kt$PlayerPreferences$10 - MagicNumber:PlayerPreferences.kt$PlayerPreferences$16777216 - MagicNumber:PlayerPreferences.kt$PlayerPreferences$5 - MagicNumber:PlayerPreferences.kt$PlayerPreferences$55 - MagicNumber:PlayerPreferences.kt$PlayerPreferences$6 - MagicNumber:PlayerPreferences.kt$PlayerPreferences$7 - MagicNumber:PlayerPreferences.kt$PlayerPreferences$85 - MagicNumber:PlayerViewModel.kt$PlayerViewModel$0.35 - MagicNumber:PlayerViewModel.kt$PlayerViewModel$1000L - MagicNumber:ReaderActivity.kt$ReaderActivity$230 - MagicNumber:ReaderActivity.kt$ReaderActivity$242 - MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$0.01f - MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$100 - MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$100f - MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$255f - MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$3 - MagicNumber:ReaderContentOverlay.kt$100f - MagicNumber:ReaderOrientation.kt$ReaderOrientation.FREE$0x00000008 - MagicNumber:ReaderOrientation.kt$ReaderOrientation.LANDSCAPE$0x00000018 - MagicNumber:ReaderOrientation.kt$ReaderOrientation.LOCKED_LANDSCAPE$0x00000028 - MagicNumber:ReaderOrientation.kt$ReaderOrientation.LOCKED_PORTRAIT$0x00000020 - MagicNumber:ReaderOrientation.kt$ReaderOrientation.PORTRAIT$0x00000010 - MagicNumber:ReaderOrientation.kt$ReaderOrientation.REVERSE_PORTRAIT$0x00000030 - MagicNumber:ReaderPageImageView.kt$ReaderPageImageView$180 - MagicNumber:ReaderPageImageView.kt$ReaderPageImageView$250 - MagicNumber:ReaderPageImageView.kt$ReaderPageImageView$500 - MagicNumber:ReaderPreferences.kt$ReaderPreferences$500 - MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.HIGH$13 - MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.HIGHEST$5 - MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.LOW$31 - MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.LOWEST$47 - MagicNumber:ReaderProgressIndicator.kt$ReaderProgressIndicator$100f - MagicNumber:ReaderSettingsDialog.kt$0.5f - MagicNumber:ReaderViewModel.kt$ReaderViewModel$0.25 - MagicNumber:ReadingMode.kt$ReadingMode.CONTINUOUS_VERTICAL$0x00000005 - MagicNumber:ReadingMode.kt$ReadingMode.VERTICAL$0x00000003 - MagicNumber:ReadingMode.kt$ReadingMode.WEBTOON$0x00000004 - MagicNumber:ReadingModePage.kt$100f - MagicNumber:ReadingModePage.kt$5 - MagicNumber:RevealAnimationView.kt$RevealAnimationView$350 - MagicNumber:RevealAnimationView.kt$RevealAnimationView$500 - MagicNumber:SaveImageNotifier.kt$SaveImageNotifier$1280 - MagicNumber:SaveImageNotifier.kt$SaveImageNotifier$720 - MagicNumber:SecureActivityDelegate.kt$SecureActivityDelegate.Companion$60_000 - MagicNumber:Seekbar.kt$2 - MagicNumber:SetAnimeViewerFlags.kt$SetAnimeViewerFlags$16.0 - MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$12 - MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$168 - MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$24 - MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$48 - MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$6 - MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$10 - MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$3 - MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$4 - MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$5 - MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$12 - MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$168 - MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$24 - MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$48 - MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$72 - MagicNumber:SettingsMainScreen.kt$SettingsMainScreen$0.02f - MagicNumber:SettingsMainScreen.kt$SettingsMainScreen$0.05f - MagicNumber:SettingsMainScreen.kt$SettingsMainScreen$3 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$0.70F - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$0.75F - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$0.80F - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$0.85F - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$0.90F - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$0.95F - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$10 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$20 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$255 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$3 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$30 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$5 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$6 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$7 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$8 - MagicNumber:SettingsPlayerScreen.kt$SettingsPlayerScreen$9 - MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$100f - MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$250 - MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$3 - MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$500 - MagicNumber:SettingsSearchScreen.kt$10 - MagicNumber:Shikimori.kt$Shikimori$40 - MagicNumber:ShikimoriModels.kt$1000 - MagicNumber:ShikimoriModels.kt$3600 - MagicNumber:SkipIntroLengthDialog.kt$255 - MagicNumber:SourcePreferences.kt$SourcePreferences$80 - MagicNumber:StorageScreenContent.kt$10 - MagicNumber:StorageScreenContent.kt$20 - MagicNumber:StorageScreenContent.kt$255 - MagicNumber:StorageScreenContent.kt$3f - MagicNumber:StorageUtil.kt$1000 - MagicNumber:SubtitleColorPage.kt$0x000000FFL - MagicNumber:SubtitleColorPage.kt$0x0000FF00L - MagicNumber:SubtitleColorPage.kt$0x00FF0000L - MagicNumber:SubtitleColorPage.kt$0x00FFFFFFL - MagicNumber:SubtitleColorPage.kt$0xFF - MagicNumber:SubtitleColorPage.kt$0xFF000000L - MagicNumber:SubtitleColorPage.kt$16 - MagicNumber:SubtitleColorPage.kt$24 - MagicNumber:SubtitleColorPage.kt$8 - MagicNumber:SubtitleColorPage.kt$ARGBValue.ALPHA$0xFF000000L - MagicNumber:SubtitleColorPage.kt$ARGBValue.ALPHA$24 - MagicNumber:SubtitleColorPage.kt$ARGBValue.BLUE$0x000000FFL - MagicNumber:SubtitleColorPage.kt$ARGBValue.GREEN$0x0000FF00L - MagicNumber:SubtitleColorPage.kt$ARGBValue.GREEN$8 - MagicNumber:SubtitleColorPage.kt$ARGBValue.RED$0x00FF0000L - MagicNumber:SubtitleColorPage.kt$ARGBValue.RED$16 - MagicNumber:SubtitleDelayPage.kt$1000 - MagicNumber:SubtitleDelayPage.kt$1000.0 - MagicNumber:SubtitleSettingsSheet.kt$0.25f - MagicNumber:SubtitleSettingsSheet.kt$0.8f - MagicNumber:SubtitleSettingsSheet.kt$12f - MagicNumber:SubtitleSettingsSheet.kt$3 - MagicNumber:SubtitleSettingsSheet.kt$4 - MagicNumber:SubtitleSettingsSheet.kt$48f - MagicNumber:SubtitleSettingsSheet.kt$8f - MagicNumber:Suwayomi.kt$Suwayomi$255 - MagicNumber:Suwayomi.kt$Suwayomi$35 - MagicNumber:TimeUtils.kt$4 - MagicNumber:TrackInfoDialogSelector.kt$3L - MagicNumber:TrackInfoDialogSelector.kt$4L - MagicNumber:TrackInfoDialogSelector.kt$5L - MagicNumber:TrackInfoDialogSelector.kt$6L - MagicNumber:TrackInfoDialogSelector.kt$7L - MagicNumber:TrackInfoDialogSelector.kt$8L - MagicNumber:TrackingPreferenceWidget.kt$0xFF4CAF50 - MagicNumber:TvUtils.kt$30 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0x11 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0x28 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0x7D - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0xCC - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0x81 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0x8D - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0x95 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0xCC - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0x84 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0x96 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0xCC - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0xE2 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0x33 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0x77 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0xCC - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0xFF - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xA6 - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xCC - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xCF - MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xD5 - MagicNumber:WebtoonConfig.kt$WebtoonConfig$3 - MagicNumber:WebtoonConfig.kt$WebtoonConfig$4 - MagicNumber:WebtoonConfig.kt$WebtoonConfig$5 - MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$0.8 - MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$100f - MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$16 - MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$90f - MagicNumber:WebtoonRecyclerView.kt$WebtoonRecyclerView$0.4f - MagicNumber:WebtoonRecyclerView.kt$WebtoonRecyclerView$400 - MagicNumber:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$0.5f - MagicNumber:WebtoonViewer.kt$WebtoonViewer$3 - MagicNumber:WebtoonViewer.kt$WebtoonViewer$5 - MagicNumber:WorkManagerExtensions.kt$500 - MatchingDeclarationName:ChapterDownloadIndicator.kt$ChapterDownloadAction - MatchingDeclarationName:CommonEntryItem.kt$CommonEntryItemDefaults - MatchingDeclarationName:CreateAniyomiExtensionRepo.kt$CreateAnimeExtensionRepo - MatchingDeclarationName:EpisodeDownloadIndicator.kt$EpisodeDownloadAction - MatchingDeclarationName:MyAnimeListModels.kt$OAuth - MatchingDeclarationName:NetworkStateTracker.kt$NetworkState - MatchingDeclarationName:ShikimoriModels.kt$OAuth - MatchingDeclarationName:SimklModels.kt$OAuth - MatchingDeclarationName:TabbedDialog.kt$TabbedDialogPaddings - MaxLineLength:AnimeDownloader.kt$AnimeDownloader$// If job has been asked to close then set the download as failed and collaborate - MaxLineLength:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$// failedUpdates will already have the source, don't need to copy it into the message - MaxLineLength:BrowseTab.kt$BrowseTab$// TODO: Find a way to let it open Global Anime/Manga Search depending on what Tab(e.g. Anime/Manga Source Tab) is open - MaxLineLength:MainActivity.kt$MainActivity$// or the Google-specific search intent (triggered by saying or typing "search *query* on *Tachiyomi*" in Google Search/Google Assistant) - MaxLineLength:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$// failedUpdates will already have the source, don't need to copy it into the message - MaxLineLength:PreferenceScreen.kt$* - MaxLineLength:SourcePreferences.kt$SourcePreferences$// fun sourcesTabSourcesInCategories() = preferenceStore.getStringSet("sources_tab_source_categories", mutableSetOf()) - MemberNameEqualsClassName:ExternalIntents.kt$ExternalIntents.Companion$val externalIntents: ExternalIntents by injectLazy() - ModifierClickableOrder:ScanlatorFilterDialog.kt$clickable { if (isExcluded) { mutableExcludedScanlators.remove(scanlator) } else { mutableExcludedScanlators.add(scanlator) } } - ModifierComposed:BasePreferenceWidget.kt$highlightBackground - ModifierComposed:ItemDownloadIndicator.kt$commonClickable - ModifierMissing:AnimeCategoryScreen.kt$AnimeCategoryScreen - ModifierMissing:AnimeDownloadQueueScreen.kt$AnimeDownloadQueueScreen - ModifierMissing:AnimeExtensionDetailsScreen.kt$AnimeExtensionDetailsScreen - ModifierMissing:AnimeExtensionFilterScreen.kt$AnimeExtensionFilterScreen - ModifierMissing:AnimeExtensionsScreen.kt$AnimeExtensionScreen - ModifierMissing:AnimeHistoryScreen.kt$AnimeHistoryScreen - ModifierMissing:AnimeLibraryCompactGrid.kt$AnimeLibraryCompactGrid - ModifierMissing:AnimeLibraryContent.kt$AnimeLibraryContent - ModifierMissing:AnimeLibraryPager.kt$AnimeLibraryPager - ModifierMissing:AnimeLibrarySettingsDialog.kt$AnimeLibrarySettingsDialog - ModifierMissing:AnimeScreen.kt$AnimeScreenLargeImpl - ModifierMissing:AnimeSourcesFilterScreen.kt$AnimeSourcesFilterScreen - ModifierMissing:AnimeSourcesScreen.kt$AnimeSourcesScreen - ModifierMissing:AnimeStatsScreenContent.kt$AnimeStatsScreenContent - ModifierMissing:AnimeTrackInfoDialogHome.kt$AnimeTrackInfoDialogHome - ModifierMissing:AnimeTrackerSearch.kt$AnimeTrackerSearch - ModifierMissing:AnimeUpdatesScreen.kt$AnimeUpdateScreen - ModifierMissing:AppBar.kt$AppBarActions - ModifierMissing:AppThemePreferenceWidget.kt$AppThemePreviewItem - ModifierMissing:BottomReaderBar.kt$BottomReaderBar - ModifierMissing:BrowseAnimeSourceComfortableGrid.kt$BrowseAnimeSourceComfortableGrid - ModifierMissing:BrowseAnimeSourceCompactGrid.kt$BrowseAnimeSourceCompactGrid - ModifierMissing:BrowseAnimeSourceList.kt$BrowseAnimeSourceList - ModifierMissing:BrowseAnimeSourceScreen.kt$BrowseAnimeSourceContent - ModifierMissing:BrowseAnimeSourceToolbar.kt$BrowseAnimeSourceToolbar - ModifierMissing:BrowseMangaSourceComfortableGrid.kt$BrowseMangaSourceComfortableGrid - ModifierMissing:BrowseMangaSourceCompactGrid.kt$BrowseMangaSourceCompactGrid - ModifierMissing:BrowseMangaSourceList.kt$BrowseMangaSourceList - ModifierMissing:BrowseMangaSourceScreen.kt$BrowseSourceContent - ModifierMissing:BrowseMangaSourceToolbar.kt$BrowseMangaSourceToolbar - ModifierMissing:ChapterNavigator.kt$ChapterNavigator - ModifierMissing:ChapterSettingsDialog.kt$ChapterSettingsDialog - ModifierMissing:ChapterSettingsDialog.kt$ScanlatorFilterItem - ModifierMissing:CommonEntryItem.kt$EntryComfortableGridItem - ModifierMissing:CommonEntryItem.kt$EntryCompactGridItem - ModifierMissing:CommonEntryItem.kt$EntryListItem - ModifierMissing:CrashScreen.kt$CrashScreen - ModifierMissing:EpisodeListDialog.kt$EpisodeListDialog - ModifierMissing:EpisodeOptionsDialogScreen.kt$EpisodeOptionsDialog - ModifierMissing:EpisodeSettingsDialog.kt$EpisodeSettingsDialog - ModifierMissing:ExtensionReposScreen.kt$ExtensionReposScreen - ModifierMissing:GlobalAnimeSearchCardRow.kt$GlobalAnimeSearchCardRow - ModifierMissing:GlobalAnimeSearchScreen.kt$GlobalAnimeSearchScreen - ModifierMissing:GlobalAnimeSearchToolbar.kt$GlobalAnimeSearchToolbar - ModifierMissing:GlobalMangaSearchCardRow.kt$GlobalMangaSearchCardRow - ModifierMissing:GlobalMangaSearchScreen.kt$GlobalMangaSearchScreen - ModifierMissing:GlobalMangaSearchToolbar.kt$GlobalMangaSearchToolbar - ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchErrorResultItem - ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchLoadingResultItem - ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchResultItem - ModifierMissing:GlobalSerachCard.kt$GlobalSearchCard - ModifierMissing:HomeScreen.kt$HomeScreen$NavigationRailItem - ModifierMissing:LogoHeader.kt$LogoHeader - ModifierMissing:MangaCategoryScreen.kt$MangaCategoryScreen - ModifierMissing:MangaDownloadQueueScreen.kt$DownloadQueueScreen - ModifierMissing:MangaExtensionDetailsScreen.kt$MangaExtensionDetailsScreen - ModifierMissing:MangaExtensionFilterScreen.kt$MangaExtensionFilterScreen - ModifierMissing:MangaExtensionsScreen.kt$MangaExtensionScreen - ModifierMissing:MangaHistoryScreen.kt$MangaHistoryScreen - ModifierMissing:MangaLibraryContent.kt$MangaLibraryContent - ModifierMissing:MangaLibraryPager.kt$MangaLibraryPager - ModifierMissing:MangaLibrarySettingsDialog.kt$MangaLibrarySettingsDialog - ModifierMissing:MangaScreen.kt$MangaScreenLargeImpl - ModifierMissing:MangaSourcesFilterScreen.kt$MangaSourcesFilterScreen - ModifierMissing:MangaSourcesScreen.kt$MangaSourcesScreen - ModifierMissing:MangaStatsScreenContent.kt$MangaStatsScreenContent - ModifierMissing:MangaTrackInfoDialogHome.kt$MangaTrackInfoDialogHome - ModifierMissing:MangaTrackInfoDialogHome.kt$TrackInfoItemMenu - ModifierMissing:MangaTrackerSearch.kt$MangaTrackerSearch - ModifierMissing:MangaUpdatesScreen.kt$MangaUpdateScreen - ModifierMissing:MigrateAnimeScreen.kt$MigrateAnimeScreen - ModifierMissing:MigrateAnimeSearchScreen.kt$MigrateAnimeSearchScreen - ModifierMissing:MigrateAnimeSourceScreen.kt$MigrateAnimeSourceScreen - ModifierMissing:MigrateMangaScreen.kt$MigrateMangaScreen - ModifierMissing:MigrateMangaSearchScreen.kt$MigrateMangaSearchScreen - ModifierMissing:MigrateMangaSourceScreen.kt$MigrateMangaSourceScreen - ModifierMissing:ModeSelectionDialog.kt$ModeSelectionDialog - ModifierMissing:MoreScreen.kt$MoreScreen - ModifierMissing:NewUpdateScreen.kt$NewUpdateScreen - ModifierMissing:OnboardingScreen.kt$OnboardingScreen - ModifierMissing:PageIndicatorText.kt$PageIndicatorText - ModifierMissing:PlayerSettingsScreenModel.kt$PlayerSettingsScreenModel$NoSubtitlesWarning - ModifierMissing:PlayerSettingsScreenModel.kt$PlayerSettingsScreenModel$OverrideSubtitlesSwitch - ModifierMissing:PlayerSettingsScreenModel.kt$PlayerSettingsScreenModel$ToggleableRow - ModifierMissing:PlayerSettingsSheet.kt$PlayerSettingsSheet - ModifierMissing:PreferenceGroupHeader.kt$PreferenceGroupHeader - ModifierMissing:PreferenceScaffold.kt$PreferenceScaffold - ModifierMissing:ReaderAppBars.kt$ReaderAppBars - ModifierMissing:ReaderPageActionsDialog.kt$ReaderPageActionsDialog - ModifierMissing:ReaderSettingsDialog.kt$ReaderSettingsDialog - ModifierMissing:ScreenshotOptionsSheet.kt$ScreenshotOptionsSheet - ModifierMissing:SettingsMainScreen.kt$SettingsMainScreen$Content - ModifierMissing:SkipIntroLengthDialog.kt$SkipIntroLengthDialog - ModifierMissing:SourceFilterAnimeDialog.kt$SourceFilterAnimeDialog - ModifierMissing:SourceFilterMangaDialog.kt$SourceFilterMangaDialog - ModifierMissing:SpeedPickerDialog.kt$SpeedPickerDialog - ModifierMissing:StreamsCatalogSheet.kt$StreamsCatalogSheet - ModifierMissing:SubtitleDelayPage.kt$StreamsDelayPage - ModifierMissing:SubtitleSettingsSheet.kt$OutLineText - ModifierMissing:SubtitleSettingsSheet.kt$SubtitlePreview - ModifierMissing:SubtitleSettingsSheet.kt$SubtitleSettingsSheet - ModifierMissing:TrackInfoDialogSelector.kt$BaseSelector - ModifierMissing:TrackInfoDialogSelector.kt$TrackDateSelector - ModifierMissing:TrackInfoDialogSelector.kt$TrackItemSelector - ModifierMissing:TrackInfoDialogSelector.kt$TrackScoreSelector - ModifierMissing:TrackInfoDialogSelector.kt$TrackStatusSelector - ModifierMissing:TrackLogoIcon.kt$TrackLogoIcon - ModifierMissing:VideoChaptersSheet.kt$VideoChaptersSheet - ModifierMissing:WebViewScreenContent.kt$WebViewScreenContent - ModifierNotUsedAtRoot:AnimeEpisodeListItem.kt$modifier = modifier .selectedBackground(selected) .combinedClickable( onClick = onClick, onLongClick = onLongClick, ) .padding(start = 16.dp, top = 12.dp, end = 8.dp, bottom = 12.dp) - ModifierNotUsedAtRoot:DropdownMenu.kt$modifier = modifier - ModifierNotUsedAtRoot:MangaChapterListItem.kt$modifier = modifier .selectedBackground(selected) .combinedClickable( onClick = onClick, onLongClick = onLongClick, ) .padding(start = 16.dp, top = 12.dp, end = 8.dp, bottom = 12.dp) - ModifierNotUsedAtRoot:TabbedScreen.kt$modifier = modifier - ModifierNotUsedAtRoot:TrackingPreferenceWidget.kt$modifier = modifier .clickable(enabled = onClick != null, onClick = { onClick?.invoke() }) .fillMaxWidth() .padding(horizontal = PrefsHorizontalPadding, vertical = 8.dp) - MultipleEmitters:SubtitleColorPage.kt$SubtitleColors - MutableStateAutoboxing:EpisodeListDialog.kt$mutableStateOf(0) - MutableStateAutoboxing:SettingsPlayerScreen.kt$SettingsPlayerScreen$mutableStateOf(initialSkipIntroLength) - MutableStateAutoboxing:VideoChaptersSheet.kt$mutableStateOf(timePosition) - NestedBlockDepth:Anilist.kt$Anilist$override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack - NestedBlockDepth:Anilist.kt$Anilist$override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack - NestedBlockDepth:AnimeDownloadQueueScreenModel.kt$AnimeDownloadQueueScreenModel.<no name provided>$override fun onMenuItemClick(position: Int, menuItem: MenuItem) - NestedBlockDepth:AnimeDownloader.kt$AnimeDownloader$private fun downloadVideoExternal( video: Video, source: AnimeHttpSource, tmpDir: UniFile, filename: String, ): UniFile - NestedBlockDepth:AnimeDownloader.kt$AnimeDownloader$private suspend fun attemptDownload( download: AnimeDownload, tmpDir: UniFile, filename: String, safe: Boolean, ): UniFile - NestedBlockDepth:AnimeDownloader.kt$AnimeDownloader$private suspend fun httpDownload( download: AnimeDownload, tmpDir: UniFile, filename: String, threadNumber: Int, safeDownload: Boolean, ): UniFile - NestedBlockDepth:AnimeExtensionInstaller.kt$AnimeExtensionInstaller$fun installApk(downloadId: Long, uri: Uri) - NestedBlockDepth:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$private fun writeErrorFile(errors: List<Pair<Anime, String?>>): File - NestedBlockDepth:AppLanguageScreen.kt$AppLanguageScreen$private fun getLangs(context: Context): ImmutableList<Language> - NestedBlockDepth:BackupRestorer.kt$BackupRestorer$private fun writeErrorLog(): File - NestedBlockDepth:BrowseAnimeSourceScreenModel.kt$BrowseAnimeSourceScreenModel$fun searchGenre(genreName: String) - NestedBlockDepth:BrowseMangaSourceScreenModel.kt$BrowseMangaSourceScreenModel$fun searchGenre(genreName: String) - NestedBlockDepth:ChapterLoader.kt$ChapterLoader$private fun getPageLoader(chapter: ReaderChapter): PageLoader - NestedBlockDepth:CloseableExtensions.kt$inline fun <T : Closeable?> Array<T>.use(block: () -> Unit) - NestedBlockDepth:ContextExtensions.kt$fun Context.openInBrowser(uri: Uri, forceDefaultBrowser: Boolean = false) - NestedBlockDepth:GestureHandler.kt$GestureHandler$@SuppressLint("ClickableViewAccessibility") override fun onTouch(v: View, event: MotionEvent): Boolean - NestedBlockDepth:GestureHandler.kt$GestureHandler$override fun onScroll( e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float, ): Boolean - NestedBlockDepth:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String? - NestedBlockDepth:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Double - NestedBlockDepth:Kitsu.kt$Kitsu$override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack - NestedBlockDepth:Kitsu.kt$Kitsu$override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack - NestedBlockDepth:MangaDownloadQueueScreenModel.kt$MangaDownloadQueueScreenModel.<no name provided>$override fun onMenuItemClick(position: Int, menuItem: MenuItem) - NestedBlockDepth:MangaDownloader.kt$MangaDownloader$private fun archiveChapter( mangaDir: UniFile, dirname: String, tmpDir: UniFile, ) - NestedBlockDepth:MangaExtensionInstaller.kt$MangaExtensionInstaller$fun installApk(downloadId: Long, uri: Uri) - NestedBlockDepth:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$private fun writeErrorFile(errors: List<Pair<Manga, String?>>): File - NestedBlockDepth:Migrations.kt$Migrations$fun upgrade( context: Context, preferenceStore: PreferenceStore, basePreferences: BasePreferences, uiPreferences: UiPreferences, networkPreferences: NetworkPreferences, sourcePreferences: SourcePreferences, securityPreferences: SecurityPreferences, libraryPreferences: LibraryPreferences, readerPreferences: ReaderPreferences, playerPreferences: PlayerPreferences, backupPreferences: BackupPreferences, trackerManager: TrackerManager, ): Boolean - NestedBlockDepth:MyAnimeList.kt$MyAnimeList$override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack - NestedBlockDepth:MyAnimeList.kt$MyAnimeList$override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack - NestedBlockDepth:PlayerActivity.kt$PlayerActivity$private fun setVideoList( qualityIndex: Int, videos: List<Video>?, fromStart: Boolean = false, position: Long? = null, ) - NestedBlockDepth:PlayerViewModel.kt$PlayerViewModel$suspend fun init( animeId: Long, initialEpisodeId: Long, vidList: String, vidIndex: Int, ): Pair<InitResult, Result<Boolean>> - NestedBlockDepth:StorageUtil.kt$fun UniFile.size(): Long - NestedBlockDepth:SyncChaptersWithSource.kt$SyncChaptersWithSource$suspend fun await( rawSourceChapters: List<SChapter>, manga: Manga, source: MangaSource, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Chapter> - NestedBlockDepth:SyncEpisodesWithSource.kt$SyncEpisodesWithSource$suspend fun await( rawSourceEpisodes: List<SEpisode>, anime: Anime, source: AnimeSource, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Episode> - NestedBlockDepth:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean - ParameterNaming:AnimeInfoHeader.kt$onAddToLibraryClicked - ParameterNaming:AnimeInfoHeader.kt$onEditIntervalClicked - ParameterNaming:AnimeInfoHeader.kt$onTrackingClicked - ParameterNaming:AnimeInfoHeader.kt$onWebViewClicked - ParameterNaming:AnimeInfoHeader.kt$onWebViewLongClicked - ParameterNaming:AnimeLibraryComfortableGrid.kt$onGlobalSearchClicked - ParameterNaming:AnimeLibraryCompactGrid.kt$onGlobalSearchClicked - ParameterNaming:AnimeLibraryContent.kt$onAnimeClicked - ParameterNaming:AnimeLibraryContent.kt$onContinueWatchingClicked - ParameterNaming:AnimeLibraryContent.kt$onGlobalSearchClicked - ParameterNaming:AnimeLibraryList.kt$onGlobalSearchClicked - ParameterNaming:AnimeLibraryPager.kt$onGlobalSearchClicked - ParameterNaming:AnimeScreen.kt$onAddToLibraryClicked - ParameterNaming:AnimeScreen.kt$onAllEpisodeSelected - ParameterNaming:AnimeScreen.kt$onBackClicked - ParameterNaming:AnimeScreen.kt$onCoverClicked - ParameterNaming:AnimeScreen.kt$onDownloadActionClicked - ParameterNaming:AnimeScreen.kt$onEditCategoryClicked - ParameterNaming:AnimeScreen.kt$onEditFetchIntervalClicked - ParameterNaming:AnimeScreen.kt$onEditIntervalClicked - ParameterNaming:AnimeScreen.kt$onEpisodeClicked - ParameterNaming:AnimeScreen.kt$onEpisodeSelected - ParameterNaming:AnimeScreen.kt$onFilterButtonClicked - ParameterNaming:AnimeScreen.kt$onFilterClicked - ParameterNaming:AnimeScreen.kt$onMarkPreviousAsSeenClicked - ParameterNaming:AnimeScreen.kt$onMigrateClicked - ParameterNaming:AnimeScreen.kt$onMultiBookmarkClicked - ParameterNaming:AnimeScreen.kt$onMultiDeleteClicked - ParameterNaming:AnimeScreen.kt$onMultiMarkAsSeenClicked - ParameterNaming:AnimeScreen.kt$onSettingsClicked - ParameterNaming:AnimeScreen.kt$onShareClicked - ParameterNaming:AnimeScreen.kt$onTrackingClicked - ParameterNaming:AnimeScreen.kt$onWebViewClicked - ParameterNaming:AnimeScreen.kt$onWebViewLongClicked - ParameterNaming:AnimeTrackInfoDialogHome.kt$onRemoved - ParameterNaming:AnimeUpdatesScreen.kt$onMultiBookmarkClicked - ParameterNaming:AnimeUpdatesScreen.kt$onMultiDeleteClicked - ParameterNaming:AnimeUpdatesScreen.kt$onMultiMarkAsSeenClicked - ParameterNaming:AnimeUpdatesScreen.kt$onUpdateSelected - ParameterNaming:ChapterSettingsDialog.kt$onBookmarkedFilterChanged - ParameterNaming:ChapterSettingsDialog.kt$onConfirmed - ParameterNaming:ChapterSettingsDialog.kt$onDisplayModeChanged - ParameterNaming:ChapterSettingsDialog.kt$onDownloadFilterChanged - ParameterNaming:ChapterSettingsDialog.kt$onItemSelected - ParameterNaming:ChapterSettingsDialog.kt$onScanlatorFilterClicked - ParameterNaming:ChapterSettingsDialog.kt$onSortModeChanged - ParameterNaming:ChapterSettingsDialog.kt$onUnreadFilterChanged - ParameterNaming:EntryBottomActionMenu.kt$onBookmarkClicked - ParameterNaming:EntryBottomActionMenu.kt$onChangeCategoryClicked - ParameterNaming:EntryBottomActionMenu.kt$onDeleteClicked - ParameterNaming:EntryBottomActionMenu.kt$onDownloadClicked - ParameterNaming:EntryBottomActionMenu.kt$onExternalClicked - ParameterNaming:EntryBottomActionMenu.kt$onInternalClicked - ParameterNaming:EntryBottomActionMenu.kt$onMarkAsUnviewedClicked - ParameterNaming:EntryBottomActionMenu.kt$onMarkAsViewedClicked - ParameterNaming:EntryBottomActionMenu.kt$onMarkPreviousAsViewedClicked - ParameterNaming:EntryBottomActionMenu.kt$onRemoveBookmarkClicked - ParameterNaming:EntryDownloadDropdownMenu.kt$onDownloadClicked - ParameterNaming:EntryToolbar.kt$onBackClicked - ParameterNaming:EpisodeListDialog.kt$onBookmarkClicked - ParameterNaming:EpisodeListDialog.kt$onEpisodeClicked - ParameterNaming:EpisodeOptionsDialogScreen.kt$onCopyClicked - ParameterNaming:EpisodeOptionsDialogScreen.kt$onDownloadClicked - ParameterNaming:EpisodeOptionsDialogScreen.kt$onExtDownloadClicked - ParameterNaming:EpisodeOptionsDialogScreen.kt$onExtPlayerClicked - ParameterNaming:EpisodeOptionsDialogScreen.kt$onIntPlayerClicked - ParameterNaming:EpisodeSettingsDialog.kt$onBookmarkedFilterChanged - ParameterNaming:EpisodeSettingsDialog.kt$onConfirmed - ParameterNaming:EpisodeSettingsDialog.kt$onDisplayModeChanged - ParameterNaming:EpisodeSettingsDialog.kt$onDownloadFilterChanged - ParameterNaming:EpisodeSettingsDialog.kt$onItemSelected - ParameterNaming:EpisodeSettingsDialog.kt$onSortModeChanged - ParameterNaming:EpisodeSettingsDialog.kt$onUnseenFilterChanged - ParameterNaming:ItemsDialogs.kt$onValueChanged - ParameterNaming:ListPreferenceWidget.kt$onSelected - ParameterNaming:MangaInfoHeader.kt$onAddToLibraryClicked - ParameterNaming:MangaInfoHeader.kt$onEditIntervalClicked - ParameterNaming:MangaInfoHeader.kt$onTrackingClicked - ParameterNaming:MangaInfoHeader.kt$onWebViewClicked - ParameterNaming:MangaInfoHeader.kt$onWebViewLongClicked - ParameterNaming:MangaLibraryComfortableGrid.kt$onGlobalSearchClicked - ParameterNaming:MangaLibraryCompactGrid.kt$onGlobalSearchClicked - ParameterNaming:MangaLibraryContent.kt$onContinueReadingClicked - ParameterNaming:MangaLibraryContent.kt$onGlobalSearchClicked - ParameterNaming:MangaLibraryContent.kt$onMangaClicked - ParameterNaming:MangaLibraryList.kt$onGlobalSearchClicked - ParameterNaming:MangaLibraryPager.kt$onGlobalSearchClicked - ParameterNaming:MangaScreen.kt$onAddToLibraryClicked - ParameterNaming:MangaScreen.kt$onAllChapterSelected - ParameterNaming:MangaScreen.kt$onBackClicked - ParameterNaming:MangaScreen.kt$onChapterClicked - ParameterNaming:MangaScreen.kt$onChapterSelected - ParameterNaming:MangaScreen.kt$onCoverClicked - ParameterNaming:MangaScreen.kt$onDownloadActionClicked - ParameterNaming:MangaScreen.kt$onEditCategoryClicked - ParameterNaming:MangaScreen.kt$onEditFetchIntervalClicked - ParameterNaming:MangaScreen.kt$onEditIntervalClicked - ParameterNaming:MangaScreen.kt$onFilterButtonClicked - ParameterNaming:MangaScreen.kt$onFilterClicked - ParameterNaming:MangaScreen.kt$onMarkPreviousAsReadClicked - ParameterNaming:MangaScreen.kt$onMigrateClicked - ParameterNaming:MangaScreen.kt$onMultiBookmarkClicked - ParameterNaming:MangaScreen.kt$onMultiDeleteClicked - ParameterNaming:MangaScreen.kt$onMultiMarkAsReadClicked - ParameterNaming:MangaScreen.kt$onSettingsClicked - ParameterNaming:MangaScreen.kt$onShareClicked - ParameterNaming:MangaScreen.kt$onTrackingClicked - ParameterNaming:MangaScreen.kt$onWebViewClicked - ParameterNaming:MangaScreen.kt$onWebViewLongClicked - ParameterNaming:MangaTrackInfoDialogHome.kt$onRemoved - ParameterNaming:MangaUpdatesScreen.kt$onMultiBookmarkClicked - ParameterNaming:MangaUpdatesScreen.kt$onMultiDeleteClicked - ParameterNaming:MangaUpdatesScreen.kt$onMultiMarkAsReadClicked - ParameterNaming:MangaUpdatesScreen.kt$onUpdateSelected - ParameterNaming:PreferenceScaffold.kt$onBackPressed - ParameterNaming:ReaderAppBars.kt$onToggleBookmarked - ParameterNaming:SelectStorageCategory.kt$onCategorySelected - ParameterNaming:SettingsDownloadScreen.kt$SettingsDownloadScreen$onValueChanged - ParameterNaming:SettingsPlayerScreen.kt$SettingsPlayerScreen$onValueChanged - ParameterNaming:SpeedPickerDialog.kt$onSpeedChanged - ParameterNaming:StorageScreenContent.kt$onCategorySelected - ParameterNaming:StreamsCatalogSheet.kt$onAudioSelected - ParameterNaming:StreamsCatalogSheet.kt$onQualitySelected - ParameterNaming:StreamsCatalogSheet.kt$onSettingsClicked - ParameterNaming:StreamsCatalogSheet.kt$onSubtitleSelected - ParameterNaming:StreamsCatalogSheet.kt$onTrackSelected - ParameterNaming:SwitchPreferenceWidget.kt$onCheckedChanged - ParameterNaming:TabbedDialog.kt$onOverflowMenuClicked - ParameterNaming:TriStateListDialog.kt$onValueChanged - ParameterNaming:VideoChaptersSheet.kt$onVideoChapterSelected - ReturnCount:AndroidAnimeSourceManager.kt$AndroidAnimeSourceManager$private suspend fun createStubSource(id: Long): StubAnimeSource - ReturnCount:AndroidMangaSourceManager.kt$AndroidMangaSourceManager$private suspend fun createStubSource(id: Long): StubMangaSource - ReturnCount:AnimeCoverFetcher.kt$AnimeCoverFetcher$private suspend fun httpLoader(): FetchResult - ReturnCount:AnimeDownload.kt$AnimeDownload.Companion$suspend fun fromEpisodeId( episodeId: Long, getEpisode: GetEpisode = Injekt.get(), getAnimeById: GetAnime = Injekt.get(), sourceManager: AnimeSourceManager = Injekt.get(), ): AnimeDownload? - ReturnCount:AnimeDownloadCache.kt$AnimeDownloadCache$fun isEpisodeDownloaded( episodeName: String, episodeScanlator: String?, animeTitle: String, sourceId: Long, skipCache: Boolean, ): Boolean - ReturnCount:AnimeDownloadManager.kt$AnimeDownloadManager$fun renameSource(oldSource: AnimeSource, newSource: AnimeSource) - ReturnCount:AnimeDownloader.kt$AnimeDownloader$private fun parseDuration(durationString: String): Long? - ReturnCount:AnimeExtensionInstallReceiver.kt$AnimeExtensionInstallReceiver$override fun onReceive(context: Context, intent: Intent?) - ReturnCount:AnimeExtensionInstallService.kt$AnimeExtensionInstallService$override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int - ReturnCount:AnimeExtensionInstaller.kt$AnimeExtensionInstaller.DownloadCompletionReceiver$override fun onReceive(context: Context, intent: Intent?) - ReturnCount:AnimeExtensionLoader.kt$AnimeExtensionLoader$fun installPrivateExtensionFile(context: Context, file: File): Boolean - ReturnCount:AnimeExtensionLoader.kt$AnimeExtensionLoader$private fun loadExtension(context: Context, extensionInfo: AnimeExtensionInfo): AnimeLoadResult - ReturnCount:AnimeExtensionLoader.kt$AnimeExtensionLoader$private fun selectExtensionPackage(shared: AnimeExtensionInfo?, private: AnimeExtensionInfo?): AnimeExtensionInfo? - ReturnCount:AnimeExtensions.kt$fun Anime.prepUpdateCover(coverCache: AnimeCoverCache, remoteAnime: SAnime, refreshSameUrl: Boolean): Anime - ReturnCount:AnimeExtensions.kt$fun Anime.removeCovers(coverCache: AnimeCoverCache = Injekt.get()): Anime - ReturnCount:AnimeExtensions.kt$fun Anime.shouldDownloadNewEpisodes(dbCategories: List<Long>, preferences: DownloadPreferences): Boolean - ReturnCount:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$override suspend fun doWork(): Result - ReturnCount:AnimeScreen.kt$AnimeScreen$private fun getAnimeUrl(anime_: Anime?, source_: AnimeSource?): String? - ReturnCount:AnimeScreenModel.kt$AnimeScreenModel$fun runEpisodeDownloadActions( items: List<EpisodeList.Item>, action: EpisodeDownloadAction, ) - ReturnCount:BackupCreateJob.kt$BackupCreateJob$override suspend fun doWork(): Result - ReturnCount:BaseColorScheme.kt$BaseColorScheme$fun getColorScheme(isDark: Boolean, isAmoled: Boolean): ColorScheme - ReturnCount:CreateAniyomiExtensionRepo.kt$CreateAnimeExtensionRepo$fun await(name: String): Result - ReturnCount:CreateMangaExtensionRepo.kt$CreateMangaExtensionRepo$fun await(name: String): Result - ReturnCount:ExtensionInstallerPreference.kt$ExtensionInstallerPreference$private fun check(value: ExtensionInstaller): ExtensionInstaller - ReturnCount:ExternalIntents.kt$ExternalIntents$suspend fun getExternalIntent( context: Context, animeId: Long?, episodeId: Long?, chosenVideo: Video?, ): Intent? - ReturnCount:GestureHandler.kt$GestureHandler$override fun onDoubleTap(e: MotionEvent): Boolean - ReturnCount:GestureHandler.kt$GestureHandler$override fun onScroll( e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float, ): Boolean - ReturnCount:GestureHandler.kt$GestureHandler$override fun onSingleTapUp(e: MotionEvent): Boolean - ReturnCount:HttpPageLoader.kt$HttpPageLoader$private fun preloadNextPages(currentPage: ReaderPage, amount: Int): List<PriorityPage> - ReturnCount:JellyfinApi.kt$JellyfinApi$private suspend fun getTrackFromSeries(track: AnimeTrackSearch, url: HttpUrl): AnimeTrackSearch - ReturnCount:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String? - ReturnCount:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Double - ReturnCount:KitsuDateHelper.kt$KitsuDateHelper$fun parse(dateString: String?): Long - ReturnCount:MainActivity.kt$MainActivity$private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean - ReturnCount:MangaCoverFetcher.kt$MangaCoverFetcher$private suspend fun httpLoader(): FetchResult - ReturnCount:MangaDownload.kt$MangaDownload.Companion$suspend fun fromChapterId( chapterId: Long, getChapter: GetChapter = Injekt.get(), getManga: GetManga = Injekt.get(), sourceManager: MangaSourceManager = Injekt.get(), ): MangaDownload? - ReturnCount:MangaDownloadCache.kt$MangaDownloadCache$fun isChapterDownloaded( chapterName: String, chapterScanlator: String?, mangaTitle: String, sourceId: Long, skipCache: Boolean, ): Boolean - ReturnCount:MangaDownloadManager.kt$MangaDownloadManager$fun renameSource(oldSource: MangaSource, newSource: MangaSource) - ReturnCount:MangaDownloader.kt$MangaDownloader$private fun isDownloadSuccessful( download: MangaDownload, tmpDir: UniFile, ): Boolean - ReturnCount:MangaExtensionInstallReceiver.kt$MangaExtensionInstallReceiver$override fun onReceive(context: Context, intent: Intent?) - ReturnCount:MangaExtensionInstallService.kt$MangaExtensionInstallService$override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int - ReturnCount:MangaExtensionInstaller.kt$MangaExtensionInstaller.DownloadCompletionReceiver$override fun onReceive(context: Context, intent: Intent?) - ReturnCount:MangaExtensionLoader.kt$MangaExtensionLoader$fun installPrivateExtensionFile(context: Context, file: File): Boolean - ReturnCount:MangaExtensionLoader.kt$MangaExtensionLoader$private fun loadMangaExtension(context: Context, extensionInfo: MangaExtensionInfo): MangaLoadResult - ReturnCount:MangaExtensionLoader.kt$MangaExtensionLoader$private fun selectExtensionPackage(shared: MangaExtensionInfo?, private: MangaExtensionInfo?): MangaExtensionInfo? - ReturnCount:MangaExtensions.kt$fun Manga.prepUpdateCover(coverCache: MangaCoverCache, remoteManga: SManga, refreshSameUrl: Boolean): Manga - ReturnCount:MangaExtensions.kt$fun Manga.removeCovers(coverCache: MangaCoverCache = Injekt.get()): Manga - ReturnCount:MangaExtensions.kt$fun Manga.shouldDownloadNewChapters(dbCategories: List<Long>, preferences: DownloadPreferences): Boolean - ReturnCount:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$override suspend fun doWork(): Result - ReturnCount:MangaScreen.kt$MangaScreen$private fun getMangaUrl(manga_: Manga?, source_: MangaSource?): String? - ReturnCount:Migrations.kt$Migrations$fun upgrade( context: Context, preferenceStore: PreferenceStore, basePreferences: BasePreferences, uiPreferences: UiPreferences, networkPreferences: NetworkPreferences, sourcePreferences: SourcePreferences, securityPreferences: SecurityPreferences, libraryPreferences: LibraryPreferences, readerPreferences: ReaderPreferences, playerPreferences: PlayerPreferences, backupPreferences: BackupPreferences, trackerManager: TrackerManager, ): Boolean - ReturnCount:MyAnimeList.kt$MyAnimeList$override suspend fun searchAnime(query: String): List<AnimeTrackSearch> - ReturnCount:MyAnimeList.kt$MyAnimeList$override suspend fun searchManga(query: String): List<MangaTrackSearch> - ReturnCount:NetworkExtensions.kt$fun Context.isConnectedToWifi(): Boolean - ReturnCount:NetworkExtensions.kt$fun Context.isOnline(): Boolean - ReturnCount:NotificationReceiver.kt$NotificationReceiver$override fun onReceive(context: Context, intent: Intent) - ReturnCount:PagerPageHolder.kt$PagerPageHolder$private fun process(page: ReaderPage, imageStream: BufferedInputStream): InputStream - ReturnCount:PagerViewer.kt$PagerViewer$override fun handleKeyEvent(event: KeyEvent): Boolean - ReturnCount:PagerViewer.kt$PagerViewer$private fun checkAllowPreload(page: ReaderPage?): Boolean - ReturnCount:PagerViewerAdapter.kt$PagerViewerAdapter$fun onPageSplit(currentPage: Any?, newPage: InsertPage) - ReturnCount:PlayerActivity.kt$PlayerActivity$internal fun updatePip(start: Boolean) - ReturnCount:PlayerActivity.kt$PlayerActivity$override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean - ReturnCount:PlayerActivity.kt$PlayerActivity$private fun openContentFd(uri: Uri): String? - ReturnCount:PlayerViewModel.kt$PlayerViewModel$fun isEpisodeOnline(): Boolean? - ReturnCount:PlayerViewModel.kt$PlayerViewModel$fun onSecondReached(position: Int, duration: Int) - ReturnCount:PlayerViewModel.kt$PlayerViewModel$fun saveImage(imageStream: () -> InputStream, timePos: Int?) - ReturnCount:PlayerViewModel.kt$PlayerViewModel$fun shareImage(imageStream: () -> InputStream, timePos: Int?) - ReturnCount:PlayerViewModel.kt$PlayerViewModel$private fun downloadNextEpisodes() - ReturnCount:PlayerViewModel.kt$PlayerViewModel$private fun updateTrackEpisodeSeen(episode: Episode) - ReturnCount:PlayerViewModel.kt$PlayerViewModel$suspend fun aniSkipResponse(playerDuration: Int?): List<Stamp>? - ReturnCount:PlayerViewModel.kt$PlayerViewModel$suspend fun loadEpisode(episodeId: Long?): Pair<List<Video>?, String>? - ReturnCount:ReaderActivity.kt$ReaderActivity$override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean - ReturnCount:ReaderActivity.kt$ReaderActivity$private fun moveToPageIndex(index: Int) - ReturnCount:ReaderViewModel.kt$ReaderViewModel$fun getChapterUrl(): String? - ReturnCount:ReaderViewModel.kt$ReaderViewModel$fun setAsCover() - ReturnCount:ReaderViewModel.kt$ReaderViewModel$private fun downloadNextChapters() - ReturnCount:ReaderViewModel.kt$ReaderViewModel$private fun updateTrackChapterRead(readerChapter: ReaderChapter) - ReturnCount:ReaderViewModel.kt$ReaderViewModel$suspend fun preload(chapter: ReaderChapter) - ReturnCount:TvUtils.kt$fun isTvBox(context: Context): Boolean - ReturnCount:ViewExtensions.kt$fun View?.isVisibleOnScreen(): Boolean - ReturnCount:WebtoonFrame.kt$WebtoonFrame$override fun dispatchTouchEvent(ev: MotionEvent): Boolean - ReturnCount:WebtoonPageHolder.kt$WebtoonPageHolder$private fun process(imageStream: BufferedInputStream): InputStream - ReturnCount:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean - ReturnCount:WebtoonViewer.kt$WebtoonViewer$override fun handleKeyEvent(event: KeyEvent): Boolean - ReturnCount:WebtoonViewer.kt$WebtoonViewer$private fun checkAllowPreload(page: ReaderPage?): Boolean - SpreadOperator:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel$(*prefFlows) - SpreadOperator:AnimeSourcesScreenModel.kt$AnimeSourcesScreenModel$( AnimeSourceUiModel.Header(it.key), *it.value.map { source -> AnimeSourceUiModel.Item(source) }.toTypedArray(), ) - SpreadOperator:CommonStorageScreenModel.kt$CommonStorageScreenModel$(AllCategory, *categories.toTypedArray()) - SpreadOperator:MangaLibraryScreenModel.kt$MangaLibraryScreenModel$(*prefFlows) - SpreadOperator:MangaSourcesScreenModel.kt$MangaSourcesScreenModel$( MangaSourceUiModel.Header(it.key), *it.value.map { source -> MangaSourceUiModel.Item(source) }.toTypedArray(), ) - SwallowedException:AboutScreen.kt$AboutScreen$e: Exception - SwallowedException:AniChartApi.kt$AniChartApi$e: Exception - SwallowedException:AniSkipApi.kt$AniSkipApi$e: Exception - SwallowedException:Anilist.kt$Anilist$e: ClassCastException - SwallowedException:Anilist.kt$Anilist$e: Exception - SwallowedException:Anilist.kt$Anilist$e: Throwable - SwallowedException:AnilistModels.kt$ALAnime$e: Exception - SwallowedException:AnilistModels.kt$ALManga$e: Exception - SwallowedException:AnimeDownloadPendingDeleter.kt$AnimeDownloadPendingDeleter$e: Exception - SwallowedException:AnimeDownloadStore.kt$AnimeDownloadStore$e: Exception - SwallowedException:AnimeDownloader.kt$AnimeDownloader$e: Exception - SwallowedException:AnimeExtensionLoader.kt$AnimeExtensionLoader$error: PackageManager.NameNotFoundException - SwallowedException:AnimeMetadataUpdateJob.kt$AnimeMetadataUpdateJob$e: Exception - SwallowedException:AnimeScreen.kt$AnimeScreen$e: Exception - SwallowedException:AnimeTrackInfoDialog.kt$AnimeTrackInfoDialogHomeScreen.Model$e: Exception - SwallowedException:BackupRestorer.kt$BackupRestorer$e: Exception - SwallowedException:Bangumi.kt$Bangumi$e: Exception - SwallowedException:Bangumi.kt$Bangumi$e: Throwable - SwallowedException:BrowseAnimeIcons.kt$e: Exception - SwallowedException:BrowseMangaIcons.kt$e: Exception - SwallowedException:ChapterCache.kt$ChapterCache$e: IOException - SwallowedException:ChapterLoader.kt$ChapterLoader$e: UnsupportedRarV5Exception - SwallowedException:ContextExtensions.kt$e: Exception - SwallowedException:ContextExtensions.kt$e: PackageManager.NameNotFoundException - SwallowedException:CrashLogUtil.kt$CrashLogUtil$e: Throwable - SwallowedException:CreateBackupScreen.kt$CreateBackupScreen$e: ActivityNotFoundException - SwallowedException:EpisodeLoader.kt$EpisodeLoader.Companion$e: Throwable - SwallowedException:ExternalIntents.kt$ExternalIntents$e: PackageManager.NameNotFoundException - SwallowedException:Jellyfin.kt$Jellyfin$e: Exception - SwallowedException:Kavita.kt$Kavita$e: Exception - SwallowedException:KavitaApi.kt$KavitaApi$e: SocketTimeoutException - SwallowedException:Kitsu.kt$Kitsu$e: Exception - SwallowedException:KitsuModels.kt$KitsuSearchAnime$e: IllegalArgumentException - SwallowedException:KitsuModels.kt$KitsuSearchManga$e: IllegalArgumentException - SwallowedException:Komga.kt$Komga$e: Exception - SwallowedException:MangaDownloadPendingDeleter.kt$MangaDownloadPendingDeleter$e: Exception - SwallowedException:MangaDownloadStore.kt$MangaDownloadStore$e: Exception - SwallowedException:MangaDownloader.kt$MangaDownloader$e: Throwable - SwallowedException:MangaExtensionLoader.kt$MangaExtensionLoader$error: PackageManager.NameNotFoundException - SwallowedException:MangaMetadataUpdateJob.kt$MangaMetadataUpdateJob$e: Exception - SwallowedException:MangaScreen.kt$MangaScreen$e: Exception - SwallowedException:MangaTrackInfoDialog.kt$MangaTrackInfoDialogHomeScreen.Model$e: Exception - SwallowedException:MangaUpdates.kt$MangaUpdates$e: Exception - SwallowedException:MangaUpdatesApi.kt$MangaUpdatesApi$e: Exception - SwallowedException:Migrations.kt$Migrations$e: ClassCastException - SwallowedException:MyAnimeList.kt$MyAnimeList$e: Exception - SwallowedException:MyAnimeList.kt$MyAnimeList$e: Throwable - SwallowedException:MyAnimeListApi.kt$MyAnimeListApi$e: Exception - SwallowedException:Pager.kt$Pager$e: IllegalArgumentException - SwallowedException:Pager.kt$Pager$e: IndexOutOfBoundsException - SwallowedException:Pager.kt$Pager$e: NullPointerException - SwallowedException:PlayerViewModel.kt$PlayerViewModel$e: Exception - SwallowedException:RarPageLoader.kt$RarPageLoader$e: Exception - SwallowedException:ReaderActivity.kt$ReaderActivity$e: ArrayIndexOutOfBoundsException - SwallowedException:ReaderViewModel.kt$ReaderViewModel$e: Exception - SwallowedException:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$e: ActivityNotFoundException - SwallowedException:SettingsDataScreen.kt$SettingsDataScreen$e: ActivityNotFoundException - SwallowedException:Shikimori.kt$Shikimori$e: Exception - SwallowedException:Shikimori.kt$Shikimori$e: Throwable - SwallowedException:Simkl.kt$Simkl$e: Exception - SwallowedException:Simkl.kt$Simkl$e: Throwable - SwallowedException:StorageStep.kt$StorageStep$e: ActivityNotFoundException - SwallowedException:Suwayomi.kt$Suwayomi$e: Exception - ThrowingExceptionsWithoutMessageOrCause:AnimeScreenModel.kt$AnimeScreenModel$IllegalStateException() - ThrowingExceptionsWithoutMessageOrCause:AnimeTrackInfoDialog.kt$AnimeTrackInfoDialogHomeScreen.Model$Exception() - ThrowingExceptionsWithoutMessageOrCause:MangaScreenModel.kt$MangaScreenModel$IllegalStateException() - ThrowingExceptionsWithoutMessageOrCause:MangaTrackInfoDialog.kt$MangaTrackInfoDialogHomeScreen.Model$Exception() - ThrowingExceptionsWithoutMessageOrCause:PackageInstallerInstallerAnime.kt$PackageInstallerInstallerAnime$IllegalStateException() - ThrowingExceptionsWithoutMessageOrCause:PackageInstallerInstallerManga.kt$PackageInstallerInstallerManga$IllegalStateException() - ThrowingExceptionsWithoutMessageOrCause:ShizukuInstallerAnime.kt$ShizukuInstallerAnime$IllegalStateException() - ThrowingExceptionsWithoutMessageOrCause:ShizukuInstallerManga.kt$ShizukuInstallerManga$IllegalStateException() - ThrowsCount:AnimeDownloader.kt$AnimeDownloader$private suspend fun httpDownload( download: AnimeDownload, tmpDir: UniFile, filename: String, threadNumber: Int, safeDownload: Boolean, ): UniFile - ThrowsCount:BackupCreator.kt$BackupCreator$suspend fun backup(uri: Uri, options: BackupOptions): String - ThrowsCount:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String? - ThrowsCount:PlayerViewModel.kt$PlayerViewModel$suspend fun init( animeId: Long, initialEpisodeId: Long, vidList: String, vidIndex: Int, ): Pair<InitResult, Result<Boolean>> - TooGenericExceptionCaught:AboutScreen.kt$AboutScreen$e: Exception - TooGenericExceptionCaught:AddAnimeTracks.kt$AddAnimeTracks$e: Exception - TooGenericExceptionCaught:AddMangaTracks.kt$AddMangaTracks$e: Exception - TooGenericExceptionCaught:AniChartApi.kt$AniChartApi$e: Exception - TooGenericExceptionCaught:AniSkipApi.kt$AniSkipApi$e: Exception - TooGenericExceptionCaught:Anilist.kt$Anilist$e: Exception - TooGenericExceptionCaught:Anilist.kt$Anilist$e: Throwable - TooGenericExceptionCaught:AnilistModels.kt$ALAnime$e: Exception - TooGenericExceptionCaught:AnilistModels.kt$ALManga$e: Exception - TooGenericExceptionCaught:AnimeCoverFetcher.kt$AnimeCoverFetcher$e: Exception - TooGenericExceptionCaught:AnimeCoverScreenModel.kt$AnimeCoverScreenModel$e: Exception - TooGenericExceptionCaught:AnimeCoverScreenModel.kt$AnimeCoverScreenModel$e: Throwable - TooGenericExceptionCaught:AnimeDownloadCache.kt$AnimeDownloadCache$e: Throwable - TooGenericExceptionCaught:AnimeDownloadPendingDeleter.kt$AnimeDownloadPendingDeleter$e: Exception - TooGenericExceptionCaught:AnimeDownloadProvider.kt$AnimeDownloadProvider$e: Throwable - TooGenericExceptionCaught:AnimeDownloadStore.kt$AnimeDownloadStore$e: Exception - TooGenericExceptionCaught:AnimeDownloader.kt$AnimeDownloader$e: Exception - TooGenericExceptionCaught:AnimeDownloader.kt$AnimeDownloader$e: Throwable - TooGenericExceptionCaught:AnimeExtensionApi.kt$AnimeExtensionApi$e: Throwable - TooGenericExceptionCaught:AnimeExtensionDetailsScreenModel.kt$AnimeExtensionDetailsScreenModel$e: Exception - TooGenericExceptionCaught:AnimeExtensionInstallActivity.kt$AnimeExtensionInstallActivity$error: Exception - TooGenericExceptionCaught:AnimeExtensionInstaller.kt$AnimeExtensionInstaller$e: Exception - TooGenericExceptionCaught:AnimeExtensionLoader.kt$AnimeExtensionLoader$e: Exception - TooGenericExceptionCaught:AnimeExtensionLoader.kt$AnimeExtensionLoader$e: Throwable - TooGenericExceptionCaught:AnimeExtensionManager.kt$AnimeExtensionManager$e: Exception - TooGenericExceptionCaught:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$e: Exception - TooGenericExceptionCaught:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob$e: Throwable - TooGenericExceptionCaught:AnimeMetadataUpdateJob.kt$AnimeMetadataUpdateJob$e: Exception - TooGenericExceptionCaught:AnimeMetadataUpdateJob.kt$AnimeMetadataUpdateJob$e: Throwable - TooGenericExceptionCaught:AnimeScreen.kt$AnimeScreen$e: Exception - TooGenericExceptionCaught:AnimeScreenModel.kt$AnimeScreenModel$e: Throwable - TooGenericExceptionCaught:AnimeSearchScreenModel.kt$AnimeSearchScreenModel$e: Exception - TooGenericExceptionCaught:AnimeTrackInfoDialog.kt$AnimeTrackInfoDialogHomeScreen.Model$e: Exception - TooGenericExceptionCaught:AnimeTrackInfoDialog.kt$TrackServiceSearchScreen.Model$e: Throwable - TooGenericExceptionCaught:AnimeTracker.kt$AnimeTracker$e: Exception - TooGenericExceptionCaught:AnimeTracker.kt$AnimeTracker$e: Throwable - TooGenericExceptionCaught:App.kt$App$e: Exception - TooGenericExceptionCaught:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$e: Exception - TooGenericExceptionCaught:BackupCreateJob.kt$BackupCreateJob$e: Exception - TooGenericExceptionCaught:BackupCreator.kt$BackupCreator$e: Exception - TooGenericExceptionCaught:BackupFileValidator.kt$BackupFileValidator$e: Exception - TooGenericExceptionCaught:BackupRestoreJob.kt$BackupRestoreJob$e: Exception - TooGenericExceptionCaught:BackupRestorer.kt$BackupRestorer$e: Exception - TooGenericExceptionCaught:Bangumi.kt$Bangumi$e: Exception - TooGenericExceptionCaught:Bangumi.kt$Bangumi$e: Throwable - TooGenericExceptionCaught:BrowseAnimeIcons.kt$e: Exception - TooGenericExceptionCaught:BrowseMangaIcons.kt$e: Exception - TooGenericExceptionCaught:ChapterCache.kt$ChapterCache$e: Exception - TooGenericExceptionCaught:ChapterLoader.kt$ChapterLoader$e: Throwable - TooGenericExceptionCaught:CloseableExtensions.kt$closeException: Throwable - TooGenericExceptionCaught:CloseableExtensions.kt$e: Throwable - TooGenericExceptionCaught:ContextExtensions.kt$e: Exception - TooGenericExceptionCaught:ContextExtensions.kt$e: Throwable - TooGenericExceptionCaught:CrashLogUtil.kt$CrashLogUtil$e: Throwable - TooGenericExceptionCaught:EpisodeLoader.kt$EpisodeLoader.Companion$e: Exception - TooGenericExceptionCaught:EpisodeLoader.kt$EpisodeLoader.Companion$e: Throwable - TooGenericExceptionCaught:EpisodeOptionsDialogScreen.kt$EpisodeOptionsDialogScreenModel$e: Throwable - TooGenericExceptionCaught:GlobalExceptionHandler.kt$GlobalExceptionHandler.Companion$e: Exception - TooGenericExceptionCaught:HttpPageLoader.kt$HttpPageLoader$e: Throwable - TooGenericExceptionCaught:ImageSaver.kt$ImageSaver$e: Exception - TooGenericExceptionCaught:Jellyfin.kt$Jellyfin$e: Exception - TooGenericExceptionCaught:JellyfinApi.kt$JellyfinApi$e: Exception - TooGenericExceptionCaught:Kavita.kt$Kavita$e: Exception - TooGenericExceptionCaught:KavitaApi.kt$KavitaApi$e: Exception - TooGenericExceptionCaught:Kitsu.kt$Kitsu$e: Exception - TooGenericExceptionCaught:Komga.kt$Komga$e: Exception - TooGenericExceptionCaught:KomgaApi.kt$KomgaApi$e: Exception - TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception - TooGenericExceptionCaught:MainActivity.kt$MainActivity.Companion$e: Exception - TooGenericExceptionCaught:MangaCoverFetcher.kt$MangaCoverFetcher$e: Exception - TooGenericExceptionCaught:MangaCoverScreenModel.kt$MangaCoverScreenModel$e: Exception - TooGenericExceptionCaught:MangaCoverScreenModel.kt$MangaCoverScreenModel$e: Throwable - TooGenericExceptionCaught:MangaDownloadCache.kt$MangaDownloadCache$e: Throwable - TooGenericExceptionCaught:MangaDownloadPendingDeleter.kt$MangaDownloadPendingDeleter$e: Exception - TooGenericExceptionCaught:MangaDownloadProvider.kt$MangaDownloadProvider$e: Throwable - TooGenericExceptionCaught:MangaDownloadStore.kt$MangaDownloadStore$e: Exception - TooGenericExceptionCaught:MangaDownloader.kt$MangaDownloader$e: Exception - TooGenericExceptionCaught:MangaDownloader.kt$MangaDownloader$e: Throwable - TooGenericExceptionCaught:MangaDownloader.kt$MangaDownloader$error: Throwable - TooGenericExceptionCaught:MangaExtensionApi.kt$MangaExtensionApi$e: Throwable - TooGenericExceptionCaught:MangaExtensionDetailsScreenModel.kt$MangaExtensionDetailsScreenModel$e: Exception - TooGenericExceptionCaught:MangaExtensionInstallActivity.kt$MangaExtensionInstallActivity$error: Exception - TooGenericExceptionCaught:MangaExtensionInstaller.kt$MangaExtensionInstaller$e: Exception - TooGenericExceptionCaught:MangaExtensionLoader.kt$MangaExtensionLoader$e: Exception - TooGenericExceptionCaught:MangaExtensionLoader.kt$MangaExtensionLoader$e: Throwable - TooGenericExceptionCaught:MangaExtensionManager.kt$MangaExtensionManager$e: Exception - TooGenericExceptionCaught:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$e: Exception - TooGenericExceptionCaught:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob$e: Throwable - TooGenericExceptionCaught:MangaMetadataUpdateJob.kt$MangaMetadataUpdateJob$e: Exception - TooGenericExceptionCaught:MangaMetadataUpdateJob.kt$MangaMetadataUpdateJob$e: Throwable - TooGenericExceptionCaught:MangaScreen.kt$MangaScreen$e: Exception - TooGenericExceptionCaught:MangaScreenModel.kt$MangaScreenModel$e: Throwable - TooGenericExceptionCaught:MangaSearchScreenModel.kt$MangaSearchScreenModel$e: Exception - TooGenericExceptionCaught:MangaTrackInfoDialog.kt$MangaTrackInfoDialogHomeScreen.Model$e: Exception - TooGenericExceptionCaught:MangaTrackInfoDialog.kt$TrackServiceSearchScreen.Model$e: Throwable - TooGenericExceptionCaught:MangaTracker.kt$MangaTracker$e: Exception - TooGenericExceptionCaught:MangaTracker.kt$MangaTracker$e: Throwable - TooGenericExceptionCaught:MangaUpdates.kt$MangaUpdates$e: Exception - TooGenericExceptionCaught:MangaUpdatesApi.kt$MangaUpdatesApi$e: Exception - TooGenericExceptionCaught:MyAnimeList.kt$MyAnimeList$e: Exception - TooGenericExceptionCaught:MyAnimeList.kt$MyAnimeList$e: Throwable - TooGenericExceptionCaught:MyAnimeListApi.kt$MyAnimeListApi$e: Exception - TooGenericExceptionCaught:OkioExtensions.kt$e: Exception - TooGenericExceptionCaught:PackageInstallerInstallerAnime.kt$PackageInstallerInstallerAnime$e: Exception - TooGenericExceptionCaught:PackageInstallerInstallerManga.kt$PackageInstallerInstallerManga$e: Exception - TooGenericExceptionCaught:Pager.kt$Pager$e: IndexOutOfBoundsException - TooGenericExceptionCaught:Pager.kt$Pager$e: NullPointerException - TooGenericExceptionCaught:PagerPageHolder.kt$PagerPageHolder$e: Throwable - TooGenericExceptionCaught:PlayerActivity.kt$PlayerActivity$e: Exception - TooGenericExceptionCaught:PlayerViewModel.kt$PlayerViewModel$e: Exception - TooGenericExceptionCaught:PlayerViewModel.kt$PlayerViewModel$e: Throwable - TooGenericExceptionCaught:RarPageLoader.kt$RarPageLoader$e: Exception - TooGenericExceptionCaught:ReaderActivity.kt$ReaderActivity$e: ArrayIndexOutOfBoundsException - TooGenericExceptionCaught:ReaderViewModel.kt$ReaderViewModel$e: Exception - TooGenericExceptionCaught:ReaderViewModel.kt$ReaderViewModel$e: Throwable - TooGenericExceptionCaught:RefreshAnimeTracks.kt$RefreshAnimeTracks$e: Throwable - TooGenericExceptionCaught:RefreshMangaTracks.kt$RefreshMangaTracks$e: Throwable - TooGenericExceptionCaught:RestoreBackupScreen.kt$RestoreBackupScreenModel$e: Exception - TooGenericExceptionCaught:SetReadStatus.kt$SetReadStatus$e: Exception - TooGenericExceptionCaught:SetSeenStatus.kt$SetSeenStatus$e: Exception - TooGenericExceptionCaught:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$e: Throwable - TooGenericExceptionCaught:SettingsDataScreen.kt$SettingsDataScreen$e: Throwable - TooGenericExceptionCaught:SettingsTrackingScreen.kt$SettingsTrackingScreen$e: Throwable - TooGenericExceptionCaught:Shikimori.kt$Shikimori$e: Exception - TooGenericExceptionCaught:Shikimori.kt$Shikimori$e: Throwable - TooGenericExceptionCaught:ShizukuInstallerAnime.kt$ShizukuInstallerAnime$e: Exception - TooGenericExceptionCaught:ShizukuInstallerManga.kt$ShizukuInstallerManga$e: Exception - TooGenericExceptionCaught:Simkl.kt$Simkl$e: Exception - TooGenericExceptionCaught:Simkl.kt$Simkl$e: Throwable - TooGenericExceptionCaught:Suwayomi.kt$Suwayomi$e: Exception - TooGenericExceptionCaught:SyncChapterProgressWithTrack.kt$SyncChapterProgressWithTrack$e: Throwable - TooGenericExceptionCaught:SyncEpisodeProgressWithTrack.kt$SyncEpisodeProgressWithTrack$e: Throwable - TooGenericExceptionCaught:TrackChapter.kt$TrackChapter$e: Exception - TooGenericExceptionCaught:WebViewActivity.kt$WebViewActivity$e: Exception - TooGenericExceptionCaught:WebViewScreenModel.kt$WebViewScreenModel$e: Exception - TooGenericExceptionCaught:WebtoonPageHolder.kt$WebtoonPageHolder$e: Throwable - TooGenericExceptionThrown:Anilist.kt$Anilist$throw Exception("$track not found on user library") - TooGenericExceptionThrown:Anilist.kt$Anilist$throw Exception("Unknown score type") - TooGenericExceptionThrown:AnilistApi.kt$AnilistApi$throw Exception("Could not find anime") - TooGenericExceptionThrown:AnilistApi.kt$AnilistApi$throw Exception("Could not find manga") - TooGenericExceptionThrown:AnilistInterceptor.kt$AnilistInterceptor$throw Exception("Not authenticated with Anilist") - TooGenericExceptionThrown:AnimeDownloadManager.kt$AnimeDownloadManager$throw Exception(context.stringResource(MR.strings.video_list_empty_error)) - TooGenericExceptionThrown:AnimeDownloadProvider.kt$AnimeDownloadProvider$throw Exception( context.stringResource( MR.strings.invalid_location, downloadsDir?.displayablePath ?: "", ), ) - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception( "Launch intent not found", ) - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Base file not found") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Cannot merge tmp part file") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Could not get video size") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Download failed") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Download has been stopped") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Download stopped") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Downloaded file not found") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Error in ffmpeg!") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception("Unable to finalize download") - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception(context.stringResource(MR.strings.download_insufficient_space)) - TooGenericExceptionThrown:AnimeDownloader.kt$AnimeDownloader$throw Exception(context.stringResource(MR.strings.video_list_empty_error)) - TooGenericExceptionThrown:AnimeExtensionLoader.kt$AnimeExtensionLoader$throw Exception("Unknown source class type: ${obj.javaClass}") - TooGenericExceptionThrown:AnimeTrackInfoDialog.kt$AnimeTrackInfoDialogHomeScreen.Model$throw Exception() - TooGenericExceptionThrown:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$throw Exception("Unsuccessful response") - TooGenericExceptionThrown:BangumiApi.kt$BangumiApi$throw Exception("Null Response") - TooGenericExceptionThrown:BangumiInterceptor.kt$BangumiInterceptor$throw Exception("Not authenticated with Bangumi") - TooGenericExceptionThrown:ChapterLoader.kt$ChapterLoader$throw Exception(context.stringResource(MR.strings.page_list_empty_error)) - TooGenericExceptionThrown:ExternalIntents.kt$ExternalIntents$throw Exception("Video list is empty") - TooGenericExceptionThrown:Jellyfin.kt$Jellyfin$throw Exception("Not used") - TooGenericExceptionThrown:KitsuApi.kt$KitsuApi$throw Exception("Could not find anime") - TooGenericExceptionThrown:KitsuApi.kt$KitsuApi$throw Exception("Could not find manga") - TooGenericExceptionThrown:KitsuInterceptor.kt$KitsuInterceptor$throw Exception("Not authenticated with Kitsu") - TooGenericExceptionThrown:KitsuModels.kt$KitsuLibAnime$throw Exception("Unknown status") - TooGenericExceptionThrown:KitsuModels.kt$KitsuLibManga$throw Exception("Unknown status") - TooGenericExceptionThrown:KitsuModels.kt$throw Exception("Unknown status") - TooGenericExceptionThrown:Komga.kt$Komga$throw Exception( "Not used", ) - TooGenericExceptionThrown:MangaDownloadManager.kt$MangaDownloadManager$throw Exception(context.stringResource(MR.strings.page_list_empty_error)) - TooGenericExceptionThrown:MangaDownloadProvider.kt$MangaDownloadProvider$throw Exception( context.stringResource( MR.strings.invalid_location, downloadsDir?.displayablePath ?: "", ), ) - TooGenericExceptionThrown:MangaDownloader.kt$MangaDownloader$throw Exception(context.stringResource(MR.strings.page_list_empty_error)) - TooGenericExceptionThrown:MangaExtensionLoader.kt$MangaExtensionLoader$throw Exception("Unknown source class type: ${obj.javaClass}") - TooGenericExceptionThrown:MangaTrackInfoDialog.kt$MangaTrackInfoDialogHomeScreen.Model$throw Exception() - TooGenericExceptionThrown:MangaUpdates.kt$MangaUpdates$throw Throwable( "Unable to login", ) - TooGenericExceptionThrown:PlayerViewModel.kt$PlayerViewModel$throw Exception("No episode loaded.") - TooGenericExceptionThrown:PlayerViewModel.kt$PlayerViewModel$throw Exception("Video list is empty.") - TooGenericExceptionThrown:PlayerViewModel.kt$PlayerViewModel$throw Exception("Video selected from empty list?") - TooGenericExceptionThrown:ShikimoriApi.kt$ShikimoriApi$throw Exception("Too much animes in response") - TooGenericExceptionThrown:ShikimoriApi.kt$ShikimoriApi$throw Exception("Too much mangas in response") - TooGenericExceptionThrown:ShikimoriInterceptor.kt$ShikimoriInterceptor$throw Exception("Not authenticated with Shikimori") - TooGenericExceptionThrown:ShizukuInstallerAnime.kt$ShizukuInstallerAnime$throw RuntimeException("Failed to commit install session $sessionId") - TooGenericExceptionThrown:ShizukuInstallerAnime.kt$ShizukuInstallerAnime$throw RuntimeException("Failed to create install session") - TooGenericExceptionThrown:ShizukuInstallerAnime.kt$ShizukuInstallerAnime$throw RuntimeException("Failed to write APK to session $sessionId") - TooGenericExceptionThrown:ShizukuInstallerManga.kt$ShizukuInstallerManga$throw RuntimeException("Failed to commit install session $sessionId") - TooGenericExceptionThrown:ShizukuInstallerManga.kt$ShizukuInstallerManga$throw RuntimeException("Failed to create install session") - TooGenericExceptionThrown:ShizukuInstallerManga.kt$ShizukuInstallerManga$throw RuntimeException("Failed to write APK to session $sessionId") - TooGenericExceptionThrown:SimklInterceptor.kt$SimklInterceptor$throw Exception("Not authenticated with Simkl") - TooManyFunctions:Anilist.kt$Anilist : BaseTrackerMangaTrackerAnimeTrackerDeletableMangaTrackerDeletableAnimeTracker - TooManyFunctions:AnilistApi.kt$AnilistApi - TooManyFunctions:AnimeCoverFetcher.kt$AnimeCoverFetcher : Fetcher - TooManyFunctions:AnimeDownloadCache.kt$AnimeDownloadCache - TooManyFunctions:AnimeDownloadManager.kt$AnimeDownloadManager - TooManyFunctions:AnimeDownloadProvider.kt$AnimeDownloadProvider - TooManyFunctions:AnimeDownloadQueueScreenModel.kt$AnimeDownloadQueueScreenModel : ScreenModel - TooManyFunctions:AnimeDownloader.kt$AnimeDownloader - TooManyFunctions:AnimeExtensionLoader.kt$AnimeExtensionLoader - TooManyFunctions:AnimeExtensionManager.kt$AnimeExtensionManager - TooManyFunctions:AnimeExtensionsScreenModel.kt$AnimeExtensionsScreenModel : StateScreenModel - TooManyFunctions:AnimeLibraryScreenModel.kt$AnimeLibraryScreenModel : StateScreenModel - TooManyFunctions:AnimeRestorer.kt$AnimeRestorer - TooManyFunctions:AnimeScreenModel.kt$AnimeScreenModel : StateScreenModel - TooManyFunctions:AnimeTracker.kt$AnimeTracker - TooManyFunctions:AnimeUpdatesScreenModel.kt$AnimeUpdatesScreenModel : StateScreenModel - TooManyFunctions:Bangumi.kt$Bangumi : BaseTrackerMangaTrackerAnimeTracker - TooManyFunctions:BangumiApi.kt$BangumiApi - TooManyFunctions:BrowseAnimeSourceScreenModel.kt$BrowseAnimeSourceScreenModel : StateScreenModel - TooManyFunctions:BrowseMangaSourceScreenModel.kt$BrowseMangaSourceScreenModel : StateScreenModel - TooManyFunctions:ChapterTransition.kt$eu.kanade.presentation.reader.ChapterTransition.kt - TooManyFunctions:ContextExtensions.kt$eu.kanade.tachiyomi.util.system.ContextExtensions.kt - TooManyFunctions:ExternalIntents.kt$ExternalIntents - TooManyFunctions:Jellyfin.kt$Jellyfin : BaseTrackerEnhancedAnimeTrackerAnimeTracker - TooManyFunctions:Kavita.kt$Kavita : BaseTrackerEnhancedMangaTrackerMangaTracker - TooManyFunctions:Kitsu.kt$Kitsu : BaseTrackerAnimeTrackerMangaTrackerDeletableMangaTrackerDeletableAnimeTracker - TooManyFunctions:KitsuApi.kt$KitsuApi - TooManyFunctions:Komga.kt$Komga : BaseTrackerEnhancedMangaTrackerMangaTracker - TooManyFunctions:MangaCoverFetcher.kt$MangaCoverFetcher : Fetcher - TooManyFunctions:MangaDownloadCache.kt$MangaDownloadCache - TooManyFunctions:MangaDownloadManager.kt$MangaDownloadManager - TooManyFunctions:MangaDownloadProvider.kt$MangaDownloadProvider - TooManyFunctions:MangaDownloadQueueScreenModel.kt$MangaDownloadQueueScreenModel : ScreenModel - TooManyFunctions:MangaDownloader.kt$MangaDownloader - TooManyFunctions:MangaExtensionLoader.kt$MangaExtensionLoader - TooManyFunctions:MangaExtensionManager.kt$MangaExtensionManager - TooManyFunctions:MangaExtensionsScreenModel.kt$MangaExtensionsScreenModel : StateScreenModel - TooManyFunctions:MangaLibraryScreenModel.kt$MangaLibraryScreenModel : StateScreenModel - TooManyFunctions:MangaRestorer.kt$MangaRestorer - TooManyFunctions:MangaScreenModel.kt$MangaScreenModel : StateScreenModel - TooManyFunctions:MangaTracker.kt$MangaTracker - TooManyFunctions:MangaUpdates.kt$MangaUpdates : BaseTrackerMangaTrackerDeletableMangaTracker - TooManyFunctions:MangaUpdatesScreenModel.kt$MangaUpdatesScreenModel : StateScreenModel - TooManyFunctions:MyAnimeList.kt$MyAnimeList : BaseTrackerMangaTrackerAnimeTrackerDeletableMangaTrackerDeletableAnimeTracker - TooManyFunctions:MyAnimeListApi.kt$MyAnimeListApi - TooManyFunctions:NotificationReceiver.kt$NotificationReceiver : BroadcastReceiver - TooManyFunctions:NotificationReceiver.kt$NotificationReceiver$Companion - TooManyFunctions:PagerPageHolder.kt$PagerPageHolder : ReaderPageImageViewPositionableView - TooManyFunctions:PagerViewer.kt$PagerViewer : Viewer - TooManyFunctions:PlayerActivity.kt$PlayerActivity : BaseActivity - TooManyFunctions:PlayerControlsView.kt$PlayerControlsView : LinearLayout - TooManyFunctions:PlayerPreferences.kt$PlayerPreferences - TooManyFunctions:PlayerViewModel.kt$PlayerViewModel : ViewModel - TooManyFunctions:ReaderActivity.kt$ReaderActivity : BaseActivity - TooManyFunctions:ReaderPageImageView.kt$ReaderPageImageView : FrameLayout - TooManyFunctions:ReaderPreferences.kt$ReaderPreferences - TooManyFunctions:ReaderViewModel.kt$ReaderViewModel : ViewModel - TooManyFunctions:SharedPreferencesDataStore.kt$SharedPreferencesDataStore : PreferenceDataStore - TooManyFunctions:Shikimori.kt$Shikimori : BaseTrackerMangaTrackerAnimeTrackerDeletableMangaTrackerDeletableAnimeTracker - TooManyFunctions:ShikimoriApi.kt$ShikimoriApi - TooManyFunctions:Simkl.kt$Simkl : BaseTrackerAnimeTracker - TooManyFunctions:SimklApi.kt$SimklApi - TooManyFunctions:SourcePreferences.kt$SourcePreferences - TooManyFunctions:SubtitleColorPage.kt$eu.kanade.tachiyomi.ui.player.settings.sheets.subtitle.SubtitleColorPage.kt - TooManyFunctions:Suwayomi.kt$Suwayomi : BaseTrackerEnhancedMangaTrackerMangaTracker - TooManyFunctions:WebtoonPageHolder.kt$WebtoonPageHolder : WebtoonBaseHolder - TooManyFunctions:WebtoonRecyclerView.kt$WebtoonRecyclerView : RecyclerView - TooManyFunctions:WebtoonViewer.kt$WebtoonViewer : Viewer - TopLevelPropertyNaming:AnimeDownloader.kt$// Arbitrary minimum required space to start a download: 200 MB private const val MIN_DISK_SPACE = 200L * 1024 * 1024 - TopLevelPropertyNaming:AnimeExtensionInstallActivity.kt$private const val INSTALL_REQUEST_CODE = 500 - TopLevelPropertyNaming:AnimeLibraryUpdateNotifier.kt$private const val ANIME_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 - TopLevelPropertyNaming:AnimeLibraryUpdateNotifier.kt$private const val NOTIF_ICON_SIZE = 192 - TopLevelPropertyNaming:AnimeLibraryUpdateNotifier.kt$private const val NOTIF_MAX_EPISODES = 5 - TopLevelPropertyNaming:AnimeLibraryUpdateNotifier.kt$private const val NOTIF_TITLE_MAX_LEN = 45 - TopLevelPropertyNaming:App.kt$private const val ACTION_DISABLE_INCOGNITO_MODE = "tachi.action.DISABLE_INCOGNITO_MODE" - TopLevelPropertyNaming:AppBar.kt$const val SEARCH_DEBOUNCE_MILLIS = 250L - TopLevelPropertyNaming:BackupCreateJob.kt$private const val IS_AUTO_BACKUP_KEY = "is_auto_backup" // Boolean - TopLevelPropertyNaming:BackupCreateJob.kt$private const val LOCATION_URI_KEY = "location_uri" // String - TopLevelPropertyNaming:BackupCreateJob.kt$private const val OPTIONS_KEY = "options" // BooleanArray - TopLevelPropertyNaming:BackupCreateJob.kt$private const val TAG_AUTO = "BackupCreator" - TopLevelPropertyNaming:BackupCreateJob.kt$private const val TAG_MANUAL = "$TAG_AUTO:manual" - TopLevelPropertyNaming:BackupRestoreJob.kt$private const val LOCATION_URI_KEY = "location_uri" // String - TopLevelPropertyNaming:BackupRestoreJob.kt$private const val OPTIONS_KEY = "options" // BooleanArray - TopLevelPropertyNaming:BackupRestoreJob.kt$private const val SYNC_KEY = "sync" // Boolean - TopLevelPropertyNaming:ChapterCache.kt$/** Application cache version. */ private const val PARAMETER_APP_VERSION = 1 - TopLevelPropertyNaming:ChapterCache.kt$/** The maximum number of bytes this cache should use to store. */ private const val PARAMETER_CACHE_SIZE = 100L * 1024 * 1024 - TopLevelPropertyNaming:ChapterCache.kt$/** The number of values per cache entry. Must be positive. */ private const val PARAMETER_VALUE_COUNT = 1 - TopLevelPropertyNaming:ColorFilterPage.kt$private const val ALPHA_MASK: Long = 0xFF000000 - TopLevelPropertyNaming:ColorFilterPage.kt$private const val BLUE_MASK: Long = 0x000000FF - TopLevelPropertyNaming:ColorFilterPage.kt$private const val GREEN_MASK: Long = 0x0000FF00 - TopLevelPropertyNaming:ColorFilterPage.kt$private const val RED_MASK: Long = 0x00FF0000 - TopLevelPropertyNaming:CreateAniyomiExtensionRepo.kt$const val OFFICIAL_ANIYOMI_REPO_BASE_URL = "https://raw.githubusercontent.com/aniyomiorg/aniyomi-extensions/repo" - TopLevelPropertyNaming:DisplayExtensions.kt$// make sure icons on the nav rail fit private const val TABLET_UI_MIN_SCREEN_WIDTH_LANDSCAPE_DP = 600 - TopLevelPropertyNaming:DisplayExtensions.kt$// some tablets have screen width like 711dp = 1600px / 2.25 private const val TABLET_UI_MIN_SCREEN_WIDTH_PORTRAIT_DP = 700 - TopLevelPropertyNaming:DisplayExtensions.kt$private const val TABLET_UI_REQUIRED_SCREEN_WIDTH_DP = 720 - TopLevelPropertyNaming:ExternalIntents.kt$// List of supported external players and their packages const val MPV_PLAYER = "is.xyz.mpv" - TopLevelPropertyNaming:GLUtil.kt$// Safe minimum default size private const val IMAGE_MAX_BITMAP_DIMENSION = 2048 - TopLevelPropertyNaming:GestureHandler.kt$private const val STATE_HORIZONTAL = 1 - TopLevelPropertyNaming:GestureHandler.kt$private const val STATE_UP = 0 - TopLevelPropertyNaming:GestureHandler.kt$private const val STATE_VERTICAL_LEFT = 2 - TopLevelPropertyNaming:GestureHandler.kt$private const val STATE_VERTICAL_RIGHT = 3 - TopLevelPropertyNaming:GuidesStep.kt$const val GETTING_STARTED_URL = "https://aniyomi.org/docs/guides/getting-started" - TopLevelPropertyNaming:HistoriesTab.kt$private const val TAB_ANIME = 0 - TopLevelPropertyNaming:HistoriesTab.kt$private const val TAB_MANGA = 1 - TopLevelPropertyNaming:KomgaApi.kt$private const val READLIST_API = "/api/v1/readlists" - TopLevelPropertyNaming:LocaleHelper.kt$internal const val LAST_USED_KEY = "last_used" - TopLevelPropertyNaming:LocaleHelper.kt$internal const val PINNED_KEY = "pinned" - TopLevelPropertyNaming:MainActivity.kt$// Splash screen private const val SPLASH_MIN_DURATION = 500 // ms - TopLevelPropertyNaming:MainActivity.kt$private const val SPLASH_EXIT_ANIM_DURATION = 400L // ms - TopLevelPropertyNaming:MainActivity.kt$private const val SPLASH_MAX_DURATION = 5000 // ms - TopLevelPropertyNaming:MangaDownloader.kt$// Arbitrary minimum required space to start a download: 200 MB private const val MIN_DISK_SPACE = 200L * 1024 * 1024 - TopLevelPropertyNaming:MangaExtensionInstallActivity.kt$private const val INSTALL_REQUEST_CODE = 500 - TopLevelPropertyNaming:MangaLibraryUpdateNotifier.kt$private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 - TopLevelPropertyNaming:MangaLibraryUpdateNotifier.kt$private const val NOTIF_ICON_SIZE = 192 - TopLevelPropertyNaming:MangaLibraryUpdateNotifier.kt$private const val NOTIF_MAX_CHAPTERS = 5 - TopLevelPropertyNaming:MangaLibraryUpdateNotifier.kt$private const val NOTIF_TITLE_MAX_LEN = 45 - TopLevelPropertyNaming:PackageInstallerInstallerAnime.kt$private const val INSTALL_ACTION = "PackageInstallerInstaller.INSTALL_ACTION" - TopLevelPropertyNaming:PackageInstallerInstallerManga.kt$private const val INSTALL_ACTION = "PackageInstallerInstaller.INSTALL_ACTION" - TopLevelPropertyNaming:PictureInPictureHandler.kt$internal const val ACTION_MEDIA_CONTROL = "media_control" - TopLevelPropertyNaming:PictureInPictureHandler.kt$internal const val EXTRA_CONTROL_TYPE = "control_type" - TopLevelPropertyNaming:PictureInPictureHandler.kt$internal const val PIP_NEXT = 4 - TopLevelPropertyNaming:PictureInPictureHandler.kt$internal const val PIP_PAUSE = 2 - TopLevelPropertyNaming:PictureInPictureHandler.kt$internal const val PIP_PLAY = 1 - TopLevelPropertyNaming:PictureInPictureHandler.kt$internal const val PIP_PREVIOUS = 3 - TopLevelPropertyNaming:PictureInPictureHandler.kt$internal const val PIP_SKIP = 5 - TopLevelPropertyNaming:ReaderNavigationOverlayView.kt$private const val FADE_DURATION = 1000L - TopLevelPropertyNaming:ReaderPageImageView.kt$private const val MAX_ZOOM_SCALE = 5F - TopLevelPropertyNaming:ShizukuInstallerAnime.kt$private const val SHIZUKU_PERMISSION_REQUEST_CODE = 14045 - TopLevelPropertyNaming:ShizukuInstallerManga.kt$private const val SHIZUKU_PERMISSION_REQUEST_CODE = 14045 - TopLevelPropertyNaming:SuwayomiApi.kt$private const val ADDRESS_DEFAULT = "" - TopLevelPropertyNaming:SuwayomiApi.kt$private const val ADDRESS_TITLE = "Server URL Address" - TopLevelPropertyNaming:SuwayomiApi.kt$private const val LOGIN_DEFAULT = "" - TopLevelPropertyNaming:SuwayomiApi.kt$private const val LOGIN_TITLE = "Login (Basic Auth)" - TopLevelPropertyNaming:SuwayomiApi.kt$private const val PASSWORD_DEFAULT = "" - TopLevelPropertyNaming:SuwayomiApi.kt$private const val PASSWORD_TITLE = "Password (Basic Auth)" - TopLevelPropertyNaming:TrustAnimeExtension.kt$// jmir1's key private const val officialSignature = "50ab1d1e3a20d204d0ad6d334c7691c632e41b98dfa132bf385695fdfa63839c" - TopLevelPropertyNaming:TrustMangaExtension.kt$// inorichi's key private const val officialSignature = "7ce04da7773d41b489f4693a366c36bcd0a11fc39b547168553c285bd7348e23" - TopLevelPropertyNaming:UpdatesTab.kt$private const val TAB_ANIME = 0 - TopLevelPropertyNaming:UpdatesTab.kt$private const val TAB_MANGA = 1 - TopLevelPropertyNaming:WebtoonAdapter.kt$/** * View holder type of a chapter page view. */ private const val PAGE_VIEW = 0 - TopLevelPropertyNaming:WebtoonAdapter.kt$/** * View holder type of a chapter transition view. */ private const val TRANSITION_VIEW = 1 - TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val ANIMATOR_DURATION_TIME = 200 - TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val DEFAULT_RATE = 1f - TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val MAX_SCALE_RATE = 3f - TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val MIN_RATE = 0.5f - UnusedParameter:AnimeUpdatesScreen.kt$onInvertSelection: () -> Unit - UnusedParameter:MangaUpdatesScreen.kt$onInvertSelection: () -> Unit - UnusedParameter:MoreScreen.kt$onClickStorage: () -> Unit - UnusedPrivateMember:AnimeHistoryItem.kt$@PreviewLightDark @Composable private fun HistoryItemPreviews( @PreviewParameter(AnimeHistoryWithRelationsProvider::class) historyWithRelations: AnimeHistoryWithRelations, ) - UnusedPrivateMember:AnimeTrackInfoDialogHome.kt$@PreviewLightDark @Composable private fun TrackInfoDialogHomePreviews( @PreviewParameter(AnimeTrackInfoDialogHomePreviewProvider::class) content: @Composable () -> Unit, ) - UnusedPrivateMember:AnimeTrackerSearch.kt$@PreviewLightDark @Composable private fun TrackerSearchPreviews( @PreviewParameter(AnimeTrackerSearchPreviewProvider::class) content: @Composable () -> Unit, ) - UnusedPrivateMember:AppThemePreferenceWidget.kt$@PreviewLightDark @Composable private fun AppThemesListPreview() - UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextLongTitlePreview() - UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextNoNextPreview() - UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextNoPreviousPreview() - UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextPreview() - UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextWithGapPreview() - UnusedPrivateMember:CrashScreen.kt$@PreviewLightDark @Composable private fun CrashScreenPreview() - UnusedPrivateMember:EmptyScreen.kt$@PreviewLightDark @Composable private fun NoActionPreview() - UnusedPrivateMember:EmptyScreen.kt$@PreviewLightDark @Composable private fun WithActionPreview() - UnusedPrivateMember:GuidesStep.kt$@PreviewLightDark @Composable private fun GuidesStepPreview() - UnusedPrivateMember:HistoryDialogs.kt$@PreviewLightDark @Composable private fun HistoryDeleteDialogPreview() - UnusedPrivateMember:InfoWidget.kt$@PreviewLightDark @Composable private fun InfoWidgetPreview() - UnusedPrivateMember:LibraryBadges.kt$@PreviewLightDark @Composable private fun BadgePreview() - UnusedPrivateMember:MangaTrackInfoDialogHome.kt$@PreviewLightDark @Composable private fun TrackInfoDialogHomePreviews( @PreviewParameter(MangaTrackInfoDialogHomePreviewProvider::class) content: @Composable () -> Unit, ) - UnusedPrivateMember:MangaTrackerSearch.kt$@PreviewLightDark @Composable private fun TrackerSearchPreviews( @PreviewParameter(MangaTrackerSearchPreviewProvider::class) content: @Composable () -> Unit, ) - UnusedPrivateMember:MissingItemCountListItem.kt$@PreviewLightDark @Composable private fun Preview() - UnusedPrivateMember:ModeSelectionDialog.kt$@PreviewLightDark @Composable private fun Preview() - UnusedPrivateMember:NewUpdateScreen.kt$@PreviewLightDark @Composable private fun NewUpdateScreenPreview() - UnusedPrivateMember:OrientationSelectDialog.kt$@PreviewLightDark @Composable private fun DialogContentPreview() - UnusedPrivateMember:PageIndicatorText.kt$@PreviewLightDark @Composable private fun PageIndicatorTextPreview() - UnusedPrivateMember:PermissionStep.kt$PermissionStep$@Composable private fun SectionHeader( text: String, modifier: Modifier = Modifier, ) - UnusedPrivateMember:ReadingModeSelectDialog.kt$@PreviewLightDark @Composable private fun DialogContentPreview() - UnusedPrivateMember:SwitchPreferenceWidget.kt$@PreviewLightDark @Composable private fun SwitchPreferenceWidgetPreview() - UnusedPrivateMember:TextPreferenceWidget.kt$@PreviewLightDark @Composable private fun TextPreferenceWidgetPreview() - UnusedPrivateMember:TrackInfoDialogSelector.kt$@PreviewLightDark @Composable private fun TrackStatusSelectorPreviews() - UnusedPrivateMember:TrackLogoIcon.kt$@PreviewLightDark @Composable private fun TrackLogoIconPreviews( @PreviewParameter(TrackLogoIconPreviewProvider::class) tracker: Tracker, ) - UnusedPrivateProperty:AnimeExtensionLoader.kt$AnimeExtensionLoader$private const val METADATA_HAS_CHANGELOG = "tachiyomi.animeextension.hasChangelog" - UnusedPrivateProperty:AnimeExtensionLoader.kt$AnimeExtensionLoader$private const val METADATA_HAS_README = "tachiyomi.animeextension.hasReadme" - UnusedPrivateProperty:AnimeLibraryUpdateJob.kt$AnimeLibraryUpdateJob.Companion$private const val ANIME_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 - UnusedPrivateProperty:AnimeMetadataUpdateJob.kt$AnimeMetadataUpdateJob.Companion$private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 - UnusedPrivateProperty:AnimeSourcesScreenModel.kt$AnimeSourcesScreenModel$private val preferences: BasePreferences = Injekt.get() - UnusedPrivateProperty:AnimeSourcesScreenModel.kt$AnimeSourcesScreenModel$private val sourcePreferences: SourcePreferences = Injekt.get() - UnusedPrivateProperty:HistoriesTab.kt$private const val TAB_ANIME = 0 - UnusedPrivateProperty:HistoriesTab.kt$private const val TAB_MANGA = 1 - UnusedPrivateProperty:MangaLibraryUpdateJob.kt$MangaLibraryUpdateJob.Companion$private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 - UnusedPrivateProperty:MangaMetadataUpdateJob.kt$MangaMetadataUpdateJob.Companion$private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 - UnusedPrivateProperty:MangaSourcesScreenModel.kt$MangaSourcesScreenModel$private val preferences: BasePreferences = Injekt.get() - UnusedPrivateProperty:TrackerManager.kt$TrackerManager$context: Context - UnusedPrivateProperty:UpdatesTab.kt$private const val TAB_ANIME = 0 - UnusedPrivateProperty:UpdatesTab.kt$private const val TAB_MANGA = 1 - UseCheckOrError:AnimeScreenModel.kt$AnimeScreenModel$throw IllegalStateException() - UseCheckOrError:MangaScreenModel.kt$MangaScreenModel$throw IllegalStateException() - UseCheckOrError:PackageInstallerInstallerAnime.kt$PackageInstallerInstallerAnime$throw IllegalStateException() - UseCheckOrError:PackageInstallerInstallerManga.kt$PackageInstallerInstallerManga$throw IllegalStateException() - UseCheckOrError:ReadingMode.kt$ReadingMode.Companion$throw IllegalStateException( "Preference value must be resolved: $preference", ) - UseCheckOrError:ShizukuInstallerAnime.kt$ShizukuInstallerAnime$throw IllegalStateException() - UseCheckOrError:ShizukuInstallerManga.kt$ShizukuInstallerManga$throw IllegalStateException() - UseCheckOrError:SourceFilterAnimeDialog.kt$throw IllegalStateException("Unknown TriState state: $this") - UseCheckOrError:SourceFilterMangaDialog.kt$throw IllegalStateException("Unknown TriState state: $this") - UtilityClassWithPublicConstructor:EpisodeLoader.kt$EpisodeLoader - VariableNaming:AnimeTrack.kt$AnimeTrack$var anime_id: Long - VariableNaming:AnimeTrack.kt$AnimeTrack$var finished_watching_date: Long - VariableNaming:AnimeTrack.kt$AnimeTrack$var last_episode_seen: Double - VariableNaming:AnimeTrack.kt$AnimeTrack$var library_id: Long? - VariableNaming:AnimeTrack.kt$AnimeTrack$var remote_id: Long - VariableNaming:AnimeTrack.kt$AnimeTrack$var started_watching_date: Long - VariableNaming:AnimeTrack.kt$AnimeTrack$var total_episodes: Long - VariableNaming:AnimeTrack.kt$AnimeTrack$var tracker_id: Long - VariableNaming:AnimeTrack.kt$AnimeTrack$var tracking_url: String - VariableNaming:AnimeTrackSearch.kt$AnimeTrackSearch$var cover_url: String = "" - VariableNaming:AnimeTrackSearch.kt$AnimeTrackSearch$var publishing_status: String = "" - VariableNaming:AnimeTrackSearch.kt$AnimeTrackSearch$var publishing_type: String = "" - VariableNaming:AnimeTrackSearch.kt$AnimeTrackSearch$var start_date: String = "" - VariableNaming:Chapter.kt$Chapter$var date_fetch: Long - VariableNaming:Chapter.kt$Chapter$var last_modified: Long - VariableNaming:Chapter.kt$Chapter$var last_page_read: Int - VariableNaming:Chapter.kt$Chapter$var manga_id: Long? - VariableNaming:Chapter.kt$Chapter$var source_order: Int - VariableNaming:Episode.kt$Episode$var anime_id: Long? - VariableNaming:Episode.kt$Episode$var date_fetch: Long - VariableNaming:Episode.kt$Episode$var last_modified: Long - VariableNaming:Episode.kt$Episode$var last_second_seen: Long - VariableNaming:Episode.kt$Episode$var source_order: Int - VariableNaming:Episode.kt$Episode$var total_seconds: Long - VariableNaming:MangaTrack.kt$MangaTrack$var finished_reading_date: Long - VariableNaming:MangaTrack.kt$MangaTrack$var last_chapter_read: Double - VariableNaming:MangaTrack.kt$MangaTrack$var library_id: Long? - VariableNaming:MangaTrack.kt$MangaTrack$var manga_id: Long - VariableNaming:MangaTrack.kt$MangaTrack$var remote_id: Long - VariableNaming:MangaTrack.kt$MangaTrack$var started_reading_date: Long - VariableNaming:MangaTrack.kt$MangaTrack$var total_chapters: Long - VariableNaming:MangaTrack.kt$MangaTrack$var tracker_id: Long - VariableNaming:MangaTrack.kt$MangaTrack$var tracking_url: String - VariableNaming:MangaTrackSearch.kt$MangaTrackSearch$var cover_url: String = "" - VariableNaming:MangaTrackSearch.kt$MangaTrackSearch$var publishing_status: String = "" - VariableNaming:MangaTrackSearch.kt$MangaTrackSearch$var publishing_type: String = "" - VariableNaming:MangaTrackSearch.kt$MangaTrackSearch$var start_date: String = "" - ConstructorParameterNaming:ChapterDetails.kt$ChapterDetails$val chapter_number: Float - ConstructorParameterNaming:ChapterDetails.kt$ChapterDetails$val date_upload: String? = null - ConstructorParameterNaming:EpisodeDetails.kt$EpisodeDetails$val date_upload: String? = null - ConstructorParameterNaming:EpisodeDetails.kt$EpisodeDetails$val episode_number: Float - TopLevelPropertyNaming:ComicInfo.kt$const val COMIC_INFO_FILE = "ComicInfo.xml" - LongParameterList:AnimeHistoryMapper.kt$AnimeHistoryMapper$( historyId: Long, animeId: Long, episodeId: Long, title: String, thumbnailUrl: String?, sourceId: Long, isFavorite: Boolean, coverLastModified: Long, episodeNumber: Double, seenAt: Date?, ) - LongParameterList:AnimeMapper.kt$AnimeMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: AnimeUpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, ) - LongParameterList:AnimeMapper.kt$AnimeMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: AnimeUpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, totalCount: Long, seenCount: Double, latestUpload: Long, episodeFetchedAt: Long, lastSeen: Long, bookmarkCount: Double, category: Long, ) - LongParameterList:AnimeTrackMapper.kt$AnimeTrackMapper$( id: Long, animeId: Long, syncId: Long, remoteId: Long, libraryId: Long?, title: String, lastEpisodeSeen: Double, totalEpisodes: Long, status: Long, score: Double, remoteUrl: String, startDate: Long, finishDate: Long, ) - LongParameterList:AnimeUpdatesRepositoryImpl.kt$AnimeUpdatesRepositoryImpl$( animeId: Long, animeTitle: String, episodeId: Long, episodeName: String, scanlator: String?, seen: Boolean, bookmark: Boolean, lastSecondSeen: Long, totalSeconds: Long, sourceId: Long, favorite: Boolean, thumbnailUrl: String?, coverLastModified: Long, dateUpload: Long, dateFetch: Long, ) - LongParameterList:ChapterRepositoryImpl.kt$ChapterRepositoryImpl$( id: Long, mangaId: Long, url: String, name: String, scanlator: String?, read: Boolean, bookmark: Boolean, lastPageRead: Long, chapterNumber: Double, sourceOrder: Long, dateFetch: Long, dateUpload: Long, lastModifiedAt: Long, ) - LongParameterList:EpisodeRepositoryImpl.kt$EpisodeRepositoryImpl$( id: Long, animeId: Long, url: String, name: String, scanlator: String?, seen: Boolean, bookmark: Boolean, lastSecondSeen: Long, totalSeconds: Long, episodeNumber: Double, sourceOrder: Long, dateFetch: Long, dateUpload: Long, lastModifiedAt: Long, ) - LongParameterList:MangaHistoryMapper.kt$MangaHistoryMapper$( historyId: Long, mangaId: Long, chapterId: Long, title: String, thumbnailUrl: String?, sourceId: Long, isFavorite: Boolean, coverLastModified: Long, chapterNumber: Double, readAt: Date?, readDuration: Long, ) - LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, ) - LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, totalCount: Long, readCount: Double, latestUpload: Long, chapterFetchedAt: Long, lastRead: Long, bookmarkCount: Double, category: Long, ) - LongParameterList:MangaTrackMapper.kt$MangaTrackMapper$( id: Long, mangaId: Long, syncId: Long, remoteId: Long, libraryId: Long?, title: String, lastChapterRead: Double, totalChapters: Long, status: Long, score: Double, remoteUrl: String, startDate: Long, finishDate: Long, ) - LongParameterList:MangaUpdatesRepositoryImpl.kt$MangaUpdatesRepositoryImpl$( mangaId: Long, mangaTitle: String, chapterId: Long, chapterName: String, scanlator: String?, read: Boolean, bookmark: Boolean, lastPageRead: Long, sourceId: Long, favorite: Boolean, thumbnailUrl: String?, coverLastModified: Long, dateUpload: Long, dateFetch: Long, ) - ReturnCount:AndroidAnimeDatabaseHandler.kt$AndroidAnimeDatabaseHandler$private suspend fun <T> dispatch(inTransaction: Boolean, block: suspend AnimeDatabase.() -> T): T - ReturnCount:AndroidMangaDatabaseHandler.kt$AndroidMangaDatabaseHandler$private suspend fun <T> dispatch(inTransaction: Boolean, block: suspend Database.() -> T): T - SpreadOperator:AnimeRepositoryImpl.kt$AnimeRepositoryImpl$(*animeUpdates.toTypedArray()) - SpreadOperator:AnimeTrackRepositoryImpl.kt$AnimeTrackRepositoryImpl$(*tracks.toTypedArray()) - SpreadOperator:ChapterRepositoryImpl.kt$ChapterRepositoryImpl$(*chapterUpdates.toTypedArray()) - SpreadOperator:ChapterSanitizer.kt$ChapterSanitizer$(*CHAPTER_TRIM_CHARS) - SpreadOperator:EpisodeRepositoryImpl.kt$EpisodeRepositoryImpl$(*episodeUpdates.toTypedArray()) - SpreadOperator:EpisodeSanitizer.kt$EpisodeSanitizer$(*EPISODE_TRIM_CHARS) - SpreadOperator:MangaRepositoryImpl.kt$MangaRepositoryImpl$(*mangaUpdates.toTypedArray()) - SpreadOperator:MangaTrackRepositoryImpl.kt$MangaTrackRepositoryImpl$(*tracks.toTypedArray()) - TooGenericExceptionCaught:AnimeHistoryRepositoryImpl.kt$AnimeHistoryRepositoryImpl$e: Exception - TooGenericExceptionCaught:AnimeRepositoryImpl.kt$AnimeRepositoryImpl$e: Exception - TooGenericExceptionCaught:AnimeSourcePagingSource.kt$AnimeSourcePagingSource$e: Exception - TooGenericExceptionCaught:ChapterRepositoryImpl.kt$ChapterRepositoryImpl$e: Exception - TooGenericExceptionCaught:EpisodeRepositoryImpl.kt$EpisodeRepositoryImpl$e: Exception - TooGenericExceptionCaught:MangaHistoryRepositoryImpl.kt$MangaHistoryRepositoryImpl$e: Exception - TooGenericExceptionCaught:MangaRepositoryImpl.kt$MangaRepositoryImpl$e: Exception - TooGenericExceptionCaught:MangaSourcePagingSource.kt$SourcePagingSource$e: Exception - TooGenericExceptionCaught:QueryPagingAnimeSource.kt$QueryPagingAnimeSource$e: Exception - TooGenericExceptionCaught:QueryPagingMangaSource.kt$QueryPagingMangaSource$e: Exception - TooManyFunctions:AndroidAnimeDatabaseHandler.kt$AndroidAnimeDatabaseHandler : AnimeDatabaseHandler - TooManyFunctions:AndroidMangaDatabaseHandler.kt$AndroidMangaDatabaseHandler : MangaDatabaseHandler - TooManyFunctions:AnimeCategoryRepositoryImpl.kt$AnimeCategoryRepositoryImpl : AnimeCategoryRepository - TooManyFunctions:AnimeRepositoryImpl.kt$AnimeRepositoryImpl : AnimeRepository - TooManyFunctions:ChapterRepositoryImpl.kt$ChapterRepositoryImpl : ChapterRepository - TooManyFunctions:EpisodeRepositoryImpl.kt$EpisodeRepositoryImpl : EpisodeRepository - TooManyFunctions:MangaCategoryRepositoryImpl.kt$MangaCategoryRepositoryImpl : MangaCategoryRepository - TooManyFunctions:MangaRepositoryImpl.kt$MangaRepositoryImpl : MangaRepository - TopLevelPropertyNaming:DatabaseAdapter.kt$private const val LIST_OF_STRINGS_SEPARATOR = ", " - UnusedParameter:AnimeUpdatesRepositoryImpl.kt$AnimeUpdatesRepositoryImpl$dateUpload: Long - UnusedParameter:MangaUpdatesRepositoryImpl.kt$MangaUpdatesRepositoryImpl$dateUpload: Long - UseCheckOrError:AnimeTransactionContext.kt$AnimeTransactionElement$throw IllegalStateException("Transaction was never started or was already released") - UseCheckOrError:MangaTransactionContext.kt$TransactionElement$throw IllegalStateException("Transaction was never started or was already released") - CyclomaticComplexMethod:AnimeLibrarySortMode.kt$AnimeLibrarySort.Companion$fun deserialize(serialized: String): AnimeLibrarySort - FunctionNaming:Pin.kt$fun Pins(vararg pins: Pin) - LongParameterList:SetAnimeEpisodeFlags.kt$SetAnimeEpisodeFlags$( animeId: Long, unseenFilter: Long, downloadedFilter: Long, bookmarkedFilter: Long, sortingMode: Long, sortingDirection: Long, displayMode: Long, ) - LongParameterList:SetMangaChapterFlags.kt$SetMangaChapterFlags$( mangaId: Long, unreadFilter: Long, downloadedFilter: Long, bookmarkedFilter: Long, sortingMode: Long, sortingDirection: Long, displayMode: Long, ) - MagicNumber:Anime.kt$Anime$16.0 - MagicNumber:AnimeFetchInterval.kt$AnimeFetchInterval$10 - MagicNumber:AnimeFetchInterval.kt$AnimeFetchInterval$1000 - MagicNumber:AnimeFetchInterval.kt$AnimeFetchInterval$3 - MagicNumber:AnimeFetchInterval.kt$AnimeFetchInterval$7 - MagicNumber:AnimeFetchInterval.kt$AnimeFetchInterval$8 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Direction.Ascending$0b01000000 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.AiringTime$0b00110000 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.DateAdded$0b00011100 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.EpisodeFetchDate$0b00011000 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.LastSeen$0b00000100 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.LastUpdate$0b00001000 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.LatestEpisode$0b00010100 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.TotalEpisodes$0b00010000 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.TrackerMean$0b000100000 - MagicNumber:AnimeLibrarySortMode.kt$AnimeLibrarySort.Type.UnseenCount$0b00001100 - MagicNumber:BackupPreferences.kt$BackupPreferences$12 - MagicNumber:ChapterRecognition.kt$ChapterRecognition$10 - MagicNumber:ChapterRecognition.kt$ChapterRecognition$10.0 - MagicNumber:ChapterRecognition.kt$ChapterRecognition$2.0 - MagicNumber:ChapterRecognition.kt$ChapterRecognition$3 - MagicNumber:EpisodeRecognition.kt$EpisodeRecognition$10 - MagicNumber:EpisodeRecognition.kt$EpisodeRecognition$10.0 - MagicNumber:EpisodeRecognition.kt$EpisodeRecognition$2.0 - MagicNumber:EpisodeRecognition.kt$EpisodeRecognition$3 - MagicNumber:GetApplicationRelease.kt$GetApplicationRelease$3 - MagicNumber:MangaFetchInterval.kt$MangaFetchInterval$10 - MagicNumber:MangaFetchInterval.kt$MangaFetchInterval$1000 - MagicNumber:MangaFetchInterval.kt$MangaFetchInterval$3 - MagicNumber:MangaFetchInterval.kt$MangaFetchInterval$7 - MagicNumber:MangaFetchInterval.kt$MangaFetchInterval$8 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Direction.Ascending$0b01000000 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.ChapterFetchDate$0b00011000 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.DateAdded$0b00011100 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.LastRead$0b00000100 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.LastUpdate$0b00001000 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.LatestChapter$0b00010100 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.TotalChapters$0b00010000 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.TrackerMean$0b000100000 - MagicNumber:MangaLibrarySortMode.kt$MangaLibrarySort.Type.UnreadCount$0b00001100 - MatchingDeclarationName:AnimeLibrarySortMode.kt$AnimeLibrarySort : FlagWithMask - MatchingDeclarationName:MangaLibrarySortMode.kt$MangaLibrarySort : FlagWithMask - ReturnCount:ChapterRecognition.kt$ChapterRecognition$fun parseChapterNumber(mangaTitle: String, chapterName: String, chapterNumber: Double? = null): Double - ReturnCount:ChapterRecognition.kt$ChapterRecognition$private fun checkForDecimal(decimal: String?, alpha: String?): Double - ReturnCount:EpisodeRecognition.kt$EpisodeRecognition$fun parseEpisodeNumber(animeTitle: String, episodeName: String, episodeNumber: Double? = null): Double - ReturnCount:EpisodeRecognition.kt$EpisodeRecognition$private fun checkForDecimal(decimal: String?, alpha: String?): Double - ReturnCount:MissingChapters.kt$fun List<Double>.missingChaptersCount(): Int - ReturnCount:MissingChapters.kt$fun calculateChapterGap(higherChapter: Chapter?, lowerChapter: Chapter?): Int - ReturnCount:MissingEpisodes.kt$fun List<Double>.missingEpisodesCount(): Int - ReturnCount:MissingEpisodes.kt$fun calculateEpisodeGap(higherEpisode: Episode?, lowerEpisode: Episode?): Int - SerialVersionUIDInSerializableClass:Anime.kt$Anime : Serializable - SerialVersionUIDInSerializableClass:Category.kt$Category : Serializable - SerialVersionUIDInSerializableClass:Manga.kt$Manga : Serializable - SwallowedException:AnimeLibrarySortMode.kt$AnimeLibrarySort.Companion$e: Exception - SwallowedException:GetChapterByUrlAndMangaId.kt$GetChapterByUrlAndMangaId$e: Exception - SwallowedException:GetEpisodeByUrlAndAnimeId.kt$GetEpisodeByUrlAndAnimeId$e: Exception - SwallowedException:MangaLibrarySortMode.kt$MangaLibrarySort.Companion$e: Exception - TooGenericExceptionCaught:AnimeLibrarySortMode.kt$AnimeLibrarySort.Companion$e: Exception - TooGenericExceptionCaught:CreateAnimeCategoryWithName.kt$CreateAnimeCategoryWithName$e: Exception - TooGenericExceptionCaught:CreateMangaCategoryWithName.kt$CreateMangaCategoryWithName$e: Exception - TooGenericExceptionCaught:DeleteAnimeCategory.kt$DeleteAnimeCategory$e: Exception - TooGenericExceptionCaught:DeleteAnimeTrack.kt$DeleteAnimeTrack$e: Exception - TooGenericExceptionCaught:DeleteMangaCategory.kt$DeleteMangaCategory$e: Exception - TooGenericExceptionCaught:DeleteMangaTrack.kt$DeleteMangaTrack$e: Exception - TooGenericExceptionCaught:GetAnime.kt$GetAnime$e: Exception - TooGenericExceptionCaught:GetAnimeTracks.kt$GetAnimeTracks$e: Exception - TooGenericExceptionCaught:GetChapter.kt$GetChapter$e: Exception - TooGenericExceptionCaught:GetChapterByUrlAndMangaId.kt$GetChapterByUrlAndMangaId$e: Exception - TooGenericExceptionCaught:GetChaptersByMangaId.kt$GetChaptersByMangaId$e: Exception - TooGenericExceptionCaught:GetEpisode.kt$GetEpisode$e: Exception - TooGenericExceptionCaught:GetEpisodeByUrlAndAnimeId.kt$GetEpisodeByUrlAndAnimeId$e: Exception - TooGenericExceptionCaught:GetEpisodesByAnimeId.kt$GetEpisodesByAnimeId$e: Exception - TooGenericExceptionCaught:GetManga.kt$GetManga$e: Exception - TooGenericExceptionCaught:GetMangaTracks.kt$GetMangaTracks$e: Exception - TooGenericExceptionCaught:HideAnimeCategory.kt$HideAnimeCategory$e: Exception - TooGenericExceptionCaught:HideMangaCategory.kt$HideMangaCategory$e: Exception - TooGenericExceptionCaught:InsertAnimeTrack.kt$InsertAnimeTrack$e: Exception - TooGenericExceptionCaught:InsertMangaTrack.kt$InsertMangaTrack$e: Exception - TooGenericExceptionCaught:MangaLibrarySortMode.kt$MangaLibrarySort.Companion$e: Exception - TooGenericExceptionCaught:RenameAnimeCategory.kt$RenameAnimeCategory$e: Exception - TooGenericExceptionCaught:RenameMangaCategory.kt$RenameMangaCategory$e: Exception - TooGenericExceptionCaught:ReorderAnimeCategory.kt$ReorderAnimeCategory$e: Exception - TooGenericExceptionCaught:ReorderMangaCategory.kt$ReorderMangaCategory$e: Exception - TooGenericExceptionCaught:SetAnimeCategories.kt$SetAnimeCategories$e: Exception - TooGenericExceptionCaught:SetMangaCategories.kt$SetMangaCategories$e: Exception - TooGenericExceptionCaught:UpdateAnimeCategory.kt$UpdateAnimeCategory$e: Exception - TooGenericExceptionCaught:UpdateChapter.kt$UpdateChapter$e: Exception - TooGenericExceptionCaught:UpdateEpisode.kt$UpdateEpisode$e: Exception - TooGenericExceptionCaught:UpdateMangaCategory.kt$UpdateMangaCategory$e: Exception - TooManyFunctions:AnimeCategoryRepository.kt$AnimeCategoryRepository - TooManyFunctions:AnimeRepository.kt$AnimeRepository - TooManyFunctions:ChapterRepository.kt$ChapterRepository - TooManyFunctions:DownloadPreferences.kt$DownloadPreferences - TooManyFunctions:LibraryPreferences.kt$LibraryPreferences - TooManyFunctions:MangaCategoryRepository.kt$MangaCategoryRepository - TooManyFunctions:MangaRepository.kt$MangaRepository - TopLevelPropertyNaming:PreferenceValues.kt$const val FLAG_CATEGORIES = "1" - TopLevelPropertyNaming:PreferenceValues.kt$const val FLAG_CHAPTERS = "2" - TopLevelPropertyNaming:PreferenceValues.kt$const val FLAG_EXTENSIONS = "40" - TopLevelPropertyNaming:PreferenceValues.kt$const val FLAG_EXT_SETTINGS = "20" - TopLevelPropertyNaming:PreferenceValues.kt$const val FLAG_HISTORY = "4" - TopLevelPropertyNaming:PreferenceValues.kt$const val FLAG_SETTINGS = "10" - TopLevelPropertyNaming:PreferenceValues.kt$const val FLAG_TRACK = "8" - TopLevelPropertyNaming:StorageManager.kt$private const val AUTOMATIC_BACKUPS_PATH = "autobackup" - TopLevelPropertyNaming:StorageManager.kt$private const val DOWNLOADS_PATH = "downloads" - TopLevelPropertyNaming:StorageManager.kt$private const val FONTS_PATH = "fonts" - TopLevelPropertyNaming:StorageManager.kt$private const val LOCAL_ANIMESOURCE_PATH = "localanime" - TopLevelPropertyNaming:StorageManager.kt$private const val LOCAL_SOURCE_PATH = "local" - TopLevelPropertyNaming:StorageManager.kt$private const val MPV_CONFIG_PATH = "mpv-config" - TopLevelPropertyNaming:StorageManager.kt$private const val SCRIPTS_PATH = "scripts" - TopLevelPropertyNaming:StorageManager.kt$private const val SCRIPT_OPTS_PATH = "script-opts" - ForbiddenComment:BaselineProfileGenerator.kt$BaselineProfileGenerator$// TODO: automate storage permissions and possibly open manga details screen too? - ComposableParamOrder:SettingsItems.kt$RepeatingIconButton - ComposableParamOrder:SettingsItems.kt$SelectItem - ContentTrailingLambda:Scaffold.kt$content - CyclomaticComplexMethod:Button.kt$ButtonElevation$@OptIn(InternalCoroutinesApi::class) @Composable private fun animateElevation( enabled: Boolean, interactionSource: InteractionSource, ): State<Dp> - CyclomaticComplexMethod:Scaffold.kt$@Composable private fun ScaffoldLayout( fabPosition: FabPosition, topBar: @Composable () -> Unit, startBar: @Composable () -> Unit, content: @Composable (PaddingValues) -> Unit, snackbar: @Composable () -> Unit, fab: @Composable () -> Unit, contentWindowInsets: WindowInsets, bottomBar: @Composable () -> Unit, ) - CyclomaticComplexMethod:VerticalFastScroller.kt$@OptIn(FlowPreview::class) @Composable fun VerticalFastScroller( listState: LazyListState, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) - CyclomaticComplexMethod:VerticalFastScroller.kt$@OptIn(FlowPreview::class) @Composable fun VerticalGridFastScroller( state: LazyGridState, columns: GridCells, arrangement: Arrangement.Horizontal, contentPadding: PaddingValues, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) - ForbiddenComment:VerticalFastScroller.kt$// TODO: Sometimes item height is not available when scrolling up - FunctionNaming:PullRefresh.kt$PullToRefreshStateImpl.Companion$fun Saver( extraVerticalOffset: Float, positionalThreshold: Float, enabled: () -> Boolean, onRefresh: () -> Unit, ) - LambdaParameterInRestartableEffect:AdaptiveSheet.kt$onDismissRequest - LambdaParameterInRestartableEffect:VerticalFastScroller.kt$thumbAllowed - LongMethod:AdaptiveSheet.kt$@Composable fun AdaptiveSheet( isTabletUi: Boolean, tonalElevation: Dp, enableSwipeDismiss: Boolean, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, content: @Composable () -> Unit, ) - LongMethod:Button.kt$ButtonElevation$@OptIn(InternalCoroutinesApi::class) @Composable private fun animateElevation( enabled: Boolean, interactionSource: InteractionSource, ): State<Dp> - LongMethod:InfoScreen.kt$@Composable fun InfoScreen( icon: ImageVector, headingText: String, subtitleText: String, acceptText: String, onAcceptClick: () -> Unit, canAccept: Boolean = true, rejectText: String? = null, onRejectClick: (() -> Unit)? = null, content: @Composable ColumnScope.() -> Unit, ) - LongMethod:Scaffold.kt$@Composable private fun ScaffoldLayout( fabPosition: FabPosition, topBar: @Composable () -> Unit, startBar: @Composable () -> Unit, content: @Composable (PaddingValues) -> Unit, snackbar: @Composable () -> Unit, fab: @Composable () -> Unit, contentWindowInsets: WindowInsets, bottomBar: @Composable () -> Unit, ) - LongMethod:VerticalFastScroller.kt$@OptIn(FlowPreview::class) @Composable fun VerticalFastScroller( listState: LazyListState, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) - LongMethod:VerticalFastScroller.kt$@OptIn(FlowPreview::class) @Composable fun VerticalGridFastScroller( state: LazyGridState, columns: GridCells, arrangement: Arrangement.Horizontal, contentPadding: PaddingValues, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) - LongMethod:WheelPicker.kt$@Composable private fun <T> WheelPicker( items: ImmutableList<T>, modifier: Modifier = Modifier, startIndex: Int = 0, size: DpSize = DpSize(128.dp, 128.dp), onSelectionChanged: (index: Int) -> Unit = {}, manualInputType: KeyboardType? = null, backgroundContent: (@Composable (size: DpSize) -> Unit)? = { WheelPickerDefaults.Background(size = it) }, itemContent: @Composable LazyItemScope.(item: T) -> Unit, ) - LongParameterList:InfoScreen.kt$( icon: ImageVector, headingText: String, subtitleText: String, acceptText: String, onAcceptClick: () -> Unit, canAccept: Boolean = true, rejectText: String? = null, onRejectClick: (() -> Unit)? = null, content: @Composable ColumnScope.() -> Unit, ) - LongParameterList:Scaffold.kt$( fabPosition: FabPosition, topBar: @Composable () -> Unit, startBar: @Composable () -> Unit, content: @Composable (PaddingValues) -> Unit, snackbar: @Composable () -> Unit, fab: @Composable () -> Unit, contentWindowInsets: WindowInsets, bottomBar: @Composable () -> Unit, ) - LongParameterList:Scrollbar.kt$( orientation: Orientation, reverseDirection: Boolean, atEnd: Boolean, showScrollbar: Boolean, thickness: Float, color: Color, alpha: () -> Float, thumbSize: Float, scrollOffset: Float, positionOffset: Float, ) - LongParameterList:SettingsItems.kt$( label: String, placeholder: String, suffix: String, value: Int, step: Int, min: Int? = null, onValueChanged: (Int) -> Unit, ) - MagicNumber:CircularProgressIndicator.kt$2000 - MagicNumber:Modifier.kt$0.16f - MagicNumber:Modifier.kt$0.22f - MagicNumber:PullRefresh.kt$PullToRefreshStateImpl$4 - MagicNumber:Scaffold.kt$3 - MagicNumber:Scaffold.kt$4 - MagicNumber:Scaffold.kt$5 - MagicNumber:Scaffold.kt$6 - MagicNumber:Scaffold.kt$7 - MagicNumber:Scaffold.kt$8 - MagicNumber:Scaffold.kt$9 - MagicNumber:Scrollbar.kt$100 - MagicNumber:Scrollbar.kt$50 - MagicNumber:SettingsItems.kt$0.5f - MagicNumber:SettingsItems.kt$1.5f - MagicNumber:Surface.kt$100f - MagicNumber:Surface.kt$4.5f - MagicNumber:Tabs.kt$0.08f - MagicNumber:Tabs.kt$0.12f - MagicNumber:VerticalFastScroller.kt$100 - MagicNumber:WheelPicker.kt$0.2f - MagicNumber:WheelPicker.kt$1.2f - MatchingDeclarationName:EmptyScreen.kt$EmptyScreenAction - MatchingDeclarationName:SettingsItems.kt$SettingsItemsPaddings - MaxLineLength:Scaffold.kt$* - ModifierComposed:Modifier.kt$clearFocusOnSoftKeyboardHide - ModifierComposed:Modifier.kt$clickableNoIndication - ModifierComposed:Scrollbar.kt$drawScrollbar - ModifierMissing:CollapsibleBox.kt$CollapsibleBox - ModifierMissing:InfoScreen.kt$InfoScreen - ModifierMissing:SectionCard.kt$SectionCard - ModifierMissing:SettingsItems.kt$CheckboxItem - ModifierMissing:SettingsItems.kt$HeadingItem - ModifierMissing:SettingsItems.kt$IconItem - ModifierMissing:SettingsItems.kt$OutlinedNumericChooser - ModifierMissing:SettingsItems.kt$RadioItem - ModifierMissing:SettingsItems.kt$SelectItem - ModifierMissing:SettingsItems.kt$SettingsChipRow - ModifierMissing:SettingsItems.kt$SettingsIconGrid - ModifierMissing:SettingsItems.kt$SliderItem - ModifierMissing:SettingsItems.kt$SortItem - ModifierMissing:SettingsItems.kt$TextItem - ModifierMissing:SettingsItems.kt$TriStateItem - ModifierMissing:Tabs.kt$TabText - ModifierMissing:WheelPicker.kt$WheelPickerDefaults$Background - ModifierMissing:WheelPicker.kt$WheelPickerDefaults$Item - ParameterNaming:SettingsItems.kt$onValueChanged - ParameterNaming:WheelPicker.kt$onSelectionChanged - PreviewAnnotationNaming:ThemePreviews.kt$ThemePreviews$ThemePreviews - PreviewPublic:Scrollbar.kt$LazyListHorizontalScrollbarPreview - PreviewPublic:Scrollbar.kt$LazyListScrollbarPreview - TooManyFunctions:SettingsItems.kt$tachiyomi.presentation.core.components.SettingsItems.kt - UnusedPrivateMember:InfoScreen.kt$@PreviewLightDark @Composable private fun InfoScaffoldPreview() - ForEachOnRange:UpdatesAnimeWidget.kt$0..<rowCount - ForEachOnRange:UpdatesMangaWidget.kt$0..<rowCount - LongMethod:UpdatesAnimeWidget.kt$@Composable fun UpdatesAnimeWidget( data: ImmutableList<Pair<Long, Bitmap?>>?, contentColor: ColorProvider, topPadding: Dp, bottomPadding: Dp, modifier: GlanceModifier = GlanceModifier, ) - LongMethod:UpdatesMangaWidget.kt$@Composable fun UpdatesMangaWidget( data: ImmutableList<Pair<Long, Bitmap?>>?, contentColor: ColorProvider, topPadding: Dp, bottomPadding: Dp, modifier: GlanceModifier = GlanceModifier, ) - MagicNumber:GlanceUtils.kt$10 - MagicNumber:GlanceUtils.kt$64 - MagicNumber:GlanceUtils.kt$95 - TooGenericExceptionCaught:AnimeWidgetManager.kt$AnimeWidgetManager$e: Exception - TooGenericExceptionCaught:MangaWidgetManager.kt$MangaWidgetManager$e: Exception - CyclomaticComplexMethod:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable - CyclomaticComplexMethod:RateLimitInterceptor.kt$RateLimitInterceptor$override fun intercept(chain: Interceptor.Chain): Response - ForbiddenComment:Localize.kt$// TODO: janky workaround for https://github.com/icerockdev/moko-resources/issues/337 - FunctionNaming:Requests.kt$fun DELETE( url: String, headers: Headers = DEFAULT_HEADERS, body: RequestBody = DEFAULT_BODY, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request - FunctionNaming:Requests.kt$fun GET( url: HttpUrl, headers: Headers = DEFAULT_HEADERS, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request - FunctionNaming:Requests.kt$fun GET( url: String, headers: Headers = DEFAULT_HEADERS, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request - FunctionNaming:Requests.kt$fun POST( url: String, headers: Headers = DEFAULT_HEADERS, body: RequestBody = DEFAULT_BODY, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request - FunctionNaming:Requests.kt$fun PUT( url: String, headers: Headers = DEFAULT_HEADERS, body: RequestBody = DEFAULT_BODY, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request - FunctionParameterNaming:WebViewInterceptor.kt$_name: String - FunctionParameterNaming:WebViewInterceptor.kt$_value: String - InstanceOfCheckForException:UncaughtExceptionInterceptor.kt$UncaughtExceptionInterceptor$e is IOException - InvalidPackageDeclaration:Constants.kt$package eu.kanade.tachiyomi.core.common - LongMethod:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable - LoopWithTooManyJumpStatements:ImageUtil.kt$ImageUtil$for - LoopWithTooManyJumpStatements:RateLimitInterceptor.kt$RateLimitInterceptor$while - MagicNumber:DeviceUtil.kt$DeviceUtil$1024 - MagicNumber:DeviceUtil.kt$DeviceUtil$3L - MagicNumber:DeviceUtil.kt$DeviceUtil$90000 - MagicNumber:DiskUtil.kt$DiskUtil$240 - MagicNumber:Hash.kt$Hash$15 - MagicNumber:Hash.kt$Hash$240 - MagicNumber:Hash.kt$Hash$4 - MagicNumber:ImageUtil.kt$ImageUtil$0.01 - MagicNumber:ImageUtil.kt$ImageUtil$0.0275 - MagicNumber:ImageUtil.kt$ImageUtil$100 - MagicNumber:ImageUtil.kt$ImageUtil$14 - MagicNumber:ImageUtil.kt$ImageUtil$18 - MagicNumber:ImageUtil.kt$ImageUtil$200 - MagicNumber:ImageUtil.kt$ImageUtil$22 - MagicNumber:ImageUtil.kt$ImageUtil$25 - MagicNumber:ImageUtil.kt$ImageUtil$3 - MagicNumber:ImageUtil.kt$ImageUtil$30 - MagicNumber:ImageUtil.kt$ImageUtil$32 - MagicNumber:ImageUtil.kt$ImageUtil$40 - MagicNumber:ImageUtil.kt$ImageUtil$5 - MagicNumber:ImageUtil.kt$ImageUtil$50 - MagicNumber:ImageUtil.kt$ImageUtil$6 - MagicNumber:ImageUtil.kt$ImageUtil$740 - MagicNumber:ImageUtil.kt$ImageUtil$9 - MagicNumber:NetworkHelper.kt$NetworkHelper$30 - MagicNumber:OkHttpExtensions.kt$30 - MagicNumber:UniFileTempFileManager.kt$UniFileTempFileManager$3 - MagicNumber:UniFileTempFileManager.kt$UniFileTempFileManager$8192 - MagicNumber:WebViewInterceptor.kt$WebViewInterceptor$30 - MaxLineLength:CoroutinesExtensions.kt$* - MaxLineLength:SpecificHostRateLimitInterceptor.kt$* - MaxLineLength:WebViewUtil.kt$WebViewUtil$* - NestedBlockDepth:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable - NestedBlockDepth:UniFileTempFileManager.kt$UniFileTempFileManager$fun createTempFile(file: UniFile): File - ReturnCount:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable - ReturnCount:ImageUtil.kt$ImageUtil$fun isAnimatedAndSupported(stream: InputStream): Boolean - ReturnCount:ImageUtil.kt$ImageUtil$fun splitTallImage(tmpDir: UniFile, imageFile: UniFile, filenamePrefix: String): Boolean - ReturnCount:WebViewInterceptor.kt$WebViewInterceptor$@OptIn(DelicateCoroutinesApi::class) override fun intercept(chain: Interceptor.Chain): Response - ReturnCount:WebViewInterceptor.kt$private fun isRequestHeaderSafe(_name: String, _value: String): Boolean - SwallowedException:AndroidPreference.kt$AndroidPreference$e: ClassCastException - SwallowedException:AndroidPreference.kt$AndroidPreference.Object$e: Exception - SwallowedException:DeviceUtil.kt$DeviceUtil$e: Exception - SwallowedException:ImageUtil.kt$ImageUtil$e: Exception - SwallowedException:OkHttpExtensions.kt$ex: Throwable - SwallowedException:PreferenceStore.kt$e: IllegalArgumentException - ThrowingExceptionsWithoutMessageOrCause:OkHttpExtensions.kt$Exception() - ThrowsCount:FileExtensions.kt$fun File.copyAndSetReadOnlyTo(target: File, overwrite: Boolean = false, bufferSize: Int = DEFAULT_BUFFER_SIZE): File - TooGenericExceptionCaught:AndroidPreference.kt$AndroidPreference.Object$e: Exception - TooGenericExceptionCaught:CloudflareInterceptor.kt$CloudflareInterceptor$e: Exception - TooGenericExceptionCaught:DeviceUtil.kt$DeviceUtil$e: Exception - TooGenericExceptionCaught:ImageUtil.kt$ImageUtil$e: Exception - TooGenericExceptionCaught:OkHttpExtensions.kt$<no name provided>$e: Exception - TooGenericExceptionCaught:OkHttpExtensions.kt$ex: Throwable - TooGenericExceptionCaught:UncaughtExceptionInterceptor.kt$UncaughtExceptionInterceptor$e: Exception - TooGenericExceptionCaught:WebViewUtil.kt$WebViewUtil$e: Throwable - TooManyFunctions:DohProviders.kt$eu.kanade.tachiyomi.network.DohProviders.kt - TooManyFunctions:EpubFile.kt$EpubFile : Closeable - TooManyFunctions:ImageUtil.kt$ImageUtil - TopLevelPropertyNaming:DohProviders.kt$/** * Based on https://github.com/square/okhttp/blob/ef5d0c83f7bbd3a0c0534e7ca23cbc4ee7550f3b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DohProviders.java */ const val PREF_DOH_CLOUDFLARE = 1 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_360 = 7 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_ADGUARD = 3 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_ALIDNS = 5 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_CONTROLD = 10 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_DNSPOD = 6 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_GOOGLE = 2 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_LIBREDNS = 13 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_MULLVAD = 9 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_NJALLA = 11 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_QUAD101 = 8 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_QUAD9 = 4 - TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_SHECAN = 12 - UnusedPrivateProperty:JavaScriptEngine.kt$JavaScriptEngine$context: Context - - diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml deleted file mode 100644 index 987f56dd0c..0000000000 --- a/config/detekt/detekt.yml +++ /dev/null @@ -1,22 +0,0 @@ -naming: - FunctionNaming: - functionPattern: '[a-z][a-zA-Z0-9]*' - ignoreAnnotated: [ 'Composable' ] - TopLevelPropertyNaming: - constantPattern: '[A-Z][A-Za-z0-9]*' -complexity: - LongMethod: - ignoreAnnotated: [ 'Composable' ] - LongParameterList: - ignoreDefaultParameters: true - ignoreAnnotated: [ 'Composable' ] -style: - MagicNumber: - ignorePropertyDeclaration: true - ignoreCompanionObjectPropertyDeclaration: true - ReturnCount: - excludeGuardClauses: true - SerialVersionUIDInSerializableClass: - active: false - UnusedPrivateMember: - ignoreAnnotated: [ 'Preview' ] diff --git a/data/src/main/java/tachiyomi/data/entries/manga/MangaMapper.kt b/data/src/main/java/tachiyomi/data/entries/manga/MangaMapper.kt index 9d1d2b249d..d42ae5560c 100644 --- a/data/src/main/java/tachiyomi/data/entries/manga/MangaMapper.kt +++ b/data/src/main/java/tachiyomi/data/entries/manga/MangaMapper.kt @@ -5,7 +5,6 @@ import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.library.manga.LibraryManga object MangaMapper { - @Suppress("LongParameterList") fun mapManga( id: Long, source: Long, @@ -58,7 +57,6 @@ object MangaMapper { version = version, ) - @Suppress("LongParameterList") fun mapLibraryManga( id: Long, source: Long, diff --git a/data/src/main/java/tachiyomi/data/entries/manga/MangaRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/entries/manga/MangaRepositoryImpl.kt index 1030327683..61ae53f2f6 100644 --- a/data/src/main/java/tachiyomi/data/entries/manga/MangaRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/entries/manga/MangaRepositoryImpl.kt @@ -67,7 +67,6 @@ class MangaRepositoryImpl( } } - @Suppress("MagicNumber") override suspend fun getUpcomingManga(statuses: Set): Flow> { val epochMillis = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond() * 1000 return handler.subscribeToList { diff --git a/data/src/main/java/tachiyomi/data/items/chapter/ChapterRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/items/chapter/ChapterRepositoryImpl.kt index 21309a71e7..7dc0cddd49 100644 --- a/data/src/main/java/tachiyomi/data/items/chapter/ChapterRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/items/chapter/ChapterRepositoryImpl.kt @@ -127,7 +127,6 @@ class ChapterRepositoryImpl( } } - @Suppress("LongParameterList") private fun mapChapter( id: Long, mangaId: Long, diff --git a/domain/src/main/java/mihon/domain/extensionrepo/manga/interactor/CreateMangaExtensionRepo.kt b/domain/src/main/java/mihon/domain/extensionrepo/manga/interactor/CreateMangaExtensionRepo.kt index 3534b4a06c..94a07650eb 100644 --- a/domain/src/main/java/mihon/domain/extensionrepo/manga/interactor/CreateMangaExtensionRepo.kt +++ b/domain/src/main/java/mihon/domain/extensionrepo/manga/interactor/CreateMangaExtensionRepo.kt @@ -48,7 +48,6 @@ class CreateMangaExtensionRepo( * * @param repo Extension Repo holder for passing to DB/Error Dialog */ - @Suppress("ReturnCount") private suspend fun handleInsertionError(repo: ExtensionRepo): Result { val repoExists = repository.getRepo(repo.baseUrl) if (repoExists != null) { diff --git a/domain/src/main/java/mihon/domain/extensionrepo/service/ExtensionRepoService.kt b/domain/src/main/java/mihon/domain/extensionrepo/service/ExtensionRepoService.kt index 8262961a7b..27e00f3a27 100644 --- a/domain/src/main/java/mihon/domain/extensionrepo/service/ExtensionRepoService.kt +++ b/domain/src/main/java/mihon/domain/extensionrepo/service/ExtensionRepoService.kt @@ -17,7 +17,6 @@ class ExtensionRepoService( ) { val client = networkHelper.client - @Suppress("TooGenericExceptionCaught") suspend fun fetchRepoDetails( repo: String, ): ExtensionRepo? { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8534421ce1..34572f424d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,8 +8,6 @@ shizuku_version = "12.2.0" sqldelight = "2.0.2" sqlite = "2.4.0" voyager = "1.0.0" -detekt = "1.23.6" -detektCompose = "0.4.5" [libraries] desugar = "com.android.tools:desugar_jdk_libs:2.0.4" @@ -96,10 +94,6 @@ voyager-screenmodel = { module = "cafe.adriel.voyager:voyager-screenmodel", vers voyager-tab-navigator = { module = "cafe.adriel.voyager:voyager-tab-navigator", version.ref = "voyager" } voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" } -detekt-gradlePlugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } -detekt-rules-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } -detekt-rules-compose = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" } - aniyomi-mpv = "com.github.aniyomiorg:aniyomi-mpv-lib:1.15.n" ffmpeg-kit = "com.github.jmir1:ffmpeg-kit:1.15" arthenica-smartexceptions = "com.arthenica:smart-exception-java:0.2.1" diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Scaffold.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Scaffold.kt index 6420084a75..16063f621e 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Scaffold.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Scaffold.kt @@ -152,7 +152,6 @@ fun Scaffold( * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the * [content], typically a [NavigationBar]. */ -@Suppress("CyclomaticComplexMethod") @OptIn(ExperimentalMaterial3Api::class) @Composable private fun ScaffoldLayout( From 324a4850a335e1d40852fadcae7df0e18f15d10f Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sun, 27 Oct 2024 10:52:26 +0100 Subject: [PATCH 049/247] Remove more detekt annotations --- .../eu/kanade/tachiyomi/data/backup/models/BackupAnime.kt | 5 +---- .../eu/kanade/tachiyomi/data/backup/models/BackupEpisode.kt | 1 - .../java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt | 1 - .../tachiyomi/data/download/anime/AnimeDownloadCache.kt | 1 - .../tachiyomi/data/track/jellyfin/JellyfinInterceptor.kt | 1 - .../tachiyomi/extension/anime/util/AnimeExtensionLoader.kt | 1 - .../tachiyomi/extension/manga/util/MangaExtensionLoader.kt | 1 - .../tachiyomi/ui/library/anime/AnimeLibraryScreenModel.kt | 2 -- .../tachiyomi/ui/library/manga/MangaLibraryScreenModel.kt | 2 -- .../java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt | 1 - .../core/migration/migrations/EnableAutoBackupMigration.kt | 1 - .../migrations/MigrateRotationViewerValuesMigration.kt | 1 - .../core/migration/migrations/MigrateSortingModeMigration.kt | 1 - .../core/migration/migrations/RelativeTimestampMigration.kt | 1 - .../migration/migrations/RemoveOneTwoHourUpdateMigration.kt | 1 - .../core/migration/migrations/RemoveQuickUpdateMigration.kt | 1 - .../core/migration/migrations/RemoveReaderTapMigration.kt | 1 - .../migrations/ResetSortPreferenceRemovedMigration.kt | 1 - .../main/java/tachiyomi/data/entries/anime/AnimeMapper.kt | 2 -- .../java/tachiyomi/data/entries/anime/AnimeRepositoryImpl.kt | 1 - .../tachiyomi/data/items/episode/EpisodeRepositoryImpl.kt | 1 - .../anime/interactor/CreateAnimeExtensionRepo.kt | 1 - 22 files changed, 1 insertion(+), 28 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnime.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnime.kt index 8ae4359760..25498c4544 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnime.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnime.kt @@ -5,10 +5,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.entries.anime.model.Anime -@Suppress( - "DEPRECATION", - "MagicNumber", -) +@Suppress("DEPRECATION") @Serializable data class BackupAnime( // in 1.x some of these values have different names diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupEpisode.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupEpisode.kt index bc94d130cd..ae484f8716 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupEpisode.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupEpisode.kt @@ -4,7 +4,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.items.episode.model.Episode -@Suppress("MagicNumber") @Serializable data class BackupEpisode( // in 1.x some of these values have different names diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt index 12c6b1e6d4..c4eee9f70d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt @@ -45,7 +45,6 @@ import java.io.IOException * Available request parameter: * - [USE_CUSTOM_COVER_KEY]: Use custom cover if set by user, default is true */ -@Suppress("LongParameterList") class AnimeCoverFetcher( private val url: String?, private val isLibraryAnime: Boolean, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt index a22286a9cb..ae6bc3c6e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt @@ -426,7 +426,6 @@ class AnimeDownloadCache( private var updateDiskCacheJob: Job? = null - @Suppress("MagicNumber") private fun updateDiskCache() { updateDiskCacheJob?.cancel() updateDiskCacheJob = scope.launchIO { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/JellyfinInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/JellyfinInterceptor.kt index a612fd800a..ca420f3ef8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/JellyfinInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/JellyfinInterceptor.kt @@ -41,7 +41,6 @@ class JellyfinInterceptor : Interceptor { return chain.proceed(authRequest) } - @Suppress("MagicNumber") private fun getId(suffix: Int): Long { val key = "jellyfin" + (if (suffix == 1) "" else " ($suffix)") + "/all/$JELLYFIN_VERSION_ID" val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray()) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt index 2206683351..d32d334255 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt @@ -234,7 +234,6 @@ internal object AnimeExtensionLoader { * @param context The application context. * @param extensionInfo The extension to load. */ - @Suppress("LongMethod", "CyclomaticComplexMethod", "ReturnCount") private suspend fun loadExtension(context: Context, extensionInfo: AnimeExtensionInfo): AnimeLoadResult { val pkgManager = context.packageManager diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt index 92fd6e4663..3afea63b4f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt @@ -243,7 +243,6 @@ internal object MangaExtensionLoader { * @param context The application context. * @param extensionInfo The extension to load. */ - @Suppress("LongMethod", "CyclomaticComplexMethod", "ReturnCount") private suspend fun loadMangaExtension(context: Context, extensionInfo: MangaExtensionInfo): MangaLoadResult { val pkgManager = context.packageManager val pkgInfo = extensionInfo.packageInfo diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibraryScreenModel.kt index 88fbbccf30..96a6358ccf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibraryScreenModel.kt @@ -176,7 +176,6 @@ class AnimeLibraryScreenModel( /** * Applies library filters to the given map of anime. */ - @Suppress("LongMethod", "CyclomaticComplexMethod") private suspend fun AnimeLibraryMap.applyFilters( trackMap: Map>, trackingFilter: Map, @@ -258,7 +257,6 @@ class AnimeLibraryScreenModel( /** * Applies library sorting to the given map of anime. */ - @Suppress("LongMethod", "CyclomaticComplexMethod") private fun AnimeLibraryMap.applySort( // Map> trackMap: Map>, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibraryScreenModel.kt index 1b530e6202..48b581c345 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibraryScreenModel.kt @@ -176,7 +176,6 @@ class MangaLibraryScreenModel( /** * Applies library filters to the given map of manga. */ - @Suppress("LongMethod", "CyclomaticComplexMethod") private suspend fun MangaLibraryMap.applyFilters( trackMap: Map>, trackingFilter: Map, @@ -258,7 +257,6 @@ class MangaLibraryScreenModel( /** * Applies library sorting to the given map of manga. */ - @Suppress("LongMethod", "CyclomaticComplexMethod") private fun MangaLibraryMap.applySort( // Map> trackMap: Map>, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt index f0428847db..ca459bf312 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt @@ -770,7 +770,6 @@ class PlayerActivity : BaseActivity() { verticalScrollLeft(0F) } - @Suppress("ReturnCount") private fun getMaxBrightness(): Float { val powerManager = getSystemService(POWER_SERVICE) as? PowerManager ?: return MAX_BRIGHTNESS val brightnessField = powerManager.javaClass.declaredFields.find { diff --git a/app/src/main/java/mihon/core/migration/migrations/EnableAutoBackupMigration.kt b/app/src/main/java/mihon/core/migration/migrations/EnableAutoBackupMigration.kt index 70db002533..3249a29890 100644 --- a/app/src/main/java/mihon/core/migration/migrations/EnableAutoBackupMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/EnableAutoBackupMigration.kt @@ -10,7 +10,6 @@ class EnableAutoBackupMigration : Migration { override val version = 84f // Always attempt automatic backup creation - @Suppress("MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val context = migrationContext.get() ?: return false val backupPreferences = migrationContext.get() ?: return false diff --git a/app/src/main/java/mihon/core/migration/migrations/MigrateRotationViewerValuesMigration.kt b/app/src/main/java/mihon/core/migration/migrations/MigrateRotationViewerValuesMigration.kt index f364f7ec00..877624cae9 100644 --- a/app/src/main/java/mihon/core/migration/migrations/MigrateRotationViewerValuesMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/MigrateRotationViewerValuesMigration.kt @@ -11,7 +11,6 @@ class MigrateRotationViewerValuesMigration : Migration { override val version = 60f // Migrate Rotation and Viewer values to default values for viewer_flags - @Suppress("MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val context = migrationContext.get() ?: return false val prefs = PreferenceManager.getDefaultSharedPreferences(context) diff --git a/app/src/main/java/mihon/core/migration/migrations/MigrateSortingModeMigration.kt b/app/src/main/java/mihon/core/migration/migrations/MigrateSortingModeMigration.kt index dba141dd81..41dcf24685 100644 --- a/app/src/main/java/mihon/core/migration/migrations/MigrateSortingModeMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/MigrateSortingModeMigration.kt @@ -11,7 +11,6 @@ class MigrateSortingModeMigration : Migration { override val version = 64f // Switch to sort per category - @Suppress("CyclomaticComplexMethod", "MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val context = migrationContext.get() ?: return false val libraryPreferences = migrationContext.get() ?: return false diff --git a/app/src/main/java/mihon/core/migration/migrations/RelativeTimestampMigration.kt b/app/src/main/java/mihon/core/migration/migrations/RelativeTimestampMigration.kt index 036cf2b930..9b8a0a558e 100644 --- a/app/src/main/java/mihon/core/migration/migrations/RelativeTimestampMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/RelativeTimestampMigration.kt @@ -9,7 +9,6 @@ class RelativeTimestampMigration : Migration { override val version = 106f // Bring back simplified relative timestamp setting - @Suppress("MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val preferenceStore = migrationContext.get() ?: return false val uiPreferences = migrationContext.get() ?: return false diff --git a/app/src/main/java/mihon/core/migration/migrations/RemoveOneTwoHourUpdateMigration.kt b/app/src/main/java/mihon/core/migration/migrations/RemoveOneTwoHourUpdateMigration.kt index 0c43243670..0787920f57 100644 --- a/app/src/main/java/mihon/core/migration/migrations/RemoveOneTwoHourUpdateMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/RemoveOneTwoHourUpdateMigration.kt @@ -11,7 +11,6 @@ class RemoveOneTwoHourUpdateMigration : Migration { override val version = 61f // Handle removed every 1 or 2 hour library updates - @Suppress("MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val context = migrationContext.get() ?: return false val libraryPreferences = migrationContext.get() ?: return false diff --git a/app/src/main/java/mihon/core/migration/migrations/RemoveQuickUpdateMigration.kt b/app/src/main/java/mihon/core/migration/migrations/RemoveQuickUpdateMigration.kt index 7d551546c8..06f1b10dd1 100644 --- a/app/src/main/java/mihon/core/migration/migrations/RemoveQuickUpdateMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/RemoveQuickUpdateMigration.kt @@ -11,7 +11,6 @@ class RemoveQuickUpdateMigration : Migration { override val version = 71f // Handle removed every 3, 4, 6, and 8 hour library updates - @Suppress("MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val context = migrationContext.get() ?: return false val libraryPreferences = migrationContext.get() ?: return false diff --git a/app/src/main/java/mihon/core/migration/migrations/RemoveReaderTapMigration.kt b/app/src/main/java/mihon/core/migration/migrations/RemoveReaderTapMigration.kt index ea6ad7139b..0a11529282 100644 --- a/app/src/main/java/mihon/core/migration/migrations/RemoveReaderTapMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/RemoveReaderTapMigration.kt @@ -10,7 +10,6 @@ class RemoveReaderTapMigration : Migration { override val version = 77f // Remove reader tapping option in favor of disabled nav layouts - @Suppress("MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val context = migrationContext.get() ?: return false val readerPreferences = migrationContext.get() ?: return false diff --git a/app/src/main/java/mihon/core/migration/migrations/ResetSortPreferenceRemovedMigration.kt b/app/src/main/java/mihon/core/migration/migrations/ResetSortPreferenceRemovedMigration.kt index 89df599ecb..fdbca17351 100644 --- a/app/src/main/java/mihon/core/migration/migrations/ResetSortPreferenceRemovedMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/ResetSortPreferenceRemovedMigration.kt @@ -11,7 +11,6 @@ class ResetSortPreferenceRemovedMigration : Migration { override val version = 44f // Reset sorting preference if using removed sort by source - @Suppress("MagicNumber") override suspend fun invoke(migrationContext: MigrationContext): Boolean { val context = migrationContext.get() ?: return false val libraryPreferences = migrationContext.get() ?: return false diff --git a/data/src/main/java/tachiyomi/data/entries/anime/AnimeMapper.kt b/data/src/main/java/tachiyomi/data/entries/anime/AnimeMapper.kt index 924b2dd1f2..1e803bb918 100644 --- a/data/src/main/java/tachiyomi/data/entries/anime/AnimeMapper.kt +++ b/data/src/main/java/tachiyomi/data/entries/anime/AnimeMapper.kt @@ -5,7 +5,6 @@ import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.library.anime.LibraryAnime object AnimeMapper { - @Suppress("LongParameterList") fun mapAnime( id: Long, source: Long, @@ -58,7 +57,6 @@ object AnimeMapper { version = version, ) - @Suppress("LongParameterList") fun mapLibraryAnime( id: Long, source: Long, diff --git a/data/src/main/java/tachiyomi/data/entries/anime/AnimeRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/entries/anime/AnimeRepositoryImpl.kt index b445cbd2d8..c99b41f2c7 100644 --- a/data/src/main/java/tachiyomi/data/entries/anime/AnimeRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/entries/anime/AnimeRepositoryImpl.kt @@ -67,7 +67,6 @@ class AnimeRepositoryImpl( } } - @Suppress("MagicNumber") override suspend fun getUpcomingAnime(statuses: Set): Flow> { val epochMillis = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond() * 1000 return handler.subscribeToList { diff --git a/data/src/main/java/tachiyomi/data/items/episode/EpisodeRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/items/episode/EpisodeRepositoryImpl.kt index 0d96cdb9bb..4b3ac3af8d 100644 --- a/data/src/main/java/tachiyomi/data/items/episode/EpisodeRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/items/episode/EpisodeRepositoryImpl.kt @@ -117,7 +117,6 @@ class EpisodeRepositoryImpl( } } - @Suppress("LongParameterList") private fun mapEpisode( id: Long, animeId: Long, diff --git a/domain/src/main/java/mihon/domain/extensionrepo/anime/interactor/CreateAnimeExtensionRepo.kt b/domain/src/main/java/mihon/domain/extensionrepo/anime/interactor/CreateAnimeExtensionRepo.kt index d92c6812a2..b6c47ee5ed 100644 --- a/domain/src/main/java/mihon/domain/extensionrepo/anime/interactor/CreateAnimeExtensionRepo.kt +++ b/domain/src/main/java/mihon/domain/extensionrepo/anime/interactor/CreateAnimeExtensionRepo.kt @@ -48,7 +48,6 @@ class CreateAnimeExtensionRepo( * * @param repo Extension Repo holder for passing to DB/Error Dialog */ - @Suppress("ReturnCount") private suspend fun handleInsertionError(repo: ExtensionRepo): Result { val repoExists = repository.getRepo(repo.baseUrl) if (repoExists != null) { From 5ee7807ae2190bfdab6746bb175ddfe3e20791c6 Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sun, 27 Oct 2024 11:03:10 +0100 Subject: [PATCH 050/247] Generate locales_config.xml in build dir Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .../kotlin/mihon/buildlogic/ProjectExtensions.kt | 3 +++ .../mihon/buildlogic/tasks/LocalesConfigPlugin.kt | 8 ++++---- i18n/.gitignore | 2 -- i18n/build.gradle.kts | 13 +++++++++---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt index 2f78b61a37..9948b24ce1 100644 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt +++ b/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt @@ -15,6 +15,7 @@ import org.gradle.kotlin.dsl.the import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import java.io.File val Project.androidx get() = the() val Project.compose get() = the() @@ -105,3 +106,5 @@ internal fun Project.configureTest() { } } } + +val Project.generatedBuildDir: File get() = project.layout.buildDirectory.asFile.get().resolve("generated/mihon") diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigPlugin.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigPlugin.kt index 4a100cd0e0..329e4a769d 100644 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigPlugin.kt +++ b/buildSrc/src/main/kotlin/mihon/buildlogic/tasks/LocalesConfigPlugin.kt @@ -3,10 +3,11 @@ package mihon.buildlogic.tasks import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.TaskProvider +import java.io.File -private val emptyResourcesElement = "\\s*|".toRegex() +private val emptyResourcesElement = "\\s*|".toRegex() -fun Project.getLocalesConfigTask(): TaskProvider { +fun Project.getLocalesConfigTask(outputResourceDir: File): TaskProvider { return tasks.register("generateLocalesConfig") { val locales = fileTree("$projectDir/src/commonMain/moko-resources/") .matching { include("**/strings.xml") } @@ -16,7 +17,6 @@ fun Project.getLocalesConfigTask(): TaskProvider { .replace("base", "en") .replace("-r", "-") .replace("+", "-") - .takeIf(String::isNotBlank) ?: "en" } .sorted() .joinToString("\n") { "| " } @@ -28,7 +28,7 @@ fun Project.getLocalesConfigTask(): TaskProvider { | """.trimMargin() - file("$projectDir/src/androidMain/res/xml/locales_config.xml").apply { + outputResourceDir.resolve("xml/locales_config.xml").apply { parentFile.mkdirs() writeText(content) } diff --git a/i18n/.gitignore b/i18n/.gitignore index 601f2b1cd0..e69de29bb2 100644 --- a/i18n/.gitignore +++ b/i18n/.gitignore @@ -1,2 +0,0 @@ -# Generated -locales_config.xml \ No newline at end of file diff --git a/i18n/build.gradle.kts b/i18n/build.gradle.kts index 4b95ad331d..2754143d6c 100644 --- a/i18n/build.gradle.kts +++ b/i18n/build.gradle.kts @@ -1,3 +1,4 @@ +import mihon.buildlogic.generatedBuildDir import mihon.buildlogic.tasks.getLocalesConfigTask import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -21,13 +22,17 @@ kotlin { } } +val generatedAndroidResourceDir = generatedBuildDir.resolve("android/res") + android { namespace = "tachiyomi.i18n" sourceSets { - named("main") { - res.srcDir("src/commonMain/resources") - } + val main by getting + main.res.srcDirs( + "src/commonMain/resources", + generatedAndroidResourceDir, + ) } lint { @@ -40,7 +45,7 @@ multiplatformResources { } tasks { - val localesConfigTask = project.getLocalesConfigTask() + val localesConfigTask = project.getLocalesConfigTask(generatedAndroidResourceDir) preBuild { dependsOn(localesConfigTask) } From 93258dcbb94c8f4715ca53642b0a57f16c67da7f Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+antsylich@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:11:14 +0200 Subject: [PATCH 051/247] Add spotless (with ktlint) (#1136) (cherry picked from commit 5ae8095ef1ed2ae9f98486f9148e933c77a28692) --- .github/workflows/build_pull_request.yml | 2 +- .github/workflows/build_push.yml | 2 +- buildSrc/build.gradle.kts | 1 + ...hon.android.application.compose.gradle.kts | 2 ++ .../mihon.android.application.gradle.kts | 2 ++ .../main/kotlin/mihon.benchmark.gradle.kts | 2 ++ .../main/kotlin/mihon.code.lint.gradle.kts | 30 +++++++++++++++++++ .../kotlin/mihon.library.compose.gradle.kts | 2 ++ .../src/main/kotlin/mihon.library.gradle.kts | 2 ++ gradle/libs.versions.toml | 5 ++++ 10 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index d67f556894..93e4ab05f8 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -40,7 +40,7 @@ jobs: uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 - name: Build app and run unit tests - run: ./gradlew assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest + run: ./gradlew spotlessCheck assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest - name: Upload APK uses: actions/upload-artifact@v4 diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index c7ae34ae79..a920cc1948 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -37,7 +37,7 @@ jobs: uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 - name: Build app and run unit tests - run: ./gradlew assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest + run: ./gradlew spotlessCheck assembleStandardRelease testReleaseUnitTest testStandardReleaseUnitTest - name: Upload APK uses: actions/upload-artifact@v4 diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index b825b41720..5ed94c26ba 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -6,6 +6,7 @@ dependencies { implementation(androidx.gradle) implementation(kotlinx.gradle) implementation(kotlinx.compose.compiler.gradle) + implementation(libs.spotless.gradle) implementation(gradleApi()) implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) diff --git a/buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts b/buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts index 6b330b1d99..767f758cbe 100644 --- a/buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.android.application.compose.gradle.kts @@ -3,6 +3,8 @@ import mihon.buildlogic.configureCompose plugins { id("com.android.application") kotlin("android") + + id("mihon.code.lint") } android { diff --git a/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts b/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts index 7ba9c60fb5..080f9ca643 100644 --- a/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.android.application.gradle.kts @@ -5,6 +5,8 @@ import mihon.buildlogic.configureTest plugins { id("com.android.application") kotlin("android") + + id("mihon.code.lint") } android { diff --git a/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts b/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts index 3a43a2aa10..50c47f2801 100644 --- a/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.benchmark.gradle.kts @@ -4,6 +4,8 @@ import mihon.buildlogic.configureTest plugins { id("com.android.test") kotlin("android") + + id("mihon.code.lint") } android { diff --git a/buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts b/buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts new file mode 100644 index 0000000000..9dfa7eef21 --- /dev/null +++ b/buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts @@ -0,0 +1,30 @@ +import org.gradle.accessors.dm.LibrariesForLibs + +plugins { + id("com.diffplug.spotless") +} + +val libs = the() + +spotless { + kotlin { + target("**/*.kt", "**/*.kts") + targetExclude("**/build/**/*.kt") + ktlint(libs.ktlint.core.get().version) + .editorConfigOverride(mapOf( + "ktlint_function_naming_ignore_when_annotated_with" to "Composable", + "ktlint_standard_class-signature" to "disabled", + "ktlint_standard_discouraged-comment-location" to "disabled", + "ktlint_standard_function-expression-body" to "disabled", + "ktlint_standard_function-signature" to "disabled", + )) + trimTrailingWhitespace() + endWithNewline() + } + format("xml") { + target("**/*.xml") + targetExclude("**/build/**/*.xml") + trimTrailingWhitespace() + endWithNewline() + } +} diff --git a/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts b/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts index 0c37a3256f..7b377ce4ce 100644 --- a/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.library.compose.gradle.kts @@ -2,6 +2,8 @@ import mihon.buildlogic.configureCompose plugins { id("com.android.library") + + id("mihon.code.lint") } android { diff --git a/buildSrc/src/main/kotlin/mihon.library.gradle.kts b/buildSrc/src/main/kotlin/mihon.library.gradle.kts index 743bf07e32..4cf5f6efc7 100644 --- a/buildSrc/src/main/kotlin/mihon.library.gradle.kts +++ b/buildSrc/src/main/kotlin/mihon.library.gradle.kts @@ -3,6 +3,8 @@ import mihon.buildlogic.configureTest plugins { id("com.android.library") + + id("mihon.code.lint") } android { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 34572f424d..5ca318a510 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,8 @@ shizuku_version = "12.2.0" sqldelight = "2.0.2" sqlite = "2.4.0" voyager = "1.0.0" +spotless = "6.25.0" +ktlint-core = "1.3.1" [libraries] desugar = "com.android.tools:desugar_jdk_libs:2.0.4" @@ -102,6 +104,9 @@ seeker = "io.github.2307vivek:seeker:1.2.2" truetypeparser = "io.github.yubyf:truetypeparser-light:2.1.4" +spotless-gradle = { group = "com.diffplug.spotless", name = "spotless-plugin-gradle", version.ref = "spotless" } +ktlint-core = { module = "com.pinterest.ktlint:ktlint-cli", version.ref = "ktlint-core" } + [bundles] okhttp = ["okhttp-core", "okhttp-logging", "okhttp-brotli", "okhttp-dnsoverhttps"] js-engine = ["quickjs-android"] From 1cae533d6572870497b8a050cb9b1b82b6840bec Mon Sep 17 00:00:00 2001 From: Secozzi Date: Sun, 27 Oct 2024 21:36:32 +0100 Subject: [PATCH 052/247] Address spotless lint errors --- app/.idea/discord.xml | 2 +- app/.idea/gradle.xml | 2 +- app/.idea/misc.xml | 2 +- app/.idea/vcs.xml | 2 +- app/build.gradle.kts | 9 +-- app/src/debug/res/mipmap/ic_launcher.xml | 2 +- .../debug/res/mipmap/ic_launcher_round.xml | 2 +- .../java/eu/kanade/domain/ui/UiPreferences.kt | 6 +- .../anime/AnimeExtensionDetailsScreen.kt | 2 +- .../browse/anime/AnimeExtensionsScreen.kt | 4 +- .../browse/anime/AnimeSourcesScreen.kt | 4 +- .../manga/MangaExtensionDetailsScreen.kt | 2 +- .../browse/manga/MangaExtensionsScreen.kt | 4 +- .../browse/manga/MangaSourcesScreen.kt | 4 +- .../anime/components/AnimeEpisodeListItem.kt | 14 ++-- .../anime/components/AnimeInfoHeader.kt | 3 +- .../entries/components/ItemHeader.kt | 4 +- .../manga/components/MangaChapterListItem.kt | 10 +-- .../manga/components/MangaInfoHeader.kt | 3 +- .../library/components/CommonEntryItem.kt | 8 +- .../presentation/more/NewUpdateScreen.kt | 2 +- .../settings/screen/SettingsAdvancedScreen.kt | 2 +- .../settings/screen/SettingsPlayerScreen.kt | 48 ++++++------ .../screen/about/OpenSourceLicensesScreen.kt | 2 +- .../screen/debug/BackupSchemaScreen.kt | 6 +- .../settings/screen/debug/DebugInfoScreen.kt | 4 +- .../settings/screen/debug/WorkerInfoScreen.kt | 6 +- .../settings/widget/TriStateListDialog.kt | 4 +- .../more/stats/components/StatsItem.kt | 4 +- .../presentation/reader/ChapterTransition.kt | 6 +- .../track/anime/AnimeTrackInfoDialogHome.kt | 10 +-- .../track/manga/MangaTrackInfoDialogHome.kt | 13 ++-- .../updates/anime/AnimeUpdatesUiItem.kt | 6 +- .../updates/manga/MangaUpdatesUiItem.kt | 6 +- .../eu/kanade/presentation/util/Navigator.kt | 1 - .../data/backup/create/BackupCreator.kt | 2 +- .../creators/AnimeSourcesBackupCreator.kt | 2 +- .../data/backup/models/BackupAnimeTracking.kt | 3 +- .../data/backup/restore/RestoreOptions.kt | 3 +- .../restorers/AnimeExtensionRepoRestorer.kt | 2 +- .../restorers/MangaExtensionRepoRestorer.kt | 4 +- .../tachiyomi/data/coil/AnimeCoverFetcher.kt | 4 +- .../tachiyomi/data/coil/MangaCoverFetcher.kt | 4 +- .../data/database/models/anime/AnimeTrack.kt | 2 + .../database/models/anime/AnimeTrackImpl.kt | 2 + .../data/database/models/anime/Episode.kt | 2 + .../data/database/models/anime/EpisodeImpl.kt | 2 + .../data/database/models/manga/Chapter.kt | 2 + .../data/database/models/manga/ChapterImpl.kt | 2 + .../data/database/models/manga/MangaTrack.kt | 2 + .../database/models/manga/MangaTrackImpl.kt | 2 + .../data/download/anime/AnimeDownloader.kt | 8 +- .../download/anime/model/AnimeDownload.kt | 18 ++--- .../data/download/manga/MangaDownloader.kt | 15 ++-- .../library/anime/AnimeLibraryUpdateJob.kt | 4 +- .../library/manga/MangaLibraryUpdateJob.kt | 4 +- .../data/track/anilist/AnilistApi.kt | 64 ++++++++-------- .../data/track/bangumi/BangumiApi.kt | 58 +++++++------- .../tachiyomi/data/track/kitsu/KitsuApi.kt | 76 +++++++++---------- .../data/track/kitsu/KitsuDateHelper.kt | 4 +- .../data/track/model/AnimeTrackSearch.kt | 2 + .../data/track/model/MangaTrackSearch.kt | 2 + .../data/track/shikimori/ShikimoriApi.kt | 68 ++++++++--------- .../tachiyomi/data/track/simkl/SimklApi.kt | 48 ++++++------ .../kanade/tachiyomi/extension/InstallStep.kt | 8 +- .../extension/anime/AnimeExtensionManager.kt | 48 ++++++------ .../anime/util/AnimeExtensionLoader.kt | 2 +- .../extension/manga/MangaExtensionManager.kt | 48 ++++++------ .../manga/util/MangaExtensionLoader.kt | 2 +- .../base/delegate/SecureActivityDelegate.kt | 3 +- .../extension/AnimeExtensionsScreenModel.kt | 8 +- .../extension/MangaExtensionsScreenModel.kt | 8 +- .../eu/kanade/tachiyomi/ui/home/HomeScreen.kt | 10 +-- .../anime/AnimeLibrarySettingsScreenModel.kt | 2 +- .../manga/MangaLibrarySettingsScreenModel.kt | 2 +- .../eu/kanade/tachiyomi/ui/more/MoreTab.kt | 6 +- .../tachiyomi/ui/player/ExternalIntents.kt | 44 +++++------ .../tachiyomi/ui/player/PlayerViewModel.kt | 27 ++++--- .../settings/dialogs/EpisodeListDialog.kt | 6 +- .../settings/dialogs/SkipIntroLengthDialog.kt | 6 +- .../sheets/subtitle/SubtitleFontPage.kt | 6 +- .../tachiyomi/ui/player/viewer/PlayerEnums.kt | 23 ++++-- .../tachiyomi/ui/reader/ReaderViewModel.kt | 6 +- .../ui/reader/setting/ReaderPreferences.kt | 2 +- .../ui/reader/viewer/ReaderPageImageView.kt | 4 +- .../reader/viewer/pager/PagerViewerAdapter.kt | 3 +- .../viewer/webtoon/WebtoonRecyclerView.kt | 6 +- .../ui/reader/viewer/webtoon/WebtoonViewer.kt | 4 +- .../core/migration/MigrationJobFactory.kt | 10 ++- .../mihon/core/migration/MigrationStrategy.kt | 4 +- .../java/mihon/core/migration/Migrator.kt | 2 +- .../upcoming/components/calendar/Calendar.kt | 12 +-- .../components/calendar/CalendarDay.kt | 9 ++- .../components/calendar/CalendarHeader.kt | 10 +-- .../components/calendar/CalendarIndicator.kt | 8 +- app/src/main/res/anim/player_enter_bottom.xml | 2 +- app/src/main/res/anim/player_enter_left.xml | 2 +- app/src/main/res/anim/player_enter_right.xml | 2 +- app/src/main/res/anim/player_enter_top.xml | 2 +- app/src/main/res/anim/player_exit_bottom.xml | 2 +- app/src/main/res/anim/player_exit_left.xml | 2 +- app/src/main/res/anim/player_exit_right.xml | 2 +- app/src/main/res/anim/player_exit_top.xml | 2 +- app/src/main/res/anim/player_fade_in.xml | 2 +- app/src/main/res/anim/player_fade_out.xml | 2 +- .../drawable/ic_ani_monochrome_launcher.xml | 2 +- .../drawable/ic_animelibrary_filled_24dp.xml | 2 +- .../ic_animelibrary_selector_24dp.xml | 2 +- .../drawable/ic_brightness_negative_20dp.xml | 2 +- .../drawable/ic_brightness_positive_20dp.xml | 2 +- app/src/main/res/drawable/ic_circle_200dp.xml | 2 +- .../res/drawable/ic_circle_right_200dp.xml | 2 +- app/src/main/res/drawable/ic_glasses_24dp.xml | 2 +- .../drawable/ic_pause_circle_filled_24.xml | 2 +- .../drawable/ic_picture_in_picture_20dp.xml | 2 +- .../res/drawable/ic_play_circle_filled_24.xml | 2 +- .../res/drawable/ic_play_seek_triangle.xml | 2 +- .../res/drawable/ic_updates_outline_24dp.xml | 2 +- .../main/res/drawable/ic_volume_off_24dp.xml | 2 +- .../main/res/drawable/ic_volume_on_20dp.xml | 2 +- .../drawable/material_popup_background.xml | 2 +- app/src/main/res/drawable/player_bar.xml | 2 +- .../main/res/layout/player_chapters_item.xml | 2 +- app/src/main/res/layout/player_controls.xml | 2 +- .../layout/player_double_tap_seek_view.xml | 2 +- .../main/res/layout/player_tracks_item.xml | 2 +- .../res/layout/pref_skip_intro_length.xml | 2 +- app/src/main/res/mipmap/ic_launcher.xml | 2 +- app/src/main/res/mipmap/ic_launcher_round.xml | 2 +- app/src/main/res/raw/keep.xml | 2 +- .../res/values-night/colors_cottoncandy.xml | 1 - .../main/res/values/colors_cottoncandy.xml | 3 +- app/src/main/res/values/themes.xml | 2 +- app/src/main/res/xml/s_pen_actions.xml | 2 +- .../java/mihon/core/migration/MigratorTest.kt | 4 +- core-metadata/src/main/AndroidManifest.xml | 2 +- core/common/src/main/AndroidManifest.xml | 2 +- .../eu/kanade/tachiyomi/network/Requests.kt | 2 + data/src/main/AndroidManifest.xml | 2 +- .../handlers/anime/QueryPagingAnimeSource.kt | 8 +- .../handlers/manga/QueryPagingMangaSource.kt | 8 +- domain/src/main/AndroidManifest.xml | 2 +- .../interactor/ShouldUpdateDbChapter.kt | 3 +- .../interactor/ShouldUpdateDbEpisode.kt | 3 +- .../interactor/GetApplicationRelease.kt | 3 +- .../tachiyomi/domain/release/model/Release.kt | 2 +- .../commonMain/moko-resources/am/plurals.xml | 2 +- .../commonMain/moko-resources/am/strings.xml | 2 +- .../commonMain/moko-resources/ar/plurals.xml | 2 +- .../commonMain/moko-resources/ar/strings.xml | 4 +- .../commonMain/moko-resources/as/strings.xml | 2 +- .../moko-resources/base/plurals.xml | 2 +- .../moko-resources/base/strings.xml | 2 +- .../commonMain/moko-resources/be/plurals.xml | 2 +- .../commonMain/moko-resources/be/strings.xml | 2 +- .../commonMain/moko-resources/bg/plurals.xml | 2 +- .../commonMain/moko-resources/bg/strings.xml | 2 +- .../commonMain/moko-resources/bn/plurals.xml | 2 +- .../commonMain/moko-resources/bn/strings.xml | 2 +- .../commonMain/moko-resources/ca/plurals.xml | 2 +- .../commonMain/moko-resources/ca/strings.xml | 2 +- .../commonMain/moko-resources/ceb/plurals.xml | 2 +- .../commonMain/moko-resources/ceb/strings.xml | 2 +- .../commonMain/moko-resources/cs/plurals.xml | 2 +- .../commonMain/moko-resources/cs/strings.xml | 2 +- .../commonMain/moko-resources/cv/plurals.xml | 2 +- .../commonMain/moko-resources/cv/strings.xml | 2 +- .../commonMain/moko-resources/da/plurals.xml | 2 +- .../commonMain/moko-resources/da/strings.xml | 2 +- .../commonMain/moko-resources/de/plurals.xml | 2 +- .../commonMain/moko-resources/de/strings.xml | 2 +- .../commonMain/moko-resources/el/plurals.xml | 2 +- .../commonMain/moko-resources/el/strings.xml | 2 +- .../commonMain/moko-resources/eo/plurals.xml | 2 +- .../commonMain/moko-resources/eo/strings.xml | 2 +- .../commonMain/moko-resources/es/plurals.xml | 2 +- .../commonMain/moko-resources/es/strings.xml | 4 +- .../commonMain/moko-resources/eu/plurals.xml | 2 +- .../commonMain/moko-resources/eu/strings.xml | 2 +- .../commonMain/moko-resources/fa/plurals.xml | 2 +- .../commonMain/moko-resources/fa/strings.xml | 2 +- .../commonMain/moko-resources/fi/plurals.xml | 2 +- .../commonMain/moko-resources/fi/strings.xml | 2 +- .../commonMain/moko-resources/fil/plurals.xml | 2 +- .../commonMain/moko-resources/fil/strings.xml | 2 +- .../commonMain/moko-resources/fr/plurals.xml | 2 +- .../commonMain/moko-resources/fr/strings.xml | 2 +- .../commonMain/moko-resources/gl/plurals.xml | 2 +- .../commonMain/moko-resources/gl/strings.xml | 2 +- .../commonMain/moko-resources/he/plurals.xml | 2 +- .../commonMain/moko-resources/he/strings.xml | 2 +- .../commonMain/moko-resources/hi/plurals.xml | 2 +- .../commonMain/moko-resources/hi/strings.xml | 2 +- .../commonMain/moko-resources/hr/plurals.xml | 2 +- .../commonMain/moko-resources/hr/strings.xml | 2 +- .../commonMain/moko-resources/hu/plurals.xml | 2 +- .../commonMain/moko-resources/hu/strings.xml | 2 +- .../commonMain/moko-resources/in/plurals.xml | 2 +- .../commonMain/moko-resources/in/strings.xml | 2 +- .../commonMain/moko-resources/it/plurals.xml | 2 +- .../commonMain/moko-resources/it/strings.xml | 2 +- .../moko-resources/ja/plurals-aniyomi.xml | 2 +- .../commonMain/moko-resources/ja/plurals.xml | 2 +- .../commonMain/moko-resources/ja/strings.xml | 2 +- .../moko-resources/jv/plurals-aniyomi.xml | 2 +- .../commonMain/moko-resources/jv/plurals.xml | 2 +- .../commonMain/moko-resources/jv/strings.xml | 2 +- .../moko-resources/ka-rGE/plurals.xml | 2 +- .../moko-resources/ka-rGE/strings.xml | 2 +- .../commonMain/moko-resources/kk/plurals.xml | 2 +- .../commonMain/moko-resources/kk/strings.xml | 2 +- .../moko-resources/km/plurals-aniyomi.xml | 2 +- .../commonMain/moko-resources/km/plurals.xml | 2 +- .../commonMain/moko-resources/km/strings.xml | 2 +- .../commonMain/moko-resources/kn/plurals.xml | 2 +- .../commonMain/moko-resources/kn/strings.xml | 2 +- .../commonMain/moko-resources/ko/plurals.xml | 2 +- .../commonMain/moko-resources/ko/strings.xml | 2 +- .../commonMain/moko-resources/lt/plurals.xml | 2 +- .../commonMain/moko-resources/lt/strings.xml | 2 +- .../commonMain/moko-resources/lv/plurals.xml | 2 +- .../commonMain/moko-resources/lv/strings.xml | 2 +- .../commonMain/moko-resources/ml/plurals.xml | 2 +- .../commonMain/moko-resources/ml/strings.xml | 2 +- .../commonMain/moko-resources/mr/plurals.xml | 2 +- .../commonMain/moko-resources/mr/strings.xml | 2 +- .../moko-resources/ms/plurals-aniyomi.xml | 2 +- .../commonMain/moko-resources/ms/plurals.xml | 2 +- .../commonMain/moko-resources/ms/strings.xml | 2 +- .../moko-resources/nb-rNO/plurals.xml | 2 +- .../moko-resources/nb-rNO/strings.xml | 2 +- .../commonMain/moko-resources/ne/plurals.xml | 2 +- .../commonMain/moko-resources/ne/strings.xml | 2 +- .../commonMain/moko-resources/nl/plurals.xml | 2 +- .../commonMain/moko-resources/nl/strings.xml | 2 +- .../commonMain/moko-resources/nn/plurals.xml | 2 +- .../commonMain/moko-resources/nn/strings.xml | 2 +- .../commonMain/moko-resources/pl/plurals.xml | 2 +- .../commonMain/moko-resources/pl/strings.xml | 2 +- .../moko-resources/pt-rBR/plurals.xml | 2 +- .../moko-resources/pt-rBR/strings.xml | 2 +- .../commonMain/moko-resources/pt/plurals.xml | 2 +- .../commonMain/moko-resources/pt/strings.xml | 6 +- .../commonMain/moko-resources/ro/plurals.xml | 2 +- .../commonMain/moko-resources/ro/strings.xml | 2 +- .../commonMain/moko-resources/ru/plurals.xml | 2 +- .../commonMain/moko-resources/ru/strings.xml | 2 +- .../commonMain/moko-resources/sa/plurals.xml | 2 +- .../commonMain/moko-resources/sa/strings.xml | 2 +- .../moko-resources/sah/plurals-aniyomi.xml | 2 +- .../commonMain/moko-resources/sah/plurals.xml | 2 +- .../commonMain/moko-resources/sah/strings.xml | 2 +- .../commonMain/moko-resources/sc/plurals.xml | 2 +- .../commonMain/moko-resources/sc/strings.xml | 2 +- .../commonMain/moko-resources/sdh/plurals.xml | 2 +- .../commonMain/moko-resources/sdh/strings.xml | 2 +- .../commonMain/moko-resources/sk/plurals.xml | 2 +- .../commonMain/moko-resources/sk/strings.xml | 2 +- .../commonMain/moko-resources/sq/plurals.xml | 2 +- .../commonMain/moko-resources/sq/strings.xml | 2 +- .../commonMain/moko-resources/sr/plurals.xml | 2 +- .../commonMain/moko-resources/sr/strings.xml | 2 +- .../commonMain/moko-resources/sv/plurals.xml | 2 +- .../commonMain/moko-resources/sv/strings.xml | 2 +- .../commonMain/moko-resources/te/plurals.xml | 2 +- .../commonMain/moko-resources/te/strings.xml | 2 +- .../moko-resources/th/plurals-aniyomi.xml | 2 +- .../commonMain/moko-resources/th/plurals.xml | 2 +- .../commonMain/moko-resources/th/strings.xml | 2 +- .../commonMain/moko-resources/tr/plurals.xml | 2 +- .../commonMain/moko-resources/tr/strings.xml | 2 +- .../commonMain/moko-resources/uk/plurals.xml | 2 +- .../commonMain/moko-resources/uk/strings.xml | 2 +- .../commonMain/moko-resources/uz/plurals.xml | 2 +- .../commonMain/moko-resources/uz/strings.xml | 2 +- .../moko-resources/vi/plurals-aniyomi.xml | 2 +- .../commonMain/moko-resources/vi/plurals.xml | 2 +- .../commonMain/moko-resources/vi/strings.xml | 4 +- .../moko-resources/zh-rCN/plurals.xml | 2 +- .../moko-resources/zh-rCN/strings.xml | 2 +- .../moko-resources/zh-rTW/plurals-aniyomi.xml | 2 +- .../moko-resources/zh-rTW/plurals.xml | 2 +- .../moko-resources/zh-rTW/strings.xml | 2 +- i18n/src/main/AndroidManifest.xml | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../core/components/AdaptiveSheet.kt | 4 +- .../core/components/SettingsItems.kt | 7 +- .../core/components/VerticalFastScroller.kt | 3 +- .../core/components/WheelPicker.kt | 10 +-- .../core/components/material/Button.kt | 4 +- .../core/components/material/Constants.kt | 4 +- .../core/components/material/Scaffold.kt | 4 +- .../presentation/core/icons/Discord.kt | 17 ++++- .../presentation/core/icons/Github.kt | 17 ++++- .../presentation/core/util/Modifier.kt | 4 +- .../res/values-night/color_cloudflare.xml | 2 - .../src/main/res/values-night/color_doom.xml | 1 - .../main/res/values-night/color_matrix.xml | 1 - .../main/res/values-night/color_sapphire.xml | 1 - .../res/values-night/colors_midnightdusk.xml | 2 +- .../res/values-night/colors_tidalwave.xml | 2 +- .../src/main/res/values/color_cloudflare.xml | 1 - .../src/main/res/values/color_doom.xml | 1 - .../src/main/res/values/color_matrix.xml | 1 - .../src/main/res/values/color_sapphire.xml | 1 - .../src/main/res/values/colors_tidalwave.xml | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../appwidget_coverscreen_background.xml | 2 +- .../layout/appwidget_coverscreen_loading.xml | 2 +- .../src/main/res/values/colors_appwidget.xml | 2 +- .../src/main/res/values/dimens.xml | 2 +- .../updates_grid_lockscreen_widget_info.xml | 2 +- ...updates_grid_samsung_cover_widget_info.xml | 2 +- .../src/androidMain/AndroidManifest.xml | 2 +- .../tachiyomi/animesource/model/SAnime.kt | 2 + .../tachiyomi/animesource/model/SAnimeImpl.kt | 2 + .../tachiyomi/animesource/model/SEpisode.kt | 2 + .../animesource/model/SEpisodeImpl.kt | 2 + .../kanade/tachiyomi/source/model/SChapter.kt | 2 + .../tachiyomi/source/model/SChapterImpl.kt | 2 + .../kanade/tachiyomi/source/model/SManga.kt | 2 + .../tachiyomi/source/model/SMangaImpl.kt | 2 + .../src/androidMain/AndroidManifest.xml | 2 +- .../local/entries/anime/LocalAnimeSource.kt | 17 +++-- .../local/entries/manga/LocalMangaSource.kt | 15 ++-- 325 files changed, 819 insertions(+), 702 deletions(-) diff --git a/app/.idea/discord.xml b/app/.idea/discord.xml index d8e9561668..e016cd84e7 100644 --- a/app/.idea/discord.xml +++ b/app/.idea/discord.xml @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/app/.idea/misc.xml b/app/.idea/misc.xml index 6dc906734c..3fca0de45e 100644 --- a/app/.idea/misc.xml +++ b/app/.idea/misc.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/app/.idea/vcs.xml b/app/.idea/vcs.xml index 6c0b863585..54e4b961ee 100644 --- a/app/.idea/vcs.xml +++ b/app/.idea/vcs.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 854ba7a37f..5d42995e64 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,8 +2,6 @@ import mihon.buildlogic.getBuildTime import mihon.buildlogic.getCommitCount import mihon.buildlogic.getGitSha import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.io.FileInputStream -import java.util.Properties plugins { id("mihon.android.application") @@ -15,7 +13,7 @@ plugins { shortcutHelper.setFilePath("./shortcuts.xml") -val SUPPORTED_ABIS = setOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") +val supportedAbis = setOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") android { namespace = "eu.kanade.tachiyomi" @@ -45,7 +43,7 @@ android { // buildConfigField("String", "ACRA_PASSWORD", "\"$acraPassword\"") ndk { - abiFilters += SUPPORTED_ABIS + abiFilters += supportedAbis } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" @@ -55,7 +53,7 @@ android { abi { isEnable = true reset() - include(*SUPPORTED_ABIS.toTypedArray()) + include(*supportedAbis.toTypedArray()) isUniversalApk = true } } @@ -247,7 +245,6 @@ dependencies { implementation(libs.compose.webview) implementation(libs.compose.grid) - // Logging implementation(libs.logcat) diff --git a/app/src/debug/res/mipmap/ic_launcher.xml b/app/src/debug/res/mipmap/ic_launcher.xml index dcbbdf1218..4f4ecc0d2e 100644 --- a/app/src/debug/res/mipmap/ic_launcher.xml +++ b/app/src/debug/res/mipmap/ic_launcher.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/debug/res/mipmap/ic_launcher_round.xml b/app/src/debug/res/mipmap/ic_launcher_round.xml index dcbbdf1218..4f4ecc0d2e 100644 --- a/app/src/debug/res/mipmap/ic_launcher_round.xml +++ b/app/src/debug/res/mipmap/ic_launcher_round.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt b/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt index e54886b456..7496cf6e88 100644 --- a/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt +++ b/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt @@ -21,7 +21,11 @@ class UiPreferences( fun appTheme() = preferenceStore.getEnum( "pref_app_theme", - if (DeviceUtil.isDynamicColorAvailable) { AppTheme.MONET } else { AppTheme.DEFAULT }, + if (DeviceUtil.isDynamicColorAvailable) { + AppTheme.MONET + } else { + AppTheme.DEFAULT + }, ) fun themeDarkAmoled() = preferenceStore.getBoolean("pref_theme_dark_amoled_key", false) diff --git a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionDetailsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionDetailsScreen.kt index 0ed3010298..b8d9f181d2 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionDetailsScreen.kt @@ -241,7 +241,7 @@ private fun DetailsHeader( Update available: ${extension.hasUpdate} Obsolete: ${extension.isObsolete} Shared: ${extension.isShared} - Repository: ${extension.repoUrl} + Repository: ${extension.repoUrl} """.trimIndent(), ) } diff --git a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt index 45f1348812..68c61d0870 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt @@ -217,7 +217,9 @@ private fun AnimeExtensionContent( when (it) { is AnimeExtension.Available -> onInstallExtension(it) is AnimeExtension.Installed -> onOpenExtension(it) - is AnimeExtension.Untrusted -> { trustState = it } + is AnimeExtension.Untrusted -> { + trustState = it + } } }, onLongClickItem = onLongClickItem, diff --git a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesScreen.kt index d2ce30aa4f..4ce0bd5558 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesScreen.kt @@ -28,7 +28,7 @@ import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.domain.source.anime.model.Pin import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn -import tachiyomi.presentation.core.components.material.SecondaryItemAlpha +import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource @@ -151,7 +151,7 @@ private fun AnimeSourcePinButton( MaterialTheme.colorScheme.primary } else { MaterialTheme.colorScheme.onBackground.copy( - alpha = SecondaryItemAlpha, + alpha = SECONDARY_ALPHA, ) } val description = if (isPinned) MR.strings.action_unpin else MR.strings.action_pin diff --git a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionDetailsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionDetailsScreen.kt index 92423923c6..d0c3557612 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionDetailsScreen.kt @@ -242,7 +242,7 @@ private fun DetailsHeader( Update available: ${extension.hasUpdate} Obsolete: ${extension.isObsolete} Shared: ${extension.isShared} - Repository: ${extension.repoUrl} + Repository: ${extension.repoUrl} """.trimIndent(), ) } diff --git a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt index 9386bc0a15..55584f526f 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt @@ -219,7 +219,9 @@ private fun ExtensionContent( when (it) { is MangaExtension.Available -> onInstallExtension(it) is MangaExtension.Installed -> onOpenExtension(it) - is MangaExtension.Untrusted -> { trustState = it } + is MangaExtension.Untrusted -> { + trustState = it + } } }, onLongClickItem = onLongClickItem, diff --git a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesScreen.kt index 8640bf6bc8..978fcf2441 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesScreen.kt @@ -28,7 +28,7 @@ import tachiyomi.domain.source.manga.model.Pin import tachiyomi.domain.source.manga.model.Source import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn -import tachiyomi.presentation.core.components.material.SecondaryItemAlpha +import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource @@ -151,7 +151,7 @@ private fun SourcePinButton( MaterialTheme.colorScheme.primary } else { MaterialTheme.colorScheme.onBackground.copy( - alpha = SecondaryItemAlpha, + alpha = SECONDARY_ALPHA, ) } val description = if (isPinned) MR.strings.action_unpin else MR.strings.action_pin diff --git a/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeEpisodeListItem.kt b/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeEpisodeListItem.kt index 14393baa31..55f288f935 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeEpisodeListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeEpisodeListItem.kt @@ -44,8 +44,8 @@ import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import me.saket.swipe.SwipeableActionsBox import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR -import tachiyomi.presentation.core.components.material.ReadItemAlpha -import tachiyomi.presentation.core.components.material.SecondaryItemAlpha +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA +import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground @@ -136,7 +136,7 @@ fun AnimeEpisodeListItem( maxLines = 1, overflow = TextOverflow.Ellipsis, onTextLayout = { textHeight = it.size.height }, - color = LocalContentColor.current.copy(alpha = if (seen) ReadItemAlpha else 1f), + color = LocalContentColor.current.copy(alpha = if (seen) DISABLED_ALPHA else 1f), ) } @@ -144,7 +144,7 @@ fun AnimeEpisodeListItem( val subtitleStyle = MaterialTheme.typography.bodySmall .merge( color = LocalContentColor.current - .copy(alpha = if (seen) ReadItemAlpha else SecondaryItemAlpha) + .copy(alpha = if (seen) DISABLED_ALPHA else SECONDARY_ALPHA), ) ProvideTextStyle(value = subtitleStyle) { if (date != null) { @@ -160,7 +160,7 @@ fun AnimeEpisodeListItem( text = watchProgress, maxLines = 1, overflow = TextOverflow.Ellipsis, - color = LocalContentColor.current.copy(alpha = ReadItemAlpha), + color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), ) if (scanlator != null) DotSeparatorText() } @@ -238,12 +238,12 @@ fun NextEpisodeAiringListItem( maxLines = 1, overflow = TextOverflow.Ellipsis, onTextLayout = { textHeight = it.size.height }, - modifier = Modifier.alpha(SecondaryItemAlpha), + modifier = Modifier.alpha(SECONDARY_ALPHA), color = MaterialTheme.colorScheme.primary, ) } Spacer(modifier = Modifier.height(6.dp)) - Row(modifier = Modifier.alpha(SecondaryItemAlpha)) { + Row(modifier = Modifier.alpha(SECONDARY_ALPHA)) { ProvideTextStyle( value = MaterialTheme.typography.bodyMedium.copy(fontSize = 12.sp), ) { diff --git a/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt index f4f0bbe910..75847645da 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt @@ -83,6 +83,7 @@ import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource @@ -179,7 +180,7 @@ fun AnimeActionRow( onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) { - val defaultActionButtonColor = MaterialTheme.colorScheme.onSurface.copy(alpha = .38f) + val defaultActionButtonColor = MaterialTheme.colorScheme.onSurface.copy(alpha = DISABLED_ALPHA) // TODO: show something better when using custom interval val nextUpdateDays = remember(nextUpdate) { diff --git a/app/src/main/java/eu/kanade/presentation/entries/components/ItemHeader.kt b/app/src/main/java/eu/kanade/presentation/entries/components/ItemHeader.kt index cdfcd52906..9c6e75e53e 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/components/ItemHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/components/ItemHeader.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import tachiyomi.i18n.MR -import tachiyomi.presentation.core.components.material.SecondaryItemAlpha +import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource @@ -63,6 +63,6 @@ private fun MissingItemsWarning(count: Int) { maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.error.copy(alpha = SecondaryItemAlpha), + color = MaterialTheme.colorScheme.error.copy(alpha = SECONDARY_ALPHA), ) } diff --git a/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaChapterListItem.kt b/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaChapterListItem.kt index 79a1da0705..f3e881449c 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaChapterListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaChapterListItem.kt @@ -41,8 +41,8 @@ import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import me.saket.swipe.SwipeableActionsBox import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR -import tachiyomi.presentation.core.components.material.ReadItemAlpha -import tachiyomi.presentation.core.components.material.SecondaryItemAlpha +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA +import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground @@ -134,7 +134,7 @@ fun MangaChapterListItem( maxLines = 1, overflow = TextOverflow.Ellipsis, onTextLayout = { textHeight = it.size.height }, - color = LocalContentColor.current.copy(alpha = if (read) ReadItemAlpha else 1f), + color = LocalContentColor.current.copy(alpha = if (read) DISABLED_ALPHA else 1f), ) } @@ -142,7 +142,7 @@ fun MangaChapterListItem( val subtitleStyle = MaterialTheme.typography.bodySmall .merge( color = LocalContentColor.current - .copy(alpha = if (read) ReadItemAlpha else SecondaryItemAlpha) + .copy(alpha = if (read) DISABLED_ALPHA else SECONDARY_ALPHA), ) ProvideTextStyle(value = subtitleStyle) { if (date != null) { @@ -158,7 +158,7 @@ fun MangaChapterListItem( text = readProgress, maxLines = 1, overflow = TextOverflow.Ellipsis, - color = LocalContentColor.current.copy(alpha = ReadItemAlpha), + color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), ) if (scanlator != null) DotSeparatorText() } diff --git a/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt index 5585cd9fdb..c4f171853e 100644 --- a/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt @@ -83,6 +83,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource @@ -179,7 +180,7 @@ fun MangaActionRow( onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) { - val defaultActionButtonColor = MaterialTheme.colorScheme.onSurface.copy(alpha = .38f) + val defaultActionButtonColor = MaterialTheme.colorScheme.onSurface.copy(alpha = DISABLED_ALPHA) // TODO: show something better when using custom interval val nextUpdateDays = remember(nextUpdate) { diff --git a/app/src/main/java/eu/kanade/presentation/library/components/CommonEntryItem.kt b/app/src/main/java/eu/kanade/presentation/library/components/CommonEntryItem.kt index 43c9ecd4c6..0252426fb2 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/CommonEntryItem.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/CommonEntryItem.kt @@ -62,7 +62,7 @@ private val ContinueViewingButtonIconSizeLarge = 20.dp private val ContinueViewingButtonGridPadding = 6.dp private val ContinueViewingButtonListSpacing = 8.dp -private const val GridSelectedCoverAlpha = 0.76f +private const val GRID_SELECTED_COVER_ALPHA = 0.76f /** * Layout of grid list item with title overlaying the cover. @@ -90,7 +90,7 @@ fun EntryCompactGridItem( ItemCover.Book( modifier = Modifier .fillMaxWidth() - .alpha(if (isSelected) GridSelectedCoverAlpha else coverAlpha), + .alpha(if (isSelected) GRID_SELECTED_COVER_ALPHA else coverAlpha), data = coverData, ) }, @@ -197,7 +197,7 @@ fun EntryComfortableGridItem( ItemCover.Book( modifier = Modifier .fillMaxWidth() - .alpha(if (isSelected) GridSelectedCoverAlpha else coverAlpha), + .alpha(if (isSelected) GRID_SELECTED_COVER_ALPHA else coverAlpha), data = coverData, ) }, @@ -392,7 +392,7 @@ private fun ContinueViewingButton( containerColor = MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.9f), contentColor = contentColorFor(MaterialTheme.colorScheme.primaryContainer), ), - modifier = Modifier.size(size) + modifier = Modifier.size(size), ) { Icon( imageVector = Icons.Filled.PlayArrow, diff --git a/app/src/main/java/eu/kanade/presentation/more/NewUpdateScreen.kt b/app/src/main/java/eu/kanade/presentation/more/NewUpdateScreen.kt index 3d561b0c36..87dd1ee4d3 100644 --- a/app/src/main/java/eu/kanade/presentation/more/NewUpdateScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/NewUpdateScreen.kt @@ -75,7 +75,7 @@ private fun NewUpdateScreenPreview() { changelogInfo = """ ## Yay Foobar - + ### More info - Hello - World diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt index 17184551e7..866bd9b620 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt @@ -366,7 +366,7 @@ object SettingsAdvancedScreen : SearchableSettings { chooseColorProfile.launch(arrayOf("*/*")) }, ), - ) + ), ) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt index f8632aa5d5..d1b647493f 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt @@ -22,18 +22,18 @@ import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.base.BasePreferences import eu.kanade.presentation.more.settings.Preference -import eu.kanade.tachiyomi.ui.player.JustPlayer -import eu.kanade.tachiyomi.ui.player.MpvKt -import eu.kanade.tachiyomi.ui.player.MpvKtPreview -import eu.kanade.tachiyomi.ui.player.MpvPlayer -import eu.kanade.tachiyomi.ui.player.MpvRemote -import eu.kanade.tachiyomi.ui.player.MxPlayer -import eu.kanade.tachiyomi.ui.player.MxPlayerFree -import eu.kanade.tachiyomi.ui.player.MxPlayerPro -import eu.kanade.tachiyomi.ui.player.NextPlayer -import eu.kanade.tachiyomi.ui.player.VlcPlayer -import eu.kanade.tachiyomi.ui.player.WebVideoCaster -import eu.kanade.tachiyomi.ui.player.XPlayer +import eu.kanade.tachiyomi.ui.player.JUST_PLAYER +import eu.kanade.tachiyomi.ui.player.MPV_KT +import eu.kanade.tachiyomi.ui.player.MPV_KT_PREVIEW +import eu.kanade.tachiyomi.ui.player.MPV_PLAYER +import eu.kanade.tachiyomi.ui.player.MPV_REMOTE +import eu.kanade.tachiyomi.ui.player.MX_PLAYER +import eu.kanade.tachiyomi.ui.player.MX_PLAYER_FREE +import eu.kanade.tachiyomi.ui.player.MX_PLAYER_PRO +import eu.kanade.tachiyomi.ui.player.NEXT_PLAYER +import eu.kanade.tachiyomi.ui.player.VLC_PLAYER +import eu.kanade.tachiyomi.ui.player.WEB_VIDEO_CASTER +import eu.kanade.tachiyomi.ui.player.X_PLAYER import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.ui.player.viewer.AudioChannels import kotlinx.collections.immutable.persistentListOf @@ -442,16 +442,16 @@ object SettingsPlayerScreen : SearchableSettings { } val externalPlayers = listOf( - MpvPlayer, - MxPlayer, - MxPlayerFree, - MxPlayerPro, - VlcPlayer, - MpvKt, - MpvKtPreview, - MpvRemote, - JustPlayer, - NextPlayer, - XPlayer, - WebVideoCaster, + MPV_PLAYER, + MX_PLAYER, + MX_PLAYER_FREE, + MX_PLAYER_PRO, + VLC_PLAYER, + MPV_KT, + MPV_KT_PREVIEW, + MPV_REMOTE, + JUST_PLAYER, + NEXT_PLAYER, + X_PLAYER, + WEB_VIDEO_CASTER, ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt index 12e07834b2..0502738e54 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt @@ -36,7 +36,7 @@ class OpenSourceLicensesScreen : Screen() { name = it.name, website = it.website, license = it.licenses.firstOrNull()?.htmlReadyLicenseContent.orEmpty(), - ) + ), ) }, ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/BackupSchemaScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/BackupSchemaScreen.kt index 4e2d570674..98c9153cdb 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/BackupSchemaScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/BackupSchemaScreen.kt @@ -28,7 +28,7 @@ import tachiyomi.presentation.core.i18n.stringResource class BackupSchemaScreen : Screen() { companion object { - const val title = "Backup file schema" + const val TITLE = "Backup file schema" } @Composable @@ -45,7 +45,7 @@ class BackupSchemaScreen : Screen() { Scaffold( topBar = { AppBar( - title = title, + title = TITLE, navigateUp = navigator::pop, actions = { AppBarActions( @@ -54,7 +54,7 @@ class BackupSchemaScreen : Screen() { title = stringResource(MR.strings.action_copy_to_clipboard), icon = Icons.Default.ContentCopy, onClick = { - context.copyToClipboard(title, schema) + context.copyToClipboard(TITLE, schema) }, ), ), diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt index f9de12eabf..bb742bdb26 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt @@ -31,11 +31,11 @@ class DebugInfoScreen : Screen() { itemsProvider = { listOf( Preference.PreferenceItem.TextPreference( - title = WorkerInfoScreen.title, + title = WorkerInfoScreen.TITLE, onClick = { navigator.push(WorkerInfoScreen()) }, ), Preference.PreferenceItem.TextPreference( - title = BackupSchemaScreen.title, + title = BackupSchemaScreen.TITLE, onClick = { navigator.push(BackupSchemaScreen()) }, ), getAppInfoGroup(), diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt index e838dd666d..d5207dedf0 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt @@ -49,7 +49,7 @@ import java.time.ZoneId class WorkerInfoScreen : Screen() { companion object { - const val title = "Worker info" + const val TITLE = "Worker info" } @Composable @@ -65,7 +65,7 @@ class WorkerInfoScreen : Screen() { Scaffold( topBar = { AppBar( - title = title, + title = TITLE, navigateUp = navigator::pop, actions = { AppBarActions( @@ -75,7 +75,7 @@ class WorkerInfoScreen : Screen() { icon = Icons.Default.ContentCopy, onClick = { context.copyToClipboard( - title, + TITLE, enqueued + finished + running, ) }, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/TriStateListDialog.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/TriStateListDialog.kt index 5f30ae245a..fdd8d3d088 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/TriStateListDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/TriStateListDialog.kt @@ -33,7 +33,9 @@ import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource private enum class State { - CHECKED, INVERSED, UNCHECKED + CHECKED, + INVERSED, + UNCHECKED, } @SuppressLint("ComposeParameterOrder") diff --git a/app/src/main/java/eu/kanade/presentation/more/stats/components/StatsItem.kt b/app/src/main/java/eu/kanade/presentation/more/stats/components/StatsItem.kt index 8002b3d048..d38643ee12 100644 --- a/app/src/main/java/eu/kanade/presentation/more/stats/components/StatsItem.kt +++ b/app/src/main/java/eu/kanade/presentation/more/stats/components/StatsItem.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import tachiyomi.presentation.core.components.material.SecondaryItemAlpha +import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding @Composable @@ -73,7 +73,7 @@ private fun RowScope.BaseStatsItem( style = subtitleStyle .copy( color = MaterialTheme.colorScheme.onSurface - .copy(alpha = SecondaryItemAlpha), + .copy(alpha = SECONDARY_ALPHA), ), textAlign = TextAlign.Center, ) diff --git a/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt b/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt index 807bd34ff1..b5fa3684c8 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt @@ -230,7 +230,7 @@ private fun ChapterText( Text( text = buildAnnotatedString { if (downloaded) { - appendInlineContent(DownloadedIconContentId) + appendInlineContent(DOWNLOADED_ICON_ID) append(' ') } append(name) @@ -240,7 +240,7 @@ private fun ChapterText( overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.titleLarge, inlineContent = persistentMapOf( - DownloadedIconContentId to InlineTextContent( + DOWNLOADED_ICON_ID to InlineTextContent( Placeholder( width = 22.sp, height = 22.sp, @@ -277,7 +277,7 @@ private val CardColor: CardColors ) private val VerticalSpacerSize = 24.dp -private const val DownloadedIconContentId = "downloaded" +private const val DOWNLOADED_ICON_ID = "downloaded" private fun previewChapter(name: String, scanlator: String, chapterNumber: Double) = Chapter.create().copy( id = 0L, diff --git a/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt b/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt index 99bc81023a..ee73e40272 100644 --- a/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt +++ b/app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt @@ -26,7 +26,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow @@ -47,8 +46,6 @@ import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import java.time.format.DateTimeFormatter -private const val UnsetStatusTextAlpha = 0.5F - @Composable fun AnimeTrackInfoDialogHome( trackItems: List, @@ -204,10 +201,9 @@ private fun TrackInfoItem( if (onScoreClick != null) { VerticalDivider() TrackDetailsItem( - modifier = Modifier - .weight(1f) - .alpha(if (score == null) UnsetStatusTextAlpha else 1f), - text = score ?: stringResource(MR.strings.score), + modifier = Modifier.weight(1f), + text = score, + placeholder = stringResource(MR.strings.score), onClick = onScoreClick, ) } diff --git a/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt b/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt index a684ce00f0..c749f5fb95 100644 --- a/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt +++ b/app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt @@ -58,8 +58,6 @@ import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import java.time.format.DateTimeFormatter -private const val UnsetStatusTextAlpha = 0.5F - @Composable fun MangaTrackInfoDialogHome( trackItems: List, @@ -215,10 +213,9 @@ private fun TrackInfoItem( if (onScoreClick != null) { VerticalDivider() TrackDetailsItem( - modifier = Modifier - .weight(1f) - .alpha(if (score == null) UnsetStatusTextAlpha else 1f), - text = score ?: stringResource(MR.strings.score), + modifier = Modifier.weight(1f), + text = score, + placeholder = stringResource(MR.strings.score), onClick = onScoreClick, ) } @@ -247,6 +244,8 @@ private fun TrackInfoItem( } } +private const val UNSET_TEXT_ALPHA = 0.5F + @Composable fun TrackDetailsItem( text: String?, @@ -267,7 +266,7 @@ fun TrackDetailsItem( overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Center, - color = MaterialTheme.colorScheme.onSurface.copy(alpha = if (text == null) UnsetStatusTextAlpha else 1f), + color = MaterialTheme.colorScheme.onSurface.copy(alpha = if (text == null) UNSET_TEXT_ALPHA else 1f), ) } } diff --git a/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt b/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt index c0b3c602a1..7530b917c4 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt @@ -44,7 +44,7 @@ import eu.kanade.tachiyomi.ui.updates.anime.AnimeUpdatesItem import tachiyomi.domain.updates.anime.model.AnimeUpdatesWithRelations import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ListGroupHeader -import tachiyomi.presentation.core.components.material.ReadItemAlpha +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground @@ -156,7 +156,7 @@ private fun AnimeUpdatesUiItem( modifier: Modifier = Modifier, ) { val haptic = LocalHapticFeedback.current - val textAlpha = if (update.seen) ReadItemAlpha else 1f + val textAlpha = if (update.seen) DISABLED_ALPHA else 1f Row( modifier = modifier @@ -231,7 +231,7 @@ private fun AnimeUpdatesUiItem( Text( text = watchProgress, maxLines = 1, - color = LocalContentColor.current.copy(alpha = ReadItemAlpha), + color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), overflow = TextOverflow.Ellipsis, ) } diff --git a/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt b/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt index a26b8f43e4..bbe4a932e1 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt @@ -44,7 +44,7 @@ import eu.kanade.tachiyomi.ui.updates.manga.MangaUpdatesItem import tachiyomi.domain.updates.manga.model.MangaUpdatesWithRelations import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ListGroupHeader -import tachiyomi.presentation.core.components.material.ReadItemAlpha +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground @@ -151,7 +151,7 @@ private fun MangaUpdatesUiItem( modifier: Modifier = Modifier, ) { val haptic = LocalHapticFeedback.current - val textAlpha = if (update.read) ReadItemAlpha else 1f + val textAlpha = if (update.read) DISABLED_ALPHA else 1f Row( modifier = modifier @@ -225,7 +225,7 @@ private fun MangaUpdatesUiItem( Text( text = readProgress, maxLines = 1, - color = LocalContentColor.current.copy(alpha = ReadItemAlpha), + color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), overflow = TextOverflow.Ellipsis, ) } diff --git a/app/src/main/java/eu/kanade/presentation/util/Navigator.kt b/app/src/main/java/eu/kanade/presentation/util/Navigator.kt index e566b820bc..463b275381 100644 --- a/app/src/main/java/eu/kanade/presentation/util/Navigator.kt +++ b/app/src/main/java/eu/kanade/presentation/util/Navigator.kt @@ -1,6 +1,5 @@ package eu.kanade.presentation.util -import android.annotation.SuppressLint import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.ContentTransform diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt index 0d600520f4..97cf099d55 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt @@ -9,9 +9,9 @@ import eu.kanade.tachiyomi.data.backup.create.creators.AnimeBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeCategoriesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeExtensionRepoBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeSourcesBackupCreator -import eu.kanade.tachiyomi.data.backup.create.creators.MangaCategoriesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.ExtensionsBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.MangaCategoriesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaExtensionRepoBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaSourcesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.PreferenceBackupCreator diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt index 120f375d1d..bd90eea3a7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.data.backup.create.creators -import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.animesource.AnimeSource +import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnimeTracking.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnimeTracking.kt index e3cf8e85f1..be64e8759d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnimeTracking.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnimeTracking.kt @@ -74,8 +74,7 @@ data class BackupAnimeTracking( val backupAnimeTrackMapper = { _id: Long, - anime_id: - Long, + anime_id: Long, syncId: Long, mediaId: Long, libraryId: Long?, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt index 14740c5502..48154ae6d8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt @@ -22,7 +22,8 @@ data class RestoreOptions( extensions, ) - fun canRestore() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings || extensions + fun canRestore() = + libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings || extensions companion object { val options = persistentListOf( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt index 65daea3e7e..e53bcc78ab 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt @@ -30,7 +30,7 @@ class AnimeExtensionRepoRestorer( backupRepo.name, backupRepo.shortName, backupRepo.website, - backupRepo.signingKeyFingerprint + backupRepo.signingKeyFingerprint, ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt index ede044a9fc..dfe5caaec7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt @@ -8,7 +8,7 @@ import uy.kohesive.injekt.api.get class MangaExtensionRepoRestorer( private val mangaHandler: MangaDatabaseHandler = Injekt.get(), - private val getExtensionRepos: GetMangaExtensionRepo = Injekt.get() + private val getExtensionRepos: GetMangaExtensionRepo = Injekt.get(), ) { suspend operator fun invoke( @@ -30,7 +30,7 @@ class MangaExtensionRepoRestorer( backupRepo.name, backupRepo.shortName, backupRepo.website, - backupRepo.signingKeyFingerprint + backupRepo.signingKeyFingerprint, ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt index c4eee9f70d..a8d7deb3e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverFetcher.kt @@ -290,7 +290,9 @@ class AnimeCoverFetcher( } private enum class Type { - File, URL, URI + File, + URL, + URI, } class AnimeFactory( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt index 026b888dd3..e4dbeaacb8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt @@ -290,7 +290,9 @@ class MangaCoverFetcher( } private enum class Type { - File, URL, URI + File, + URL, + URI, } class MangaFactory( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrack.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrack.kt index 540d575863..84f4d1079d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrack.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrack.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.anime import java.io.Serializable diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrackImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrackImpl.kt index ada673593e..c899458b90 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrackImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrackImpl.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.anime class AnimeTrackImpl : AnimeTrack { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/Episode.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/Episode.kt index e88bfb6878..651f9c5935 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/Episode.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/Episode.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.anime import eu.kanade.tachiyomi.animesource.model.SEpisode diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/EpisodeImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/EpisodeImpl.kt index 218d9bab75..3402176518 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/EpisodeImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/EpisodeImpl.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.anime class EpisodeImpl : Episode { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/Chapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/Chapter.kt index 8c8c8ea20d..bf5d7a84f8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/Chapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/Chapter.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.manga import eu.kanade.tachiyomi.source.model.SChapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/ChapterImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/ChapterImpl.kt index 16e069664a..a1e6f1ec16 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/ChapterImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/ChapterImpl.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.manga class ChapterImpl : Chapter { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrack.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrack.kt index ec7b799c6e..bbca40f64f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrack.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrack.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.manga import java.io.Serializable diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrackImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrackImpl.kt index 48e0fa7df6..af8e36c213 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrackImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrackImpl.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models.manga class MangaTrackImpl : MangaTrack { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt index 239c6f63df..9ee1d39db2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt @@ -193,7 +193,7 @@ class AnimeDownloader( fun clearQueue() { cancelDownloaderJob() - _clearQueue() + internalClearQueue() notifier.dismissProgress() } @@ -949,7 +949,7 @@ class AnimeDownloader( while (i < sortedParts.size - 1) { val part = sortedParts[i] result.add(part) - if (part.completed && !sortedParts[i+1].completed) { + if (part.completed && !sortedParts[i + 1].completed) { part.completed = false // not completed anymore part.range = sortedParts[i].range.copy(second = sortedParts[i + 1].range.second) // extends range part.request = sortedParts[i + 1].request // Assumes that not completed parts have at least a Request @@ -1321,7 +1321,7 @@ class AnimeDownloader( removeFromQueueIf { it.anime.id == anime.id } } - private fun _clearQueue() { + private fun internalClearQueue() { _queueState.update { it.forEach { download -> if (download.status == AnimeDownload.State.DOWNLOADING || @@ -1347,7 +1347,7 @@ class AnimeDownloader( val wasRunning = isRunning pause() - _clearQueue() + internalClearQueue() addAllToQueue(downloads) if (wasRunning) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/model/AnimeDownload.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/model/AnimeDownload.kt index 5180a9c260..e2b7363211 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/model/AnimeDownload.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/anime/model/AnimeDownload.kt @@ -33,14 +33,14 @@ data class AnimeDownload( } @Transient - private val _progressFlow = MutableStateFlow(0) + private val progressStateFlow = MutableStateFlow(0) @Transient - val progressFlow = _progressFlow.asStateFlow() + val progressFlow = progressStateFlow.asStateFlow() var progress: Int - get() = _progressFlow.value + get() = progressStateFlow.value set(value) { - _progressFlow.value = value + progressStateFlow.value = value } @Transient @@ -48,20 +48,20 @@ data class AnimeDownload( var totalContentLength: Long = 0L @Transient - private val _bytesDownloadedFlow = MutableStateFlow(0L) + private val bytesDownloadedFlow = MutableStateFlow(0L) var bytesDownloaded: Long - get() = _bytesDownloadedFlow.value + get() = bytesDownloadedFlow.value set(value) { - _bytesDownloadedFlow.value += value + bytesDownloadedFlow.value += value } /** * resets the internal progress state of download */ fun resetProgress() { - _bytesDownloadedFlow.value = 0L - _progressFlow.value = 0 + bytesDownloadedFlow.value = 0L + progressStateFlow.value = 0 } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt index f13b9a7049..272b4ce02c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt @@ -197,7 +197,7 @@ class MangaDownloader( fun clearQueue() { cancelDownloaderJob() - _clearQueue() + internalClearQueue() notifier.dismissProgress() } @@ -466,9 +466,10 @@ class MangaDownloader( // Try to find the image file val imageFile = tmpDir.listFiles()?.firstOrNull { - it.name!!.startsWith("$filename.") || it.name!!.startsWith( - "${filename}__001", - ) + it.name!!.startsWith("$filename.") || + it.name!!.startsWith( + "${filename}__001", + ) } try { @@ -665,7 +666,7 @@ class MangaDownloader( chapter, urls, categories, - source.name + source.name, ) // Remove the old file @@ -727,7 +728,7 @@ class MangaDownloader( removeFromQueueIf { it.manga.id == manga.id } } - private fun _clearQueue() { + private fun internalClearQueue() { _queueState.update { it.forEach { download -> if (download.status == MangaDownload.State.DOWNLOADING || @@ -751,7 +752,7 @@ class MangaDownloader( } pause() - _clearQueue() + internalClearQueue() addAllToQueue(downloads) if (wasRunning) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeLibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeLibraryUpdateJob.kt index 8763f11a34..a0aa736390 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeLibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeLibraryUpdateJob.kt @@ -449,7 +449,9 @@ class AnimeLibraryUpdateJob(private val context: Context, workerParams: WorkerPa val constraints = Constraints( requiredNetworkType = if (DEVICE_NETWORK_NOT_METERED in restrictions) { NetworkType.UNMETERED - } else { NetworkType.CONNECTED }, + } else { + NetworkType.CONNECTED + }, requiresCharging = DEVICE_CHARGING in restrictions, requiresBatteryNotLow = true, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/manga/MangaLibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/manga/MangaLibraryUpdateJob.kt index 32b34cc353..aa3dc2f402 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/manga/MangaLibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/manga/MangaLibraryUpdateJob.kt @@ -446,7 +446,9 @@ class MangaLibraryUpdateJob(private val context: Context, workerParams: WorkerPa val constraints = Constraints( requiredNetworkType = if (DEVICE_NETWORK_NOT_METERED in restrictions) { NetworkType.UNMETERED - } else { NetworkType.CONNECTED }, + } else { + NetworkType.CONNECTED + }, requiresCharging = DEVICE_CHARGING in restrictions, requiresBatteryNotLow = true, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index 78fc87a1bb..dbc4cc1ab7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -50,10 +50,10 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { return withIOContext { val query = """ |mutation AddManga(${'$'}mangaId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus) { - |SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status) { - | id - | status - |} + |SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status) { + | id + | status + |} |} | """.trimMargin() @@ -68,7 +68,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -112,7 +112,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { put("completedAt", createDate(track.finished_reading_date)) } } - authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))) + authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() track } @@ -122,9 +122,9 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { withIOContext { val query = """ |mutation DeleteManga(${'$'}listId: Int) { - |DeleteMediaListEntry(id: ${'$'}listId) { + |DeleteMediaListEntry(id: ${'$'}listId) { |deleted - |} + |} |} | """.trimMargin() @@ -134,7 +134,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { put("listId", track.libraryId) } } - authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))) + authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() } } @@ -143,10 +143,10 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { return withIOContext { val query = """ |mutation AddAnime(${'$'}animeId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus) { - |SaveMediaListEntry (mediaId: ${'$'}animeId, progress: ${'$'}progress, status: ${'$'}status) { - | id - | status - |} + |SaveMediaListEntry (mediaId: ${'$'}animeId, progress: ${'$'}progress, status: ${'$'}status) { + | id + | status + |} |} | """.trimMargin() @@ -161,7 +161,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -205,7 +205,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { put("completedAt", createDate(track.finished_watching_date)) } } - authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))) + authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() track } @@ -215,9 +215,9 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { return withIOContext { val query = """ |mutation DeleteAnime(${'$'}listId: Int) { - |DeleteMediaListEntry(id: ${'$'}listId) { + |DeleteMediaListEntry(id: ${'$'}listId) { |deleted - |} + |} |} | """.trimMargin() @@ -227,7 +227,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { put("listId", track.libraryId) } } - authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))) + authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() } } @@ -269,7 +269,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -323,7 +323,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -393,7 +393,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -463,7 +463,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -511,7 +511,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -615,22 +615,22 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { } companion object { - private const val clientId = "5338" - private const val apiUrl = "https://graphql.anilist.co/" - private const val baseUrl = "https://anilist.co/api/v2/" - private const val baseMangaUrl = "https://anilist.co/manga/" - private const val baseAnimeUrl = "https://anilist.co/anime/" + private const val CLIENT_ID = "5338" + private const val API_URL = "https://graphql.anilist.co/" + private const val BASE_URL = "https://anilist.co/api/v2/" + private const val BASE_MANGA_URL = "https://anilist.co/manga/" + private const val BASE_ANIME_URL = "https://anilist.co/anime/" fun mangaUrl(mediaId: Long): String { - return baseMangaUrl + mediaId + return BASE_MANGA_URL + mediaId } fun animeUrl(mediaId: Long): String { - return baseAnimeUrl + mediaId + return BASE_ANIME_URL + mediaId } - fun authUrl(): Uri = "${baseUrl}oauth/authorize".toUri().buildUpon() - .appendQueryParameter("client_id", clientId) + fun authUrl(): Uri = "${BASE_URL}oauth/authorize".toUri().buildUpon() + .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("response_type", "token") .build() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt index 0c80a15a23..365938f8e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt @@ -44,7 +44,7 @@ class BangumiApi( .add("rating", track.score.toInt().toString()) .add("status", track.toBangumiStatus()) .build() - authClient.newCall(POST("$apiUrl/collection/${track.remote_id}/update", body = body)) + authClient.newCall(POST("$API_URL/collection/${track.remote_id}/update", body = body)) .awaitSuccess() track } @@ -56,7 +56,7 @@ class BangumiApi( .add("rating", track.score.toInt().toString()) .add("status", track.toBangumiStatus()) .build() - authClient.newCall(POST("$apiUrl/collection/${track.remote_id}/update", body = body)) + authClient.newCall(POST("$API_URL/collection/${track.remote_id}/update", body = body)) .awaitSuccess() track } @@ -69,7 +69,7 @@ class BangumiApi( .add("rating", track.score.toInt().toString()) .add("status", track.toBangumiStatus()) .build() - authClient.newCall(POST("$apiUrl/collection/${track.remote_id}/update", body = sbody)) + authClient.newCall(POST("$API_URL/collection/${track.remote_id}/update", body = sbody)) .awaitSuccess() // chapter update @@ -78,7 +78,7 @@ class BangumiApi( .build() authClient.newCall( POST( - "$apiUrl/subject/${track.remote_id}/update/watched_eps", + "$API_URL/subject/${track.remote_id}/update/watched_eps", body = body, ), ).awaitSuccess() @@ -94,7 +94,7 @@ class BangumiApi( .add("rating", track.score.toInt().toString()) .add("status", track.toBangumiStatus()) .build() - authClient.newCall(POST("$apiUrl/collection/${track.remote_id}/update", body = sbody)) + authClient.newCall(POST("$API_URL/collection/${track.remote_id}/update", body = sbody)) .awaitSuccess() // chapter update @@ -103,7 +103,7 @@ class BangumiApi( .build() authClient.newCall( POST( - "$apiUrl/subject/${track.remote_id}/update/watched_eps", + "$API_URL/subject/${track.remote_id}/update/watched_eps", body = body, ), ).awaitSuccess() @@ -114,7 +114,7 @@ class BangumiApi( suspend fun search(search: String): List { return withIOContext { - val url = "$apiUrl/search/subject/${URLEncoder.encode( + val url = "$API_URL/search/subject/${URLEncoder.encode( search, StandardCharsets.UTF_8.name(), )}" @@ -141,7 +141,7 @@ class BangumiApi( suspend fun searchAnime(search: String): List { return withIOContext { - val url = "$apiUrl/search/subject/${URLEncoder.encode( + val url = "$API_URL/search/subject/${URLEncoder.encode( search, StandardCharsets.UTF_8.name(), )}" @@ -218,7 +218,7 @@ class BangumiApi( suspend fun findLibManga(track: MangaTrack): MangaTrack? { return withIOContext { with(json) { - authClient.newCall(GET("$apiUrl/subject/${track.remote_id}")) + authClient.newCall(GET("$API_URL/subject/${track.remote_id}")) .awaitSuccess() .parseAs() .let { jsonToSearch(it) } @@ -229,7 +229,7 @@ class BangumiApi( suspend fun findLibAnime(track: AnimeTrack): AnimeTrack? { return withIOContext { with(json) { - authClient.newCall(GET("$apiUrl/subject/${track.remote_id}")) + authClient.newCall(GET("$API_URL/subject/${track.remote_id}")) .awaitSuccess() .parseAs() .let { jsonToSearchAnime(it) } @@ -239,7 +239,7 @@ class BangumiApi( suspend fun statusLibManga(track: MangaTrack): MangaTrack? { return withIOContext { - val urlUserRead = "$apiUrl/collection/${track.remote_id}" + val urlUserRead = "$API_URL/collection/${track.remote_id}" val requestUserRead = Request.Builder() .url(urlUserRead) .cacheControl(CacheControl.FORCE_NETWORK) @@ -267,7 +267,7 @@ class BangumiApi( suspend fun statusLibAnime(track: AnimeTrack): AnimeTrack? { return withIOContext { - val urlUserRead = "$apiUrl/collection/${track.remote_id}" + val urlUserRead = "$API_URL/collection/${track.remote_id}" val requestUserRead = Request.Builder() .url(urlUserRead) .cacheControl(CacheControl.FORCE_NETWORK) @@ -304,41 +304,41 @@ class BangumiApi( } private fun accessTokenRequest(code: String) = POST( - oauthUrl, + OAUTH_URL, body = FormBody.Builder() .add("grant_type", "authorization_code") - .add("client_id", clientId) - .add("client_secret", clientSecret) + .add("client_id", CLIENT_ID) + .add("client_secret", CLIENT_SECRET) .add("code", code) - .add("redirect_uri", redirectUrl) + .add("redirect_uri", REDIRECT_URL) .build(), ) companion object { - private const val clientId = "bgm293165b66d7e58156" - private const val clientSecret = "21d5f5c19ac24b4bc9c855ffa2387030" + private const val CLIENT_ID = "bgm293165b66d7e58156" + private const val CLIENT_SECRET = "21d5f5c19ac24b4bc9c855ffa2387030" - private const val apiUrl = "https://api.bgm.tv" - private const val oauthUrl = "https://bgm.tv/oauth/access_token" - private const val loginUrl = "https://bgm.tv/oauth/authorize" + private const val API_URL = "https://api.bgm.tv" + private const val OAUTH_URL = "https://bgm.tv/oauth/access_token" + private const val LOGIN_URL = "https://bgm.tv/oauth/authorize" - private const val redirectUrl = "aniyomi://bangumi-auth" + private const val REDIRECT_URL = "aniyomi://bangumi-auth" fun authUrl(): Uri = - loginUrl.toUri().buildUpon() - .appendQueryParameter("client_id", clientId) + LOGIN_URL.toUri().buildUpon() + .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("response_type", "code") - .appendQueryParameter("redirect_uri", redirectUrl) + .appendQueryParameter("redirect_uri", REDIRECT_URL) .build() fun refreshTokenRequest(token: String) = POST( - oauthUrl, + OAUTH_URL, body = FormBody.Builder() .add("grant_type", "refresh_token") - .add("client_id", clientId) - .add("client_secret", clientSecret) + .add("client_id", CLIENT_ID) + .add("client_secret", CLIENT_SECRET) .add("refresh_token", token) - .add("redirect_uri", redirectUrl) + .add("redirect_uri", REDIRECT_URL) .build(), ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt index 5da9a86173..3718b3af68 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt @@ -69,7 +69,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) with(json) { authClient.newCall( POST( - "${baseUrl}library-entries", + "${BASE_URL}library-entries", headers = headersOf( "Content-Type", "application/vnd.api+json", @@ -117,7 +117,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) with(json) { authClient.newCall( POST( - "${baseUrl}library-entries", + "${BASE_URL}library-entries", headers = headersOf( "Content-Type", "application/vnd.api+json", @@ -155,7 +155,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) with(json) { authClient.newCall( Request.Builder() - .url("${baseUrl}library-entries/${track.remote_id}") + .url("${BASE_URL}library-entries/${track.remote_id}") .headers( headersOf( "Content-Type", @@ -195,7 +195,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) with(json) { authClient.newCall( Request.Builder() - .url("${baseUrl}library-entries/${track.remote_id}") + .url("${BASE_URL}library-entries/${track.remote_id}") .headers( headersOf( "Content-Type", @@ -221,7 +221,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) authClient .newCall( DELETE( - "${baseUrl}library-entries/${track.remoteId}", + "${BASE_URL}library-entries/${track.remoteId}", headers = headersOf( "Content-Type", "application/vnd.api+json", @@ -237,7 +237,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) authClient .newCall( DELETE( - "${baseUrl}library-entries/${track.remoteId}", + "${BASE_URL}library-entries/${track.remoteId}", headers = headersOf( "Content-Type", "application/vnd.api+json", @@ -251,7 +251,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun search(query: String): List { return withIOContext { with(json) { - authClient.newCall(GET(algoliaKeyUrl)) + authClient.newCall(GET(ALGOLIA_KEY_URL)) .awaitSuccess() .parseAs() .let { @@ -265,7 +265,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun searchAnime(query: String): List { return withIOContext { with(json) { - authClient.newCall(GET(algoliaKeyUrl)) + authClient.newCall(GET(ALGOLIA_KEY_URL)) .awaitSuccess() .parseAs() .let { @@ -281,17 +281,17 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) val jsonObject = buildJsonObject { put( "params", - "query=${URLEncoder.encode(query, StandardCharsets.UTF_8.name())}$algoliaFilter", + "query=${URLEncoder.encode(query, StandardCharsets.UTF_8.name())}$ALGOLIA_FILTER", ) } with(json) { client.newCall( POST( - algoliaUrl, + ALGOLIA_URL, headers = headersOf( "X-Algolia-Application-Id", - algoliaAppId, + ALGOLIA_APP_ID, "X-Algolia-API-Key", key, ), @@ -315,17 +315,17 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) val jsonObject = buildJsonObject { put( "params", - "query=${URLEncoder.encode(query, StandardCharsets.UTF_8.name())}$algoliaFilterAnime", + "query=${URLEncoder.encode(query, StandardCharsets.UTF_8.name())}$ALGOLIA_FILTER_ANIME", ) } with(json) { client.newCall( POST( - algoliaUrl, + ALGOLIA_URL, headers = headersOf( "X-Algolia-Application-Id", - algoliaAppId, + ALGOLIA_APP_ID, "X-Algolia-API-Key", key, ), @@ -346,7 +346,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun findLibManga(track: MangaTrack, userId: String): MangaTrack? { return withIOContext { - val url = "${baseUrl}library-entries".toUri().buildUpon() + val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[manga_id]=${track.remote_id}&filter[user_id]=$userId") .appendQueryParameter("include", "manga") .build() @@ -369,7 +369,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun findLibAnime(track: AnimeTrack, userId: String): AnimeTrack? { return withIOContext { - val url = "${baseUrl}library-entries".toUri().buildUpon() + val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[anime_id]=${track.remote_id}&filter[user_id]=$userId") .appendQueryParameter("include", "anime") .build() @@ -392,7 +392,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun getLibManga(track: MangaTrack): MangaTrack { return withIOContext { - val url = "${baseUrl}library-entries".toUri().buildUpon() + val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[id]=${track.remote_id}") .appendQueryParameter("include", "manga") .build() @@ -415,7 +415,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun getLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { - val url = "${baseUrl}library-entries".toUri().buildUpon() + val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[id]=${track.remote_id}") .appendQueryParameter("include", "anime") .build() @@ -442,11 +442,11 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) .add("username", username) .add("password", password) .add("grant_type", "password") - .add("client_id", clientId) - .add("client_secret", clientSecret) + .add("client_id", CLIENT_ID) + .add("client_secret", CLIENT_SECRET) .build() with(json) { - client.newCall(POST(loginUrl, body = formBody)) + client.newCall(POST(LOGIN_URL, body = formBody)) .awaitSuccess() .parseAs() } @@ -455,7 +455,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun getCurrentUser(): String { return withIOContext { - val url = "${baseUrl}users".toUri().buildUpon() + val url = "${BASE_URL}users".toUri().buildUpon() .encodedQuery("filter[self]=true") .build() with(json) { @@ -470,44 +470,44 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) } companion object { - private const val clientId = + private const val CLIENT_ID = "dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd" - private const val clientSecret = + private const val CLIENT_SECRET = "54d7307928f63414defd96399fc31ba847961ceaecef3a5fd93144e960c0e151" - private const val baseUrl = "https://kitsu.app/api/edge/" - private const val loginUrl = "https://kitsu.app/api/oauth/token" - private const val baseMangaUrl = "https://kitsu.app/manga/" - private const val baseAnimeUrl = "https://kitsu.app/anime/" - private const val algoliaKeyUrl = "https://kitsu.app/api/edge/algolia-keys/media/" + private const val BASE_URL = "https://kitsu.app/api/edge/" + private const val LOGIN_URL = "https://kitsu.app/api/oauth/token" + private const val BASE_MANGA_URL = "https://kitsu.app/manga/" + private const val BASE_ANIME_URL = "https://kitsu.app/anime/" + private const val ALGOLIA_KEY_URL = "https://kitsu.app/api/edge/algolia-keys/media/" - private const val algoliaUrl = + private const val ALGOLIA_URL = "https://AWQO5J657S-dsn.algolia.net/1/indexes/production_media/query/" - private const val algoliaAppId = "AWQO5J657S" - private const val algoliaFilter = + private const val ALGOLIA_APP_ID = "AWQO5J657S" + private const val ALGOLIA_FILTER = "&facetFilters=%5B%22kind%3Amanga%22%5D&attributesToRetrieve=" + "%5B%22synopsis%22%2C%22averageRating%22%2C%22canonicalTitle%22%2C%22chapterCount%22%2C%22" + "posterImage%22%2C%22startDate%22%2C%22subtype%22%2C%22endDate%22%2C%20%22id%22%5D" - private const val algoliaFilterAnime = + private const val ALGOLIA_FILTER_ANIME = "&facetFilters=%5B%22kind%3Aanime%22%5D&attributesToRetrieve=" + "%5B%22synopsis%22%2C%22averageRating%22%2C%22canonicalTitle%22%2C%22episodeCount%22%2C%22" + "posterImage%22%2C%22startDate%22%2C%22subtype%22%2C%22endDate%22%2C%20%22id%22%5D" fun mangaUrl(remoteId: Long): String { - return baseMangaUrl + remoteId + return BASE_MANGA_URL + remoteId } fun animeUrl(remoteId: Long): String { - return baseAnimeUrl + remoteId + return BASE_ANIME_URL + remoteId } fun refreshTokenRequest(token: String) = POST( - loginUrl, + LOGIN_URL, body = FormBody.Builder() .add("grant_type", "refresh_token") .add("refresh_token", token) - .add("client_id", clientId) - .add("client_secret", clientSecret) + .add("client_id", CLIENT_ID) + .add("client_secret", CLIENT_SECRET) .build(), ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuDateHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuDateHelper.kt index 6828e1e1a9..e4521438b8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuDateHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuDateHelper.kt @@ -6,8 +6,8 @@ import java.util.Locale object KitsuDateHelper { - private const val pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" - private val formatter = SimpleDateFormat(pattern, Locale.ENGLISH) + private const val PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" + private val formatter = SimpleDateFormat(PATTERN, Locale.ENGLISH) fun convert(dateValue: Long): String? { if (dateValue == 0L) return null diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/AnimeTrackSearch.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/AnimeTrackSearch.kt index f9d30c79a5..a87f76e9f4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/AnimeTrackSearch.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/AnimeTrackSearch.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.track.model import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/MangaTrackSearch.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/MangaTrackSearch.kt index 41c19cc978..2a7c680884 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/MangaTrackSearch.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/MangaTrackSearch.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.track.model import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt index 823dcf2e57..dc6ad09b47 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt @@ -57,7 +57,7 @@ class ShikimoriApi( } authClient.newCall( POST( - "$apiUrl/v2/user_rates", + "$API_URL/v2/user_rates", body = payload.toString().toRequestBody(jsonMime), ), ).awaitSuccess() @@ -79,7 +79,7 @@ class ShikimoriApi( suspend fun deleteLibManga(track: DomainMangaTrack) { withIOContext { authClient - .newCall(DELETE("$apiUrl/v2/user_rates/${track.libraryId}")) + .newCall(DELETE("$API_URL/v2/user_rates/${track.libraryId}")) .awaitSuccess() } } @@ -99,7 +99,7 @@ class ShikimoriApi( } authClient.newCall( POST( - "$apiUrl/v2/user_rates", + "$API_URL/v2/user_rates", body = payload.toString().toRequestBody(jsonMime), ), ).awaitSuccess() @@ -121,14 +121,14 @@ class ShikimoriApi( suspend fun deleteLibAnime(track: DomainAnimeTrack) { withIOContext { authClient - .newCall(DELETE("$apiUrl/v2/user_rates/${track.libraryId}")) + .newCall(DELETE("$API_URL/v2/user_rates/${track.libraryId}")) .awaitSuccess() } } suspend fun search(search: String): List { return withIOContext { - val url = "$apiUrl/mangas".toUri().buildUpon() + val url = "$API_URL/mangas".toUri().buildUpon() .appendQueryParameter("order", "popularity") .appendQueryParameter("search", search) .appendQueryParameter("limit", "20") @@ -148,7 +148,7 @@ class ShikimoriApi( suspend fun searchAnime(search: String): List { return withIOContext { - val url = "$apiUrl/animes".toUri().buildUpon() + val url = "$API_URL/animes".toUri().buildUpon() .appendQueryParameter("order", "popularity") .appendQueryParameter("search", search) .appendQueryParameter("limit", "20") @@ -171,10 +171,10 @@ class ShikimoriApi( remote_id = obj["id"]!!.jsonPrimitive.long title = obj["name"]!!.jsonPrimitive.content total_chapters = obj["chapters"]!!.jsonPrimitive.long - cover_url = baseUrl + obj["image"]!!.jsonObject["preview"]!!.jsonPrimitive.content + cover_url = BASE_URL + obj["image"]!!.jsonObject["preview"]!!.jsonPrimitive.content summary = "" score = obj["score"]!!.jsonPrimitive.double - tracking_url = baseUrl + obj["url"]!!.jsonPrimitive.content + tracking_url = BASE_URL + obj["url"]!!.jsonPrimitive.content publishing_status = obj["status"]!!.jsonPrimitive.content publishing_type = obj["kind"]!!.jsonPrimitive.content start_date = obj["aired_on"]!!.jsonPrimitive.contentOrNull ?: "" @@ -186,10 +186,10 @@ class ShikimoriApi( remote_id = obj["id"]!!.jsonPrimitive.long title = obj["name"]!!.jsonPrimitive.content total_episodes = obj["episodes"]!!.jsonPrimitive.long - cover_url = baseUrl + obj["image"]!!.jsonObject["preview"]!!.jsonPrimitive.content + cover_url = BASE_URL + obj["image"]!!.jsonObject["preview"]!!.jsonPrimitive.content summary = "" score = obj["score"]!!.jsonPrimitive.double - tracking_url = baseUrl + obj["url"]!!.jsonPrimitive.content + tracking_url = BASE_URL + obj["url"]!!.jsonPrimitive.content publishing_status = obj["status"]!!.jsonPrimitive.content publishing_type = obj["kind"]!!.jsonPrimitive.content start_date = obj.get("aired_on")!!.jsonPrimitive.contentOrNull ?: "" @@ -205,7 +205,7 @@ class ShikimoriApi( last_chapter_read = obj["chapters"]!!.jsonPrimitive.double score = obj["score"]!!.jsonPrimitive.int.toDouble() status = toTrackStatus(obj["status"]!!.jsonPrimitive.content) - tracking_url = baseUrl + mangas["url"]!!.jsonPrimitive.content + tracking_url = BASE_URL + mangas["url"]!!.jsonPrimitive.content } } @@ -218,13 +218,13 @@ class ShikimoriApi( last_episode_seen = obj["episodes"]!!.jsonPrimitive.double score = obj["score"]!!.jsonPrimitive.int.toDouble() status = toTrackStatus(obj["status"]!!.jsonPrimitive.content) - tracking_url = baseUrl + animes["url"]!!.jsonPrimitive.content + tracking_url = BASE_URL + animes["url"]!!.jsonPrimitive.content } } suspend fun findLibManga(track: MangaTrack, userId: String): MangaTrack? { return withIOContext { - val urlMangas = "$apiUrl/mangas".toUri().buildUpon() + val urlMangas = "$API_URL/mangas".toUri().buildUpon() .appendPath(track.remote_id.toString()) .build() val mangas = with(json) { @@ -233,7 +233,7 @@ class ShikimoriApi( .parseAs() } - val url = "$apiUrl/v2/user_rates".toUri().buildUpon() + val url = "$API_URL/v2/user_rates".toUri().buildUpon() .appendQueryParameter("user_id", userId) .appendQueryParameter("target_id", track.remote_id.toString()) .appendQueryParameter("target_type", "Manga") @@ -257,7 +257,7 @@ class ShikimoriApi( suspend fun findLibAnime(track: AnimeTrack, user_id: String): AnimeTrack? { return withIOContext { - val urlAnimes = "$apiUrl/animes".toUri().buildUpon() + val urlAnimes = "$API_URL/animes".toUri().buildUpon() .appendPath(track.remote_id.toString()) .build() val animes = with(json) { @@ -266,7 +266,7 @@ class ShikimoriApi( .parseAs() } - val url = "$apiUrl/v2/user_rates".toUri().buildUpon() + val url = "$API_URL/v2/user_rates".toUri().buildUpon() .appendQueryParameter("user_id", user_id) .appendQueryParameter("target_id", track.remote_id.toString()) .appendQueryParameter("target_type", "Anime") @@ -290,7 +290,7 @@ class ShikimoriApi( suspend fun getCurrentUser(): Int { return with(json) { - authClient.newCall(GET("$apiUrl/users/whoami")) + authClient.newCall(GET("$API_URL/users/whoami")) .awaitSuccess() .parseAs() .let { @@ -310,39 +310,39 @@ class ShikimoriApi( } private fun accessTokenRequest(code: String) = POST( - oauthUrl, + OAUTH_URL, body = FormBody.Builder() .add("grant_type", "authorization_code") - .add("client_id", clientId) - .add("client_secret", clientSecret) + .add("client_id", CLIENT_ID) + .add("client_secret", CLIENT_SECRET) .add("code", code) - .add("redirect_uri", redirectUrl) + .add("redirect_uri", REDIRECT_URL) .build(), ) companion object { - private const val clientId = "aOAYRqOLwxpA8skpcQIXetNy4cw2rn2fRzScawlcQ5U" - private const val clientSecret = "jqjmORn6bh2046ulkm4lHEwJ3OA1RmO3FD2sR9f6Clw" + private const val CLIENT_ID = "aOAYRqOLwxpA8skpcQIXetNy4cw2rn2fRzScawlcQ5U" + private const val CLIENT_SECRET = "jqjmORn6bh2046ulkm4lHEwJ3OA1RmO3FD2sR9f6Clw" - private const val baseUrl = "https://shikimori.one" - private const val apiUrl = "$baseUrl/api" - private const val oauthUrl = "$baseUrl/oauth/token" - private const val loginUrl = "$baseUrl/oauth/authorize" + private const val BASE_URL = "https://shikimori.one" + private const val API_URL = "$BASE_URL/api" + private const val OAUTH_URL = "$BASE_URL/oauth/token" + private const val LOGIN_URL = "$BASE_URL/oauth/authorize" - private const val redirectUrl = "aniyomi://shikimori-auth" + private const val REDIRECT_URL = "aniyomi://shikimori-auth" - fun authUrl(): Uri = loginUrl.toUri().buildUpon() - .appendQueryParameter("client_id", clientId) - .appendQueryParameter("redirect_uri", redirectUrl) + fun authUrl(): Uri = LOGIN_URL.toUri().buildUpon() + .appendQueryParameter("client_id", CLIENT_ID) + .appendQueryParameter("redirect_uri", REDIRECT_URL) .appendQueryParameter("response_type", "code") .build() fun refreshTokenRequest(token: String) = POST( - oauthUrl, + OAUTH_URL, body = FormBody.Builder() .add("grant_type", "refresh_token") - .add("client_id", clientId) - .add("client_secret", clientSecret) + .add("client_id", CLIENT_ID) + .add("client_secret", CLIENT_SECRET) .add("refresh_token", token) .build(), ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/SimklApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/SimklApi.kt index 028c57d196..3449926fa0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/SimklApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/SimklApi.kt @@ -65,7 +65,7 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) } }.toString().toRequestBody(jsonMime) authClient.newCall( - POST("$apiUrl/sync/add-to-list", body = payload), + POST("$API_URL/sync/add-to-list", body = payload), ).awaitSuccess() } @@ -83,11 +83,11 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) if (track.score == 0.0) { authClient.newCall( - POST("$apiUrl/sync/ratings/remove", body = payload), + POST("$API_URL/sync/ratings/remove", body = payload), ).awaitSuccess() } else { authClient.newCall( - POST("$apiUrl/sync/ratings", body = payload), + POST("$API_URL/sync/ratings", body = payload), ).awaitSuccess() } } @@ -95,11 +95,11 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) private suspend fun updateProgress(track: AnimeTrack) { // first remove authClient.newCall( - POST("$apiUrl/sync/history/remove", body = buildProgressObject(track, false)), + POST("$API_URL/sync/history/remove", body = buildProgressObject(track, false)), ).awaitSuccess() // then add again authClient.newCall( - POST("$apiUrl/sync/history", body = buildProgressObject(track, true)), + POST("$API_URL/sync/history", body = buildProgressObject(track, true)), ).awaitSuccess() } @@ -149,10 +149,10 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) suspend fun searchAnime(search: String, type: String): List { return withIOContext { - val searchUrl = "$apiUrl/search/$type".toUri().buildUpon() + val searchUrl = "$API_URL/search/$type".toUri().buildUpon() .appendQueryParameter("q", search) .appendQueryParameter("extended", "full") - .appendQueryParameter("client_id", clientId) + .appendQueryParameter("client_id", CLIENT_ID) .build() with(json) { client.newCall(GET(searchUrl.toString())) @@ -224,7 +224,7 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) val foundAnime = with(json) { authClient.newCall( - POST("$apiUrl/sync/watched", body = payload), + POST("$API_URL/sync/watched", body = payload), ) .awaitSuccess() .parseAs() @@ -238,7 +238,7 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) .substringAfter("/") .substringBefore("/") val queryType = if (type == "tv") "shows" else type - val url = "$apiUrl/sync/all-items/$queryType/$status".toUri().buildUpon() + val url = "$API_URL/sync/all-items/$queryType/$status".toUri().buildUpon() .appendQueryParameter("date_from", lastWatched) .build() @@ -262,7 +262,7 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) fun getCurrentUser(): Int { return runBlocking { with(json) { - authClient.newCall(GET("$apiUrl/users/settings")) + authClient.newCall(GET("$API_URL/users/settings")) .awaitSuccess() .parseAs() .let { @@ -283,32 +283,32 @@ class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) } private fun accessTokenRequest(code: String) = POST( - oauthUrl, + OAUTH_URL, body = buildJsonObject { put("code", code) - put("client_id", clientId) - put("client_secret", clientSecret) - put("redirect_uri", redirectUrl) + put("client_id", CLIENT_ID) + put("client_secret", CLIENT_SECRET) + put("redirect_uri", REDIRECT_URL) put("grant_type", "authorization_code") }.toString().toRequestBody(jsonMime), ) companion object { - const val clientId = "aa62a7da32518aae5d5049a658b87fa4837c3b739e06ed250b315aab6af82b0e" - private const val clientSecret = "2bec9c1d0c00a1e9b0e9e096a71f88d555a6f52da7923df07906df3b21351783" + const val CLIENT_ID = "aa62a7da32518aae5d5049a658b87fa4837c3b739e06ed250b315aab6af82b0e" + private const val CLIENT_SECRET = "2bec9c1d0c00a1e9b0e9e096a71f88d555a6f52da7923df07906df3b21351783" - private const val baseUrl = "https://simkl.com" - private const val apiUrl = "https://api.simkl.com" - private const val oauthUrl = "$apiUrl/oauth/token" - private const val loginUrl = "$baseUrl/oauth/authorize" + private const val BASE_URL = "https://simkl.com" + private const val API_URL = "https://api.simkl.com" + private const val OAUTH_URL = "$API_URL/oauth/token" + private const val LOGIN_URL = "$BASE_URL/oauth/authorize" - private const val redirectUrl = "aniyomi://simkl-auth" + private const val REDIRECT_URL = "aniyomi://simkl-auth" fun authUrl(): Uri = - loginUrl.toUri().buildUpon() + LOGIN_URL.toUri().buildUpon() .appendQueryParameter("response_type", "code") - .appendQueryParameter("client_id", clientId) - .appendQueryParameter("redirect_uri", redirectUrl) + .appendQueryParameter("client_id", CLIENT_ID) + .appendQueryParameter("redirect_uri", REDIRECT_URL) .build() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/InstallStep.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/InstallStep.kt index 3fba10fe96..fc87c736cd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/InstallStep.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/InstallStep.kt @@ -1,7 +1,13 @@ package eu.kanade.tachiyomi.extension enum class InstallStep { - Idle, Pending, Downloading, Installing, Installed, Error; + Idle, + Pending, + Downloading, + Installing, + Installed, + Error, + ; fun isCompleted(): Boolean { return this == Installed || this == Error || this == Idle diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt index 502e85fe3b..68865d0edd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt @@ -65,14 +65,14 @@ class AnimeExtensionManager( private val iconMap = mutableMapOf() - private val _installedExtensionsMapFlow = MutableStateFlow(emptyMap()) - val installedExtensionsFlow = _installedExtensionsMapFlow.mapExtensions(scope) + private val installedExtensionsMapFlow = MutableStateFlow(emptyMap()) + val installedExtensionsFlow = installedExtensionsMapFlow.mapExtensions(scope) - private val _availableExtensionsMapFlow = MutableStateFlow(emptyMap()) - val availableExtensionsFlow = _availableExtensionsMapFlow.mapExtensions(scope) + private val availableExtensionsMapFlow = MutableStateFlow(emptyMap()) + val availableExtensionsFlow = availableExtensionsMapFlow.mapExtensions(scope) - private val _untrustedExtensionsMapFlow = MutableStateFlow(emptyMap()) - val untrustedExtensionsFlow = _untrustedExtensionsMapFlow.mapExtensions(scope) + private val untrustedExtensionsMapFlow = MutableStateFlow(emptyMap()) + val untrustedExtensionsFlow = untrustedExtensionsMapFlow.mapExtensions(scope) init { initAnimeExtensions() @@ -82,7 +82,7 @@ class AnimeExtensionManager( private var subLanguagesEnabledOnFirstRun = preferences.enabledLanguages().isSet() fun getAppIconForSource(sourceId: Long): Drawable? { - val pkgName = _installedExtensionsMapFlow.value.values + val pkgName = installedExtensionsMapFlow.value.values .find { ext -> ext.sources.any { it.id == sourceId } } @@ -114,11 +114,11 @@ class AnimeExtensionManager( private fun initAnimeExtensions() { val animeextensions = AnimeExtensionLoader.loadExtensions(context) - _installedExtensionsMapFlow.value = animeextensions + installedExtensionsMapFlow.value = animeextensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } - _untrustedExtensionsMapFlow.value = animeextensions + untrustedExtensionsMapFlow.value = animeextensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } @@ -126,7 +126,7 @@ class AnimeExtensionManager( } /** - * Finds the available anime extensions in the [api] and updates [_availableExtensionsMapFlow]. + * Finds the available anime extensions in the [api] and updates [availableExtensionsMapFlow]. */ suspend fun findAvailableExtensions() { val extensions: List = try { @@ -139,7 +139,7 @@ class AnimeExtensionManager( enableAdditionalSubLanguages(extensions) - _availableExtensionsMapFlow.value = extensions.associateBy { it.pkgName } + availableExtensionsMapFlow.value = extensions.associateBy { it.pkgName } updatedInstalledAnimeExtensionsStatuses(extensions) setupAvailableAnimeExtensionsSourcesDataMap(extensions) } @@ -187,7 +187,7 @@ class AnimeExtensionManager( return } - val installedExtensionsMap = _installedExtensionsMapFlow.value.toMutableMap() + val installedExtensionsMap = installedExtensionsMapFlow.value.toMutableMap() var changed = false for ((pkgName, extension) in installedExtensionsMap) { @@ -212,7 +212,7 @@ class AnimeExtensionManager( } } if (changed) { - _installedExtensionsMapFlow.value = installedExtensionsMap + installedExtensionsMapFlow.value = installedExtensionsMap } updatePendingUpdatesCount() } @@ -236,7 +236,7 @@ class AnimeExtensionManager( * @param extension The anime extension to be updated. */ fun updateExtension(extension: AnimeExtension.Installed): Flow { - val availableExt = _availableExtensionsMapFlow.value[extension.pkgName] ?: return emptyFlow() + val availableExt = availableExtensionsMapFlow.value[extension.pkgName] ?: return emptyFlow() return installExtension(availableExt) } @@ -273,11 +273,11 @@ class AnimeExtensionManager( * @param extension the extension to trust */ suspend fun trust(extension: AnimeExtension.Untrusted) { - _untrustedExtensionsMapFlow.value[extension.pkgName] ?: return + untrustedExtensionsMapFlow.value[extension.pkgName] ?: return trustExtension.trust(extension.pkgName, extension.versionCode, extension.signatureHash) - _untrustedExtensionsMapFlow.value -= extension.pkgName + untrustedExtensionsMapFlow.value -= extension.pkgName AnimeExtensionLoader.loadExtensionFromPkgName(context, extension.pkgName) .let { it as? AnimeLoadResult.Success } @@ -290,7 +290,7 @@ class AnimeExtensionManager( * @param extension The anime extension to be registered. */ private fun registerNewExtension(extension: AnimeExtension.Installed) { - _installedExtensionsMapFlow.value += extension + installedExtensionsMapFlow.value += extension } /** @@ -300,7 +300,7 @@ class AnimeExtensionManager( * @param extension The anime extension to be registered. */ private fun registerUpdatedExtension(extension: AnimeExtension.Installed) { - _installedExtensionsMapFlow.value += extension + installedExtensionsMapFlow.value += extension } /** @@ -310,8 +310,8 @@ class AnimeExtensionManager( * @param pkgName The package name of the uninstalled application. */ private fun unregisterAnimeExtension(pkgName: String) { - _installedExtensionsMapFlow.value -= pkgName - _untrustedExtensionsMapFlow.value -= pkgName + installedExtensionsMapFlow.value -= pkgName + untrustedExtensionsMapFlow.value -= pkgName } /** @@ -330,8 +330,8 @@ class AnimeExtensionManager( } override fun onExtensionUntrusted(extension: AnimeExtension.Untrusted) { - _installedExtensionsMapFlow.value -= extension.pkgName - _untrustedExtensionsMapFlow.value += extension + installedExtensionsMapFlow.value -= extension.pkgName + untrustedExtensionsMapFlow.value += extension updatePendingUpdatesCount() } @@ -357,14 +357,14 @@ class AnimeExtensionManager( availableExtension: AnimeExtension.Available? = null, ): Boolean { val availableExt = availableExtension - ?: _availableExtensionsMapFlow.value[pkgName] + ?: availableExtensionsMapFlow.value[pkgName] ?: return false return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) } private fun updatePendingUpdatesCount() { - val pendingUpdateCount = _installedExtensionsMapFlow.value.values.count { it.hasUpdate } + val pendingUpdateCount = installedExtensionsMapFlow.value.values.count { it.hasUpdate } preferences.animeExtensionUpdatesCount().set(pendingUpdateCount) if (pendingUpdateCount == 0) { ExtensionUpdateNotifier(context).dismiss() diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt index d32d334255..7c729efc02 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt @@ -314,7 +314,7 @@ internal object AnimeExtensionLoader { val obj = Class.forName( it, false, - fallBackClassLoader + fallBackClassLoader, ).getDeclaredConstructor().newInstance() ) { is AnimeSource -> { diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt index cd2018434d..0b020cdc34 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt @@ -62,14 +62,14 @@ class MangaExtensionManager( private val iconMap = mutableMapOf() - private val _installedExtensionsMapFlow = MutableStateFlow(emptyMap()) - val installedExtensionsFlow = _installedExtensionsMapFlow.mapExtensions(scope) + private val installedExtensionsMapFlow = MutableStateFlow(emptyMap()) + val installedExtensionsFlow = installedExtensionsMapFlow.mapExtensions(scope) - private val _availableExtensionsMapFlow = MutableStateFlow(emptyMap()) - val availableExtensionsFlow = _availableExtensionsMapFlow.mapExtensions(scope) + private val availableExtensionsMapFlow = MutableStateFlow(emptyMap()) + val availableExtensionsFlow = availableExtensionsMapFlow.mapExtensions(scope) - private val _untrustedExtensionsMapFlow = MutableStateFlow(emptyMap()) - val untrustedExtensionsFlow = _untrustedExtensionsMapFlow.mapExtensions(scope) + private val untrustedExtensionsMapFlow = MutableStateFlow(emptyMap()) + val untrustedExtensionsFlow = untrustedExtensionsMapFlow.mapExtensions(scope) init { initExtensions() @@ -79,7 +79,7 @@ class MangaExtensionManager( private var subLanguagesEnabledOnFirstRun = preferences.enabledLanguages().isSet() fun getAppIconForSource(sourceId: Long): Drawable? { - val pkgName = _installedExtensionsMapFlow.value.values + val pkgName = installedExtensionsMapFlow.value.values .find { ext -> ext.sources.any { it.id == sourceId } } @@ -109,11 +109,11 @@ class MangaExtensionManager( private fun initExtensions() { val extensions = MangaExtensionLoader.loadMangaExtensions(context) - _installedExtensionsMapFlow.value = extensions + installedExtensionsMapFlow.value = extensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } - _untrustedExtensionsMapFlow.value = extensions + untrustedExtensionsMapFlow.value = extensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } @@ -121,7 +121,7 @@ class MangaExtensionManager( } /** - * Finds the available extensions in the [api] and updates [_availableExtensionsMapFlow]. + * Finds the available extensions in the [api] and updates [availableExtensionsMapFlow]. */ suspend fun findAvailableExtensions() { val extensions: List = try { @@ -134,7 +134,7 @@ class MangaExtensionManager( enableAdditionalSubLanguages(extensions) - _availableExtensionsMapFlow.value = extensions.associateBy { it.pkgName } + availableExtensionsMapFlow.value = extensions.associateBy { it.pkgName } updatedInstalledExtensionsStatuses(extensions) setupAvailableExtensionsSourcesDataMap(extensions) } @@ -182,7 +182,7 @@ class MangaExtensionManager( return } - val installedExtensionsMap = _installedExtensionsMapFlow.value.toMutableMap() + val installedExtensionsMap = installedExtensionsMapFlow.value.toMutableMap() var changed = false for ((pkgName, extension) in installedExtensionsMap) { @@ -207,7 +207,7 @@ class MangaExtensionManager( } } if (changed) { - _installedExtensionsMapFlow.value = installedExtensionsMap + installedExtensionsMapFlow.value = installedExtensionsMap } updatePendingUpdatesCount() } @@ -231,7 +231,7 @@ class MangaExtensionManager( * @param extension The extension to be updated. */ fun updateExtension(extension: MangaExtension.Installed): Flow { - val availableExt = _availableExtensionsMapFlow.value[extension.pkgName] ?: return emptyFlow() + val availableExt = availableExtensionsMapFlow.value[extension.pkgName] ?: return emptyFlow() return installExtension(availableExt) } @@ -268,11 +268,11 @@ class MangaExtensionManager( * @param extension the extension to trust */ suspend fun trust(extension: MangaExtension.Untrusted) { - _untrustedExtensionsMapFlow.value[extension.pkgName] ?: return + untrustedExtensionsMapFlow.value[extension.pkgName] ?: return trustExtension.trust(extension.pkgName, extension.versionCode, extension.signatureHash) - _untrustedExtensionsMapFlow.value -= extension.pkgName + untrustedExtensionsMapFlow.value -= extension.pkgName MangaExtensionLoader.loadMangaExtensionFromPkgName(context, extension.pkgName) .let { it as? MangaLoadResult.Success } @@ -285,7 +285,7 @@ class MangaExtensionManager( * @param extension The extension to be registered. */ private fun registerNewExtension(extension: MangaExtension.Installed) { - _installedExtensionsMapFlow.value += extension + installedExtensionsMapFlow.value += extension } /** @@ -295,7 +295,7 @@ class MangaExtensionManager( * @param extension The extension to be registered. */ private fun registerUpdatedExtension(extension: MangaExtension.Installed) { - _installedExtensionsMapFlow.value += extension + installedExtensionsMapFlow.value += extension } /** @@ -305,8 +305,8 @@ class MangaExtensionManager( * @param pkgName The package name of the uninstalled application. */ private fun unregisterExtension(pkgName: String) { - _installedExtensionsMapFlow.value -= pkgName - _untrustedExtensionsMapFlow.value -= pkgName + installedExtensionsMapFlow.value -= pkgName + untrustedExtensionsMapFlow.value -= pkgName } /** @@ -325,8 +325,8 @@ class MangaExtensionManager( } override fun onExtensionUntrusted(extension: MangaExtension.Untrusted) { - _installedExtensionsMapFlow.value -= extension.pkgName - _untrustedExtensionsMapFlow.value += extension + installedExtensionsMapFlow.value -= extension.pkgName + untrustedExtensionsMapFlow.value += extension updatePendingUpdatesCount() } @@ -352,14 +352,14 @@ class MangaExtensionManager( availableExtension: MangaExtension.Available? = null, ): Boolean { val availableExt = availableExtension - ?: _availableExtensionsMapFlow.value[pkgName] + ?: availableExtensionsMapFlow.value[pkgName] ?: return false return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) } private fun updatePendingUpdatesCount() { - val pendingUpdateCount = _installedExtensionsMapFlow.value.values.count { it.hasUpdate } + val pendingUpdateCount = installedExtensionsMapFlow.value.values.count { it.hasUpdate } preferences.mangaExtensionUpdatesCount().set(pendingUpdateCount) if (pendingUpdateCount == 0) { ExtensionUpdateNotifier(context).dismiss() diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt index 3afea63b4f..31645c8ccf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt @@ -324,7 +324,7 @@ internal object MangaExtensionLoader { val obj = Class.forName( it, false, - fallBackClassLoader + fallBackClassLoader, ).getDeclaredConstructor().newInstance() ) { is MangaSource -> { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt index c3b94d6395..110ba09eb1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt @@ -97,7 +97,8 @@ class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObser val incognitoModeFlow = preferences.incognitoMode().changes() combine(secureScreenFlow, incognitoModeFlow) { secureScreen, incognitoMode -> secureScreen == SecurityPreferences.SecureScreenMode.ALWAYS || - secureScreen == SecurityPreferences.SecureScreenMode.INCOGNITO && incognitoMode + secureScreen == SecurityPreferences.SecureScreenMode.INCOGNITO && + incognitoMode } .onEach(activity.window::setSecureScreen) .launchIn(activity.lifecycleScope) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionsScreenModel.kt index 33b04d08fc..77d8604ccc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionsScreenModel.kt @@ -41,7 +41,7 @@ class AnimeExtensionsScreenModel( private val getExtensions: GetAnimeExtensionsByType = Injekt.get(), ) : StateScreenModel(State()) { - private var _currentDownloads = MutableStateFlow>(hashMapOf()) + private val currentDownloads = MutableStateFlow>(hashMapOf()) init { val context = Injekt.get() @@ -90,7 +90,7 @@ class AnimeExtensionsScreenModel( screenModelScope.launchIO { combine( state.map { it.searchQuery }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS), - _currentDownloads, + currentDownloads, getExtensions.subscribe(), ) { query, downloads, (_updates, _installed, _available, _untrusted) -> val searchQuery = query ?: "" @@ -183,11 +183,11 @@ class AnimeExtensionsScreenModel( } private fun addDownloadState(extension: AnimeExtension, installStep: InstallStep) { - _currentDownloads.update { it + Pair(extension.pkgName, installStep) } + currentDownloads.update { it + Pair(extension.pkgName, installStep) } } private fun removeDownloadState(extension: AnimeExtension) { - _currentDownloads.update { it - extension.pkgName } + currentDownloads.update { it - extension.pkgName } } private suspend fun Flow.collectToInstallUpdate(extension: AnimeExtension) = diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionsScreenModel.kt index 83ca025312..355c195418 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionsScreenModel.kt @@ -41,7 +41,7 @@ class MangaExtensionsScreenModel( private val getExtensions: GetMangaExtensionsByType = Injekt.get(), ) : StateScreenModel(State()) { - private var _currentDownloads = MutableStateFlow>(hashMapOf()) + private val currentDownloads = MutableStateFlow>(hashMapOf()) init { val context = Injekt.get() @@ -90,7 +90,7 @@ class MangaExtensionsScreenModel( screenModelScope.launchIO { combine( state.map { it.searchQuery }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS), - _currentDownloads, + currentDownloads, getExtensions.subscribe(), ) { query, downloads, (_updates, _installed, _available, _untrusted) -> val searchQuery = query ?: "" @@ -184,11 +184,11 @@ class MangaExtensionsScreenModel( } private fun addDownloadState(extension: MangaExtension, installStep: InstallStep) { - _currentDownloads.update { it + Pair(extension.pkgName, installStep) } + currentDownloads.update { it + Pair(extension.pkgName, installStep) } } private fun removeDownloadState(extension: MangaExtension) { - _currentDownloads.update { it - extension.pkgName } + currentDownloads.update { it - extension.pkgName } } private suspend fun Flow.collectToInstallUpdate(extension: MangaExtension) = diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt index 94cbdf364a..9232dba4ec 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt @@ -71,8 +71,8 @@ object HomeScreen : Screen() { private val openTabEvent = Channel() private val showBottomNavEvent = Channel() - private const val TabFadeDuration = 200 - private const val TabNavigatorKey = "HomeTabs" + private const val TAB_FADE_DURATION = 200 + private const val TAB_NAVIGATOR_KEY = "HomeTabs" private val uiPreferences: UiPreferences by injectLazy() private val defaultTab = uiPreferences.startScreen().get().tab @@ -84,7 +84,7 @@ object HomeScreen : Screen() { val navigator = LocalNavigator.currentOrThrow TabNavigator( tab = defaultTab, - key = TabNavigatorKey, + key = TAB_NAVIGATOR_KEY, ) { tabNavigator -> // Provide usable navigator to content screen CompositionLocalProvider(LocalNavigator provides navigator) { @@ -128,9 +128,9 @@ object HomeScreen : Screen() { transitionSpec = { materialFadeThroughIn( initialScale = 1f, - durationMillis = TabFadeDuration, + durationMillis = TAB_FADE_DURATION, ) togetherWith - materialFadeThroughOut(durationMillis = TabFadeDuration) + materialFadeThroughOut(durationMillis = TAB_FADE_DURATION) }, label = "tabContent", ) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibrarySettingsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibrarySettingsScreenModel.kt index 13e90cdedb..e4e7592b83 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibrarySettingsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibrarySettingsScreenModel.kt @@ -32,7 +32,7 @@ class AnimeLibrarySettingsScreenModel( .stateIn( scope = screenModelScope, started = SharingStarted.WhileSubscribed(5.seconds.inWholeMilliseconds), - initialValue = trackerManager.loggedInTrackers() + initialValue = trackerManager.loggedInTrackers(), ) fun toggleFilter(preference: (LibraryPreferences) -> Preference) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibrarySettingsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibrarySettingsScreenModel.kt index d439e47d59..e5c9a33f5e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibrarySettingsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibrarySettingsScreenModel.kt @@ -32,7 +32,7 @@ class MangaLibrarySettingsScreenModel( .stateIn( scope = screenModelScope, started = SharingStarted.WhileSubscribed(5.seconds.inWholeMilliseconds), - initialValue = trackerManager.loggedInTrackers() + initialValue = trackerManager.loggedInTrackers(), ) fun toggleFilter(preference: (LibraryPreferences) -> Preference) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt index 369528c366..925350828b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt @@ -94,10 +94,10 @@ private class MoreScreenModel( var downloadedOnly by preferences.downloadedOnly().asState(screenModelScope) var incognitoMode by preferences.incognitoMode().asState(screenModelScope) - private var _state: MutableStateFlow = MutableStateFlow( + private var _downloadQueueState: MutableStateFlow = MutableStateFlow( DownloadQueueState.Stopped, ) - val downloadQueueState: StateFlow = _state.asStateFlow() + val downloadQueueState: StateFlow = _downloadQueueState.asStateFlow() init { // Handle running/paused status change and queue progress updating @@ -120,7 +120,7 @@ private class MoreScreenModel( val isDownloading = isDownloadingAnime || isDownloadingManga val downloadQueueSize = mangaDownloadQueueSize + animeDownloadQueueSize val pendingDownloadExists = downloadQueueSize != 0 - _state.value = when { + _downloadQueueState.value = when { !pendingDownloadExists -> DownloadQueueState.Stopped !isDownloading -> DownloadQueueState.Paused(downloadQueueSize) else -> DownloadQueueState.Downloading(downloadQueueSize) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/ExternalIntents.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/ExternalIntents.kt index f243263263..3915170c49 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/ExternalIntents.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/ExternalIntents.kt @@ -170,7 +170,7 @@ class ExternalIntents { */ private fun getIntentForPackage(pkgName: String, context: Context, uri: Uri, video: Video): Intent { return when (pkgName) { - WebVideoCaster -> webVideoCasterIntent(pkgName, context, uri, video) + WEB_VIDEO_CASTER -> webVideoCasterIntent(pkgName, context, uri, video) else -> standardIntentForPackage(pkgName, context, uri, video) } } @@ -178,7 +178,7 @@ class ExternalIntents { private fun webVideoCasterIntent(pkgName: String, context: Context, uri: Uri, video: Video): Intent { return Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, "video/*") - if (isPackageInstalled(pkgName, context.packageManager)) setPackage(WebVideoCaster) + if (isPackageInstalled(pkgName, context.packageManager)) setPackage(WEB_VIDEO_CASTER) addExtrasAndFlags(true, this) val headers = Bundle() @@ -300,17 +300,17 @@ class ExternalIntents { */ private fun getComponent(packageName: String): ComponentName? { return when (packageName) { - MpvPlayer -> ComponentName(packageName, "$packageName.MPVActivity") - MxPlayer, MxPlayerFree, MxPlayerPro -> ComponentName( + MPV_PLAYER -> ComponentName(packageName, "$packageName.MPVActivity") + MX_PLAYER, MX_PLAYER_FREE, MX_PLAYER_PRO -> ComponentName( packageName, "$packageName.ActivityScreen", ) - VlcPlayer -> ComponentName(packageName, "$packageName.gui.video.VideoPlayerActivity") - MpvKt, MpvKtPreview -> ComponentName(packageName, "live.mehiz.mpvkt.ui.player.PlayerActivity") - MpvRemote -> ComponentName(packageName, "$packageName.MainActivity") - JustPlayer -> ComponentName(packageName, "$packageName.PlayerActivity") - NextPlayer -> ComponentName(packageName, "$packageName.feature.player.PlayerActivity") - XPlayer -> ComponentName(packageName, "com.inshot.xplayer.activities.PlayerActivity") + VLC_PLAYER -> ComponentName(packageName, "$packageName.gui.video.VideoPlayerActivity") + MPV_KT, MPV_KT_PREVIEW -> ComponentName(packageName, "live.mehiz.mpvkt.ui.player.PlayerActivity") + MPV_REMOTE -> ComponentName(packageName, "$packageName.MainActivity") + JUST_PLAYER -> ComponentName(packageName, "$packageName.PlayerActivity") + NEXT_PLAYER -> ComponentName(packageName, "$packageName.feature.player.PlayerActivity") + X_PLAYER -> ComponentName(packageName, "com.inshot.xplayer.activities.PlayerActivity") else -> null } } @@ -560,15 +560,15 @@ class ExternalIntents { } // List of supported external players and their packages -const val MpvPlayer = "is.xyz.mpv" -const val MxPlayer = "com.mxtech.videoplayer" -const val MxPlayerFree = "com.mxtech.videoplayer.ad" -const val MxPlayerPro = "com.mxtech.videoplayer.pro" -const val VlcPlayer = "org.videolan.vlc" -const val MpvKt = "live.mehiz.mpvkt" -const val MpvKtPreview = "live.mehiz.mpvkt.preview" -const val MpvRemote = "com.husudosu.mpvremote" -const val JustPlayer = "com.brouken.player" -const val NextPlayer = "dev.anilbeesetti.nextplayer" -const val XPlayer = "video.player.videoplayer" -const val WebVideoCaster = "com.instantbits.cast.webvideo" +const val MPV_PLAYER = "is.xyz.mpv" +const val MX_PLAYER = "com.mxtech.videoplayer" +const val MX_PLAYER_FREE = "com.mxtech.videoplayer.ad" +const val MX_PLAYER_PRO = "com.mxtech.videoplayer.pro" +const val VLC_PLAYER = "org.videolan.vlc" +const val MPV_KT = "live.mehiz.mpvkt" +const val MPV_KT_PREVIEW = "live.mehiz.mpvkt.preview" +const val MPV_REMOTE = "com.husudosu.mpvremote" +const val JUST_PLAYER = "com.brouken.player" +const val NEXT_PLAYER = "dev.anilbeesetti.nextplayer" +const val X_PLAYER = "video.player.videoplayer" +const val WEB_VIDEO_CASTER = "com.instantbits.cast.webvideo" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt index 2a4f0f60ab..1db0b94d72 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt @@ -165,22 +165,28 @@ class PlayerViewModel @JvmOverloads constructor( ?: error("Requested episode of id $episodeId not found in episode list") val episodesForPlayer = episodes.filterNot { - anime.unseenFilterRaw == Anime.EPISODE_SHOW_SEEN && !it.seen || - anime.unseenFilterRaw == Anime.EPISODE_SHOW_UNSEEN && it.seen || - anime.downloadedFilterRaw == Anime.EPISODE_SHOW_DOWNLOADED && !downloadManager.isEpisodeDownloaded( + anime.unseenFilterRaw == Anime.EPISODE_SHOW_SEEN && + !it.seen || + anime.unseenFilterRaw == Anime.EPISODE_SHOW_UNSEEN && + it.seen || + anime.downloadedFilterRaw == Anime.EPISODE_SHOW_DOWNLOADED && + !downloadManager.isEpisodeDownloaded( it.name, it.scanlator, anime.title, anime.source, ) || - anime.downloadedFilterRaw == Anime.EPISODE_SHOW_NOT_DOWNLOADED && downloadManager.isEpisodeDownloaded( + anime.downloadedFilterRaw == Anime.EPISODE_SHOW_NOT_DOWNLOADED && + downloadManager.isEpisodeDownloaded( it.name, it.scanlator, anime.title, anime.source, ) || - anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_BOOKMARKED && !it.bookmark || - anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_NOT_BOOKMARKED && it.bookmark + anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_BOOKMARKED && + !it.bookmark || + anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_NOT_BOOKMARKED && + it.bookmark }.toMutableList() if (episodesForPlayer.all { it.id != episodeId }) { @@ -321,10 +327,11 @@ class PlayerViewModel @JvmOverloads constructor( fun isEpisodeOnline(): Boolean? { val anime = currentAnime ?: return null val episode = currentEpisode ?: return null - return currentSource is AnimeHttpSource && !EpisodeLoader.isDownload( - episode.toDomainEpisode()!!, - anime, - ) + return currentSource is AnimeHttpSource && + !EpisodeLoader.isDownload( + episode.toDomainEpisode()!!, + anime, + ) } suspend fun loadEpisode(episodeId: Long?): Pair?, String>? { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/EpisodeListDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/EpisodeListDialog.kt index 1a8983f939..af003a7760 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/EpisodeListDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/EpisodeListDialog.kt @@ -39,7 +39,7 @@ import eu.kanade.tachiyomi.util.lang.toRelativeString import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.VerticalFastScroller -import tachiyomi.presentation.core.components.material.ReadItemAlpha +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import java.time.Instant @@ -131,9 +131,9 @@ private fun EpisodeListItem( var textHeight by remember { mutableStateOf(0) } val bookmarkIcon = if (isBookmarked) Icons.Filled.Bookmark else Icons.Outlined.Bookmark - val bookmarkAlpha = if (isBookmarked) 1f else ReadItemAlpha + val bookmarkAlpha = if (isBookmarked) 1f else DISABLED_ALPHA val episodeColor = if (isBookmarked) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface - val textAlpha = if (episode.seen) ReadItemAlpha else 1f + val textAlpha = if (episode.seen) DISABLED_ALPHA else 1f val textWeight = if (isCurrentEpisode) FontWeight.Bold else FontWeight.Normal val textStyle = if (isCurrentEpisode) FontStyle.Italic else FontStyle.Normal diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/SkipIntroLengthDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/SkipIntroLengthDialog.kt index 8595b52ffb..f70d4746e3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/SkipIntroLengthDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/dialogs/SkipIntroLengthDialog.kt @@ -25,7 +25,11 @@ fun SkipIntroLengthDialog( titleRes = MR.strings.action_change_intro_length, modifier = Modifier.fillMaxWidth(fraction = if (fromPlayer) 0.5F else 0.8F), hideSystemBars = fromPlayer, - onConfirmRequest = if (fromPlayer) null else { {} }, + onConfirmRequest = if (fromPlayer) { + null + } else { + {} + }, onDismissRequest = { updateSkipIntroLength(newLength.toLong()) onDismissRequest() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/sheets/subtitle/SubtitleFontPage.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/sheets/subtitle/SubtitleFontPage.kt index bccab3d334..ae53008cbe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/sheets/subtitle/SubtitleFontPage.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/settings/sheets/subtitle/SubtitleFontPage.kt @@ -36,7 +36,7 @@ import tachiyomi.core.common.storage.extension import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.OutlinedNumericChooser -import tachiyomi.presentation.core.components.material.ReadItemAlpha +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState @@ -126,7 +126,7 @@ private fun SubtitleFont( onValueChanged = onSizeChanged, ) - val boldAlpha = if (boldSubtitles) 1f else ReadItemAlpha + val boldAlpha = if (boldSubtitles) 1f else DISABLED_ALPHA Icon( imageVector = Icons.Outlined.FormatBold, contentDescription = null, @@ -136,7 +136,7 @@ private fun SubtitleFont( .clickable(onClick = updateBold), ) - val italicAlpha = if (italicSubtitles) 1f else ReadItemAlpha + val italicAlpha = if (italicSubtitles) 1f else DISABLED_ALPHA Icon( imageVector = Icons.Outlined.FormatItalic, contentDescription = null, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/viewer/PlayerEnums.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/viewer/PlayerEnums.kt index d02cbe7ede..80e9b6d2c9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/viewer/PlayerEnums.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/viewer/PlayerEnums.kt @@ -8,21 +8,28 @@ import tachiyomi.i18n.MR * Results of the set as cover feature. */ enum class SetAsCover { - Success, AddToLibraryFirst, Error + Success, + AddToLibraryFirst, + Error, } /** * Player's inverted playback text handler */ enum class InvertedPlayback { - NONE, POSITION, DURATION + NONE, + POSITION, + DURATION, } /** * Player's Picture-In-Picture state handler */ enum class PipState { - OFF, ON, STARTED; + OFF, + ON, + STARTED, + ; companion object { internal var mode: PipState = OFF @@ -33,7 +40,12 @@ enum class PipState { * Player's Seek state handler */ enum class SeekState { - DOUBLE_TAP, LOCKED, NONE, SCROLL, SEEKBAR; + DOUBLE_TAP, + LOCKED, + NONE, + SCROLL, + SEEKBAR, + ; companion object { internal var mode = NONE @@ -66,7 +78,8 @@ enum class HwDecState(val title: String, val mpvValue: String) { companion object { private val isWSA = Build.MODEL == "Subsystem for Android(TM)" || - Build.BRAND == "Windows" || Build.BOARD == "windows" + Build.BRAND == "Windows" || + Build.BOARD == "windows" internal val defaultHwDec = when { isWSA -> SW diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index 61b9b551e3..9a20a72d89 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -164,7 +164,8 @@ class ReaderViewModel @JvmOverloads constructor( (manga.unreadFilterRaw == Manga.CHAPTER_SHOW_UNREAD && it.read) || ( manga.downloadedFilterRaw == - Manga.CHAPTER_SHOW_DOWNLOADED && !downloadManager.isChapterDownloaded( + Manga.CHAPTER_SHOW_DOWNLOADED && + !downloadManager.isChapterDownloaded( it.name, it.scanlator, manga.title, @@ -173,7 +174,8 @@ class ReaderViewModel @JvmOverloads constructor( ) || ( manga.downloadedFilterRaw == - Manga.CHAPTER_SHOW_NOT_DOWNLOADED && downloadManager.isChapterDownloaded( + Manga.CHAPTER_SHOW_NOT_DOWNLOADED && + downloadManager.isChapterDownloaded( it.name, it.scanlator, manga.title, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt index 58e193410d..9cc6169cc5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt @@ -177,7 +177,7 @@ class ReaderPreferences( enum class FlashColor { BLACK, WHITE, - WHITE_BLACK + WHITE_BLACK, } enum class TappingInvertMode( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt index a209f3c3b1..bcdae4da65 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderPageImageView.kt @@ -417,7 +417,9 @@ open class ReaderPageImageView @JvmOverloads constructor( ) enum class ZoomStartPosition { - LEFT, CENTER, RIGHT + LEFT, + CENTER, + RIGHT, } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt index 5ff4ecaae8..e26cb8e9fb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt @@ -92,7 +92,8 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { // Add next chapter transition and pages. nextTransition = ChapterTransition.Next(chapters.currChapter, chapters.nextChapter) .also { - if (nextHasMissingChapters || forceTransition || + if (nextHasMissingChapters || + forceTransition || chapters.nextChapter?.state !is ReaderChapter.State.Loaded ) { newItems.add(it) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt index 30647f6c71..4b6fe2c582 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt @@ -190,7 +190,11 @@ class WebtoonRecyclerView @JvmOverloads constructor( setScaleRate(currentScale) - layoutParams.height = if (currentScale < 1) { (originalHeight / currentScale).toInt() } else { originalHeight } + layoutParams.height = if (currentScale < 1) { + (originalHeight / currentScale).toInt() + } else { + originalHeight + } halfHeight = layoutParams.height / 2 if (currentScale != DEFAULT_RATE) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index de1578bfe6..3eb68f43d6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -79,7 +79,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr .threshold init { - recycler.setItemViewCacheSize(RecyclerViewCacheSize) + recycler.setItemViewCacheSize(RECYCLER_VIEW_CACHE_SIZE) recycler.isVisible = false // Don't let the recycler layout yet recycler.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT) recycler.isFocusable = false @@ -362,4 +362,4 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr } // Double the cache size to reduce rebinds/recycles incurred by the extra layout space on scroll direction changes -private const val RecyclerViewCacheSize = 4 +private const val RECYCLER_VIEW_CACHE_SIZE = 4 diff --git a/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt b/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt index c452707d54..cfb8db2b66 100644 --- a/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt +++ b/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt @@ -9,20 +9,24 @@ import tachiyomi.core.common.util.system.logcat class MigrationJobFactory( private val migrationContext: MigrationContext, - private val scope: CoroutineScope + private val scope: CoroutineScope, ) { fun create(migrations: List): Deferred = with(scope) { return migrations.sortedBy { it.version } .fold(CompletableDeferred(true)) { acc: Deferred, migration: Migration -> if (!migrationContext.dryrun) { - logcat { "Running migration: { name = ${migration::class.simpleName}, version = ${migration.version} }" } + logcat { + "Running migration: { name = ${migration::class.simpleName}, version = ${migration.version} }" + } async(start = CoroutineStart.UNDISPATCHED) { val prev = acc.await() migration(migrationContext) || prev } } else { - logcat { "(Dry-run) Running migration: { name = ${migration::class.simpleName}, version = ${migration.version} }" } + logcat { + "(Dry-run) Running migration: { name = ${migration::class.simpleName}, version = ${migration.version} }" + } CompletableDeferred(true) } } diff --git a/app/src/main/java/mihon/core/migration/MigrationStrategy.kt b/app/src/main/java/mihon/core/migration/MigrationStrategy.kt index 9fd5f4f919..8033ebc6d6 100644 --- a/app/src/main/java/mihon/core/migration/MigrationStrategy.kt +++ b/app/src/main/java/mihon/core/migration/MigrationStrategy.kt @@ -12,7 +12,7 @@ interface MigrationStrategy { class DefaultMigrationStrategy( private val migrationJobFactory: MigrationJobFactory, private val migrationCompletedListener: MigrationCompletedListener, - private val scope: CoroutineScope + private val scope: CoroutineScope, ) : MigrationStrategy { override operator fun invoke(migrations: List): Deferred = with(scope) { @@ -46,7 +46,7 @@ class NoopMigrationStrategy(val state: Boolean) : MigrationStrategy { class VersionRangeMigrationStrategy( private val versions: IntRange, - private val strategy: DefaultMigrationStrategy + private val strategy: DefaultMigrationStrategy, ) : MigrationStrategy { override operator fun invoke(migrations: List): Deferred { diff --git a/app/src/main/java/mihon/core/migration/Migrator.kt b/app/src/main/java/mihon/core/migration/Migrator.kt index 2296aa0747..c01a3873e6 100644 --- a/app/src/main/java/mihon/core/migration/Migrator.kt +++ b/app/src/main/java/mihon/core/migration/Migrator.kt @@ -17,7 +17,7 @@ object Migrator { new: Int, migrations: List, dryrun: Boolean = false, - onMigrationComplete: () -> Unit + onMigrationComplete: () -> Unit, ) { val migrationContext = MigrationContext(dryrun) val migrationJobFactory = MigrationJobFactory(migrationContext, scope) diff --git a/app/src/main/java/mihon/feature/upcoming/components/calendar/Calendar.kt b/app/src/main/java/mihon/feature/upcoming/components/calendar/Calendar.kt index da511ddada..6b32c7f895 100644 --- a/app/src/main/java/mihon/feature/upcoming/components/calendar/Calendar.kt +++ b/app/src/main/java/mihon/feature/upcoming/components/calendar/Calendar.kt @@ -32,7 +32,7 @@ import java.time.temporal.WeekFields import java.util.Locale private val FontSize = 16.sp -private const val DaysOfWeek = 7 +private const val DAYS_OF_WEEK = 7 @Composable fun Calendar( @@ -54,7 +54,7 @@ fun Calendar( modifier = Modifier .fillMaxWidth() .padding(vertical = MaterialTheme.padding.small) - .padding(start = MaterialTheme.padding.medium) + .padding(start = MaterialTheme.padding.medium), ) CalendarGrid( selectedYearMonth = selectedYearMonth, @@ -72,8 +72,8 @@ private fun CalendarGrid( ) { val localeFirstDayOfWeek = WeekFields.of(Locale.getDefault()).firstDayOfWeek.value val weekDays = remember { - (0 until DaysOfWeek) - .map { DayOfWeek.of((localeFirstDayOfWeek - 1 + it) % DaysOfWeek + 1) } + (0 until DAYS_OF_WEEK) + .map { DayOfWeek.of((localeFirstDayOfWeek - 1 + it) % DAYS_OF_WEEK + 1) } .toImmutableList() } @@ -81,12 +81,12 @@ private fun CalendarGrid( val daysInMonth = selectedYearMonth.lengthOfMonth() VerticalGrid( - columns = SimpleGridCells.Fixed(DaysOfWeek), + columns = SimpleGridCells.Fixed(DAYS_OF_WEEK), modifier = if (isMediumWidthWindow() && !isExpandedWidthWindow()) { Modifier.widthIn(max = 360.dp) } else { Modifier - } + }, ) { weekDays.fastForEach { item -> Text( diff --git a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarDay.kt b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarDay.kt index 46ed355abb..3a8f3e6fb0 100644 --- a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarDay.kt +++ b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarDay.kt @@ -19,9 +19,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import java.time.LocalDate -private const val MaxEvents = 3 +private const val MAX_EVENTS = 3 @Composable fun CalendarDay( @@ -39,7 +40,7 @@ fun CalendarDay( Modifier.border( border = BorderStroke( width = 1.dp, - color = MaterialTheme.colorScheme.onBackground + color = MaterialTheme.colorScheme.onBackground, ), shape = CircleShape, ) @@ -57,14 +58,14 @@ fun CalendarDay( textAlign = TextAlign.Center, fontSize = 16.sp, color = if (date.isBefore(today)) { - MaterialTheme.colorScheme.onBackground.copy(alpha = 0.38f) + MaterialTheme.colorScheme.onBackground.copy(alpha = DISABLED_ALPHA) } else { MaterialTheme.colorScheme.onBackground }, fontWeight = FontWeight.SemiBold, ) Row(Modifier.offset(y = 12.dp)) { - val size = events.coerceAtMost(MaxEvents) + val size = events.coerceAtMost(MAX_EVENTS) for (index in 0 until size) { CalendarIndicator( index = index, diff --git a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt index 55498ebb90..f5dbf5c485 100644 --- a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt +++ b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt @@ -63,20 +63,20 @@ fun CalenderHeader( } } -private const val MonthYearChangeAnimationDuration = 200 +private const val MONTH_YEAR_CHANGE_ANIMATION_DURATION = 200 private fun AnimatedContentTransitionScope.getAnimation(): ContentTransform { val movingForward = targetState > initialState val enterTransition = slideInVertically( - animationSpec = tween(durationMillis = MonthYearChangeAnimationDuration), + animationSpec = tween(durationMillis = MONTH_YEAR_CHANGE_ANIMATION_DURATION), ) { height -> if (movingForward) height else -height } + fadeIn( - animationSpec = tween(durationMillis = MonthYearChangeAnimationDuration), + animationSpec = tween(durationMillis = MONTH_YEAR_CHANGE_ANIMATION_DURATION), ) val exitTransition = slideOutVertically( - animationSpec = tween(durationMillis = MonthYearChangeAnimationDuration), + animationSpec = tween(durationMillis = MONTH_YEAR_CHANGE_ANIMATION_DURATION), ) { height -> if (movingForward) -height else height } + fadeOut( - animationSpec = tween(durationMillis = MonthYearChangeAnimationDuration), + animationSpec = tween(durationMillis = MONTH_YEAR_CHANGE_ANIMATION_DURATION), ) return (enterTransition togetherWith exitTransition) .using(SizeTransform(clip = false)) diff --git a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarIndicator.kt b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarIndicator.kt index 9aaca69de0..f9e223107c 100644 --- a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarIndicator.kt +++ b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarIndicator.kt @@ -12,8 +12,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -private const val IndicatorScale = 12 -private const val IndicatorAlphaMultiplier = 0.3f +private const val INDICATOR_SCALE = 12 +private const val INDICATOR_ALPHA_MULTIPLIER = 0.3f @Composable fun CalendarIndicator( @@ -26,7 +26,7 @@ fun CalendarIndicator( modifier = modifier .padding(horizontal = 1.dp) .clip(shape = CircleShape) - .background(color = color.copy(alpha = (index + 1) * IndicatorAlphaMultiplier)) - .size(size = size.div(IndicatorScale)), + .background(color = color.copy(alpha = (index + 1) * INDICATOR_ALPHA_MULTIPLIER)) + .size(size = size.div(INDICATOR_SCALE)), ) } diff --git a/app/src/main/res/anim/player_enter_bottom.xml b/app/src/main/res/anim/player_enter_bottom.xml index 03e45f6fc5..d0869aa84b 100644 --- a/app/src/main/res/anim/player_enter_bottom.xml +++ b/app/src/main/res/anim/player_enter_bottom.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_enter_left.xml b/app/src/main/res/anim/player_enter_left.xml index af1035abae..dd695a2de7 100644 --- a/app/src/main/res/anim/player_enter_left.xml +++ b/app/src/main/res/anim/player_enter_left.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_enter_right.xml b/app/src/main/res/anim/player_enter_right.xml index f935394a29..16e5058cef 100644 --- a/app/src/main/res/anim/player_enter_right.xml +++ b/app/src/main/res/anim/player_enter_right.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_enter_top.xml b/app/src/main/res/anim/player_enter_top.xml index 3fd05d20cf..1e588ef0cd 100644 --- a/app/src/main/res/anim/player_enter_top.xml +++ b/app/src/main/res/anim/player_enter_top.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_exit_bottom.xml b/app/src/main/res/anim/player_exit_bottom.xml index 9dfe6064ff..f64a042afc 100644 --- a/app/src/main/res/anim/player_exit_bottom.xml +++ b/app/src/main/res/anim/player_exit_bottom.xml @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_exit_left.xml b/app/src/main/res/anim/player_exit_left.xml index 77354c7937..5c095a9eea 100644 --- a/app/src/main/res/anim/player_exit_left.xml +++ b/app/src/main/res/anim/player_exit_left.xml @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_exit_right.xml b/app/src/main/res/anim/player_exit_right.xml index f5304af2cf..909b5fe566 100644 --- a/app/src/main/res/anim/player_exit_right.xml +++ b/app/src/main/res/anim/player_exit_right.xml @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_exit_top.xml b/app/src/main/res/anim/player_exit_top.xml index d0889cc200..641fae0628 100644 --- a/app/src/main/res/anim/player_exit_top.xml +++ b/app/src/main/res/anim/player_exit_top.xml @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/anim/player_fade_in.xml b/app/src/main/res/anim/player_fade_in.xml index f1e93d0d16..fc204bf286 100644 --- a/app/src/main/res/anim/player_fade_in.xml +++ b/app/src/main/res/anim/player_fade_in.xml @@ -3,4 +3,4 @@ android:duration="@integer/player_animation_duration" android:fromAlpha="0.0" android:toAlpha="1.0" - android:interpolator="@android:interpolator/linear"/> \ No newline at end of file + android:interpolator="@android:interpolator/linear"/> diff --git a/app/src/main/res/anim/player_fade_out.xml b/app/src/main/res/anim/player_fade_out.xml index e2f8c89cd2..54d0b09c47 100644 --- a/app/src/main/res/anim/player_fade_out.xml +++ b/app/src/main/res/anim/player_fade_out.xml @@ -3,4 +3,4 @@ android:duration="@integer/player_animation_duration" android:fromAlpha="1.0" android:toAlpha="0.0" - android:interpolator="@android:interpolator/linear"/> \ No newline at end of file + android:interpolator="@android:interpolator/linear"/> diff --git a/app/src/main/res/drawable/ic_ani_monochrome_launcher.xml b/app/src/main/res/drawable/ic_ani_monochrome_launcher.xml index 954c27544a..a2ce22b29d 100644 --- a/app/src/main/res/drawable/ic_ani_monochrome_launcher.xml +++ b/app/src/main/res/drawable/ic_ani_monochrome_launcher.xml @@ -13,4 +13,4 @@ android:pathData="m64,52.88l-15.13,-8.74c-0.9,-0.52 -2.03,0.13 -2.03,1.17v17.47c0,1.04 1.13,1.7 2.03,1.17L64,55.22c0.9,-0.52 0.9,-1.83 0,-2.35z" android:strokeWidth="0.0853242" android:fillColor="#000"/> - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_animelibrary_filled_24dp.xml b/app/src/main/res/drawable/ic_animelibrary_filled_24dp.xml index 09e99bfde1..16184bfe50 100644 --- a/app/src/main/res/drawable/ic_animelibrary_filled_24dp.xml +++ b/app/src/main/res/drawable/ic_animelibrary_filled_24dp.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_animelibrary_selector_24dp.xml b/app/src/main/res/drawable/ic_animelibrary_selector_24dp.xml index 870e379981..fd41dc95f8 100644 --- a/app/src/main/res/drawable/ic_animelibrary_selector_24dp.xml +++ b/app/src/main/res/drawable/ic_animelibrary_selector_24dp.xml @@ -19,4 +19,4 @@ android:fromId="@id/checked" android:toId="@id/normal" /> - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_brightness_negative_20dp.xml b/app/src/main/res/drawable/ic_brightness_negative_20dp.xml index a8f167db3a..dfa1c9edbe 100644 --- a/app/src/main/res/drawable/ic_brightness_negative_20dp.xml +++ b/app/src/main/res/drawable/ic_brightness_negative_20dp.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_brightness_positive_20dp.xml b/app/src/main/res/drawable/ic_brightness_positive_20dp.xml index 97bbdf42a6..5c4839f0f3 100644 --- a/app/src/main/res/drawable/ic_brightness_positive_20dp.xml +++ b/app/src/main/res/drawable/ic_brightness_positive_20dp.xml @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_circle_200dp.xml b/app/src/main/res/drawable/ic_circle_200dp.xml index 1a845275a3..f42d850a37 100644 --- a/app/src/main/res/drawable/ic_circle_200dp.xml +++ b/app/src/main/res/drawable/ic_circle_200dp.xml @@ -6,4 +6,4 @@ android:topLeftRadius="500dp" android:topRightRadius="0dp"/> - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_circle_right_200dp.xml b/app/src/main/res/drawable/ic_circle_right_200dp.xml index 50ecf2c17b..0027ca8eee 100644 --- a/app/src/main/res/drawable/ic_circle_right_200dp.xml +++ b/app/src/main/res/drawable/ic_circle_right_200dp.xml @@ -6,4 +6,4 @@ android:topLeftRadius="0dp" android:topRightRadius="500dp"/> - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_glasses_24dp.xml b/app/src/main/res/drawable/ic_glasses_24dp.xml index 581a599141..572c2f06d8 100644 --- a/app/src/main/res/drawable/ic_glasses_24dp.xml +++ b/app/src/main/res/drawable/ic_glasses_24dp.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_pause_circle_filled_24.xml b/app/src/main/res/drawable/ic_pause_circle_filled_24.xml index db21593ebf..b81f101131 100644 --- a/app/src/main/res/drawable/ic_pause_circle_filled_24.xml +++ b/app/src/main/res/drawable/ic_pause_circle_filled_24.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_picture_in_picture_20dp.xml b/app/src/main/res/drawable/ic_picture_in_picture_20dp.xml index 16bbea6d86..7df3cd8f7e 100644 --- a/app/src/main/res/drawable/ic_picture_in_picture_20dp.xml +++ b/app/src/main/res/drawable/ic_picture_in_picture_20dp.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_play_circle_filled_24.xml b/app/src/main/res/drawable/ic_play_circle_filled_24.xml index f384b32541..1f02dc8cf0 100644 --- a/app/src/main/res/drawable/ic_play_circle_filled_24.xml +++ b/app/src/main/res/drawable/ic_play_circle_filled_24.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_play_seek_triangle.xml b/app/src/main/res/drawable/ic_play_seek_triangle.xml index 46d337e504..822c545bec 100644 --- a/app/src/main/res/drawable/ic_play_seek_triangle.xml +++ b/app/src/main/res/drawable/ic_play_seek_triangle.xml @@ -8,4 +8,4 @@ android:fillColor="#FFFFFF" android:pathData="M3,2 L22,12 L3,22 Z" /> - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_updates_outline_24dp.xml b/app/src/main/res/drawable/ic_updates_outline_24dp.xml index 2a1937ad7d..53d5363997 100644 --- a/app/src/main/res/drawable/ic_updates_outline_24dp.xml +++ b/app/src/main/res/drawable/ic_updates_outline_24dp.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_volume_off_24dp.xml b/app/src/main/res/drawable/ic_volume_off_24dp.xml index 63386c8356..1fc225463c 100644 --- a/app/src/main/res/drawable/ic_volume_off_24dp.xml +++ b/app/src/main/res/drawable/ic_volume_off_24dp.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_volume_on_20dp.xml b/app/src/main/res/drawable/ic_volume_on_20dp.xml index e46c70ddbd..7efdaf5df9 100644 --- a/app/src/main/res/drawable/ic_volume_on_20dp.xml +++ b/app/src/main/res/drawable/ic_volume_on_20dp.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/material_popup_background.xml b/app/src/main/res/drawable/material_popup_background.xml index 09987c4159..29bb971679 100644 --- a/app/src/main/res/drawable/material_popup_background.xml +++ b/app/src/main/res/drawable/material_popup_background.xml @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/player_bar.xml b/app/src/main/res/drawable/player_bar.xml index a5c89d9186..8676241fa6 100644 --- a/app/src/main/res/drawable/player_bar.xml +++ b/app/src/main/res/drawable/player_bar.xml @@ -22,4 +22,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/player_chapters_item.xml b/app/src/main/res/layout/player_chapters_item.xml index 0caad5e045..bd11e5624c 100644 --- a/app/src/main/res/layout/player_chapters_item.xml +++ b/app/src/main/res/layout/player_chapters_item.xml @@ -14,4 +14,4 @@ android:textColor="?attr/colorOnBackground" app:drawableEndCompat="@drawable/ic_blank_24dp" tools:text="1080p" - app:drawableTint="?attr/colorOnBackground" /> \ No newline at end of file + app:drawableTint="?attr/colorOnBackground" /> diff --git a/app/src/main/res/layout/player_controls.xml b/app/src/main/res/layout/player_controls.xml index 6e9c3a225a..47fdcbe78b 100644 --- a/app/src/main/res/layout/player_controls.xml +++ b/app/src/main/res/layout/player_controls.xml @@ -472,4 +472,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/player_double_tap_seek_view.xml b/app/src/main/res/layout/player_double_tap_seek_view.xml index e727211b84..014154bba4 100644 --- a/app/src/main/res/layout/player_double_tap_seek_view.xml +++ b/app/src/main/res/layout/player_double_tap_seek_view.xml @@ -49,4 +49,4 @@ android:textSize="12sp" tools:text="10 seconds" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/player_tracks_item.xml b/app/src/main/res/layout/player_tracks_item.xml index 99d1b06ab2..22860723ba 100644 --- a/app/src/main/res/layout/player_tracks_item.xml +++ b/app/src/main/res/layout/player_tracks_item.xml @@ -15,4 +15,4 @@ app:drawableEndCompat="@drawable/ic_blank_24dp" tools:drawableEndCompat="@drawable/ic_check_24dp" tools:text="1080p" - app:drawableTint="?attr/colorOnBackground" /> \ No newline at end of file + app:drawableTint="?attr/colorOnBackground" /> diff --git a/app/src/main/res/layout/pref_skip_intro_length.xml b/app/src/main/res/layout/pref_skip_intro_length.xml index f343e464df..37ae4e9d50 100644 --- a/app/src/main/res/layout/pref_skip_intro_length.xml +++ b/app/src/main/res/layout/pref_skip_intro_length.xml @@ -14,4 +14,4 @@ app:min="1" /> - \ No newline at end of file + diff --git a/app/src/main/res/mipmap/ic_launcher.xml b/app/src/main/res/mipmap/ic_launcher.xml index dcbbdf1218..4f4ecc0d2e 100644 --- a/app/src/main/res/mipmap/ic_launcher.xml +++ b/app/src/main/res/mipmap/ic_launcher.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/mipmap/ic_launcher_round.xml b/app/src/main/res/mipmap/ic_launcher_round.xml index dcbbdf1218..4f4ecc0d2e 100644 --- a/app/src/main/res/mipmap/ic_launcher_round.xml +++ b/app/src/main/res/mipmap/ic_launcher_round.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/raw/keep.xml b/app/src/main/res/raw/keep.xml index 7ac6a4c411..c6821b0d20 100644 --- a/app/src/main/res/raw/keep.xml +++ b/app/src/main/res/raw/keep.xml @@ -1,3 +1,3 @@ \ No newline at end of file + tools:keep="@layout/md_*" /> diff --git a/app/src/main/res/values-night/colors_cottoncandy.xml b/app/src/main/res/values-night/colors_cottoncandy.xml index e22affcda7..289f398945 100644 --- a/app/src/main/res/values-night/colors_cottoncandy.xml +++ b/app/src/main/res/values-night/colors_cottoncandy.xml @@ -24,4 +24,3 @@ #9A4058 @color/cottoncandy_primary - diff --git a/app/src/main/res/values/colors_cottoncandy.xml b/app/src/main/res/values/colors_cottoncandy.xml index fc504bb8f2..69fb11c171 100644 --- a/app/src/main/res/values/colors_cottoncandy.xml +++ b/app/src/main/res/values/colors_cottoncandy.xml @@ -23,6 +23,5 @@ #FAEEEF #352F30 #FFB1C1 - @color/cottoncandy_primary + @color/cottoncandy_primary - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 1957ed3863..a7276a72c2 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -608,7 +608,7 @@ @color/nord_surfaceContainerLow @color/nord_surfaceContainerLowest - +