From 3705880a77f972bc3bcaa4e1059b3d4bf9f3baa0 Mon Sep 17 00:00:00 2001 From: "Tran M. Cuong" Date: Fri, 23 Aug 2024 08:24:50 +0700 Subject: [PATCH] Implement Mihon's spotless PR (#1257) * Remove detekt (mihonapp/mihon#1130) Annoying. More annoying in this project. (cherry picked from commit 777ae2461e1eb277a3aa0c998ff69e4f100387a1) * Add spotless (with ktlint) (mihonapp/mihon#1136) (cherry picked from commit 5ae8095ef1ed2ae9f98486f9148e933c77a28692) * Address spotless lint errors (mihonapp/mihon#1138) * Add spotless (with ktlint) * Run spotlessApply * screaming case screaming case screaming case * Update PagerViewerAdapter.kt * Update ReaderTransitionView.kt (cherry picked from commit d6252ab7703d52ecf9f43de3ee36fd63e665a31f) * Generate locales_config.xml in build dir (cherry picked from commit ac41bffdc97b4cfed923de6b9e8e01cccf3eb6eb) * Address more spotless lint errors in SY * some more missed * more missed * still missing, not sure while it won't report error when running locally * one more * more * more * correct comment --------- Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --- .github/workflows/build_check.yml | 2 +- .github/workflows/build_push.yml | 2 +- CONTRIBUTING.md | 4 - app/build.gradle.kts | 9 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 2 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 2 +- .../source/interactor/GetEnabledSources.kt | 9 +- .../eu/kanade/domain/sync/SyncPreferences.kt | 2 +- .../java/eu/kanade/domain/ui/UiPreferences.kt | 12 +- .../browse/ExtensionDetailsScreen.kt | 6 +- .../presentation/browse/ExtensionsScreen.kt | 8 +- .../presentation/browse/SourcesScreen.kt | 4 +- .../presentation/components/TabbedDialog.kt | 2 +- .../library/LibrarySettingsDialog.kt | 1 - .../library/components/CommonMangaItem.kt | 10 +- .../kanade/presentation/manga/MangaScreen.kt | 4 +- .../manga/components/ChapterHeader.kt | 4 +- .../manga/components/MangaChapterListItem.kt | 17 +- .../manga/components/MangaInfoHeader.kt | 3 +- .../manga/components/PagePreviews.kt | 10 +- .../presentation/more/NewUpdateScreen.kt | 2 +- .../settings/screen/SettingsAdvancedScreen.kt | 3 +- .../screen/SettingsAppearanceScreen.kt | 14 +- .../settings/screen/SettingsBrowseScreen.kt | 2 +- .../screen/about/OpenSourceLicensesScreen.kt | 2 +- .../screen/data/CreateBackupScreen.kt | 1 - .../screen/debug/BackupSchemaScreen.kt | 6 +- .../settings/screen/debug/DebugInfoScreen.kt | 4 +- .../settings/screen/debug/WorkerInfoScreen.kt | 8 +- .../settings/widget/TriStateListDialog.kt | 4 +- .../more/stats/components/StatsItem.kt | 4 +- .../presentation/reader/ChapterTransition.kt | 6 +- .../presentation/reader/appbars/ExhUtils.kt | 12 +- .../presentation/track/TrackInfoDialogHome.kt | 14 +- .../presentation/updates/UpdatesUiItem.kt | 12 +- .../eu/kanade/presentation/util/Navigator.kt | 2 - app/src/main/java/eu/kanade/tachiyomi/App.kt | 9 +- .../data/backup/create/BackupCreator.kt | 4 +- .../data/backup/create/BackupOptions.kt | 3 +- .../creators/SavedSearchBackupCreator.kt | 2 +- .../tachiyomi/data/backup/models/Backup.kt | 1 - .../data/backup/models/BackupChapter.kt | 1 - .../backup/models/BackupExtensionRepos.kt | 1 - .../data/backup/models/BackupManga.kt | 6 +- .../models/BackupMergedMangaReference.kt | 3 +- .../data/backup/models/BackupTracking.kt | 15 +- .../data/backup/restore/BackupRestorer.kt | 2 +- .../data/backup/restore/RestoreOptions.kt | 10 +- .../restorers/ExtensionRepoRestorer.kt | 4 +- .../tachiyomi/data/cache/ChapterCache.kt | 4 +- .../tachiyomi/data/coil/MangaCoverFetcher.kt | 3 +- .../tachiyomi/data/coil/PagePreviewFetcher.kt | 4 +- .../tachiyomi/data/database/models/Chapter.kt | 2 + .../data/database/models/ChapterImpl.kt | 2 + .../tachiyomi/data/database/models/Track.kt | 2 + .../data/database/models/TrackImpl.kt | 2 + .../data/download/DownloadProvider.kt | 3 +- .../tachiyomi/data/download/Downloader.kt | 15 +- .../data/library/LibraryUpdateJob.kt | 21 +- .../kanade/tachiyomi/data/sync/SyncManager.kt | 2 +- .../sync/service/GoogleDriveSyncService.kt | 13 +- .../data/sync/service/SyncService.kt | 84 +- .../data/sync/service/SyncYomiSyncService.kt | 6 +- .../data/track/anilist/AnilistApi.kt | 38 +- .../data/track/bangumi/BangumiApi.kt | 46 +- .../tachiyomi/data/track/kitsu/KitsuApi.kt | 60 +- .../data/track/kitsu/KitsuDateHelper.kt | 4 +- .../tachiyomi/data/track/model/TrackSearch.kt | 2 + .../data/track/shikimori/ShikimoriApi.kt | 52 +- .../tachiyomi/extension/ExtensionManager.kt | 51 +- .../tachiyomi/extension/api/ExtensionApi.kt | 2 + .../tachiyomi/extension/model/InstallStep.kt | 8 +- .../extension/util/ExtensionLoader.kt | 1 - .../tachiyomi/source/online/all/EHentai.kt | 13 +- .../source/online/all/MergedSource.kt | 13 +- .../base/delegate/SecureActivityDelegate.kt | 35 +- .../browse/extension/ExtensionsScreenModel.kt | 23 +- .../advanced/process/MigrationListScreen.kt | 6 +- .../process/MigrationListScreenModel.kt | 15 +- .../ui/browse/source/SourcesScreenModel.kt | 5 +- .../biometric/BiometricTimesScreen.kt | 10 +- .../eu/kanade/tachiyomi/ui/home/HomeScreen.kt | 13 +- .../ui/library/LibraryScreenModel.kt | 108 +- .../ui/library/LibrarySettingsScreenModel.kt | 2 +- .../tachiyomi/ui/manga/EditMangaDialog.kt | 4 +- .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 8 +- .../tachiyomi/ui/manga/MangaScreenModel.kt | 52 +- .../manga/merged/EditMergedSettingsDialog.kt | 3 +- .../merged/EditMergedSettingsHeaderAdapter.kt | 3 +- .../eu/kanade/tachiyomi/ui/more/MoreTab.kt | 6 +- .../tachiyomi/ui/reader/ReaderActivity.kt | 42 +- .../tachiyomi/ui/reader/ReaderViewModel.kt | 11 +- .../ui/reader/loader/ChapterLoader.kt | 6 +- .../ui/reader/setting/ReaderPreferences.kt | 4 +- .../ui/reader/viewer/ReaderPageImageView.kt | 11 +- .../ui/reader/viewer/ReaderTransitionView.kt | 19 +- .../ui/reader/viewer/pager/PagerConfig.kt | 3 +- .../ui/reader/viewer/pager/PagerPageHolder.kt | 16 +- .../ui/reader/viewer/pager/PagerViewer.kt | 4 +- .../reader/viewer/pager/PagerViewerAdapter.kt | 23 +- .../ui/reader/viewer/webtoon/WebtoonConfig.kt | 2 +- .../viewer/webtoon/WebtoonPageHolder.kt | 4 +- .../viewer/webtoon/WebtoonRecyclerView.kt | 6 +- .../ui/reader/viewer/webtoon/WebtoonViewer.kt | 4 +- .../util/system/ChildFirstPathClassLoader.kt | 2 +- .../util/system/NotificationExtensions.kt | 10 +- app/src/main/java/exh/GalleryAdder.kt | 24 +- app/src/main/java/exh/assets/__EhAssets.kt | 1 + .../main/java/exh/assets/ehassets/EhLogo.kt | 1 + .../java/exh/assets/ehassets/MangadexLogo.kt | 1 + .../main/java/exh/assets/ehassets/__Exh.kt | 1 + .../java/exh/assets/ehassets/exh/__Assets.kt | 1 + .../assets/ehassets/exh/assets/__Ehassets.kt | 1 + .../main/java/exh/eh/EHentaiUpdateWorker.kt | 7 +- .../java/exh/favorites/FavoritesSyncHelper.kt | 12 +- .../exh/favorites/LocalFavoritesStorage.kt | 9 +- .../main/java/exh/log/EnhancedFilePrinter.kt | 9 +- .../exh/md/follows/MangaDexFollowsScreen.kt | 2 +- .../java/exh/md/handlers/ApiMangaParser.kt | 8 +- .../java/exh/md/handlers/NamicomiHandler.kt | 2 +- app/src/main/java/exh/md/utils/MdUtil.kt | 1 - .../exh/ui/metadata/MetadataViewScreen.kt | 9 +- .../adapters/EHentaiDescriptionAdapter.kt | 9 +- .../adapters/HBrowseDescriptionAdapter.kt | 3 +- .../adapters/MangaDexDescriptionAdapter.kt | 3 +- .../adapters/NHentaiDescriptionAdapter.kt | 2 +- .../adapters/PururinDescriptionAdapter.kt | 17 +- .../adapters/TsuminoDescriptionAdapter.kt | 7 +- app/src/main/java/exh/util/DataSaver.kt | 27 +- app/src/main/java/exh/util/ExceptionUtil.kt | 6 +- .../java/mihon/core/migration/MigrateUtils.kt | 1 - .../core/migration/MigrationJobFactory.kt | 11 +- .../mihon/core/migration/MigrationStrategy.kt | 4 +- .../java/mihon/core/migration/Migrator.kt | 2 +- .../migrations/MergedMangaRewriteMigration.kt | 1 - ...veEncryptionSettingsToAppStateMigration.kt | 2 +- .../upcoming/components/calendar/Calendar.kt | 12 +- .../components/calendar/CalendarDay.kt | 9 +- .../components/calendar/CalendarHeader.kt | 10 +- .../components/calendar/CalendarIndicator.kt | 8 +- .../ic_book_open_variant_24dp.xml | 2 +- .../ic_page_next_outline_24dp.xml | 2 +- app/src/main/res/drawable/ic_glasses_24dp.xml | 2 +- .../res/drawable/ic_progress_clock_24dp.xml | 2 +- app/src/main/res/drawable/ic_ungroup_24dp.xml | 2 +- .../drawable/material_popup_background.xml | 2 +- .../res/layout/description_adapter_8m.xml | 2 +- .../res/layout/description_adapter_eh.xml | 2 +- .../res/layout/description_adapter_hb.xml | 2 +- .../res/layout/description_adapter_md.xml | 2 +- .../res/layout/description_adapter_nh.xml | 2 +- .../res/layout/description_adapter_pu.xml | 2 +- .../res/layout/description_adapter_ts.xml | 2 +- .../layout/edit_merged_settings_dialog.xml | 2 +- .../main/res/layout/pre_migration_list.xml | 2 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 2 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 2 +- app/src/main/res/values/styles_sy.xml | 2 +- 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 +- buildSrc/build.gradle.kts | 2 +- ...hon.android.application.compose.gradle.kts | 2 + .../mihon.android.application.gradle.kts | 3 +- .../main/kotlin/mihon.benchmark.gradle.kts | 3 +- .../main/kotlin/mihon.code.detekt.gradle.kts | 59 - .../main/kotlin/mihon.code.lint.gradle.kts | 34 + .../kotlin/mihon.library.compose.gradle.kts | 3 +- .../src/main/kotlin/mihon.library.gradle.kts | 3 +- .../mihon/buildlogic/ProjectExtensions.kt | 3 + .../buildlogic/tasks/LocalesConfigPlugin.kt | 9 +- config/detekt/baseline.xml | 2215 ----------------- config/detekt/detekt.yml | 24 - core-metadata/src/main/AndroidManifest.xml | 2 +- core/common/src/main/AndroidManifest.xml | 2 +- .../eu/kanade/tachiyomi/network/Requests.kt | 2 + .../exh/util/StringBuilderExtensions.kt | 4 +- .../core/common/archive/ArchiveInputStream.kt | 2 +- .../mihon/core/common/archive/ZipWriter.kt | 2 +- .../core/common/util/system/ImageUtil.kt | 29 +- data/src/main/AndroidManifest.xml | 2 +- .../java/tachiyomi/data/QueryPagingSource.kt | 4 +- .../tachiyomi/data/chapter/ChapterMapper.kt | 2 +- .../java/tachiyomi/data/manga/MangaMapper.kt | 2 - .../data/manga/MangaRepositoryImpl.kt | 1 - domain/src/main/AndroidManifest.xml | 2 +- .../interactor/CreateExtensionRepo.kt | 1 - .../service/ExtensionRepoService.kt | 1 - .../interactor/GetMergedChaptersByMangaId.kt | 3 +- .../interactor/ShouldUpdateDbChapter.kt | 3 +- .../interactor/GetApplicationRelease.kt | 6 +- .../track/interactor/IsTrackUnfollowed.kt | 6 +- gradle/libs.versions.toml | 9 +- .../commonMain/moko-resources/ar/plurals.xml | 2 +- .../commonMain/moko-resources/ar/strings.xml | 2 +- .../commonMain/moko-resources/de/plurals.xml | 2 +- .../commonMain/moko-resources/de/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/in/plurals.xml | 2 +- .../commonMain/moko-resources/in/strings.xml | 2 +- .../moko-resources/pt-rBR/plurals.xml | 2 +- .../commonMain/moko-resources/ru/plurals.xml | 2 +- .../commonMain/moko-resources/ru/strings.xml | 2 +- .../moko-resources/zh-rCN/strings.xml | 2 +- .../moko-resources/zh-rTW/strings.xml | 2 +- i18n/.gitignore | 2 - i18n/build.gradle.kts | 13 +- i18n/src/androidMain/AndroidManifest.xml | 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 | 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 | 2 +- .../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 +- .../commonMain/moko-resources/ja/plurals.xml | 2 +- .../commonMain/moko-resources/ja/strings.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 +- .../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 +- .../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 | 2 +- .../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 +- .../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 +- .../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 +- .../commonMain/moko-resources/vi/plurals.xml | 2 +- .../commonMain/moko-resources/vi/strings.xml | 2 +- .../moko-resources/zh-rCN/plurals.xml | 2 +- .../moko-resources/zh-rCN/strings.xml | 2 +- .../moko-resources/zh-rTW/plurals.xml | 2 +- .../moko-resources/zh-rTW/strings.xml | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../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 | 8 +- .../presentation/core/icons/Discord.kt | 17 +- .../presentation/core/icons/Facebook.kt | 17 +- .../presentation/core/icons/Github.kt | 17 +- .../presentation/core/icons/Reddit.kt | 17 +- .../tachiyomi/presentation/core/icons/X.kt | 14 +- .../presentation/core/util/Modifier.kt | 4 +- .../res/values-night/colors_midnightdusk.xml | 2 +- .../res/values-night/colors_tidalwave.xml | 2 +- .../src/main/res/values/colors_tidalwave.xml | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../src/main/res/values/colors_appwidget.xml | 2 +- .../src/androidMain/AndroidManifest.xml | 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 + .../metadata/EHentaiSearchMetadata.kt | 4 +- .../src/androidMain/AndroidManifest.xml | 2 +- .../tachiyomi/source/local/LocalSource.kt | 17 +- .../source/local/image/LocalCoverManager.kt | 2 +- 363 files changed, 1223 insertions(+), 3138 deletions(-) delete mode 100644 buildSrc/src/main/kotlin/mihon.code.detekt.gradle.kts create mode 100644 buildSrc/src/main/kotlin/mihon.code.lint.gradle.kts delete mode 100644 config/detekt/baseline.xml delete mode 100644 config/detekt/detekt.yml diff --git a/.github/workflows/build_check.yml b/.github/workflows/build_check.yml index 6916b1621..220d01899 100644 --- a/.github/workflows/build_check.yml +++ b/.github/workflows/build_check.yml @@ -36,7 +36,7 @@ jobs: uses: gradle/actions/setup-gradle@v4 - name: Build app - run: ./gradlew detekt assembleDevDebug + run: ./gradlew spotlessCheck assembleDevDebug - name: Upload APK uses: actions/upload-artifact@v4 diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index d5798a112..2ad2e6df9 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -50,7 +50,7 @@ jobs: # SY --> - name: Build app and run unit tests - run: ./gradlew detekt assembleStandardRelease testStandardReleaseUnitTest --stacktrace + run: ./gradlew spotlessCheck assembleStandardRelease testStandardReleaseUnitTest --stacktrace - name: Sign APK uses: r0adkll/sign-android-release@v1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3623f82e5..291e4d5ee 100755 --- 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/tachiyomi) for online help and to ask questions while developing. diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 04c406dc8..0371a3d32 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -21,7 +21,7 @@ if (gradle.startParameter.taskRequests.toString().contains("Standard")) { // 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" @@ -38,7 +38,7 @@ android { buildConfigField("boolean", "INCLUDE_UPDATER", "false") ndk { - abiFilters += SUPPORTED_ABIS + abiFilters += supportedAbis } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -47,7 +47,7 @@ android { abi { isEnable = true reset() - include(*SUPPORTED_ABIS.toTypedArray()) + include(*supportedAbis.toTypedArray()) isUniversalApk = true } } @@ -162,7 +162,7 @@ dependencies { implementation(compose.ui.tooling.preview) implementation(compose.ui.util) implementation(compose.accompanist.systemuicontroller) - + implementation(androidx.interpolator) implementation(androidx.paging.runtime) @@ -243,7 +243,6 @@ dependencies { implementation(libs.compose.webview) implementation(libs.compose.grid) - // Logging implementation(libs.logcat) diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml index 385506ee8..1f23d2a10 100644 --- a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml index 385506ee8..1f23d2a10 100644 --- a/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt index 28b6173b5..5d02514c1 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt @@ -32,10 +32,11 @@ class GetEnabledSources( ) { a, b, c -> Triple(a, b, c) }, // SY <-- repository.getSources(), - ) { pinnedSourceIds, - (enabledLanguages, disabledSources, lastUsedSource), - (excludedFromDataSaver, sourcesInCategories, sourceCategoriesFilter), - sources, + ) { + pinnedSourceIds, + (enabledLanguages, disabledSources, lastUsedSource), + (excludedFromDataSaver, sourcesInCategories, sourceCategoriesFilter), + sources, -> val sourcesAndCategories = sourcesInCategories.map { diff --git a/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt b/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt index 7795147d6..95d218150 100644 --- a/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt +++ b/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt @@ -13,7 +13,7 @@ class SyncPreferences( fun clientAPIKey() = preferenceStore.getString("sync_client_api_key", "") fun lastSyncTimestamp() = preferenceStore.getLong(Preference.appStateKey("last_sync_timestamp"), 0L) - fun lastSyncEtag() = preferenceStore.getString("sync_etag", "") + fun lastSyncEtag() = preferenceStore.getString("sync_etag", "") fun syncInterval() = preferenceStore.getInt("sync_interval", 0) fun syncService() = preferenceStore.getInt("sync_service", 0) 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 3c732f649..3fd115c7c 100644 --- a/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt +++ b/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt @@ -18,12 +18,20 @@ class UiPreferences( fun themeMode() = preferenceStore.getEnum( "pref_theme_mode_key", - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { ThemeMode.SYSTEM } else { ThemeMode.LIGHT }, + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + ThemeMode.SYSTEM + } else { + ThemeMode.LIGHT + }, ) 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/ExtensionDetailsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt index a246146d9..c9b0377d9 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt @@ -240,7 +240,7 @@ private fun DetailsHeader( Extension name: ${extension.name} (lang: ${extension.lang}; package: ${extension.pkgName}) Extension version: ${extension.versionName} (lib: ${extension.libVersion}; version code: ${extension.versionCode}) NSFW: ${extension.isNsfw} - """.trimIndent() + """.trimIndent(), ) if (extension is Extension.Installed) { @@ -250,8 +250,8 @@ private fun DetailsHeader( Update available: ${extension.hasUpdate} Obsolete: ${extension.isObsolete} Shared: ${extension.isShared} - Repository: ${extension.repoUrl} - """.trimIndent() + Repository: ${extension.repoUrl} + """.trimIndent(), ) } } diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt index f1619177e..e8b1e8edb 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt @@ -219,7 +219,9 @@ private fun ExtensionContent( when (it) { is Extension.Available -> onInstallExtension(it) is Extension.Installed -> onOpenExtension(it) - is Extension.Untrusted -> { trustState = it } + is Extension.Untrusted -> { + trustState = it + } } }, onLongClickItem = onLongClickItem, @@ -241,7 +243,9 @@ private fun ExtensionContent( onOpenExtension(it) } } - is Extension.Untrusted -> { trustState = it } + is Extension.Untrusted -> { + trustState = it + } } }, ) diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt index d4de0b9fe..fada38614 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt @@ -35,7 +35,7 @@ import tachiyomi.i18n.MR import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.LabeledCheckbox 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 @@ -179,7 +179,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/components/TabbedDialog.kt b/app/src/main/java/eu/kanade/presentation/components/TabbedDialog.kt index b651060f7..69b58c616 100644 --- a/app/src/main/java/eu/kanade/presentation/components/TabbedDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/components/TabbedDialog.kt @@ -79,7 +79,7 @@ fun TabbedDialog( modifier = Modifier.animateContentSize(), state = pagerState, verticalAlignment = Alignment.Top, - pageContent = { page -> content(page) } + pageContent = { page -> content(page) }, ) } } diff --git a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt index df755d550..600450c41 100644 --- a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt @@ -207,7 +207,6 @@ private fun ColumnScope.SortPage( }.collectAsState(initial = screenModel.libraryPreferences.sortTagsForLibrary().get().isNotEmpty()) // SY <-- - val trackerSortOption = if (trackers.isEmpty()) { emptyList() } else { diff --git a/app/src/main/java/eu/kanade/presentation/library/components/CommonMangaItem.kt b/app/src/main/java/eu/kanade/presentation/library/components/CommonMangaItem.kt index b4a4c2cc0..a78462a75 100644 --- a/app/src/main/java/eu/kanade/presentation/library/components/CommonMangaItem.kt +++ b/app/src/main/java/eu/kanade/presentation/library/components/CommonMangaItem.kt @@ -62,7 +62,7 @@ private val ContinueReadingButtonIconSizeLarge = 20.dp private val ContinueReadingButtonGridPadding = 6.dp private val ContinueReadingButtonListSpacing = 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 MangaCompactGridItem( MangaCover.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 MangaComfortableGridItem( MangaCover.Book( modifier = Modifier .fillMaxWidth() - .alpha(if (isSelected) GridSelectedCoverAlpha else coverAlpha), + .alpha(if (isSelected) GRID_SELECTED_COVER_ALPHA else coverAlpha), data = coverData, ) }, @@ -371,7 +371,7 @@ fun MangaListItem( size = ContinueReadingButtonSizeSmall, iconSize = ContinueReadingButtonIconSizeSmall, onClick = onClickContinueReading, - modifier = Modifier.padding(start = ContinueReadingButtonListSpacing) + modifier = Modifier.padding(start = ContinueReadingButtonListSpacing), ) } } @@ -392,7 +392,7 @@ private fun ContinueReadingButton( 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/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt index 0f1cc335b..f295754f0 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt @@ -995,7 +995,9 @@ private fun LazyListScope.sharedChapterItems( // SY <-- }, readProgress = item.chapter.lastPageRead - .takeIf { /* SY --> */(!item.chapter.read || alwaysShowReadingProgress)/* SY <-- */ && it > 0L } + .takeIf { + /* SY --> */(!item.chapter.read || alwaysShowReadingProgress)/* SY <-- */ && it > 0L + } ?.let { stringResource( MR.strings.chapter_progress, diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/ChapterHeader.kt b/app/src/main/java/eu/kanade/presentation/manga/components/ChapterHeader.kt index 99ad1b37a..6067d24bd 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/ChapterHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/ChapterHeader.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 @@ -60,6 +60,6 @@ private fun MissingChaptersWarning(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/manga/components/MangaChapterListItem.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaChapterListItem.kt index 46bb4b873..55e61e529 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaChapterListItem.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaChapterListItem.kt @@ -40,8 +40,8 @@ import eu.kanade.tachiyomi.data.download.model.Download 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 @@ -135,7 +135,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), ) } @@ -143,7 +143,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) { @@ -152,14 +152,19 @@ fun MangaChapterListItem( maxLines = 1, overflow = TextOverflow.Ellipsis, ) - if (readProgress != null || scanlator != null/* SY --> */ || sourceName != null/* SY <-- */) DotSeparatorText() + if (readProgress != null || + scanlator != null/* SY --> */ || + sourceName != null/* SY <-- */ + ) { + DotSeparatorText() + } } if (readProgress != null) { Text( text = readProgress, maxLines = 1, overflow = TextOverflow.Ellipsis, - color = LocalContentColor.current.copy(alpha = ReadItemAlpha), + color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), ) if (scanlator != null/* SY --> */ || sourceName != null/* SY <-- */) DotSeparatorText() } diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt index 7a5b1c13d..fba1f9ca1 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt @@ -82,6 +82,7 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.i18n.sy.SYMR +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 @@ -181,7 +182,7 @@ fun MangaActionRow( // SY <-- 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/manga/components/PagePreviews.kt b/app/src/main/java/eu/kanade/presentation/manga/components/PagePreviews.kt index 41c6a8528..d715c5e3e 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/PagePreviews.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/PagePreviews.kt @@ -44,7 +44,7 @@ import tachiyomi.presentation.core.i18n.stringResource @Composable private fun PagePreviewLoading( - setMaxWidth: (Dp) -> Unit + setMaxWidth: (Dp) -> Unit, ) { val density = LocalDensity.current Box( @@ -63,7 +63,7 @@ private fun PagePreviewLoading( @Composable private fun PagePreviewRow( onOpenPage: (Int) -> Unit, - items: ImmutableList + items: ImmutableList, ) { Row( modifier = Modifier @@ -88,7 +88,7 @@ private fun PagePreviewMore( ) { Box( modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.Center + contentAlignment = Alignment.Center, ) { TextButton(onClick = onMorePreviewsClicked) { Text(stringResource(SYMR.strings.more_previews)) @@ -116,7 +116,7 @@ fun PagePreviews( pagePreviewState.pagePreviews.take(rowCount * itemPerRowCount).chunked(itemPerRowCount).forEach { PagePreviewRow( onOpenPage = onOpenPage, - items = remember(it) { it.toImmutableList() } + items = remember(it) { it.toImmutableList() }, ) } @@ -153,7 +153,7 @@ fun LazyListScope.PagePreviewItems( ) { PagePreviewRow( onOpenPage = onOpenPage, - items = remember(it) { it.toImmutableList() } + items = remember(it) { it.toImmutableList() }, ) } item( 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 3d561b0c3..87dd1ee4d 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 8fb07006f..a934fd36b 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 @@ -3,7 +3,6 @@ package eu.kanade.presentation.more.settings.screen import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Intent -import android.os.Build import android.provider.Settings import android.webkit.WebStorage import android.webkit.WebView @@ -376,7 +375,7 @@ object SettingsAdvancedScreen : SearchableSettings { chooseColorProfile.launch(arrayOf("*/*")) }, ), - ) + ), ) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt index 36e03eef5..c8366f106 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt @@ -180,11 +180,15 @@ object SettingsAppearanceScreen : SearchableSettings { Preference.PreferenceItem.SliderPreference( value = previewsRowCount, title = stringResource(SYMR.strings.pref_previews_row_count), - subtitle = if (previewsRowCount > 0) pluralStringResource( - SYMR.plurals.row_count, - previewsRowCount, - previewsRowCount, - ) else stringResource(MR.strings.disabled), + subtitle = if (previewsRowCount > 0) { + pluralStringResource( + SYMR.plurals.row_count, + previewsRowCount, + previewsRowCount, + ) + } else { + stringResource(MR.strings.disabled) + }, min = 0, max = 10, onValueChanged = { diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt index a27810c1a..40d23eb20 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt @@ -94,7 +94,7 @@ object SettingsBrowseScreen : SearchableSettings { pref = uiPreferences.feedTabInFront(), title = stringResource(SYMR.strings.pref_feed_position), subtitle = stringResource(SYMR.strings.pref_feed_position_summery), - enabled = hideFeedTab.not() + enabled = hideFeedTab.not(), ), ), ), 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 3c2309b32..6e92d0cfc 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 @@ -37,7 +37,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/data/CreateBackupScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt index a9446017f..fdadafb43 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 @@ -26,7 +26,6 @@ import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.update import tachiyomi.i18n.MR -import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LazyColumnWithAction import tachiyomi.presentation.core.components.SectionCard 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 d5652b16a..8fe1d18c1 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 @@ -41,7 +41,7 @@ class BackupSchemaScreen : Screen() { Scaffold( topBar = { AppBar( - title = title, + title = TITLE, navigateUp = navigator::pop, actions = { AppBarActions( @@ -50,7 +50,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 0db4bd3c7..d44ee1319 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 4a57103d8..88f1e6da2 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( @@ -74,7 +74,7 @@ class WorkerInfoScreen : Screen() { title = stringResource(MR.strings.action_copy_to_clipboard), icon = Icons.Default.ContentCopy, onClick = { - context.copyToClipboard(title, enqueued + finished + running) + context.copyToClipboard(TITLE, enqueued + finished + running) }, ), ), @@ -159,7 +159,7 @@ class WorkerInfoScreen : Screen() { Injekt.get().dateFormat().get(), ), ) - appendLine("Next scheduled run: $timestamp",) + appendLine("Next scheduled run: $timestamp") appendLine("Attempt #${workInfo.runAttemptCount + 1}") } appendLine() 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 f6e195e4d..1e0c1741d 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 @@ -34,7 +34,9 @@ import tachiyomi.presentation.core.util.isScrolledToEnd import tachiyomi.presentation.core.util.isScrolledToStart private enum class State { - CHECKED, INVERSED, UNCHECKED + CHECKED, + INVERSED, + UNCHECKED, } @Composable 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 8002b3d04..d38643ee1 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 5fb749828..f76628b1a 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt @@ -226,7 +226,7 @@ private fun ChapterText( Text( text = buildAnnotatedString { if (downloaded) { - appendInlineContent(DownloadedIconContentId) + appendInlineContent(DOWNLOADED_ICON_ID) append(' ') } append(name) @@ -236,7 +236,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, @@ -273,7 +273,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/reader/appbars/ExhUtils.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/ExhUtils.kt index ed99b28d9..8452ca7e3 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/appbars/ExhUtils.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/ExhUtils.kt @@ -63,7 +63,7 @@ fun ExhUtils( modifier .fillMaxWidth() .background(backgroundColor), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { AnimatedVisibility(visible = isVisible) { Column { @@ -84,7 +84,7 @@ fun ExhUtils( ) { Column( Modifier.weight(3f), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Text( text = stringResource(SYMR.strings.eh_autoscroll), @@ -93,17 +93,17 @@ fun ExhUtils( fontFamily = FontFamily.SansSerif, style = MaterialTheme.typography.labelLarge, modifier = Modifier.fillMaxWidth(0.75f), - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) } Column( Modifier.weight(1f), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Switch( checked = isAutoScroll, onCheckedChange = null, - enabled = isAutoScrollEnabled + enabled = isAutoScrollEnabled, ) } } @@ -114,7 +114,7 @@ fun ExhUtils( ) { Column( Modifier.weight(3f), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { var autoScrollFrequencyState by remember { mutableStateOf(autoScrollFrequency) diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt index 4e146c60e..3d766c4cf 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt @@ -38,7 +38,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue 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.TextAlign @@ -58,8 +57,6 @@ import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import java.time.format.DateTimeFormatter -private const val UnsetStatusTextAlpha = 0.5F - @Composable fun TrackInfoDialogHome( trackItems: List, @@ -211,10 +208,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, ) } @@ -243,6 +239,8 @@ private fun TrackInfoItem( } } +private const val UNSET_TEXT_ALPHA = 0.5F + @Composable private fun TrackDetailsItem( text: String?, @@ -263,7 +261,7 @@ private 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/UpdatesUiItem.kt b/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt index 3b4b3f554..2cd1aabdf 100644 --- a/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt +++ b/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt @@ -43,7 +43,7 @@ import eu.kanade.tachiyomi.ui.updates.UpdatesItem import tachiyomi.domain.updates.model.UpdatesWithRelations 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 @@ -107,8 +107,10 @@ internal fun LazyListScope.updatesUiItems( readProgress = updatesItem.update.lastPageRead .takeIf { /* SY --> */( - !updatesItem.update.read || (preserveReadingPosition && updatesItem.isEhBasedUpdate()) - )/* SY <-- */ && it > 0L + !updatesItem.update.read || + (preserveReadingPosition && updatesItem.isEhBasedUpdate()) + )/* SY <-- */ && + it > 0L } ?.let { stringResource( @@ -152,7 +154,7 @@ private fun UpdatesUiItem( 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 @@ -226,7 +228,7 @@ private fun UpdatesUiItem( 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 c243807df..34664c774 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 @@ -28,7 +27,6 @@ import soup.compose.material.motion.animation.rememberSlideDistance /** * For invoking back press to the parent activity */ -@SuppressLint("ComposeCompositionLocalUsage") val LocalBackPress: ProvidableCompositionLocal<(() -> Unit)?> = staticCompositionLocalOf { null } interface Tab : cafe.adriel.voyager.navigator.tab.Tab { diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 78dedeb05..6c96f2cd1 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -174,8 +174,7 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor val syncPreferences: SyncPreferences = Injekt.get() val syncTriggerOpt = syncPreferences.getSyncTriggerOptions() - if (syncPreferences.isSyncEnabled() && syncTriggerOpt.syncOnAppStart - ) { + if (syncPreferences.isSyncEnabled() && syncTriggerOpt.syncOnAppStart) { SyncDataJob.startNow(this@App) } @@ -199,7 +198,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 } @@ -239,8 +237,7 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor val syncPreferences: SyncPreferences = Injekt.get() val syncTriggerOpt = syncPreferences.getSyncTriggerOptions() - if (syncPreferences.isSyncEnabled() && syncTriggerOpt.syncOnAppResume - ) { + if (syncPreferences.isSyncEnabled() && syncTriggerOpt.syncOnAppResume) { SyncDataJob.startNow(this@App) } } @@ -339,7 +336,7 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor """ App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE}) Preview build: $syDebugVersion - Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) + Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) Android build ID: ${Build.DISPLAY} Device brand: ${Build.BRAND} Device manufacturer: ${Build.MANUFACTURER} 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 3677c806f..ca9eabe1b 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 @@ -57,7 +57,7 @@ class BackupCreator( // SY --> private val savedSearchBackupCreator: SavedSearchBackupCreator = SavedSearchBackupCreator(), private val getMergedManga: GetMergedManga = Injekt.get(), - private val handler: DatabaseHandler = Injekt.get() + private val handler: DatabaseHandler = Injekt.get(), // SY <-- ) { @@ -92,7 +92,7 @@ class BackupCreator( } else { emptyList() } + getMergedManga.await(), // SY <-- - options + options, ) val backup = Backup( backupManga = backupManga, 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 45a4c14b7..4915048e5 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 @@ -39,7 +39,8 @@ data class BackupOptions( // SY <-- ) - fun canCreate() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings || savedSearches + fun canCreate() = + libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings || savedSearches companion object { val libraryOptions = persistentListOf( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SavedSearchBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SavedSearchBackupCreator.kt index 293a864e0..1b4ef6de9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SavedSearchBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/SavedSearchBackupCreator.kt @@ -7,7 +7,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class SavedSearchBackupCreator( - private val handler: DatabaseHandler = Injekt.get() + private val handler: DatabaseHandler = Injekt.get(), ) { suspend operator fun invoke(): List { 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 0de472370..9998cb015 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, 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 d729efe16..b0d081a40 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.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 fa9968667..256def7b5 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 a62bc942e..d81b2fd33 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 @@ -3,13 +3,9 @@ package eu.kanade.tachiyomi.data.backup.models import eu.kanade.tachiyomi.source.model.UpdateStrategy import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber -import tachiyomi.domain.manga.model.CustomMangaInfo import tachiyomi.domain.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/backup/models/BackupMergedMangaReference.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupMergedMangaReference.kt index 4431570f2..e4b1fd0e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupMergedMangaReference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupMergedMangaReference.kt @@ -36,7 +36,8 @@ data class BackupMergedMangaReference( } val backupMergedMangaReferenceMapper = - { _: Long, + { + _: Long, isInfoManga: Boolean, getChapterUpdates: Boolean, chapterSortMode: Long, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt index 0a05c0edf..910a8adac 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt @@ -53,7 +53,20 @@ data class BackupTracking( } val backupTrackMapper = { - _: Long, _: Long, syncId: Long, mediaId: Long, libraryId: Long?, title: String, lastChapterRead: Double, totalChapters: Long, status: Long, score: Double, remoteUrl: String, startDate: Long, finishDate: Long -> + _: Long, + _: Long, + syncId: Long, + mediaId: Long, + libraryId: Long?, + title: String, + lastChapterRead: Double, + totalChapters: Long, + status: Long, + score: Double, + remoteUrl: String, + startDate: Long, + finishDate: Long, + -> BackupTracking( syncId = syncId.toInt(), mediaId = mediaId, 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 77e57f554..891c3b8ef 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 @@ -200,7 +200,7 @@ class BackupRestorer( } private fun CoroutineScope.restoreExtensionRepos( - backupExtensionRepo: List + backupExtensionRepo: List, ) = launch { backupExtensionRepo .forEach { 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 533b939eb..5e8e97b1f 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 @@ -27,7 +27,13 @@ data class RestoreOptions( // SY <-- ) - fun canRestore() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings /* SY --> */ || savedSearches /* SY <-- */ + fun canRestore() = + libraryEntries || + categories || + appSettings || + extensionRepoSettings || + sourceSettings /* SY --> */ || + savedSearches /* SY <-- */ companion object { val options = persistentListOf( @@ -72,7 +78,7 @@ data class RestoreOptions( extensionRepoSettings = array[3], sourceSettings = array[4], // SY --> - savedSearches = array[5] + savedSearches = array[5], // SY <-- ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt index 1dd0da491..006e48df1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt @@ -8,7 +8,7 @@ import uy.kohesive.injekt.api.get class ExtensionRepoRestorer( private val handler: DatabaseHandler = Injekt.get(), - private val getExtensionRepos: GetExtensionRepo = Injekt.get() + private val getExtensionRepos: GetExtensionRepo = Injekt.get(), ) { suspend operator fun invoke( @@ -32,7 +32,7 @@ class ExtensionRepoRestorer( backupRepo.name, backupRepo.shortName, backupRepo.website, - backupRepo.signingKeyFingerprint + backupRepo.signingKeyFingerprint, ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt index 8506170a9..ad6252472 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt @@ -36,8 +36,8 @@ class ChapterCache( private val context: Context, private val json: Json, // SY --> - readerPreferences: ReaderPreferences - //S Y <-- + readerPreferences: ReaderPreferences, + // SY <-- ) { // --> EH 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 65a142099..8ccd6d4ba 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, @@ -86,7 +85,7 @@ class MangaCoverFetcher( source = ImageSource( file = file.toOkioPath(), fileSystem = FileSystem.SYSTEM, - diskCacheKey = diskCacheKey + diskCacheKey = diskCacheKey, ), mimeType = "image/*", dataSource = DataSource.DISK, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/PagePreviewFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/PagePreviewFetcher.kt index 849198504..aa17b84a9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/PagePreviewFetcher.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/PagePreviewFetcher.kt @@ -58,7 +58,7 @@ class PagePreviewFetcher( source = ImageSource( file = file.toOkioPath(), fileSystem = FileSystem.SYSTEM, - diskCacheKey = diskCacheKey + diskCacheKey = diskCacheKey, ), mimeType = "image/*", dataSource = DataSource.DISK, @@ -230,7 +230,7 @@ class PagePreviewFetcher( file = data, fileSystem = FileSystem.SYSTEM, diskCacheKey = diskCacheKey, - closeable = this + closeable = this, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt index f91368084..799998f20 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Chapter.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models import eu.kanade.tachiyomi.source.model.SChapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/ChapterImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/ChapterImpl.kt index a92dd56df..7db913c99 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/ChapterImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/ChapterImpl.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models class ChapterImpl : Chapter { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt index aac7ec4c3..15c12c4a0 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/Track.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models import java.io.Serializable diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt index 85868219f..da5aa2856 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/models/TrackImpl.kt @@ -1,3 +1,5 @@ +@file:Suppress("PropertyName", "ktlint:standard:property-naming") + package eu.kanade.tachiyomi.data.database.models class TrackImpl : Track { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt index cdd0559ae..d2179ef49 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -121,7 +121,8 @@ class DownloadProvider( getValidChapterDirNames(chp.name, chp.scanlator).any { dir -> mangaDir.findFile(dir) != null } - } == null || it.name?.endsWith(Downloader.TMP_DIR_SUFFIX) == true + } == null || + it.name?.endsWith(Downloader.TMP_DIR_SUFFIX) == true } } // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt index 08e0baa15..4359d2905 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -190,7 +190,7 @@ class Downloader( fun clearQueue() { cancelDownloaderJob() - _clearQueue() + internalClearQueue() notifier.dismissProgress() } @@ -204,9 +204,12 @@ class Downloader( val activeDownloadsFlow = queueState.transformLatest { queue -> while (true) { val activeDownloads = queue.asSequence() - .filter { it.status.value <= Download.State.DOWNLOADING.value } // Ignore completed downloads, leave them in the queue + // Ignore completed downloads, leave them in the queue + .filter { it.status.value <= Download.State.DOWNLOADING.value } .groupBy { it.source } - .toList().take(5) // Concurrently download from 5 different sources + .toList() + // Concurrently download from 5 different sources + .take(5) .map { (_, downloads) -> downloads.first() } emit(activeDownloads) @@ -650,7 +653,7 @@ class Downloader( chapter, urls, categories, - source.name + source.name, ) // Remove the old file @@ -710,7 +713,7 @@ class Downloader( removeFromQueueIf { it.manga.id == manga.id } } - private fun _clearQueue() { + private fun internalClearQueue() { _queueState.update { it.forEach { download -> if (download.status == Download.State.DOWNLOADING || download.status == Download.State.QUEUE) { @@ -732,7 +735,7 @@ class Downloader( } pause() - _clearQueue() + internalClearQueue() addAllToQueue(downloads) if (wasRunning) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt index 2940a0c97..7c179733d 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt @@ -363,14 +363,17 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet async { semaphore.withPermit { if ( - mdlistLogged && mangaInSource.firstOrNull() + mdlistLogged && + mangaInSource.firstOrNull() ?.let { it.manga.source in mangaDexSourceIds } == true ) { launch { mangaInSource.forEach { (manga) -> try { val tracks = getTracks.await(manga.id) - if (tracks.isEmpty() || tracks.none { it.trackerId == TrackerManager.MDLIST }) { + if (tracks.isEmpty() || + tracks.none { it.trackerId == TrackerManager.MDLIST } + ) { val track = mdList.createInitialTracker(manga) insertTrack.await(mdList.refresh(track).toDomainTrack(false)!!) } @@ -400,10 +403,14 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet // SY --> .sortedByDescending { it.sourceOrder }.run { if (libraryPreferences.libraryReadDuplicateChapters().get()) { - val readChapters = getChaptersByMangaId.await(manga.id).filter { it.read } + val readChapters = getChaptersByMangaId.await(manga.id).filter { + it.read + } val newReadChapters = this.filter { chapter -> chapter.chapterNumber > 0 && - readChapters.any { it.chapterNumber == chapter.chapterNumber } + readChapters.any { + it.chapterNumber == chapter.chapterNumber + } } if (newReadChapters.isNotEmpty()) { @@ -415,7 +422,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet this } } - //SY <-- + // SY <-- if (newChapters.isNotEmpty()) { val categoryIds = getCategories.await(manga.id).map { it.id } @@ -766,7 +773,9 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet 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/sync/SyncManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt index 337b5ae74..2d7c2e3c9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt @@ -147,7 +147,7 @@ class SyncManager( return } - if (remoteBackup === syncData.backup){ + if (remoteBackup === syncData.backup) { // nothing changed logcat(LogPriority.DEBUG) { "Skip restore due to remote was overwrite from local" } syncPreferences.lastSyncTimestamp().set(Date().time) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt index c4b1971e0..8357e1a4b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt @@ -72,7 +72,7 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync try { val remoteSData = pullSyncData() - if (remoteSData != null ){ + if (remoteSData != null) { // Get local unique device ID val localDeviceId = syncPreferences.uniqueDeviceID() val lastSyncDeviceId = remoteSData.deviceId @@ -86,7 +86,7 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync return if (lastSyncDeviceId == localDeviceId) { pushSyncData(syncData) syncData.backup - }else{ + } else { // Merge the local and remote sync data val mergedSyncData = mergeSyncData(syncData, remoteSData) pushSyncData(mergedSyncData) @@ -165,7 +165,9 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync appProperties = mapOf("deviceId" to syncData.deviceId) } drive.files().update(fileId, fileMetadata, mediaContent).execute() - logcat(LogPriority.DEBUG) { "Updated existing sync data file in Google Drive with file ID: $fileId" } + logcat(LogPriority.DEBUG) { + "Updated existing sync data file in Google Drive with file ID: $fileId" + } } else { val fileMetadata = File().apply { name = remoteFileName @@ -176,7 +178,9 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync val uploadedFile = drive.files().create(fileMetadata, mediaContent) .setFields("id") .execute() - logcat(LogPriority.DEBUG) { "Created new sync data file in Google Drive with file ID: ${uploadedFile.id}" } + logcat(LogPriority.DEBUG) { + "Created new sync data file in Google Drive with file ID: ${uploadedFile.id}" + } } } } @@ -203,7 +207,6 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync } } - suspend fun deleteSyncDataFromGoogleDrive(): DeleteSyncDataStatus { val drive = googleDriveService.driveService diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncService.kt index 64a6146dd..2524fbab1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncService.kt @@ -26,7 +26,7 @@ abstract class SyncService( val json: Json, val syncPreferences: SyncPreferences, ) { - abstract suspend fun doSync(syncData: SyncData): Backup?; + abstract suspend fun doSync(syncData: SyncData): Backup? /** * Merges the local and remote sync data into a single JSON string. @@ -44,7 +44,8 @@ abstract class SyncService( remoteSyncData.backup?.backupManga, localSyncData.backup?.backupCategories ?: emptyList(), remoteSyncData.backup?.backupCategories ?: emptyList(), - mergedCategoriesList) + mergedCategoriesList, + ) val mergedSourcesList = mergeSourcesLists(localSyncData.backup?.backupSources, remoteSyncData.backup?.backupSources) @@ -120,11 +121,13 @@ abstract class SyncService( val mergedCategoriesMapByName = mergedCategories.associateBy { it.name } fun updateCategories(theManga: BackupManga, theMap: Map): BackupManga { - return theManga.copy(categories = theManga.categories.mapNotNull { - theMap[it]?.let { category -> - mergedCategoriesMapByName[category.name]?.order - } - }) + return theManga.copy( + categories = theManga.categories.mapNotNull { + theMap[it]?.let { category -> + mergedCategoriesMapByName[category.name]?.order + } + }, + ) } logcat(LogPriority.DEBUG, logTag) { @@ -147,7 +150,7 @@ abstract class SyncService( } updateCategories( local.copy(chapters = mergeChapters(local.chapters, remote.chapters)), - localCategoriesMapByOrder + localCategoriesMapByOrder, ) } else { logcat(LogPriority.DEBUG, logTag) { @@ -155,7 +158,7 @@ abstract class SyncService( } updateCategories( remote.copy(chapters = mergeChapters(local.chapters, remote.chapters)), - remoteCategoriesMapByOrder + remoteCategoriesMapByOrder, ) } } @@ -301,7 +304,7 @@ abstract class SyncService( private fun mergeSourcesLists( localSources: List?, - remoteSources: List? + remoteSources: List?, ): List { val logTag = "MergeSources" @@ -346,7 +349,7 @@ abstract class SyncService( private fun mergePreferencesLists( localPreferences: List?, - remotePreferences: List? + remotePreferences: List?, ): List { val logTag = "MergePreferences" @@ -394,7 +397,7 @@ abstract class SyncService( private fun mergeSourcePreferencesLists( localPreferences: List?, - remotePreferences: List? + remotePreferences: List?, ): List { val logTag = "MergeSourcePreferences" @@ -408,38 +411,39 @@ abstract class SyncService( } // Merge both source preferences maps - val mergedSourcePreferences = (localPreferencesMap.keys + remotePreferencesMap.keys).distinct().mapNotNull { sourceKey -> - val localSourcePreference = localPreferencesMap[sourceKey] - val remoteSourcePreference = remotePreferencesMap[sourceKey] + val mergedSourcePreferences = (localPreferencesMap.keys + remotePreferencesMap.keys).distinct() + .mapNotNull { sourceKey -> + val localSourcePreference = localPreferencesMap[sourceKey] + val remoteSourcePreference = remotePreferencesMap[sourceKey] - logcat(LogPriority.DEBUG, logTag) { - "Processing source preference key: $sourceKey. " + - "Local source preference: ${localSourcePreference != null}, " + - "Remote source preference: ${remoteSourcePreference != null}" - } + logcat(LogPriority.DEBUG, logTag) { + "Processing source preference key: $sourceKey. " + + "Local source preference: ${localSourcePreference != null}, " + + "Remote source preference: ${remoteSourcePreference != null}" + } - when { - localSourcePreference != null && remoteSourcePreference == null -> { - logcat(LogPriority.DEBUG, logTag) { - "Using local source preference: ${localSourcePreference.sourceKey}." + when { + localSourcePreference != null && remoteSourcePreference == null -> { + logcat(LogPriority.DEBUG, logTag) { + "Using local source preference: ${localSourcePreference.sourceKey}." + } + localSourcePreference } - localSourcePreference - } - remoteSourcePreference != null && localSourcePreference == null -> { - logcat(LogPriority.DEBUG, logTag) { - "Using remote source preference: ${remoteSourcePreference.sourceKey}." + remoteSourcePreference != null && localSourcePreference == null -> { + logcat(LogPriority.DEBUG, logTag) { + "Using remote source preference: ${remoteSourcePreference.sourceKey}." + } + remoteSourcePreference } - remoteSourcePreference + localSourcePreference != null && remoteSourcePreference != null -> { + // Merge the individual preferences within the source preferences + val mergedPrefs = + mergeIndividualPreferences(localSourcePreference.prefs, remoteSourcePreference.prefs) + BackupSourcePreferences(sourceKey, mergedPrefs) + } + else -> null } - localSourcePreference != null && remoteSourcePreference != null -> { - // Merge the individual preferences within the source preferences - val mergedPrefs = - mergeIndividualPreferences(localSourcePreference.prefs, remoteSourcePreference.prefs) - BackupSourcePreferences(sourceKey, mergedPrefs) - } - else -> null } - } logcat(LogPriority.DEBUG, logTag) { "Source preferences merge completed. Total merged source preferences: ${mergedSourcePreferences.size}" @@ -450,7 +454,7 @@ abstract class SyncService( private fun mergeIndividualPreferences( localPrefs: List, - remotePrefs: List + remotePrefs: List, ): List { val mergedPrefsMap = (localPrefs + remotePrefs).associateBy { it.key } return mergedPrefsMap.values.toList() @@ -459,7 +463,7 @@ abstract class SyncService( // SY --> private fun mergeSavedSearchesLists( localSearches: List?, - remoteSearches: List? + remoteSearches: List?, ): List { val logTag = "MergeSavedSearches" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt index f35381b66..ea04f72ac 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt @@ -38,7 +38,7 @@ class SyncYomiSyncService( try { val (remoteData, etag) = pullSyncData() - val finalSyncData = if (remoteData != null){ + val finalSyncData = if (remoteData != null) { assert(etag.isNotEmpty()) { "ETag should never be empty if remote data is not null" } logcat(LogPriority.DEBUG, "SyncService") { "Try update remote data with ETag($etag)" @@ -54,7 +54,6 @@ class SyncYomiSyncService( pushSyncData(finalSyncData, etag) return finalSyncData.backup - } catch (e: Exception) { logcat(LogPriority.ERROR) { "Error syncing: ${e.message}" } notifier.showSyncError(e.message) @@ -113,7 +112,6 @@ class SyncYomiSyncService( // return default value so we can overwrite it Pair(null, "") } - } else { val responseBody = response.body.string() notifier.showSyncError("Failed to download sync data: $responseBody") @@ -165,11 +163,9 @@ class SyncYomiSyncService( .takeIf { it?.isNotEmpty() == true } ?: throw SyncYomiException("Missing ETag") syncPreferences.lastSyncEtag().set(newETag) logcat(LogPriority.DEBUG) { "SyncYomi sync completed" } - } else if (response.code == HttpStatus.SC_PRECONDITION_FAILED) { // other clients updated remote data, will try next time logcat(LogPriority.DEBUG) { "SyncYomi sync failed with 412" } - } else { val responseBody = response.body.string() notifier.showSyncError("Failed to upload sync data: $responseBody") 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 c808d0f31..e31454e74 100755 --- 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 @@ -47,10 +47,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() @@ -65,7 +65,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -109,7 +109,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 } @@ -119,9 +119,9 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { withIOContext { val query = """ |mutation DeleteManga(${'$'}listId: Int) { - |DeleteMediaListEntry(id: ${'$'}listId) { + |DeleteMediaListEntry(id: ${'$'}listId) { |deleted - |} + |} |} | """.trimMargin() @@ -131,7 +131,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() } } @@ -172,7 +172,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -242,7 +242,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -286,7 +286,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { with(json) { authClient.newCall( POST( - apiUrl, + API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) @@ -364,17 +364,17 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { } companion object { - private const val clientId = "16329" - 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 CLIENT_ID = "16329" + 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/" fun mangaUrl(mediaId: Long): String { - return baseMangaUrl + mediaId + return BASE_MANGA_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 65d2dc805..c48fa2490 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 @@ -42,7 +42,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 } @@ -55,7 +55,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 @@ -64,7 +64,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() @@ -75,7 +75,7 @@ class BangumiApi( suspend fun search(search: String): List { return withIOContext { - val url = "$apiUrl/search/subject/${URLEncoder.encode(search, StandardCharsets.UTF_8.name())}" + val url = "$API_URL/search/subject/${URLEncoder.encode(search, StandardCharsets.UTF_8.name())}" .toUri() .buildUpon() .appendQueryParameter("max_results", "20") @@ -124,7 +124,7 @@ class BangumiApi( suspend fun findLibManga(track: Track): Track? { 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) } @@ -134,7 +134,7 @@ class BangumiApi( suspend fun statusLibManga(track: Track): Track? { 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) @@ -171,41 +171,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 = "bgm291665acbd06a4c28" - private const val clientSecret = "43e5ce36b207de16e5d3cfd3e79118db" + private const val CLIENT_ID = "bgm291665acbd06a4c28" + private const val CLIENT_SECRET = "43e5ce36b207de16e5d3cfd3e79118db" - 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 = "mihon://bangumi-auth" + private const val REDIRECT_URL = "mihon://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 cabdf87be..c124ddd13 100755 --- 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 @@ -66,7 +66,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", @@ -104,7 +104,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", @@ -130,7 +130,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", @@ -143,7 +143,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 { @@ -157,16 +157,16 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) private suspend fun algoliaSearch(key: String, query: String): List { return withIOContext { val jsonObject = buildJsonObject { - put("params", "query=${URLEncoder.encode(query, StandardCharsets.UTF_8.name())}$algoliaFilter") + put("params", "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, ), @@ -187,7 +187,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun findLibManga(track: Track, userId: String): Track? { 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() @@ -210,7 +210,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun getLibManga(track: Track): Track { 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() @@ -237,11 +237,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() } @@ -250,7 +250,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) { @@ -265,35 +265,31 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) } companion object { - private const val clientId = - "dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd" - private const val clientSecret = - "54d7307928f63414defd96399fc31ba847961ceaecef3a5fd93144e960c0e151" + private const val CLIENT_ID = "dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd" + 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 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 ALGOLIA_KEY_URL = "https://kitsu.app/api/edge/algolia-keys/media/" - private const val algoliaUrl = - "https://AWQO5J657S-dsn.algolia.net/1/indexes/production_media/query/" - private const val algoliaAppId = "AWQO5J657S" - private const val algoliaFilter = - "&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 ALGOLIA_APP_ID = "AWQO5J657S" + private const val ALGOLIA_URL = "https://$ALGOLIA_APP_ID-dsn.algolia.net/1/indexes/production_media/query/" + 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" fun mangaUrl(remoteId: Long): String { - return baseMangaUrl + remoteId + return BASE_MANGA_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 6828e1e1a..e4521438b 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/TrackSearch.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt index c1af76ebf..94160d6ab 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.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.Track 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 680e512a3..fbb05ce34 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 @@ -54,7 +54,7 @@ class ShikimoriApi( } authClient.newCall( POST( - "$apiUrl/v2/user_rates", + "$API_URL/v2/user_rates", body = payload.toString().toRequestBody(jsonMime), ), ).awaitSuccess() @@ -72,14 +72,14 @@ class ShikimoriApi( suspend fun deleteLibManga(track: DomainTrack) { 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") @@ -102,10 +102,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 ?: "" @@ -121,13 +121,13 @@ 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 } } suspend fun findLibManga(track: Track, userId: String): Track? { 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) { @@ -136,7 +136,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") @@ -160,7 +160,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 { @@ -180,39 +180,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 = "PB9dq8DzI405s7wdtwTdirYqHiyVMh--djnP7lBUqSA" - private const val clientSecret = "NajpZcOBKB9sJtgNcejf8OB9jBN1OYYoo-k4h2WWZus" + private const val CLIENT_ID = "PB9dq8DzI405s7wdtwTdirYqHiyVMh--djnP7lBUqSA" + private const val CLIENT_SECRET = "NajpZcOBKB9sJtgNcejf8OB9jBN1OYYoo-k4h2WWZus" - 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 = "mihon://shikimori-auth" + private const val REDIRECT_URL = "mihon://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/extension/ExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt index f118b1bd5..daef404dc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -69,17 +69,18 @@ class ExtensionManager( private val iconMap = mutableMapOf() - private val _installedExtensionsMapFlow = MutableStateFlow(emptyMap()) - val installedExtensionsFlow = _installedExtensionsMapFlow.mapExtensions(scope) + private val installedExtensionMapFlow = MutableStateFlow(emptyMap()) + val installedExtensionsFlow = installedExtensionMapFlow.mapExtensions(scope) + + private val availableExtensionMapFlow = MutableStateFlow(emptyMap()) - private val _availableExtensionsMapFlow = MutableStateFlow(emptyMap()) // SY --> - val availableExtensionsFlow = _availableExtensionsMapFlow.map { it.filterNotBlacklisted().values.toList() } - .stateIn(scope, SharingStarted.Lazily, _availableExtensionsMapFlow.value.values.toList()) + val availableExtensionsFlow = availableExtensionMapFlow.map { it.filterNotBlacklisted().values.toList() } + .stateIn(scope, SharingStarted.Lazily, availableExtensionMapFlow.value.values.toList()) // SY <-- - private val _untrustedExtensionsMapFlow = MutableStateFlow(emptyMap()) - val untrustedExtensionsFlow = _untrustedExtensionsMapFlow.mapExtensions(scope) + private val untrustedExtensionMapFlow = MutableStateFlow(emptyMap()) + val untrustedExtensionsFlow = untrustedExtensionMapFlow.mapExtensions(scope) init { initExtensions() @@ -89,7 +90,7 @@ class ExtensionManager( private var subLanguagesEnabledOnFirstRun = preferences.enabledLanguages().isSet() fun getAppIconForSource(sourceId: Long): Drawable? { - val pkgName = _installedExtensionsMapFlow.value.values + val pkgName = installedExtensionMapFlow.value.values .find { ext -> ext.sources.any { it.id == sourceId } } @@ -128,11 +129,11 @@ class ExtensionManager( private fun initExtensions() { val extensions = ExtensionLoader.loadExtensions(context) - _installedExtensionsMapFlow.value = extensions + installedExtensionMapFlow.value = extensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } - _untrustedExtensionsMapFlow.value = extensions + untrustedExtensionMapFlow.value = extensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } // SY --> @@ -159,7 +160,7 @@ class ExtensionManager( // EXH <-- /** - * Finds the available extensions in the [api] and updates [_availableExtensionsMapFlow]. + * Finds the available extensions in the [api] and updates [availableExtensionMapFlow]. */ suspend fun findAvailableExtensions() { val extensions: List = try { @@ -172,7 +173,7 @@ class ExtensionManager( enableAdditionalSubLanguages(extensions) - _availableExtensionsMapFlow.value = extensions.associateBy { it.pkgName } + availableExtensionMapFlow.value = extensions.associateBy { it.pkgName } updatedInstalledExtensionsStatuses(extensions) setupAvailableExtensionsSourcesDataMap(extensions) } @@ -218,7 +219,7 @@ class ExtensionManager( return } - val installedExtensionsMap = _installedExtensionsMapFlow.value.toMutableMap() + val installedExtensionsMap = installedExtensionMapFlow.value.toMutableMap() var changed = false for ((pkgName, extension) in installedExtensionsMap) { val availableExt = availableExtensions.find { it.pkgName == pkgName } @@ -247,7 +248,7 @@ class ExtensionManager( } } if (changed) { - _installedExtensionsMapFlow.value = installedExtensionsMap + installedExtensionMapFlow.value = installedExtensionsMap } updatePendingUpdatesCount() } @@ -271,7 +272,7 @@ class ExtensionManager( * @param extension The extension to be updated. */ fun updateExtension(extension: Extension.Installed): Flow { - val availableExt = _availableExtensionsMapFlow.value[extension.pkgName] ?: return emptyFlow() + val availableExt = availableExtensionMapFlow.value[extension.pkgName] ?: return emptyFlow() return installExtension(availableExt) } @@ -308,11 +309,11 @@ class ExtensionManager( * @param extension the extension to trust */ suspend fun trust(extension: Extension.Untrusted) { - _untrustedExtensionsMapFlow.value[extension.pkgName] ?: return + untrustedExtensionMapFlow.value[extension.pkgName] ?: return trustExtension.trust(extension.pkgName, extension.versionCode, extension.signatureHash) - _untrustedExtensionsMapFlow.value -= extension.pkgName + untrustedExtensionMapFlow.value -= extension.pkgName ExtensionLoader.loadExtensionFromPkgName(context, extension.pkgName) .let { it as? LoadResult.Success } @@ -332,7 +333,7 @@ class ExtensionManager( } // SY <-- - _installedExtensionsMapFlow.value += extension + installedExtensionMapFlow.value += extension } /** @@ -349,7 +350,7 @@ class ExtensionManager( } // SY <-- - _installedExtensionsMapFlow.value += extension + installedExtensionMapFlow.value += extension } /** @@ -359,8 +360,8 @@ class ExtensionManager( * @param pkgName The package name of the uninstalled application. */ private fun unregisterExtension(pkgName: String) { - _installedExtensionsMapFlow.value -= pkgName - _untrustedExtensionsMapFlow.value -= pkgName + installedExtensionMapFlow.value -= pkgName + untrustedExtensionMapFlow.value -= pkgName } /** @@ -379,8 +380,8 @@ class ExtensionManager( } override fun onExtensionUntrusted(extension: Extension.Untrusted) { - _installedExtensionsMapFlow.value -= extension.pkgName - _untrustedExtensionsMapFlow.value += extension + installedExtensionMapFlow.value -= extension.pkgName + untrustedExtensionMapFlow.value += extension updatePendingUpdatesCount() } @@ -404,14 +405,14 @@ class ExtensionManager( private fun Extension.Installed.updateExists(availableExtension: Extension.Available? = null): Boolean { val availableExt = availableExtension - ?: _availableExtensionsMapFlow.value[pkgName] + ?: availableExtensionMapFlow.value[pkgName] ?: return false return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) } private fun updatePendingUpdatesCount() { - val pendingUpdateCount = _installedExtensionsMapFlow.value.values.count { it.hasUpdate } + val pendingUpdateCount = installedExtensionMapFlow.value.values.count { it.hasUpdate } preferences.extensionUpdatesCount().set(pendingUpdateCount) if (pendingUpdateCount == 0) { ExtensionUpdateNotifier(context).dismiss() diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt index 8b2027699..7df837964 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionApi.kt @@ -34,8 +34,10 @@ internal class ExtensionApi { private val getExtensionRepo: GetExtensionRepo by injectLazy() private val updateExtensionRepo: UpdateExtensionRepo by injectLazy() private val extensionManager: ExtensionManager by injectLazy() + // SY --> private val sourcePreferences: SourcePreferences by injectLazy() + // SY <-- private val json: Json by injectLazy() diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/model/InstallStep.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/model/InstallStep.kt index d1049689e..cd9b40fad 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/model/InstallStep.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/model/InstallStep.kt @@ -1,7 +1,13 @@ package eu.kanade.tachiyomi.extension.model 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/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index 50ab94279..08027dc10 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -223,7 +223,6 @@ internal object ExtensionLoader { * @param context The application context. * @param extensionInfo The extension to load. */ - @Suppress("LongMethod", "CyclomaticComplexMethod", "ReturnCount") private suspend fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult { val pkgManager = context.packageManager val pkgInfo = extensionInfo.packageInfo diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt index ba2b1c84e..f35ccae4e 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/EHentai.kt @@ -383,7 +383,7 @@ class EHentai( doc.select("#gdd .gdt1").find { el -> el.text().lowercase() == "posted:" }!!.nextElementSibling()!!.text(), - MetadataUtil.EX_DATE_FORMAT.withZone(ZoneOffset.UTC) + MetadataUtil.EX_DATE_FORMAT.withZone(ZoneOffset.UTC), )!!.toInstant().toEpochMilli(), scanlator = EHentaiSearchMetadata.galleryId(location), ) @@ -401,7 +401,7 @@ class EHentai( chapter_number = index + 2f, date_upload = ZonedDateTime.parse( posted, - MetadataUtil.EX_DATE_FORMAT.withZone(ZoneOffset.UTC) + MetadataUtil.EX_DATE_FORMAT.withZone(ZoneOffset.UTC), ).toInstant().toEpochMilli(), scanlator = EHentaiSearchMetadata.galleryId(link), ) @@ -542,9 +542,10 @@ class EHentai( if ( MATCH_SEEK_REGEX.matches(jumpSeekValue) || ( - MATCH_YEAR_REGEX.matches(jumpSeekValue) && jumpSeekValue.toIntOrNull()?.let { - it in 2007..2099 - } == true + MATCH_YEAR_REGEX.matches(jumpSeekValue) && + jumpSeekValue.toIntOrNull()?.let { + it in 2007..2099 + } == true ) ) { uri.appendQueryParameter("seek", jumpSeekValue) @@ -715,7 +716,7 @@ class EHentai( when (left.removeSuffix(":").lowercase()) { "posted" -> datePosted = ZonedDateTime.parse( right, - MetadataUtil.EX_DATE_FORMAT.withZone(ZoneOffset.UTC) + MetadataUtil.EX_DATE_FORMAT.withZone(ZoneOffset.UTC), ).toInstant().toEpochMilli() // Example gallery with parent: https://e-hentai.org/g/1390451/7f181c2426/ // Example JP gallery: https://exhentai.org/g/1375385/03519d541b/ diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt index 7587dc8fa..52b839cd3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt @@ -119,12 +119,13 @@ class MergedSource : HttpSource() { "Manga references are empty, chapters unavailable, merge is likely corrupted" } - val ifDownloadNewChapters = downloadChapters && manga.shouldDownloadNewChapters( - getCategories.await(manga.id).map { - it.id - }, - downloadPreferences, - ) + val ifDownloadNewChapters = downloadChapters && + manga.shouldDownloadNewChapters( + getCategories.await(manga.id).map { + it.id + }, + downloadPreferences, + ) val semaphore = Semaphore(5) var exception: Exception? = null return supervisorScope { 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 cf5a9a76e..e80acfd08 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 @@ -73,16 +73,17 @@ interface SecureActivityDelegate { } val lockedDays = preferences.authenticatorDays().get() - val canLockToday = lockedDays == LOCK_ALL_DAYS || when (today.get(Calendar.DAY_OF_WEEK)) { - Calendar.SUNDAY -> (lockedDays and LOCK_SUNDAY) == LOCK_SUNDAY - Calendar.MONDAY -> (lockedDays and LOCK_MONDAY) == LOCK_MONDAY - Calendar.TUESDAY -> (lockedDays and LOCK_TUESDAY) == LOCK_TUESDAY - Calendar.WEDNESDAY -> (lockedDays and LOCK_WEDNESDAY) == LOCK_WEDNESDAY - Calendar.THURSDAY -> (lockedDays and LOCK_THURSDAY) == LOCK_THURSDAY - Calendar.FRIDAY -> (lockedDays and LOCK_FRIDAY) == LOCK_FRIDAY - Calendar.SATURDAY -> (lockedDays and LOCK_SATURDAY) == LOCK_SATURDAY - else -> false - } + val canLockToday = lockedDays == LOCK_ALL_DAYS || + when (today.get(Calendar.DAY_OF_WEEK)) { + Calendar.SUNDAY -> (lockedDays and LOCK_SUNDAY) == LOCK_SUNDAY + Calendar.MONDAY -> (lockedDays and LOCK_MONDAY) == LOCK_MONDAY + Calendar.TUESDAY -> (lockedDays and LOCK_TUESDAY) == LOCK_TUESDAY + Calendar.WEDNESDAY -> (lockedDays and LOCK_WEDNESDAY) == LOCK_WEDNESDAY + Calendar.THURSDAY -> (lockedDays and LOCK_THURSDAY) == LOCK_THURSDAY + Calendar.FRIDAY -> (lockedDays and LOCK_FRIDAY) == LOCK_FRIDAY + Calendar.SATURDAY -> (lockedDays and LOCK_SATURDAY) == LOCK_SATURDAY + else -> false + } return canLockNow && canLockToday } @@ -99,11 +100,13 @@ interface SecureActivityDelegate { // `requireUnlock` can be true on process start or if app was closed in locked state if (!AuthenticatorUtil.isAuthenticating && !requireUnlock) { - requireUnlock = /* SY --> */ canLockNow(preferences) && /* SY <-- */ when (val lockDelay = preferences.lockAppAfter().get()) { - -1 -> false // Never - 0 -> true // Always - else -> lastClosedPref.get() + lockDelay * 60_000 <= System.currentTimeMillis() - } + requireUnlock = + /* SY --> */ canLockNow(preferences) && + /* SY <-- */ when (val lockDelay = preferences.lockAppAfter().get()) { + -1 -> false // Never + 0 -> true // Always + else -> lastClosedPref.get() + lockDelay * 60_000 <= System.currentTimeMillis() + } } lastClosedPref.delete() @@ -140,7 +143,7 @@ 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/extension/ExtensionsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt index 2efca7bcc..861c28ff6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsScreenModel.kt @@ -41,7 +41,7 @@ class ExtensionsScreenModel( private val getExtensions: GetExtensionsByType = Injekt.get(), ) : StateScreenModel(State()) { - private var _currentDownloads = MutableStateFlow>(hashMapOf()) + private val currentDownloads = MutableStateFlow>(hashMapOf()) init { val context = Injekt.get() @@ -62,14 +62,20 @@ class ExtensionsScreenModel( it.name.contains(input, ignoreCase = true) || it.baseUrl.contains(input, ignoreCase = true) || it.id == input.toLongOrNull() - } || extension.name.contains(input, ignoreCase = true) + } || + extension.name.contains(input, ignoreCase = true) } is Extension.Installed -> { extension.sources.any { it.name.contains(input, ignoreCase = true) || it.id == input.toLongOrNull() || - if (it is HttpSource) { it.baseUrl.contains(input, ignoreCase = true) } else false - } || extension.name.contains(input, ignoreCase = true) + if (it is HttpSource) { + it.baseUrl.contains(input, ignoreCase = true) + } else { + false + } + } || + extension.name.contains(input, ignoreCase = true) } is Extension.Untrusted -> extension.name.contains(input, ignoreCase = true) } @@ -80,7 +86,7 @@ class ExtensionsScreenModel( 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 ?: "" @@ -103,7 +109,8 @@ class ExtensionsScreenModel( .groupBy { it.lang } .toSortedMap(LocaleHelper.comparator) .map { (lang, exts) -> - ExtensionUiModel.Header.Text(LocaleHelper.getSourceDisplayName(lang, context)) to exts.map(extensionMapper(downloads)) + ExtensionUiModel.Header.Text(LocaleHelper.getSourceDisplayName(lang, context)) to + exts.map(extensionMapper(downloads)) } if (languagesWithExtensions.isNotEmpty()) { itemsGroups.putAll(languagesWithExtensions) @@ -165,11 +172,11 @@ class ExtensionsScreenModel( } private fun addDownloadState(extension: Extension, installStep: InstallStep) { - _currentDownloads.update { it + Pair(extension.pkgName, installStep) } + currentDownloads.update { it + Pair(extension.pkgName, installStep) } } private fun removeDownloadState(extension: Extension) { - _currentDownloads.update { it - extension.pkgName } + currentDownloads.update { it - extension.pkgName } } private suspend fun Flow.collectToInstallUpdate(extension: Extension) = diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt index 15744bb5c..94519160e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreen.kt @@ -121,7 +121,11 @@ class MigrationListScreen(private val config: MigrationProcedureConfig) : Screen ) val onDismissRequest = { screenModel.dialog.value = null } - when (@Suppress("NAME_SHADOWING") val dialog = dialog) { + when + ( + @Suppress("NAME_SHADOWING") + val dialog = dialog + ) { is MigrationListScreenModel.Dialog.MigrateMangaDialog -> { MigrationMangaDialog( onDismissRequest = onDismissRequest, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt index d263e9a0c..50c28f02b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListScreenModel.kt @@ -223,7 +223,9 @@ class MigrationListScreenModel( smartSearchEngine.normalSearch(source, mangaObj.ogTitle) } - if (searchResult != null && !(searchResult.url == mangaObj.url && source.id == mangaObj.source)) { + if (searchResult != null && + !(searchResult.url == mangaObj.url && source.id == mangaObj.source) + ) { val localManga = networkToLocalManga.await(searchResult) val chapters = if (source is EHentai) { @@ -237,7 +239,8 @@ class MigrationListScreenModel( } catch (e: Exception) { return@async2 null } - manga.progress.value = validSources.size to processedSources.incrementAndGet() + manga.progress.value = + validSources.size to processedSources.incrementAndGet() localManga to chapters.size } else { null @@ -314,7 +317,8 @@ class MigrationListScreenModel( if (result == null && hideNotFound) { removeManga(manga) } - if (result != null && showOnlyUpdates && + if (result != null && + showOnlyUpdates && (getChapterInfo(result.id).latestChapter ?: 0.0) <= (manga.chapterInfo.latestChapter ?: 0.0) ) { removeManga(manga) @@ -363,7 +367,10 @@ class MigrationListScreenModel( dbChapters.forEach { chapter -> if (chapter.isRecognizedNumber) { - val prevChapter = prevMangaChapters.find { it.isRecognizedNumber && it.chapterNumber == chapter.chapterNumber } + val prevChapter = prevMangaChapters.find { + it.isRecognizedNumber && + it.chapterNumber == chapter.chapterNumber + } if (prevChapter != null) { chapterUpdates += ChapterUpdate( id = chapter.id, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt index 92d93c0f9..7780db4d1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesScreenModel.kt @@ -119,7 +119,10 @@ class SourcesScreenModel( items = byLang .flatMap { listOf( - SourceUiModel.Header(it.key.removePrefix(CATEGORY_KEY_PREFIX), it.value.firstOrNull()?.category != null), + SourceUiModel.Header( + it.key.removePrefix(CATEGORY_KEY_PREFIX), + it.value.firstOrNull()?.category != null, + ), *it.value.map { source -> SourceUiModel.Item(source) }.toTypedArray(), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt index e0c382034..44a506a70 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesScreen.kt @@ -48,7 +48,15 @@ class BiometricTimesScreen : Screen() { fun showTimePicker(startTime: Duration? = null) { val activity = context as? MainActivity ?: return val picker = MaterialTimePicker.Builder() - .setTitleText(if (startTime == null) SYMR.strings.biometric_lock_start_time.getString(context) else SYMR.strings.biometric_lock_end_time.getString(context)) + .setTitleText( + if (startTime == + null + ) { + SYMR.strings.biometric_lock_start_time.getString(context) + } else { + SYMR.strings.biometric_lock_end_time.getString(context) + }, + ) .setInputMode(MaterialTimePicker.INPUT_MODE_CLOCK) .build() picker.addOnPositiveButtonClickListener { 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 c6e3ba3aa..b3841c5a9 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 @@ -70,8 +70,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 tabs = listOf( LibraryTab, @@ -94,7 +94,7 @@ object HomeScreen : Screen() { TabNavigator( tab = LibraryTab, - key = TabNavigatorKey, + key = TAB_NAVIGATOR_KEY, ) { tabNavigator -> // Provide usable navigator to content screen CompositionLocalProvider(LocalNavigator provides navigator) { @@ -144,8 +144,11 @@ object HomeScreen : Screen() { AnimatedContent( targetState = tabNavigator.current, transitionSpec = { - materialFadeThroughIn(initialScale = 1f, durationMillis = TabFadeDuration) togetherWith - materialFadeThroughOut(durationMillis = TabFadeDuration) + materialFadeThroughIn( + initialScale = 1f, + durationMillis = TAB_FADE_DURATION, + ) togetherWith + materialFadeThroughOut(durationMillis = TAB_FADE_DURATION) }, label = "tabContent", ) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index 98c2b1685..24f18e99a 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -184,7 +184,11 @@ class LibraryScreenModel( .applyGrouping(groupType) // SY <-- .applyFilters(tracks, trackingFiler) - .applySort(tracks, trackingFiler.keys,/* SY --> */sort.takeIf { groupType != LibraryGroup.BY_DEFAULT } /* SY <-- */) + .applySort( + tracks, trackingFiler.keys, /* SY --> */sort.takeIf { + groupType != LibraryGroup.BY_DEFAULT + }, /* SY <-- */ + ) .mapValues { (_, value) -> if (searchQuery != null) { // Filter query @@ -278,7 +282,6 @@ class LibraryScreenModel( /** * Applies library filters to the given map of manga. */ - @Suppress("LongMethod", "CyclomaticComplexMethod") private suspend fun LibraryMap.applyFilters( trackMap: Map>, trackingFiler: Map, @@ -373,7 +376,6 @@ class LibraryScreenModel( /** * Applies library sorting to the given map of manga. */ - @Suppress("LongMethod", "CyclomaticComplexMethod") private fun LibraryMap.applySort( // Map> trackMap: Map>, @@ -387,7 +389,8 @@ class LibraryScreenModel( .asSequence() .mapNotNull { val list = it.split("|") - (list.getOrNull(0)?.toIntOrNull() ?: return@mapNotNull null) to (list.getOrNull(1) ?: return@mapNotNull null) + (list.getOrNull(0)?.toIntOrNull() ?: return@mapNotNull null) to + (list.getOrNull(1) ?: return@mapNotNull null) } .sortedBy { it.first } .map { it.second } @@ -453,8 +456,12 @@ class LibraryScreenModel( } // SY --> LibrarySort.Type.TagList -> { - val manga1IndexOfTag = listOfTags.indexOfFirst { i1.libraryManga.manga.genre?.contains(it) ?: false } - val manga2IndexOfTag = listOfTags.indexOfFirst { i2.libraryManga.manga.genre?.contains(it) ?: false } + val manga1IndexOfTag = listOfTags.indexOfFirst { + i1.libraryManga.manga.genre?.contains(it) ?: false + } + val manga2IndexOfTag = listOfTags.indexOfFirst { + i2.libraryManga.manga.genre?.contains(it) ?: false + } manga1IndexOfTag.compareTo(manga2IndexOfTag) } // SY <-- @@ -822,9 +829,12 @@ class LibraryScreenModel( if (source != null) { if (source is MergedSource) { val mergedMangas = getMergedMangaById.await(manga.id) - val sources = mergedMangas.distinctBy { it.source }.map { sourceManager.getOrStub(it.source) } + val sources = mergedMangas.distinctBy { + it.source + }.map { sourceManager.getOrStub(it.source) } mergedMangas.forEach merge@{ mergedManga -> - val mergedSource = sources.firstOrNull { mergedManga.source == it.id } as? HttpSource ?: return@merge + val mergedSource = + sources.firstOrNull { mergedManga.source == it.id } as? HttpSource ?: return@merge downloadManager.deleteManga(mergedManga, mergedSource) } } else { @@ -903,10 +913,11 @@ class LibraryScreenModel( } else { categoryName } - LibraryGroup.BY_TRACK_STATUS -> TrackStatus.entries - .find { it.int.toLong() == category?.id } - .let { it ?: TrackStatus.OTHER } - .let { context.stringResource(it.res) } + LibraryGroup.BY_TRACK_STATUS -> + TrackStatus.entries + .find { it.int.toLong() == category?.id } + .let { it ?: TrackStatus.OTHER } + .let { context.stringResource(it.res) } LibraryGroup.UNGROUPED -> context.stringResource(SYMR.strings.ungrouped) else -> categoryName } @@ -993,49 +1004,66 @@ class LibraryScreenModel( (manga.description?.contains(query, true) == true) || (source?.name?.contains(query, true) == true) || (sourceIdString != null && sourceIdString == query) || - (loggedInTrackServices.isNotEmpty() && tracks != null && filterTracks(query, tracks, context)) || + ( + loggedInTrackServices.isNotEmpty() && + tracks != null && + filterTracks(query, tracks, context) + ) || (genre.fastAny { it.contains(query, true) }) || (searchTags?.fastAny { it.name.contains(query, true) } == true) || (searchTitles?.fastAny { it.title.contains(query, true) } == true) } is Namespace -> { - searchTags != null && searchTags.fastAny { - val tag = queryComponent.tag - (it.namespace.equals(queryComponent.namespace, true) && tag?.run { it.name.contains(tag.asQuery(), true) } == true) || - (tag == null && it.namespace.equals(queryComponent.namespace, true)) - } + searchTags != null && + searchTags.fastAny { + val tag = queryComponent.tag + ( + it.namespace.equals(queryComponent.namespace, true) && + tag?.run { it.name.contains(tag.asQuery(), true) } == true + ) || + (tag == null && it.namespace.equals(queryComponent.namespace, true)) + } } else -> true } true -> when (queryComponent) { is Text -> { val query = queryComponent.asQuery() - query.isBlank() || ( - (!manga.title.contains(query, true)) && - (manga.author?.contains(query, true) != true) && - (manga.artist?.contains(query, true) != true) && - (manga.description?.contains(query, true) != true) && - (source?.name?.contains(query, true) != true) && - (sourceIdString != null && sourceIdString != query) && - (loggedInTrackServices.isEmpty() || tracks == null || !filterTracks(query, tracks, context)) && - (!genre.fastAny { it.contains(query, true) }) && - (searchTags?.fastAny { it.name.contains(query, true) } != true) && - (searchTitles?.fastAny { it.title.contains(query, true) } != true) - ) + query.isBlank() || + ( + (!manga.title.contains(query, true)) && + (manga.author?.contains(query, true) != true) && + (manga.artist?.contains(query, true) != true) && + (manga.description?.contains(query, true) != true) && + (source?.name?.contains(query, true) != true) && + (sourceIdString != null && sourceIdString != query) && + ( + loggedInTrackServices.isEmpty() || + tracks == null || + !filterTracks(query, tracks, context) + ) && + (!genre.fastAny { it.contains(query, true) }) && + (searchTags?.fastAny { it.name.contains(query, true) } != true) && + (searchTitles?.fastAny { it.title.contains(query, true) } != true) + ) } is Namespace -> { val searchedTag = queryComponent.tag?.asQuery() - searchTags == null || (queryComponent.namespace.isBlank() && searchedTag.isNullOrBlank()) || searchTags.fastAll { mangaTag -> - if (queryComponent.namespace.isBlank() && !searchedTag.isNullOrBlank()) { - !mangaTag.name.contains(searchedTag, true) - } else if (searchedTag.isNullOrBlank()) { - mangaTag.namespace == null || !mangaTag.namespace.equals(queryComponent.namespace, true) - } else if (mangaTag.namespace.isNullOrBlank()) { - true - } else { - !mangaTag.name.contains(searchedTag, true) || !mangaTag.namespace.equals(queryComponent.namespace, true) + searchTags == null || + (queryComponent.namespace.isBlank() && searchedTag.isNullOrBlank()) || + searchTags.fastAll { mangaTag -> + if (queryComponent.namespace.isBlank() && !searchedTag.isNullOrBlank()) { + !mangaTag.name.contains(searchedTag, true) + } else if (searchedTag.isNullOrBlank()) { + mangaTag.namespace == null || + !mangaTag.namespace.equals(queryComponent.namespace, true) + } else if (mangaTag.namespace.isNullOrBlank()) { + true + } else { + !mangaTag.name.contains(searchedTag, true) || + !mangaTag.namespace.equals(queryComponent.namespace, true) + } } - } } else -> true } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel.kt index 652ec1d50..6c6755079 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel.kt @@ -34,7 +34,7 @@ class LibrarySettingsScreenModel( .stateIn( scope = screenModelScope, started = SharingStarted.WhileSubscribed(5.seconds.inWholeMilliseconds), - initialValue = trackerManager.loggedInTrackers() + initialValue = trackerManager.loggedInTrackers(), ) // SY --> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt index 780616365..50902fa8d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt @@ -189,14 +189,14 @@ private fun onViewCreated(manga: Manga, context: Context, binding: EditMangaDial binding.mangaDescription.hint = context.stringResource( SYMR.strings.description_hint, - manga.ogDescription?.takeIf { it.isNotBlank() }?.replace("\n", " ")?.chop(20) ?: "" + manga.ogDescription?.takeIf { it.isNotBlank() }?.replace("\n", " ")?.chop(20) ?: "", ) binding.thumbnailUrl.hint = context.stringResource( SYMR.strings.thumbnail_url_hint, manga.ogThumbnailUrl?.let { it.chop(40) + if (it.length > 46) "." + it.substringAfterLast(".").chop(6) else "" - } ?: "" + } ?: "", ) } binding.mangaGenresTags.clearFocus() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index d6e79c19e..c89e05889 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -209,10 +209,14 @@ class MangaScreen( onMigrateClicked = { migrateManga(navigator, screenModel.manga!!) }.takeIf { successState.manga.favorite }, onMetadataViewerClicked = { openMetadataViewer(navigator, successState.manga) }, onEditInfoClicked = screenModel::showEditMangaInfoDialog, - onRecommendClicked = { openRecommends(context, navigator, screenModel.source?.getMainSource(), successState.manga) }, + onRecommendClicked = { + openRecommends(context, navigator, screenModel.source?.getMainSource(), successState.manga) + }, onMergedSettingsClicked = screenModel::showEditMergedSettingsDialog, onMergeClicked = { openSmartSearch(navigator, successState.manga) }, - onMergeWithAnotherClicked = { mergeWithAnother(navigator, context, successState.manga, screenModel::smartSearchMerge) }, + onMergeWithAnotherClicked = { + mergeWithAnother(navigator, context, successState.manga, screenModel::smartSearchMerge) + }, onOpenPagePreview = { openPagePreview(context, successState.chapters.minByOrNull { it.chapter.sourceOrder }?.chapter, it) }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index 84a9202cf..a901d7297 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -35,14 +35,12 @@ import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.track.EnhancedTracker import eu.kanade.tachiyomi.data.track.TrackerManager -import eu.kanade.tachiyomi.data.track.mdlist.MdList import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.source.PagePreviewSource import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.getNameForMangaInfo import eu.kanade.tachiyomi.source.online.MetadataSource import eu.kanade.tachiyomi.source.online.all.MergedSource -import eu.kanade.tachiyomi.ui.manga.track.TrackItem import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.chapter.getNextUnread import eu.kanade.tachiyomi.util.removeCovers @@ -208,7 +206,8 @@ class MangaScreenModel( private val skipFiltered by readerPreferences.skipFiltered().asState(screenModelScope) - val isUpdateIntervalEnabled = LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in libraryPreferences.autoUpdateMangaRestrictions().get() + val isUpdateIntervalEnabled = + LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in libraryPreferences.autoUpdateMangaRestrictions().get() private val selectedPositions: Array = arrayOf(-1, -1) // first and last selected index in list private val selectedChapterIds: HashSet = HashSet() @@ -262,7 +261,10 @@ class MangaScreenModel( } } .onEach { (manga, chapters) -> - if (chapters.isNotEmpty() && manga.isEhBasedManga() && DebugToggles.ENABLE_EXH_ROOT_REDIRECT.enabled) { + if (chapters.isNotEmpty() && + manga.isEhBasedManga() && + DebugToggles.ENABLE_EXH_ROOT_REDIRECT.enabled + ) { // Check for gallery in library and accept manga with lowest id // Find chapters sharing same root launchIO { @@ -350,7 +352,7 @@ class MangaScreenModel( } else { flowOf(emptySet()) } - } + }, ) { mangaScanlators, mergeScanlators -> mangaScanlators + mergeScanlators } // SY <-- @@ -366,7 +368,15 @@ class MangaScreenModel( screenModelScope.launchIO { val manga = getMangaAndChapters.awaitManga(mangaId) // SY --> - val chapters = (if (manga.source == MERGED_SOURCE_ID) getMergedChaptersByMangaId.await(mangaId, applyScanlatorFilter = true) else getMangaAndChapters.awaitChapters(mangaId, applyScanlatorFilter = true)) + val chapters = ( + if (manga.source == + MERGED_SOURCE_ID + ) { + getMergedChaptersByMangaId.await(mangaId, applyScanlatorFilter = true) + } else { + getMangaAndChapters.awaitChapters(mangaId, applyScanlatorFilter = true) + } + ) .toChapterListItems(manga, null) val mergedData = getMergedReferencesById.await(mangaId).takeIf { it.isNotEmpty() }?.let { references -> MergedMangaData( @@ -416,7 +426,8 @@ class MangaScreenModel( } else { PagePreviewState.Unused }, - alwaysShowReadingProgress = readerPreferences.preserveReadingPosition().get() && manga.isEhBasedManga(), + alwaysShowReadingProgress = + readerPreferences.preserveReadingPosition().get() && manga.isEhBasedManga(), previewsRowCount = uiPreferences.previewsRowCount().get(), // SY <-- ) @@ -920,7 +931,12 @@ class MangaScreenModel( screenModelScope.launchIO { downloadManager.statusFlow() .filter { - /* SY --> */ if (isMergedSource) it.manga.id in mergedIds else /* SY <-- */ it.manga.id == successState?.manga?.id + /* SY --> */ if (isMergedSource) { + it.manga.id in mergedIds + } else { + /* SY <-- */ it.manga.id == + successState?.manga?.id + } } .catch { error -> logcat(LogPriority.ERROR, error) } .collect { @@ -933,7 +949,12 @@ class MangaScreenModel( screenModelScope.launchIO { downloadManager.progressFlow() .filter { - /* SY --> */ if (isMergedSource) it.manga.id in mergedIds else /* SY <-- */ it.manga.id == successState?.manga?.id + /* SY --> */ if (isMergedSource) { + it.manga.id in mergedIds + } else { + /* SY <-- */ it.manga.id == + successState?.manga?.id + } } .catch { error -> logcat(LogPriority.ERROR, error) } .collect { @@ -974,6 +995,7 @@ class MangaScreenModel( } else { downloadManager.getQueuedDownloadOrNull(chapter.id) } + // SY --> @Suppress("NAME_SHADOWING") val manga = mergedData?.manga?.get(chapter.mangaId) ?: manga @@ -1292,7 +1314,12 @@ class MangaScreenModel( screenModelScope.launchNonCancellable { val manga = successState?.manga ?: return@launchNonCancellable val categories = getCategories.await(manga.id).map { it.id } - if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(categories, downloadPreferences) || manga.isEhBasedManga()) return@launchNonCancellable + if (chapters.isEmpty() || + !manga.shouldDownloadNewChapters(categories, downloadPreferences) || + manga.isEhBasedManga() + ) { + return@launchNonCancellable + } downloadChapters(chapters) } } @@ -1493,7 +1520,8 @@ class MangaScreenModel( getTracks.subscribe(manga.id) // SY --> .map { trackItems -> - if (manga.source in mangaDexSourceIds || state.mergedData?.manga?.values.orEmpty().any { + if (manga.source in mangaDexSourceIds || + state.mergedData?.manga?.values.orEmpty().any { it.source in mangaDexSourceIds } ) { @@ -1524,7 +1552,6 @@ class MangaScreenModel( trackingCount to supportedTrackers.isNotEmpty() // SY <-- } - .distinctUntilChanged() .collectLatest { (trackingCount, hasLoggedInTrackers) -> updateSuccessState { @@ -1559,6 +1586,7 @@ class MangaScreenModel( ) : Dialog data class DeleteChapters(val chapters: List) : Dialog data class DuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog + /* SY --> data class Migrate(val newManga: Manga, val oldManga: Manga) : Dialog SY <-- */ diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt index f012d1b39..484103597 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt @@ -59,7 +59,8 @@ class EditMergedSettingsState( }.map { reference -> mergedManga.firstOrNull { it.id == reference.mangaId } to reference } mergeReference = mergedReferences.firstOrNull { it.mangaSourceId == MERGED_SOURCE_ID } - val isPriorityOrder = mergeReference?.let { it.chapterSortMode == MergedMangaReference.CHAPTER_SORT_PRIORITY } ?: false + val isPriorityOrder = + mergeReference?.let { it.chapterSortMode == MergedMangaReference.CHAPTER_SORT_PRIORITY } ?: false mergedMangaAdapter = EditMergedMangaAdapter(this, isPriorityOrder) mergedMangaHeaderAdapter = EditMergedSettingsHeaderAdapter(this, mergedMangaAdapter!!) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt index 3c6e5fc38..0b1111592 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsHeaderAdapter.kt @@ -161,7 +161,8 @@ class EditMergedSettingsHeaderAdapter(private val state: EditMergedSettingsState } } - fun canMove() = state.mergeReference?.let { it.chapterSortMode == MergedMangaReference.CHAPTER_SORT_PRIORITY } ?: false + fun canMove() = + state.mergeReference?.let { it.chapterSortMode == MergedMangaReference.CHAPTER_SORT_PRIORITY } ?: false interface SortingListener { fun onSetPrioritySort(isPriorityOrder: Boolean) 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 7701be295..d920c577d 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 @@ -108,8 +108,8 @@ private class MoreScreenModel( val showNavHistory by uiPreferences.showNavHistory().asState(screenModelScope) // SY <-- - private var _state: MutableStateFlow = MutableStateFlow(DownloadQueueState.Stopped) - val downloadQueueState: StateFlow = _state.asStateFlow() + private var _downloadQueueState: MutableStateFlow = MutableStateFlow(DownloadQueueState.Stopped) + val downloadQueueState: StateFlow = _downloadQueueState.asStateFlow() init { // Handle running/paused status change and queue progress updating @@ -120,7 +120,7 @@ private class MoreScreenModel( ) { isRunning, downloadQueue -> Pair(isRunning, downloadQueue.size) } .collectLatest { (isDownloading, downloadQueueSize) -> 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/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index eb27fcfb1..99d4896e1 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 @@ -8,7 +8,6 @@ import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.content.res.Configuration -import android.graphics.Bitmap import android.graphics.Color import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter @@ -438,10 +437,12 @@ class ReaderActivity : BaseActivity() { val landscapeVerticalSeekbar by readerPreferences.landscapeVerticalSeekbar().collectAsState() val leftHandedVerticalSeekbar by readerPreferences.leftVerticalSeekbar().collectAsState() val configuration = LocalConfiguration.current - val verticalSeekbarLandscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && landscapeVerticalSeekbar + val verticalSeekbarLandscape = + configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && landscapeVerticalSeekbar val verticalSeekbarHorizontal = configuration.orientation == Configuration.ORIENTATION_PORTRAIT val viewerIsVertical = (state.viewer is WebtoonViewer || state.viewer is VerticalPagerViewer) - val showVerticalSeekbar = !forceHorizontalSeekbar && (verticalSeekbarLandscape || verticalSeekbarHorizontal) && viewerIsVertical + val showVerticalSeekbar = + !forceHorizontalSeekbar && (verticalSeekbarLandscape || verticalSeekbarHorizontal) && viewerIsVertical val navBarType = when { !showVerticalSeekbar -> NavBarType.Bottom leftHandedVerticalSeekbar -> NavBarType.VerticalLeft @@ -828,7 +829,8 @@ class ReaderActivity : BaseActivity() { } else { if (readerPreferences.fullscreen().get()) { windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) - windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + windowInsetsController.systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } } } @@ -1031,7 +1033,13 @@ class ReaderActivity : BaseActivity() { // SY --> val currentPageText = if (hasExtraPage) { val invertDoublePage = (viewModel.state.value.viewer as? PagerViewer)?.config?.invertDoublePages ?: false - if ((resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR) xor invertDoublePage) "${page.number}-${page.number + 1}" else "${page.number + 1}-${page.number}" + if ((resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR) xor + invertDoublePage + ) { + "${page.number}-${page.number + 1}" + } else { + "${page.number + 1}-${page.number}" + } } else { "${page.number}" } @@ -1093,7 +1101,16 @@ class ReaderActivity : BaseActivity() { // SY --> val text = if (secondPage != null) { - stringResource(SYMR.strings.share_pages_info, manga.title, chapter.name, if (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_LTR) "${page.number}-${page.number + 1}" else "${page.number + 1}-${page.number}") + stringResource( + SYMR.strings.share_pages_info, manga.title, chapter.name, + if (resources.configuration.layoutDirection == + View.LAYOUT_DIRECTION_LTR + ) { + "${page.number}-${page.number + 1}" + } else { + "${page.number + 1}-${page.number}" + }, + ) } else { stringResource(MR.strings.share_page_info, manga.title, chapter.name, page.number) } @@ -1257,11 +1274,14 @@ class ReaderActivity : BaseActivity() { .onEach { if (viewModel.state.value.viewer !is PagerViewer) return@onEach reloadChapters( - !it && when (readerPreferences.pageLayout().get()) { - PagerConfig.PageLayout.DOUBLE_PAGES -> true - PagerConfig.PageLayout.AUTOMATIC -> resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE - else -> false - }, + !it && + when (readerPreferences.pageLayout().get()) { + PagerConfig.PageLayout.DOUBLE_PAGES -> true + PagerConfig.PageLayout.AUTOMATIC -> + resources.configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE + else -> false + }, true, ) } 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 f2fbd0d74..5b6dee233 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 @@ -134,7 +134,7 @@ class ReaderViewModel @JvmOverloads constructor( private val getMergedMangaById: GetMergedMangaById = Injekt.get(), private val getMergedReferencesById: GetMergedReferencesById = Injekt.get(), private val getMergedChaptersByMangaId: GetMergedChaptersByMangaId = Injekt.get(), - private val setReadStatus: SetReadStatus = Injekt.get() + private val setReadStatus: SetReadStatus = Injekt.get(), // SY <-- ) : ViewModel() { @@ -189,8 +189,9 @@ class ReaderViewModel @JvmOverloads constructor( // SY --> val (chapters, mangaMap) = runBlocking { if (manga.source == MERGED_SOURCE_ID) { - getMergedChaptersByMangaId.await(manga.id, applyScanlatorFilter = true) to getMergedMangaById.await(manga.id) - .associateBy { it.id } + getMergedChaptersByMangaId.await(manga.id, applyScanlatorFilter = true) to + getMergedMangaById.await(manga.id) + .associateBy { it.id } } else { getChaptersByMangaId.await(manga.id, applyScanlatorFilter = true) to null } @@ -701,7 +702,7 @@ class ReaderViewModel @JvmOverloads constructor( // SY --> if (readerChapter.chapter.chapter_number > 0 && readerPreferences.markReadDupe().get()) { getChaptersByMangaId.await(manga!!.id).sortedByDescending { it.sourceOrder } - .filter { + .filter { it.id != readerChapter.chapter.id && !it.read && it.chapterNumber.toFloat() == readerChapter.chapter.chapter_number @@ -709,7 +710,7 @@ class ReaderViewModel @JvmOverloads constructor( .ifEmpty { null } ?.also { setReadStatus.await(true, *it.toTypedArray()) - it.forEach { chapter -> + it.forEach { chapter -> deleteChapterIfNeeded(ReaderChapter(chapter)) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt index 3c60b1a02..1b15d8ea9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt @@ -62,9 +62,11 @@ class ChapterLoader( // If the chapter is partially read, set the starting page to the last the user read // otherwise use the requested page. - if (!chapter.chapter.read /* --> EH */ || readerPrefs + if (!chapter.chapter.read /* --> EH */ || + readerPrefs .preserveReadingPosition() - .get() || page != null // <-- EH + .get() || + page != null // <-- EH ) { chapter.requestedPage = /* SY --> */ page ?: /* SY <-- */ chapter.chapter.last_page_read } 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 8c6e4f1ef..5bace4ac8 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 @@ -191,7 +191,7 @@ class ReaderPreferences( enum class FlashColor { BLACK, WHITE, - WHITE_BLACK + WHITE_BLACK, } enum class TappingInvertMode( @@ -285,7 +285,7 @@ class ReaderPreferences( val archiveModeTypes = listOf( SYMR.strings.archive_mode_load_from_file, SYMR.strings.archive_mode_load_into_memory, - SYMR.strings.archive_mode_cache_to_disk + SYMR.strings.archive_mode_cache_to_disk, ) // SY <-- } 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 87311c2af..1041a6232 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 @@ -116,7 +116,12 @@ open class ReaderPageImageView @JvmOverloads constructor( } private fun SubsamplingScaleImageView.landscapeZoom(forward: Boolean) { - if (config != null && config!!.landscapeZoom && config!!.minimumScaleType == SCALE_TYPE_CENTER_INSIDE && sWidth > sHeight && scale == minScale) { + if (config != null && + config!!.landscapeZoom && + config!!.minimumScaleType == SCALE_TYPE_CENTER_INSIDE && + sWidth > sHeight && + scale == minScale + ) { handler?.postDelayed(500) { val point = when (config!!.zoomStartPosition) { ZoomStartPosition.LEFT -> if (forward) PointF(0F, 0F) else PointF(sWidth.toFloat(), 0F) @@ -398,7 +403,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/ReaderTransitionView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderTransitionView.kt index cb296c80c..9551feca4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderTransitionView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderTransitionView.kt @@ -32,15 +32,16 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At Data( transition = transition, currChapterDownloaded = transition.from.pageLoader?.isLocal == true, - goingToChapterDownloaded = manga.isLocal() || transition.to?.chapter?.let { goingToChapter -> - downloadManager.isChapterDownloaded( - chapterName = goingToChapter.name, - chapterScanlator = goingToChapter.scanlator, - mangaTitle = /* SY --> */ manga.ogTitle, /* SY <-- */ - sourceId = manga.source, - skipCache = true, - ) - } ?: false, + goingToChapterDownloaded = manga.isLocal() || + transition.to?.chapter?.let { goingToChapter -> + downloadManager.isChapterDownloaded( + chapterName = goingToChapter.name, + chapterScanlator = goingToChapter.scanlator, + mangaTitle = /* SY --> */ manga.ogTitle, /* SY <-- */ + sourceId = manga.source, + skipCache = true, + ) + } ?: false, ) } else { null diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt index 480fa12ad..e669e4471 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt @@ -57,7 +57,8 @@ class PagerConfig( var shiftDoublePage = false - var doublePages = readerPreferences.pageLayout().get() == PageLayout.DOUBLE_PAGES && !readerPreferences.dualPageSplitPaged().get() + var doublePages = + readerPreferences.pageLayout().get() == PageLayout.DOUBLE_PAGES && !readerPreferences.dualPageSplitPaged().get() set(value) { field = value if (!value) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt index 273200fce..8afdcd046 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerPageHolder.kt @@ -310,9 +310,9 @@ class PagerPageHolder( private fun handleWideImage(imageSource: BufferedSource): BufferedSource { return if ( !ImageUtil.isAnimatedAndSupported(imageSource) && - ImageUtil.isWideImage(imageSource) && - viewer.config.centerMarginType and PagerConfig.CenterMarginType.WIDE_PAGE_CENTER_MARGIN > 0 && - !viewer.config.imageCropBorders + ImageUtil.isWideImage(imageSource) && + viewer.config.centerMarginType and PagerConfig.CenterMarginType.WIDE_PAGE_CENTER_MARGIN > 0 && + !viewer.config.imageCropBorders ) { ImageUtil.addHorizontalCenterMargin(imageSource, height, context) } else { @@ -330,7 +330,9 @@ class PagerPageHolder( } private fun calculateCenterMargin(height: Int, height2: Int): Int { - return if (viewer.config.centerMarginType and PagerConfig.CenterMarginType.DOUBLE_PAGE_CENTER_MARGIN > 0 && !viewer.config.imageCropBorders) { + return if (viewer.config.centerMarginType and PagerConfig.CenterMarginType.DOUBLE_PAGE_CENTER_MARGIN > 0 && + !viewer.config.imageCropBorders + ) { 96 / (this.height.coerceAtLeast(1) / max(height, height2).coerceAtLeast(1)).coerceAtLeast(1) } else { 0 @@ -373,8 +375,10 @@ class PagerPageHolder( } } - val sideMargin = if ((viewer.config.centerMarginType and PagerConfig.CenterMarginType.DOUBLE_PAGE_CENTER_MARGIN) > 0 && - viewer.config.doublePages && !viewer.config.imageCropBorders + val sideMargin = if ((viewer.config.centerMarginType and PagerConfig.CenterMarginType.DOUBLE_PAGE_CENTER_MARGIN) > + 0 && + viewer.config.doublePages && + !viewer.config.imageCropBorders ) { 48 } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt index 1b9db50de..0d95f4c17 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt @@ -291,7 +291,9 @@ abstract class PagerViewer(val activity: ReaderActivity) : Viewer { * Sets the active [chapters] on this pager. */ private fun setChaptersInternal(chapters: ViewerChapters) { - val forceTransition = config.alwaysShowChapterTransition || adapter.joinedItems.getOrNull(pager.currentItem)?.first is ChapterTransition + val forceTransition = + config.alwaysShowChapterTransition || + adapter.joinedItems.getOrNull(pager.currentItem)?.first is ChapterTransition adapter.setChapters(chapters, forceTransition) // Layout the pager once a chapter is being set 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 8f63d1563..a21ddfbd5 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 @@ -109,7 +109,9 @@ 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) @@ -248,7 +250,9 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { subItems.forEach { readerItem -> when (readerItem) { is ReaderPage -> { - if (pagedItems.last().isNotEmpty() && pagedItems.last().last()?.chapter?.chapter?.id != readerItem.chapter.chapter.id) { + if (pagedItems.last().isNotEmpty() && + pagedItems.last().last()?.chapter?.chapter?.id != readerItem.chapter.chapter.id + ) { pagedItems.add(mutableListOf()) } pagedItems.last().add(readerItem) @@ -298,9 +302,10 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { // Add a 'blank' page after each full page. It will be used when chunked to solo a page items.add(itemIndex + 1, null) if ( - currentItem.fullPage && itemIndex > 0 && - items[itemIndex - 1] != null && - (itemIndex - 1) % 2 == 0 + currentItem.fullPage && + itemIndex > 0 && + items[itemIndex - 1] != null && + (itemIndex - 1) % 2 == 0 ) { // If a page is a full page, check if the previous page needs to be isolated // we should check if it's an even or odd page, since even pages need shifting @@ -340,7 +345,8 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { // We will however shift to the first page of the new chapter if the last page we were are // on is not in the new chapter that has loaded val newPage = when { - oldCurrent?.first is ReaderPage && (oldCurrent.first as ReaderPage).chapter != currentChapter && + oldCurrent?.first is ReaderPage && + (oldCurrent.first as ReaderPage).chapter != currentChapter && (oldCurrent.second as? ChapterTransition)?.from != currentChapter -> subItems.find { it is ReaderPage && it.chapter == currentChapter } useSecondPage -> oldCurrent?.second ?: oldCurrent?.first @@ -349,7 +355,10 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { val index = when (newPage) { is ChapterTransition -> { - val filteredPages = joinedItems.filter { it.first is ReaderPage && (it.first as ReaderPage).chapter == newPage.to } + val filteredPages = joinedItems.filter { + it.first is ReaderPage && + (it.first as ReaderPage).chapter == newPage.to + } val page = if (newPage is ChapterTransition.Next) { filteredPages.minByOrNull { (it.first as ReaderPage).index }?.first } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt index b0b0d8547..e56148e35 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt @@ -89,7 +89,7 @@ class WebtoonConfig( readerPreferences.webtoonDisableZoomOut() .register( { zoomOutDisabled = it }, - { zoomPropertyChangedListener?.invoke(it) } + { zoomPropertyChangedListener?.invoke(it) }, ) readerPreferences.webtoonDoubleTapZoomEnabled() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt index 914b732a0..efb68efe0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt @@ -199,7 +199,9 @@ class WebtoonPageHolder( ReaderPageImageView.Config( zoomDuration = viewer.config.doubleTapAnimDuration, minimumScaleType = SubsamplingScaleImageView.SCALE_TYPE_FIT_WIDTH, - cropBorders = (viewer.config.imageCropBorders && viewer.isContinuous) || (viewer.config.continuousCropBorders && !viewer.isContinuous), + cropBorders = + (viewer.config.imageCropBorders && viewer.isContinuous) || + (viewer.config.continuousCropBorders && !viewer.isContinuous), ), ) removeErrorLayout() 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 fe232fe87..95cef7345 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 @@ -182,7 +182,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 d936e3bf2..31b63b953 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 @@ -87,7 +87,7 @@ class WebtoonViewer( .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 @@ -404,4 +404,4 @@ class WebtoonViewer( } // Double the cache size to reduce rebinds/recycles incurred by the extra layout space on scroll direction changes -private val RecyclerViewCacheSize = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 4 else 2 +private val RECYCLER_VIEW_CACHE_SIZE = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 4 else 2 diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ChildFirstPathClassLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ChildFirstPathClassLoader.kt index b63dfd032..0823e765d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ChildFirstPathClassLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ChildFirstPathClassLoader.kt @@ -15,7 +15,7 @@ import java.util.Enumeration class ChildFirstPathClassLoader( dexPath: String, librarySearchPath: String?, - parent: ClassLoader + parent: ClassLoader, ) : PathClassLoader(dexPath, librarySearchPath, parent) { private val systemClassLoader: ClassLoader? = getSystemClassLoader() diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/NotificationExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/NotificationExtensions.kt index 8038f6115..a1942a73e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/NotificationExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/NotificationExtensions.kt @@ -23,7 +23,10 @@ fun Context.notify(id: Int, channelId: String, block: (NotificationCompat.Builde } fun Context.notify(id: Int, notification: Notification) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && PermissionChecker.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PermissionChecker.PERMISSION_GRANTED) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + PermissionChecker.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != + PermissionChecker.PERMISSION_GRANTED + ) { return } @@ -31,7 +34,10 @@ fun Context.notify(id: Int, notification: Notification) { } fun Context.notify(notificationWithIdAndTags: List) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && PermissionChecker.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PermissionChecker.PERMISSION_GRANTED) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + PermissionChecker.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != + PermissionChecker.PERMISSION_GRANTED + ) { return } diff --git a/app/src/main/java/exh/GalleryAdder.kt b/app/src/main/java/exh/GalleryAdder.kt index 26e5db978..1f035ecb5 100755 --- a/app/src/main/java/exh/GalleryAdder.kt +++ b/app/src/main/java/exh/GalleryAdder.kt @@ -46,11 +46,13 @@ class GalleryAdder( return sourceManager.getVisibleCatalogueSources() .mapNotNull { it.getMainSource() } .filter { - it.lang in filters.enabledLangs && it.id !in filters.disabledSources && try { - it.matchesUri(uri) - } catch (e: Exception) { - false - } + it.lang in filters.enabledLangs && + it.id !in filters.disabledSources && + try { + it.matchesUri(uri) + } catch (e: Exception) { + false + } } } @@ -82,11 +84,13 @@ class GalleryAdder( sourceManager.getVisibleCatalogueSources() .mapNotNull { it.getMainSource() } .find { - it.lang in filters.enabledLangs && it.id !in filters.disabledSources && try { - it.matchesUri(uri) - } catch (e: Exception) { - false - } + it.lang in filters.enabledLangs && + it.id !in filters.disabledSources && + try { + it.matchesUri(uri) + } catch (e: Exception) { + false + } } ?: return GalleryAddEvent.Fail.UnknownSource(url, context) } diff --git a/app/src/main/java/exh/assets/__EhAssets.kt b/app/src/main/java/exh/assets/__EhAssets.kt index 535a752c2..3bd8e16bd 100644 --- a/app/src/main/java/exh/assets/__EhAssets.kt +++ b/app/src/main/java/exh/assets/__EhAssets.kt @@ -9,6 +9,7 @@ import kotlin.collections.List as ____KtList public object EhAssets +@Suppress("ObjectPropertyName", "ktlint:standard:backing-property-naming") private var __AllAssets: ____KtList? = null public val EhAssets.AllAssets: ____KtList diff --git a/app/src/main/java/exh/assets/ehassets/EhLogo.kt b/app/src/main/java/exh/assets/ehassets/EhLogo.kt index df086854a..308486da1 100644 --- a/app/src/main/java/exh/assets/ehassets/EhLogo.kt +++ b/app/src/main/java/exh/assets/ehassets/EhLogo.kt @@ -165,4 +165,5 @@ public val EhAssets.EhLogo: ImageVector return _ehLogo!! } +@Suppress("ObjectPropertyName", "ktlint:standard:backing-property-naming") private var _ehLogo: ImageVector? = null diff --git a/app/src/main/java/exh/assets/ehassets/MangadexLogo.kt b/app/src/main/java/exh/assets/ehassets/MangadexLogo.kt index 4b8af95cd..875c61b02 100644 --- a/app/src/main/java/exh/assets/ehassets/MangadexLogo.kt +++ b/app/src/main/java/exh/assets/ehassets/MangadexLogo.kt @@ -427,4 +427,5 @@ public val EhAssets.MangadexLogo: ImageVector return _mangadexLogo!! } +@Suppress("ObjectPropertyName", "ktlint:standard:backing-property-naming") private var _mangadexLogo: ImageVector? = null diff --git a/app/src/main/java/exh/assets/ehassets/__Exh.kt b/app/src/main/java/exh/assets/ehassets/__Exh.kt index 63b7cb6b5..0e06e5155 100644 --- a/app/src/main/java/exh/assets/ehassets/__Exh.kt +++ b/app/src/main/java/exh/assets/ehassets/__Exh.kt @@ -11,6 +11,7 @@ public object ExhGroup public val EhAssets.Exh: ExhGroup get() = ExhGroup +@Suppress("ObjectPropertyName", "ktlint:standard:backing-property-naming") private var __AllAssets: ____KtList? = null public val ExhGroup.AllAssets: ____KtList diff --git a/app/src/main/java/exh/assets/ehassets/exh/__Assets.kt b/app/src/main/java/exh/assets/ehassets/exh/__Assets.kt index 063319c91..5d2144bd3 100644 --- a/app/src/main/java/exh/assets/ehassets/exh/__Assets.kt +++ b/app/src/main/java/exh/assets/ehassets/exh/__Assets.kt @@ -11,6 +11,7 @@ public object AssetsGroup public val ExhGroup.Assets: AssetsGroup get() = AssetsGroup +@Suppress("ObjectPropertyName", "ktlint:standard:backing-property-naming") private var __AllAssets: ____KtList? = null public val AssetsGroup.AllAssets: ____KtList diff --git a/app/src/main/java/exh/assets/ehassets/exh/assets/__Ehassets.kt b/app/src/main/java/exh/assets/ehassets/exh/assets/__Ehassets.kt index 80520f242..add65ef3e 100644 --- a/app/src/main/java/exh/assets/ehassets/exh/assets/__Ehassets.kt +++ b/app/src/main/java/exh/assets/ehassets/exh/assets/__Ehassets.kt @@ -9,6 +9,7 @@ public object EhassetsGroup public val AssetsGroup.Ehassets: EhassetsGroup get() = EhassetsGroup +@Suppress("ObjectPropertyName", "ktlint:standard:backing-property-naming") private var __AllAssets: ____KtList? = null public val EhassetsGroup.AllAssets: ____KtList diff --git a/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt b/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt index e9a3908ca..c8dfb4461 100644 --- a/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt +++ b/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt @@ -88,7 +88,12 @@ class EHentaiUpdateWorker(private val context: Context, workerParams: WorkerPara val raisedMeta = meta.raise() // Don't update galleries too frequently - if (raisedMeta.aged || (curTime - raisedMeta.lastUpdateCheck < MIN_BACKGROUND_UPDATE_FREQ && DebugToggles.RESTRICT_EXH_GALLERY_UPDATE_CHECK_FREQUENCY.enabled)) { + if (raisedMeta.aged || + ( + curTime - raisedMeta.lastUpdateCheck < MIN_BACKGROUND_UPDATE_FREQ && + DebugToggles.RESTRICT_EXH_GALLERY_UPDATE_CHECK_FREQUENCY.enabled + ) + ) { return@mapNotNull null } diff --git a/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt b/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt index 906e04b05..6b4c4cc33 100644 --- a/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt +++ b/app/src/main/java/exh/favorites/FavoritesSyncHelper.kt @@ -96,7 +96,8 @@ class FavoritesSyncHelper(val context: Context) { } // Validate library state - status.value = FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_verifying_library)) + status.value = + FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_verifying_library)) val libraryManga = getLibraryManga.await() val seenManga = HashSet(libraryManga.size) libraryManga.forEach { (manga) -> @@ -116,10 +117,12 @@ class FavoritesSyncHelper(val context: Context) { // Download remote favorites val favorites = try { - status.value = FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_downloading)) + status.value = + FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_downloading)) exh.fetchFavorites() } catch (e: Exception) { - status.value = FavoritesSyncStatus.Error(context.stringResource(SYMR.strings.favorites_sync_failed_to_featch)) + status.value = + FavoritesSyncStatus.Error(context.stringResource(SYMR.strings.favorites_sync_failed_to_featch)) logger.e(context.stringResource(SYMR.strings.favorites_sync_could_not_fetch), e) return } @@ -179,7 +182,8 @@ class FavoritesSyncHelper(val context: Context) { applyChangeSetToRemote(errorList, localChanges) } - status.value = FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_cleaning_up)) + status.value = + FavoritesSyncStatus.Processing(context.stringResource(SYMR.strings.favorites_sync_cleaning_up)) storage.snapshotEntries() withUIContext { diff --git a/app/src/main/java/exh/favorites/LocalFavoritesStorage.kt b/app/src/main/java/exh/favorites/LocalFavoritesStorage.kt index 59fc816db..652e39980 100644 --- a/app/src/main/java/exh/favorites/LocalFavoritesStorage.kt +++ b/app/src/main/java/exh/favorites/LocalFavoritesStorage.kt @@ -88,7 +88,14 @@ class LocalFavoritesStorage( private fun FavoriteEntry.urlEquals(other: FavoriteEntry) = (gid == other.gid && token == other.token) || (otherGid != null && otherToken != null && (otherGid == other.gid && otherToken == other.token)) || (other.otherGid != null && other.otherToken != null && (gid == other.otherGid && token == other.otherToken)) || - (otherGid != null && otherToken != null && other.otherGid != null && other.otherToken != null && otherGid == other.otherGid && otherToken == other.otherToken) + ( + otherGid != null && + otherToken != null && + other.otherGid != null && + other.otherToken != null && + otherGid == other.otherGid && + otherToken == other.otherToken + ) private fun queryListForEntry(list: List, entry: FavoriteEntry) = list.find { it.urlEquals(entry) && it.category == entry.category } diff --git a/app/src/main/java/exh/log/EnhancedFilePrinter.kt b/app/src/main/java/exh/log/EnhancedFilePrinter.kt index bf960ed29..ab4deb6fa 100644 --- a/app/src/main/java/exh/log/EnhancedFilePrinter.kt +++ b/app/src/main/java/exh/log/EnhancedFilePrinter.kt @@ -60,7 +60,14 @@ class EnhancedFilePrinter internal constructor( val lastFileName = writer.lastFileName if (fileNameGenerator.isFileNameChangeable) { val newFileName = fileNameGenerator.generateFileName(logLevel, System.currentTimeMillis()) - require(!(newFileName == null || newFileName.trim { it <= ' ' }.isEmpty())) { "File name should not be empty." } + require( + !( + newFileName == null || + newFileName.trim { + it <= ' ' + }.isEmpty() + ), + ) { "File name should not be empty." } if (newFileName != lastFileName) { if (writer.isOpened) { writer.close() diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index 9a2aa6f42..a3adc97b7 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -115,7 +115,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { dialog.duplicate.id, dialog.manga.id, ) - } + }, ) } is BrowseSourceScreenModel.Dialog.RemoveManga -> { diff --git a/app/src/main/java/exh/md/handlers/ApiMangaParser.kt b/app/src/main/java/exh/md/handlers/ApiMangaParser.kt index 6b7631551..6b3ebe646 100644 --- a/app/src/main/java/exh/md/handlers/ApiMangaParser.kt +++ b/app/src/main/java/exh/md/handlers/ApiMangaParser.kt @@ -131,10 +131,14 @@ class ApiMangaParser( // things that will go with the genre tags but aren't actually genre val nonGenres = listOfNotNull( mangaAttributesDto.publicationDemographic - ?.let { RaisedTag("Demographic", it.capitalize(Locale.US), MangaDexSearchMetadata.TAG_TYPE_DEFAULT) }, + ?.let { + RaisedTag("Demographic", it.capitalize(Locale.US), MangaDexSearchMetadata.TAG_TYPE_DEFAULT) + }, mangaAttributesDto.contentRating ?.takeUnless { it == "safe" } - ?.let { RaisedTag("Content Rating", it.capitalize(Locale.US), MangaDexSearchMetadata.TAG_TYPE_DEFAULT) }, + ?.let { + RaisedTag("Content Rating", it.capitalize(Locale.US), MangaDexSearchMetadata.TAG_TYPE_DEFAULT) + }, ) val genres = nonGenres + mangaAttributesDto.tags diff --git a/app/src/main/java/exh/md/handlers/NamicomiHandler.kt b/app/src/main/java/exh/md/handlers/NamicomiHandler.kt index 41e098cf4..d8b6c2469 100644 --- a/app/src/main/java/exh/md/handlers/NamicomiHandler.kt +++ b/app/src/main/java/exh/md/handlers/NamicomiHandler.kt @@ -36,7 +36,7 @@ class NamicomiHandler(currentClient: OkHttpClient, userAgent: String) { val hash = data.jsonObject["hash"]!!.jsonPrimitive.content /* Available quality levels: source, high, medium, low */ - val quality = if(dataSaver) "low" else "high" + val quality = if (dataSaver) "low" else "high" return data .jsonObject[quality]!! diff --git a/app/src/main/java/exh/md/utils/MdUtil.kt b/app/src/main/java/exh/md/utils/MdUtil.kt index 40aa8360f..e8fccd264 100644 --- a/app/src/main/java/exh/md/utils/MdUtil.kt +++ b/app/src/main/java/exh/md/utils/MdUtil.kt @@ -15,7 +15,6 @@ import exh.source.getMainSource import exh.util.dropBlank import exh.util.floor import exh.util.nullIfZero -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import okhttp3.FormBody diff --git a/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt b/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt index 952a8d307..0e09a35d1 100644 --- a/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt +++ b/app/src/main/java/exh/ui/metadata/MetadataViewScreen.kt @@ -50,7 +50,11 @@ class MetadataViewScreen(private val mangaId: Long, private val sourceId: Long) ) }, ) { paddingValues -> - when (@Suppress("NAME_SHADOWING") val state = state) { + when + ( + @Suppress("NAME_SHADOWING") + val state = state + ) { MetadataViewState.Loading -> LoadingScreen() MetadataViewState.MetadataNotFound -> EmptyScreen(MR.strings.no_results_found) MetadataViewState.SourceNotFound -> EmptyScreen(MR.strings.source_empty_screen) @@ -58,7 +62,8 @@ class MetadataViewScreen(private val mangaId: Long, private val sourceId: Long) val context = LocalContext.current val items = remember(state.meta) { state.meta.getExtraInfoPairs(context) } ScrollbarLazyColumn( - contentPadding = paddingValues + WindowInsets.navigationBars.asPaddingValues() + topSmallPaddingValues, + contentPadding = + paddingValues + WindowInsets.navigationBars.asPaddingValues() + topSmallPaddingValues, ) { items(items) { (title, text) -> Row( diff --git a/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt index 49d62ac6b..d7d13e5e4 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/EHentaiDescriptionAdapter.kt @@ -41,7 +41,11 @@ fun EHentaiDescription(state: State.Success, openMetadataViewer: () -> Unit, sea ?: meta.genre ?: context.stringResource(MR.strings.unknown) - binding.visible.text = context.stringResource(SYMR.strings.is_visible, meta.visible ?: context.stringResource(MR.strings.unknown)) + binding.visible.text = + context.stringResource( + SYMR.strings.is_visible, + meta.visible ?: context.stringResource(MR.strings.unknown), + ) binding.favorites.text = (meta.favorites ?: 0).toString() binding.favorites.bindDrawable(context, R.drawable.ic_book_24dp) @@ -65,7 +69,8 @@ fun EHentaiDescription(state: State.Success, openMetadataViewer: () -> Unit, sea val ratingFloat = meta.averageRating?.toFloat() binding.ratingBar.rating = ratingFloat ?: 0F @SuppressLint("SetTextI18n") - binding.rating.text = (ratingFloat ?: 0F).toString() + " - " + MetadataUIUtil.getRatingString(context, ratingFloat?.times(2)) + binding.rating.text = + (ratingFloat ?: 0F).toString() + " - " + MetadataUIUtil.getRatingString(context, ratingFloat?.times(2)) binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp) diff --git a/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt index 5ed4fee59..7f9a8f32d 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/HBrowseDescriptionAdapter.kt @@ -28,7 +28,8 @@ fun HBrowseDescription(state: State.Success, openMetadataViewer: () -> Unit) { if (meta == null || meta !is HBrowseSearchMetadata) return@AndroidView val binding = DescriptionAdapterHbBinding.bind(it) - binding.pages.text = context.pluralStringResource(SYMR.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) + binding.pages.text = + context.pluralStringResource(SYMR.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24) binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp) diff --git a/app/src/main/java/exh/ui/metadata/adapters/MangaDexDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/MangaDexDescriptionAdapter.kt index 34b00a2c3..779f8bce5 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/MangaDexDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/MangaDexDescriptionAdapter.kt @@ -34,7 +34,8 @@ fun MangaDexDescription(state: State.Success, openMetadataViewer: () -> Unit) { val ratingFloat = meta.rating binding.ratingBar.rating = ratingFloat?.div(2F) ?: 0F @SuppressLint("SetTextI18n") - binding.rating.text = (round((ratingFloat ?: 0F) * 100.0) / 100.0).toString() + " - " + getRatingString(context, ratingFloat) + binding.rating.text = + (round((ratingFloat ?: 0F) * 100.0) / 100.0).toString() + " - " + getRatingString(context, ratingFloat) binding.rating.isVisible = ratingFloat != null binding.ratingBar.isVisible = ratingFloat != null diff --git a/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt index 17d635663..5b9db6bf6 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/NHentaiDescriptionAdapter.kt @@ -55,7 +55,7 @@ fun NHentaiDescription(state: State.Success, openMetadataViewer: () -> Unit) { binding.whenPosted.text = MetadataUtil.EX_DATE_FORMAT .format( ZonedDateTime - .ofInstant(Instant.ofEpochSecond(meta.uploadDate ?: 0), ZoneId.systemDefault()) + .ofInstant(Instant.ofEpochSecond(meta.uploadDate ?: 0), ZoneId.systemDefault()), ) binding.pages.text = context.pluralStringResource( diff --git a/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt index b2591e793..a393d1305 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/PururinDescriptionAdapter.kt @@ -32,12 +32,13 @@ fun PururinDescription(state: State.Success, openMetadataViewer: () -> Unit) { if (meta == null || meta !is PururinSearchMetadata) return@AndroidView val binding = DescriptionAdapterPuBinding.bind(it) - binding.genre.text = meta.tags.find { it.namespace == PururinSearchMetadata.TAG_NAMESPACE_CATEGORY }.let { genre -> - genre?.let { MetadataUIUtil.getGenreAndColour(context, it.name) }?.let { - binding.genre.setBackgroundColor(it.first) - it.second - } ?: genre?.name ?: context.stringResource(MR.strings.unknown) - } + binding.genre.text = + meta.tags.find { it.namespace == PururinSearchMetadata.TAG_NAMESPACE_CATEGORY }.let { genre -> + genre?.let { MetadataUIUtil.getGenreAndColour(context, it.name) }?.let { + binding.genre.setBackgroundColor(it.first) + it.second + } ?: genre?.name ?: context.stringResource(MR.strings.unknown) + } binding.uploader.text = meta.uploaderDisp ?: meta.uploader.orEmpty() @@ -50,7 +51,9 @@ fun PururinDescription(state: State.Success, openMetadataViewer: () -> Unit) { val ratingFloat = meta.averageRating?.toFloat() binding.ratingBar.rating = ratingFloat ?: 0F @SuppressLint("SetTextI18n") - binding.rating.text = (round((ratingFloat ?: 0F) * 100.0) / 100.0).toString() + " - " + MetadataUIUtil.getRatingString(context, ratingFloat?.times(2)) + binding.rating.text = + (round((ratingFloat ?: 0F) * 100.0) / 100.0).toString() + " - " + + MetadataUIUtil.getRatingString(context, ratingFloat?.times(2)) binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp) diff --git a/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt index d618861b6..19d8bbb40 100644 --- a/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt +++ b/app/src/main/java/exh/ui/metadata/adapters/TsuminoDescriptionAdapter.kt @@ -45,12 +45,15 @@ fun TsuminoDescription(state: State.Success, openMetadataViewer: () -> Unit) { binding.uploader.text = meta.uploader ?: context.stringResource(MR.strings.unknown) - binding.pages.text = context.pluralStringResource(SYMR.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) + binding.pages.text = + context.pluralStringResource(SYMR.plurals.num_pages, meta.length ?: 0, meta.length ?: 0) binding.pages.bindDrawable(context, R.drawable.ic_baseline_menu_book_24) binding.ratingBar.rating = meta.averageRating ?: 0F @SuppressLint("SetTextI18n") - binding.rating.text = (round((meta.averageRating ?: 0F) * 100.0) / 100.0).toString() + " - " + MetadataUIUtil.getRatingString(context, meta.averageRating?.times(2)) + binding.rating.text = + (round((meta.averageRating ?: 0F) * 100.0) / 100.0).toString() + " - " + + MetadataUIUtil.getRatingString(context, meta.averageRating?.times(2)) binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp) diff --git a/app/src/main/java/exh/util/DataSaver.kt b/app/src/main/java/exh/util/DataSaver.kt index f866f142e..9fa098c02 100644 --- a/app/src/main/java/exh/util/DataSaver.kt +++ b/app/src/main/java/exh/util/DataSaver.kt @@ -92,20 +92,21 @@ private class WsrvNlDataSaver(preferences: SourcePreferences) : DataSaver { private fun getUrl(imageUrl: String): String { // Network Request sent to wsrv - return "https://wsrv.nl/?url=$imageUrl" + if (imageUrl.contains(".webp", true) || imageUrl.contains(".gif", true)) { - if (!format) { - // Preserve output image extension for animated images(.webp and .gif) - "&q=$quality&n=-1" + return "https://wsrv.nl/?url=$imageUrl" + + if (imageUrl.contains(".webp", true) || imageUrl.contains(".gif", true)) { + if (!format) { + // Preserve output image extension for animated images(.webp and .gif) + "&q=$quality&n=-1" + } else { + // Do not preserve output Extension if User asked to convert into Jpeg + "&output=jpg&q=$quality&n=-1" + } } else { - // Do not preserve output Extension if User asked to convert into Jpeg - "&output=jpg&q=$quality&n=-1" + if (format) { + "&output=jpg&q=$quality" + } else { + "&output=webp&q=$quality" + } } - } else { - if (format) { - "&output=jpg&q=$quality" - } else { - "&output=webp&q=$quality" - } - } } } diff --git a/app/src/main/java/exh/util/ExceptionUtil.kt b/app/src/main/java/exh/util/ExceptionUtil.kt index 3b73328a3..7e1e18c44 100644 --- a/app/src/main/java/exh/util/ExceptionUtil.kt +++ b/app/src/main/java/exh/util/ExceptionUtil.kt @@ -1,7 +1,11 @@ package exh.util inline fun ignore(expr: () -> T): T? { - return try { expr() } catch (t: Throwable) { null } + return try { + expr() + } catch (t: Throwable) { + null + } } fun T.withRootCause(cause: Throwable): T { diff --git a/app/src/main/java/mihon/core/migration/MigrateUtils.kt b/app/src/main/java/mihon/core/migration/MigrateUtils.kt index 951c4d01c..d3e6592cd 100644 --- a/app/src/main/java/mihon/core/migration/MigrateUtils.kt +++ b/app/src/main/java/mihon/core/migration/MigrateUtils.kt @@ -50,4 +50,3 @@ object MigrateUtils { } } } - diff --git a/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt b/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt index 801411013..cfb8db2b6 100644 --- a/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt +++ b/app/src/main/java/mihon/core/migration/MigrationJobFactory.kt @@ -9,21 +9,24 @@ import tachiyomi.core.common.util.system.logcat class MigrationJobFactory( private val migrationContext: MigrationContext, - private val scope: CoroutineScope + 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 -> 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 9fd5f4f91..8033ebc6d 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 2296aa074..c01a3873e 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/core/migration/migrations/MergedMangaRewriteMigration.kt b/app/src/main/java/mihon/core/migration/migrations/MergedMangaRewriteMigration.kt index 983bbe347..6c33d74d7 100644 --- a/app/src/main/java/mihon/core/migration/migrations/MergedMangaRewriteMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/MergedMangaRewriteMigration.kt @@ -134,7 +134,6 @@ class MergedMangaRewriteMigration : Migration { return@withIOContext true } - @Serializable private data class UrlConfig( @SerialName("s") diff --git a/app/src/main/java/mihon/core/migration/migrations/MoveEncryptionSettingsToAppStateMigration.kt b/app/src/main/java/mihon/core/migration/migrations/MoveEncryptionSettingsToAppStateMigration.kt index 1cbaa4a59..c27434c11 100644 --- a/app/src/main/java/mihon/core/migration/migrations/MoveEncryptionSettingsToAppStateMigration.kt +++ b/app/src/main/java/mihon/core/migration/migrations/MoveEncryptionSettingsToAppStateMigration.kt @@ -23,7 +23,7 @@ class MoveEncryptionSettingsToAppStateMigration : Migration { withUIContext { context.toast( "Restart the app to load your encrypted library", - Toast.LENGTH_LONG + Toast.LENGTH_LONG, ) } } 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 da511ddad..6b32c7f89 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 46ed355ab..3a8f3e6fb 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 55498ebb9..f5dbf5c48 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 9aaca69de..f9e223107 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/drawable-hdpi/ic_book_open_variant_24dp.xml b/app/src/main/res/drawable-hdpi/ic_book_open_variant_24dp.xml index 071e043e1..b371fd389 100644 --- a/app/src/main/res/drawable-hdpi/ic_book_open_variant_24dp.xml +++ b/app/src/main/res/drawable-hdpi/ic_book_open_variant_24dp.xml @@ -6,4 +6,4 @@ android:viewportHeight="24" android:tint="@android:color/black"> - \ No newline at end of file + diff --git a/app/src/main/res/drawable-hdpi/ic_page_next_outline_24dp.xml b/app/src/main/res/drawable-hdpi/ic_page_next_outline_24dp.xml index 930be5ded..8c8479dd9 100644 --- a/app/src/main/res/drawable-hdpi/ic_page_next_outline_24dp.xml +++ b/app/src/main/res/drawable-hdpi/ic_page_next_outline_24dp.xml @@ -6,4 +6,4 @@ android:viewportWidth="24" android:viewportHeight="24"> - \ 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 581a59914..572c2f06d 100755 --- 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_progress_clock_24dp.xml b/app/src/main/res/drawable/ic_progress_clock_24dp.xml index a0f4b9cc0..619d53a14 100644 --- a/app/src/main/res/drawable/ic_progress_clock_24dp.xml +++ b/app/src/main/res/drawable/ic_progress_clock_24dp.xml @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/drawable/ic_ungroup_24dp.xml b/app/src/main/res/drawable/ic_ungroup_24dp.xml index 8ac8c7a22..1df68e98c 100644 --- a/app/src/main/res/drawable/ic_ungroup_24dp.xml +++ b/app/src/main/res/drawable/ic_ungroup_24dp.xml @@ -5,4 +5,4 @@ android:viewportWidth="24" android:viewportHeight="24"> - \ 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 09987c415..29bb97167 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/layout/description_adapter_8m.xml b/app/src/main/res/layout/description_adapter_8m.xml index 9f30ebe3d..714714718 100644 --- a/app/src/main/res/layout/description_adapter_8m.xml +++ b/app/src/main/res/layout/description_adapter_8m.xml @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/description_adapter_eh.xml b/app/src/main/res/layout/description_adapter_eh.xml index e39719a70..75583a471 100644 --- a/app/src/main/res/layout/description_adapter_eh.xml +++ b/app/src/main/res/layout/description_adapter_eh.xml @@ -156,4 +156,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/description_adapter_hb.xml b/app/src/main/res/layout/description_adapter_hb.xml index d3d2cc50f..3bd308295 100644 --- a/app/src/main/res/layout/description_adapter_hb.xml +++ b/app/src/main/res/layout/description_adapter_hb.xml @@ -25,4 +25,4 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/description_adapter_md.xml b/app/src/main/res/layout/description_adapter_md.xml index 17b072ede..773324a74 100644 --- a/app/src/main/res/layout/description_adapter_md.xml +++ b/app/src/main/res/layout/description_adapter_md.xml @@ -44,4 +44,4 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/description_adapter_nh.xml b/app/src/main/res/layout/description_adapter_nh.xml index 9f4852eb3..ddedef006 100644 --- a/app/src/main/res/layout/description_adapter_nh.xml +++ b/app/src/main/res/layout/description_adapter_nh.xml @@ -94,4 +94,4 @@ app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/description_adapter_pu.xml b/app/src/main/res/layout/description_adapter_pu.xml index a43cc67e8..c5a592da8 100644 --- a/app/src/main/res/layout/description_adapter_pu.xml +++ b/app/src/main/res/layout/description_adapter_pu.xml @@ -114,4 +114,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/description_adapter_ts.xml b/app/src/main/res/layout/description_adapter_ts.xml index d5758c80d..0653857af 100644 --- a/app/src/main/res/layout/description_adapter_ts.xml +++ b/app/src/main/res/layout/description_adapter_ts.xml @@ -123,4 +123,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/edit_merged_settings_dialog.xml b/app/src/main/res/layout/edit_merged_settings_dialog.xml index 5204804c5..9f07aeade 100644 --- a/app/src/main/res/layout/edit_merged_settings_dialog.xml +++ b/app/src/main/res/layout/edit_merged_settings_dialog.xml @@ -14,4 +14,4 @@ android:layout_height="1dp" android:background="?android:attr/divider"/> - \ No newline at end of file + diff --git a/app/src/main/res/layout/pre_migration_list.xml b/app/src/main/res/layout/pre_migration_list.xml index 6887b49ee..c1b058442 100644 --- a/app/src/main/res/layout/pre_migration_list.xml +++ b/app/src/main/res/layout/pre_migration_list.xml @@ -4,4 +4,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - tools:listitem="@layout/migration_source_item" /> \ No newline at end of file + tools:listitem="@layout/migration_source_item" /> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 385506ee8..1f23d2a10 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 385506ee8..1f23d2a10 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/values/styles_sy.xml b/app/src/main/res/values/styles_sy.xml index dbcac954a..617927b6b 100644 --- a/app/src/main/res/values/styles_sy.xml +++ b/app/src/main/res/values/styles_sy.xml @@ -17,4 +17,4 @@ true true - \ No newline at end of file + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index e15553c60..772302533 100755 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -450,7 +450,7 @@ @color/nord_surfaceContainerLow @color/nord_surfaceContainerLowest - +