diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 01cf0e1d0..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,34 +0,0 @@ -**PLEASE READ THIS** - -I acknowledge that: - -- I have updated: - - To the latest version of the app (stable is v0.15.3) - - All extensions -- I have gone through the FAQ (https://mihon.app/docs/faq/general) and troubleshooting guide (https://mihon.app/docs/guides/troubleshooting/) -- If this is an issue with an official extension, that I should be opening an issue in https://github.com/tachiyomiorg/extensions -- I have searched the existing issues and this is new ticket **NOT** a duplicate or related to another open or closed issue -- I will fill out the title and the information in this template - -Note that the issue will be automatically closed if you do not fill out the title or requested information. - -**DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT** - ---- - -## Device information -* Tachiyomi version: ? -* Android version: ? -* Device: ? - -## Steps to reproduce -1. First step -2. Second step - -## Issue/Request -? - -## Other details -Additional details and attachments. - -If you're experiencing crashes, share the crash logs from More → Settings → Advanced → Dump crash logs. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 76f836b82..9f0508ef1 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,11 +1,5 @@ blank_issues_enabled: false contact_links: - - name: ⚠️ Extension/source issue - url: https://github.com/tachiyomiorg/extensions/issues/new/choose - about: Issues and requests for official extensions and sources should be opened in the extensions repository instead - - name: 📦 Mihon extensions - url: https://mihon.app/extensions/ - about: List of all available extensions with download links - name: 🖥️ Mihon website url: https://mihon.app/ about: Guides, troubleshooting, and answers to common questions diff --git a/.github/ISSUE_TEMPLATE/report_issue.yml b/.github/ISSUE_TEMPLATE/report_issue.yml index d4683f90d..8fac5785f 100644 --- a/.github/ISSUE_TEMPLATE/report_issue.yml +++ b/.github/ISSUE_TEMPLATE/report_issue.yml @@ -53,7 +53,7 @@ body: label: Mihon version description: You can find your Mihon version in **More → About**. placeholder: | - Example: "0.15.3" + Example: "0.16.3" validations: required: true @@ -94,11 +94,9 @@ body: required: true - label: I have written a short but informative title. required: true - - label: If this is an issue with an official extension, I should be opening an issue in the [extensions repository](https://github.com/tachiyomiorg/extensions/issues/new/choose). - required: true - label: I have gone through the [FAQ](https://mihon.app/docs/faq/general) and [troubleshooting guide](https://mihon.app/docs/guides/troubleshooting/). required: true - - label: I have updated the app to version **[0.15.3](https://github.com/mihonapp/mihon/releases/latest)**. + - label: I have updated the app to version **[0.16.3](https://github.com/mihonapp/mihon/releases/latest)**. required: true - label: I have updated all installed extensions. required: true diff --git a/.github/ISSUE_TEMPLATE/request_feature.yml b/.github/ISSUE_TEMPLATE/request_feature.yml index e976bde24..2c6d324c9 100644 --- a/.github/ISSUE_TEMPLATE/request_feature.yml +++ b/.github/ISSUE_TEMPLATE/request_feature.yml @@ -31,9 +31,7 @@ body: required: true - label: I have written a short but informative title. required: true - - label: If this is an issue with an official extension, I should be opening an issue in the [extensions repository](https://github.com/tachiyomiorg/extensions/issues/new/choose). - required: true - - label: I have updated the app to version **[0.15.3](https://github.com/mihonapp/mihon/releases/latest)**. + - label: I have updated the app to version **[0.16.3](https://github.com/mihonapp/mihon/releases/latest)**. required: true - label: I will fill out all of the requested information in this form. required: true diff --git a/.github/assets/logo.png b/.github/assets/logo.png new file mode 100644 index 000000000..529c720df Binary files /dev/null and b/.github/assets/logo.png differ diff --git a/.github/readme-images/app-icon.png b/.github/readme-images/app-icon.png deleted file mode 100644 index 237bec5e8..000000000 Binary files a/.github/readme-images/app-icon.png and /dev/null differ diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index bebc653c0..56ac46c79 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -23,10 +23,10 @@ jobs: uses: actions/checkout@v4 - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v1 + uses: gradle/wrapper-validation-action@v2 - name: Dependency Review - uses: actions/dependency-review-action@v3 + uses: actions/dependency-review-action@v4 - name: Set up JDK uses: actions/setup-java@v4 @@ -34,7 +34,8 @@ jobs: java-version: 17 distribution: adopt + - name: Set up gradle + uses: gradle/actions/setup-gradle@v3 + - name: Build app and run unit tests - uses: gradle/gradle-command-action@v2 - with: - arguments: ktlintCheck assembleStandardRelease testReleaseUnitTest \ No newline at end of file + run: ./gradlew detekt assembleStandardRelease testReleaseUnitTest diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml index 73106a0ef..0f400fbbf 100644 --- a/.github/workflows/build_push.yml +++ b/.github/workflows/build_push.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v4 - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v1 + uses: gradle/wrapper-validation-action@v2 - name: Setup Android SDK run: | @@ -32,10 +32,11 @@ jobs: java-version: 17 distribution: adopt + - name: Set up gradle + uses: gradle/actions/setup-gradle@v3 + - name: Build app and run unit tests - uses: gradle/gradle-command-action@v2 - with: - arguments: ktlintCheck assembleStandardRelease testReleaseUnitTest + run: ./gradlew detekt assembleStandardRelease testReleaseUnitTest # Sign APK and create release for tags @@ -99,7 +100,7 @@ jobs: | x86 | ${{ env.APK_X86_SHA }} | | x86_64 | ${{ env.APK_X86_64_SHA }} | - If you are unsure which version to choose then go with mihon-${{ env.VERSION_TAG }}.apk + ## If you are unsure which version to choose then go with mihon-${{ env.VERSION_TAG }}.apk files: | mihon-${{ env.VERSION_TAG }}.apk mihon-arm64-v8a-${{ env.VERSION_TAG }}.apk diff --git a/.github/workflows/issue_moderator.yml b/.github/workflows/issue_moderator.yml index 6a069e5c4..c0859d10e 100644 --- a/.github/workflows/issue_moderator.yml +++ b/.github/workflows/issue_moderator.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Moderate issues - uses: tachiyomiorg/issue-moderator-action@v2 + uses: tachiyomiorg/issue-moderator-action@v2.6.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} duplicate-label: Duplicate diff --git a/.idea/icon.png b/.idea/icon.png index ead7c3241..cd287a6c4 100644 Binary files a/.idea/icon.png and b/.idea/icon.png differ diff --git a/README.md b/README.md index 63a3a3858..e0a09a692 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,113 @@ -| Build | Stable | Weekly Preview | Support Server | -|-------|----------|---------|---------| -| [![CI](https://github.com/mihonapp/mihon/actions/workflows/build_push.yml/badge.svg)](https://github.com/mihonapp/mihon/actions/workflows/build_push.yml) | [![stable release](https://img.shields.io/github/release/mihonapp/mihon.svg?maxAge=3600&label=download)](https://github.com/mihonapp/mihon/releases) | [![latest preview build](https://img.shields.io/github/v/release/mihonapp/mihon-preview.svg?maxAge=3600&label=download)](https://github.com/mihonapp/mihon-preview/releases) | [![Discord](https://img.shields.io/discord/1195734228319617024.svg?label=discord&labelColor=7289da&color=2c2f33&style=flat)](https://discord.gg/mihon) | +
-# ![app icon](./.github/readme-images/app-icon.png)Mihon -Mihon is a free and open source manga reader for Android 8.0 and above. + + Mihon logo + + +# Mihon [App](#) + +### Full-featured reader +Discover and read manga, webtoons, comics, and more – easier than ever on your Android device. + +[![Discord server](https://img.shields.io/discord/1195734228319617024.svg?label=&labelColor=6A7EC2&color=7389D8&logo=discord&logoColor=FFFFFF)](https://discord.gg/mihon) +[![GitHub downloads](https://img.shields.io/github/downloads/mihonapp/mihon/total?label=downloads&labelColor=27303D&color=0D1117&logo=github&logoColor=FFFFFF&style=flat)](https://github.com/mihonapp/mihon/releases) + +[![CI](https://img.shields.io/github/actions/workflow/status/mihonapp/mihon/build_push.yml?labelColor=27303D)](https://github.com/mihonapp/mihon/actions/workflows/build_push.yml) +[![License: Apache-2.0](https://img.shields.io/github/license/mihonapp/mihon?labelColor=27303D&color=0877d2)](/LICENSE) +[![Translation status](https://img.shields.io/weblate/progress/mihon?labelColor=27303D&color=946300)](https://hosted.weblate.org/engage/mihon/) + +## Download + +[![Mihon Stable](https://img.shields.io/github/release/mihonapp/mihon.svg?maxAge=3600&label=Stable&labelColor=06599d&color=043b69)](https://github.com/mihonapp/mihon/releases) +[![Mihon Beta](https://img.shields.io/github/v/release/mihonapp/mihon-preview.svg?maxAge=3600&label=Beta&labelColor=2c2c47&color=1c1c39)](https://github.com/mihonapp/mihon-preview/releases) + +*Requires Android 8.0 or higher.* ## Features -Features include: -* Online reading from a variety of sources -* Local reading of downloaded content +
+ +* Local reading of content. * A configurable reader with multiple viewers, reading directions and other settings. -* Tracker support: [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.io/), [MangaUpdates](https://mangaupdates.com), [Shikimori](https://shikimori.one), and [Bangumi](https://bgm.tv/) support -* Categories to organize your library -* Light and dark themes -* Schedule updating your library for new chapters -* Create backups locally to read offline or to your desired cloud service +* Tracker support: [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.io/), [MangaUpdates](https://mangaupdates.com), [Shikimori](https://shikimori.one), and [Bangumi](https://bgm.tv/) support. +* Categories to organize your library. +* Light and dark themes. +* Schedule updating your library for new chapters. +* Create backups locally to read offline or to your desired cloud service. +* Plus much more... -## Download -Get the app from our [releases page](https://github.com/mihonapp/mihon/releases). +
-If you want to try new features before they get to the stable release, you can download the preview version [here](https://github.com/mihonapp/mihon-preview/releases). +## Contributing -## Issues, Feature Requests and Contributing +[Code of conduct](./CODE_OF_CONDUCT.md) · [Contributing guide](./CONTRIBUTING.md) -Please make sure to read the full guidelines. Your issue may be closed without warning if you do not. +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. -
Issues +If you got any questions, [join our Discord server](https://discord.gg/mihon). -1. **Before reporting a new issue, take a look at the [FAQ](https://mihon.app/docs/faq/general), the [changelog](https://mihon.app/changelogs/) and the already opened [issues](https://github.com/mihonapp/mihon/issues).** -2. If you are unsure, ask here: [![Discord](https://img.shields.io/discord/1195734228319617024.svg)](https://discord.gg/mihon) +
Issues
-
+Before reporting a new issue, take a look at the [FAQ](https://mihon.app/docs/faq/general), the [changelog](https://mihon.app/changelogs/) and the already opened [issues](https://github.com/mihonapp/mihon/issues). -
Bugs +
-* Include version (More → About → Version) - * If not latest, try updating, it may have already been solved - * Preview version is equal to the number of commits as seen on the main page -* Include steps to reproduce (if not obvious from description) -* Include screenshot (if needed) -* If it could be device-dependent, try reproducing on another device (if possible) +
Bugs
+ +* Include version (**More → About → Version**). +* If not latest, try updating, it may have already been solved. +* Beta version is equal to the number of commits as seen on the main page. +* Include steps to reproduce (if not obvious from description). +* Include screenshot (if needed). +* If it could be device-dependent, try reproducing on another device (if possible). * Don't group unrelated requests into one issue +- **DO:** [#24](https://git.mihon.dev/tachiyomi/tachiyomi/issues/24), [#71](https://git.mihon.dev/tachiyomi/tachiyomi/issues/71) +- **DON'T:** [#75](https://git.mihon.dev/tachiyomi/tachiyomi/issues/75) -
+ -
Feature Requests +
Feature requests
-* Write a detailed issue, explaining what it should do or how. Avoid writing just "like X app does" +* Write a detailed issue, explaining what it should do or how. + * Avoid writing just "like X app does"; * Include screenshot (if needed) +* Source requests are not accepted. -Source requests are not accepted. -
+
-
Contributing +### Repositories -See [CONTRIBUTING.md](./CONTRIBUTING.md). -
+[![mihonapp/website - GitHub](https://github-readme-stats.vercel.app/api/pin/?username=mihonapp&repo=website&bg_color=161B22&text_color=c9d1d9&title_color=0877d2&icon_color=0877d2&border_radius=8&hide_border=true)](https://github.com/mihonapp/website/) -
Code of Conduct +### Credits -See [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md). -
+Thank you to all the people who have contributed! -## FAQ + + Mihon app contributors + -[See our website.](https://mihon.app/) -You can also reach out to us on [Discord](https://discord.gg/mihon). +### Disclaimer -## License +The developer(s) of this application does not have any affiliation with the content providers available, and this application hosts zero content. - Copyright 2015 Javier Tomás +### License - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +``` +Copyright © 2015 Javier Tomás +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. -## Disclaimer +Modifications Copyright © 2024 The Mihon Open Source Project +``` -The developer of this application does not have any affiliation with the content providers available. + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cc43933c2..6d4f71715 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,8 +22,8 @@ android { defaultConfig { applicationId = "app.mihon" - versionCode = 1 - versionName = "0.16.0" + versionCode = 4 + versionName = "0.16.3" buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"") @@ -139,15 +139,15 @@ android { } dependencies { - implementation(project(":i18n")) - implementation(project(":core")) - implementation(project(":core-metadata")) - implementation(project(":source-api")) - implementation(project(":source-local")) - implementation(project(":data")) - implementation(project(":domain")) - implementation(project(":presentation-core")) - implementation(project(":presentation-widget")) + implementation(projects.i18n) + implementation(projects.core.common) + implementation(projects.coreMetadata) + implementation(projects.sourceApi) + implementation(projects.sourceLocal) + implementation(projects.data) + implementation(projects.domain) + implementation(projects.presentationCore) + implementation(projects.presentationWidget) // Compose implementation(platform(compose.bom)) @@ -163,7 +163,6 @@ dependencies { implementation(compose.ui.util) implementation(compose.accompanist.webview) implementation(compose.accompanist.systemuicontroller) - lintChecks(compose.lintchecks) implementation(androidx.paging.runtime) implementation(androidx.paging.compose) diff --git a/app/src/debug/res/drawable/ic_launcher_background.xml b/app/src/debug/res/drawable/ic_launcher_background.xml index 54f998b1c..b1df6030e 100644 --- a/app/src/debug/res/drawable/ic_launcher_background.xml +++ b/app/src/debug/res/drawable/ic_launcher_background.xml @@ -3,18 +3,20 @@ android:height="108dp" android:viewportWidth="432" android:viewportHeight="432"> - + + + diff --git a/app/src/debug/res/drawable/ic_launcher_foreground.xml b/app/src/debug/res/drawable/ic_launcher_foreground.xml index b293ee17e..e26e3cc61 100644 --- a/app/src/debug/res/drawable/ic_launcher_foreground.xml +++ b/app/src/debug/res/drawable/ic_launcher_foreground.xml @@ -3,12 +3,7 @@ android:height="108dp" android:viewportWidth="432" android:viewportHeight="432"> - - - + diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png deleted file mode 100644 index 6c7f44956..000000000 Binary files a/app/src/main/ic_launcher-web.png and /dev/null differ diff --git a/app/src/main/java/eu/kanade/core/preference/CheckboxState.kt b/app/src/main/java/eu/kanade/core/preference/CheckboxState.kt index 12635d04f..0f59a885d 100644 --- a/app/src/main/java/eu/kanade/core/preference/CheckboxState.kt +++ b/app/src/main/java/eu/kanade/core/preference/CheckboxState.kt @@ -1,7 +1,7 @@ package eu.kanade.core.preference import androidx.compose.ui.state.ToggleableState -import tachiyomi.core.preference.CheckboxState +import tachiyomi.core.common.preference.CheckboxState fun CheckboxState.TriState.asToggleableState() = when (this) { is CheckboxState.TriState.Exclude -> ToggleableState.Indeterminate diff --git a/app/src/main/java/eu/kanade/core/preference/PreferenceMutableState.kt b/app/src/main/java/eu/kanade/core/preference/PreferenceMutableState.kt index cb91e700a..1c7d9e761 100644 --- a/app/src/main/java/eu/kanade/core/preference/PreferenceMutableState.kt +++ b/app/src/main/java/eu/kanade/core/preference/PreferenceMutableState.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.mutableStateOf import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import tachiyomi.core.preference.Preference +import tachiyomi.core.common.preference.Preference class PreferenceMutableState( private val preference: Preference, diff --git a/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt b/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt index d52a3899c..9fa63d2cd 100644 --- a/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt +++ b/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt @@ -2,8 +2,8 @@ package eu.kanade.domain.base import android.content.Context import dev.icerock.moko.resources.StringResource -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.i18n.MR class BasePreferences( diff --git a/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt b/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt index 33f148e95..6dd6ef4fa 100644 --- a/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt +++ b/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt @@ -5,9 +5,9 @@ import eu.kanade.domain.base.BasePreferences.ExtensionInstaller import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller import eu.kanade.tachiyomi.util.system.isShizukuInstalled import kotlinx.coroutines.CoroutineScope -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.preference.getEnum +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.preference.getEnum class ExtensionInstallerPreference( private val context: Context, diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt index 673b686f5..346384f04 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt @@ -2,8 +2,8 @@ package eu.kanade.domain.chapter.interactor import eu.kanade.domain.download.interactor.DeleteDownload import logcat.LogPriority -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.chapter.repository.ChapterRepository diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt index abd13a849..300794b4c 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SyncChaptersWithSource.kt @@ -163,7 +163,7 @@ class SyncChaptersWithSource( var updatedToAdd = newChapters.map { toAddItem -> var chapter = toAddItem.copy(dateFetch = nowMillis + itemCount--) - if (chapter.isRecognizedNumber.not() || chapter.chapterNumber !in deletedChapterNumbers) return@map chapter + if (!chapter.isRecognizedNumber || chapter.chapterNumber !in deletedChapterNumbers) return@map chapter chapter = chapter.copy( read = chapter.chapterNumber in deletedReadChapterNumbers, diff --git a/app/src/main/java/eu/kanade/domain/download/interactor/DeleteDownload.kt b/app/src/main/java/eu/kanade/domain/download/interactor/DeleteDownload.kt index 5ec3b4a7d..18a2bf3f0 100644 --- a/app/src/main/java/eu/kanade/domain/download/interactor/DeleteDownload.kt +++ b/app/src/main/java/eu/kanade/domain/download/interactor/DeleteDownload.kt @@ -1,7 +1,7 @@ package eu.kanade.domain.download.interactor import eu.kanade.tachiyomi.data.download.DownloadManager -import tachiyomi.core.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/CreateExtensionRepo.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/CreateExtensionRepo.kt index 66b949fc9..a8083ec00 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/CreateExtensionRepo.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/CreateExtensionRepo.kt @@ -1,7 +1,7 @@ package eu.kanade.domain.extension.interactor import eu.kanade.domain.source.service.SourcePreferences -import tachiyomi.core.preference.plusAssign +import tachiyomi.core.common.preference.plusAssign class CreateExtensionRepo(private val preferences: SourcePreferences) { diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/DeleteExtensionRepo.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/DeleteExtensionRepo.kt index 8762be0d0..8e50ebeca 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/DeleteExtensionRepo.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/DeleteExtensionRepo.kt @@ -1,7 +1,7 @@ package eu.kanade.domain.extension.interactor import eu.kanade.domain.source.service.SourcePreferences -import tachiyomi.core.preference.minusAssign +import tachiyomi.core.common.preference.minusAssign class DeleteExtensionRepo(private val preferences: SourcePreferences) { diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt index 280dfae04..7c7a6a919 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt @@ -23,7 +23,7 @@ class GetExtensionSources( ExtensionSourceItem( source = source, enabled = source.isEnabled(), - labelAsName = isMultiSource && isMultiLangSingleSource.not(), + labelAsName = isMultiSource && !isMultiLangSingleSource, ) } } diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt index 4156a27c5..dadbd35f6 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt @@ -22,9 +22,9 @@ class GetExtensionsByType( extensionManager.availableExtensionsFlow, ) { _activeLanguages, _installed, _untrusted, _available -> val (updates, installed) = _installed - .filter { (showNsfwSources || it.isNsfw.not()) } + .filter { (showNsfwSources || !it.isNsfw) } .sortedWith( - compareBy { it.isObsolete.not() } + compareBy { !it.isObsolete } .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name }, ) .partition { it.hasUpdate } @@ -36,7 +36,7 @@ class GetExtensionsByType( .filter { extension -> _installed.none { it.pkgName == extension.pkgName } && _untrusted.none { it.pkgName == extension.pkgName } && - (showNsfwSources || extension.isNsfw.not()) + (showNsfwSources || !extension.isNsfw) } .flatMap { ext -> if (ext.sources.isEmpty()) { diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/TrustExtension.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/TrustExtension.kt index 0ad6b2c56..c3daec5f8 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/TrustExtension.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/TrustExtension.kt @@ -3,7 +3,7 @@ package eu.kanade.domain.extension.interactor import android.content.pm.PackageInfo import androidx.core.content.pm.PackageInfoCompat import eu.kanade.domain.source.service.SourcePreferences -import tachiyomi.core.preference.getAndSet +import tachiyomi.core.common.preference.getAndSet class TrustExtension( private val preferences: SourcePreferences, diff --git a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt index 686b29f43..1b9dd62c8 100644 --- a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt @@ -5,9 +5,9 @@ import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode +import tachiyomi.core.common.preference.TriState import tachiyomi.core.metadata.comicinfo.ComicInfo import tachiyomi.core.metadata.comicinfo.ComicInfoPublishingStatus -import tachiyomi.core.preference.TriState import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga import uy.kohesive.injekt.Injekt diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt index c37be75aa..962fbb8a6 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt @@ -3,7 +3,7 @@ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.service.SourcePreferences import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import tachiyomi.core.util.lang.compareToWithCollator +import tachiyomi.core.common.util.lang.compareToWithCollator import tachiyomi.domain.source.model.Source import tachiyomi.domain.source.repository.SourceRepository import tachiyomi.source.local.isLocal @@ -34,15 +34,15 @@ class GetSourcesWithFavoriteCount( when (sorting) { SetMigrateSorting.Mode.ALPHABETICAL -> { when { - a.first.isStub && b.first.isStub.not() -> -1 - b.first.isStub && a.first.isStub.not() -> 1 + a.first.isStub && !b.first.isStub -> -1 + b.first.isStub && !a.first.isStub -> 1 else -> a.first.name.lowercase().compareToWithCollator(b.first.name.lowercase()) } } SetMigrateSorting.Mode.TOTAL -> { when { - a.first.isStub && b.first.isStub.not() -> -1 - b.first.isStub && a.first.isStub.not() -> 1 + a.first.isStub && !b.first.isStub -> -1 + b.first.isStub && !a.first.isStub -> 1 else -> a.second.compareTo(b.second) } } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt index bc601117b..c813890d2 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt @@ -1,7 +1,7 @@ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.service.SourcePreferences -import tachiyomi.core.preference.getAndSet +import tachiyomi.core.common.preference.getAndSet class ToggleLanguage( val preferences: SourcePreferences, diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt index fbcb3147c..ec13f8d4b 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt @@ -1,7 +1,7 @@ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.service.SourcePreferences -import tachiyomi.core.preference.getAndSet +import tachiyomi.core.common.preference.getAndSet import tachiyomi.domain.source.model.Source class ToggleSource( diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt index e7ea8bb35..0a49a53ba 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt @@ -1,7 +1,7 @@ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.service.SourcePreferences -import tachiyomi.core.preference.getAndSet +import tachiyomi.core.common.preference.getAndSet import tachiyomi.domain.source.model.Source class ToggleSourcePin( diff --git a/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt b/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt index 5779020a2..d4d3989c0 100644 --- a/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt +++ b/app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt @@ -2,9 +2,9 @@ package eu.kanade.domain.source.service import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.tachiyomi.util.system.LocaleHelper -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.preference.getEnum +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.preference.getEnum import tachiyomi.domain.library.model.LibraryDisplayMode class SourcePreferences( diff --git a/app/src/main/java/eu/kanade/domain/track/interactor/AddTracks.kt b/app/src/main/java/eu/kanade/domain/track/interactor/AddTracks.kt index 70e612c3c..2d31c64e7 100644 --- a/app/src/main/java/eu/kanade/domain/track/interactor/AddTracks.kt +++ b/app/src/main/java/eu/kanade/domain/track/interactor/AddTracks.kt @@ -8,9 +8,9 @@ import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone import logcat.LogPriority -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.history.interactor.GetHistory import tachiyomi.domain.manga.model.Manga diff --git a/app/src/main/java/eu/kanade/domain/track/interactor/RefreshTracks.kt b/app/src/main/java/eu/kanade/domain/track/interactor/RefreshTracks.kt index 457dbf87e..3d1e337ff 100644 --- a/app/src/main/java/eu/kanade/domain/track/interactor/RefreshTracks.kt +++ b/app/src/main/java/eu/kanade/domain/track/interactor/RefreshTracks.kt @@ -30,9 +30,9 @@ class RefreshTracks( .map { (track, service) -> async { return@async try { - val updatedTrack = service!!.refresh(track.toDbTrack()) - insertTrack.await(updatedTrack.toDomainTrack()!!) - syncChapterProgressWithTrack.await(mangaId, track, service) + val updatedTrack = service!!.refresh(track.toDbTrack()).toDomainTrack()!! + insertTrack.await(updatedTrack) + syncChapterProgressWithTrack.await(mangaId, updatedTrack, service) null } catch (e: Throwable) { service to e diff --git a/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt b/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt index 6fab0792a..8e6df2289 100644 --- a/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt +++ b/app/src/main/java/eu/kanade/domain/track/interactor/SyncChapterProgressWithTrack.kt @@ -4,7 +4,7 @@ import eu.kanade.domain.track.model.toDbTrack import eu.kanade.tachiyomi.data.track.EnhancedTracker import eu.kanade.tachiyomi.data.track.Tracker import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.model.toChapterUpdate diff --git a/app/src/main/java/eu/kanade/domain/track/interactor/TrackChapter.kt b/app/src/main/java/eu/kanade/domain/track/interactor/TrackChapter.kt index 557c3be83..a942d5f94 100644 --- a/app/src/main/java/eu/kanade/domain/track/interactor/TrackChapter.kt +++ b/app/src/main/java/eu/kanade/domain/track/interactor/TrackChapter.kt @@ -9,8 +9,8 @@ import eu.kanade.tachiyomi.data.track.TrackerManager import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import logcat.LogPriority -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.InsertTrack diff --git a/app/src/main/java/eu/kanade/domain/track/model/Track.kt b/app/src/main/java/eu/kanade/domain/track/model/Track.kt index 332ddd8d5..e44133433 100644 --- a/app/src/main/java/eu/kanade/domain/track/model/Track.kt +++ b/app/src/main/java/eu/kanade/domain/track/model/Track.kt @@ -19,30 +19,28 @@ fun Track.toDbTrack(): DbTrack = DbTrack.create(trackerId).also { it.remote_id = remoteId it.library_id = libraryId it.title = title - it.last_chapter_read = lastChapterRead.toFloat() - it.total_chapters = totalChapters.toInt() - it.status = status.toInt() - it.score = score.toFloat() + it.last_chapter_read = lastChapterRead + it.total_chapters = totalChapters + it.status = status + it.score = score it.tracking_url = remoteUrl it.started_reading_date = startDate it.finished_reading_date = finishDate } fun DbTrack.toDomainTrack(idRequired: Boolean = true): Track? { - val trackId = id ?: if (idRequired.not()) -1 else return null + val trackId = id ?: if (!idRequired) -1 else return null return Track( id = trackId, mangaId = manga_id, - trackerId = tracker_id.toLong(), + trackerId = tracker_id, remoteId = remote_id, libraryId = library_id, title = title, - lastChapterRead = last_chapter_read.toDouble(), - totalChapters = total_chapters.toLong(), - status = status.toLong(), - // Jank workaround due to precision issues while converting - // See https://github.com/tachiyomiorg/tachiyomi/issues/10343 - score = score.toString().toDouble(), + lastChapterRead = last_chapter_read, + totalChapters = total_chapters, + status = status, + score = score, remoteUrl = tracking_url, startDate = started_reading_date, finishDate = finished_reading_date, diff --git a/app/src/main/java/eu/kanade/domain/track/service/DelayedTrackingUpdateJob.kt b/app/src/main/java/eu/kanade/domain/track/service/DelayedTrackingUpdateJob.kt index b178cf746..1f4e246dc 100644 --- a/app/src/main/java/eu/kanade/domain/track/service/DelayedTrackingUpdateJob.kt +++ b/app/src/main/java/eu/kanade/domain/track/service/DelayedTrackingUpdateJob.kt @@ -12,8 +12,8 @@ import eu.kanade.domain.track.interactor.TrackChapter import eu.kanade.domain.track.store.DelayedTrackingStore import eu.kanade.tachiyomi.util.system.workManager import logcat.LogPriority -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.interactor.GetTracks import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get diff --git a/app/src/main/java/eu/kanade/domain/track/service/TrackPreferences.kt b/app/src/main/java/eu/kanade/domain/track/service/TrackPreferences.kt index 8ed234b90..ab000a9ea 100644 --- a/app/src/main/java/eu/kanade/domain/track/service/TrackPreferences.kt +++ b/app/src/main/java/eu/kanade/domain/track/service/TrackPreferences.kt @@ -2,8 +2,8 @@ package eu.kanade.domain.track.service import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.anilist.Anilist -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore class TrackPreferences( private val preferenceStore: PreferenceStore, @@ -19,9 +19,15 @@ class TrackPreferences( "", ) + fun trackAuthExpired(tracker: Tracker) = preferenceStore.getBoolean( + Preference.privateKey("pref_tracker_auth_expired_${tracker.id}"), + false, + ) + fun setCredentials(tracker: Tracker, username: String, password: String) { trackUsername(tracker).set(username) trackPassword(tracker).set(password) + trackAuthExpired(tracker).set(false) } fun trackToken(tracker: Tracker) = preferenceStore.getString(Preference.privateKey("track_token_${tracker.id}"), "") diff --git a/app/src/main/java/eu/kanade/domain/track/store/DelayedTrackingStore.kt b/app/src/main/java/eu/kanade/domain/track/store/DelayedTrackingStore.kt index 5ec27cbea..10779a219 100644 --- a/app/src/main/java/eu/kanade/domain/track/store/DelayedTrackingStore.kt +++ b/app/src/main/java/eu/kanade/domain/track/store/DelayedTrackingStore.kt @@ -3,7 +3,7 @@ package eu.kanade.domain.track.store import android.content.Context import androidx.core.content.edit import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat class DelayedTrackingStore(context: Context) { 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 efb27fa02..606a1048d 100644 --- a/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt +++ b/app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt @@ -5,8 +5,8 @@ import eu.kanade.domain.ui.model.TabletUiMode import eu.kanade.domain.ui.model.ThemeMode import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.preference.getEnum +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.preference.getEnum import java.text.DateFormat import java.text.SimpleDateFormat import java.util.Locale diff --git a/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt index 95003f1e4..6a428506f 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt @@ -24,7 +24,7 @@ import eu.kanade.presentation.util.formattedMessage import eu.kanade.tachiyomi.source.Source import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.StateFlow -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.model.StubSource 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 e55576db8..807b68b20 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt @@ -53,6 +53,7 @@ import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.ui.browse.extension.details.ExtensionDetailsScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper +import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR @@ -224,7 +225,31 @@ private fun DetailsHeader( end = MaterialTheme.padding.medium, top = MaterialTheme.padding.medium, bottom = MaterialTheme.padding.small, - ), + ) + .clickable { + val extDebugInfo = buildString { + append( + """ + 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() + ) + + if (extension is Extension.Installed) { + append("\n\n") + append( + """ + Update available: ${extension.hasUpdate} + Obsolete: ${extension.isObsolete} + Shared: ${extension.isShared} + Repository: ${extension.repoUrl} + """.trimIndent() + ) + } + } + context.copyToClipboard("Extension Debug information", extDebugInfo) + }, horizontalAlignment = Alignment.CenterHorizontally, ) { ExtensionIcon( 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 8e6c7913b..d08a2d93b 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt @@ -203,7 +203,13 @@ private fun ExtensionContent( items( items = items, contentType = { "item" }, - key = { "extension-${it.hashCode()}" }, + key = { item -> + when (item.extension) { + is Extension.Untrusted -> "extension-untrusted-${item.hashCode()}" + is Extension.Installed -> "extension-installed-${item.hashCode()}" + is Extension.Available -> "extension-available-${item.hashCode()}" + } + }, ) { item -> ExtensionItem( modifier = Modifier.animateItemPlacement(), diff --git a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt index fbe82ad6e..b4710fc40 100644 --- a/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt +++ b/app/src/main/java/eu/kanade/presentation/browse/components/BrowseIcons.kt @@ -31,7 +31,7 @@ import eu.kanade.presentation.util.rememberResourceBitmapPainter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.util.ExtensionLoader -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.source.model.Source import tachiyomi.source.local.isLocal diff --git a/app/src/main/java/eu/kanade/presentation/category/CategoryExtensions.kt b/app/src/main/java/eu/kanade/presentation/category/CategoryExtensions.kt index a6c22c240..62c85907d 100644 --- a/app/src/main/java/eu/kanade/presentation/category/CategoryExtensions.kt +++ b/app/src/main/java/eu/kanade/presentation/category/CategoryExtensions.kt @@ -2,7 +2,7 @@ package eu.kanade.presentation.category import android.content.Context import androidx.compose.runtime.Composable -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource diff --git a/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt b/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt index fd6396b95..7709d960f 100644 --- a/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt @@ -30,7 +30,7 @@ import eu.kanade.presentation.category.visualName import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay -import tachiyomi.core.preference.CheckboxState +import tachiyomi.core.common.preference.CheckboxState import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding diff --git a/app/src/main/java/eu/kanade/presentation/components/AdaptiveSheet.kt b/app/src/main/java/eu/kanade/presentation/components/AdaptiveSheet.kt index b3d07c1c3..2712d9a27 100644 --- a/app/src/main/java/eu/kanade/presentation/components/AdaptiveSheet.kt +++ b/app/src/main/java/eu/kanade/presentation/components/AdaptiveSheet.kt @@ -97,5 +97,5 @@ fun AdaptiveSheet( private val dialogProperties = DialogProperties( usePlatformDefaultWidth = false, - decorFitsSystemWindows = false, + decorFitsSystemWindows = true, ) diff --git a/app/src/main/java/eu/kanade/presentation/library/DeleteLibraryMangaDialog.kt b/app/src/main/java/eu/kanade/presentation/library/DeleteLibraryMangaDialog.kt index 36346f14a..da6faa495 100644 --- a/app/src/main/java/eu/kanade/presentation/library/DeleteLibraryMangaDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/DeleteLibraryMangaDialog.kt @@ -10,7 +10,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import dev.icerock.moko.resources.StringResource -import tachiyomi.core.preference.CheckboxState +import tachiyomi.core.common.preference.CheckboxState import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.i18n.stringResource 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 7e9efd716..ad0733606 100644 --- a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt @@ -19,7 +19,7 @@ import eu.kanade.tachiyomi.ui.library.LibrarySettingsScreenModel import eu.kanade.tachiyomi.util.system.isDevFlavor import eu.kanade.tachiyomi.util.system.isPreviewBuildType import kotlinx.collections.immutable.persistentListOf -import tachiyomi.core.preference.TriState +import tachiyomi.core.common.preference.TriState import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.model.LibrarySort diff --git a/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt index 64cba7158..5f98dbb86 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/ChapterSettingsDialog.kt @@ -31,7 +31,7 @@ import eu.kanade.domain.manga.model.forceDownloaded import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import kotlinx.collections.immutable.persistentListOf -import tachiyomi.core.preference.TriState +import tachiyomi.core.common.preference.TriState import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LabeledCheckbox diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/ChapterDownloadIndicator.kt b/app/src/main/java/eu/kanade/presentation/manga/components/ChapterDownloadIndicator.kt index 162aa92a3..50ddadf0c 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/ChapterDownloadIndicator.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/ChapterDownloadIndicator.kt @@ -10,7 +10,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.outlined.ArrowDownward import androidx.compose.material.icons.outlined.ErrorOutline -import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material.ripple import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon @@ -256,7 +256,7 @@ private fun Modifier.commonClickable( onClick = onClick, role = Role.Button, interactionSource = remember { MutableInteractionSource() }, - indication = rememberRipple( + indication = ripple( bounded = false, radius = IconButtonTokens.StateLayerSize / 2, ), diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt index 8d409dab8..d67a406e7 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt @@ -30,7 +30,7 @@ import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.DoneAll import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.RemoveDone -import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material.ripple import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface @@ -192,7 +192,7 @@ private fun RowScope.Button( .weight(animatedWeight) .combinedClickable( interactionSource = remember { MutableInteractionSource() }, - indication = rememberRipple(bounded = false), + indication = ripple(bounded = false), onLongClick = onLongClick, onClick = onClick, ), diff --git a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt index 974804db1..fc690139a 100644 --- a/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt @@ -26,7 +26,7 @@ import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.more.DownloadQueueState -import tachiyomi.core.Constants +import tachiyomi.core.common.Constants import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt index fd8d12067..d2ed81c58 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt @@ -8,7 +8,7 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableMap import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource -import tachiyomi.core.preference.Preference as PreferenceData +import tachiyomi.core.common.preference.Preference as PreferenceData sealed class Preference { abstract val title: String 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 c86492287..509f2196a 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 @@ -57,9 +57,9 @@ import kotlinx.collections.immutable.toImmutableMap import kotlinx.coroutines.launch import logcat.LogPriority import okhttp3.Headers -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.manga.interactor.ResetViewerFlags import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource 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 57508ecbd..c8bfd10ca 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 @@ -13,7 +13,7 @@ import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.browse.ExtensionReposScreen import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import kotlinx.collections.immutable.persistentListOf -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt index f0a2864ee..91de2993f 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt @@ -7,8 +7,11 @@ import android.net.Uri import androidx.activity.compose.ManagedActivityResultLauncher import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline @@ -47,11 +50,11 @@ import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.storage.displayablePath -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.storage.displayablePath +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.storage.service.StoragePreferences @@ -97,7 +100,7 @@ object SettingsDataScreen : SearchableSettings { @Composable fun storageLocationPicker( - storageDirPref: tachiyomi.core.preference.Preference, + storageDirPref: tachiyomi.core.common.preference.Preference, ): ManagedActivityResultLauncher { val context = LocalContext.current @@ -119,7 +122,7 @@ object SettingsDataScreen : SearchableSettings { @Composable fun storageLocationText( - storageDirPref: tachiyomi.core.preference.Preference, + storageDirPref: tachiyomi.core.common.preference.Preference, ): String { val context = LocalContext.current val storageDir by storageDirPref.collectAsState() @@ -189,9 +192,11 @@ object SettingsDataScreen : SearchableSettings { MultiChoiceSegmentedButtonRow( modifier = Modifier .fillMaxWidth() + .height(intrinsicSize = IntrinsicSize.Min) .padding(horizontal = PrefsHorizontalPadding), ) { SegmentedButton( + modifier = Modifier.fillMaxHeight(), checked = false, onCheckedChange = { navigator.push(CreateBackupScreen()) }, shape = SegmentedButtonDefaults.itemShape(0, 2), @@ -199,6 +204,7 @@ object SettingsDataScreen : SearchableSettings { Text(stringResource(MR.strings.pref_create_backup)) } SegmentedButton( + modifier = Modifier.fillMaxHeight(), checked = false, onCheckedChange = { if (!BackupRestoreJob.isRunning(context)) { diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt index fb1e0932c..1d0510025 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt @@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableMap -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsTrackingScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsTrackingScreen.kt index 8d508746c..021f0ceb2 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsTrackingScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsTrackingScreen.kt @@ -53,8 +53,8 @@ import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.withUIContext +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.domain.source.service.SourceManager import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt index 2f740aa1a..58f690569 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt @@ -38,9 +38,9 @@ import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.release.interactor.GetApplicationRelease import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LinkIcon @@ -247,7 +247,7 @@ object AboutScreen : Screen() { } } BuildConfig.PREVIEW -> { - "Preview r${BuildConfig.COMMIT_COUNT}".let { + "Beta r${BuildConfig.COMMIT_COUNT}".let { if (withBuildDate) { "$it (${BuildConfig.COMMIT_SHA}, ${getFormattedBuildTime()})" } else { diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt index 9ab8473dd..eaaec9585 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt @@ -37,9 +37,9 @@ import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.update -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchUI -import tachiyomi.core.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchUI +import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.data.Database import tachiyomi.domain.source.interactor.GetSourcesWithNonLibraryManga import tachiyomi.domain.source.model.Source diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/appearance/AppLanguageScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/appearance/AppLanguageScreen.kt index bdba9e15c..b59b26aca 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/appearance/AppLanguageScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/appearance/AppLanguageScreen.kt @@ -30,7 +30,7 @@ import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import org.xmlpull.v1.XmlPullParser -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt index 353ad1bd6..d694618fb 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/ExtensionReposScreenModel.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt b/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt index b9dbbbfb8..db0842d08 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt @@ -48,7 +48,7 @@ import eu.kanade.presentation.manga.components.MangaCover import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable -import tachiyomi.core.preference.InMemoryPreferenceStore +import tachiyomi.core.common.preference.InMemoryPreferenceStore import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource diff --git a/app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt b/app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt index f0afd08a9..82d3cad0f 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import kotlinx.coroutines.delay +import kotlin.time.Duration.Companion.seconds @Stable class DisplayRefreshHost { @@ -30,15 +31,15 @@ fun DisplayRefreshHost( val currentDisplayRefresh = hostState.currentDisplayRefresh LaunchedEffect(currentDisplayRefresh) { if (currentDisplayRefresh) { - delay(1500) + delay(1.5.seconds) hostState.currentDisplayRefresh = false } } - if (currentDisplayRefresh) { - Canvas( - modifier = modifier.fillMaxSize(), - ) { + Canvas( + modifier = modifier.fillMaxSize(), + ) { + if (currentDisplayRefresh) { drawRect(Color.Black) } } diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt index 1c5a9c6fb..cb8f5578b 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt @@ -11,7 +11,7 @@ import androidx.core.graphics.green import androidx.core.graphics.red import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences.Companion.ColorFilterMode import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel -import tachiyomi.core.preference.getAndSet +import tachiyomi.core.common.preference.getAndSet import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.SettingsChipRow diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt index 6b631d4ee..2f2832feb 100644 --- a/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt +++ b/app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt @@ -42,7 +42,7 @@ internal fun ColumnScope.GeneralPage(screenModel: ReaderSettingsScreenModel) { pref = screenModel.preferences.fullscreen(), ) - if (screenModel.hasDisplayCutout) { + if (screenModel.hasDisplayCutout && screenModel.preferences.fullscreen().get()) { CheckboxItem( label = stringResource(MR.strings.pref_cutout_short), pref = screenModel.preferences.cutoutShort(), 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 2dd518f3a..11f2b9a06 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt @@ -88,7 +88,7 @@ fun TrackInfoDialogHome( TrackInfoItem( title = item.track.title, tracker = item.tracker, - status = item.tracker.getStatus(item.track.status.toInt()), + status = item.tracker.getStatus(item.track.status), onStatusClick = { onStatusClick(item) }, chapters = "${item.track.lastChapterRead.toInt()}".let { val totalChapters = item.track.totalChapters diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogSelector.kt b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogSelector.kt index a2c8cc918..053ba7bbc 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogSelector.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogSelector.kt @@ -48,9 +48,9 @@ import tachiyomi.presentation.core.util.isScrolledToStart @Composable fun TrackStatusSelector( - selection: Int, - onSelectionChange: (Int) -> Unit, - selections: Map, + selection: Long, + onSelectionChange: (Long) -> Unit, + selections: Map, onConfirm: () -> Unit, onDismissRequest: () -> Unit, ) { @@ -236,12 +236,12 @@ private fun TrackStatusSelectorPreviews() { onSelectionChange = {}, selections = persistentMapOf( // Anilist values - 1 to MR.strings.reading, - 2 to MR.strings.plan_to_read, - 3 to MR.strings.completed, - 4 to MR.strings.on_hold, - 5 to MR.strings.dropped, - 6 to MR.strings.repeating, + 1L to MR.strings.reading, + 2L to MR.strings.plan_to_read, + 3L to MR.strings.completed, + 4L to MR.strings.on_hold, + 5L to MR.strings.dropped, + 6L to MR.strings.repeating, ), onConfirm = {}, onDismissRequest = {}, diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt index 1a2ef7800..ef158218f 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt @@ -301,7 +301,7 @@ private fun SearchResultItem( text = status, ) } - if (trackSearch.score != -1f) { + if (trackSearch.score != -1.0) { SearchResultItemDetails( title = stringResource(MR.strings.score), text = trackSearch.score.toString(), diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackerSearchPreviewProvider.kt b/app/src/main/java/eu/kanade/presentation/track/TrackerSearchPreviewProvider.kt index 7bc78781b..808f41f7d 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackerSearchPreviewProvider.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackerSearchPreviewProvider.kt @@ -62,14 +62,14 @@ internal class TrackerSearchPreviewProvider : PreviewParameterProvider<@Composab private fun randTrackSearch() = TrackSearch().let { it.id = Random.nextLong() it.manga_id = Random.nextLong() - it.tracker_id = Random.nextInt() + it.tracker_id = Random.nextLong() it.remote_id = Random.nextLong() it.library_id = Random.nextLong() it.title = lorem((1..10).random()).joinToString() - it.last_chapter_read = (0..100).random().toFloat() - it.total_chapters = (100..1000).random() - it.score = (0..10).random().toFloat() - it.status = Random.nextInt() + it.last_chapter_read = (0..100).random().toDouble() + it.total_chapters = (100L..1000L).random() + it.score = (0..10).random().toDouble() + it.status = Random.nextLong() it.started_reading_date = 0L it.finished_reading_date = 0L it.tracking_url = "https://example.com/tracker-example" diff --git a/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt b/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt index a76a225b9..be3cfff1a 100644 --- a/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt +++ b/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt @@ -4,7 +4,7 @@ import android.content.Context import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.source.online.LicensedMangaChaptersException import eu.kanade.tachiyomi.util.system.isOnline -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.data.source.NoResultsException import tachiyomi.domain.source.model.SourceNotInstalledException import tachiyomi.i18n.MR diff --git a/app/src/main/java/eu/kanade/presentation/util/TimeUtils.kt b/app/src/main/java/eu/kanade/presentation/util/TimeUtils.kt index 0bb5089ab..643f19f6e 100644 --- a/app/src/main/java/eu/kanade/presentation/util/TimeUtils.kt +++ b/app/src/main/java/eu/kanade/presentation/util/TimeUtils.kt @@ -4,7 +4,7 @@ import android.content.Context import android.text.format.DateUtils import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import java.time.Instant diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 2b53cee0c..dfe5dad41 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -49,8 +49,8 @@ import logcat.AndroidLogcatLogger import logcat.LogPriority import logcat.LogcatLogger import org.conscrypt.Conscrypt -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import tachiyomi.presentation.widget.WidgetManager import uy.kohesive.injekt.Injekt diff --git a/app/src/main/java/eu/kanade/tachiyomi/AppInfo.kt b/app/src/main/java/eu/kanade/tachiyomi/AppInfo.kt index 322983606..1a6d3db63 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/AppInfo.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/AppInfo.kt @@ -1,6 +1,6 @@ package eu.kanade.tachiyomi -import tachiyomi.core.util.system.ImageUtil +import tachiyomi.core.common.util.system.ImageUtil /** * Used by extensions. diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index 119adf72d..154326514 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi import android.content.Context import eu.kanade.tachiyomi.data.backup.create.BackupCreateJob import eu.kanade.tachiyomi.data.library.LibraryUpdateJob -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore object Migrations { diff --git a/app/src/main/java/eu/kanade/tachiyomi/crash/GlobalExceptionHandler.kt b/app/src/main/java/eu/kanade/tachiyomi/crash/GlobalExceptionHandler.kt index 0b64f296c..600dac444 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/crash/GlobalExceptionHandler.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/crash/GlobalExceptionHandler.kt @@ -10,7 +10,7 @@ import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.Json import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import kotlin.system.exitProcess class GlobalExceptionHandler private constructor( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt index 4ef212999..fc24f245d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt @@ -12,9 +12,9 @@ import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify -import tachiyomi.core.i18n.pluralStringResource -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.storage.displayablePath +import tachiyomi.core.common.i18n.pluralStringResource +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.storage.displayablePath import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.io.File diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt index cd607480d..80c11c62f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt @@ -24,7 +24,7 @@ import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.storage.service.StorageManager import uy.kohesive.injekt.Injekt 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 8bd718206..14d05e239 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 @@ -21,8 +21,8 @@ import logcat.LogPriority import okio.buffer import okio.gzip import okio.sink -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.manga.interactor.GetFavorites import tachiyomi.domain.manga.model.Manga diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt index 1c03f7fce..9f51a0d55 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt @@ -30,6 +30,10 @@ class MangaBackupCreator( // Entry for this manga val mangaObject = manga.toBackupManga() + mangaObject.excludedScanlators = handler.awaitList { + excluded_scanlatorsQueries.getExcludedScanlatorsByMangaId(manga.id) + } + if (options.chapters) { // Backup all the chapters handler.awaitList { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt index e0b8f0add..d14cef230 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt @@ -11,8 +11,8 @@ import eu.kanade.tachiyomi.data.backup.models.StringSetPreferenceValue import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.preferenceKey import eu.kanade.tachiyomi.source.sourcePreferences -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.domain.source.service.SourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get 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 43a8a906c..da202ae55 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 @@ -38,6 +38,7 @@ data class BackupManga( @ProtoNumber(105) var updateStrategy: UpdateStrategy = UpdateStrategy.ALWAYS_UPDATE, @ProtoNumber(106) var lastModifiedAt: Long = 0, @ProtoNumber(107) var favoriteModifiedAt: Long? = null, + @ProtoNumber(108) var excludedScanlators: List = emptyList(), ) { fun getMangaImpl(): Manga { return Manga.create().copy( diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestoreJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestoreJob.kt index 180e8f055..0ecf97e06 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestoreJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestoreJob.kt @@ -19,8 +19,8 @@ import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR class BackupRestoreJob(private val context: Context, workerParams: WorkerParameters) : 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 796d74ae1..a17d33f43 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 @@ -16,7 +16,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import java.io.File import java.text.SimpleDateFormat diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt index f6b9455a3..30dc44368 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt @@ -73,6 +73,7 @@ class MangaRestorer( backupCategories = backupCategories, history = backupManga.history + backupManga.brokenHistory.map { it.toBackupHistory() }, tracks = backupManga.tracking, + excludedScanlators = backupManga.excludedScanlators, ) } } @@ -264,11 +265,13 @@ class MangaRestorer( backupCategories: List, history: List, tracks: List, + excludedScanlators: List, ): Manga { restoreCategories(manga, categories, backupCategories) restoreChapters(manga, chapters) restoreTracking(manga, tracks) restoreHistory(history) + restoreExcludedScanlators(manga, excludedScanlators) updateManga.awaitUpdateFetchInterval(manga, now, currentFetchWindow) return manga } @@ -401,4 +404,25 @@ class MangaRestorer( } private fun Track.forComparison() = this.copy(id = 0L, mangaId = 0L) + + /** + * Restores the excluded scanlators for the manga. + * + * @param manga the manga whose excluded scanlators have to be restored. + * @param excludedScanlators the excluded scanlators to restore. + */ + private suspend fun restoreExcludedScanlators(manga: Manga, excludedScanlators: List) { + if (excludedScanlators.isEmpty()) return + val existingExcludedScanlators = handler.awaitList { + excluded_scanlatorsQueries.getExcludedScanlatorsByMangaId(manga.id) + } + val toInsert = excludedScanlators.filter { it !in existingExcludedScanlators } + if (toInsert.isNotEmpty()) { + handler.await { + toInsert.forEach { + excluded_scanlatorsQueries.insert(manga.id, it) + } + } + } + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt index 1062937d4..4871e3949 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt @@ -12,8 +12,8 @@ import eu.kanade.tachiyomi.data.backup.models.StringPreferenceValue import eu.kanade.tachiyomi.data.backup.models.StringSetPreferenceValue import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.source.sourcePreferences -import tachiyomi.core.preference.AndroidPreferenceStore -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.AndroidPreferenceStore +import tachiyomi.core.common.preference.PreferenceStore import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get 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 56d6262c9..bbdf85c10 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt @@ -12,7 +12,7 @@ import logcat.LogPriority import okhttp3.Response import okio.buffer import okio.sink -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import java.io.File import java.io.IOException 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 561d32b91..978f65bc9 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 @@ -27,7 +27,7 @@ import okio.Source import okio.buffer import okio.sink import okio.source -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.MangaCover import tachiyomi.domain.source.service.SourceManager diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/TachiyomiImageDecoder.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/TachiyomiImageDecoder.kt index fb1278614..acbda8cc5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/TachiyomiImageDecoder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/TachiyomiImageDecoder.kt @@ -9,7 +9,7 @@ import coil.decode.ImageSource import coil.fetch.SourceResult import coil.request.Options import okio.BufferedSource -import tachiyomi.core.util.system.ImageUtil +import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.decoder.ImageDecoder /** 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 9d7f98983..aac7ec4c3 100644 --- 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 @@ -8,7 +8,7 @@ interface Track : Serializable { var manga_id: Long - var tracker_id: Int + var tracker_id: Long var remote_id: Long @@ -16,13 +16,13 @@ interface Track : Serializable { var title: String - var last_chapter_read: Float + var last_chapter_read: Double - var total_chapters: Int + var total_chapters: Long - var score: Float + var score: Double - var status: Int + var status: Long var started_reading_date: Long @@ -40,7 +40,7 @@ interface Track : Serializable { companion object { fun create(serviceId: Long): Track = TrackImpl().apply { - tracker_id = serviceId.toInt() + tracker_id = serviceId } } } 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 2a0abce31..85868219f 100644 --- 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 @@ -6,7 +6,7 @@ class TrackImpl : Track { override var manga_id: Long = 0 - override var tracker_id: Int = 0 + override var tracker_id: Long = 0 override var remote_id: Long = 0 @@ -14,13 +14,13 @@ class TrackImpl : Track { override lateinit var title: String - override var last_chapter_read: Float = 0F + override var last_chapter_read: Double = 0.0 - override var total_chapters: Int = 0 + override var total_chapters: Long = 0 - override var score: Float = 0f + override var score: Double = 0.0 - override var status: Int = 0 + override var status: Long = 0 override var started_reading_date: Long = 0 diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt index b09cca3bc..fb1c8e176 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt @@ -39,11 +39,11 @@ import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.protobuf.ProtoBuf import logcat.LogPriority -import tachiyomi.core.storage.extension -import tachiyomi.core.storage.nameWithoutExtension -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.storage.extension +import tachiyomi.core.common.storage.nameWithoutExtension +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt index 3e447f4ab..01a342859 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt @@ -14,10 +14,10 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.runBlocking import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.storage.extension -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.storage.extension +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.download.service.DownloadPreferences @@ -315,13 +315,13 @@ class DownloadManager( val capitalizationChanged = oldFolder.name.equals(newName, ignoreCase = true) if (capitalizationChanged) { val tempName = newName + Downloader.TMP_DIR_SUFFIX - if (oldFolder.renameTo(tempName).not()) { + if (!oldFolder.renameTo(tempName)) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } return } } - if (oldFolder.renameTo(newName).not()) { + if (!oldFolder.renameTo(newName)) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt index 0d9f6152a..4acd8322e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt @@ -14,7 +14,7 @@ import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.util.regex.Pattern 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 f6d8e064b..001395af1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -5,9 +5,9 @@ import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.util.storage.DiskUtil import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.storage.displayablePath -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.storage.displayablePath +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.storage.service.StorageManager @@ -130,7 +130,7 @@ class DownloadProvider( val newChapterName = sanitizeChapterName(chapterName) return DiskUtil.buildValidFilename( when { - chapterScanlator.isNullOrBlank().not() -> "${chapterScanlator}_$newChapterName" + !chapterScanlator.isNullOrBlank() -> "${chapterScanlator}_$newChapterName" else -> newChapterName }, ) 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 8b54cfabd..facbe605a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -40,15 +40,15 @@ import kotlinx.coroutines.supervisorScope import logcat.LogPriority import nl.adaptivity.xmlutil.serialization.XML import okhttp3.Response -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.storage.extension +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchNow +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.ImageUtil +import tachiyomi.core.common.util.system.logcat import tachiyomi.core.metadata.comicinfo.COMIC_INFO_FILE import tachiyomi.core.metadata.comicinfo.ComicInfo -import tachiyomi.core.storage.extension -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchNow -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.ImageUtil -import tachiyomi.core.util.system.logcat import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.download.service.DownloadPreferences 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 578743da8..258b1f754 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt @@ -39,10 +39,10 @@ import kotlinx.coroutines.ensureActive import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.preference.getAndSet -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.preference.getAndSet +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.chapter.model.Chapter @@ -384,7 +384,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet private fun writeErrorFile(errors: List>): File { try { if (errors.isNotEmpty()) { - val file = context.createFileInCacheDir("tachiyomi_update_errors.txt") + val file = context.createFileInCacheDir("mihon_update_errors.txt") file.bufferedWriter().use { out -> out.write(context.stringResource(MR.strings.library_errors_help, ERROR_LOG_HELP_URL) + "\n\n") // Error file format: diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt index c21dd7d32..4d13dc724 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt @@ -26,10 +26,10 @@ import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.getBitmapOrNull import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify -import tachiyomi.core.Constants -import tachiyomi.core.i18n.pluralStringResource -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.launchUI +import tachiyomi.core.common.Constants +import tachiyomi.core.common.i18n.pluralStringResource +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.lang.launchUI import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.library.model.LibraryManga import tachiyomi.domain.manga.model.Manga diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt index 348b41ca3..c6401ef72 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt @@ -27,8 +27,8 @@ import kotlinx.coroutines.ensureActive import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.library.model.LibraryManga import tachiyomi.domain.manga.interactor.GetLibraryManga import tachiyomi.domain.manga.model.Manga diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt index aba7de79d..f8435daec 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt @@ -7,7 +7,7 @@ import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.extension.util.ExtensionInstaller import eu.kanade.tachiyomi.ui.main.MainActivity -import tachiyomi.core.Constants +import tachiyomi.core.common.Constants /** * Class that manages [PendingIntent] of activity's diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt index 7d6e9099e..de9e55803 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -18,8 +18,8 @@ import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.runBlocking -import tachiyomi.core.Constants -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.Constants +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.chapter.interactor.GetChapter import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.model.Chapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt index 7632d06db..6b34d124d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt @@ -7,7 +7,7 @@ import androidx.core.app.NotificationManagerCompat.IMPORTANCE_HIGH import androidx.core.app.NotificationManagerCompat.IMPORTANCE_LOW import eu.kanade.tachiyomi.util.system.buildNotificationChannel import eu.kanade.tachiyomi.util.system.buildNotificationChannelGroup -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/saver/ImageSaver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/saver/ImageSaver.kt index 0bf0aae68..beefba353 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/saver/ImageSaver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/saver/ImageSaver.kt @@ -15,9 +15,9 @@ import eu.kanade.tachiyomi.util.storage.cacheImageDir import eu.kanade.tachiyomi.util.storage.getUriCompat import logcat.LogPriority import okio.IOException -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.system.ImageUtil -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.system.ImageUtil +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt index 5a57e2563..8f88f1051 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt @@ -10,9 +10,9 @@ import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.util.system.toast import logcat.LogPriority import okhttp3.OkHttpClient -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.interactor.InsertTrack import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -40,8 +40,8 @@ abstract class BaseTracker( return track.score } - override fun indexToScore(index: Int): Float { - return index.toFloat() + override fun indexToScore(index: Int): Double { + return index.toDouble() } @CallSuper @@ -70,24 +70,24 @@ abstract class BaseTracker( } } - override suspend fun setRemoteStatus(track: Track, status: Int) { + override suspend fun setRemoteStatus(track: Track, status: Long) { track.status = status - if (track.status == getCompletionStatus() && track.total_chapters != 0) { - track.last_chapter_read = track.total_chapters.toFloat() + if (track.status == getCompletionStatus() && track.total_chapters != 0L) { + track.last_chapter_read = track.total_chapters.toDouble() } updateRemote(track) } override suspend fun setRemoteLastChapterRead(track: Track, chapterNumber: Int) { if ( - track.last_chapter_read == 0f && + track.last_chapter_read == 0.0 && track.last_chapter_read < chapterNumber && track.status != getRereadingStatus() ) { track.status = getReadingStatus() } - track.last_chapter_read = chapterNumber.toFloat() - if (track.total_chapters != 0 && track.last_chapter_read.toInt() == track.total_chapters) { + track.last_chapter_read = chapterNumber.toDouble() + if (track.total_chapters != 0L && track.last_chapter_read.toLong() == track.total_chapters) { track.status = getCompletionStatus() track.finished_reading_date = System.currentTimeMillis() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt index 59cf64648..06644e932 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt @@ -27,22 +27,22 @@ interface Tracker { @DrawableRes fun getLogo(): Int - fun getStatusList(): List + fun getStatusList(): List - fun getStatus(status: Int): StringResource? + fun getStatus(status: Long): StringResource? - fun getReadingStatus(): Int + fun getReadingStatus(): Long - fun getRereadingStatus(): Int + fun getRereadingStatus(): Long - fun getCompletionStatus(): Int + fun getCompletionStatus(): Long fun getScoreList(): ImmutableList // TODO: Store all scores as 10 point in the future maybe? fun get10PointScore(track: DomainTrack): Double - fun indexToScore(index: Int): Float + fun indexToScore(index: Int): Double fun displayScore(track: DomainTrack): String @@ -70,7 +70,7 @@ interface Tracker { // TODO: move this to an interactor, and update all trackers based on common data suspend fun register(item: Track, mangaId: Long) - suspend fun setRemoteStatus(track: Track, status: Int) + suspend fun setRemoteStatus(track: Track, status: Long) suspend fun setRemoteLastChapterRead(track: Track, chapterNumber: Int) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt index 93fd75a45..abf0d702a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt @@ -20,12 +20,12 @@ import tachiyomi.domain.track.model.Track as DomainTrack class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { companion object { - const val READING = 1 - const val COMPLETED = 2 - const val ON_HOLD = 3 - const val DROPPED = 4 - const val PLAN_TO_READ = 5 - const val REREADING = 6 + const val READING = 1L + const val COMPLETED = 2L + const val ON_HOLD = 3L + const val DROPPED = 4L + const val PLAN_TO_READ = 5L + const val REREADING = 6L const val POINT_100 = "POINT_100" const val POINT_10 = "POINT_10" @@ -58,11 +58,11 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { override fun getLogoColor() = Color.rgb(18, 25, 35) - override fun getStatusList(): List { + override fun getStatusList(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ, REREADING) } - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed @@ -72,11 +72,11 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = REREADING + override fun getRereadingStatus(): Long = REREADING - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList { return when (scorePreference.get()) { @@ -99,24 +99,24 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { return track.score / 10.0 } - override fun indexToScore(index: Int): Float { + override fun indexToScore(index: Int): Double { return when (scorePreference.get()) { // 10 point - POINT_10 -> index * 10f + POINT_10 -> index * 10.0 // 100 point - POINT_100 -> index.toFloat() + POINT_100 -> index.toDouble() // 5 stars POINT_5 -> when (index) { - 0 -> 0f - else -> index * 20f - 10f + 0 -> 0.0 + else -> index * 20.0 - 10.0 } // Smiley POINT_3 -> when (index) { - 0 -> 0f - else -> index * 25f + 10f + 0 -> 0.0 + else -> index * 25.0 + 10.0 } // 10 point decimal - POINT_10_DECIMAL -> index.toFloat() + POINT_10_DECIMAL -> index.toDouble() else -> throw Exception("Unknown score type") } } @@ -153,12 +153,12 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED track.finished_reading_date = System.currentTimeMillis() } else if (track.status != REREADING) { track.status = READING - if (track.last_chapter_read == 1F) { + if (track.last_chapter_read == 1.0) { track.started_reading_date = System.currentTimeMillis() } } @@ -185,14 +185,14 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { if (track.status != COMPLETED) { val isRereading = track.status == REREADING - track.status = if (isRereading.not() && hasReadChapters) READING else track.status + track.status = if (!isRereading && hasReadChapters) READING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ - track.score = 0F + track.score = 0.0 add(track) } } 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 3037220fe..c808d0f31 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -20,11 +20,12 @@ import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.long +import kotlinx.serialization.json.longOrNull import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonObject import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import java.time.Instant import java.time.LocalDate @@ -312,7 +313,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { struct["format"]!!.jsonPrimitive.content.replace("_", "-"), struct["status"]!!.jsonPrimitive.contentOrNull ?: "", parseDate(struct, "startDate"), - struct["chapters"]!!.jsonPrimitive.intOrNull ?: 0, + struct["chapters"]!!.jsonPrimitive.longOrNull ?: 0, struct["averageScore"]?.jsonPrimitive?.intOrNull ?: -1, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt index 8c21070c4..388b3e1b5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.track.anilist +import eu.kanade.tachiyomi.BuildConfig import okhttp3.Interceptor import okhttp3.Response import java.io.IOException @@ -40,6 +41,7 @@ class AnilistInterceptor(val anilist: Anilist, private var token: String?) : Int // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.access_token}") + .header("User-Agent", "Mihon v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt index ed5550464..d7c037afe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt @@ -19,7 +19,7 @@ data class ALManga( val format: String, val publishing_status: String, val start_date_fuzzy: Long, - val total_chapters: Int, + val total_chapters: Long, val average_score: Int, ) { @@ -29,7 +29,7 @@ data class ALManga( total_chapters = this@ALManga.total_chapters cover_url = image_url_lge summary = description?.htmlDecode() ?: "" - score = average_score.toFloat() + score = average_score.toDouble() tracking_url = AnilistApi.mangaUrl(remote_id) publishing_status = this@ALManga.publishing_status publishing_type = format @@ -58,10 +58,10 @@ data class ALUserManga( remote_id = manga.remote_id title = manga.title_user_pref status = toTrackStatus() - score = score_raw.toFloat() + score = score_raw.toDouble() started_reading_date = start_date_fuzzy finished_reading_date = completed_date_fuzzy - last_chapter_read = chapters_read.toFloat() + last_chapter_read = chapters_read.toDouble() library_id = this@ALUserManga.library_id total_chapters = manga.total_chapters } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt index a85d5e583..b8e7d2acc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt @@ -35,7 +35,7 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { override suspend fun update(track: Track, didReadChapter: Boolean): Track { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING @@ -64,7 +64,7 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ - track.score = 0F + track.score = 0.0 add(track) update(track) } @@ -87,11 +87,11 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { override fun getLogoColor() = Color.rgb(240, 145, 153) - override fun getStatusList(): List { + override fun getStatusList(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ) } - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed @@ -100,11 +100,11 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = -1 + override fun getRereadingStatus(): Long = -1 - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override suspend fun login(username: String, password: String) = login(password) @@ -137,11 +137,11 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { } companion object { - const val READING = 3 - const val COMPLETED = 2 - const val ON_HOLD = 4 - const val DROPPED = 5 - const val PLAN_TO_READ = 1 + const val READING = 3L + const val COMPLETED = 2L + const val ON_HOLD = 4L + const val DROPPED = 5L + const val PLAN_TO_READ = 1L private val SCORE_LIST = IntRange(0, 10) .map(Int::toString) 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 9d2073707..65d2dc805 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 @@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.contentOrNull -import kotlinx.serialization.json.floatOrNull +import kotlinx.serialization.json.doubleOrNull import kotlinx.serialization.json.int import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject @@ -21,7 +21,7 @@ import okhttp3.CacheControl import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.Request -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import java.net.URLEncoder import java.nio.charset.StandardCharsets @@ -105,11 +105,11 @@ class BangumiApi( "" } val totalChapters = if (obj["eps_count"] != null) { - obj["eps_count"]!!.jsonPrimitive.int + obj["eps_count"]!!.jsonPrimitive.long } else { 0 } - val rating = obj["rating"]?.jsonObject?.get("score")?.jsonPrimitive?.floatOrNull ?: -1f + val rating = obj["rating"]?.jsonObject?.get("score")?.jsonPrimitive?.doubleOrNull ?: -1.0 return TrackSearch.create(trackId).apply { remote_id = obj["id"]!!.jsonPrimitive.long title = obj["name_cn"]!!.jsonPrimitive.content @@ -152,7 +152,7 @@ class BangumiApi( } else { json.decodeFromString(responseBody).let { track.status = it.status?.id!! - track.last_chapter_read = it.ep_status!!.toFloat() + track.last_chapter_read = it.ep_status!!.toDouble() track.score = it.rating!! track } @@ -182,8 +182,8 @@ class BangumiApi( ) companion object { - private const val clientId = "bgm10555cda0762e80ca" - private const val clientSecret = "8fff394a8627b4c388cbf349ec865775" + private const val clientId = "bgm291665acbd06a4c28" + private const val clientSecret = "43e5ce36b207de16e5d3cfd3e79118db" private const val apiUrl = "https://api.bgm.tv" private const val oauthUrl = "https://bgm.tv/oauth/access_token" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt index d2183fdbf..a1822cca0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.track.bangumi +import eu.kanade.tachiyomi.BuildConfig import kotlinx.serialization.json.Json import okhttp3.FormBody import okhttp3.Interceptor @@ -29,22 +30,23 @@ class BangumiInterceptor(private val bangumi: Bangumi) : Interceptor { } } - val authRequest = if (originalRequest.method == "GET") { - originalRequest.newBuilder() - .header("User-Agent", "Tachiyomi") - .url( - originalRequest.url.newBuilder() - .addQueryParameter("access_token", currAuth.access_token).build(), - ) - .build() - } else { - originalRequest.newBuilder() - .post(addToken(currAuth.access_token, originalRequest.body as FormBody)) - .header("User-Agent", "Tachiyomi") - .build() - } - - return chain.proceed(authRequest) + return originalRequest.newBuilder() + .header( + "User-Agent", + "antsylich/Mihon/v${BuildConfig.VERSION_NAME} (Android) (http://github.com/mihonapp/mihon)", + ) + .apply { + if (originalRequest.method == "GET") { + val newUrl = originalRequest.url.newBuilder() + .addQueryParameter("access_token", currAuth.access_token) + .build() + url(newUrl) + } else { + post(addToken(currAuth.access_token, originalRequest.body as FormBody)) + } + } + .build() + .let(chain::proceed) } fun newAuth(oauth: OAuth?) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiModels.kt index 445fb5194..c4b1aeed7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiModels.kt @@ -16,7 +16,7 @@ data class Collection( val comment: String? = "", val ep_status: Int? = 0, val lasttouch: Int? = 0, - val rating: Float? = 0f, + val rating: Double? = 0.0, val status: Status? = Status(), val tag: List? = emptyList(), val user: User? = User(), @@ -25,7 +25,7 @@ data class Collection( @Serializable data class Status( - val id: Int? = 0, + val id: Long? = 0, val name: String? = "", val type: String? = "", ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt index bcfbb1ec5..a9aed629b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt @@ -22,9 +22,9 @@ import tachiyomi.domain.track.model.Track as DomainTrack class Kavita(id: Long) : BaseTracker(id, "Kavita"), EnhancedTracker { companion object { - const val UNREAD = 1 - const val READING = 2 - const val COMPLETED = 3 + const val UNREAD = 1L + const val READING = 2L + const val COMPLETED = 3L } var authentications: OAuth? = null @@ -38,20 +38,20 @@ class Kavita(id: Long) : BaseTracker(id, "Kavita"), EnhancedTracker { override fun getLogoColor() = Color.rgb(74, 198, 148) - override fun getStatusList() = listOf(UNREAD, READING, COMPLETED) + override fun getStatusList(): List = listOf(UNREAD, READING, COMPLETED) - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { UNREAD -> MR.strings.unread READING -> MR.strings.reading COMPLETED -> MR.strings.completed else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = -1 + override fun getRereadingStatus(): Long = -1 - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = persistentListOf() @@ -60,7 +60,7 @@ class Kavita(id: Long) : BaseTracker(id, "Kavita"), EnhancedTracker { override suspend fun update(track: Track, didReadChapter: Boolean): Track { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaApi.kt index 5eb753e03..fd1b26197 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaApi.kt @@ -12,8 +12,8 @@ import okhttp3.Dns import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.io.IOException import java.net.SocketTimeoutException @@ -93,7 +93,7 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor * Ignores volumes. * Volumes consisting of 1 file treated as chapter */ - private fun getTotalChapters(url: String): Int { + private fun getTotalChapters(url: String): Long { val requestUrl = getApiVolumesUrl(url) try { val listVolumeDto = with(json) { @@ -101,13 +101,13 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor .execute() .parseAs>() } - var volumeNumber = 0 - var maxChapterNumber = 0 + var volumeNumber = 0L + var maxChapterNumber = 0L for (volume in listVolumeDto) { if (volume.chapters.maxOf { it.number!!.toFloat() } == 0f) { volumeNumber++ } else if (maxChapterNumber < volume.chapters.maxOf { it.number!!.toFloat() }) { - maxChapterNumber = volume.chapters.maxOf { it.number!!.toFloat().toInt() } + maxChapterNumber = volume.chapters.maxOf { it.number!!.toFloat().toLong() } } } @@ -118,17 +118,17 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor } } - private fun getLatestChapterRead(url: String): Float { + private fun getLatestChapterRead(url: String): Double { val seriesId = getIdFromUrl(url) val requestUrl = "${getApiFromUrl(url)}/Tachiyomi/latest-chapter?seriesId=$seriesId" try { with(json) { authClient.newCall(GET(requestUrl)).execute().use { if (it.code == 200) { - return it.parseAs().number!!.replace(",", ".").toFloat() + return it.parseAs().number!!.replace(",", ".").toDouble() } if (it.code == 204) { - return 0F + return 0.0 } } } @@ -139,7 +139,7 @@ class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor ) { "Exception getting latest chapter read. Could not get itemRequest: $requestUrl" } throw e } - return 0F + return 0.0 } suspend fun getTrackSearch(url: String): TrackSearch = withIOContext { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaInterceptor.kt index 8b26c3e02..89708ccc5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaInterceptor.kt @@ -18,7 +18,7 @@ class KavitaInterceptor(private val kavita: Kavita) : Interceptor { // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer $jwtToken") - .header("User-Agent", "Tachiyomi Kavita v${BuildConfig.VERSION_NAME}") + .header("User-Agent", "Mihon v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt index 03bfcd137..4b0db8bce 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt @@ -19,11 +19,11 @@ import tachiyomi.domain.track.model.Track as DomainTrack class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { companion object { - const val READING = 1 - const val COMPLETED = 2 - const val ON_HOLD = 3 - const val DROPPED = 4 - const val PLAN_TO_READ = 5 + const val READING = 1L + const val COMPLETED = 2L + const val ON_HOLD = 3L + const val DROPPED = 4L + const val PLAN_TO_READ = 5L } override val supportsReadingDates: Boolean = true @@ -38,11 +38,11 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { override fun getLogoColor() = Color.rgb(51, 37, 50) - override fun getStatusList(): List { + override fun getStatusList(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ) } - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed @@ -51,19 +51,19 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = -1 + override fun getRereadingStatus(): Long = -1 - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList { val df = DecimalFormat("0.#") return (listOf("0") + IntRange(2, 20).map { df.format(it / 2f) }).toImmutableList() } - override fun indexToScore(index: Int): Float { - return if (index > 0) (index + 1) / 2f else 0f + override fun indexToScore(index: Int): Double { + return if (index > 0) (index + 1) / 2.0 else 0.0 } override fun displayScore(track: DomainTrack): String { @@ -78,12 +78,12 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { override suspend fun update(track: Track, didReadChapter: Boolean): Track { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED track.finished_reading_date = System.currentTimeMillis() } else { track.status = READING - if (track.last_chapter_read == 1F) { + if (track.last_chapter_read == 1.0) { track.started_reading_date = System.currentTimeMillis() } } @@ -110,7 +110,7 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { update(track) } else { track.status = if (hasReadChapters) READING else PLAN_TO_READ - track.score = 0F + track.score = 0.0 add(track) } } 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 e6c3acadf..3c9251eaf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt @@ -25,7 +25,7 @@ import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import java.net.URLEncoder import java.nio.charset.StandardCharsets diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt index fe7e42292..da9aff7fc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.track.kitsu +import eu.kanade.tachiyomi.BuildConfig import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response @@ -34,6 +35,7 @@ class KitsuInterceptor(private val kitsu: Kitsu) : Interceptor { // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.access_token}") + .header("User-Agent", "Mihon v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .header("Accept", "application/vnd.api+json") .header("Content-Type", "application/vnd.api+json") .build() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt index ba6684339..752ef4e12 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt @@ -8,10 +8,10 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.int -import kotlinx.serialization.json.intOrNull import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.long +import kotlinx.serialization.json.longOrNull import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -19,7 +19,7 @@ import java.util.Locale class KitsuSearchManga(obj: JsonObject) { val id = obj["id"]!!.jsonPrimitive.long private val canonicalTitle = obj["canonicalTitle"]!!.jsonPrimitive.content - private val chapterCount = obj["chapterCount"]?.jsonPrimitive?.intOrNull + private val chapterCount = obj["chapterCount"]?.jsonPrimitive?.longOrNull val subType = obj["subtype"]?.jsonPrimitive?.contentOrNull val original = try { obj["posterImage"]?.jsonObject?.get("original")?.jsonPrimitive?.content @@ -28,7 +28,7 @@ class KitsuSearchManga(obj: JsonObject) { null } private val synopsis = obj["synopsis"]?.jsonPrimitive?.contentOrNull - private val rating = obj["averageRating"]?.jsonPrimitive?.contentOrNull?.toFloatOrNull() + private val rating = obj["averageRating"]?.jsonPrimitive?.contentOrNull?.toDoubleOrNull() private var startDate = obj["startDate"]?.jsonPrimitive?.contentOrNull?.let { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) outputDf.format(Date(it.toLong() * 1000)) @@ -43,7 +43,7 @@ class KitsuSearchManga(obj: JsonObject) { cover_url = original ?: "" summary = synopsis ?: "" tracking_url = KitsuApi.mangaUrl(remote_id) - score = rating ?: -1f + score = rating ?: -1.0 publishing_status = if (endDate == null) { "Publishing" } else { @@ -57,7 +57,7 @@ class KitsuSearchManga(obj: JsonObject) { class KitsuLibManga(obj: JsonObject, manga: JsonObject) { val id = manga["id"]!!.jsonPrimitive.int private val canonicalTitle = manga["attributes"]!!.jsonObject["canonicalTitle"]!!.jsonPrimitive.content - private val chapterCount = manga["attributes"]!!.jsonObject["chapterCount"]?.jsonPrimitive?.intOrNull + private val chapterCount = manga["attributes"]!!.jsonObject["chapterCount"]?.jsonPrimitive?.longOrNull val type = manga["attributes"]!!.jsonObject["mangaType"]?.jsonPrimitive?.contentOrNull.orEmpty() val original = manga["attributes"]!!.jsonObject["posterImage"]!!.jsonObject["original"]!!.jsonPrimitive.content private val synopsis = manga["attributes"]!!.jsonObject["synopsis"]!!.jsonPrimitive.content @@ -82,8 +82,8 @@ class KitsuLibManga(obj: JsonObject, manga: JsonObject) { started_reading_date = KitsuDateHelper.parse(startedAt) finished_reading_date = KitsuDateHelper.parse(finishedAt) status = toTrackStatus() - score = ratingTwenty?.let { it.toInt() / 2f } ?: 0f - last_chapter_read = progress.toFloat() + score = ratingTwenty?.let { it.toInt() / 2.0 } ?: 0.0 + last_chapter_read = progress.toDouble() } private fun toTrackStatus() = when (status) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt index 6e69bf764..eee8941a3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt @@ -19,9 +19,9 @@ import tachiyomi.domain.track.model.Track as DomainTrack class Komga(id: Long) : BaseTracker(id, "Komga"), EnhancedTracker { companion object { - const val UNREAD = 1 - const val READING = 2 - const val COMPLETED = 3 + const val UNREAD = 1L + const val READING = 2L + const val COMPLETED = 3L } override val client: OkHttpClient = @@ -35,20 +35,20 @@ class Komga(id: Long) : BaseTracker(id, "Komga"), EnhancedTracker { override fun getLogoColor() = Color.rgb(51, 37, 50) - override fun getStatusList() = listOf(UNREAD, READING, COMPLETED) + override fun getStatusList(): List = listOf(UNREAD, READING, COMPLETED) - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { UNREAD -> MR.strings.unread READING -> MR.strings.reading COMPLETED -> MR.strings.completed else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = -1 + override fun getRereadingStatus(): Long = -1 - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = persistentListOf() @@ -57,7 +57,7 @@ class Komga(id: Long) : BaseTracker(id, "Komga"), EnhancedTracker { override suspend fun update(track: Track, didReadChapter: Boolean): Track { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt index 5992727ae..a8661bf18 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.track.komga +import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.network.GET @@ -8,12 +9,13 @@ import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import logcat.LogPriority +import okhttp3.Headers import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy private const val READLIST_API = "/api/v1/readlists" @@ -23,6 +25,12 @@ class KomgaApi( private val client: OkHttpClient, ) { + private val headers: Headers by lazy { + Headers.Builder() + .add("User-Agent", "Mihon v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") + .build() + } + private val json: Json by injectLazy() suspend fun getTrackSearch(url: String): TrackSearch = @@ -30,12 +38,12 @@ class KomgaApi( try { val track = with(json) { if (url.contains(READLIST_API)) { - client.newCall(GET(url)) + client.newCall(GET(url, headers)) .awaitSuccess() .parseAs() .toTrack() } else { - client.newCall(GET(url)) + client.newCall(GET(url, headers)) .awaitSuccess() .parseAs() .toTrack() @@ -43,7 +51,9 @@ class KomgaApi( } val progress = client - .newCall(GET("${url.replace("/api/v1/series/", "/api/v2/series/")}/read-progress/tachiyomi")) + .newCall( + GET("${url.replace("/api/v1/series/", "/api/v2/series/")}/read-progress/tachiyomi", headers), + ) .awaitSuccess().let { with(json) { if (url.contains("/api/v1/series/")) { @@ -57,7 +67,7 @@ class KomgaApi( track.apply { cover_url = "$url/thumbnail" tracking_url = url - total_chapters = progress.maxNumberSort.toInt() + total_chapters = progress.maxNumberSort.toLong() status = when (progress.booksCount) { progress.booksUnreadCount -> Komga.UNREAD progress.booksReadCount -> Komga.COMPLETED @@ -80,6 +90,7 @@ class KomgaApi( client.newCall( Request.Builder() .url("${track.tracking_url.replace("/api/v1/series/", "/api/v2/series/")}/read-progress/tachiyomi") + .headers(headers) .put(payload.toRequestBody("application/json".toMediaType())) .build(), ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt index 3b8a4ce4a..6d1601ac0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt @@ -65,7 +65,7 @@ data class ReadProgressUpdateDto( @Serializable data class ReadProgressUpdateV2Dto( - val lastBookNumberSortRead: Float, + val lastBookNumberSortRead: Double, ) @Serializable @@ -91,7 +91,7 @@ data class ReadProgressDto( booksReadCount, booksUnreadCount, booksInProgressCount, - lastReadContinuousIndex.toFloat(), + lastReadContinuousIndex.toDouble(), booksCount.toFloat(), ) } @@ -102,6 +102,6 @@ data class ReadProgressV2Dto( val booksReadCount: Int, val booksUnreadCount: Int, val booksInProgressCount: Int, - val lastReadContinuousNumberSort: Float, + val lastReadContinuousNumberSort: Double, val maxNumberSort: Float, ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt index f5c33cf8d..6219e728b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt @@ -6,6 +6,8 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.DeletableTracker +import eu.kanade.tachiyomi.data.track.mangaupdates.dto.ListItem +import eu.kanade.tachiyomi.data.track.mangaupdates.dto.Rating import eu.kanade.tachiyomi.data.track.mangaupdates.dto.copyTo import eu.kanade.tachiyomi.data.track.mangaupdates.dto.toTrackSearch import eu.kanade.tachiyomi.data.track.model.TrackSearch @@ -17,16 +19,22 @@ import tachiyomi.domain.track.model.Track as DomainTrack class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker { companion object { - const val READING_LIST = 0 - const val WISH_LIST = 1 - const val COMPLETE_LIST = 2 - const val UNFINISHED_LIST = 3 - const val ON_HOLD_LIST = 4 + const val READING_LIST = 0L + const val WISH_LIST = 1L + const val COMPLETE_LIST = 2L + const val UNFINISHED_LIST = 3L + const val ON_HOLD_LIST = 4L - private val SCORE_LIST = ( - (0..9) - .flatMap { i -> (0..9).map { j -> "$i.$j" } } + listOf("10.0") - ) + private val SCORE_LIST = (0..10) + .flatMap { decimal -> + when (decimal) { + 0 -> listOf("-") + 10 -> listOf("10.0") + else -> (0..9).map { fraction -> + "$decimal.$fraction" + } + } + } .toImmutableList() } @@ -38,11 +46,11 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker override fun getLogoColor(): Int = Color.rgb(146, 160, 173) - override fun getStatusList(): List { + override fun getStatusList(): List { return listOf(READING_LIST, COMPLETE_LIST, ON_HOLD_LIST, UNFINISHED_LIST, WISH_LIST) } - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { READING_LIST -> MR.strings.reading_list WISH_LIST -> MR.strings.wish_list COMPLETE_LIST -> MR.strings.complete_list @@ -51,15 +59,15 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker else -> null } - override fun getReadingStatus(): Int = READING_LIST + override fun getReadingStatus(): Long = READING_LIST - override fun getRereadingStatus(): Int = -1 + override fun getRereadingStatus(): Long = -1 - override fun getCompletionStatus(): Int = COMPLETE_LIST + override fun getCompletionStatus(): Long = COMPLETE_LIST override fun getScoreList(): ImmutableList = SCORE_LIST - override fun indexToScore(index: Int): Float = SCORE_LIST[index].toFloat() + override fun indexToScore(index: Int): Double = if (index == 0) 0.0 else SCORE_LIST[index].toDouble() override fun displayScore(track: DomainTrack): String = track.score.toString() @@ -78,9 +86,9 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker override suspend fun bind(track: Track, hasReadChapters: Boolean): Track { return try { val (series, rating) = api.getSeriesListItem(track) - series.copyTo(track) - rating?.copyTo(track) ?: track + track.copyFrom(series, rating) } catch (e: Exception) { + track.score = 0.0 api.addSeriesToList(track, hasReadChapters) track } @@ -95,8 +103,12 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker override suspend fun refresh(track: Track): Track { val (series, rating) = api.getSeriesListItem(track) - series.copyTo(track) - return rating?.copyTo(track) ?: track + return track.copyFrom(series, rating) + } + + private fun Track.copyFrom(item: ListItem, rating: Rating?): Track = apply { + item.copyTo(this) + score = rating?.rating ?: 0.0 } override suspend fun login(username: String, password: String) { @@ -106,6 +118,6 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker } fun restoreSession(): String? { - return trackPreferences.trackPassword(this).get() + return trackPreferences.trackPassword(this).get().ifBlank { null } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt index 794ad11ef..5da3b7222 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt @@ -28,7 +28,7 @@ import logcat.LogPriority import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.model.Track as DomainTrack @@ -79,7 +79,7 @@ class MangaUpdatesApi( .let { if (it.code == 200) { track.status = status - track.last_chapter_read = 1f + track.last_chapter_read = 1.0 } } } @@ -133,7 +133,8 @@ class MangaUpdatesApi( } private suspend fun updateSeriesRating(track: Track) { - if (track.score != 0f) { + if (track.score < 0.0) return + if (track.score != 0.0) { val body = buildJsonObject { put("rating", track.score) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesInterceptor.kt index 2b283c3b8..094471b18 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesInterceptor.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.track.mangaupdates +import eu.kanade.tachiyomi.BuildConfig import okhttp3.Interceptor import okhttp3.Response import java.io.IOException @@ -18,6 +19,7 @@ class MangaUpdatesInterceptor( // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer $token") + .header("User-Agent", "Mihon v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/ListItem.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/ListItem.kt index 4ed8bd705..15a551078 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/ListItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/ListItem.kt @@ -9,7 +9,7 @@ import kotlinx.serialization.Serializable data class ListItem( val series: Series? = null, @SerialName("list_id") - val listId: Int? = null, + val listId: Long? = null, val status: Status? = null, val priority: Int? = null, ) @@ -17,6 +17,6 @@ data class ListItem( fun ListItem.copyTo(track: Track): Track { return track.apply { this.status = listId ?: READING_LIST - this.last_chapter_read = this@copyTo.status?.chapter?.toFloat() ?: 0f + this.last_chapter_read = this@copyTo.status?.chapter?.toDouble() ?: 0.0 } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/Rating.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/Rating.kt index b550a37f4..89a55b413 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/Rating.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/Rating.kt @@ -5,11 +5,11 @@ import kotlinx.serialization.Serializable @Serializable data class Rating( - val rating: Float? = null, + val rating: Double? = null, ) fun Rating.copyTo(track: Track): Track { return track.apply { - this.score = rating ?: 0f + this.score = rating ?: 0.0 } } 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 b8a71687f..c1af76ebf 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 @@ -8,7 +8,7 @@ class TrackSearch : Track { override var manga_id: Long = 0 - override var tracker_id: Int = 0 + override var tracker_id: Long = 0 override var remote_id: Long = 0 @@ -16,13 +16,13 @@ class TrackSearch : Track { override lateinit var title: String - override var last_chapter_read: Float = 0F + override var last_chapter_read: Double = 0.0 - override var total_chapters: Int = 0 + override var total_chapters: Long = 0 - override var score: Float = -1f + override var score: Double = -1.0 - override var status: Int = 0 + override var status: Long = 0 override var started_reading_date: Long = 0 @@ -55,14 +55,14 @@ class TrackSearch : Track { override fun hashCode(): Int { var result = manga_id.hashCode() - result = 31 * result + tracker_id + result = 31 * result + tracker_id.hashCode() result = 31 * result + remote_id.hashCode() return result } companion object { fun create(serviceId: Long): TrackSearch = TrackSearch().apply { - tracker_id = serviceId.toInt() + tracker_id = serviceId } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt index 5d66b73d4..33daee1a9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt @@ -18,12 +18,12 @@ import tachiyomi.domain.track.model.Track as DomainTrack class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { companion object { - const val READING = 1 - const val COMPLETED = 2 - const val ON_HOLD = 3 - const val DROPPED = 4 - const val PLAN_TO_READ = 6 - const val REREADING = 7 + const val READING = 1L + const val COMPLETED = 2L + const val ON_HOLD = 3L + const val DROPPED = 4L + const val PLAN_TO_READ = 6L + const val REREADING = 7L private const val SEARCH_ID_PREFIX = "id:" private const val SEARCH_LIST_PREFIX = "my:" @@ -35,7 +35,7 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { private val json: Json by injectLazy() - private val interceptor by lazy { MyAnimeListInterceptor(this, getPassword()) } + private val interceptor by lazy { MyAnimeListInterceptor(this) } private val api by lazy { MyAnimeListApi(id, client, interceptor) } override val supportsReadingDates: Boolean = true @@ -44,11 +44,11 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { override fun getLogoColor() = Color.rgb(46, 81, 162) - override fun getStatusList(): List { + override fun getStatusList(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ, REREADING) } - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed @@ -58,11 +58,11 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = REREADING + override fun getRereadingStatus(): Long = REREADING - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = SCORE_LIST @@ -77,12 +77,12 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { override suspend fun update(track: Track, didReadChapter: Boolean): Track { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED track.finished_reading_date = System.currentTimeMillis() } else if (track.status != REREADING) { track.status = READING - if (track.last_chapter_read == 1F) { + if (track.last_chapter_read == 1.0) { track.started_reading_date = System.currentTimeMillis() } } @@ -104,14 +104,14 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { if (track.status != COMPLETED) { val isRereading = track.status == REREADING - track.status = if (isRereading.not() && hasReadChapters) READING else track.status + track.status = if (!isRereading && hasReadChapters) READING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ - track.score = 0F + track.score = 0.0 add(track) } } @@ -155,6 +155,14 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { interceptor.setAuth(null) } + fun getIfAuthExpired(): Boolean { + return trackPreferences.trackAuthExpired(this).get() + } + + fun setAuthExpired() { + trackPreferences.trackAuthExpired(this).set(true) + } + fun saveOAuth(oAuth: OAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(oAuth)) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt index 518b872b4..2aef56016 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt @@ -16,8 +16,8 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.boolean import kotlinx.serialization.json.contentOrNull -import kotlinx.serialization.json.float -import kotlinx.serialization.json.floatOrNull +import kotlinx.serialization.json.double +import kotlinx.serialization.json.doubleOrNull import kotlinx.serialization.json.int import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject @@ -28,7 +28,7 @@ import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import java.text.SimpleDateFormat import java.util.Locale @@ -47,13 +47,13 @@ class MyAnimeListApi( suspend fun getAccessToken(authCode: String): OAuth { return withIOContext { val formBody: RequestBody = FormBody.Builder() - .add("client_id", clientId) + .add("client_id", CLIENT_ID) .add("code", authCode) .add("code_verifier", codeVerifier) .add("grant_type", "authorization_code") .build() with(json) { - client.newCall(POST("$baseOAuthUrl/token", body = formBody)) + client.newCall(POST("$BASE_OAUTH_URL/token", body = formBody)) .awaitSuccess() .parseAs() } @@ -63,7 +63,7 @@ class MyAnimeListApi( suspend fun getCurrentUser(): String { return withIOContext { val request = Request.Builder() - .url("$baseApiUrl/users/@me") + .url("$BASE_API_URL/users/@me") .get() .build() with(json) { @@ -77,7 +77,7 @@ class MyAnimeListApi( suspend fun search(query: String): List { return withIOContext { - val url = "$baseApiUrl/manga".toUri().buildUpon() + val url = "$BASE_API_URL/manga".toUri().buildUpon() // MAL API throws a 400 when the query is over 64 characters... .appendQueryParameter("q", query.take(64)) .appendQueryParameter("nsfw", "true") @@ -102,7 +102,7 @@ class MyAnimeListApi( suspend fun getMangaDetails(id: Int): TrackSearch { return withIOContext { - val url = "$baseApiUrl/manga".toUri().buildUpon() + val url = "$BASE_API_URL/manga".toUri().buildUpon() .appendPath(id.toString()) .appendQueryParameter( "fields", @@ -119,8 +119,8 @@ class MyAnimeListApi( remote_id = obj["id"]!!.jsonPrimitive.long title = obj["title"]!!.jsonPrimitive.content summary = obj["synopsis"]?.jsonPrimitive?.content ?: "" - total_chapters = obj["num_chapters"]!!.jsonPrimitive.int - score = obj["mean"]?.jsonPrimitive?.floatOrNull ?: -1f + total_chapters = obj["num_chapters"]!!.jsonPrimitive.long + score = obj["mean"]?.jsonPrimitive?.doubleOrNull ?: -1.0 cover_url = obj["main_picture"]?.jsonObject?.get("large")?.jsonPrimitive?.content ?: "" @@ -178,7 +178,7 @@ class MyAnimeListApi( suspend fun findListItem(track: Track): Track? { return withIOContext { - val uri = "$baseApiUrl/manga".toUri().buildUpon() + val uri = "$BASE_API_URL/manga".toUri().buildUpon() .appendPath(track.remote_id.toString()) .appendQueryParameter("fields", "num_chapters,my_list_status{start_date,finish_date}") .build() @@ -187,7 +187,7 @@ class MyAnimeListApi( .awaitSuccess() .parseAs() .let { obj -> - track.total_chapters = obj["num_chapters"]!!.jsonPrimitive.int + track.total_chapters = obj["num_chapters"]!!.jsonPrimitive.long obj.jsonObject["my_list_status"]?.jsonObject?.let { parseMangaItem(it, track) } @@ -216,7 +216,7 @@ class MyAnimeListApi( // Check next page if there's more if (!obj["paging"]!!.jsonObject["next"]?.jsonPrimitive?.contentOrNull.isNullOrBlank()) { - matches + findListItems(query, offset + listPaginationAmount) + matches + findListItems(query, offset + LIST_PAGINATION_AMOUNT) } else { matches } @@ -225,9 +225,9 @@ class MyAnimeListApi( private suspend fun getListPage(offset: Int): JsonObject { return withIOContext { - val urlBuilder = "$baseApiUrl/users/@me/mangalist".toUri().buildUpon() + val urlBuilder = "$BASE_API_URL/users/@me/mangalist".toUri().buildUpon() .appendQueryParameter("fields", "list_status{start_date,finish_date}") - .appendQueryParameter("limit", listPaginationAmount.toString()) + .appendQueryParameter("limit", LIST_PAGINATION_AMOUNT.toString()) if (offset > 0) { urlBuilder.appendQueryParameter("offset", offset.toString()) } @@ -249,8 +249,8 @@ class MyAnimeListApi( return track.apply { val isRereading = obj["is_rereading"]!!.jsonPrimitive.boolean status = if (isRereading) MyAnimeList.REREADING else getStatus(obj["status"]?.jsonPrimitive?.content) - last_chapter_read = obj["num_chapters_read"]!!.jsonPrimitive.float - score = obj["score"]!!.jsonPrimitive.int.toFloat() + last_chapter_read = obj["num_chapters_read"]!!.jsonPrimitive.double + score = obj["score"]!!.jsonPrimitive.int.toDouble() obj["start_date"]?.let { started_reading_date = parseDate(it.jsonPrimitive.content) } @@ -277,30 +277,29 @@ class MyAnimeListApi( } companion object { - // Registered under arkon's MAL account - private const val clientId = "f46004a9c16483b6d87b5bf10de56d97" + private const val CLIENT_ID = "c46c9e24640a64dad5be5ca7a1a53a0f" - private const val baseOAuthUrl = "https://myanimelist.net/v1/oauth2" - private const val baseApiUrl = "https://api.myanimelist.net/v2" + private const val BASE_OAUTH_URL = "https://myanimelist.net/v1/oauth2" + private const val BASE_API_URL = "https://api.myanimelist.net/v2" - private const val listPaginationAmount = 250 + private const val LIST_PAGINATION_AMOUNT = 250 private var codeVerifier: String = "" - fun authUrl(): Uri = "$baseOAuthUrl/authorize".toUri().buildUpon() - .appendQueryParameter("client_id", clientId) + fun authUrl(): Uri = "$BASE_OAUTH_URL/authorize".toUri().buildUpon() + .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("code_challenge", getPkceChallengeCode()) .appendQueryParameter("response_type", "code") .build() - fun mangaUrl(id: Long): Uri = "$baseApiUrl/manga".toUri().buildUpon() + fun mangaUrl(id: Long): Uri = "$BASE_API_URL/manga".toUri().buildUpon() .appendPath(id.toString()) .appendPath("my_list_status") .build() fun refreshTokenRequest(oauth: OAuth): Request { val formBody: RequestBody = FormBody.Builder() - .add("client_id", clientId) + .add("client_id", CLIENT_ID) .add("refresh_token", oauth.refresh_token) .add("grant_type", "refresh_token") .build() @@ -312,7 +311,7 @@ class MyAnimeListApi( .add("Authorization", "Bearer ${oauth.access_token}") .build() - return POST("$baseOAuthUrl/token", body = formBody, headers = headers) + return POST("$BASE_OAUTH_URL/token", body = formBody, headers = headers) } private fun getPkceChallengeCode(): String { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt index a8ec37708..b56a10e46 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.track.myanimelist +import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import okhttp3.Interceptor @@ -7,55 +8,34 @@ import okhttp3.Response import uy.kohesive.injekt.injectLazy import java.io.IOException -class MyAnimeListInterceptor(private val myanimelist: MyAnimeList, private var token: String?) : Interceptor { +class MyAnimeListInterceptor(private val myanimelist: MyAnimeList) : Interceptor { private val json: Json by injectLazy() - private var oauth: OAuth? = null + private var oauth: OAuth? = myanimelist.loadOAuth() + private val tokenExpired get() = myanimelist.getIfAuthExpired() override fun intercept(chain: Interceptor.Chain): Response { + if (tokenExpired) { + throw MALTokenExpired() + } val originalRequest = chain.request() - if (token.isNullOrEmpty()) { - throw IOException("Not authenticated with MyAnimeList") - } - if (oauth == null) { - oauth = myanimelist.loadOAuth() - } - // Refresh access token if expired - if (oauth != null && oauth!!.isExpired()) { - setAuth(refreshToken(chain)) + if (oauth?.isExpired() == true) { + refreshToken(chain) } if (oauth == null) { - throw IOException("No authentication token") + throw IOException("MAL: User is not authenticated") } // Add the authorization header to the original request val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.access_token}") + .header("User-Agent", "Mihon v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() - val response = chain.proceed(authRequest) - val tokenIsExpired = response.headers["www-authenticate"] - ?.contains("The access token expired") ?: false - - // Retry the request once with a new token in case it was not already refreshed - // by the is expired check before. - if (response.code == 401 && tokenIsExpired) { - response.close() - - val newToken = refreshToken(chain) - setAuth(newToken) - - val newRequest = originalRequest.newBuilder() - .addHeader("Authorization", "Bearer ${newToken.access_token}") - .build() - - return chain.proceed(newRequest) - } - - return response + return chain.proceed(authRequest) } /** @@ -63,27 +43,41 @@ class MyAnimeListInterceptor(private val myanimelist: MyAnimeList, private var t * and the oauth object. */ fun setAuth(oauth: OAuth?) { - token = oauth?.access_token this.oauth = oauth myanimelist.saveOAuth(oauth) } - private fun refreshToken(chain: Interceptor.Chain): OAuth { - val newOauth = runCatching { - val oauthResponse = chain.proceed(MyAnimeListApi.refreshTokenRequest(oauth!!)) + private fun refreshToken(chain: Interceptor.Chain): OAuth = synchronized(this) { + if (tokenExpired) throw MALTokenExpired() + oauth?.takeUnless { it.isExpired() }?.let { return@synchronized it } - if (oauthResponse.isSuccessful) { - with(json) { oauthResponse.parseAs() } + val response = try { + chain.proceed(MyAnimeListApi.refreshTokenRequest(oauth!!)) + } catch (_: Throwable) { + throw MALTokenRefreshFailed() + } + + if (response.code == 401) { + myanimelist.setAuthExpired() + throw MALTokenExpired() + } + + return runCatching { + if (response.isSuccessful) { + with(json) { response.parseAs() } } else { - oauthResponse.close() + response.close() null } } - - if (newOauth.getOrNull() == null) { - throw IOException("Failed to refresh the access token") - } - - return newOauth.getOrNull()!! + .getOrNull() + ?.also { + this.oauth = it + myanimelist.saveOAuth(it) + } + ?: throw MALTokenRefreshFailed() } } + +class MALTokenRefreshFailed : IOException("MAL: Failed to refresh account token") +class MALTokenExpired : IOException("MAL: Login has expired") diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListModels.kt index dea4231b3..1ae02142f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListModels.kt @@ -5,14 +5,16 @@ import kotlinx.serialization.Serializable @Serializable data class OAuth( + val token_type: String, val refresh_token: String, val access_token: String, - val token_type: String, - val created_at: Long = System.currentTimeMillis(), val expires_in: Long, -) - -fun OAuth.isExpired() = System.currentTimeMillis() > created_at + (expires_in * 1000) + val created_at: Long = System.currentTimeMillis(), +) { + // Assumes expired a minute earlier + private val adjustedExpiresIn: Long = (expires_in - 60) * 1000 + fun isExpired() = created_at + adjustedExpiresIn < System.currentTimeMillis() +} fun Track.toMyAnimeListStatus() = when (status) { MyAnimeList.READING -> "reading" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt index 8f70e03dd..118d005c1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt @@ -18,12 +18,12 @@ import tachiyomi.domain.track.model.Track as DomainTrack class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { companion object { - const val READING = 1 - const val COMPLETED = 2 - const val ON_HOLD = 3 - const val DROPPED = 4 - const val PLAN_TO_READ = 5 - const val REREADING = 6 + const val READING = 1L + const val COMPLETED = 2L + const val ON_HOLD = 3L + const val DROPPED = 4L + const val PLAN_TO_READ = 5L + const val REREADING = 6L private val SCORE_LIST = IntRange(0, 10) .map(Int::toString) @@ -49,7 +49,7 @@ class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { override suspend fun update(track: Track, didReadChapter: Boolean): Track { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else if (track.status != REREADING) { track.status = READING @@ -72,14 +72,14 @@ class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { if (track.status != COMPLETED) { val isRereading = track.status == REREADING - track.status = if (isRereading.not() && hasReadChapters) READING else track.status + track.status = if (!isRereading && hasReadChapters) READING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ - track.score = 0F + track.score = 0.0 add(track) } } @@ -101,11 +101,11 @@ class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { override fun getLogoColor() = Color.rgb(40, 40, 40) - override fun getStatusList(): List { + override fun getStatusList(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ, REREADING) } - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed @@ -115,11 +115,11 @@ class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = REREADING + override fun getRereadingStatus(): Long = REREADING - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override suspend fun login(username: String, password: String) = login(password) 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 d84b01330..6eb93a636 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 @@ -15,7 +15,7 @@ import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.contentOrNull -import kotlinx.serialization.json.float +import kotlinx.serialization.json.double import kotlinx.serialization.json.int import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive @@ -25,7 +25,7 @@ import kotlinx.serialization.json.putJsonObject import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.model.Track as DomainTrack @@ -102,10 +102,10 @@ class ShikimoriApi( return TrackSearch.create(trackId).apply { remote_id = obj["id"]!!.jsonPrimitive.long title = obj["name"]!!.jsonPrimitive.content - total_chapters = obj["chapters"]!!.jsonPrimitive.int + total_chapters = obj["chapters"]!!.jsonPrimitive.long cover_url = baseUrl + obj["image"]!!.jsonObject["preview"]!!.jsonPrimitive.content summary = "" - score = obj["score"]!!.jsonPrimitive.float + score = obj["score"]!!.jsonPrimitive.double tracking_url = baseUrl + obj["url"]!!.jsonPrimitive.content publishing_status = obj["status"]!!.jsonPrimitive.content publishing_type = obj["kind"]!!.jsonPrimitive.content @@ -117,10 +117,10 @@ class ShikimoriApi( return Track.create(trackId).apply { title = mangas["name"]!!.jsonPrimitive.content remote_id = obj["id"]!!.jsonPrimitive.long - total_chapters = mangas["chapters"]!!.jsonPrimitive.int + total_chapters = mangas["chapters"]!!.jsonPrimitive.long library_id = obj["id"]!!.jsonPrimitive.long - last_chapter_read = obj["chapters"]!!.jsonPrimitive.float - score = (obj["score"]!!.jsonPrimitive.int).toFloat() + 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 } @@ -192,8 +192,8 @@ class ShikimoriApi( ) companion object { - private const val clientId = "1aaf4cf232372708e98b5abc813d795b539c5a916dbbfe9ac61bf02a360832cc" - private const val clientSecret = "229942c742dd4cde803125d17d64501d91c0b12e14cb1e5120184d77d67024c0" + private const val clientId = "PB9dq8DzI405s7wdtwTdirYqHiyVMh--djnP7lBUqSA" + private const val clientSecret = "NajpZcOBKB9sJtgNcejf8OB9jBN1OYYoo-k4h2WWZus" private const val baseUrl = "https://shikimori.one" private const val apiUrl = "$baseUrl/api" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt index 84c64462f..aa2d4247a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.data.track.shikimori +import eu.kanade.tachiyomi.BuildConfig import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response @@ -33,7 +34,7 @@ class ShikimoriInterceptor(private val shikimori: Shikimori) : Interceptor { // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.access_token}") - .header("User-Agent", "Tachiyomi") + .header("User-Agent", "Mihon v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt index d8d1ba975..6b2ca63f9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt @@ -23,25 +23,25 @@ class Suwayomi(id: Long) : BaseTracker(id, "Suwayomi"), EnhancedTracker { override fun getLogoColor() = Color.rgb(255, 35, 35) // TODO companion object { - const val UNREAD = 1 - const val READING = 2 - const val COMPLETED = 3 + const val UNREAD = 1L + const val READING = 2L + const val COMPLETED = 3L } - override fun getStatusList() = listOf(UNREAD, READING, COMPLETED) + override fun getStatusList(): List = listOf(UNREAD, READING, COMPLETED) - override fun getStatus(status: Int): StringResource? = when (status) { + override fun getStatus(status: Long): StringResource? = when (status) { UNREAD -> MR.strings.unread READING -> MR.strings.reading COMPLETED -> MR.strings.completed else -> null } - override fun getReadingStatus(): Int = READING + override fun getReadingStatus(): Long = READING - override fun getRereadingStatus(): Int = -1 + override fun getRereadingStatus(): Long = -1 - override fun getCompletionStatus(): Int = COMPLETED + override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = persistentListOf() @@ -50,7 +50,7 @@ class Suwayomi(id: Long) : BaseTracker(id, "Suwayomi"), EnhancedTracker { override suspend fun update(track: Track, didReadChapter: Boolean): Track { if (track.status != COMPLETED) { if (didReadChapter) { - if (track.last_chapter_read.toInt() == track.total_chapters && track.total_chapters > 0) { + if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt index 5c5367bec..c7cc8a188 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt @@ -16,7 +16,7 @@ import okhttp3.Dns import okhttp3.FormBody import okhttp3.Headers import okhttp3.OkHttpClient -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy @@ -66,9 +66,9 @@ class SuwayomiApi(private val trackId: Long) { cover_url = "$url/thumbnail" summary = manga.description.orEmpty() tracking_url = url - total_chapters = manga.chapterCount.toInt() + total_chapters = manga.chapterCount publishing_status = manga.status - last_chapter_read = manga.lastChapterRead?.chapterNumber ?: 0F + last_chapter_read = manga.lastChapterRead?.chapterNumber ?: 0.0 status = when (manga.unreadCount) { manga.chapterCount -> Suwayomi.UNREAD 0L -> Suwayomi.COMPLETED diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiModels.kt index 27aef1af7..c3fb5023a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiModels.kt @@ -64,7 +64,7 @@ data class ChapterDataClass( val url: String, val name: String, val uploadDate: Long, - val chapterNumber: Float, + val chapterNumber: Double, val scanlator: String?, val mangaId: Int, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt index 2197dd992..d3632767c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.data.updater import android.content.Context import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.util.system.isInstalledFromFDroid -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.release.interactor.GetApplicationRelease import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt index 073f2bb0d..c1aa46626 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt @@ -23,8 +23,8 @@ import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import okhttp3.internal.http2.ErrorCode import okhttp3.internal.http2.StreamResetException -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.io.File diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt index 6c20bea64..35147790f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt @@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.release.model.Release import tachiyomi.i18n.MR diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index ef0f65fff..9fb7b2fb5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -26,8 +26,8 @@ import kotlinx.serialization.protobuf.ProtoBuf import nl.adaptivity.xmlutil.XmlDeclMode import nl.adaptivity.xmlutil.core.XmlVersion import nl.adaptivity.xmlutil.serialization.XML -import tachiyomi.core.storage.AndroidStorageFolderProvider -import tachiyomi.core.storage.UniFileTempFileManager +import tachiyomi.core.common.storage.AndroidStorageFolderProvider +import tachiyomi.core.common.storage.UniFileTempFileManager import tachiyomi.data.AndroidDatabaseHandler import tachiyomi.data.Database import tachiyomi.data.DatabaseHandler diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt index 51136226b..b56c16cae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt @@ -9,9 +9,9 @@ import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.system.isDevFlavor -import tachiyomi.core.preference.AndroidPreferenceStore -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.storage.AndroidStorageFolderProvider +import tachiyomi.core.common.preference.AndroidPreferenceStore +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.storage.AndroidStorageFolderProvider import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.library.service.LibraryPreferences 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 b252c0fbe..4a5eff1ac 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -19,9 +19,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.emptyFlow import logcat.LogPriority -import tachiyomi.core.util.lang.launchNow -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchNow +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.model.StubSource import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt @@ -338,7 +338,14 @@ class ExtensionManager( } override fun onExtensionUntrusted(extension: Extension.Untrusted) { - _untrustedExtensionsFlow.value += extension + val installedExtension = _installedExtensionsFlow.value + .find { it.pkgName == extension.pkgName } + + if (installedExtension != null) { + _installedExtensionsFlow.value -= installedExtension + } else { + _untrustedExtensionsFlow.value += extension + } } override fun onPackageUninstalled(pkgName: String) { 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 26e105616..0d79fd335 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 @@ -13,10 +13,10 @@ import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import logcat.LogPriority -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.time.Instant import kotlin.time.Duration.Companion.days diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionUpdateNotifier.kt index 602ce80f9..ff764271e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionUpdateNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionUpdateNotifier.kt @@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.notify -import tachiyomi.core.i18n.pluralStringResource +import tachiyomi.core.common.i18n.pluralStringResource import tachiyomi.i18n.MR class ExtensionUpdateNotifier(private val context: Context) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt index 222ff02d0..d3aef3b18 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt @@ -15,7 +15,7 @@ import eu.kanade.tachiyomi.util.lang.use import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.getUriSize import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat class PackageInstallerInstaller(private val service: Service) : Installer(service) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt index 33ff287c7..c85611acf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/ShizukuInstaller.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import logcat.LogPriority import rikka.shizuku.Shizuku -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import java.io.BufferedReader import java.io.InputStream diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt index 6a3e21860..e0a008e1c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt @@ -14,8 +14,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import logcat.LogPriority -import tachiyomi.core.util.lang.launchNow -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchNow +import tachiyomi.core.common.util.system.logcat /** * Broadcast receiver that listens for the system's packages installed, updated or removed, and only @@ -70,8 +70,7 @@ internal class ExtensionInstallReceiver(private val listener: Listener) : launchNow { when (val result = getExtensionFromIntent(context, intent)) { is LoadResult.Success -> listener.onExtensionUpdated(result.extension) - // Not needed as a package can't be upgraded if the signature is different - // is LoadResult.Untrusted -> {} + is LoadResult.Untrusted -> listener.onExtensionUntrusted(result.extension) else -> {} } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt index 3ffe9f783..12bdb61d0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt @@ -15,8 +15,8 @@ import eu.kanade.tachiyomi.extension.util.ExtensionInstaller.Companion.EXTRA_DOW import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat import eu.kanade.tachiyomi.util.system.notificationBuilder import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR class ExtensionInstallService : Service() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt index ff384e56f..b71974a30 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt @@ -27,8 +27,8 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.transformWhile import logcat.LogPriority -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File 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 ef603f934..2d469f260 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 @@ -20,7 +20,7 @@ import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.io.File diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreen.kt index 9fd5df0fd..278c10d36 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreen.kt @@ -11,7 +11,7 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.ExtensionFilterScreen import eu.kanade.presentation.util.Screen import kotlinx.coroutines.flow.collectLatest -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreenModel.kt index acfeafa04..7cd83923f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionFilterScreenModel.kt @@ -20,7 +20,7 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get 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 5617e506b..e71d65997 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 @@ -27,7 +27,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt index 8d8a9f607..4266c4730 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsScreenModel.kt @@ -25,7 +25,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import okhttp3.HttpUrl.Companion.toHttpUrl -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreenModel.kt index e5d886f85..8faf1c320 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreenModel.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.manga.interactor.GetFavorites import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt index d6b70381b..d3b35bcf4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt @@ -32,10 +32,10 @@ import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.ui.browse.migration.MigrationFlags import kotlinx.coroutines.flow.update -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.withUIContext +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt index 0bbe49b0a..acd8278a0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt @@ -28,7 +28,7 @@ import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import kotlinx.coroutines.launch -import tachiyomi.core.Constants +import tachiyomi.core.common.Constants import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceScreenModel.kt index f7659b3e0..8968d62b8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceScreenModel.kt @@ -17,8 +17,8 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import logcat.LogPriority -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.model.Source import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get 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 ce98bf629..0f777f7e5 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 @@ -16,8 +16,8 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import logcat.LogPriority -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.model.Pin import tachiyomi.domain.source.model.Source import uy.kohesive.injekt.Injekt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt index 400b5215a..4bbf6d7dc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt @@ -53,8 +53,8 @@ import eu.kanade.tachiyomi.ui.webview.WebViewScreen import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow -import tachiyomi.core.Constants -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.Constants +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.source.model.StubSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt index 4b0835850..a7e8a26ea 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt @@ -35,9 +35,9 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import tachiyomi.core.preference.CheckboxState -import tachiyomi.core.preference.mapAsCheckboxState -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.preference.CheckboxState +import tachiyomi.core.common.preference.mapAsCheckboxState +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt index 9c4c5a272..017af7479 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList -import tachiyomi.core.preference.TriState +import tachiyomi.core.common.preference.TriState import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.CollapsibleBox diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt index e21821430..5bef14675 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenModel.kt @@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ResolvableSource import eu.kanade.tachiyomi.source.online.UriType import kotlinx.coroutines.flow.update -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.chapter.interactor.GetChapterByUrlAndMangaId import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.interactor.GetMangaByUrlAndSourceId diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt index f8470ef7b..8332c0c97 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreen.kt @@ -53,7 +53,7 @@ import eu.kanade.presentation.components.NestedMenuItem import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.databinding.DownloadListBinding import kotlinx.collections.immutable.persistentListOf -import tachiyomi.core.util.lang.launchUI +import tachiyomi.core.common.util.lang.launchUI import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.Pill import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt index 960b66c3a..a344fcda3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryScreenModel.kt @@ -18,9 +18,9 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.history.interactor.GetHistory import tachiyomi.domain.history.interactor.GetNextChapters diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt index 0c6e283ca..9f91706f1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt @@ -27,7 +27,7 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.chapter.model.Chapter import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource 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 a1b6c3b1b..b2771d4e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -44,12 +44,12 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update -import tachiyomi.core.preference.CheckboxState -import tachiyomi.core.preference.TriState -import tachiyomi.core.util.lang.compareToWithCollator -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.preference.CheckboxState +import tachiyomi.core.common.preference.TriState +import tachiyomi.core.common.util.lang.compareToWithCollator +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category 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 ce573de3f..f0856f830 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 @@ -4,10 +4,10 @@ import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.data.track.TrackerManager -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.TriState -import tachiyomi.core.preference.getAndSet -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.TriState +import tachiyomi.core.common.preference.getAndSet +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.interactor.SetDisplayMode import tachiyomi.domain.category.interactor.SetSortModeForCategory import tachiyomi.domain.category.model.Category diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt index e54dd97d6..7acdb51f7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryTab.kt @@ -48,8 +48,8 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.model.LibraryManga import tachiyomi.domain.manga.model.Manga diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index c0125bbd8..87ab0b4c8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -89,9 +89,9 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.Constants -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.Constants +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.release.interactor.GetApplicationRelease import tachiyomi.i18n.MR diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaCoverScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaCoverScreenModel.kt index 6a4d968a4..3cbfa540b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaCoverScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaCoverScreenModel.kt @@ -19,11 +19,11 @@ import eu.kanade.tachiyomi.util.system.toShareIntent import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR 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 b73b4bcc3..f7dad1d8c 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 @@ -54,9 +54,9 @@ import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR 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 ae61519ee..26ad3a7fc 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 @@ -50,15 +50,15 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.preference.CheckboxState -import tachiyomi.core.preference.TriState -import tachiyomi.core.preference.mapAsCheckboxState -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.preference.CheckboxState +import tachiyomi.core.common.preference.TriState +import tachiyomi.core.common.preference.mapAsCheckboxState +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.interactor.GetCategories import tachiyomi.domain.category.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt index 9f08bb5dc..e0ad25182 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt @@ -64,11 +64,11 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.track.interactor.DeleteTrack @@ -285,13 +285,13 @@ private data class TrackStatusSelectorScreen( private class Model( private val track: Track, private val tracker: Tracker, - ) : StateScreenModel(State(track.status.toInt())) { + ) : StateScreenModel(State(track.status)) { - fun getSelections(): Map { + fun getSelections(): Map { return tracker.getStatusList().associateWith { tracker.getStatus(it) } } - fun setSelection(selection: Int) { + fun setSelection(selection: Long) { mutableState.update { it.copy(selection = selection) } } @@ -303,7 +303,7 @@ private data class TrackStatusSelectorScreen( @Immutable data class State( - val selection: Int, + val selection: Long, ) } } 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 3ca8418ad..7e4ac0932 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 @@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt 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 c67a49084..f170f7e1a 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 @@ -82,12 +82,12 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.Constants -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.Constants +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderNavigationOverlayView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderNavigationOverlayView.kt index 70aa7bfb0..08f5f8349 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderNavigationOverlayView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderNavigationOverlayView.kt @@ -13,7 +13,7 @@ import androidx.core.graphics.withTranslation import androidx.core.view.isVisible import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation import eu.kanade.tachiyomi.ui.reader.viewer.navigation.DisabledNavigation -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import kotlin.math.abs class ReaderNavigationOverlayView(context: Context, attributeSet: AttributeSet) : View(context, attributeSet) { 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 b7f4c9c14..c6170f2a9 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 @@ -54,13 +54,13 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.runBlocking import logcat.LogPriority -import tachiyomi.core.preference.toggle -import tachiyomi.core.storage.UniFileTempFileManager -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.preference.toggle +import tachiyomi.core.common.storage.UniFileTempFileManager +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.model.ChapterUpdate diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt index 2676744ca..ab0146a0e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt @@ -15,7 +15,7 @@ import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.getBitmapOrNull import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR /** 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 21eeb5e5f..91d55477c 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 @@ -8,15 +8,15 @@ import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.storage.UniFileTempFileManager +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.logcat import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.storage.UniFileTempFileManager import tachiyomi.core.util.lang.launchUI -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.logcat import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.model.StubSource import tachiyomi.i18n.MR diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt index 2a11f74e3..8817b0682 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt @@ -4,7 +4,7 @@ import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder -import tachiyomi.core.util.system.ImageUtil +import tachiyomi.core.common.util.system.ImageUtil /** * Loader used to load a chapter from a directory given on [file]. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt index 775b493b3..1d18d7b47 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt @@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter import eu.kanade.tachiyomi.ui.reader.model.ReaderPage -import tachiyomi.core.storage.UniFileTempFileManager +import tachiyomi.core.common.storage.UniFileTempFileManager import tachiyomi.domain.manga.model.Manga import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt index 4802708a6..14c27bf95 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt @@ -15,8 +15,8 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.suspendCancellableCoroutine -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.PriorityBlockingQueue diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt index ad513ec93..868ab92b2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt @@ -5,7 +5,7 @@ import com.github.junrar.rarfile.FileHeader import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder -import tachiyomi.core.util.system.ImageUtil +import tachiyomi.core.common.util.system.ImageUtil import java.io.File import java.io.InputStream import java.io.PipedInputStream diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt index e4fd1c6e5..e839d8a55 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.ui.reader.loader import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder -import tachiyomi.core.util.system.ImageUtil +import tachiyomi.core.common.util.system.ImageUtil import java.io.File import java.nio.charset.StandardCharsets import java.util.zip.ZipFile diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt index c0cdfdd7c..cb3bca256 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/model/ReaderChapter.kt @@ -4,7 +4,7 @@ import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.ui.reader.loader.PageLoader import kotlinx.coroutines.flow.MutableStateFlow -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat data class ReaderChapter(val chapter: Chapter) { 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 4de0ecd94..6c079b836 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 @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.ui.reader.setting import android.os.Build import androidx.compose.ui.graphics.BlendMode import dev.icerock.moko.resources.StringResource -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.preference.getEnum +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.preference.getEnum import tachiyomi.i18n.MR class ReaderPreferences( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt index 44dd19db4..0d973d239 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import tachiyomi.core.preference.Preference +import tachiyomi.core.common.preference.Preference /** * Common configuration for all viewers. 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 2c81f1387..7b6d1dd6a 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 @@ -18,11 +18,11 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.coroutines.supervisorScope import logcat.LogPriority -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.ImageUtil -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.ImageUtil +import tachiyomi.core.common.util.system.logcat import java.io.BufferedInputStream import java.io.ByteArrayInputStream import java.io.InputStream diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt index 6adb5fcef..4569f4370 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt @@ -20,7 +20,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR /** 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 93ea9495b..ffa38bfba 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 @@ -21,7 +21,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.Viewer import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation.NavigationRegion import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import kotlin.math.min @@ -90,7 +90,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : Viewer { pager.addOnPageChangeListener( object : ViewPager.SimpleOnPageChangeListener() { override fun onPageSelected(position: Int) { - if (activity.isScrollingThroughPages.not()) { + if (!activity.isScrollingThroughPages) { activity.hideMenu() } onPageChange(position) 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 ec78dc8c6..5ff4ecaae 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 @@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters import eu.kanade.tachiyomi.ui.reader.viewer.calculateChapterGap import eu.kanade.tachiyomi.util.system.createReaderThemeContext import eu.kanade.tachiyomi.widget.ViewPagerAdapter -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat /** * Pager adapter used by this [viewer] to where [ViewerChapters] updates are posted. 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 b491a7363..4f41d3d51 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 @@ -24,11 +24,11 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.supervisorScope import kotlinx.coroutines.suspendCancellableCoroutine import logcat.LogPriority -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.lang.withUIContext -import tachiyomi.core.util.system.ImageUtil -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withUIContext +import tachiyomi.core.common.util.system.ImageUtil +import tachiyomi.core.common.util.system.logcat import java.io.BufferedInputStream import java.io.InputStream diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonTransitionHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonTransitionHolder.kt index 65629799e..57036d070 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonTransitionHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonTransitionHolder.kt @@ -17,7 +17,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR /** 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 db65836d8..da11e68ff 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 @@ -21,7 +21,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.Viewer import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation.NavigationRegion import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/security/UnlockActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/security/UnlockActivity.kt index 557da5bdd..00d1e136a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/security/UnlockActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/security/UnlockActivity.kt @@ -8,8 +8,8 @@ import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.startAuthentication import logcat.LogPriority -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt index 47cd88416..3f742cfe0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt @@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.setting.track import android.net.Uri import androidx.lifecycle.lifecycleScope -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchIO class TrackLoginActivity : BaseOAuthLoginActivity() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt index 9ed04cd78..0d553ab4b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt @@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.source.model.SManga import kotlinx.coroutines.flow.update -import tachiyomi.core.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.history.interactor.GetTotalReadDuration import tachiyomi.domain.library.model.LibraryManga import tachiyomi.domain.library.service.LibraryPreferences diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesScreenModel.kt index 9574d0c7f..f76ac45fe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesScreenModel.kt @@ -32,9 +32,9 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority -import tachiyomi.core.util.lang.launchIO -import tachiyomi.core.util.lang.launchNonCancellable -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.launchIO +import tachiyomi.core.common.util.lang.launchNonCancellable +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.interactor.GetChapter import tachiyomi.domain.chapter.interactor.UpdateChapter import tachiyomi.domain.chapter.model.ChapterUpdate diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt index d84bcd38f..a9dc4281a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt @@ -26,7 +26,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.updates.UpdatesScreenModel.Event import kotlinx.coroutines.flow.collectLatest -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt index 61d09dc79..040a02f76 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt @@ -18,7 +18,7 @@ import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.setComposeContent import logcat.LogPriority import okhttp3.HttpUrl.Companion.toHttpUrl -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.service.SourceManager import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt index 888369050..331d62b59 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewScreenModel.kt @@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import logcat.LogPriority import okhttp3.HttpUrl.Companion.toHttpUrl -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.service.SourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt index 4b2ef2ab1..56e6c278b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt @@ -9,8 +9,8 @@ import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.createFileInCacheDir import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.lang.withUIContext +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.lang.withUIContext import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -21,7 +21,7 @@ class CrashLogUtil( suspend fun dumpLogs() = withNonCancellableContext { try { - val file = context.createFileInCacheDir("tachiyomi_crash_logs.txt") + val file = context.createFileInCacheDir("mihon_crash_logs.txt") file.appendText(getDebugInfo() + "\n\n") getExtensionsInfo()?.let { file.appendText("$it\n\n") } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt index e7482165f..a313f5a2d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/lang/DateExtensions.kt @@ -1,8 +1,8 @@ package eu.kanade.tachiyomi.util.lang import android.content.Context -import tachiyomi.core.i18n.pluralStringResource -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.pluralStringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import java.text.DateFormat import java.time.Instant diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/AuthenticatorUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/AuthenticatorUtil.kt index ce3a09141..164a1075c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/AuthenticatorUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/AuthenticatorUtil.kt @@ -11,7 +11,7 @@ import androidx.biometric.auth.startClass2BiometricOrCredentialAuthentication import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity import kotlinx.coroutines.suspendCancellableCoroutine -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import kotlin.coroutines.resume diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index 92b5f3843..190764631 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -22,8 +22,8 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.lang.truncateCenter import logcat.LogPriority import rikka.sui.Sui -import tachiyomi.core.i18n.stringResource -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.i18n.stringResource +import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt index ed4ce04f5..65acbed18 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt @@ -6,7 +6,7 @@ import android.content.Intent import android.net.Uri import android.os.Build import androidx.core.content.IntentCompat -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import java.io.Serializable diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt index 71d965cd5..827eb739e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.util.system import android.content.Context import androidx.core.os.LocaleListCompat import eu.kanade.tachiyomi.ui.browse.source.SourcesScreenModel -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import java.util.Locale diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt index e565921db..a31857c0f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt @@ -6,7 +6,7 @@ import androidx.work.WorkInfo import androidx.work.WorkManager import kotlinx.coroutines.delay import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat val Context.workManager: WorkManager get() = WorkManager.getInstance(this) diff --git a/app/src/main/java/eu/kanade/test/DummyTracker.kt b/app/src/main/java/eu/kanade/test/DummyTracker.kt index e8183310d..56092b440 100644 --- a/app/src/main/java/eu/kanade/test/DummyTracker.kt +++ b/app/src/main/java/eu/kanade/test/DummyTracker.kt @@ -18,10 +18,10 @@ data class DummyTracker( override val isLoggedIn: Boolean = false, val valLogoColor: Int = Color.rgb(18, 25, 35), val valLogo: Int = R.drawable.ic_tracker_anilist, - val valStatuses: List = (1..6).toList(), - val valReadingStatus: Int = 1, - val valRereadingStatus: Int = 1, - val valCompletionStatus: Int = 2, + val valStatuses: List = (1L..6L).toList(), + val valReadingStatus: Long = 1L, + val valRereadingStatus: Long = 1L, + val valCompletionStatus: Long = 2L, val valScoreList: ImmutableList = (0..10).map(Int::toString).toImmutableList(), val val10PointScore: Double = 5.4, val valSearchResults: List = listOf(), @@ -34,29 +34,29 @@ data class DummyTracker( override fun getLogo(): Int = valLogo - override fun getStatusList(): List = valStatuses + override fun getStatusList(): List = valStatuses - override fun getStatus(status: Int): StringResource? = when (status) { - 1 -> MR.strings.reading - 2 -> MR.strings.plan_to_read - 3 -> MR.strings.completed - 4 -> MR.strings.on_hold - 5 -> MR.strings.dropped - 6 -> MR.strings.repeating + override fun getStatus(status: Long): StringResource? = when (status) { + 1L -> MR.strings.reading + 2L -> MR.strings.plan_to_read + 3L -> MR.strings.completed + 4L -> MR.strings.on_hold + 5L -> MR.strings.dropped + 6L -> MR.strings.repeating else -> null } - override fun getReadingStatus(): Int = valReadingStatus + override fun getReadingStatus(): Long = valReadingStatus - override fun getRereadingStatus(): Int = valRereadingStatus + override fun getRereadingStatus(): Long = valRereadingStatus - override fun getCompletionStatus(): Int = valCompletionStatus + override fun getCompletionStatus(): Long = valCompletionStatus override fun getScoreList(): ImmutableList = valScoreList override fun get10PointScore(track: Track): Double = val10PointScore - override fun indexToScore(index: Int): Float = getScoreList()[index].toFloat() + override fun indexToScore(index: Int): Double = getScoreList()[index].toDouble() override fun displayScore(track: Track): String = track.score.toString() @@ -94,7 +94,7 @@ data class DummyTracker( override suspend fun setRemoteStatus( track: eu.kanade.tachiyomi.data.database.models.Track, - status: Int, + status: Long, ) = Unit override suspend fun setRemoteLastChapterRead( diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 04ac2248a..e701a8dd6 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -3,22 +3,17 @@ android:height="108dp" android:viewportWidth="432" android:viewportHeight="432"> - + + - diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index b293ee17e..e26e3cc61 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -3,12 +3,7 @@ android:height="108dp" android:viewportWidth="432" android:viewportHeight="432"> - - - + diff --git a/app/src/main/res/mipmap/ic_launcher.xml b/app/src/main/res/mipmap/ic_launcher.xml index 04091bd10..80faec845 100644 --- a/app/src/main/res/mipmap/ic_launcher.xml +++ b/app/src/main/res/mipmap/ic_launcher.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/build.gradle.kts b/build.gradle.kts index ad3a21a2e..dfaf0816e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,8 +32,7 @@ subprojects { } plugins.withType { - plugins.apply("tachiyomi.lint") - + plugins.apply("detekt") configure { compileSdkVersion(AndroidConfig.compileSdk) defaultConfig { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 2c76035b7..a948efcc7 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -3,9 +3,10 @@ plugins { } dependencies { + implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) implementation(androidxLibs.gradle) implementation(kotlinLibs.gradle) - implementation(libs.ktlint) + implementation(libs.detekt.gradlePlugin) implementation(gradleApi()) } diff --git a/buildSrc/src/main/kotlin/detekt.gradle.kts b/buildSrc/src/main/kotlin/detekt.gradle.kts new file mode 100644 index 000000000..986138ee6 --- /dev/null +++ b/buildSrc/src/main/kotlin/detekt.gradle.kts @@ -0,0 +1,47 @@ +import io.gitlab.arturbosch.detekt.Detekt +import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask +import org.gradle.accessors.dm.LibrariesForLibs + +plugins { + id("io.gitlab.arturbosch.detekt") +} + +val libs = the() +dependencies { + detektPlugins(libs.detekt.rules.formatting) + detektPlugins(libs.detekt.rules.compose) +} + +private val configFile = files("$rootDir/config/detekt/detekt.yml") +private val baselineFile = file("$rootDir/config/detekt/baseline.xml") +private val kotlinFiles = "**/*.kt" +private val resourceFiles = "**/resources/**" +private val buildFiles = "**/build/**" +private val generatedFiles = "**/generated/**" +private val scriptsFiles = "**/*.kts" + +detekt { + buildUponDefaultConfig = true + parallel = true + autoCorrect = false + ignoreFailures = false + config.setFrom(configFile) + baseline = file(baselineFile) +} + +tasks.withType().configureEach { + include(kotlinFiles) + exclude(resourceFiles, buildFiles, generatedFiles, scriptsFiles) + reports { + html.required.set(true) + xml.required.set(false) + txt.required.set(false) + } +} + +tasks.withType().configureEach { + jvmTarget = JavaVersion.VERSION_17.toString() +} +tasks.withType().configureEach { + jvmTarget = JavaVersion.VERSION_17.toString() +} diff --git a/buildSrc/src/main/kotlin/tachiyomi.lint.gradle.kts b/buildSrc/src/main/kotlin/tachiyomi.lint.gradle.kts deleted file mode 100644 index 5216d4962..000000000 --- a/buildSrc/src/main/kotlin/tachiyomi.lint.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -import org.jlleitschuh.gradle.ktlint.KtlintExtension -import org.jlleitschuh.gradle.ktlint.KtlintPlugin - -apply() - -extensions.configure("ktlint") { - version.set("0.50.0") - android.set(true) - enableExperimentalRules.set(true) - - filter { - exclude("**/generated/**") - - // For some reason this is needed for Kotlin MPP - exclude { tree -> - val path = tree.file.path - listOf("/generated/").any { - path.contains(it) - } - } - } -} diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml new file mode 100644 index 000000000..1845cae53 --- /dev/null +++ b/config/detekt/baseline.xml @@ -0,0 +1,1327 @@ + + + + + ComplexCondition:MangaScreenModel.kt$MangaScreenModel$(selectedItem.selected && selected) || (!selectedItem.selected && !selected) + ComplexCondition:ReaderNavigationOverlayView.kt$ReaderNavigationOverlayView$isVisible || (!showOnStart && firstLaunch) || navigation is DisabledNavigation + ComplexCondition:ReaderPageImageView.kt$ReaderPageImageView$config != null && config!!.landscapeZoom && config!!.minimumScaleType == SCALE_TYPE_CENTER_INSIDE && sWidth > sHeight && scale == minScale + ComposableParamOrder:ChapterSettingsDialog.kt$ChapterSettingsDialog + ComposableParamOrder:LazyLibraryGrid.kt$LazyLibraryGrid + ComposableParamOrder:SwitchPreferenceWidget.kt$SwitchPreferenceWidget + ComposableParamOrder:TrackingPreferenceWidget.kt$TrackingPreferenceWidget + ComposableParamOrder:TriStateListDialog.kt$TriStateListDialog + CompositionLocalAllowlist:Navigator.kt$LocalBackPress + CompositionLocalAllowlist:PreferenceItem.kt$LocalPreferenceHighlighted + CompositionLocalAllowlist:PreferenceItem.kt$LocalPreferenceMinHeight + ConstructorParameterNaming:AnilistModels.kt$ALManga$val average_score: Int + ConstructorParameterNaming:AnilistModels.kt$ALManga$val image_url_lge: String + ConstructorParameterNaming:AnilistModels.kt$ALManga$val publishing_status: String + ConstructorParameterNaming:AnilistModels.kt$ALManga$val remote_id: Long + ConstructorParameterNaming:AnilistModels.kt$ALManga$val start_date_fuzzy: Long + ConstructorParameterNaming:AnilistModels.kt$ALManga$val title_user_pref: String + ConstructorParameterNaming:AnilistModels.kt$ALManga$val total_chapters: Long + ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val chapters_read: Int + ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val completed_date_fuzzy: Long + ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val library_id: Long + ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val list_status: String + ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val score_raw: Int + ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val start_date_fuzzy: Long + ConstructorParameterNaming:AnilistModels.kt$OAuth$val access_token: String + ConstructorParameterNaming:AnilistModels.kt$OAuth$val expires_in: Long + ConstructorParameterNaming:AnilistModels.kt$OAuth$val token_type: String + ConstructorParameterNaming:BackupManga.kt$BackupManga$@ProtoNumber(103) var viewer_flags: Int? = null + ConstructorParameterNaming:BangumiModels.kt$Collection$val ep_status: Int? = 0 + ConstructorParameterNaming:BangumiModels.kt$Collection$val vol_status: Int? = 0 + ConstructorParameterNaming:BangumiModels.kt$OAuth$val access_token: String + ConstructorParameterNaming:BangumiModels.kt$OAuth$val created_at: Long = System.currentTimeMillis() / 1000 + ConstructorParameterNaming:BangumiModels.kt$OAuth$val expires_in: Long + ConstructorParameterNaming:BangumiModels.kt$OAuth$val refresh_token: String? + ConstructorParameterNaming:BangumiModels.kt$OAuth$val token_type: String + ConstructorParameterNaming:BangumiModels.kt$OAuth$val user_id: Long? + ConstructorParameterNaming:ExtensionDetailsScreenModel.kt$ExtensionDetailsScreenModel.State$private val _sources: ImmutableList<ExtensionSourceItem>? = null + ConstructorParameterNaming:KavitaModels.kt$SeriesDto$val thumbnail_url: String? = "" + ConstructorParameterNaming:KitsuModels.kt$OAuth$val access_token: String + ConstructorParameterNaming:KitsuModels.kt$OAuth$val created_at: Long + ConstructorParameterNaming:KitsuModels.kt$OAuth$val expires_in: Long + ConstructorParameterNaming:KitsuModels.kt$OAuth$val refresh_token: String? + ConstructorParameterNaming:KitsuModels.kt$OAuth$val token_type: String + ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val access_token: String + ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val created_at: Long = System.currentTimeMillis() + ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val expires_in: Long + ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val refresh_token: String + ConstructorParameterNaming:MyAnimeListModels.kt$OAuth$val token_type: String + ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val access_token: String + ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val created_at: Long + ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val expires_in: Long + ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val refresh_token: String? + ConstructorParameterNaming:ShikimoriModels.kt$OAuth$val token_type: String + CyclomaticComplexMethod:AnilistModels.kt$fun DomainTrack.toAnilistScore(): String + CyclomaticComplexMethod:BrowseSourceScreen.kt$@Composable fun BrowseSourceContent( source: Source?, mangaList: LazyPagingItems<StateFlow<Manga>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalSourceHelpClick: () -> Unit, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) + CyclomaticComplexMethod:BrowseSourceScreen.kt$BrowseSourceScreen$@Composable override fun Content() + CyclomaticComplexMethod:BrowseSourceScreenModel.kt$BrowseSourceScreenModel$fun searchGenre(genreName: String) + CyclomaticComplexMethod:Button.kt$ButtonElevation$@Composable private fun animateElevation( enabled: Boolean, interactionSource: InteractionSource, ): State<Dp> + CyclomaticComplexMethod:DownloadCache.kt$DownloadCache$private fun renewCache() + CyclomaticComplexMethod:ExtensionLoader.kt$ExtensionLoader$private fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult + CyclomaticComplexMethod:ExtensionsScreen.kt$@Composable private fun ExtensionContent( state: ExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (Extension) -> Unit, onClickItemCancel: (Extension) -> Unit, onOpenWebView: (Extension.Available) -> Unit, onInstallExtension: (Extension.Available) -> Unit, onUninstallExtension: (Extension) -> Unit, onUpdateExtension: (Extension.Installed) -> Unit, onTrustExtension: (Extension.Untrusted) -> Unit, onOpenExtension: (Extension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) + CyclomaticComplexMethod:ExtensionsScreen.kt$@Composable private fun ExtensionItemContent( extension: Extension, installStep: InstallStep, modifier: Modifier = Modifier, ) + CyclomaticComplexMethod:GetSourcesWithFavoriteCount.kt$GetSourcesWithFavoriteCount$private fun sortFn( direction: SetMigrateSorting.Direction, sorting: SetMigrateSorting.Mode, ): java.util.Comparator<Pair<Source, Long>> + CyclomaticComplexMethod:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable + CyclomaticComplexMethod:LibraryScreenModel.kt$LibraryScreenModel$private fun LibraryMap.applySort( // Map<MangaId, List<Track>> trackMap: Map<Long, List<Track>>, ): LibraryMap + CyclomaticComplexMethod:LibraryScreenModel.kt$LibraryScreenModel$private suspend fun LibraryMap.applyFilters( trackMap: Map<Long, List<Track>>, loggedInTrackers: Map<Long, TriState>, ): LibraryMap + CyclomaticComplexMethod:LibraryTab.kt$LibraryTab$@Composable override fun Content() + CyclomaticComplexMethod:LibraryUpdateJob.kt$LibraryUpdateJob$private suspend fun addMangaToQueue(categoryId: Long) + CyclomaticComplexMethod:LocalSource.kt$LocalSource$override suspend fun getMangaDetails(manga: SManga): SManga + CyclomaticComplexMethod:LocalSource.kt$LocalSource$private fun updateCover(chapter: SChapter, manga: SManga): UniFile? + CyclomaticComplexMethod:MainActivity.kt$MainActivity$override fun onCreate(savedInstanceState: Bundle?) + CyclomaticComplexMethod:MainActivity.kt$MainActivity$private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean + CyclomaticComplexMethod:MangaInfoHeader.kt$@Composable private fun ColumnScope.MangaContentInfo( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) + CyclomaticComplexMethod:MangaScreen.kt$MangaScreen$@Composable override fun Content() + CyclomaticComplexMethod:MangaScreenModel.kt$MangaScreenModel$fun toggleSelection( item: ChapterList.Item, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) + CyclomaticComplexMethod:MigrateDialog.kt$MigrateDialogScreenModel$private suspend fun migrateMangaInternal( oldSource: Source?, newSource: Source, oldManga: Manga, newManga: Manga, sourceChapters: List<SChapter>, replace: Boolean, flags: Int, ) + CyclomaticComplexMethod:NotificationReceiver.kt$NotificationReceiver$override fun onReceive(context: Context, intent: Intent) + CyclomaticComplexMethod:PagerViewer.kt$PagerViewer$override fun handleKeyEvent(event: KeyEvent): Boolean + CyclomaticComplexMethod:PagerViewerAdapter.kt$PagerViewerAdapter$fun setChapters(chapters: ViewerChapters, forceTransition: Boolean) + CyclomaticComplexMethod:PreferenceItem.kt$@Composable internal fun PreferenceItem( item: Preference.PreferenceItem<*>, highlightKey: String?, ) + CyclomaticComplexMethod:RateLimitInterceptor.kt$RateLimitInterceptor$override fun intercept(chain: Interceptor.Chain): Response + CyclomaticComplexMethod:ReaderActivity.kt$ReaderActivity$override fun onCreate(savedInstanceState: Bundle?) + CyclomaticComplexMethod:ReaderActivity.kt$ReaderActivity$private fun initializeMenu() + CyclomaticComplexMethod:Scaffold.kt$@Composable private fun ScaffoldLayout( fabPosition: FabPosition, topBar: @Composable () -> Unit, startBar: @Composable () -> Unit, content: @Composable (PaddingValues) -> Unit, snackbar: @Composable () -> Unit, fab: @Composable () -> Unit, contentWindowInsets: WindowInsets, bottomBar: @Composable () -> Unit, ) + CyclomaticComplexMethod:SourcesScreenModel.kt$SourcesScreenModel$private fun collectLatestSources(sources: List<Source>) + CyclomaticComplexMethod:SyncChaptersWithSource.kt$SyncChaptersWithSource$suspend fun await( rawSourceChapters: List<SChapter>, manga: Manga, source: Source, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Chapter> + CyclomaticComplexMethod:TriStateListDialog.kt$@Composable fun <T> TriStateListDialog( title: String, message: String? = null, items: List<T>, initialChecked: List<T>, initialInversed: List<T>, itemLabel: @Composable (T) -> String, onDismissRequest: () -> Unit, onValueChanged: (newIncluded: List<T>, newExcluded: List<T>) -> Unit, ) + CyclomaticComplexMethod:UpdatesScreenModel.kt$UpdatesScreenModel$fun toggleSelection( item: UpdatesItem, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) + CyclomaticComplexMethod:VerticalFastScroller.kt$@Composable fun VerticalFastScroller( listState: LazyListState, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) + CyclomaticComplexMethod:VerticalFastScroller.kt$@Composable fun VerticalGridFastScroller( state: LazyGridState, columns: GridCells, arrangement: Arrangement.Horizontal, contentPadding: PaddingValues, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) + CyclomaticComplexMethod:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean + CyclomaticComplexMethod:WebtoonViewer.kt$WebtoonViewer$override fun handleKeyEvent(event: KeyEvent): Boolean + DestructuringDeclarationWithTooManyEntries:ExtensionsScreenModel.kt$ExtensionsScreenModel$(_updates, _installed, _available, _untrusted) + DestructuringDeclarationWithTooManyEntries:MangaInfoHeader.kt$(shrunk, expanded, actual, scrim) + EmptyCatchBlock:RarPageLoader.kt$RarPageLoader${ } + EqualsAlwaysReturnsTrueOrFalse:FilterList.kt$FilterList$override fun equals(other: Any?): Boolean + ExplicitItLambdaParameter:ColorFilterPage.kt${ index, it -> FilterChip( selected = colorFilterMode == index, onClick = { screenModel.preferences.colorFilterMode().set(index) }, label = { Text(stringResource(it.first)) }, ) } + ExplicitItLambdaParameter:LibraryTab.kt$LibraryTab${ it: LibraryManga -> scope.launchIO { val chapter = screenModel.getNextUnreadChapter(it.manga) if (chapter != null) { context.startActivity( ReaderActivity.newIntent(context, chapter.mangaId, chapter.id), ) } else { snackbarHostState.showSnackbar(context.stringResource(MR.strings.no_next_chapter)) } } Unit } + ExplicitItLambdaParameter:ReadingModePage.kt${ index, it -> FilterChip( selected = imageScaleType == index + 1, onClick = { screenModel.preferences.imageScaleType().set(index + 1) }, label = { Text(stringResource(it)) }, ) } + ExplicitItLambdaParameter:ReadingModePage.kt${ index, it -> FilterChip( selected = selected == index, onClick = { onSelect(index) }, label = { Text(stringResource(it)) }, ) } + ExplicitItLambdaParameter:ReadingModePage.kt${ index, it -> FilterChip( selected = zoomStart == index + 1, onClick = { screenModel.preferences.zoomStart().set(index + 1) }, label = { Text(stringResource(it)) }, ) } + ExplicitItLambdaParameter:SettingsReaderScreen.kt$SettingsReaderScreen${ index, it -> index + 1 to stringResource(it) } + ExplicitItLambdaParameter:SettingsReaderScreen.kt$SettingsReaderScreen${ index, it -> index to stringResource(it) } + FinalNewline:Commands.kt$.Commands.kt + ForEachOnRange:MangaBottomActionMenu.kt$0..<5 + ForEachOnRange:MangaBottomActionMenu.kt$0..<7 + ForEachOnRange:UpdatesWidget.kt$0..<rowCount + ForbiddenComment:AddTracks.kt$AddTracks$// TODO: merge into [SyncChapterProgressWithTrack]? + ForbiddenComment:AddTracks.kt$AddTracks$// TODO: update all trackers based on common data + ForbiddenComment:AppTheme.kt$AppTheme.NORD$// TODO: re-enable for preview + ForbiddenComment:BackupRestorer.kt$BackupRestorer$// TODO: optionally trigger online library + tracker update + ForbiddenComment:BangumiApi.kt$BangumiApi$// TODO: get user readed chapter here + ForbiddenComment:BaseTracker.kt$BaseTracker$// TODO: Store all scores as 10 point in the future maybe? + ForbiddenComment:BaselineProfileGenerator.kt$BaselineProfileGenerator$// TODO: automate storage permissions and possibly open manga details screen too? + ForbiddenComment:CategoryDialogs.kt$// TODO: https://issuetracker.google.com/issues/204502668 + ForbiddenComment:Chapter.kt$// TODO: Remove when all deps are migrated + ForbiddenComment:ConfigurableSource.kt$// TODO: use getSourcePreferences once all extensions are on ext-lib 1.5 + ForbiddenComment:DisplayExtensions.kt$// TODO: move the logic to `isTabletUi()` when main activity is rewritten in Compose + ForbiddenComment:ExtensionReposDialogs.kt$// TODO: https://issuetracker.google.com/issues/204502668 + ForbiddenComment:GlobalSearchToolbar.kt$// TODO: make this UX better; it only applies when triggering a new search + ForbiddenComment:HomeScreen.kt$HomeScreen$// TODO: https://issuetracker.google.com/u/0/issues/316327367 + ForbiddenComment:LibrarySettingsDialog.kt$// TODO: re-enable when custom intervals are ready for stable + ForbiddenComment:LibraryTabs.kt$// TODO: use default when width is fixed upstream + ForbiddenComment:LibraryUpdateJob.kt$LibraryUpdateJob$// TODO: surface skipped reasons to user? + ForbiddenComment:LocalSource.kt$LocalSource$// TODO: remove support for this entirely after a while + ForbiddenComment:Localize.kt$// TODO: janky workaround for https://github.com/icerockdev/moko-resources/issues/337 + ForbiddenComment:MainActivity.kt$MainActivity$// TODO: replace with ComponentActivity#enableEdgeToEdge + ForbiddenComment:Manga.kt$// TODO: move these into the domain model + ForbiddenComment:MangaCoverScreenModel.kt$MangaCoverScreenModel$// TODO: Handle animated cover + ForbiddenComment:MangaInfoHeader.kt$// TODO: show something better when using custom interval + ForbiddenComment:PreferenceItem.kt$// TODO: use different composable? + ForbiddenComment:ReaderPreferences.kt$ReaderPreferences$// TODO: default this to true if reader long strip ever goes stable + ForbiddenComment:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$// TODO: allow private option in stable versions once URL handling is more fleshed out + ForbiddenComment:Tracker.kt$Tracker$// TODO: Store all scores as 10 point in the future maybe? + ForbiddenComment:Tracker.kt$Tracker$// TODO: move this to an interactor, and update all trackers based on common data + ForbiddenComment:VerticalFastScroller.kt$// TODO: Sometimes item height is not available when scrolling up + FunctionNaming:Downloader.kt$Downloader$private fun _clearQueue() + FunctionNaming:Pin.kt$fun Pins(vararg pins: Pin) + FunctionNaming:PullRefresh.kt$PullToRefreshStateImpl.Companion$fun Saver( extraVerticalOffset: Float, positionalThreshold: Float, enabled: () -> Boolean, onRefresh: () -> Unit, ) + FunctionNaming:Requests.kt$fun DELETE( url: String, headers: Headers = DEFAULT_HEADERS, body: RequestBody = DEFAULT_BODY, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request + FunctionNaming:Requests.kt$fun GET( url: HttpUrl, headers: Headers = DEFAULT_HEADERS, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request + FunctionNaming:Requests.kt$fun GET( url: String, headers: Headers = DEFAULT_HEADERS, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request + FunctionNaming:Requests.kt$fun POST( url: String, headers: Headers = DEFAULT_HEADERS, body: RequestBody = DEFAULT_BODY, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request + FunctionNaming:Requests.kt$fun PUT( url: String, headers: Headers = DEFAULT_HEADERS, body: RequestBody = DEFAULT_BODY, cache: CacheControl = DEFAULT_CACHE_CONTROL, ): Request + FunctionParameterNaming:MangaScreen.kt$MangaScreen$manga_: Manga? + FunctionParameterNaming:MangaScreen.kt$MangaScreen$source_: Source? + FunctionParameterNaming:WebViewInterceptor.kt$_name: String + FunctionParameterNaming:WebViewInterceptor.kt$_value: String + ImportOrdering:Commands.kt$import org.gradle.api.Project import java.io.ByteArrayOutputStream import java.text.SimpleDateFormat import java.util.TimeZone import java.util.Date + Indentation:LocalesConfigPlugin.kt$ + InstanceOfCheckForException:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$e is CancellationException + InstanceOfCheckForException:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$e is StreamResetException + InstanceOfCheckForException:BackupRestoreJob.kt$BackupRestoreJob$e is CancellationException + InstanceOfCheckForException:Downloader.kt$Downloader$e is CancellationException + InstanceOfCheckForException:Downloader.kt$Downloader$error is CancellationException + InstanceOfCheckForException:HttpPageLoader.kt$HttpPageLoader$e is CancellationException + InstanceOfCheckForException:LibraryUpdateJob.kt$LibraryUpdateJob$e is CancellationException + InstanceOfCheckForException:MangaScreenModel.kt$MangaScreenModel$e is HttpException + InstanceOfCheckForException:MangaScreenModel.kt$MangaScreenModel$e is NoChaptersException + InstanceOfCheckForException:MetadataUpdateJob.kt$MetadataUpdateJob$e is CancellationException + InstanceOfCheckForException:ReaderViewModel.kt$ReaderViewModel$e is CancellationException + InstanceOfCheckForException:UncaughtExceptionInterceptor.kt$UncaughtExceptionInterceptor$e is IOException + LargeClass:MangaScreenModel.kt$MangaScreenModel : StateScreenModel + LongMethod:AboutScreen.kt$AboutScreen$@Composable override fun Content() + LongMethod:AdaptiveSheet.kt$@Composable fun AdaptiveSheet( isTabletUi: Boolean, tonalElevation: Dp, enableSwipeDismiss: Boolean, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, content: @Composable () -> Unit, ) + LongMethod:AnilistApi.kt$AnilistApi$suspend fun findLibManga(track: Track, userid: Int): Track? + LongMethod:AppBar.kt$@Composable fun AppBarActions( actions: ImmutableList<AppBar.AppBarAction>, ) + LongMethod:AppBar.kt$@Composable fun SearchToolbar( searchQuery: String?, onChangeSearchQuery: (String?) -> Unit, modifier: Modifier = Modifier, titleContent: @Composable () -> Unit = {}, navigateUp: (() -> Unit)? = null, searchEnabled: Boolean = true, placeholderText: String? = null, onSearch: (String) -> Unit = {}, onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) }, actions: @Composable RowScope.() -> Unit = {}, scrollBehavior: TopAppBarScrollBehavior? = null, visualTransformation: VisualTransformation = VisualTransformation.None, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, ) + LongMethod:AppModule.kt$AppModule$override fun InjektRegistrar.registerInjectables() + LongMethod:AppThemePreferenceWidget.kt$@Composable fun AppThemePreviewItem( selected: Boolean, onClick: () -> Unit, ) + LongMethod:BrowseSourceScreen.kt$@Composable fun BrowseSourceContent( source: Source?, mangaList: LazyPagingItems<StateFlow<Manga>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalSourceHelpClick: () -> Unit, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) + LongMethod:BrowseSourceScreen.kt$BrowseSourceScreen$@Composable override fun Content() + LongMethod:BrowseSourceToolbar.kt$@Composable fun BrowseSourceToolbar( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: Source?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) + LongMethod:Button.kt$ButtonElevation$@Composable private fun animateElevation( enabled: Boolean, interactionSource: InteractionSource, ): State<Dp> + LongMethod:CategoryDialogs.kt$@Composable fun ChangeCategoryDialog( initialSelection: ImmutableList<CheckboxState<Category>>, onDismissRequest: () -> Unit, onEditCategories: () -> Unit, onConfirm: (List<Long>, List<Long>) -> Unit, ) + LongMethod:ChapterDownloadIndicator.kt$@Composable private fun DownloadingIndicator( enabled: Boolean, downloadState: Download.State, downloadProgressProvider: () -> Int, onClick: (ChapterDownloadAction) -> Unit, modifier: Modifier = Modifier, ) + LongMethod:ChapterNavigator.kt$@Composable fun ChapterNavigator( isRtl: Boolean, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, ) + LongMethod:ChapterSettingsDialog.kt$@Composable fun ChapterSettingsDialog( onDismissRequest: () -> Unit, manga: Manga? = null, onDownloadFilterChanged: (TriState) -> Unit, onUnreadFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), onSortModeChanged: (Long) -> Unit, onDisplayModeChanged: (Long) -> Unit, onSetAsDefault: (applyToExistingManga: Boolean) -> Unit, onResetToDefault: () -> Unit, ) + LongMethod:ClearDatabaseScreen.kt$ClearDatabaseScreen$@Composable override fun Content() + LongMethod:ColorFilterPage.kt$@Composable internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel) + LongMethod:CreateBackupScreen.kt$CreateBackupScreen$@Composable override fun Content() + LongMethod:DomainModule.kt$DomainModule$override fun InjektRegistrar.registerInjectables() + LongMethod:DownloadCache.kt$DownloadCache$private fun renewCache() + LongMethod:DownloadQueueScreen.kt$DownloadQueueScreen$@Composable override fun Content() + LongMethod:Downloader.kt$Downloader$private suspend fun downloadChapter(download: Download) + LongMethod:EditTextPreferenceWidget.kt$@Composable fun EditTextPreferenceWidget( title: String, subtitle: String?, icon: ImageVector?, value: String, onConfirm: suspend (String) -> Boolean, ) + LongMethod:ExtensionDetailsScreen.kt$@Composable fun ExtensionDetailsScreen( navigateUp: () -> Unit, state: ExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) + LongMethod:ExtensionDetailsScreen.kt$@Composable private fun DetailsHeader( extension: Extension, onClickAgeRating: () -> Unit, onClickUninstall: () -> Unit, onClickAppInfo: (() -> Unit)?, ) + LongMethod:ExtensionLoader.kt$ExtensionLoader$private fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult + LongMethod:ExtensionsScreen.kt$@Composable private fun ExtensionContent( state: ExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (Extension) -> Unit, onClickItemCancel: (Extension) -> Unit, onOpenWebView: (Extension.Available) -> Unit, onInstallExtension: (Extension.Available) -> Unit, onUninstallExtension: (Extension) -> Unit, onUpdateExtension: (Extension.Installed) -> Unit, onTrustExtension: (Extension.Untrusted) -> Unit, onOpenExtension: (Extension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) + LongMethod:ExtensionsScreen.kt$@Composable private fun ExtensionItemActions( extension: Extension, installStep: InstallStep, modifier: Modifier = Modifier, onClickItemCancel: (Extension) -> Unit = {}, onClickItemAction: (Extension) -> Unit = {}, onClickItemSecondaryAction: (Extension) -> Unit = {}, ) + LongMethod:GlobalSearchToolbar.kt$@Composable fun GlobalSearchToolbar( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: SourceFilter, onChangeSearchFilter: (SourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) + LongMethod:HomeScreen.kt$HomeScreen$@Composable override fun Content() + LongMethod:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable + LongMethod:InfoScreen.kt$@Composable fun InfoScreen( icon: ImageVector, headingText: String, subtitleText: String, acceptText: String, onAcceptClick: () -> Unit, canAccept: Boolean = true, rejectText: String? = null, onRejectClick: (() -> Unit)? = null, content: @Composable ColumnScope.() -> Unit, ) + LongMethod:LibraryContent.kt$@Composable fun LibraryContent( categories: List<Category>, searchQuery: String?, selection: List<LibraryManga>, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onMangaClicked: (Long) -> Unit, onContinueReadingClicked: ((LibraryManga) -> Unit)?, onToggleSelection: (LibraryManga) -> Unit, onToggleRangeSelection: (LibraryManga) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfMangaForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<LibraryItem>, ) + LongMethod:LibraryPager.kt$@Composable fun LibraryPager( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedManga: List<LibraryManga>, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<LibraryItem>, onClickManga: (LibraryManga) -> Unit, onLongClickManga: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, ) + LongMethod:LibraryScreenModel.kt$LibraryScreenModel$private fun LibraryMap.applySort( // Map<MangaId, List<Track>> trackMap: Map<Long, List<Track>>, ): LibraryMap + LongMethod:LibraryScreenModel.kt$LibraryScreenModel$private suspend fun LibraryMap.applyFilters( trackMap: Map<Long, List<Track>>, loggedInTrackers: Map<Long, TriState>, ): LibraryMap + LongMethod:LibrarySettingsDialog.kt$@Composable private fun ColumnScope.DisplayPage( screenModel: LibrarySettingsScreenModel, ) + LongMethod:LibrarySettingsDialog.kt$@Composable private fun ColumnScope.FilterPage( screenModel: LibrarySettingsScreenModel, ) + LongMethod:LibraryTab.kt$LibraryTab$@Composable override fun Content() + LongMethod:LibraryUpdateJob.kt$LibraryUpdateJob$private suspend fun addMangaToQueue(categoryId: Long) + LongMethod:LibraryUpdateJob.kt$LibraryUpdateJob$private suspend fun updateChapterList() + LongMethod:MainActivity.kt$MainActivity$override fun onCreate(savedInstanceState: Bundle?) + LongMethod:MainActivity.kt$MainActivity$private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean + LongMethod:MangaBottomActionMenu.kt$@Composable fun LibraryBottomActionMenu( visible: Boolean, onChangeCategoryClicked: () -> Unit, onMarkAsReadClicked: () -> Unit, onMarkAsUnreadClicked: () -> Unit, onDownloadClicked: ((DownloadAction) -> Unit)?, onDeleteClicked: () -> Unit, modifier: Modifier = Modifier, ) + LongMethod:MangaBottomActionMenu.kt$@Composable fun MangaBottomActionMenu( visible: Boolean, modifier: Modifier = Modifier, onBookmarkClicked: (() -> Unit)? = null, onRemoveBookmarkClicked: (() -> Unit)? = null, onMarkAsReadClicked: (() -> Unit)? = null, onMarkAsUnreadClicked: (() -> Unit)? = null, onMarkPreviousAsReadClicked: (() -> Unit)? = null, onDownloadClicked: (() -> Unit)? = null, onDeleteClicked: (() -> Unit)? = null, ) + LongMethod:MangaChapterListItem.kt$@Composable fun MangaChapterListItem( title: String, date: String?, readProgress: String?, scanlator: String?, read: Boolean, bookmark: Boolean, selected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> Download.State, downloadProgressProvider: () -> Int, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((ChapterDownloadAction) -> Unit)?, onChapterSwipe: (LibraryPreferences.ChapterSwipeAction) -> Unit, modifier: Modifier = Modifier, ) + LongMethod:MangaCoverDialog.kt$@Composable fun MangaCoverDialog( coverDataProvider: () -> Manga, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) + LongMethod:MangaDialogs.kt$@Composable fun SetIntervalDialog( interval: Int, nextUpdate: Instant?, onDismissRequest: () -> Unit, onValueChanged: ((Int) -> Unit)? = null, ) + LongMethod:MangaInfoHeader.kt$@Composable fun ExpandableMangaDescription( defaultExpandState: Boolean, description: String?, tagsProvider: () -> List<String>?, onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, modifier: Modifier = Modifier, ) + LongMethod:MangaInfoHeader.kt$@Composable private fun ColumnScope.MangaContentInfo( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) + LongMethod:MangaInfoHeader.kt$@Composable private fun MangaSummary( expandedDescription: String, shrunkDescription: String, expanded: Boolean, modifier: Modifier = Modifier, ) + LongMethod:MangaScreen.kt$@Composable fun MangaScreen( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) + LongMethod:MangaScreen.kt$@Composable fun MangaScreenLargeImpl( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For swipe actions onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) + LongMethod:MangaScreen.kt$@Composable private fun MangaScreenSmallImpl( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) + LongMethod:MangaScreen.kt$MangaScreen$@Composable override fun Content() + LongMethod:MangaScreen.kt$private fun LazyListScope.sharedChapterItems( manga: Manga, chapters: List<ChapterList>, isAnyChapterSelected: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, ) + LongMethod:MangaToolbar.kt$@Composable fun MangaToolbar( title: String, titleAlphaProvider: () -> Float, hasFilters: Boolean, onBackClicked: () -> Unit, onClickFilter: () -> Unit, onClickShare: (() -> Unit)?, onClickDownload: ((DownloadAction) -> Unit)?, onClickEditCategory: (() -> Unit)?, onClickRefresh: () -> Unit, onClickMigrate: (() -> Unit)?, // For action mode actionModeCounter: Int, onSelectAll: () -> Unit, onInvertSelection: () -> Unit, modifier: Modifier = Modifier, backgroundAlphaProvider: () -> Float = titleAlphaProvider, ) + LongMethod:MigrateDialog.kt$@Composable internal fun MigrateDialog( oldManga: Manga, newManga: Manga, screenModel: MigrateDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, ) + LongMethod:MigrateDialog.kt$MigrateDialogScreenModel$private suspend fun migrateMangaInternal( oldSource: Source?, newSource: Source, oldManga: Manga, newManga: Manga, sourceChapters: List<SChapter>, replace: Boolean, flags: Int, ) + LongMethod:MoreScreen.kt$@Composable fun MoreScreen( downloadQueueStateProvider: () -> DownloadQueueState, downloadedOnly: Boolean, onDownloadedOnlyChange: (Boolean) -> Unit, incognitoMode: Boolean, onIncognitoModeChange: (Boolean) -> Unit, isFDroid: Boolean, onClickDownloadQueue: () -> Unit, onClickCategories: () -> Unit, onClickStats: () -> Unit, onClickDataAndStorage: () -> Unit, onClickSettings: () -> Unit, onClickAbout: () -> Unit, ) + LongMethod:Notifications.kt$Notifications$fun createChannels(context: Context) + LongMethod:PreferenceItem.kt$@Composable internal fun PreferenceItem( item: Preference.PreferenceItem<*>, highlightKey: String?, ) + LongMethod:ReaderActivity.kt$ReaderActivity$override fun onCreate(savedInstanceState: Bundle?) + LongMethod:ReaderActivity.kt$ReaderActivity$private fun initializeMenu() + LongMethod:ReaderAppBars.kt$@Composable fun ReaderAppBars( visible: Boolean, fullscreen: Boolean, mangaTitle: String?, chapterTitle: String?, navigateUp: () -> Unit, onClickTopAppBar: () -> Unit, bookmarked: Boolean, onToggleBookmarked: () -> Unit, onOpenInWebView: (() -> Unit)?, onShare: (() -> Unit)?, viewer: Viewer?, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) + LongMethod:ReadingModePage.kt$@Composable private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenModel) + LongMethod:Scaffold.kt$@Composable private fun ScaffoldLayout( fabPosition: FabPosition, topBar: @Composable () -> Unit, startBar: @Composable () -> Unit, content: @Composable (PaddingValues) -> Unit, snackbar: @Composable () -> Unit, fab: @Composable () -> Unit, contentWindowInsets: WindowInsets, bottomBar: @Composable () -> Unit, ) + LongMethod:ScanlatorFilterDialog.kt$@Composable fun ScanlatorFilterDialog( availableScanlators: Set<String>, excludedScanlators: Set<String>, onDismissRequest: () -> Unit, onConfirm: (Set<String>) -> Unit, ) + LongMethod:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$@Composable private fun getExtensionsGroup( basePreferences: BasePreferences, ): Preference.PreferenceGroup + LongMethod:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$@Composable private fun getNetworkGroup( networkPreferences: NetworkPreferences, ): Preference.PreferenceGroup + LongMethod:SettingsDataScreen.kt$SettingsDataScreen$@Composable private fun getBackupAndRestoreGroup(backupPreferences: BackupPreferences): Preference.PreferenceGroup + LongMethod:SettingsLibraryScreen.kt$SettingsLibraryScreen$@Composable private fun getGlobalUpdateGroup( allCategories: List<Category>, libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup + LongMethod:SettingsMainScreen.kt$SettingsMainScreen$@Composable fun Content(twoPane: Boolean) + LongMethod:SettingsReaderScreen.kt$SettingsReaderScreen$@Composable private fun getPagedGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup + LongMethod:SettingsReaderScreen.kt$SettingsReaderScreen$@Composable private fun getWebtoonGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup + LongMethod:SettingsSearchScreen.kt$@Composable private fun SearchResult( searchKey: String, modifier: Modifier = Modifier, listState: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(), onItemClick: (SearchResultItem) -> Unit, ) + LongMethod:SettingsSearchScreen.kt$SettingsSearchScreen$@Composable override fun Content() + LongMethod:SettingsTrackingScreen.kt$SettingsTrackingScreen$@Composable override fun getPreferences(): List<Preference> + LongMethod:SettingsTrackingScreen.kt$SettingsTrackingScreen$@Composable private fun TrackingLoginDialog( tracker: Tracker, uNameStringRes: StringResource, onDismissRequest: () -> Unit, ) + LongMethod:SourceFilterDialog.kt$@Composable private fun FilterItem(filter: Filter<*>, onUpdate: () -> Unit) + LongMethod:SourceSearchScreen.kt$SourceSearchScreen$@Composable override fun Content() + LongMethod:SyncChaptersWithSource.kt$SyncChaptersWithSource$suspend fun await( rawSourceChapters: List<SChapter>, manga: Manga, source: Source, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Chapter> + LongMethod:TrackInfoDialog.kt$TrackInfoDialogHomeScreen$@Composable override fun Content() + LongMethod:TrackInfoDialog.kt$TrackerRemoveScreen$@Composable override fun Content() + LongMethod:TrackInfoDialogHome.kt$@Composable private fun TrackInfoItem( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, chapters: String, onChaptersClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, ) + LongMethod:TrackerSearch.kt$@Composable fun TrackerSearch( query: TextFieldValue, onQueryChange: (TextFieldValue) -> Unit, onDispatchQuery: () -> Unit, queryResult: Result<List<TrackSearch>>?, selected: TrackSearch?, onSelectedChange: (TrackSearch) -> Unit, onConfirmSelection: () -> Unit, onDismissRequest: () -> Unit, ) + LongMethod:TrackerSearch.kt$@Composable private fun SearchResultItem( trackSearch: TrackSearch, selected: Boolean, onClick: () -> Unit, ) + LongMethod:TriStateListDialog.kt$@Composable fun <T> TriStateListDialog( title: String, message: String? = null, items: List<T>, initialChecked: List<T>, initialInversed: List<T>, itemLabel: @Composable (T) -> String, onDismissRequest: () -> Unit, onValueChanged: (newIncluded: List<T>, newExcluded: List<T>) -> Unit, ) + LongMethod:UpdatesScreen.kt$@Composable fun UpdateScreen( state: UpdatesScreenModel.State, snackbarHostState: SnackbarHostState, lastUpdated: Long, onClickCover: (UpdatesItem) -> Unit, onSelectAll: (Boolean) -> Unit, onInvertSelection: () -> Unit, onUpdateLibrary: () -> Boolean, onDownloadChapter: (List<UpdatesItem>, ChapterDownloadAction) -> Unit, onMultiBookmarkClicked: (List<UpdatesItem>, bookmark: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<UpdatesItem>, read: Boolean) -> Unit, onMultiDeleteClicked: (List<UpdatesItem>) -> Unit, onUpdateSelected: (UpdatesItem, Boolean, Boolean, Boolean) -> Unit, onOpenChapter: (UpdatesItem) -> Unit, ) + LongMethod:UpdatesTab.kt$UpdatesTab$@Composable override fun Content() + LongMethod:UpdatesUiItem.kt$@Composable private fun UpdatesUiItem( update: UpdatesWithRelations, selected: Boolean, readProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadChapter: ((ChapterDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> Download.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) + LongMethod:UpdatesWidget.kt$@Composable fun UpdatesWidget( data: ImmutableList<Pair<Long, Bitmap?>>?, contentColor: ColorProvider, topPadding: Dp, bottomPadding: Dp, modifier: GlanceModifier = GlanceModifier, ) + LongMethod:VerticalFastScroller.kt$@Composable fun VerticalFastScroller( listState: LazyListState, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) + LongMethod:VerticalFastScroller.kt$@Composable fun VerticalGridFastScroller( state: LazyGridState, columns: GridCells, arrangement: Arrangement.Horizontal, contentPadding: PaddingValues, modifier: Modifier = Modifier, thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, content: @Composable () -> Unit, ) + LongMethod:WebViewScreenContent.kt$@Composable fun WebViewScreenContent( onNavigateUp: () -> Unit, initialTitle: String?, url: String, onShare: (String) -> Unit, onOpenInBrowser: (String) -> Unit, onClearCookies: (String) -> Unit, headers: Map<String, String> = emptyMap(), onUrlChange: (String) -> Unit = {}, ) + LongMethod:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean + LongMethod:WheelPicker.kt$@Composable private fun <T> WheelPicker( items: ImmutableList<T>, modifier: Modifier = Modifier, startIndex: Int = 0, size: DpSize = DpSize(128.dp, 128.dp), onSelectionChanged: (index: Int) -> Unit = {}, manualInputType: KeyboardType? = null, backgroundContent: (@Composable (size: DpSize) -> Unit)? = { WheelPickerDefaults.Background(size = it) }, itemContent: @Composable LazyItemScope.(item: T) -> Unit, ) + LongParameterList:BottomReaderBar.kt$( backgroundColor: Color, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) + LongParameterList:BrowseSourceScreen.kt$( source: Source?, mangaList: LazyPagingItems<StateFlow<Manga>>, columns: GridCells, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalSourceHelpClick: () -> Unit, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) + LongParameterList:BrowseSourceToolbar.kt$( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: Source?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) + LongParameterList:CategoryListItem.kt$( category: Category, canMoveUp: Boolean, canMoveDown: Boolean, onMoveUp: (Category) -> Unit, onMoveDown: (Category) -> Unit, onRename: () -> Unit, onDelete: () -> Unit, modifier: Modifier = Modifier, ) + LongParameterList:CategoryScreen.kt$( categories: List<Category>, lazyListState: LazyListState, paddingValues: PaddingValues, onClickRename: (Category) -> Unit, onClickDelete: (Category) -> Unit, onMoveUp: (Category) -> Unit, onMoveDown: (Category) -> Unit, ) + LongParameterList:CategoryScreen.kt$( state: CategoryScreenState.Success, onClickCreate: () -> Unit, onClickSortAlphabetically: () -> Unit, onClickRename: (Category) -> Unit, onClickDelete: (Category) -> Unit, onClickMoveUp: (Category) -> Unit, onClickMoveDown: (Category) -> Unit, navigateUp: () -> Unit, ) + LongParameterList:ChapterNavigator.kt$( isRtl: Boolean, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, ) + LongParameterList:ChapterRepositoryImpl.kt$ChapterRepositoryImpl$( id: Long, mangaId: Long, url: String, name: String, scanlator: String?, read: Boolean, bookmark: Boolean, lastPageRead: Long, chapterNumber: Double, sourceOrder: Long, dateFetch: Long, dateUpload: Long, lastModifiedAt: Long, ) + LongParameterList:ChapterSettingsDialog.kt$( downloadFilter: TriState, onDownloadFilterChanged: ((TriState) -> Unit)?, unreadFilter: TriState, onUnreadFilterChanged: (TriState) -> Unit, bookmarkedFilter: TriState, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), ) + LongParameterList:ChapterSettingsDialog.kt$( onDismissRequest: () -> Unit, manga: Manga? = null, onDownloadFilterChanged: (TriState) -> Unit, onUnreadFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), onSortModeChanged: (Long) -> Unit, onDisplayModeChanged: (Long) -> Unit, onSetAsDefault: (applyToExistingManga: Boolean) -> Unit, onResetToDefault: () -> Unit, ) + LongParameterList:ChapterTransition.kt$( topLabel: String, topChapter: Chapter?, topChapterDownloaded: Boolean, bottomLabel: String, bottomChapter: Chapter?, bottomChapterDownloaded: Boolean, fallbackLabel: String, chapterGap: Int, ) + LongParameterList:ExtensionDetailsScreen.kt$( contentPadding: PaddingValues, extension: Extension.Installed, sources: ImmutableList<ExtensionSourceItem>, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) + LongParameterList:ExtensionDetailsScreen.kt$( navigateUp: () -> Unit, state: ExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, ) + LongParameterList:ExtensionsScreen.kt$( item: ExtensionUiModel.Item, onClickItem: (Extension) -> Unit, onLongClickItem: (Extension) -> Unit, onClickItemCancel: (Extension) -> Unit, onClickItemAction: (Extension) -> Unit, onClickItemSecondaryAction: (Extension) -> Unit, modifier: Modifier = Modifier, ) + LongParameterList:ExtensionsScreen.kt$( state: ExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (Extension) -> Unit, onClickItemCancel: (Extension) -> Unit, onOpenWebView: (Extension.Available) -> Unit, onInstallExtension: (Extension.Available) -> Unit, onUninstallExtension: (Extension) -> Unit, onUpdateExtension: (Extension.Installed) -> Unit, onTrustExtension: (Extension.Untrusted) -> Unit, onOpenExtension: (Extension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) + LongParameterList:ExtensionsScreen.kt$( state: ExtensionsScreenModel.State, contentPadding: PaddingValues, searchQuery: String?, onLongClickItem: (Extension) -> Unit, onClickItemCancel: (Extension) -> Unit, onOpenWebView: (Extension.Available) -> Unit, onInstallExtension: (Extension.Available) -> Unit, onUninstallExtension: (Extension) -> Unit, onUpdateExtension: (Extension.Installed) -> Unit, onTrustExtension: (Extension.Untrusted) -> Unit, onOpenExtension: (Extension.Installed) -> Unit, onClickUpdateAll: () -> Unit, onRefresh: () -> Unit, ) + LongParameterList:GlobalSearchScreen.kt$( items: Map<CatalogueSource, SearchItemResult>, contentPadding: PaddingValues, getManga: @Composable (Manga) -> State<Manga>, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, fromSourceId: Long? = null, ) + LongParameterList:GlobalSearchScreen.kt$( state: SearchScreenModel.State, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (SourceFilter) -> Unit, onToggleResults: () -> Unit, getManga: @Composable (Manga) -> State<Manga>, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, ) + LongParameterList:GlobalSearchToolbar.kt$( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: SourceFilter, onChangeSearchFilter: (SourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) + LongParameterList:HistoryMapper.kt$HistoryMapper$( historyId: Long, mangaId: Long, chapterId: Long, title: String, thumbnailUrl: String?, sourceId: Long, isFavorite: Boolean, coverLastModified: Long, chapterNumber: Double, readAt: Date?, readDuration: Long, ) + LongParameterList:HistoryScreen.kt$( state: HistoryScreenModel.State, snackbarHostState: SnackbarHostState, onSearchQueryChange: (String?) -> Unit, onClickCover: (mangaId: Long) -> Unit, onClickResume: (mangaId: Long, chapterId: Long) -> Unit, onDialogChange: (HistoryScreenModel.Dialog?) -> Unit, ) + LongParameterList:InfoScreen.kt$( icon: ImageVector, headingText: String, subtitleText: String, acceptText: String, onAcceptClick: () -> Unit, canAccept: Boolean = true, rejectText: String? = null, onRejectClick: (() -> Unit)? = null, content: @Composable ColumnScope.() -> Unit, ) + LongParameterList:LibraryComfortableGrid.kt$( items: List<LibraryItem>, columns: Int, contentPadding: PaddingValues, selection: List<LibraryManga>, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) + LongParameterList:LibraryCompactGrid.kt$( items: List<LibraryItem>, showTitle: Boolean, columns: Int, contentPadding: PaddingValues, selection: List<LibraryManga>, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) + LongParameterList:LibraryContent.kt$( categories: List<Category>, searchQuery: String?, selection: List<LibraryManga>, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onMangaClicked: (Long) -> Unit, onContinueReadingClicked: ((LibraryManga) -> Unit)?, onToggleSelection: (LibraryManga) -> Unit, onToggleRangeSelection: (LibraryManga) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfMangaForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<LibraryItem>, ) + LongParameterList:LibraryList.kt$( items: List<LibraryItem>, contentPadding: PaddingValues, selection: List<LibraryManga>, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) + LongParameterList:LibraryPager.kt$( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedManga: List<LibraryManga>, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>, getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>, getLibraryForPage: (Int) -> List<LibraryItem>, onClickManga: (LibraryManga) -> Unit, onLongClickManga: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, ) + LongParameterList:LibraryToolbar.kt$( hasActiveFilters: Boolean, selectedCount: Int, title: LibraryToolbarTitle, onClickUnselectAll: () -> Unit, onClickSelectAll: () -> Unit, onClickInvertSelection: () -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, onClickGlobalUpdate: () -> Unit, onClickOpenRandomManga: () -> Unit, searchQuery: String?, onSearchQueryChange: (String?) -> Unit, scrollBehavior: TopAppBarScrollBehavior?, ) + LongParameterList:LibraryToolbar.kt$( title: LibraryToolbarTitle, hasFilters: Boolean, searchQuery: String?, onSearchQueryChange: (String?) -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, onClickGlobalUpdate: () -> Unit, onClickOpenRandomManga: () -> Unit, scrollBehavior: TopAppBarScrollBehavior?, ) + LongParameterList:ListPreferenceWidget.kt$( value: T, title: String, subtitle: String?, icon: ImageVector?, entries: Map<out T, String>, onValueChange: (T) -> Unit, ) + LongParameterList:MangaBottomActionMenu.kt$( visible: Boolean, onChangeCategoryClicked: () -> Unit, onMarkAsReadClicked: () -> Unit, onMarkAsUnreadClicked: () -> Unit, onDownloadClicked: ((DownloadAction) -> Unit)?, onDeleteClicked: () -> Unit, modifier: Modifier = Modifier, ) + LongParameterList:MangaChapterListItem.kt$( action: LibraryPreferences.ChapterSwipeAction, read: Boolean, bookmark: Boolean, downloadState: Download.State, background: Color, onSwipe: () -> Unit, ) + LongParameterList:MangaChapterListItem.kt$( title: String, date: String?, readProgress: String?, scanlator: String?, read: Boolean, bookmark: Boolean, selected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> Download.State, downloadProgressProvider: () -> Int, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((ChapterDownloadAction) -> Unit)?, onChapterSwipe: (LibraryPreferences.ChapterSwipeAction) -> Unit, modifier: Modifier = Modifier, ) + LongParameterList:MangaCoverDialog.kt$( coverDataProvider: () -> Manga, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) + LongParameterList:MangaCoverFetcher.kt$MangaCoverFetcher$( private val url: String?, private val isLibraryManga: Boolean, private val options: Options, private val coverFileLazy: Lazy<File?>, private val customCoverFileLazy: Lazy<File>, private val diskCacheKeyLazy: Lazy<String>, private val sourceLazy: Lazy<HttpSource?>, private val callFactoryLazy: Lazy<Call.Factory>, private val diskCacheLazy: Lazy<DiskCache>, ) + LongParameterList:MangaInfoHeader.kt$( appBarPadding: Dp, coverDataProvider: () -> Manga, onCoverClick: () -> Unit, title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, ) + LongParameterList:MangaInfoHeader.kt$( favorite: Boolean, trackingCount: Int, nextUpdate: Instant?, isUserIntervalMode: Boolean, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, onEditIntervalClicked: (() -> Unit)?, onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) + LongParameterList:MangaInfoHeader.kt$( isTabletUi: Boolean, appBarPadding: Dp, title: String, author: String?, artist: String?, sourceName: String, isStubSource: Boolean, coverDataProvider: () -> Manga, status: Long, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, modifier: Modifier = Modifier, ) + LongParameterList:MangaInfoHeader.kt$( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) + LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, ) + LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, totalCount: Long, readCount: Double, latestUpload: Long, chapterFetchedAt: Long, lastRead: Long, bookmarkCount: Double, category: Long, ) + LongParameterList:MangaRestorer.kt$MangaRestorer$( manga: Manga, chapters: List<BackupChapter>, categories: List<Long>, backupCategories: List<BackupCategory>, history: List<BackupHistory>, tracks: List<BackupTracking>, excludedScanlators: List<String>, ) + LongParameterList:MangaScreen.kt$( manga: Manga, chapters: List<ChapterList>, isAnyChapterSelected: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, ) + LongParameterList:MangaScreen.kt$( selected: List<ChapterList.Item>, onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onMultiDeleteClicked: (List<Chapter>) -> Unit, fillFraction: Float, modifier: Modifier = Modifier, ) + LongParameterList:MangaScreen.kt$( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For swipe actions onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) + LongParameterList:MangaScreen.kt$( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) + LongParameterList:MangaScreen.kt$( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onBackClicked: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List<Chapter>) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) + LongParameterList:MangaToolbar.kt$( title: String, titleAlphaProvider: () -> Float, hasFilters: Boolean, onBackClicked: () -> Unit, onClickFilter: () -> Unit, onClickShare: (() -> Unit)?, onClickDownload: ((DownloadAction) -> Unit)?, onClickEditCategory: (() -> Unit)?, onClickRefresh: () -> Unit, onClickMigrate: (() -> Unit)?, // For action mode actionModeCounter: Int, onSelectAll: () -> Unit, onInvertSelection: () -> Unit, modifier: Modifier = Modifier, backgroundAlphaProvider: () -> Float = titleAlphaProvider, ) + LongParameterList:MigrateDialog.kt$( oldManga: Manga, newManga: Manga, screenModel: MigrateDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, ) + LongParameterList:MigrateDialog.kt$MigrateDialogScreenModel$( oldSource: Source?, newSource: Source, oldManga: Manga, newManga: Manga, sourceChapters: List<SChapter>, replace: Boolean, flags: Int, ) + LongParameterList:MigrateSearchScreen.kt$( state: SearchScreenModel.State, fromSourceId: Long?, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (SourceFilter) -> Unit, onToggleResults: () -> Unit, getManga: @Composable (Manga) -> State<Manga>, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, ) + LongParameterList:MigrateSourceScreen.kt$( list: ImmutableList<Pair<Source, Long>>, contentPadding: PaddingValues, onClickItem: (Source) -> Unit, onLongClickItem: (Source) -> Unit, sortingMode: SetMigrateSorting.Mode, onToggleSortingMode: () -> Unit, sortingDirection: SetMigrateSorting.Direction, onToggleSortingDirection: () -> Unit, ) + LongParameterList:MoreScreen.kt$( downloadQueueStateProvider: () -> DownloadQueueState, downloadedOnly: Boolean, onDownloadedOnlyChange: (Boolean) -> Unit, incognitoMode: Boolean, onIncognitoModeChange: (Boolean) -> Unit, isFDroid: Boolean, onClickDownloadQueue: () -> Unit, onClickCategories: () -> Unit, onClickStats: () -> Unit, onClickDataAndStorage: () -> Unit, onClickSettings: () -> Unit, onClickAbout: () -> Unit, ) + LongParameterList:ReaderAppBars.kt$( visible: Boolean, fullscreen: Boolean, mangaTitle: String?, chapterTitle: String?, navigateUp: () -> Unit, onClickTopAppBar: () -> Unit, bookmarked: Boolean, onToggleBookmarked: () -> Unit, onOpenInWebView: (() -> Unit)?, onShare: (() -> Unit)?, viewer: Viewer?, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) + LongParameterList:Scaffold.kt$( fabPosition: FabPosition, topBar: @Composable () -> Unit, startBar: @Composable () -> Unit, content: @Composable (PaddingValues) -> Unit, snackbar: @Composable () -> Unit, fab: @Composable () -> Unit, contentWindowInsets: WindowInsets, bottomBar: @Composable () -> Unit, ) + LongParameterList:Scrollbar.kt$( orientation: Orientation, reverseDirection: Boolean, atEnd: Boolean, showScrollbar: Boolean, thickness: Float, color: Color, alpha: () -> Float, thumbSize: Float, scrollOffset: Float, positionOffset: Float, ) + LongParameterList:SetMangaChapterFlags.kt$SetMangaChapterFlags$( mangaId: Long, unreadFilter: Long, downloadedFilter: Long, bookmarkedFilter: Long, sortingMode: Long, sortingDirection: Long, displayMode: Long, ) + LongParameterList:SyncChaptersWithSource.kt$SyncChaptersWithSource$( private val downloadManager: DownloadManager, private val downloadProvider: DownloadProvider, private val chapterRepository: ChapterRepository, private val shouldUpdateDbChapter: ShouldUpdateDbChapter, private val updateManga: UpdateManga, private val updateChapter: UpdateChapter, private val getChaptersByMangaId: GetChaptersByMangaId, private val getExcludedScanlators: GetExcludedScanlators, ) + LongParameterList:TrackInfoDialogHome.kt$( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, chapters: String, onChaptersClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, ) + LongParameterList:TrackInfoDialogHome.kt$( trackItems: List<TrackItem>, dateFormat: DateFormat, onStatusClick: (TrackItem) -> Unit, onChapterClick: (TrackItem) -> Unit, onScoreClick: (TrackItem) -> Unit, onStartDateEdit: (TrackItem) -> Unit, onEndDateEdit: (TrackItem) -> Unit, onNewSearch: (TrackItem) -> Unit, onOpenInBrowser: (TrackItem) -> Unit, onRemoved: (TrackItem) -> Unit, ) + LongParameterList:TrackInfoDialogSelector.kt$( title: String, initialSelectedDateMillis: Long, selectableDates: SelectableDates, onConfirm: (Long) -> Unit, onRemove: (() -> Unit)?, onDismissRequest: () -> Unit, ) + LongParameterList:TrackMapper.kt$TrackMapper$( id: Long, mangaId: Long, syncId: Long, remoteId: Long, libraryId: Long?, title: String, lastChapterRead: Double, totalChapters: Long, status: Long, score: Double, remoteUrl: String, startDate: Long, finishDate: Long, ) + LongParameterList:TrackerSearch.kt$( query: TextFieldValue, onQueryChange: (TextFieldValue) -> Unit, onDispatchQuery: () -> Unit, queryResult: Result<List<TrackSearch>>?, selected: TrackSearch?, onSelectedChange: (TrackSearch) -> Unit, onConfirmSelection: () -> Unit, onDismissRequest: () -> Unit, ) + LongParameterList:TriStateListDialog.kt$( title: String, message: String? = null, items: List<T>, initialChecked: List<T>, initialInversed: List<T>, itemLabel: @Composable (T) -> String, onDismissRequest: () -> Unit, onValueChanged: (newIncluded: List<T>, newExcluded: List<T>) -> Unit, ) + LongParameterList:UpdatesRepositoryImpl.kt$UpdatesRepositoryImpl$( mangaId: Long, mangaTitle: String, chapterId: Long, chapterName: String, scanlator: String?, read: Boolean, bookmark: Boolean, lastPageRead: Long, sourceId: Long, favorite: Boolean, thumbnailUrl: String?, coverLastModified: Long, dateUpload: Long, dateFetch: Long, ) + LongParameterList:UpdatesScreen.kt$( onUpdateLibrary: () -> Unit, // For action mode actionModeCounter: Int, onSelectAll: () -> Unit, onInvertSelection: () -> Unit, onCancelActionMode: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, modifier: Modifier = Modifier, ) + LongParameterList:UpdatesScreen.kt$( state: UpdatesScreenModel.State, snackbarHostState: SnackbarHostState, lastUpdated: Long, onClickCover: (UpdatesItem) -> Unit, onSelectAll: (Boolean) -> Unit, onInvertSelection: () -> Unit, onUpdateLibrary: () -> Boolean, onDownloadChapter: (List<UpdatesItem>, ChapterDownloadAction) -> Unit, onMultiBookmarkClicked: (List<UpdatesItem>, bookmark: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<UpdatesItem>, read: Boolean) -> Unit, onMultiDeleteClicked: (List<UpdatesItem>) -> Unit, onUpdateSelected: (UpdatesItem, Boolean, Boolean, Boolean) -> Unit, onOpenChapter: (UpdatesItem) -> Unit, ) + LongParameterList:UpdatesUiItem.kt$( uiModels: List<UpdatesUiModel>, selectionMode: Boolean, onUpdateSelected: (UpdatesItem, Boolean, Boolean, Boolean) -> Unit, onClickCover: (UpdatesItem) -> Unit, onClickUpdate: (UpdatesItem) -> Unit, onDownloadChapter: (List<UpdatesItem>, ChapterDownloadAction) -> Unit, ) + LongParameterList:UpdatesUiItem.kt$( update: UpdatesWithRelations, selected: Boolean, readProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadChapter: ((ChapterDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> Download.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) + LongParameterList:WebViewScreenContent.kt$( onNavigateUp: () -> Unit, initialTitle: String?, url: String, onShare: (String) -> Unit, onOpenInBrowser: (String) -> Unit, onClearCookies: (String) -> Unit, headers: Map<String, String> = emptyMap(), onUrlChange: (String) -> Unit = {}, ) + LongParameterList:WebtoonRecyclerView.kt$WebtoonRecyclerView$( fromRate: Float, toRate: Float, fromX: Float, toX: Float, fromY: Float, toY: Float, ) + LoopWithTooManyJumpStatements:DownloadStore.kt$DownloadStore$for + LoopWithTooManyJumpStatements:ImageUtil.kt$ImageUtil$for + LoopWithTooManyJumpStatements:Kavita.kt$Kavita$for + LoopWithTooManyJumpStatements:RateLimitInterceptor.kt$RateLimitInterceptor$while + LoopWithTooManyJumpStatements:UpdatesScreenModel.kt$UpdatesScreenModel$for + MagicNumber:AdaptiveSheet.kt$220 + MagicNumber:AdaptiveSheet.kt$90 + MagicNumber:Anilist.kt$Anilist$10 + MagicNumber:Anilist.kt$Anilist$10.0 + MagicNumber:Anilist.kt$Anilist$100 + MagicNumber:Anilist.kt$Anilist$10f + MagicNumber:Anilist.kt$Anilist$18 + MagicNumber:Anilist.kt$Anilist$20 + MagicNumber:Anilist.kt$Anilist$20.0 + MagicNumber:Anilist.kt$Anilist$25 + MagicNumber:Anilist.kt$Anilist$25.0 + MagicNumber:Anilist.kt$Anilist$35 + MagicNumber:Anilist.kt$Anilist$5 + MagicNumber:Anilist.kt$Anilist$60 + MagicNumber:AnilistApi.kt$AnilistApi$31536000000 + MagicNumber:AnilistModels.kt$10 + MagicNumber:AnilistModels.kt$30 + MagicNumber:AnilistModels.kt$35 + MagicNumber:AnilistModels.kt$50 + MagicNumber:AnilistModels.kt$60 + MagicNumber:AnilistModels.kt$70 + MagicNumber:AnilistModels.kt$90 + MagicNumber:App.kt$App$300 + MagicNumber:App.kt$App$8 + MagicNumber:AppThemePreferenceWidget.kt$0.3f + MagicNumber:AppThemePreferenceWidget.kt$0.5f + MagicNumber:AppThemePreferenceWidget.kt$0.6f + MagicNumber:AppThemePreferenceWidget.kt$0.7f + MagicNumber:AppThemePreferenceWidget.kt$0.8f + MagicNumber:AppThemePreferenceWidget.kt$16f + MagicNumber:AppThemePreferenceWidget.kt$9f + MagicNumber:AppUpdateDownloadJob.kt$AppUpdateDownloadJob.<no name provided>$100 + MagicNumber:AppUpdateDownloadJob.kt$AppUpdateDownloadJob.<no name provided>$200 + MagicNumber:AppUpdateNotifier.kt$AppUpdateNotifier$100 + MagicNumber:Backup.kt$Backup$100 + MagicNumber:Backup.kt$Backup$101 + MagicNumber:Backup.kt$Backup$104 + MagicNumber:Backup.kt$Backup$105 + MagicNumber:BackupCategory.kt$BackupCategory$100 + MagicNumber:BackupChapter.kt$BackupChapter$10 + MagicNumber:BackupChapter.kt$BackupChapter$11 + MagicNumber:BackupChapter.kt$BackupChapter$3 + MagicNumber:BackupChapter.kt$BackupChapter$4 + MagicNumber:BackupChapter.kt$BackupChapter$5 + MagicNumber:BackupChapter.kt$BackupChapter$6 + MagicNumber:BackupChapter.kt$BackupChapter$7 + MagicNumber:BackupChapter.kt$BackupChapter$8 + MagicNumber:BackupChapter.kt$BackupChapter$9 + MagicNumber:BackupCreateJob.kt$BackupCreateJob.Companion$10 + MagicNumber:BackupDecoder.kt$BackupDecoder$0x1f8b + MagicNumber:BackupHistory.kt$BackupHistory$3 + MagicNumber:BackupManga.kt$BackupManga$100 + MagicNumber:BackupManga.kt$BackupManga$101 + MagicNumber:BackupManga.kt$BackupManga$102 + MagicNumber:BackupManga.kt$BackupManga$103 + MagicNumber:BackupManga.kt$BackupManga$104 + MagicNumber:BackupManga.kt$BackupManga$105 + MagicNumber:BackupManga.kt$BackupManga$106 + MagicNumber:BackupManga.kt$BackupManga$107 + MagicNumber:BackupManga.kt$BackupManga$108 + MagicNumber:BackupManga.kt$BackupManga$13 + MagicNumber:BackupManga.kt$BackupManga$14 + MagicNumber:BackupManga.kt$BackupManga$16 + MagicNumber:BackupManga.kt$BackupManga$17 + MagicNumber:BackupManga.kt$BackupManga$18 + MagicNumber:BackupManga.kt$BackupManga$3 + MagicNumber:BackupManga.kt$BackupManga$4 + MagicNumber:BackupManga.kt$BackupManga$5 + MagicNumber:BackupManga.kt$BackupManga$6 + MagicNumber:BackupManga.kt$BackupManga$7 + MagicNumber:BackupManga.kt$BackupManga$8 + MagicNumber:BackupManga.kt$BackupManga$9 + MagicNumber:BackupPreferences.kt$BackupPreferences$12 + MagicNumber:BackupTracking.kt$BackupTracking$10 + MagicNumber:BackupTracking.kt$BackupTracking$100 + MagicNumber:BackupTracking.kt$BackupTracking$11 + MagicNumber:BackupTracking.kt$BackupTracking$3 + MagicNumber:BackupTracking.kt$BackupTracking$4 + MagicNumber:BackupTracking.kt$BackupTracking$5 + MagicNumber:BackupTracking.kt$BackupTracking$6 + MagicNumber:BackupTracking.kt$BackupTracking$7 + MagicNumber:BackupTracking.kt$BackupTracking$8 + MagicNumber:BackupTracking.kt$BackupTracking$9 + MagicNumber:Bangumi.kt$Bangumi$145 + MagicNumber:Bangumi.kt$Bangumi$153 + MagicNumber:Bangumi.kt$Bangumi$240 + MagicNumber:BangumiInterceptor.kt$BangumiInterceptor$1000 + MagicNumber:BangumiModels.kt$1000 + MagicNumber:BangumiModels.kt$3600 + MagicNumber:BangumiModels.kt$OAuth$1000 + MagicNumber:BasePreferenceWidget.kt$200 + MagicNumber:BrowseIcons.kt$0x1F888888 + MagicNumber:ChapterDownloadIndicator.kt$0.5f + MagicNumber:ChapterRecognition.kt$ChapterRecognition$10 + MagicNumber:ChapterRecognition.kt$ChapterRecognition$10.0 + MagicNumber:ChapterRecognition.kt$ChapterRecognition$2.0 + MagicNumber:ChapterRecognition.kt$ChapterRecognition$3 + MagicNumber:CircularProgressIndicator.kt$2000 + MagicNumber:ColorFilterPage.kt$16 + MagicNumber:ColorFilterPage.kt$24 + MagicNumber:ColorFilterPage.kt$8 + MagicNumber:CommonMangaItem.kt$0.33f + MagicNumber:CommonMangaItem.kt$0xAA000000 + MagicNumber:ContextExtensions.kt$3 + MagicNumber:ContextExtensions.kt$50 + MagicNumber:DateExtensions.kt$7 + MagicNumber:DelayedTrackingUpdateJob.kt$DelayedTrackingUpdateJob$3 + MagicNumber:DelayedTrackingUpdateJob.kt$DelayedTrackingUpdateJob.Companion$5 + MagicNumber:DeviceUtil.kt$DeviceUtil$1024 + MagicNumber:DeviceUtil.kt$DeviceUtil$3L + MagicNumber:DeviceUtil.kt$DeviceUtil$90000 + MagicNumber:DiskUtil.kt$DiskUtil$240 + MagicNumber:Download.kt$Download.State.DOWNLOADED$3 + MagicNumber:Download.kt$Download.State.ERROR$4 + MagicNumber:DownloadCache.kt$DownloadCache$1000 + MagicNumber:DownloadDropdownMenu.kt$10 + MagicNumber:DownloadDropdownMenu.kt$25 + MagicNumber:DownloadDropdownMenu.kt$5 + MagicNumber:DownloadHolder.kt$DownloadHolder$100 + MagicNumber:DownloadNotifier.kt$DownloadNotifier$15 + MagicNumber:DownloadNotifier.kt$DownloadNotifier$30 + MagicNumber:DownloadProvider.kt$DownloadProvider$4 + MagicNumber:DownloadQueueScreen.kt$DownloadQueueScreen$0.08f + MagicNumber:DownloadQueueScreen.kt$DownloadQueueScreen$0.12f + MagicNumber:DownloadQueueScreenModel.kt$DownloadQueueScreenModel$50 + MagicNumber:Downloader.kt$Downloader$100 + MagicNumber:Downloader.kt$Downloader$1000 + MagicNumber:Downloader.kt$Downloader$3 + MagicNumber:Downloader.kt$Downloader$5 + MagicNumber:DropdownMenu.kt$56 + MagicNumber:ExtensionDetailsScreen.kt$1.5f + MagicNumber:ExtensionInstallService.kt$ExtensionInstallService$100 + MagicNumber:FetchInterval.kt$FetchInterval$10 + MagicNumber:FetchInterval.kt$FetchInterval$1000 + MagicNumber:FetchInterval.kt$FetchInterval$3 + MagicNumber:FetchInterval.kt$FetchInterval$7 + MagicNumber:FetchInterval.kt$FetchInterval$8 + MagicNumber:GetApplicationRelease.kt$GetApplicationRelease$3 + MagicNumber:GlanceUtils.kt$10 + MagicNumber:GlanceUtils.kt$64 + MagicNumber:GlanceUtils.kt$95 + MagicNumber:GlobalSearchItem.kt$99f + MagicNumber:Hash.kt$Hash$15 + MagicNumber:Hash.kt$Hash$240 + MagicNumber:Hash.kt$Hash$4 + MagicNumber:HttpSource.kt$HttpSource$0xff + MagicNumber:HttpSource.kt$HttpSource$7 + MagicNumber:HttpSource.kt$HttpSource$8 + MagicNumber:ImageUtil.kt$ImageUtil$0.01 + MagicNumber:ImageUtil.kt$ImageUtil$0.0275 + MagicNumber:ImageUtil.kt$ImageUtil$100 + MagicNumber:ImageUtil.kt$ImageUtil$14 + MagicNumber:ImageUtil.kt$ImageUtil$18 + MagicNumber:ImageUtil.kt$ImageUtil$200 + MagicNumber:ImageUtil.kt$ImageUtil$22 + MagicNumber:ImageUtil.kt$ImageUtil$25 + MagicNumber:ImageUtil.kt$ImageUtil$3 + MagicNumber:ImageUtil.kt$ImageUtil$30 + MagicNumber:ImageUtil.kt$ImageUtil$32 + MagicNumber:ImageUtil.kt$ImageUtil$40 + MagicNumber:ImageUtil.kt$ImageUtil$5 + MagicNumber:ImageUtil.kt$ImageUtil$50 + MagicNumber:ImageUtil.kt$ImageUtil$6 + MagicNumber:ImageUtil.kt$ImageUtil$740 + MagicNumber:ImageUtil.kt$ImageUtil$9 + MagicNumber:Kavita.kt$Kavita$0xff + MagicNumber:Kavita.kt$Kavita$148 + MagicNumber:Kavita.kt$Kavita$198 + MagicNumber:Kavita.kt$Kavita$3 + MagicNumber:Kavita.kt$Kavita$7 + MagicNumber:Kavita.kt$Kavita$74 + MagicNumber:Kavita.kt$Kavita$8 + MagicNumber:KavitaApi.kt$KavitaApi$200 + MagicNumber:KavitaApi.kt$KavitaApi$204 + MagicNumber:KavitaApi.kt$KavitaApi$401 + MagicNumber:KavitaApi.kt$KavitaApi$500 + MagicNumber:KavitaModels.kt$OAuth$3 + MagicNumber:Kitsu.kt$Kitsu$20 + MagicNumber:Kitsu.kt$Kitsu$37 + MagicNumber:Kitsu.kt$Kitsu$50 + MagicNumber:Kitsu.kt$Kitsu$51 + MagicNumber:KitsuModels.kt$1000 + MagicNumber:KitsuModels.kt$3600 + MagicNumber:Komga.kt$Komga$37 + MagicNumber:Komga.kt$Komga$50 + MagicNumber:Komga.kt$Komga$51 + MagicNumber:LibraryScreenModel.kt$LibraryScreenModel$10 + MagicNumber:LibraryScreenModel.kt$LibraryScreenModel$25 + MagicNumber:LibraryScreenModel.kt$LibraryScreenModel$5 + MagicNumber:LibrarySortMode.kt$LibrarySort.Direction.Ascending$0b01000000 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.ChapterFetchDate$0b00011000 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.DateAdded$0b00011100 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.LastRead$0b00000100 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.LastUpdate$0b00001000 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.LatestChapter$0b00010100 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.TotalChapters$0b00010000 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.TrackerMean$0b000100000 + MagicNumber:LibrarySortMode.kt$LibrarySort.Type.UnreadCount$0b00001100 + MagicNumber:LibraryToolbar.kt$0.08f + MagicNumber:LibraryToolbar.kt$0.12f + MagicNumber:LibraryUpdateJob.kt$LibraryUpdateJob$5 + MagicNumber:LibraryUpdateJob.kt$LibraryUpdateJob.Companion$10 + MagicNumber:LibraryUpdateNotifier.kt$LibraryUpdateNotifier$40 + MagicNumber:MangaBottomActionMenu.kt$3 + MagicNumber:MangaBottomActionMenu.kt$4 + MagicNumber:MangaBottomActionMenu.kt$5 + MagicNumber:MangaBottomActionMenu.kt$6 + MagicNumber:MangaBottomActionMenu.kt$7 + MagicNumber:MangaCover.kt$MangaCover.Book$3f + MagicNumber:MangaInfoHeader.kt$0.2f + MagicNumber:MangaInfoHeader.kt$0.65f + MagicNumber:MangaScreenModel.kt$MangaScreenModel$10 + MagicNumber:MangaScreenModel.kt$MangaScreenModel$103 + MagicNumber:MangaScreenModel.kt$MangaScreenModel$25 + MagicNumber:MangaScreenModel.kt$MangaScreenModel$5 + MagicNumber:MangaUpdates.kt$MangaUpdates$146 + MagicNumber:MangaUpdates.kt$MangaUpdates$160 + MagicNumber:MangaUpdates.kt$MangaUpdates$173 + MagicNumber:MangaUpdatesApi.kt$MangaUpdatesApi$200 + MagicNumber:MetadataUpdateJob.kt$MetadataUpdateJob$5 + MagicNumber:Modifier.kt$0.16f + MagicNumber:Modifier.kt$0.22f + MagicNumber:MonetColorScheme.kt$MonetColorScheme.Companion$128 + MagicNumber:MyAnimeList.kt$MyAnimeList$162 + MagicNumber:MyAnimeList.kt$MyAnimeList$46 + MagicNumber:MyAnimeList.kt$MyAnimeList$81 + MagicNumber:MyAnimeListApi.kt$MyAnimeListApi$64 + MagicNumber:MyAnimeListInterceptor.kt$MyAnimeListInterceptor$401 + MagicNumber:MyAnimeListModels.kt$1000 + MagicNumber:NetworkHelper.kt$NetworkHelper$30 + MagicNumber:Page.kt$Page$100 + MagicNumber:PageIndicatorText.kt$235 + MagicNumber:PageIndicatorText.kt$45 + MagicNumber:PagerConfig.kt$PagerConfig$3 + MagicNumber:PagerConfig.kt$PagerConfig$4 + MagicNumber:PagerConfig.kt$PagerConfig$5 + MagicNumber:PagerPageHolder.kt$PagerPageHolder$16 + MagicNumber:PagerPageHolder.kt$PagerPageHolder$90f + MagicNumber:PagerViewer.kt$PagerViewer$5 + MagicNumber:PkceUtil.kt$PkceUtil$50 + MagicNumber:PullRefresh.kt$PullToRefreshStateImpl$4 + MagicNumber:ReaderActivity.kt$ReaderActivity$230 + MagicNumber:ReaderActivity.kt$ReaderActivity$242 + MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$0.01f + MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$100 + MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$100f + MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$255f + MagicNumber:ReaderActivity.kt$ReaderActivity.ReaderConfig$3 + MagicNumber:ReaderContentOverlay.kt$100f + MagicNumber:ReaderOrientation.kt$ReaderOrientation.FREE$0x00000008 + MagicNumber:ReaderOrientation.kt$ReaderOrientation.LANDSCAPE$0x00000018 + MagicNumber:ReaderOrientation.kt$ReaderOrientation.LOCKED_LANDSCAPE$0x00000028 + MagicNumber:ReaderOrientation.kt$ReaderOrientation.LOCKED_PORTRAIT$0x00000020 + MagicNumber:ReaderOrientation.kt$ReaderOrientation.PORTRAIT$0x00000010 + MagicNumber:ReaderOrientation.kt$ReaderOrientation.REVERSE_PORTRAIT$0x00000030 + MagicNumber:ReaderPageImageView.kt$ReaderPageImageView$180 + MagicNumber:ReaderPageImageView.kt$ReaderPageImageView$250 + MagicNumber:ReaderPageImageView.kt$ReaderPageImageView$500 + MagicNumber:ReaderPreferences.kt$ReaderPreferences$500 + MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.HIGH$13 + MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.HIGHEST$5 + MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.LOW$31 + MagicNumber:ReaderPreferences.kt$ReaderPreferences.ReaderHideThreshold.LOWEST$47 + MagicNumber:ReaderProgressIndicator.kt$ReaderProgressIndicator$100f + MagicNumber:ReaderSettingsDialog.kt$0.5f + MagicNumber:ReaderViewModel.kt$ReaderViewModel$0.25 + MagicNumber:ReadingMode.kt$ReadingMode.CONTINUOUS_VERTICAL$0x00000005 + MagicNumber:ReadingMode.kt$ReadingMode.VERTICAL$0x00000003 + MagicNumber:ReadingMode.kt$ReadingMode.WEBTOON$0x00000004 + MagicNumber:ReadingModePage.kt$100f + MagicNumber:ReadingModePage.kt$5 + MagicNumber:SaveImageNotifier.kt$SaveImageNotifier$1280 + MagicNumber:SaveImageNotifier.kt$SaveImageNotifier$720 + MagicNumber:Scaffold.kt$3 + MagicNumber:Scaffold.kt$4 + MagicNumber:Scaffold.kt$5 + MagicNumber:Scaffold.kt$6 + MagicNumber:Scaffold.kt$7 + MagicNumber:Scaffold.kt$8 + MagicNumber:Scaffold.kt$9 + MagicNumber:Scrollbar.kt$100 + MagicNumber:Scrollbar.kt$50 + MagicNumber:SecureActivityDelegate.kt$SecureActivityDelegate.Companion$60_000 + MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$12 + MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$168 + MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$24 + MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$48 + MagicNumber:SettingsDataScreen.kt$SettingsDataScreen$6 + MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$10 + MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$3 + MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$4 + MagicNumber:SettingsDownloadScreen.kt$SettingsDownloadScreen$5 + MagicNumber:SettingsItems.kt$0.5f + MagicNumber:SettingsItems.kt$1.5f + MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$12 + MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$168 + MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$24 + MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$48 + MagicNumber:SettingsLibraryScreen.kt$SettingsLibraryScreen$72 + MagicNumber:SettingsMainScreen.kt$SettingsMainScreen$0.02f + MagicNumber:SettingsMainScreen.kt$SettingsMainScreen$0.05f + MagicNumber:SettingsMainScreen.kt$SettingsMainScreen$3 + MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$100f + MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$250 + MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$3 + MagicNumber:SettingsReaderScreen.kt$SettingsReaderScreen$500 + MagicNumber:SettingsSearchScreen.kt$10 + MagicNumber:Shikimori.kt$Shikimori$40 + MagicNumber:ShikimoriModels.kt$1000 + MagicNumber:ShikimoriModels.kt$3600 + MagicNumber:Surface.kt$100f + MagicNumber:Surface.kt$4.5f + MagicNumber:Suwayomi.kt$Suwayomi$255 + MagicNumber:Suwayomi.kt$Suwayomi$35 + MagicNumber:Tabs.kt$0.08f + MagicNumber:Tabs.kt$0.12f + MagicNumber:TimeUtils.kt$4 + MagicNumber:TrackInfoDialog.kt$TrackChapterSelectorScreen.Model$10000 + MagicNumber:TrackInfoDialogSelector.kt$3L + MagicNumber:TrackInfoDialogSelector.kt$4L + MagicNumber:TrackInfoDialogSelector.kt$5L + MagicNumber:TrackInfoDialogSelector.kt$6L + MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$10 + MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$100 + MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$1000L + MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$100L + MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$30 + MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$365 + MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$40 + MagicNumber:TrackingPreferenceWidget.kt$0xFF4CAF50 + MagicNumber:UniFileTempFileManager.kt$UniFileTempFileManager$3 + MagicNumber:UniFileTempFileManager.kt$UniFileTempFileManager$8192 + MagicNumber:UpdatesScreenModel.kt$UpdatesScreenModel$3 + MagicNumber:VerticalFastScroller.kt$100 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0x11 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0x28 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0x7D + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.LEFT$0xCC + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0x81 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0x8D + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0x95 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.MENU$0xCC + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0x84 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0x96 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0xCC + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.NEXT$0xE2 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0x33 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0x77 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0xCC + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.PREV$0xFF + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xA6 + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xCC + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xCF + MagicNumber:ViewerNavigation.kt$ViewerNavigation.NavigationRegion.RIGHT$0xD5 + MagicNumber:WebViewInterceptor.kt$WebViewInterceptor$30 + MagicNumber:WebtoonConfig.kt$WebtoonConfig$3 + MagicNumber:WebtoonConfig.kt$WebtoonConfig$4 + MagicNumber:WebtoonConfig.kt$WebtoonConfig$5 + MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$0.8 + MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$100f + MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$16 + MagicNumber:WebtoonPageHolder.kt$WebtoonPageHolder$90f + MagicNumber:WebtoonRecyclerView.kt$WebtoonRecyclerView$0.4f + MagicNumber:WebtoonRecyclerView.kt$WebtoonRecyclerView$400 + MagicNumber:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$0.5f + MagicNumber:WebtoonViewer.kt$WebtoonViewer$3 + MagicNumber:WebtoonViewer.kt$WebtoonViewer$5 + MagicNumber:WheelPicker.kt$0.2f + MagicNumber:WheelPicker.kt$1.2f + MagicNumber:WorkManagerExtensions.kt$500 + MatchingDeclarationName:ChapterDownloadIndicator.kt$ChapterDownloadAction + MatchingDeclarationName:CommonMangaItem.kt$CommonMangaItemDefaults + MatchingDeclarationName:EmptyScreen.kt$EmptyScreenAction + MatchingDeclarationName:LibrarySortMode.kt$LibrarySort : FlagWithMask + MatchingDeclarationName:MyAnimeListModels.kt$OAuth + MatchingDeclarationName:NetworkStateTracker.kt$NetworkState + MatchingDeclarationName:SettingsItems.kt$SettingsItemsPaddings + MatchingDeclarationName:ShikimoriModels.kt$OAuth + MatchingDeclarationName:TabbedDialog.kt$TabbedDialogPaddings + MaxLineLength:CoroutinesExtensions.kt$* + MaxLineLength:Downloader.kt$Downloader$. + MaxLineLength:LibraryUpdateJob.kt$LibraryUpdateJob$// failedUpdates will already have the source, don't need to copy it into the message + MaxLineLength:MainActivity.kt$MainActivity$// or the Google-specific search intent (triggered by saying or typing "search *query* on *Tachiyomi*" in Google Search/Google Assistant) + MaxLineLength:PreferenceScreen.kt$* + MaxLineLength:Scaffold.kt$* + MaxLineLength:SpecificHostRateLimitInterceptor.kt$* + MaxLineLength:WebViewUtil.kt$WebViewUtil$* + MemberNameEqualsClassName:ExtensionInstaller.kt$ExtensionInstaller$private val extensionInstaller = Injekt.get<BasePreferences>().extensionInstaller() + ModifierClickableOrder:ScanlatorFilterDialog.kt$clickable { if (isExcluded) { mutableExcludedScanlators.remove(scanlator) } else { mutableExcludedScanlators.add(scanlator) } } + ModifierMissing:AppBar.kt$AppBarActions + ModifierMissing:AppThemePreferenceWidget.kt$AppThemePreviewItem + ModifierMissing:BottomReaderBar.kt$BottomReaderBar + ModifierMissing:BrowseSourceComfortableGrid.kt$BrowseSourceComfortableGrid + ModifierMissing:BrowseSourceCompactGrid.kt$BrowseSourceCompactGrid + ModifierMissing:BrowseSourceList.kt$BrowseSourceList + ModifierMissing:BrowseSourceScreen.kt$BrowseSourceContent + ModifierMissing:BrowseSourceToolbar.kt$BrowseSourceToolbar + ModifierMissing:CategoryScreen.kt$CategoryScreen + ModifierMissing:ChapterNavigator.kt$ChapterNavigator + ModifierMissing:ChapterSettingsDialog.kt$ChapterSettingsDialog + ModifierMissing:ChapterSettingsDialog.kt$ScanlatorFilterItem + ModifierMissing:CollapsibleBox.kt$CollapsibleBox + ModifierMissing:CommonMangaItem.kt$MangaComfortableGridItem + ModifierMissing:CommonMangaItem.kt$MangaCompactGridItem + ModifierMissing:CommonMangaItem.kt$MangaListItem + ModifierMissing:CrashScreen.kt$CrashScreen + ModifierMissing:ExtensionDetailsScreen.kt$ExtensionDetailsScreen + ModifierMissing:ExtensionFilterScreen.kt$ExtensionFilterScreen + ModifierMissing:ExtensionReposScreen.kt$ExtensionReposScreen + ModifierMissing:ExtensionsScreen.kt$ExtensionScreen + ModifierMissing:GlobalSearchCardRow.kt$GlobalSearchCardRow + ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchErrorResultItem + ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchLoadingResultItem + ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchResultItem + ModifierMissing:GlobalSearchScreen.kt$GlobalSearchScreen + ModifierMissing:GlobalSearchToolbar.kt$GlobalSearchToolbar + ModifierMissing:HistoryScreen.kt$HistoryScreen + ModifierMissing:HomeScreen.kt$HomeScreen$NavigationRailItem + ModifierMissing:InfoScreen.kt$InfoScreen + ModifierMissing:LibraryContent.kt$LibraryContent + ModifierMissing:LibraryPager.kt$LibraryPager + ModifierMissing:LibrarySettingsDialog.kt$LibrarySettingsDialog + ModifierMissing:LogoHeader.kt$LogoHeader + ModifierMissing:MangaCoverDialog.kt$MangaCoverDialog + ModifierMissing:MangaScreen.kt$MangaScreenLargeImpl + ModifierMissing:MigrateMangaScreen.kt$MigrateMangaScreen + ModifierMissing:MigrateSearchScreen.kt$MigrateSearchScreen + ModifierMissing:MigrateSourceScreen.kt$MigrateSourceScreen + ModifierMissing:ModeSelectionDialog.kt$ModeSelectionDialog + ModifierMissing:MoreScreen.kt$MoreScreen + ModifierMissing:NewUpdateScreen.kt$NewUpdateScreen + ModifierMissing:OnboardingScreen.kt$OnboardingScreen + ModifierMissing:PageIndicatorText.kt$PageIndicatorText + ModifierMissing:PreferenceGroupHeader.kt$PreferenceGroupHeader + ModifierMissing:PreferenceScaffold.kt$PreferenceScaffold + ModifierMissing:ReaderAppBars.kt$ReaderAppBars + ModifierMissing:ReaderPageActionsDialog.kt$ReaderPageActionsDialog + ModifierMissing:ReaderSettingsDialog.kt$ReaderSettingsDialog + ModifierMissing:SectionCard.kt$SectionCard + ModifierMissing:SettingsItems.kt$CheckboxItem + ModifierMissing:SettingsItems.kt$HeadingItem + ModifierMissing:SettingsItems.kt$IconItem + ModifierMissing:SettingsItems.kt$RadioItem + ModifierMissing:SettingsItems.kt$SelectItem + ModifierMissing:SettingsItems.kt$SettingsChipRow + ModifierMissing:SettingsItems.kt$SettingsIconGrid + ModifierMissing:SettingsItems.kt$SliderItem + ModifierMissing:SettingsItems.kt$SortItem + ModifierMissing:SettingsItems.kt$TextItem + ModifierMissing:SettingsItems.kt$TriStateItem + ModifierMissing:SettingsMainScreen.kt$SettingsMainScreen$Content + ModifierMissing:SourceFilterDialog.kt$SourceFilterDialog + ModifierMissing:SourcesFilterScreen.kt$SourcesFilterScreen + ModifierMissing:SourcesScreen.kt$SourcesScreen + ModifierMissing:StatsScreenContent.kt$StatsScreenContent + ModifierMissing:TabbedScreen.kt$TabbedScreen + ModifierMissing:Tabs.kt$TabText + ModifierMissing:TrackInfoDialogHome.kt$TrackInfoDialogHome + ModifierMissing:TrackInfoDialogSelector.kt$TrackChapterSelector + ModifierMissing:TrackInfoDialogSelector.kt$TrackDateSelector + ModifierMissing:TrackInfoDialogSelector.kt$TrackScoreSelector + ModifierMissing:TrackInfoDialogSelector.kt$TrackStatusSelector + ModifierMissing:TrackLogoIcon.kt$TrackLogoIcon + ModifierMissing:TrackerSearch.kt$TrackerSearch + ModifierMissing:UpdatesScreen.kt$UpdateScreen + ModifierMissing:WebViewScreenContent.kt$WebViewScreenContent + ModifierMissing:WheelPicker.kt$WheelPickerDefaults$Background + ModifierMissing:WheelPicker.kt$WheelPickerDefaults$Item + ModifierNotUsedAtRoot:DropdownMenu.kt$modifier = modifier + ModifierNotUsedAtRoot:MangaChapterListItem.kt$modifier = modifier .selectedBackground(selected) .combinedClickable( onClick = onClick, onLongClick = onLongClick, ) .padding(start = 16.dp, top = 12.dp, end = 8.dp, bottom = 12.dp) + ModifierNotUsedAtRoot:TrackingPreferenceWidget.kt$modifier = modifier .clickable(enabled = onClick != null, onClick = { onClick?.invoke() }) .fillMaxWidth() .padding(horizontal = PrefsHorizontalPadding, vertical = 8.dp) + NestedBlockDepth:Anilist.kt$Anilist$override suspend fun update(track: Track, didReadChapter: Boolean): Track + NestedBlockDepth:AppLanguageScreen.kt$AppLanguageScreen$private fun getLangs(context: Context): ImmutableList<Language> + NestedBlockDepth:BackupRestorer.kt$BackupRestorer$private fun writeErrorLog(): File + NestedBlockDepth:BrowseSourceScreenModel.kt$BrowseSourceScreenModel$fun searchGenre(genreName: String) + NestedBlockDepth:ChapterLoader.kt$ChapterLoader$private fun getPageLoader(chapter: ReaderChapter): PageLoader + NestedBlockDepth:CloseableExtensions.kt$inline fun <T : Closeable?> Array<T>.use(block: () -> Unit) + NestedBlockDepth:ContextExtensions.kt$fun Context.openInBrowser(uri: Uri, forceDefaultBrowser: Boolean = false) + NestedBlockDepth:DownloadQueueScreenModel.kt$DownloadQueueScreenModel.<no name provided>$override fun onMenuItemClick(position: Int, menuItem: MenuItem) + NestedBlockDepth:Downloader.kt$Downloader$private fun archiveChapter( mangaDir: UniFile, dirname: String, tmpDir: UniFile, ) + NestedBlockDepth:ExtensionInstaller.kt$ExtensionInstaller$fun installApk(downloadId: Long, uri: Uri) + NestedBlockDepth:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable + NestedBlockDepth:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String? + NestedBlockDepth:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Double + NestedBlockDepth:Kitsu.kt$Kitsu$override suspend fun update(track: Track, didReadChapter: Boolean): Track + NestedBlockDepth:LibraryUpdateJob.kt$LibraryUpdateJob$private fun writeErrorFile(errors: List<Pair<Manga, String?>>): File + NestedBlockDepth:LocalSource.kt$LocalSource$private fun copyComicInfoFileFromArchive(chapterArchives: List<UniFile>, folderPath: String?): File? + NestedBlockDepth:LocalSource.kt$LocalSource$private fun updateCover(chapter: SChapter, manga: SManga): UniFile? + NestedBlockDepth:MyAnimeList.kt$MyAnimeList$override suspend fun update(track: Track, didReadChapter: Boolean): Track + NestedBlockDepth:SyncChaptersWithSource.kt$SyncChaptersWithSource$suspend fun await( rawSourceChapters: List<SChapter>, manga: Manga, source: Source, manualFetch: Boolean = false, fetchWindow: Pair<Long, Long> = Pair(0, 0), ): List<Chapter> + NestedBlockDepth:UniFileTempFileManager.kt$UniFileTempFileManager$fun createTempFile(file: UniFile): File + NestedBlockDepth:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean + NewLineAtEndOfFile:Commands.kt$.Commands.kt + NoConsecutiveBlankLines:LocalesConfigPlugin.kt$ + PreviewPublic:Scrollbar.kt$LazyListHorizontalScrollbarPreview + PreviewPublic:Scrollbar.kt$LazyListScrollbarPreview + RethrowCaughtException:LocalSource.kt$LocalSource$throw e + ReturnCount:AndroidDatabaseHandler.kt$AndroidDatabaseHandler$private suspend fun <T> dispatch(inTransaction: Boolean, block: suspend Database.() -> T): T + ReturnCount:AndroidSourceManager.kt$AndroidSourceManager$private suspend fun createStubSource(id: Long): StubSource + ReturnCount:BackupCreateJob.kt$BackupCreateJob$override suspend fun doWork(): Result + ReturnCount:ChapterRecognition.kt$ChapterRecognition$fun parseChapterNumber( mangaTitle: String, chapterName: String, chapterNumber: Double? = null, ): Double + ReturnCount:ChapterRecognition.kt$ChapterRecognition$private fun checkForDecimal(decimal: String?, alpha: String?): Double + ReturnCount:Download.kt$Download.Companion$suspend fun fromChapterId( chapterId: Long, getChapter: GetChapter = Injekt.get(), getManga: GetManga = Injekt.get(), sourceManager: SourceManager = Injekt.get(), ): Download? + ReturnCount:DownloadCache.kt$DownloadCache$fun isChapterDownloaded( chapterName: String, chapterScanlator: String?, mangaTitle: String, sourceId: Long, skipCache: Boolean, ): Boolean + ReturnCount:DownloadManager.kt$DownloadManager$fun renameSource(oldSource: Source, newSource: Source) + ReturnCount:Downloader.kt$Downloader$private fun isDownloadSuccessful( download: Download, tmpDir: UniFile, ): Boolean + ReturnCount:ExtensionInstallReceiver.kt$ExtensionInstallReceiver$override fun onReceive(context: Context, intent: Intent?) + ReturnCount:ExtensionInstallService.kt$ExtensionInstallService$override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int + ReturnCount:ExtensionInstaller.kt$ExtensionInstaller.DownloadCompletionReceiver$override fun onReceive(context: Context, intent: Intent?) + ReturnCount:ExtensionInstallerPreference.kt$ExtensionInstallerPreference$private fun check(value: ExtensionInstaller): ExtensionInstaller + ReturnCount:ExtensionLoader.kt$ExtensionLoader$fun installPrivateExtensionFile(context: Context, file: File): Boolean + ReturnCount:ExtensionLoader.kt$ExtensionLoader$private fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult + ReturnCount:ExtensionLoader.kt$ExtensionLoader$private fun selectExtensionPackage(shared: ExtensionInfo?, private: ExtensionInfo?): ExtensionInfo? + ReturnCount:HttpPageLoader.kt$HttpPageLoader$private fun preloadNextPages(currentPage: ReaderPage, amount: Int): List<PriorityPage> + ReturnCount:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable + ReturnCount:ImageUtil.kt$ImageUtil$fun isAnimatedAndSupported(stream: InputStream): Boolean + ReturnCount:ImageUtil.kt$ImageUtil$fun splitTallImage(tmpDir: UniFile, imageFile: UniFile, filenamePrefix: String): Boolean + ReturnCount:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String? + ReturnCount:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Double + ReturnCount:KitsuDateHelper.kt$KitsuDateHelper$fun parse(dateString: String?): Long + ReturnCount:LibraryUpdateJob.kt$LibraryUpdateJob$override suspend fun doWork(): Result + ReturnCount:LocalSource.kt$LocalSource$private fun copyComicInfoFileFromArchive(chapterArchives: List<UniFile>, folderPath: String?): File? + ReturnCount:MainActivity.kt$MainActivity$private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean + ReturnCount:MangaCoverFetcher.kt$MangaCoverFetcher$private suspend fun httpLoader(): FetchResult + ReturnCount:MangaExtensions.kt$fun Manga.prepUpdateCover(coverCache: CoverCache, remoteManga: SManga, refreshSameUrl: Boolean): Manga + ReturnCount:MangaExtensions.kt$fun Manga.removeCovers(coverCache: CoverCache = Injekt.get()): Manga + ReturnCount:MangaExtensions.kt$fun Manga.shouldDownloadNewChapters(dbCategories: List<Long>, preferences: DownloadPreferences): Boolean + ReturnCount:MangaScreen.kt$MangaScreen$private fun getMangaUrl(manga_: Manga?, source_: Source?): String? + ReturnCount:MissingChapters.kt$fun List<Double>.missingChaptersCount(): Int + ReturnCount:MissingChapters.kt$fun calculateChapterGap(higherChapter: Chapter?, lowerChapter: Chapter?): Int + ReturnCount:MyAnimeList.kt$MyAnimeList$override suspend fun search(query: String): List<TrackSearch> + ReturnCount:NetworkExtensions.kt$fun Context.isConnectedToWifi(): Boolean + ReturnCount:NetworkExtensions.kt$fun Context.isOnline(): Boolean + ReturnCount:PagerPageHolder.kt$PagerPageHolder$private fun process(page: ReaderPage, imageStream: BufferedInputStream): InputStream + ReturnCount:PagerViewer.kt$PagerViewer$override fun handleKeyEvent(event: KeyEvent): Boolean + ReturnCount:PagerViewer.kt$PagerViewer$private fun checkAllowPreload(page: ReaderPage?): Boolean + ReturnCount:PagerViewerAdapter.kt$PagerViewerAdapter$fun onPageSplit(currentPage: Any?, newPage: InsertPage) + ReturnCount:ReaderActivity.kt$ReaderActivity$override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean + ReturnCount:ReaderActivity.kt$ReaderActivity$private fun moveToPageIndex(index: Int) + ReturnCount:ReaderViewModel.kt$ReaderViewModel$fun getChapterUrl(): String? + ReturnCount:ReaderViewModel.kt$ReaderViewModel$fun setAsCover() + ReturnCount:ReaderViewModel.kt$ReaderViewModel$private fun downloadNextChapters() + ReturnCount:ReaderViewModel.kt$ReaderViewModel$private fun updateTrackChapterRead(readerChapter: ReaderChapter) + ReturnCount:ReaderViewModel.kt$ReaderViewModel$suspend fun preload(chapter: ReaderChapter) + ReturnCount:ViewExtensions.kt$fun View?.isVisibleOnScreen(): Boolean + ReturnCount:WebViewInterceptor.kt$WebViewInterceptor$override fun intercept(chain: Interceptor.Chain): Response + ReturnCount:WebViewInterceptor.kt$private fun isRequestHeaderSafe(_name: String, _value: String): Boolean + ReturnCount:WebtoonFrame.kt$WebtoonFrame$override fun dispatchTouchEvent(ev: MotionEvent): Boolean + ReturnCount:WebtoonPageHolder.kt$WebtoonPageHolder$private fun process(imageStream: BufferedInputStream): InputStream + ReturnCount:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean + ReturnCount:WebtoonViewer.kt$WebtoonViewer$override fun handleKeyEvent(event: KeyEvent): Boolean + ReturnCount:WebtoonViewer.kt$WebtoonViewer$private fun checkAllowPreload(page: ReaderPage?): Boolean + SerialVersionUIDInSerializableClass:Category.kt$Category : Serializable + SerialVersionUIDInSerializableClass:Manga.kt$Manga : Serializable + SpreadOperator:ChapterRepositoryImpl.kt$ChapterRepositoryImpl$(*chapterUpdates.toTypedArray()) + SpreadOperator:ChapterSanitizer.kt$ChapterSanitizer$(*CHAPTER_TRIM_CHARS) + SpreadOperator:LibraryScreenModel.kt$LibraryScreenModel$(*prefFlows) + SpreadOperator:MangaRepositoryImpl.kt$MangaRepositoryImpl$(*mangaUpdates.toTypedArray()) + SpreadOperator:SourcesScreenModel.kt$SourcesScreenModel$( SourceUiModel.Header(it.key), *it.value.map { source -> SourceUiModel.Item(source) }.toTypedArray(), ) + SpreadOperator:TrackRepositoryImpl.kt$TrackRepositoryImpl$(*tracks.toTypedArray()) + SwallowedException:AboutScreen.kt$AboutScreen$e: Exception + SwallowedException:AndroidPreference.kt$AndroidPreference$e: ClassCastException + SwallowedException:AndroidPreference.kt$AndroidPreference.Object$e: Exception + SwallowedException:Anilist.kt$Anilist$e: ClassCastException + SwallowedException:Anilist.kt$Anilist$e: Exception + SwallowedException:Anilist.kt$Anilist$e: Throwable + SwallowedException:AnilistModels.kt$ALManga$e: Exception + SwallowedException:BackupRestorer.kt$BackupRestorer$e: Exception + SwallowedException:Bangumi.kt$Bangumi$e: Exception + SwallowedException:Bangumi.kt$Bangumi$e: Throwable + SwallowedException:BrowseIcons.kt$e: Exception + SwallowedException:ChapterCache.kt$ChapterCache$e: IOException + SwallowedException:ChapterLoader.kt$ChapterLoader$e: UnsupportedRarV5Exception + SwallowedException:ContextExtensions.kt$e: Exception + SwallowedException:ContextExtensions.kt$e: PackageManager.NameNotFoundException + SwallowedException:CrashLogUtil.kt$CrashLogUtil$e: Throwable + SwallowedException:CreateBackupScreen.kt$CreateBackupScreen$e: ActivityNotFoundException + SwallowedException:DeviceUtil.kt$DeviceUtil$e: Exception + SwallowedException:DownloadPendingDeleter.kt$DownloadPendingDeleter$e: Exception + SwallowedException:DownloadStore.kt$DownloadStore$e: Exception + SwallowedException:Downloader.kt$Downloader$e: Throwable + SwallowedException:ExtensionLoader.kt$ExtensionLoader$error: PackageManager.NameNotFoundException + SwallowedException:GetChapterByUrlAndMangaId.kt$GetChapterByUrlAndMangaId$e: Exception + SwallowedException:HttpSource.kt$HttpSource$e: URISyntaxException + SwallowedException:ImageUtil.kt$ImageUtil$e: Exception + SwallowedException:Kavita.kt$Kavita$e: Exception + SwallowedException:KavitaApi.kt$KavitaApi$e: SocketTimeoutException + SwallowedException:Kitsu.kt$Kitsu$e: Exception + SwallowedException:KitsuModels.kt$KitsuSearchManga$e: IllegalArgumentException + SwallowedException:Komga.kt$Komga$e: Exception + SwallowedException:LibrarySortMode.kt$LibrarySort.Companion$e: Exception + SwallowedException:LocalSource.kt$LocalSource$e: Format.UnknownFormatException + SwallowedException:MangaScreen.kt$MangaScreen$e: Exception + SwallowedException:MangaUpdates.kt$MangaUpdates$e: Exception + SwallowedException:MangaUpdatesApi.kt$MangaUpdatesApi$e: Exception + SwallowedException:MetadataUpdateJob.kt$MetadataUpdateJob$e: Exception + SwallowedException:MyAnimeList.kt$MyAnimeList$e: Exception + SwallowedException:MyAnimeList.kt$MyAnimeList$e: Throwable + SwallowedException:MyAnimeListApi.kt$MyAnimeListApi$e: Exception + SwallowedException:OkHttpExtensions.kt$ex: Throwable + SwallowedException:Pager.kt$Pager$e: IllegalArgumentException + SwallowedException:Pager.kt$Pager$e: IndexOutOfBoundsException + SwallowedException:Pager.kt$Pager$e: NullPointerException + SwallowedException:PreferenceStore.kt$e: IllegalArgumentException + SwallowedException:RarPageLoader.kt$RarPageLoader$e: Exception + SwallowedException:ReaderActivity.kt$ReaderActivity$e: ArrayIndexOutOfBoundsException + SwallowedException:ReaderViewModel.kt$ReaderViewModel$e: Exception + SwallowedException:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$e: ActivityNotFoundException + SwallowedException:SettingsDataScreen.kt$SettingsDataScreen$e: ActivityNotFoundException + SwallowedException:Shikimori.kt$Shikimori$e: Exception + SwallowedException:Shikimori.kt$Shikimori$e: Throwable + SwallowedException:StorageStep.kt$StorageStep$e: ActivityNotFoundException + SwallowedException:Suwayomi.kt$Suwayomi$e: Exception + SwallowedException:TrackInfoDialog.kt$TrackInfoDialogHomeScreen.Model$e: Exception + ThrowingExceptionsWithoutMessageOrCause:MangaScreenModel.kt$MangaScreenModel$IllegalStateException() + ThrowingExceptionsWithoutMessageOrCause:OkHttpExtensions.kt$Exception() + ThrowingExceptionsWithoutMessageOrCause:PackageInstallerInstaller.kt$PackageInstallerInstaller$IllegalStateException() + ThrowingExceptionsWithoutMessageOrCause:ShizukuInstaller.kt$ShizukuInstaller$IllegalStateException() + ThrowingExceptionsWithoutMessageOrCause:TrackInfoDialog.kt$TrackInfoDialogHomeScreen.Model$Exception() + ThrowsCount:BackupCreator.kt$BackupCreator$suspend fun backup(uri: Uri, options: BackupOptions): String + ThrowsCount:FileExtensions.kt$fun File.copyAndSetReadOnlyTo(target: File, overwrite: Boolean = false, bufferSize: Int = DEFAULT_BUFFER_SIZE): File + ThrowsCount:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String? + ThrowsCount:LocalSource.kt$LocalSource$fun getFormat(chapter: SChapter): Format + TooGenericExceptionCaught:AboutScreen.kt$AboutScreen$e: Exception + TooGenericExceptionCaught:AddTracks.kt$AddTracks$e: Exception + TooGenericExceptionCaught:AndroidPreference.kt$AndroidPreference.Object$e: Exception + TooGenericExceptionCaught:Anilist.kt$Anilist$e: Exception + TooGenericExceptionCaught:Anilist.kt$Anilist$e: Throwable + TooGenericExceptionCaught:AnilistModels.kt$ALManga$e: Exception + TooGenericExceptionCaught:App.kt$App$e: Exception + TooGenericExceptionCaught:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$e: Exception + TooGenericExceptionCaught:BackupCreateJob.kt$BackupCreateJob$e: Exception + TooGenericExceptionCaught:BackupCreator.kt$BackupCreator$e: Exception + TooGenericExceptionCaught:BackupFileValidator.kt$BackupFileValidator$e: Exception + TooGenericExceptionCaught:BackupRestoreJob.kt$BackupRestoreJob$e: Exception + TooGenericExceptionCaught:BackupRestorer.kt$BackupRestorer$e: Exception + TooGenericExceptionCaught:Bangumi.kt$Bangumi$e: Exception + TooGenericExceptionCaught:Bangumi.kt$Bangumi$e: Throwable + TooGenericExceptionCaught:BaseTracker.kt$BaseTracker$e: Exception + TooGenericExceptionCaught:BaseTracker.kt$BaseTracker$e: Throwable + TooGenericExceptionCaught:BrowseIcons.kt$e: Exception + TooGenericExceptionCaught:ChapterCache.kt$ChapterCache$e: Exception + TooGenericExceptionCaught:ChapterLoader.kt$ChapterLoader$e: Throwable + TooGenericExceptionCaught:ChapterRepositoryImpl.kt$ChapterRepositoryImpl$e: Exception + TooGenericExceptionCaught:CloseableExtensions.kt$closeException: Throwable + TooGenericExceptionCaught:CloseableExtensions.kt$e: Throwable + TooGenericExceptionCaught:CloudflareInterceptor.kt$CloudflareInterceptor$e: Exception + TooGenericExceptionCaught:ContextExtensions.kt$e: Exception + TooGenericExceptionCaught:ContextExtensions.kt$e: Throwable + TooGenericExceptionCaught:CrashLogUtil.kt$CrashLogUtil$e: Throwable + TooGenericExceptionCaught:CreateCategoryWithName.kt$CreateCategoryWithName$e: Exception + TooGenericExceptionCaught:DeleteCategory.kt$DeleteCategory$e: Exception + TooGenericExceptionCaught:DeleteTrack.kt$DeleteTrack$e: Exception + TooGenericExceptionCaught:DeviceUtil.kt$DeviceUtil$e: Exception + TooGenericExceptionCaught:DownloadCache.kt$DownloadCache$e: Throwable + TooGenericExceptionCaught:DownloadPendingDeleter.kt$DownloadPendingDeleter$e: Exception + TooGenericExceptionCaught:DownloadProvider.kt$DownloadProvider$e: Throwable + TooGenericExceptionCaught:DownloadStore.kt$DownloadStore$e: Exception + TooGenericExceptionCaught:Downloader.kt$Downloader$e: Exception + TooGenericExceptionCaught:Downloader.kt$Downloader$e: Throwable + TooGenericExceptionCaught:Downloader.kt$Downloader$error: Throwable + TooGenericExceptionCaught:ExtensionApi.kt$ExtensionApi$e: Throwable + TooGenericExceptionCaught:ExtensionDetailsScreenModel.kt$ExtensionDetailsScreenModel$e: Exception + TooGenericExceptionCaught:ExtensionInstallActivity.kt$ExtensionInstallActivity$error: Exception + TooGenericExceptionCaught:ExtensionInstaller.kt$ExtensionInstaller$e: Exception + TooGenericExceptionCaught:ExtensionLoader.kt$ExtensionLoader$e: Exception + TooGenericExceptionCaught:ExtensionLoader.kt$ExtensionLoader$e: Throwable + TooGenericExceptionCaught:ExtensionManager.kt$ExtensionManager$e: Exception + TooGenericExceptionCaught:GetChapter.kt$GetChapter$e: Exception + TooGenericExceptionCaught:GetChapterByUrlAndMangaId.kt$GetChapterByUrlAndMangaId$e: Exception + TooGenericExceptionCaught:GetChaptersByMangaId.kt$GetChaptersByMangaId$e: Exception + TooGenericExceptionCaught:GetManga.kt$GetManga$e: Exception + TooGenericExceptionCaught:GetTracks.kt$GetTracks$e: Exception + TooGenericExceptionCaught:GlobalExceptionHandler.kt$GlobalExceptionHandler.Companion$e: Exception + TooGenericExceptionCaught:HistoryRepositoryImpl.kt$HistoryRepositoryImpl$e: Exception + TooGenericExceptionCaught:HttpPageLoader.kt$HttpPageLoader$e: Throwable + TooGenericExceptionCaught:ImageSaver.kt$ImageSaver$e: Exception + TooGenericExceptionCaught:ImageUtil.kt$ImageUtil$e: Exception + TooGenericExceptionCaught:InsertTrack.kt$InsertTrack$e: Exception + TooGenericExceptionCaught:Kavita.kt$Kavita$e: Exception + TooGenericExceptionCaught:KavitaApi.kt$KavitaApi$e: Exception + TooGenericExceptionCaught:Kitsu.kt$Kitsu$e: Exception + TooGenericExceptionCaught:Komga.kt$Komga$e: Exception + TooGenericExceptionCaught:KomgaApi.kt$KomgaApi$e: Exception + TooGenericExceptionCaught:LibrarySortMode.kt$LibrarySort.Companion$e: Exception + TooGenericExceptionCaught:LibraryUpdateJob.kt$LibraryUpdateJob$e: Exception + TooGenericExceptionCaught:LibraryUpdateJob.kt$LibraryUpdateJob$e: Throwable + TooGenericExceptionCaught:LocalSource.kt$LocalSource$e: Exception + TooGenericExceptionCaught:LocalSource.kt$LocalSource$e: Throwable + TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception + TooGenericExceptionCaught:MangaCoverFetcher.kt$MangaCoverFetcher$e: Exception + TooGenericExceptionCaught:MangaCoverScreenModel.kt$MangaCoverScreenModel$e: Exception + TooGenericExceptionCaught:MangaCoverScreenModel.kt$MangaCoverScreenModel$e: Throwable + TooGenericExceptionCaught:MangaRepositoryImpl.kt$MangaRepositoryImpl$e: Exception + TooGenericExceptionCaught:MangaScreen.kt$MangaScreen$e: Exception + TooGenericExceptionCaught:MangaScreenModel.kt$MangaScreenModel$e: Throwable + TooGenericExceptionCaught:MangaUpdates.kt$MangaUpdates$e: Exception + TooGenericExceptionCaught:MangaUpdatesApi.kt$MangaUpdatesApi$e: Exception + TooGenericExceptionCaught:MetadataUpdateJob.kt$MetadataUpdateJob$e: Exception + TooGenericExceptionCaught:MetadataUpdateJob.kt$MetadataUpdateJob$e: Throwable + TooGenericExceptionCaught:MyAnimeList.kt$MyAnimeList$e: Exception + TooGenericExceptionCaught:MyAnimeList.kt$MyAnimeList$e: Throwable + TooGenericExceptionCaught:MyAnimeListApi.kt$MyAnimeListApi$e: Exception + TooGenericExceptionCaught:OkHttpExtensions.kt$<no name provided>$e: Exception + TooGenericExceptionCaught:OkHttpExtensions.kt$ex: Throwable + TooGenericExceptionCaught:OkioExtensions.kt$e: Exception + TooGenericExceptionCaught:PackageInstallerInstaller.kt$PackageInstallerInstaller$e: Exception + TooGenericExceptionCaught:Pager.kt$Pager$e: IndexOutOfBoundsException + TooGenericExceptionCaught:Pager.kt$Pager$e: NullPointerException + TooGenericExceptionCaught:PagerPageHolder.kt$PagerPageHolder$e: Throwable + TooGenericExceptionCaught:QueryPagingSource.kt$QueryPagingSource$e: Exception + TooGenericExceptionCaught:RarPageLoader.kt$RarPageLoader$e: Exception + TooGenericExceptionCaught:ReaderActivity.kt$ReaderActivity$e: ArrayIndexOutOfBoundsException + TooGenericExceptionCaught:ReaderViewModel.kt$ReaderViewModel$e: Exception + TooGenericExceptionCaught:ReaderViewModel.kt$ReaderViewModel$e: Throwable + TooGenericExceptionCaught:RefreshTracks.kt$RefreshTracks$e: Throwable + TooGenericExceptionCaught:RenameCategory.kt$RenameCategory$e: Exception + TooGenericExceptionCaught:ReorderCategory.kt$ReorderCategory$e: Exception + TooGenericExceptionCaught:RestoreBackupScreen.kt$RestoreBackupScreenModel$e: Exception + TooGenericExceptionCaught:SearchScreenModel.kt$SearchScreenModel$e: Exception + TooGenericExceptionCaught:SetMangaCategories.kt$SetMangaCategories$e: Exception + TooGenericExceptionCaught:SetReadStatus.kt$SetReadStatus$e: Exception + TooGenericExceptionCaught:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$e: Throwable + TooGenericExceptionCaught:SettingsDataScreen.kt$SettingsDataScreen$e: Throwable + TooGenericExceptionCaught:SettingsTrackingScreen.kt$SettingsTrackingScreen$e: Throwable + TooGenericExceptionCaught:Shikimori.kt$Shikimori$e: Exception + TooGenericExceptionCaught:Shikimori.kt$Shikimori$e: Throwable + TooGenericExceptionCaught:ShizukuInstaller.kt$ShizukuInstaller$e: Exception + TooGenericExceptionCaught:SourcePagingSource.kt$SourcePagingSource$e: Exception + TooGenericExceptionCaught:Suwayomi.kt$Suwayomi$e: Exception + TooGenericExceptionCaught:SyncChapterProgressWithTrack.kt$SyncChapterProgressWithTrack$e: Throwable + TooGenericExceptionCaught:TrackChapter.kt$TrackChapter$e: Exception + TooGenericExceptionCaught:TrackInfoDialog.kt$TrackInfoDialogHomeScreen.Model$e: Exception + TooGenericExceptionCaught:TrackInfoDialog.kt$TrackerSearchScreen.Model$e: Throwable + TooGenericExceptionCaught:UncaughtExceptionInterceptor.kt$UncaughtExceptionInterceptor$e: Exception + TooGenericExceptionCaught:UpdateCategory.kt$UpdateCategory$e: Exception + TooGenericExceptionCaught:UpdateChapter.kt$UpdateChapter$e: Exception + TooGenericExceptionCaught:WebViewActivity.kt$WebViewActivity$e: Exception + TooGenericExceptionCaught:WebViewScreenModel.kt$WebViewScreenModel$e: Exception + TooGenericExceptionCaught:WebViewUtil.kt$WebViewUtil$e: Throwable + TooGenericExceptionCaught:WebtoonPageHolder.kt$WebtoonPageHolder$e: Throwable + TooGenericExceptionCaught:WidgetManager.kt$WidgetManager$e: Exception + TooGenericExceptionThrown:Anilist.kt$Anilist$throw Exception("$track not found on user library") + TooGenericExceptionThrown:Anilist.kt$Anilist$throw Exception("Unknown score type") + TooGenericExceptionThrown:AnilistApi.kt$AnilistApi$throw Exception("Could not find manga") + TooGenericExceptionThrown:AnilistInterceptor.kt$AnilistInterceptor$throw Exception("Not authenticated with Anilist") + TooGenericExceptionThrown:AppUpdateDownloadJob.kt$AppUpdateDownloadJob$throw Exception("Unsuccessful response") + TooGenericExceptionThrown:BangumiApi.kt$BangumiApi$throw Exception("Null Response") + TooGenericExceptionThrown:BangumiInterceptor.kt$BangumiInterceptor$throw Exception("Not authenticated with Bangumi") + TooGenericExceptionThrown:ChapterLoader.kt$ChapterLoader$throw Exception(context.stringResource(MR.strings.page_list_empty_error)) + TooGenericExceptionThrown:DownloadManager.kt$DownloadManager$throw Exception(context.stringResource(MR.strings.page_list_empty_error)) + TooGenericExceptionThrown:DownloadProvider.kt$DownloadProvider$throw Exception( context.stringResource( MR.strings.invalid_location, downloadsDir?.displayablePath ?: "", ), ) + TooGenericExceptionThrown:Downloader.kt$Downloader$throw Exception(context.stringResource(MR.strings.page_list_empty_error)) + TooGenericExceptionThrown:ExtensionLoader.kt$ExtensionLoader$throw Exception("Unknown source class type: ${obj.javaClass}") + TooGenericExceptionThrown:HttpSource.kt$HttpSource$throw RuntimeException(e) + TooGenericExceptionThrown:KitsuApi.kt$KitsuApi$throw Exception("Could not find manga") + TooGenericExceptionThrown:KitsuInterceptor.kt$KitsuInterceptor$throw Exception("Not authenticated with Kitsu") + TooGenericExceptionThrown:KitsuModels.kt$KitsuLibManga$throw Exception("Unknown status") + TooGenericExceptionThrown:KitsuModels.kt$throw Exception("Unknown status") + TooGenericExceptionThrown:LocalSource.kt$LocalSource$throw Exception(context.stringResource(MR.strings.chapter_not_found)) + TooGenericExceptionThrown:LocalSource.kt$LocalSource$throw Exception(context.stringResource(MR.strings.local_invalid_format)) + TooGenericExceptionThrown:MangaUpdates.kt$MangaUpdates$throw Throwable("Unable to login") + TooGenericExceptionThrown:ShikimoriApi.kt$ShikimoriApi$throw Exception("Too much mangas in response") + TooGenericExceptionThrown:ShikimoriInterceptor.kt$ShikimoriInterceptor$throw Exception("Not authenticated with Shikimori") + TooGenericExceptionThrown:ShizukuInstaller.kt$ShizukuInstaller$throw RuntimeException("Failed to commit install session $sessionId") + TooGenericExceptionThrown:ShizukuInstaller.kt$ShizukuInstaller$throw RuntimeException("Failed to create install session") + TooGenericExceptionThrown:ShizukuInstaller.kt$ShizukuInstaller$throw RuntimeException("Failed to write APK to session $sessionId") + TooGenericExceptionThrown:TrackInfoDialog.kt$TrackInfoDialogHomeScreen.Model$throw Exception() + TooManyFunctions:AndroidDatabaseHandler.kt$AndroidDatabaseHandler : DatabaseHandler + TooManyFunctions:Anilist.kt$Anilist : BaseTrackerDeletableTracker + TooManyFunctions:AnilistApi.kt$AnilistApi + TooManyFunctions:Bangumi.kt$Bangumi : BaseTracker + TooManyFunctions:BaseTracker.kt$BaseTracker : Tracker + TooManyFunctions:BrowseSourceScreenModel.kt$BrowseSourceScreenModel : StateScreenModel + TooManyFunctions:CategoryRepositoryImpl.kt$CategoryRepositoryImpl : CategoryRepository + TooManyFunctions:ChapterRepository.kt$ChapterRepository + TooManyFunctions:ChapterRepositoryImpl.kt$ChapterRepositoryImpl : ChapterRepository + TooManyFunctions:ChapterTransition.kt$eu.kanade.presentation.reader.ChapterTransition.kt + TooManyFunctions:DohProviders.kt$eu.kanade.tachiyomi.network.DohProviders.kt + TooManyFunctions:DownloadCache.kt$DownloadCache + TooManyFunctions:DownloadManager.kt$DownloadManager + TooManyFunctions:DownloadPreferences.kt$DownloadPreferences + TooManyFunctions:DownloadProvider.kt$DownloadProvider + TooManyFunctions:DownloadQueueScreenModel.kt$DownloadQueueScreenModel : ScreenModel + TooManyFunctions:Downloader.kt$Downloader + TooManyFunctions:EpubFile.kt$EpubFile : Closeable + TooManyFunctions:ExtensionLoader.kt$ExtensionLoader + TooManyFunctions:ExtensionManager.kt$ExtensionManager + TooManyFunctions:ExtensionsScreenModel.kt$ExtensionsScreenModel : StateScreenModel + TooManyFunctions:HttpSource.kt$HttpSource : CatalogueSource + TooManyFunctions:ImageUtil.kt$ImageUtil + TooManyFunctions:Kavita.kt$Kavita : BaseTrackerEnhancedTracker + TooManyFunctions:Kitsu.kt$Kitsu : BaseTrackerDeletableTracker + TooManyFunctions:Komga.kt$Komga : BaseTrackerEnhancedTracker + TooManyFunctions:LibraryPreferences.kt$LibraryPreferences + TooManyFunctions:LibraryScreenModel.kt$LibraryScreenModel : StateScreenModel + TooManyFunctions:LocalSource.kt$LocalSource : CatalogueSourceUnmeteredSource + TooManyFunctions:MangaCoverFetcher.kt$MangaCoverFetcher : Fetcher + TooManyFunctions:MangaRepository.kt$MangaRepository + TooManyFunctions:MangaRepositoryImpl.kt$MangaRepositoryImpl : MangaRepository + TooManyFunctions:MangaRestorer.kt$MangaRestorer + TooManyFunctions:MangaScreenModel.kt$MangaScreenModel : StateScreenModel + TooManyFunctions:MangaUpdates.kt$MangaUpdates : BaseTrackerDeletableTracker + TooManyFunctions:MyAnimeList.kt$MyAnimeList : BaseTrackerDeletableTracker + TooManyFunctions:MyAnimeListApi.kt$MyAnimeListApi + TooManyFunctions:NotificationReceiver.kt$NotificationReceiver : BroadcastReceiver + TooManyFunctions:NotificationReceiver.kt$NotificationReceiver$Companion + TooManyFunctions:PagerPageHolder.kt$PagerPageHolder : ReaderPageImageViewPositionableView + TooManyFunctions:PagerViewer.kt$PagerViewer : Viewer + TooManyFunctions:ParsedHttpSource.kt$ParsedHttpSource : HttpSource + TooManyFunctions:ReaderActivity.kt$ReaderActivity : BaseActivity + TooManyFunctions:ReaderPageImageView.kt$ReaderPageImageView : FrameLayout + TooManyFunctions:ReaderPreferences.kt$ReaderPreferences + TooManyFunctions:ReaderViewModel.kt$ReaderViewModel : ViewModel + TooManyFunctions:SettingsItems.kt$tachiyomi.presentation.core.components.SettingsItems.kt + TooManyFunctions:SharedPreferencesDataStore.kt$SharedPreferencesDataStore : PreferenceDataStore + TooManyFunctions:Shikimori.kt$Shikimori : BaseTrackerDeletableTracker + TooManyFunctions:SourcePreferences.kt$SourcePreferences + TooManyFunctions:Suwayomi.kt$Suwayomi : BaseTrackerEnhancedTracker + TooManyFunctions:Tracker.kt$Tracker + TooManyFunctions:UpdatesScreenModel.kt$UpdatesScreenModel : StateScreenModel + TooManyFunctions:WebtoonPageHolder.kt$WebtoonPageHolder : WebtoonBaseHolder + TooManyFunctions:WebtoonRecyclerView.kt$WebtoonRecyclerView : RecyclerView + TooManyFunctions:WebtoonViewer.kt$WebtoonViewer : Viewer + TopLevelPropertyNaming:App.kt$private const val ACTION_DISABLE_INCOGNITO_MODE = "tachi.action.DISABLE_INCOGNITO_MODE" + TopLevelPropertyNaming:AppBar.kt$const val SEARCH_DEBOUNCE_MILLIS = 250L + TopLevelPropertyNaming:BackupCreateJob.kt$private const val IS_AUTO_BACKUP_KEY = "is_auto_backup" // Boolean + TopLevelPropertyNaming:BackupCreateJob.kt$private const val LOCATION_URI_KEY = "location_uri" // String + TopLevelPropertyNaming:BackupCreateJob.kt$private const val OPTIONS_KEY = "options" // BooleanArray + TopLevelPropertyNaming:BackupCreateJob.kt$private const val TAG_AUTO = "BackupCreator" + TopLevelPropertyNaming:BackupCreateJob.kt$private const val TAG_MANUAL = "$TAG_AUTO:manual" + TopLevelPropertyNaming:BackupRestoreJob.kt$private const val LOCATION_URI_KEY = "location_uri" // String + TopLevelPropertyNaming:BackupRestoreJob.kt$private const val OPTIONS_KEY = "options" // BooleanArray + TopLevelPropertyNaming:BackupRestoreJob.kt$private const val SYNC_KEY = "sync" // Boolean + TopLevelPropertyNaming:ChapterCache.kt$/** Application cache version. */ private const val PARAMETER_APP_VERSION = 1 + TopLevelPropertyNaming:ChapterCache.kt$/** The maximum number of bytes this cache should use to store. */ private const val PARAMETER_CACHE_SIZE = 100L * 1024 * 1024 + TopLevelPropertyNaming:ChapterCache.kt$/** The number of values per cache entry. Must be positive. */ private const val PARAMETER_VALUE_COUNT = 1 + TopLevelPropertyNaming:ColorFilterPage.kt$private const val ALPHA_MASK: Long = 0xFF000000 + TopLevelPropertyNaming:ColorFilterPage.kt$private const val BLUE_MASK: Long = 0x000000FF + TopLevelPropertyNaming:ColorFilterPage.kt$private const val GREEN_MASK: Long = 0x0000FF00 + TopLevelPropertyNaming:ColorFilterPage.kt$private const val RED_MASK: Long = 0x00FF0000 + TopLevelPropertyNaming:ComicInfo.kt$const val COMIC_INFO_FILE = "ComicInfo.xml" + TopLevelPropertyNaming:DatabaseAdapter.kt$private const val LIST_OF_STRINGS_SEPARATOR = ", " + TopLevelPropertyNaming:DateExtensions.kt$private const val MILLISECONDS_IN_DAY = 86_400_000L + TopLevelPropertyNaming:DisplayExtensions.kt$// make sure icons on the nav rail fit private const val TABLET_UI_MIN_SCREEN_WIDTH_LANDSCAPE_DP = 600 + TopLevelPropertyNaming:DisplayExtensions.kt$// some tablets have screen width like 711dp = 1600px / 2.25 private const val TABLET_UI_MIN_SCREEN_WIDTH_PORTRAIT_DP = 700 + TopLevelPropertyNaming:DisplayExtensions.kt$private const val TABLET_UI_REQUIRED_SCREEN_WIDTH_DP = 720 + TopLevelPropertyNaming:DohProviders.kt$/** * Based on https://github.com/square/okhttp/blob/ef5d0c83f7bbd3a0c0534e7ca23cbc4ee7550f3b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DohProviders.java */ const val PREF_DOH_CLOUDFLARE = 1 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_360 = 7 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_ADGUARD = 3 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_ALIDNS = 5 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_CONTROLD = 10 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_DNSPOD = 6 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_GOOGLE = 2 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_MULLVAD = 9 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_NJALLA = 11 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_QUAD101 = 8 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_QUAD9 = 4 + TopLevelPropertyNaming:DohProviders.kt$const val PREF_DOH_SHECAN = 12 + TopLevelPropertyNaming:Downloader.kt$// Arbitrary minimum required space to start a download: 200 MB private const val MIN_DISK_SPACE = 200L * 1024 * 1024 + TopLevelPropertyNaming:ExtensionInstallActivity.kt$private const val INSTALL_REQUEST_CODE = 500 + TopLevelPropertyNaming:GLUtil.kt$// Safe minimum default size private const val IMAGE_MAX_BITMAP_DIMENSION = 2048 + TopLevelPropertyNaming:GuidesStep.kt$const val GETTING_STARTED_URL = "https://mihon.app/docs/guides/getting-started" + TopLevelPropertyNaming:KomgaApi.kt$private const val READLIST_API = "/api/v1/readlists" + TopLevelPropertyNaming:LibraryUpdateNotifier.kt$private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 + TopLevelPropertyNaming:LibraryUpdateNotifier.kt$private const val NOTIF_ICON_SIZE = 192 + TopLevelPropertyNaming:LibraryUpdateNotifier.kt$private const val NOTIF_MAX_CHAPTERS = 5 + TopLevelPropertyNaming:LibraryUpdateNotifier.kt$private const val NOTIF_TITLE_MAX_LEN = 45 + TopLevelPropertyNaming:LocalCoverManager.kt$private const val DEFAULT_COVER_NAME = "cover.jpg" + TopLevelPropertyNaming:MainActivity.kt$// Splash screen private const val SPLASH_MIN_DURATION = 500 // ms + TopLevelPropertyNaming:MainActivity.kt$private const val SPLASH_EXIT_ANIM_DURATION = 400L // ms + TopLevelPropertyNaming:MainActivity.kt$private const val SPLASH_MAX_DURATION = 5000 // ms + TopLevelPropertyNaming:PackageInstallerInstaller.kt$private const val INSTALL_ACTION = "PackageInstallerInstaller.INSTALL_ACTION" + TopLevelPropertyNaming:ReaderNavigationOverlayView.kt$private const val FADE_DURATION = 1000L + TopLevelPropertyNaming:ReaderPageImageView.kt$private const val MAX_ZOOM_SCALE = 5F + TopLevelPropertyNaming:ShizukuInstaller.kt$private const val SHIZUKU_PERMISSION_REQUEST_CODE = 14045 + TopLevelPropertyNaming:StorageManager.kt$private const val AUTOMATIC_BACKUPS_PATH = "autobackup" + TopLevelPropertyNaming:StorageManager.kt$private const val DOWNLOADS_PATH = "downloads" + TopLevelPropertyNaming:StorageManager.kt$private const val LOCAL_SOURCE_PATH = "local" + TopLevelPropertyNaming:SuwayomiApi.kt$private const val ADDRESS_DEFAULT = "" + TopLevelPropertyNaming:SuwayomiApi.kt$private const val ADDRESS_TITLE = "Server URL Address" + TopLevelPropertyNaming:SuwayomiApi.kt$private const val LOGIN_DEFAULT = "" + TopLevelPropertyNaming:SuwayomiApi.kt$private const val LOGIN_TITLE = "Login (Basic Auth)" + TopLevelPropertyNaming:SuwayomiApi.kt$private const val PASSWORD_DEFAULT = "" + TopLevelPropertyNaming:SuwayomiApi.kt$private const val PASSWORD_TITLE = "Password (Basic Auth)" + TopLevelPropertyNaming:WebtoonAdapter.kt$/** * View holder type of a chapter page view. */ private const val PAGE_VIEW = 0 + TopLevelPropertyNaming:WebtoonAdapter.kt$/** * View holder type of a chapter transition view. */ private const val TRANSITION_VIEW = 1 + TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val ANIMATOR_DURATION_TIME = 200 + TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val DEFAULT_RATE = 1f + TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val MAX_SCALE_RATE = 3f + TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val MIN_RATE = 0.5f + UnstableCollections:CategoryScreen.kt$List<Category> + UnstableCollections:Commons.kt$List<Category> + UnstableCollections:Commons.kt$Set<String> + UnstableCollections:GlobalSearchCardRow.kt$List<Manga> + UnstableCollections:GlobalSearchScreen.kt$Map<CatalogueSource, SearchItemResult> + UnstableCollections:HistoryScreen.kt$List<HistoryUiModel> + UnstableCollections:LibraryComfortableGrid.kt$List<LibraryItem> + UnstableCollections:LibraryComfortableGrid.kt$List<LibraryManga> + UnstableCollections:LibraryCompactGrid.kt$List<LibraryItem> + UnstableCollections:LibraryCompactGrid.kt$List<LibraryManga> + UnstableCollections:LibraryContent.kt$List<Category> + UnstableCollections:LibraryContent.kt$List<LibraryManga> + UnstableCollections:LibraryList.kt$List<LibraryItem> + UnstableCollections:LibraryList.kt$List<LibraryManga> + UnstableCollections:LibraryPager.kt$List<LibraryManga> + UnstableCollections:LibraryTabs.kt$List<Category> + UnstableCollections:ListPreferenceWidget.kt$Map<out T, String> + UnstableCollections:MangaScreen.kt$List<ChapterList.Item> + UnstableCollections:MultiSelectListPreferenceWidget.kt$Set<String> + UnstableCollections:PreferenceScreen.kt$List<Preference> + UnstableCollections:ScanlatorFilterDialog.kt$Set<String> + UnstableCollections:SettingsDownloadScreen.kt$SettingsDownloadScreen$List<Category> + UnstableCollections:SettingsLibraryScreen.kt$SettingsLibraryScreen$List<Category> + UnstableCollections:TrackInfoDialogHome.kt$List<TrackItem> + UnstableCollections:TrackInfoDialogSelector.kt$Map<Long, StringResource?> + UnstableCollections:TriStateListDialog.kt$List<T> + UnstableCollections:UpdatesScreen.kt$List<UpdatesItem> + UnstableCollections:WebViewScreenContent.kt$Map<String, String> + UnusedParameter:UpdatesRepositoryImpl.kt$UpdatesRepositoryImpl$dateUpload: Long + UnusedPrivateMember:AppThemePreferenceWidget.kt$@PreviewLightDark @Composable private fun AppThemesListPreview() + UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextLongTitlePreview() + UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextNoNextPreview() + UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextNoPreviousPreview() + UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextPreview() + UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextWithGapPreview() + UnusedPrivateMember:CrashScreen.kt$@PreviewLightDark @Composable private fun CrashScreenPreview() + UnusedPrivateMember:EmptyScreen.kt$@PreviewLightDark @Composable private fun NoActionPreview() + UnusedPrivateMember:EmptyScreen.kt$@PreviewLightDark @Composable private fun WithActionPreview() + UnusedPrivateMember:GuidesStep.kt$@PreviewLightDark @Composable private fun GuidesStepPreview() + UnusedPrivateMember:HistoryDialogs.kt$@PreviewLightDark @Composable private fun HistoryDeleteDialogPreview() + UnusedPrivateMember:HistoryItem.kt$@PreviewLightDark @Composable private fun HistoryItemPreviews( @PreviewParameter(HistoryWithRelationsProvider::class) historyWithRelations: HistoryWithRelations, ) + UnusedPrivateMember:InfoScreen.kt$@PreviewLightDark @Composable private fun InfoScaffoldPreview() + UnusedPrivateMember:InfoWidget.kt$@PreviewLightDark @Composable private fun InfoWidgetPreview() + UnusedPrivateMember:LibraryBadges.kt$@PreviewLightDark @Composable private fun BadgePreview() + UnusedPrivateMember:MissingChapterCountListItem.kt$@PreviewLightDark @Composable private fun Preview() + UnusedPrivateMember:ModeSelectionDialog.kt$@PreviewLightDark @Composable private fun Preview() + UnusedPrivateMember:NewUpdateScreen.kt$@PreviewLightDark @Composable private fun NewUpdateScreenPreview() + UnusedPrivateMember:OrientationSelectDialog.kt$@PreviewLightDark @Composable private fun DialogContentPreview() + UnusedPrivateMember:PageIndicatorText.kt$@PreviewLightDark @Composable private fun PageIndicatorTextPreview() + UnusedPrivateMember:PermissionStep.kt$PermissionStep$@Composable private fun SectionHeader( text: String, modifier: Modifier = Modifier, ) + UnusedPrivateMember:ReadingModeSelectDialog.kt$@PreviewLightDark @Composable private fun DialogContentPreview() + UnusedPrivateMember:SwitchPreferenceWidget.kt$@PreviewLightDark @Composable private fun SwitchPreferenceWidgetPreview() + UnusedPrivateMember:TextPreferenceWidget.kt$@PreviewLightDark @Composable private fun TextPreferenceWidgetPreview() + UnusedPrivateMember:TrackInfoDialogHome.kt$@PreviewLightDark @Composable private fun TrackInfoDialogHomePreviews( @PreviewParameter(TrackInfoDialogHomePreviewProvider::class) content: @Composable () -> Unit, ) + UnusedPrivateMember:TrackInfoDialogSelector.kt$@PreviewLightDark @Composable private fun TrackStatusSelectorPreviews() + UnusedPrivateMember:TrackLogoIcon.kt$@PreviewLightDark @Composable private fun TrackLogoIconPreviews( @PreviewParameter(TrackLogoIconPreviewProvider::class) tracker: Tracker, ) + UnusedPrivateMember:TrackerSearch.kt$@PreviewLightDark @Composable private fun TrackerSearchPreviews( @PreviewParameter(TrackerSearchPreviewProvider::class) content: @Composable () -> Unit, ) + UnusedPrivateProperty:JavaScriptEngine.kt$JavaScriptEngine$context: Context + UnusedPrivateProperty:LibraryUpdateJob.kt$LibraryUpdateJob.Companion$private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 + UnusedPrivateProperty:MainActivity.kt$MainActivity$private val sourcePreferences: SourcePreferences by injectLazy() + UnusedPrivateProperty:MainActivity.kt$MainActivity$private val uiPreferences: UiPreferences by injectLazy() + UnusedPrivateProperty:MetadataUpdateJob.kt$MetadataUpdateJob.Companion$private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 + UseCheckOrError:CatalogueSource.kt$CatalogueSource$throw IllegalStateException("Not used") + UseCheckOrError:MangaScreenModel.kt$MangaScreenModel$throw IllegalStateException() + UseCheckOrError:PackageInstallerInstaller.kt$PackageInstallerInstaller$throw IllegalStateException() + UseCheckOrError:ReadingMode.kt$ReadingMode.Companion$throw IllegalStateException("Preference value must be resolved: $preference") + UseCheckOrError:ShizukuInstaller.kt$ShizukuInstaller$throw IllegalStateException() + UseCheckOrError:Source.kt$Source$throw IllegalStateException("Not used") + UseCheckOrError:SourceFilterDialog.kt$throw IllegalStateException("Unknown TriState state: $this") + UseCheckOrError:TransactionContext.kt$TransactionElement$throw IllegalStateException("Transaction was never started or was already released") + VariableNaming:Chapter.kt$Chapter$var date_fetch: Long + VariableNaming:Chapter.kt$Chapter$var last_modified: Long + VariableNaming:Chapter.kt$Chapter$var last_page_read: Int + VariableNaming:Chapter.kt$Chapter$var manga_id: Long? + VariableNaming:Chapter.kt$Chapter$var source_order: Int + VariableNaming:LocalSource.kt$LocalSource$private val LATEST_FILTERS = FilterList(OrderBy.Latest(context)) + VariableNaming:LocalSource.kt$LocalSource$private val POPULAR_FILTERS = FilterList(OrderBy.Popular(context)) + VariableNaming:SChapter.kt$SChapter$var chapter_number: Float + VariableNaming:SChapter.kt$SChapter$var date_upload: Long + VariableNaming:SManga.kt$SManga$var thumbnail_url: String? + VariableNaming:SManga.kt$SManga$var update_strategy: UpdateStrategy + VariableNaming:Track.kt$Track$var finished_reading_date: Long + VariableNaming:Track.kt$Track$var last_chapter_read: Double + VariableNaming:Track.kt$Track$var library_id: Long? + VariableNaming:Track.kt$Track$var manga_id: Long + VariableNaming:Track.kt$Track$var remote_id: Long + VariableNaming:Track.kt$Track$var started_reading_date: Long + VariableNaming:Track.kt$Track$var total_chapters: Long + VariableNaming:Track.kt$Track$var tracker_id: Long + VariableNaming:Track.kt$Track$var tracking_url: String + VariableNaming:TrackSearch.kt$TrackSearch$var cover_url: String = "" + VariableNaming:TrackSearch.kt$TrackSearch$var publishing_status: String = "" + VariableNaming:TrackSearch.kt$TrackSearch$var publishing_type: String = "" + VariableNaming:TrackSearch.kt$TrackSearch$var start_date: String = "" + + diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml new file mode 100644 index 000000000..112fcf3f0 --- /dev/null +++ b/config/detekt/detekt.yml @@ -0,0 +1,19 @@ +naming: + FunctionNaming: + functionPattern: '[a-z][a-zA-Z0-9]*' + ignoreAnnotated: [ 'Composable' ] + TopLevelPropertyNaming: + constantPattern: '[A-Z][A-Za-z0-9]*' + +complexity: + LongParameterList: + functionThreshold: 6 + constructorThreshold: 7 + ignoreDefaultParameters: true + +style: + MagicNumber: + ignorePropertyDeclaration: true + ignoreCompanionObjectPropertyDeclaration: true + UnusedPrivateMember: + ignoreAnnotated: [ 'Preview' ] diff --git a/core-metadata/build.gradle.kts b/core-metadata/build.gradle.kts index 43b8846ab..5c8605879 100644 --- a/core-metadata/build.gradle.kts +++ b/core-metadata/build.gradle.kts @@ -14,7 +14,7 @@ android { } dependencies { - implementation(project(":source-api")) + implementation(projects.sourceApi) implementation(kotlinx.bundles.serialization) } diff --git a/core/.gitignore b/core/common/.gitignore similarity index 100% rename from core/.gitignore rename to core/common/.gitignore diff --git a/core/build.gradle.kts b/core/common/build.gradle.kts similarity index 92% rename from core/build.gradle.kts rename to core/common/build.gradle.kts index 6267cae2b..27ff44d16 100644 --- a/core/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } android { - namespace = "eu.kanade.tachiyomi.core" + namespace = "eu.kanade.tachiyomi.core.common" kotlinOptions { freeCompilerArgs += listOf( @@ -17,7 +17,7 @@ android { } dependencies { - implementation(project(":i18n")) + implementation(projects.i18n) api(libs.logcat) diff --git a/core/src/main/AndroidManifest.xml b/core/common/src/main/AndroidManifest.xml similarity index 100% rename from core/src/main/AndroidManifest.xml rename to core/common/src/main/AndroidManifest.xml diff --git a/core/src/main/java/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt similarity index 86% rename from core/src/main/java/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt index faf268314..274f0c592 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/core/security/SecurityPreferences.kt @@ -1,9 +1,9 @@ package eu.kanade.tachiyomi.core.security import dev.icerock.moko.resources.StringResource -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.preference.getEnum +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.preference.getEnum import tachiyomi.i18n.MR class SecurityPreferences( diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/AndroidCookieJar.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/AndroidCookieJar.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/DohProviders.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/DohProviders.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/DohProviders.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/DohProviders.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/JavaScriptEngine.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/JavaScriptEngine.kt similarity index 92% rename from core/src/main/java/eu/kanade/tachiyomi/network/JavaScriptEngine.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/JavaScriptEngine.kt index 4ecf3e09d..5c7894606 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/network/JavaScriptEngine.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/JavaScriptEngine.kt @@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.network import android.content.Context import app.cash.quickjs.QuickJs -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext /** * Util for evaluating JavaScript in sources. diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkHelper.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkHelper.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt similarity index 85% rename from core/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt index 7a334d00f..4c839b90d 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/NetworkPreferences.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.network -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore class NetworkPreferences( private val preferenceStore: PreferenceStore, diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/OkHttpExtensions.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/OkHttpExtensions.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/ProgressListener.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/ProgressListener.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/ProgressListener.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/ProgressListener.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/ProgressResponseBody.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/ProgressResponseBody.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/Requests.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/Requests.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/Requests.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/Requests.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt similarity index 99% rename from core/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt index 12a8f0ce0..6a765c680 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt @@ -14,7 +14,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Interceptor import okhttp3.Request import okhttp3.Response -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import java.io.IOException import java.util.concurrent.CountDownLatch diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt similarity index 97% rename from core/src/main/java/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt index c4727f8a9..eab5ec302 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/RateLimitInterceptor.kt @@ -89,7 +89,7 @@ internal class RateLimitInterceptor( while (requestQueue.size >= permits) { // queue is full, remove expired entries val periodStart = SystemClock.elapsedRealtime() - rateLimitMillis var hasRemovedExpired = false - while (requestQueue.isEmpty().not() && requestQueue.first <= periodStart) { + while (!requestQueue.isEmpty() && requestQueue.first <= periodStart) { requestQueue.removeFirst() hasRemovedExpired = true } diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/SpecificHostRateLimitInterceptor.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt similarity index 98% rename from core/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt index cd1ffb14c..e18fa4299 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt @@ -13,7 +13,7 @@ import okhttp3.Headers import okhttp3.Interceptor import okhttp3.Request import okhttp3.Response -import tachiyomi.core.util.lang.launchUI +import tachiyomi.core.common.util.lang.launchUI import tachiyomi.i18n.MR import java.util.Locale import java.util.concurrent.CountDownLatch diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/lang/Hash.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/lang/Hash.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/util/lang/Hash.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/lang/Hash.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/lang/StringExtensions.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/lang/StringExtensions.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/util/lang/StringExtensions.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/lang/StringExtensions.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/storage/DiskUtil.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/DiskUtil.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/util/storage/DiskUtil.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/DiskUtil.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/storage/EpubFile.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/EpubFile.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/util/storage/EpubFile.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/EpubFile.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/system/DensityExtensions.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/DensityExtensions.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/util/system/DensityExtensions.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/DensityExtensions.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/system/DeviceUtil.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/DeviceUtil.kt similarity index 98% rename from core/src/main/java/eu/kanade/tachiyomi/util/system/DeviceUtil.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/DeviceUtil.kt index e2011f0c5..c9f20326d 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/util/system/DeviceUtil.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/DeviceUtil.kt @@ -6,7 +6,7 @@ import android.content.Context import android.os.Build import androidx.core.content.getSystemService import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat object DeviceUtil { diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/system/ToastExtensions.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/ToastExtensions.kt similarity index 94% rename from core/src/main/java/eu/kanade/tachiyomi/util/system/ToastExtensions.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/ToastExtensions.kt index 0f4aba9bf..453f9289e 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/util/system/ToastExtensions.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/ToastExtensions.kt @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.util.system import android.content.Context import android.widget.Toast import dev.icerock.moko.resources.StringResource -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource /** * Display a toast in this context. diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt similarity index 100% rename from core/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewUtil.kt similarity index 98% rename from core/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt rename to core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewUtil.kt index 42b756f74..b059e15d4 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/util/system/WebViewUtil.kt @@ -8,7 +8,7 @@ import android.webkit.WebSettings import android.webkit.WebView import kotlinx.coroutines.suspendCancellableCoroutine import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import kotlin.coroutines.resume object WebViewUtil { diff --git a/core/src/main/java/tachiyomi/core/Constants.kt b/core/common/src/main/kotlin/tachiyomi/core/common/Constants.kt similarity index 96% rename from core/src/main/java/tachiyomi/core/Constants.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/Constants.kt index 46c619b86..649418997 100644 --- a/core/src/main/java/tachiyomi/core/Constants.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/Constants.kt @@ -1,4 +1,4 @@ -package tachiyomi.core +package tachiyomi.core.common object Constants { const val URL_HELP = "https://mihon.app/docs/guides/troubleshooting/" diff --git a/core/src/main/java/tachiyomi/core/i18n/Localize.kt b/core/common/src/main/kotlin/tachiyomi/core/common/i18n/Localize.kt similarity index 97% rename from core/src/main/java/tachiyomi/core/i18n/Localize.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/i18n/Localize.kt index d6f8f3c16..c698e856e 100644 --- a/core/src/main/java/tachiyomi/core/i18n/Localize.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/i18n/Localize.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.i18n +package tachiyomi.core.common.i18n import android.content.Context import dev.icerock.moko.resources.PluralsResource diff --git a/core/src/main/java/tachiyomi/core/preference/AndroidPreference.kt b/core/common/src/main/kotlin/tachiyomi/core/common/preference/AndroidPreference.kt similarity index 98% rename from core/src/main/java/tachiyomi/core/preference/AndroidPreference.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/preference/AndroidPreference.kt index 21f5b1d30..577d83687 100644 --- a/core/src/main/java/tachiyomi/core/preference/AndroidPreference.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/preference/AndroidPreference.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.preference +package tachiyomi.core.common.preference import android.content.SharedPreferences import android.content.SharedPreferences.Editor @@ -12,7 +12,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat sealed class AndroidPreference( private val preferences: SharedPreferences, diff --git a/core/src/main/java/tachiyomi/core/preference/AndroidPreferenceStore.kt b/core/common/src/main/kotlin/tachiyomi/core/common/preference/AndroidPreferenceStore.kt similarity index 81% rename from core/src/main/java/tachiyomi/core/preference/AndroidPreferenceStore.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/preference/AndroidPreferenceStore.kt index b24fa5dcc..6bdb120cd 100644 --- a/core/src/main/java/tachiyomi/core/preference/AndroidPreferenceStore.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/preference/AndroidPreferenceStore.kt @@ -1,17 +1,17 @@ -package tachiyomi.core.preference +package tachiyomi.core.common.preference import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.callbackFlow -import tachiyomi.core.preference.AndroidPreference.BooleanPrimitive -import tachiyomi.core.preference.AndroidPreference.FloatPrimitive -import tachiyomi.core.preference.AndroidPreference.IntPrimitive -import tachiyomi.core.preference.AndroidPreference.LongPrimitive -import tachiyomi.core.preference.AndroidPreference.Object -import tachiyomi.core.preference.AndroidPreference.StringPrimitive -import tachiyomi.core.preference.AndroidPreference.StringSetPrimitive +import tachiyomi.core.common.preference.AndroidPreference.BooleanPrimitive +import tachiyomi.core.common.preference.AndroidPreference.FloatPrimitive +import tachiyomi.core.common.preference.AndroidPreference.IntPrimitive +import tachiyomi.core.common.preference.AndroidPreference.LongPrimitive +import tachiyomi.core.common.preference.AndroidPreference.Object +import tachiyomi.core.common.preference.AndroidPreference.StringPrimitive +import tachiyomi.core.common.preference.AndroidPreference.StringSetPrimitive class AndroidPreferenceStore( context: Context, diff --git a/core/src/main/java/tachiyomi/core/preference/CheckboxState.kt b/core/common/src/main/kotlin/tachiyomi/core/common/preference/CheckboxState.kt similarity index 97% rename from core/src/main/java/tachiyomi/core/preference/CheckboxState.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/preference/CheckboxState.kt index da681e16d..cf7e471c0 100644 --- a/core/src/main/java/tachiyomi/core/preference/CheckboxState.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/preference/CheckboxState.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.preference +package tachiyomi.core.common.preference sealed class CheckboxState(open val value: T) { diff --git a/core/src/main/java/tachiyomi/core/preference/InMemoryPreferenceStore.kt b/core/common/src/main/kotlin/tachiyomi/core/common/preference/InMemoryPreferenceStore.kt similarity index 98% rename from core/src/main/java/tachiyomi/core/preference/InMemoryPreferenceStore.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/preference/InMemoryPreferenceStore.kt index 2fb3ee9ec..96e8644ad 100644 --- a/core/src/main/java/tachiyomi/core/preference/InMemoryPreferenceStore.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/preference/InMemoryPreferenceStore.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.preference +package tachiyomi.core.common.preference import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow diff --git a/core/src/main/java/tachiyomi/core/preference/Preference.kt b/core/common/src/main/kotlin/tachiyomi/core/common/preference/Preference.kt similarity index 92% rename from core/src/main/java/tachiyomi/core/preference/Preference.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/preference/Preference.kt index 1cc0d3d3c..f75384491 100644 --- a/core/src/main/java/tachiyomi/core/preference/Preference.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/preference/Preference.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.preference +package tachiyomi.core.common.preference import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -30,7 +30,7 @@ interface Preference { return key.startsWith(PRIVATE_PREFIX) } fun privateKey(key: String): String { - return "${PRIVATE_PREFIX}$key" + return "$PRIVATE_PREFIX$key" } /** @@ -41,7 +41,7 @@ interface Preference { return key.startsWith(APP_STATE_PREFIX) } fun appStateKey(key: String): String { - return "${APP_STATE_PREFIX}$key" + return "$APP_STATE_PREFIX$key" } private const val APP_STATE_PREFIX = "__APP_STATE_" diff --git a/core/src/main/java/tachiyomi/core/preference/PreferenceStore.kt b/core/common/src/main/kotlin/tachiyomi/core/common/preference/PreferenceStore.kt similarity index 96% rename from core/src/main/java/tachiyomi/core/preference/PreferenceStore.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/preference/PreferenceStore.kt index 5b0e9da9b..0cd3a21bf 100644 --- a/core/src/main/java/tachiyomi/core/preference/PreferenceStore.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/preference/PreferenceStore.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.preference +package tachiyomi.core.common.preference interface PreferenceStore { diff --git a/core/src/main/java/tachiyomi/core/preference/TriState.kt b/core/common/src/main/kotlin/tachiyomi/core/common/preference/TriState.kt similarity index 89% rename from core/src/main/java/tachiyomi/core/preference/TriState.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/preference/TriState.kt index 68b9173ce..703f069c3 100644 --- a/core/src/main/java/tachiyomi/core/preference/TriState.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/preference/TriState.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.preference +package tachiyomi.core.common.preference enum class TriState { DISABLED, // Disable filter diff --git a/core/src/main/java/tachiyomi/core/storage/AndroidStorageFolderProvider.kt b/core/common/src/main/kotlin/tachiyomi/core/common/storage/AndroidStorageFolderProvider.kt similarity index 86% rename from core/src/main/java/tachiyomi/core/storage/AndroidStorageFolderProvider.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/storage/AndroidStorageFolderProvider.kt index a5d48a49d..33335f345 100644 --- a/core/src/main/java/tachiyomi/core/storage/AndroidStorageFolderProvider.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/storage/AndroidStorageFolderProvider.kt @@ -1,9 +1,9 @@ -package tachiyomi.core.storage +package tachiyomi.core.common.storage import android.content.Context import android.os.Environment import androidx.core.net.toUri -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import java.io.File diff --git a/core/src/main/java/tachiyomi/core/storage/FolderProvider.kt b/core/common/src/main/kotlin/tachiyomi/core/common/storage/FolderProvider.kt similarity index 72% rename from core/src/main/java/tachiyomi/core/storage/FolderProvider.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/storage/FolderProvider.kt index decd1c378..06d3e364f 100644 --- a/core/src/main/java/tachiyomi/core/storage/FolderProvider.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/storage/FolderProvider.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.storage +package tachiyomi.core.common.storage import java.io.File diff --git a/core/src/main/java/tachiyomi/core/storage/UniFileExtensions.kt b/core/common/src/main/kotlin/tachiyomi/core/common/storage/UniFileExtensions.kt similarity index 87% rename from core/src/main/java/tachiyomi/core/storage/UniFileExtensions.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/storage/UniFileExtensions.kt index afe60ed35..8bbd9b3a7 100644 --- a/core/src/main/java/tachiyomi/core/storage/UniFileExtensions.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/storage/UniFileExtensions.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.storage +package tachiyomi.core.common.storage import com.hippo.unifile.UniFile diff --git a/core/src/main/java/tachiyomi/core/storage/UniFileTempFileManager.kt b/core/common/src/main/kotlin/tachiyomi/core/common/storage/UniFileTempFileManager.kt similarity index 97% rename from core/src/main/java/tachiyomi/core/storage/UniFileTempFileManager.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/storage/UniFileTempFileManager.kt index 0aa9f4b85..4ccc5bf43 100644 --- a/core/src/main/java/tachiyomi/core/storage/UniFileTempFileManager.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/storage/UniFileTempFileManager.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.storage +package tachiyomi.core.common.storage import android.content.Context import android.os.Build diff --git a/core/src/main/java/tachiyomi/core/util/lang/BooleanExtensions.kt b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/BooleanExtensions.kt similarity index 52% rename from core/src/main/java/tachiyomi/core/util/lang/BooleanExtensions.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/util/lang/BooleanExtensions.kt index 853499550..ca59ea7a7 100644 --- a/core/src/main/java/tachiyomi/core/util/lang/BooleanExtensions.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/BooleanExtensions.kt @@ -1,3 +1,3 @@ -package tachiyomi.core.util.lang +package tachiyomi.core.common.util.lang fun Boolean.toLong() = if (this) 1L else 0L diff --git a/core/src/main/java/tachiyomi/core/util/lang/CoroutinesExtensions.kt b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/CoroutinesExtensions.kt similarity index 98% rename from core/src/main/java/tachiyomi/core/util/lang/CoroutinesExtensions.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/util/lang/CoroutinesExtensions.kt index 829207a9b..a76bff2cc 100644 --- a/core/src/main/java/tachiyomi/core/util/lang/CoroutinesExtensions.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/CoroutinesExtensions.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.util.lang +package tachiyomi.core.common.util.lang import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart diff --git a/core/src/main/java/tachiyomi/core/util/lang/RxCoroutineBridge.kt b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/RxCoroutineBridge.kt similarity index 98% rename from core/src/main/java/tachiyomi/core/util/lang/RxCoroutineBridge.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/util/lang/RxCoroutineBridge.kt index 56f58e1d4..d6f521cc0 100644 --- a/core/src/main/java/tachiyomi/core/util/lang/RxCoroutineBridge.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/RxCoroutineBridge.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.util.lang +package tachiyomi.core.common.util.lang import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.InternalCoroutinesApi diff --git a/core/src/main/java/tachiyomi/core/util/lang/SortUtil.kt b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/SortUtil.kt similarity index 88% rename from core/src/main/java/tachiyomi/core/util/lang/SortUtil.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/util/lang/SortUtil.kt index 03c15d43b..9efe5f79f 100644 --- a/core/src/main/java/tachiyomi/core/util/lang/SortUtil.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/util/lang/SortUtil.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.util.lang +package tachiyomi.core.common.util.lang import java.text.Collator import java.util.Locale diff --git a/core/src/main/java/tachiyomi/core/util/system/ImageUtil.kt b/core/common/src/main/kotlin/tachiyomi/core/common/util/system/ImageUtil.kt similarity index 99% rename from core/src/main/java/tachiyomi/core/util/system/ImageUtil.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/util/system/ImageUtil.kt index 68da52505..1c13d2be7 100644 --- a/core/src/main/java/tachiyomi/core/util/system/ImageUtil.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/util/system/ImageUtil.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.util.system +package tachiyomi.core.common.util.system import android.content.Context import android.content.res.Configuration diff --git a/core/src/main/java/tachiyomi/core/util/system/LogcatExtensions.kt b/core/common/src/main/kotlin/tachiyomi/core/common/util/system/LogcatExtensions.kt similarity index 90% rename from core/src/main/java/tachiyomi/core/util/system/LogcatExtensions.kt rename to core/common/src/main/kotlin/tachiyomi/core/common/util/system/LogcatExtensions.kt index fb587b07d..115f647f5 100644 --- a/core/src/main/java/tachiyomi/core/util/system/LogcatExtensions.kt +++ b/core/common/src/main/kotlin/tachiyomi/core/common/util/system/LogcatExtensions.kt @@ -1,4 +1,4 @@ -package tachiyomi.core.util.system +package tachiyomi.core.common.util.system import logcat.LogPriority import logcat.asLog diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 4b2532e8c..f4ce0d039 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -24,9 +24,9 @@ android { } dependencies { - implementation(project(":source-api")) - implementation(project(":domain")) - implementation(project(":core")) + implementation(projects.sourceApi) + implementation(projects.domain) + implementation(projects.core.common) api(libs.bundles.sqldelight) } diff --git a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt index e156726fa..d2284b612 100644 --- a/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/chapter/ChapterRepositoryImpl.kt @@ -2,8 +2,8 @@ package tachiyomi.data.chapter import kotlinx.coroutines.flow.Flow import logcat.LogPriority -import tachiyomi.core.util.lang.toLong -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.toLong +import tachiyomi.core.common.util.system.logcat import tachiyomi.data.DatabaseHandler import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.model.ChapterUpdate diff --git a/data/src/main/java/tachiyomi/data/history/HistoryRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/history/HistoryRepositoryImpl.kt index 103a0995b..e9157025c 100644 --- a/data/src/main/java/tachiyomi/data/history/HistoryRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/history/HistoryRepositoryImpl.kt @@ -2,7 +2,7 @@ package tachiyomi.data.history import kotlinx.coroutines.flow.Flow import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.data.DatabaseHandler import tachiyomi.domain.history.model.History import tachiyomi.domain.history.model.HistoryUpdate diff --git a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt index 1e5a50273..88ef9b3b7 100644 --- a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt @@ -2,7 +2,7 @@ package tachiyomi.data.manga import kotlinx.coroutines.flow.Flow import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.data.DatabaseHandler import tachiyomi.data.StringListColumnAdapter import tachiyomi.data.UpdateStrategyColumnAdapter diff --git a/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt b/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt index adc1d26a0..fc091c491 100644 --- a/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt +++ b/data/src/main/java/tachiyomi/data/source/SourcePagingSource.kt @@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.SManga -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.source.repository.SourcePagingSourceType class SourceSearchPagingSource(source: CatalogueSource, val query: String, val filters: FilterList) : diff --git a/data/src/main/sqldelight/tachiyomi/data/chapters.sq b/data/src/main/sqldelight/tachiyomi/data/chapters.sq index f51856c54..4c341793f 100644 --- a/data/src/main/sqldelight/tachiyomi/data/chapters.sq +++ b/data/src/main/sqldelight/tachiyomi/data/chapters.sq @@ -75,7 +75,7 @@ WHERE _id IN :chapterIds; insert: INSERT INTO chapters(manga_id, url, name, scanlator, read, bookmark, last_page_read, chapter_number, source_order, date_fetch, date_upload, last_modified_at) -VALUES (:mangaId, :url, :name, :scanlator, :read, :bookmark, :lastPageRead, :chapterNumber, :sourceOrder, :dateFetch, :dateUpload, strftime('%s', 'now')); +VALUES (:mangaId, :url, :name, :scanlator, :read, :bookmark, :lastPageRead, :chapterNumber, :sourceOrder, :dateFetch, :dateUpload, 0); update: UPDATE chapters diff --git a/data/src/main/sqldelight/tachiyomi/data/mangas.sq b/data/src/main/sqldelight/tachiyomi/data/mangas.sq index d944ab0b1..07ef12eba 100644 --- a/data/src/main/sqldelight/tachiyomi/data/mangas.sq +++ b/data/src/main/sqldelight/tachiyomi/data/mangas.sq @@ -117,7 +117,7 @@ AND source IN :sourceIds; insert: INSERT INTO mangas(source, url, artist, author, description, genre, title, status, thumbnail_url, favorite, last_update, next_update, initialized, viewer, chapter_flags, cover_last_modified, date_added, update_strategy, calculate_interval, last_modified_at) -VALUES (:source, :url, :artist, :author, :description, :genre, :title, :status, :thumbnailUrl, :favorite, :lastUpdate, :nextUpdate, :initialized, :viewerFlags, :chapterFlags, :coverLastModified, :dateAdded, :updateStrategy, :calculateInterval, strftime('%s', 'now')); +VALUES (:source, :url, :artist, :author, :description, :genre, :title, :status, :thumbnailUrl, :favorite, :lastUpdate, :nextUpdate, :initialized, :viewerFlags, :chapterFlags, :coverLastModified, :dateAdded, :updateStrategy, :calculateInterval, 0); update: UPDATE mangas SET diff --git a/data/src/main/sqldelight/tachiyomi/data/mangas_categories.sq b/data/src/main/sqldelight/tachiyomi/data/mangas_categories.sq index 5c41843f0..b908e3f86 100644 --- a/data/src/main/sqldelight/tachiyomi/data/mangas_categories.sq +++ b/data/src/main/sqldelight/tachiyomi/data/mangas_categories.sq @@ -20,7 +20,7 @@ END; insert: INSERT INTO mangas_categories(manga_id, category_id, last_modified_at) -VALUES (:mangaId, :categoryId, strftime('%s', 'now')); +VALUES (:mangaId, :categoryId, 0); deleteMangaCategoryByMangaId: DELETE FROM mangas_categories diff --git a/data/src/main/sqldelight/tachiyomi/migrations/1.sqm b/data/src/main/sqldelight/tachiyomi/migrations/1.sqm new file mode 100644 index 000000000..1851b9254 --- /dev/null +++ b/data/src/main/sqldelight/tachiyomi/migrations/1.sqm @@ -0,0 +1,4 @@ +-- MangaUpdates score fixing -- +UPDATE manga_sync +SET score = max(score, 0) +WHERE sync_id = 7; diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 425551ca0..dc8c33315 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -14,8 +14,8 @@ android { } dependencies { - implementation(project(":source-api")) - implementation(project(":core")) + implementation(projects.sourceApi) + implementation(projects.core.common) implementation(platform(kotlinx.coroutines.bom)) implementation(kotlinx.bundles.coroutines) diff --git a/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt b/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt index ba00faa18..41f29392d 100644 --- a/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/backup/service/BackupPreferences.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.backup.service -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore class BackupPreferences( private val preferenceStore: PreferenceStore, diff --git a/domain/src/main/java/tachiyomi/domain/category/interactor/CreateCategoryWithName.kt b/domain/src/main/java/tachiyomi/domain/category/interactor/CreateCategoryWithName.kt index b9528950d..b6b15b83e 100644 --- a/domain/src/main/java/tachiyomi/domain/category/interactor/CreateCategoryWithName.kt +++ b/domain/src/main/java/tachiyomi/domain/category/interactor/CreateCategoryWithName.kt @@ -1,8 +1,8 @@ package tachiyomi.domain.category.interactor import logcat.LogPriority -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.repository.CategoryRepository import tachiyomi.domain.library.service.LibraryPreferences diff --git a/domain/src/main/java/tachiyomi/domain/category/interactor/DeleteCategory.kt b/domain/src/main/java/tachiyomi/domain/category/interactor/DeleteCategory.kt index 8fee4d982..bf26d959f 100644 --- a/domain/src/main/java/tachiyomi/domain/category/interactor/DeleteCategory.kt +++ b/domain/src/main/java/tachiyomi/domain/category/interactor/DeleteCategory.kt @@ -1,8 +1,8 @@ package tachiyomi.domain.category.interactor import logcat.LogPriority -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.model.CategoryUpdate import tachiyomi.domain.category.repository.CategoryRepository diff --git a/domain/src/main/java/tachiyomi/domain/category/interactor/RenameCategory.kt b/domain/src/main/java/tachiyomi/domain/category/interactor/RenameCategory.kt index 1cbf5e276..59c4c193e 100644 --- a/domain/src/main/java/tachiyomi/domain/category/interactor/RenameCategory.kt +++ b/domain/src/main/java/tachiyomi/domain/category/interactor/RenameCategory.kt @@ -1,8 +1,8 @@ package tachiyomi.domain.category.interactor import logcat.LogPriority -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.CategoryUpdate import tachiyomi.domain.category.repository.CategoryRepository diff --git a/domain/src/main/java/tachiyomi/domain/category/interactor/ReorderCategory.kt b/domain/src/main/java/tachiyomi/domain/category/interactor/ReorderCategory.kt index 7561f52c8..a64824801 100644 --- a/domain/src/main/java/tachiyomi/domain/category/interactor/ReorderCategory.kt +++ b/domain/src/main/java/tachiyomi/domain/category/interactor/ReorderCategory.kt @@ -3,8 +3,8 @@ package tachiyomi.domain.category.interactor import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import logcat.LogPriority -import tachiyomi.core.util.lang.withNonCancellableContext -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.model.Category import tachiyomi.domain.category.model.CategoryUpdate import tachiyomi.domain.category.repository.CategoryRepository diff --git a/domain/src/main/java/tachiyomi/domain/category/interactor/SetMangaCategories.kt b/domain/src/main/java/tachiyomi/domain/category/interactor/SetMangaCategories.kt index 857ea272b..604e3f0d1 100644 --- a/domain/src/main/java/tachiyomi/domain/category/interactor/SetMangaCategories.kt +++ b/domain/src/main/java/tachiyomi/domain/category/interactor/SetMangaCategories.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.category.interactor import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.manga.repository.MangaRepository class SetMangaCategories( diff --git a/domain/src/main/java/tachiyomi/domain/category/interactor/UpdateCategory.kt b/domain/src/main/java/tachiyomi/domain/category/interactor/UpdateCategory.kt index 65d6d31ce..f3f601ceb 100644 --- a/domain/src/main/java/tachiyomi/domain/category/interactor/UpdateCategory.kt +++ b/domain/src/main/java/tachiyomi/domain/category/interactor/UpdateCategory.kt @@ -1,6 +1,6 @@ package tachiyomi.domain.category.interactor -import tachiyomi.core.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.domain.category.model.CategoryUpdate import tachiyomi.domain.category.repository.CategoryRepository diff --git a/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChapter.kt b/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChapter.kt index 99c628451..4b4b9d94d 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChapter.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChapter.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.chapter.interactor import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.repository.ChapterRepository diff --git a/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChaptersByMangaId.kt b/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChaptersByMangaId.kt index 66dab15c7..1dee7770e 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChaptersByMangaId.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/interactor/GetChaptersByMangaId.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.chapter.interactor import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.chapter.repository.ChapterRepository diff --git a/domain/src/main/java/tachiyomi/domain/chapter/interactor/SetMangaDefaultChapterFlags.kt b/domain/src/main/java/tachiyomi/domain/chapter/interactor/SetMangaDefaultChapterFlags.kt index ab8eaaa55..4c968b39a 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/interactor/SetMangaDefaultChapterFlags.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/interactor/SetMangaDefaultChapterFlags.kt @@ -1,6 +1,6 @@ package tachiyomi.domain.chapter.interactor -import tachiyomi.core.util.lang.withNonCancellableContext +import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.manga.interactor.GetFavorites import tachiyomi.domain.manga.interactor.SetMangaChapterFlags diff --git a/domain/src/main/java/tachiyomi/domain/chapter/interactor/UpdateChapter.kt b/domain/src/main/java/tachiyomi/domain/chapter/interactor/UpdateChapter.kt index 150f6b223..3daaf9010 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/interactor/UpdateChapter.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/interactor/UpdateChapter.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.chapter.interactor import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.model.ChapterUpdate import tachiyomi.domain.chapter.repository.ChapterRepository diff --git a/domain/src/main/java/tachiyomi/domain/chapter/service/ChapterSort.kt b/domain/src/main/java/tachiyomi/domain/chapter/service/ChapterSort.kt index d55c51334..795805555 100644 --- a/domain/src/main/java/tachiyomi/domain/chapter/service/ChapterSort.kt +++ b/domain/src/main/java/tachiyomi/domain/chapter/service/ChapterSort.kt @@ -1,6 +1,6 @@ package tachiyomi.domain.chapter.service -import tachiyomi.core.util.lang.compareToWithCollator +import tachiyomi.core.common.util.lang.compareToWithCollator import tachiyomi.domain.chapter.model.Chapter import tachiyomi.domain.manga.model.Manga diff --git a/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt b/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt index 84dfaecfe..a0625e5a7 100644 --- a/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/download/service/DownloadPreferences.kt @@ -1,6 +1,6 @@ package tachiyomi.domain.download.service -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.PreferenceStore class DownloadPreferences( private val preferenceStore: PreferenceStore, diff --git a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt index 22174c0e2..437dc54bc 100644 --- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt @@ -1,9 +1,9 @@ package tachiyomi.domain.library.service -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.preference.TriState -import tachiyomi.core.preference.getEnum +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.preference.TriState +import tachiyomi.core.common.preference.getEnum import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.model.LibrarySort import tachiyomi.domain.manga.model.Manga diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/GetManga.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/GetManga.kt index 816dda7ac..d4cad69d6 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/GetManga.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/GetManga.kt @@ -2,7 +2,7 @@ package tachiyomi.domain.manga.interactor import kotlinx.coroutines.flow.Flow import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.repository.MangaRepository diff --git a/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt b/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt index 2b99c29bf..0ffe9856a 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt @@ -2,7 +2,7 @@ package tachiyomi.domain.manga.model import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.UpdateStrategy -import tachiyomi.core.preference.TriState +import tachiyomi.core.common.preference.TriState import java.io.Serializable import java.time.Instant diff --git a/domain/src/main/java/tachiyomi/domain/manga/model/TriState.kt b/domain/src/main/java/tachiyomi/domain/manga/model/TriState.kt index 75a21f959..49b834772 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/model/TriState.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/model/TriState.kt @@ -1,6 +1,6 @@ package tachiyomi.domain.manga.model -import tachiyomi.core.preference.TriState +import tachiyomi.core.common.preference.TriState inline fun applyFilter(filter: TriState, predicate: () -> Boolean): Boolean = when (filter) { TriState.DISABLED -> true diff --git a/domain/src/main/java/tachiyomi/domain/release/interactor/GetApplicationRelease.kt b/domain/src/main/java/tachiyomi/domain/release/interactor/GetApplicationRelease.kt index bf966fa12..e1ba48c79 100644 --- a/domain/src/main/java/tachiyomi/domain/release/interactor/GetApplicationRelease.kt +++ b/domain/src/main/java/tachiyomi/domain/release/interactor/GetApplicationRelease.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.release.interactor -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.domain.release.model.Release import tachiyomi.domain.release.service.ReleaseService import java.time.Instant @@ -20,7 +20,7 @@ class GetApplicationRelease( val now = Instant.now() // Limit checks to once every 3 days at most - if (arguments.forceCheck.not() && now.isBefore( + if (!arguments.forceCheck && now.isBefore( Instant.ofEpochMilli(lastChecked.get()).plus(3, ChronoUnit.DAYS), ) ) { diff --git a/domain/src/main/java/tachiyomi/domain/source/model/StubSource.kt b/domain/src/main/java/tachiyomi/domain/source/model/StubSource.kt index 544326a4c..0fee2af18 100644 --- a/domain/src/main/java/tachiyomi/domain/source/model/StubSource.kt +++ b/domain/src/main/java/tachiyomi/domain/source/model/StubSource.kt @@ -22,7 +22,7 @@ class StubSource( throw SourceNotInstalledException() override fun toString(): String = - if (isInvalid.not()) "$name (${lang.uppercase()})" else id.toString() + if (!isInvalid) "$name (${lang.uppercase()})" else id.toString() companion object { fun from(source: Source): StubSource { diff --git a/domain/src/main/java/tachiyomi/domain/storage/service/StoragePreferences.kt b/domain/src/main/java/tachiyomi/domain/storage/service/StoragePreferences.kt index a49a54e3c..f29949cff 100644 --- a/domain/src/main/java/tachiyomi/domain/storage/service/StoragePreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/storage/service/StoragePreferences.kt @@ -1,8 +1,8 @@ package tachiyomi.domain.storage.service -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore -import tachiyomi.core.storage.FolderProvider +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore +import tachiyomi.core.common.storage.FolderProvider class StoragePreferences( private val folderProvider: FolderProvider, diff --git a/domain/src/main/java/tachiyomi/domain/track/interactor/DeleteTrack.kt b/domain/src/main/java/tachiyomi/domain/track/interactor/DeleteTrack.kt index 2a30e0ffc..4204b3872 100644 --- a/domain/src/main/java/tachiyomi/domain/track/interactor/DeleteTrack.kt +++ b/domain/src/main/java/tachiyomi/domain/track/interactor/DeleteTrack.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.track.interactor import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.repository.TrackRepository class DeleteTrack( diff --git a/domain/src/main/java/tachiyomi/domain/track/interactor/GetTracks.kt b/domain/src/main/java/tachiyomi/domain/track/interactor/GetTracks.kt index 018d5ffb3..851ecd0ed 100644 --- a/domain/src/main/java/tachiyomi/domain/track/interactor/GetTracks.kt +++ b/domain/src/main/java/tachiyomi/domain/track/interactor/GetTracks.kt @@ -2,7 +2,7 @@ package tachiyomi.domain.track.interactor import kotlinx.coroutines.flow.Flow import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.model.Track import tachiyomi.domain.track.repository.TrackRepository diff --git a/domain/src/main/java/tachiyomi/domain/track/interactor/InsertTrack.kt b/domain/src/main/java/tachiyomi/domain/track/interactor/InsertTrack.kt index c9c95d2f1..3277e9b9c 100644 --- a/domain/src/main/java/tachiyomi/domain/track/interactor/InsertTrack.kt +++ b/domain/src/main/java/tachiyomi/domain/track/interactor/InsertTrack.kt @@ -1,7 +1,7 @@ package tachiyomi.domain.track.interactor import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.model.Track import tachiyomi.domain.track.repository.TrackRepository diff --git a/domain/src/test/java/tachiyomi/domain/release/interactor/GetApplicationReleaseTest.kt b/domain/src/test/java/tachiyomi/domain/release/interactor/GetApplicationReleaseTest.kt index f813094fe..fe564050a 100644 --- a/domain/src/test/java/tachiyomi/domain/release/interactor/GetApplicationReleaseTest.kt +++ b/domain/src/test/java/tachiyomi/domain/release/interactor/GetApplicationReleaseTest.kt @@ -8,8 +8,8 @@ import io.mockk.mockk import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.PreferenceStore +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.domain.release.model.Release import tachiyomi.domain.release.service.ReleaseService import java.time.Instant diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index 1465a7c75..a1ef4143a 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,5 +1,5 @@ [versions] -agp_version = "8.2.1" +agp_version = "8.2.2" lifecycle_version = "2.6.2" paging_version = "3.2.1" diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index 86338364a..778c43c47 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,7 +1,7 @@ [versions] compiler = "1.5.8" -compose-bom = "2023.12.00-alpha04" -accompanist = "0.33.2-alpha" +compose-bom = "2024.01.00-alpha03" +accompanist = "0.34.0" [libraries] activity = "androidx.activity:activity-compose:1.8.2" @@ -23,5 +23,3 @@ glance = "androidx.glance:glance-appwidget:1.0.0" accompanist-webview = { module = "com.google.accompanist:accompanist-webview", version.ref = "accompanist" } accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" } - -lintchecks = { module = "com.slack.lint.compose:compose-lint-checks", version = "1.2.0" } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e0fb5d262..3dd235eee 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,8 @@ shizuku_version = "12.2.0" sqldelight = "2.0.0" sqlite = "2.4.0" voyager = "1.0.0" +detekt = "1.23.1" +detektCompose = "0.3.11" [libraries] desugar = "com.android.tools:desugar_jdk_libs:2.0.4" @@ -95,7 +97,9 @@ voyager-screenmodel = { module = "cafe.adriel.voyager:voyager-screenmodel", vers voyager-tab-navigator = { module = "cafe.adriel.voyager:voyager-tab-navigator", version.ref = "voyager" } voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" } -ktlint = "org.jlleitschuh.gradle:ktlint-gradle:12.0.3" +detekt-gradlePlugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } +detekt-rules-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } +detekt-rules-compose = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" } [bundles] okhttp = ["okhttp-core", "okhttp-logging", "okhttp-brotli", "okhttp-dnsoverhttps"] diff --git a/i18n/build.gradle.kts b/i18n/build.gradle.kts index 366e19ad3..9ed5a6cbf 100644 --- a/i18n/build.gradle.kts +++ b/i18n/build.gradle.kts @@ -6,14 +6,18 @@ plugins { kotlin { androidTarget() + + applyDefaultHierarchyTemplate() + sourceSets { val commonMain by getting { dependencies { api(libs.moko.core) } } - val androidMain by getting { - dependsOn(commonMain) // https://github.com/icerockdev/moko-resources/issues/562 + + androidMain { + dependsOn(commonMain) // https://github.com/icerockdev/moko-resources/issues/562 } } } diff --git a/i18n/src/commonMain/resources/MR/ar/plurals.xml b/i18n/src/commonMain/resources/MR/ar/plurals.xml index 64f4492f9..ff772f02d 100644 --- a/i18n/src/commonMain/resources/MR/ar/plurals.xml +++ b/i18n/src/commonMain/resources/MR/ar/plurals.xml @@ -128,4 +128,12 @@ %d يومًا %d يوم + + %d + مستودع + مستودعان + %d مستودعات + %d مستودعات + + \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/ar/strings.xml b/i18n/src/commonMain/resources/MR/ar/strings.xml index c9990d91b..a4fb5a345 100644 --- a/i18n/src/commonMain/resources/MR/ar/strings.xml +++ b/i18n/src/commonMain/resources/MR/ar/strings.xml @@ -232,7 +232,7 @@ الإضافات معلومات الإضافة الفصول المحملة - تحديث + حدث تثبيت المُعلقة جارى التنزيل @@ -242,11 +242,9 @@ غير موثوق فيه إلغاء التثبيت إضافة ذات ريبة - هذه اﻹضافة موقَّعة بشهادة ذات ريبة ولم تفعَّل. + يمكن للملحقات الخبيثة قراءة أي بيانات اعتماد مخزنة لتسجيل الدخول أو تنفيذ تعليمات برمجية عشوائية. \n -\nيمكن لأي إضافة خبيثة قراءة بيانات اعتماد تسجيل الدخول المخزَّنة أو تنفيذ تعليمات برمجية عشوائية. -\n -\nأنت تقبل هذه المخاطر إن وثقت بالشهادة. +\nمن خلال الوثوق بهذا الامتداد، فإنك تقبل هذه المخاطر. سرعة مؤثر النقر المزدوج عارض الصفحات لا مؤثرات @@ -372,7 +370,7 @@ البيانات المصادر المفقودة: النسخة الإحتياطية لا تحتوي على أيّة إدخالات المكتبة. - ملفُّ النسخ الاحتياطيِّ غير صالح + ملف النسخ الاحتياطي غير صالح: مزامنة أحادية تُحدِّث قراءة الفصول في المتتبعات الخارجية، ولك تعيين التتبِّع لكلِّ مدخلة على حدى، وذلك من زرِّ التتبع فيهم. تحقق من وجود غلاف جديد وتفاصيل جديدة عند تحديث المكتبة تحديث البيانات الوصفية تلقائياً @@ -456,9 +454,7 @@ حسب تاريخ الرفع حسب رقم الفصل إستخدام DNS عبر HTTPS (DoH) - تم استيراد البيانات من ملف نسخ الاحتياطي. -\n -\nيتوجب تثبيت الإضافات المفقودة و تسجيل الدخول إلى منصات التعقب تالياً لاستعمالهم. + قد تحتاج إلى تثبيت أي إضافات مفقودة وتسجيل الدخول إلى خدمات التتبع بعد ذلك لاستخدامها. يمين يسار التالي @@ -773,4 +769,33 @@ \nوالأحسن أن يكون المجلَّد مخصوصًا لذلك. \n \nالمجلَّد المحدَّد: %2$s + إذن تثبيت التطبيقات + لتثبيت ملحقات المصدر. + إذن الإشعار + احصل على تنبيهات لتحديثات المكتبة والمزيد. + استخدام البطارية في الخلفية + منح + الأذونات مطلوبة لتثبيت الإضافات. انقر هنا لمنحها. + إبطال الإضافات غير المعروفة الموثوق بها + مستودع الإضافات + رابط المستودع + إضافة مستودعات إضافية إلى ميهون. يجب أن يكون هذا الرابط ينتهي بـ \"index.min.json\". + هذا المستودع موجود بالفعل! + حذف المستودع + رابط المستودع غير صالح + هل ترغب في حذف \"1%s\" من المستودع؟ + مستودع مفتوح المصدر + الخطأ الكامل: + تضمين إعدادات حساسة (على سبيل المثال، رموز تسجيل دخول المتتبع) + قريباً + تكرار تحديث مخصص: + هل تقوم بالتحديث من إصدار أقدم ولست متأكداً مما تختاره؟ ارجع إلى دليل التخزين لمزيد من المعلومات. + دليل التخزين + تجنّب الانقطاعات في تحديثات المكتبة الطويلة الأمد والتنزيلات واستعادة النسخ الاحتياطية. + تحديث ذكي + Nord + لم يتم تعيين أي مستودع . + إضافة مستودع + من المتوقع أن يتم إصدار فصول جديدة في حوالي 1%1$s، والتحقق من كل 2%2$s . + متاح: %1$s / الكل: %2$s \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/cv/plurals.xml b/i18n/src/commonMain/resources/MR/cv/plurals.xml index 612cb2ab5..b96d0872c 100644 --- a/i18n/src/commonMain/resources/MR/cv/plurals.xml +++ b/i18n/src/commonMain/resources/MR/cv/plurals.xml @@ -29,23 +29,39 @@ Ҫӗнӗ сыпӑксем %d хайлав валли тупӑннӑ - 1 сыпӑк + %1$s сыпӑк %1$s сыпӑк - 1 юлчӗ - %1$s юлчӗ + %1$s йулчӗ + %1$s йулчӗ 1 сӑнану %d сӑнану - 1 сыпӑк ҫук + %d сыпӑк ҫук %d сыпӑк ҫук Ӗнер %1$d кун кайалла + + Тепӗр вуламан сыпӑк + Тепӗр %d вуламан сыпӑк + + + 1 кун + %d кун + + + %1$s сыпӑк ҫук + %1$s сыпӑк ҫук + + + Тепӗр сыпӑк + Тепӗр %d сыпӑк + \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/de/strings.xml b/i18n/src/commonMain/resources/MR/de/strings.xml index 234c8536a..a402087fb 100644 --- a/i18n/src/commonMain/resources/MR/de/strings.xml +++ b/i18n/src/commonMain/resources/MR/de/strings.xml @@ -128,16 +128,16 @@ Ab fünftletzt gelesenem Kapitel Neue Kapitel herunterladen Tracker - Sicherung erstellen + Datensicherung erstellen Kann benutzt werden, um die aktuelle Bibliothek wiederherzustellen - Sicherung wiederherstellen + Datensicherung wiederherstellen Bibliothek mit Hilfe einer Datensicherung wiederherstellen Automatische Sicherungshäufigkeit - Sicherung erstellt + Datensicherung erstellt Wiederherstellen abgeschlossen Was möchtest du sichern\? - Sicherung wird wiederhergestellt - Sicherung wird erstellt + Datensicherung wird wiederhergestellt + Datensicherung wird erstellt Kapitel-Zwischenspeicher leeren Belegt: %1$s Zwischenspeicher geleert, %1$d Dateien gelöscht @@ -351,11 +351,11 @@ Webseite Nur Heruntergeladenes Kap. %1$s - %2$s - Sicherungswiederherstellung fehlgeschlagen - Sicherung fehlgeschlagen + Datensicherungswiederherstellung fehlgeschlagen + Datensicherung fehlgeschlagen Wiederherstellung abgebrochen Wiederherstellung wird bereits durchgeführt - Sicherung wird bereits durchgeführt + Datensicherung wird bereits durchgeführt Nach Aktualisierungen suchen Zuletzt genutzt Anleitung für lokale Quellen @@ -371,7 +371,7 @@ Nach Uploaddatum Daten Fehlende Quellen: - Sicherung beinhaltet keinerlei Bibliothekseinträge. + Datensicherung beinhaltet keinerlei Bibliothekseinträge. Ungültige Sicherungsdatei: Auf neue Cover und Details überprüfen, wenn die Bibliothek aktualisiert wird Metadaten automatisch aktualisieren @@ -542,7 +542,7 @@ Sprache Warnung Große Aktualisierungen schaden Quellen und könnten zu langsameren Aktualisierungen sowie höherem Akkuverbrauch führen. Tippe, um mehr zu erfahren. - Du solltest Kopien der Sicherungen auch an anderen Orten aufbewahren. Sicherungen beinhalten möglicherweise sensible Daten, einschließlich gespeicherter Passwörter. Sei vorsichtig beim Teilen. + Du solltest Kopien der Datensicherungen auch an anderen Orten aufbewahren. Datensicherungen beinhalten möglicherweise sensible Daten, einschließlich gespeicherter Passwörter. Sei vorsichtig beim Teilen. Nur über WLAN Alle 3 Tage Achtung: Große Downloads könnten dazu führen, dass Quellen langsamer werden und/oder Mihon blockieren. Tippe, um mehr zu erfahren. @@ -793,7 +793,7 @@ Repository-URL Füge zusätzliche Repositorys zu Mihon hinzu. Deren URL sollte mit „index.min.json“ enden. Ungültige Repository-URL - Neue Kapitel vsl. in ca. %1$s, überprüfe ca. alle %2$s + Ca. %1$s bis zur Veröffentlichung neuer Kapitel, wird ca. alle %2$s überprüft. Nord Open-Source-Repository Bald diff --git a/i18n/src/commonMain/resources/MR/fa/strings.xml b/i18n/src/commonMain/resources/MR/fa/strings.xml index 45e7cb1a0..ba003bb23 100644 --- a/i18n/src/commonMain/resources/MR/fa/strings.xml +++ b/i18n/src/commonMain/resources/MR/fa/strings.xml @@ -622,4 +622,58 @@ آخرین به روز رسانی کتابخانه: %s خارج از دوره انتشار موزد انتظار برای بزرگ نمایی دوبار ضربه بزنید + تناوب به روز رسانی شخسی سازی شده + خوش آمدید! + بیاید برخی چیز ها را تنظیم کنیم. شما همیشه میتوانید این تنظیمات را در بخش تنظیمات تغییر دهید. + بعدی + برای نصب افزانه منبع. + دسترسی اعلان ها + برای به روز رسانی های کتابخانه و بیشتر مطلع شوید. + استفاده از باطری + از وقفه در به روز رسانی های کتاب خانه، بارگیری و پشتیبان گیری های طولانی اجتناب کنید. + اعطا کردن + به %s نا آشنا هستید؟ ما پیشنهاد میکنیم تا یک سر به راهنمای شروع بزنید. + نصب مجدد %s؟ + زمان بندی های نسبی + به روز رسانی هوشمند + کشیدن قسمت + لغو اعتماد افزونه های ناشناخته + مخازن افزونه ها + اضافه کردن مخزن + آدرس مخزن + این مخزن در حال حاضر وجود دارد! + حذف مخزن + آدرس مخزن بی اعتبار است + آشا شما میخواهید تا \"%s\" مخزن را حذف کنید؟ + جهت چرخش صفحات گسترده را برعکس کن + مکان ذخیره سازی تنظیم نشده است + عکس های بلند را تقسیم کن + ورود به ناضر + اجرای داخل کتاب خانه را مخفی کن + محل زخیره سازی + شروع کنید + پرش + مجوز برای نصب افزونه ها لازم است. به اینجا ضربه بزنید تا اعطا کنید. + به میهون مخازن اضافی اضافه کنید. این باید یک آدرس باشد که با \"index.min.json\" تمام شود. + شما هیچ مخزنی برای تنظیم ندارید. + مخزن منبع باز + مقدار رد باقی مانده در نمایش گر های E-ink کاهش میابد + انتخاب یک پوشه + یک پوشه باید انتخاب شود + راهنمای زخیره سازی + مجوز نصب برنامه ها + ایجاد کردن + خطای کامل: + تنظیمات برنامه + تنظیمات منبع + حاوی تنظیمات حساس (یه عنوان مثال رمز ورود ناظر) + فایل پشتیبانی ایجاد نشد + استفاده از فظای زخیره سازی + در دسترس: %1$s / کل:%2$s + هنگام راه‌اندازی برنامه، حافظه پنهان قسمت را پاک کنید + درحال همگام سازی کتاب خانه + قابل استفاده برای به روز رسانی خودکار، بارگیری قسمت ها، و منابع محلی. + آخرین پشتیبان گیری خودکار: %s + DNS بیش از HTTPS (DoH) + همگام سازی کتاب خانه کامل شد \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/fi/strings.xml b/i18n/src/commonMain/resources/MR/fi/strings.xml index d75700acd..24e863234 100644 --- a/i18n/src/commonMain/resources/MR/fi/strings.xml +++ b/i18n/src/commonMain/resources/MR/fi/strings.xml @@ -72,7 +72,7 @@ Laajennukset Laajennuksen tiedot Suodatus - Kirjanmerkki + Kirjanmerkityt Lukemattomat Poista suodattimet Aakkosjärjestyksessä @@ -103,7 +103,7 @@ Asenna Jaa Tallenna - Resetoi + Nollaa Kumoa Avaa loki Palauta @@ -141,11 +141,9 @@ Luottamaton Poista asennus Luottamattomat laajennokset - Tämä laajennus on allekirjoitettu luottamattomalla sertifikaatilla ja sitä ei ole aktivoitu. + Haitallinen laajennus voi lukea tallennetut kirjautumistiedot Mihonista tai suorittaa luvatonta koodia. \n -\nHaitallinen laajennus voisi lukea mahdolliset kirjautumistiedot Mihonsta tai suorittaa luvatonta koodia. -\n -\nLuottamalla tähän sertifikaattiin hyväksyt nämä riskit. +\nLuottamalla tähän laajennokseen hyväksyt nämä riskit. Koko näyttö Animoi sivusiirtymät Tuplanäpäytyksen animaation nopeus @@ -201,7 +199,7 @@ Neljänneksi viimeinen luku Viidenneksi viimeinen luku Lataa uudet luvut - Palvelut + Seurantapalvelut Voidaan käyttää nykyisen kirjaston palauttamiseen Palauta kirjasto varmuuskopiointi-tiedostosta Varmuuskopioinnin tiheys @@ -290,7 +288,7 @@ Päivitä Kirjasto Vanhentunut - Tämä laajennus ei ole enää saatavilla. + Tämä laajennos ei ole enää saatavilla. Se ei välttämättä toimi oikein ja voi aiheuttaa ongelmia Mihonin kanssa. Laajennoksen poistoa suositellaan. Päivämäärän muoto Globaali päivitys Kirjaa ulos kohteesta %1$s\? @@ -348,7 +346,7 @@ Kiinnitä Valitse käänteinen Jatkuva pystysuora - WebView on pakollinen Mihonssa + WebView on pakollinen Mihonissa Palautus on jo käynnissä Varmuuskopiointi on jo käynnissä Sivuntäyttö @@ -374,7 +372,7 @@ Tiedot Puuttuvat lähteet: Varmuuskopio ei sisällä mangaa. - Virheellinen varmuuskopio + Virheellinen varmuuskopio: Tarkista uusi kansi ja tiedot päivitettäessä kirjastoa Päivitä metatiedot automaattisesti Siirrä @@ -412,7 +410,7 @@ Seurantapalvelimet joihin et ole kirjautunut sisään: Poista kirjanmerkityt luvut Poista luvut - Voi sisältää NSFW (18+) -sisältöä + Tämän laajennoksen lähteet voivat sisältää NSFW (18+) -sisältöä 18+ Tämä ei estä epävirallisia tai mahdollisesti väärin merkittyjä laajennuksia näyttämästä NSFW 18+ sisältöä sovelluksessa. Lukuja ei löytynyt @@ -447,7 +445,7 @@ Tallentaa virhelokit tiedostoon jaettavaksi kehittäjien kanssa Laskeva Nouseva - Luvunumeron mukaan + Lukunumeron mukaan Lisäyspäivämäärän mukaan Seuratut Näytä kohteiden määrä @@ -495,7 +493,7 @@ Pois päältä Päällä Aloitusopas - Varoitus: massalataukset voivat johtaa siihen, että lähteet muuttuvat hitaammiksi käyttää ja/tai ne estävät Mihonn käytön. Napauta saadaksesi lisätietoja. + Varoitus: massalataukset voivat johtaa siihen, että lähteet muuttuvat hitaammiksi käyttää ja/tai ne estävät Mihonin käytön. Napauta saadaksesi lisätietoja. Näytä manga Kansikuva ruudukko Dynaaminen @@ -538,7 +536,7 @@ Viimeisin manga päivitys Lukemattomien määrä Poista kategoria - Jäljitä + Seuraa Alhainen Poissuljetut kategoriat Alhaisin @@ -594,7 +592,7 @@ Poista kaikkien sarjojen lukutila ja lukusuunta Peruttu Sivun %d tiedostopolkua ei löytynyt - Parannetut palvelut + Parannetut seurantapalvelut Lukijan asetuksia ei voitu poistaa Järjestä Kansikuva @@ -615,4 +613,70 @@ Varmuuskopioita kannattaa säilyttää myös muissa paikoissa. Toivelista Viimeksi luettua lukua ei voitu avata + Valitut + Skanlaattori + Data ja tallennustila + Tilastotiedot + Ladattu + Seuraava odotettu päivitys + Seurannan pisteytys + Päivitä kategoria + Järjestä kategoriat + Jatka lukemista painike + Käytä + OK + Palauta oletus + %s kohtasi odottamattoman virheen. Ehdotamme että jaat kaatumisen lokitiedot tukikanavallemme Discordissa. + Poista ladatut + Varmuuskopiotiedoston luonti epäonnistui + Kirjastossasi on jo samanniminen merkintä. +\n +\nHaluatko silti jatkaa? + Hupsista! + Kopioitu leikepöydälle + Uudelleenkäynnistä applikaatio + Mukautettu kansikuva + Ei valitut + Lisää asetuksia + Paikallinen + Aloitettu + Avaa satunnainen merkintä + Haluatko järjestää kategoriat aakkosjärjestykseen? + Kopioi leikepöydälle + Siirrä sarja pohjimmaiseksi + Ei nyt + Sisäinen virhe: Lisätietoja saat kaatumisen lokitiedoista + Akun käyttö taustalla + Lukutila, näyttö, navigointi + Lähteet, laajennokset, globaali haku + Manuaaliset ja automaattiset varmuuskopiot, tallennustila + Applikaation lukko, turvallinen ruutu + Kaatumislokien vedos, akun optimoinnit + Pohjoismainen + Suhteelliset aikaleimat + Käytä muotoa \"%1$s\", kuin muotoa \"%2$s\" + Laajennosten asentamiseen tarvitaan lupia. Napauta tästä myöntääksesi luvat. + Lisää laajennosten lähde + Laajennosten lähteen URL + Lisää laajennosten lähteitä Mihoniin. URL-osoitteen tulisi päättyä \"index.min.json\". + Tämä laajennosten lähde on jo lisättynä! + Poista laajennosten lähde + Epäkelpo laajennosten lähteen URL-osoite + Haluatko poistaa laajennosten lähteen \"%s\"? + Peilaa käännetyt leveät sivut + Tuplanapauta lähentääksesi + Vähentää haamujälkiä e-paperi näytöillä + Ohita kaksoisluvut + Jaa korkeat kuvat + Luo + Sovita leveät sivut kääntämällä + Valikon piilottamisen herkkyys vierittäessä + Väläytä näyttöä sivunvaihdon yhteydessä + Käytetään automaattisille varmuuskopioille, lukujen latauksille ja paikallisille lähteille. + Vältä keskeytyksiä pitkään jatkuvissa toimenpiteissä, kuten kirjaston päivitys, lataukset, ja varmuuskopion palautukset. + %d per rivi + Teema, ajan ja päivämäärän formaatti + Automaattinen lataus, ennakkolataus + Yksisuuntainen synkronointi, paranneltu synkronointi + Kategoriat, globaalit päivitykset, luvun pyyhkäisy \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/fil/plurals.xml b/i18n/src/commonMain/resources/MR/fil/plurals.xml index bbebdac6d..04755d125 100644 --- a/i18n/src/commonMain/resources/MR/fil/plurals.xml +++ b/i18n/src/commonMain/resources/MR/fil/plurals.xml @@ -38,7 +38,7 @@ %d tracker - %d mga tracker + %d na tracker Nilaktawan ang %d na kabanata, maaaring ito ay wala sa source o na-filter ang mga ito @@ -46,11 +46,11 @@ Kahapon - %1$d araw na ang makalipas + %1$d araw na ang nakakalipas - Susunod na hindi pa nababasa na kabanata - Susunod na %d di pa nababasa na kabanata + Susunod na hindi pa nababasang kabanata + Susunod na %d hindi pa nababasang kabanata Sunod na kabanata @@ -58,14 +58,14 @@ Nawawalang %1$s na kabanata - Nawawalang %1$s mga kabanata + Nawawalang %1$s na mga kabanata 1 araw - %d (mga) araw + %d (na) araw %d na repo %d na mga repo - \ No newline at end of file + diff --git a/i18n/src/commonMain/resources/MR/fil/strings.xml b/i18n/src/commonMain/resources/MR/fil/strings.xml index 8bad24a31..b26aa0a81 100644 --- a/i18n/src/commonMain/resources/MR/fil/strings.xml +++ b/i18n/src/commonMain/resources/MR/fil/strings.xml @@ -22,7 +22,7 @@ Isara Ipakita ang mga tab ng kategorya Bilang ng kabanatang na-download - Maalwan na grid + Kumportableng grid Listahan Siksik na grid Pagpapakita @@ -114,7 +114,7 @@ Pangalawa sa huling nabasa Huling nabasang kabanata Sarado - Pagkamarkahang nabasa na + Markahang nabasa na Pagkatapos basahin, awtomatikong burahin Kapal ng gilid Pagbabasa @@ -243,7 +243,7 @@ Mga update sa extension Wala Mga update sa kabanata - Komon + Pangkaraniwan Nakahinto ang mga pag-download Walang koneksyon sa Internet Walang koneksyon sa Wifi @@ -291,7 +291,7 @@ Di mai-load ang larawan Di makita ang susunod na kabanata Pahina: %1$d - Napalitan na ang cover + Napalitan ang cover Gawin itong cover Pinili kong filter Na-save na ang larawan @@ -556,7 +556,7 @@ Para sa tulong sa pag-aayos ng mga error sa pag-update ng aklatan, tingnan ang %1$s Laktawan ang mga entry na hindi pa nababasang kabanata I-save bilang CBZ archive - Tapos na\'ng mailathala + Tapos na ang paglalathala Naka-hiatus Kinansela Ipakita ang entry @@ -639,9 +639,9 @@ Mga kategorya, panlahatang update, pag-swipe ng kabanata Mga source, extension, panlahatang paghanap Nagkaroon ng hindi inaasahang error ang %s. Iminumungkahi naming ibahagi mo ang mga crash log sa aming support channel sa Discord. - Ay! + Ay Naku! Buksan muli ang app - Invalid na lugar: %s + Imbalidong lugar: %s Di alam na pamagat Di-wastong string ng user agent Ngayon lang @@ -693,7 +693,7 @@ I-rotate ang malalawak na pahina upang magkasya I-flip ang oryentasyon ng mga pinaikot na malalawak na pahina Nakapatong (Overlay) - Hatiin ang mga matatangkad na larawan + Hatiin ang mga matataas na larawan Impormasyon sa pag-debug Mag-swipe ng pakaliwang pagkilos Mag swipe ng kabanata @@ -798,4 +798,4 @@ Malapit na Bawiin ang mga pinagkakatiwalaang hindi kilalang extension Open source na repo - \ No newline at end of file + diff --git a/i18n/src/commonMain/resources/MR/fr/strings.xml b/i18n/src/commonMain/resources/MR/fr/strings.xml index 56e0641dc..31a9a27f0 100644 --- a/i18n/src/commonMain/resources/MR/fr/strings.xml +++ b/i18n/src/commonMain/resources/MR/fr/strings.xml @@ -412,7 +412,7 @@ Suppression des chapitres Les sources de cette extension peuvent contenir du contenu NSFW (18+) 18+ - Ceci n\'empêche pas les extensions non officielles ou potentiellement mal signalées de diffuser du contenu +18 dans l\'application. + Ceci n\'empêche pas les extensions de diffuser du contenu +18 dans l\'application. Aucun chapitre trouvé Appliquer ce paramétrage par défaut \? Paramètres du chapitre @@ -534,7 +534,7 @@ Installez et démarrez Shizuku pour utiliser Shizuku comme installateur d\'extensions. Shizuku n\'est pas en cours d\'exécution Legacy - installeur + Installeur Installation de l\'extension… Entrées totales Rapports détaillés @@ -798,4 +798,4 @@ Impossible de créer un fichier de sauvegarde Dernière sauvegarde automatique : %s Paramètres sources - \ No newline at end of file + diff --git a/i18n/src/commonMain/resources/MR/in/strings.xml b/i18n/src/commonMain/resources/MR/in/strings.xml index ff65294de..9859b62c0 100644 --- a/i18n/src/commonMain/resources/MR/in/strings.xml +++ b/i18n/src/commonMain/resources/MR/in/strings.xml @@ -192,7 +192,7 @@ Tambahkan ke pustaka\? Gambar disimpan Filter khusus - Tetapkan sebagai sampul + Terapkan sebagai sampul Sampul telah diperbarui Halaman: %1$d Bab berikutnya tak ditemukan @@ -406,15 +406,15 @@ Kemajuan Masalah Pelacakan tidak tersinkronisasi di: - Sumber dari ekstensi ini mungkin berisi konten DEWASA (18+) + Sumber dari ekstensi ini mungkin berisi konten DEWASA (NSFW 18+) 18+ Hapus bab yang ditandai Hapus chapter - Hal ini tidak mencegah ekstensi yang tidak resmi atau berpotensi salah ditandai untuk menampilkan konten NSFW (18+) di dalam aplikasi. + Hal ini tidak mencegah ekstensi non-resmi atau konten DEWASA (NSFW 18+) yang tidak ditandai dengan benar muncul di dalam aplikasi. Tidak ada bab yang ditemukan Pengaturan bab bawaan diperbarui - Tetapkan sebagai bawaan - Juga terapkan untuk semua entri di pustaka saya + Terapkan sebagai bawaan + Terapkan pula untuk semua entri di pustaka saya Apakah anda yakin ingin menyimpan pengaturan ini sebagai bawaan\? Pengaturan bab %1$s: %2$s, halaman %3$d @@ -573,7 +573,7 @@ Pindahkan seri ke atas Versi baru tersedia dari perilisan resmi. Ketuk untuk mempelajari migrasi dari perilisan non-resmi dari F-Droid. Dinonaktifkan - Error menyimpan gambar + Gagal menyimpan gambar Tidak ada entri perpustakaan untuk dicadangkan Buka di Github Membersihkan data WebView @@ -700,7 +700,7 @@ Geser kekiri Ketuk dua kali untuk memperbesar %d per baris - Tetapkan jeda waktu + Terapkan jeda waktu Frekuensi pembaruan yang disesuaikan Dilewati karena tidak ada rilis yang diharapkan hari ini Pembaruan yang diharapkan berikutnya @@ -728,7 +728,7 @@ Pindahkan seri ke bawah Penanda waktu \"%1$s\" seharusnya \"%2$s\" - Mengurutkan kategori + Urutkan kategori Memperbarui pustaka... (%s) Apakah Anda ingin mengurutkan kategori menurut abjad\? Tidak ada file yang dipilih @@ -783,7 +783,7 @@ Tambahkan repo lain ke Mihon. Seharusnya URL yang memiliki akhiran \"index.min.json\". Repositori ekstensi Anda tidak memiliki repositori yang ditetapkan. - Keseluruhan eror: + Kesalahan penuh: Repositori ini sudah ada! URL Repo URL repo tidak valid @@ -793,9 +793,9 @@ Apa Anda yakin ingin menghapus repo \"%s\"? Bab baru diperkirakan akan dirils sekitar %1$s, diperiksa setiap sekitar %2$s. Tersedia:%1$s/Total:%2$s - Keseringan pembaruan yang di kostumisasi: + Frekuensi pembaruan khusus: Nord Segera - Mencabut ekstensi tidak dikenal yang tepercaya + Cabut izin ekstensi tidak dikenal yang tepercaya Repo sumber terbuka \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/it/strings.xml b/i18n/src/commonMain/resources/MR/it/strings.xml index 7a09812cb..b68658c88 100644 --- a/i18n/src/commonMain/resources/MR/it/strings.xml +++ b/i18n/src/commonMain/resources/MR/it/strings.xml @@ -199,7 +199,7 @@ Ogni settimana Categoria predefinita Tracking - Tracking + Tracciamento Chiedi sempre Ritaglia bordi Inverti i tasti del volume @@ -236,11 +236,9 @@ Non attendibile Disinstalla Estensione non attendibile - Questa estensione è stata firmata con un certificato non attendibile e non è stata attivata. + Le estensioni dannose possono leggere le credenziali di accesso memorizzate o eseguire codice arbitrario. \n -\nUn\'estensione maliziosa potrebbe leggere credenziali di accesso salvate o eseguire codice dannoso. -\n -\nFidandoti di questo certificato accetti questi rischi. +\nFidandoti di questa estensione, accetti questi rischi. Velocità animazioni doppio tocco Per pagina Senza animazione @@ -783,4 +781,23 @@ Includi impostazioni sensibili (es. token di login dei tracker) Consenti Escludi scanlator + Guida all\'archiviazione + Repository delle estensioni + Aggiungi repository + URL repository + Questa repository esiste già! + Elimina repository + URL repository non valida + Repository open source + Presto + Frequenza di aggiornamento personalizzata: + State aggiornando da una versione precedente e non siete sicuri di cosa selezionare? Per ulteriori informazioni, consultare la guida all\'archiviazione + Nord + Aggiornamento intelligente + Revoca le estensioni sconosciute affidabili + Non hai repository impostate. + Aggiungi altri repository a Mihon. Questo dovrebbe essere un URL che termina con \"index.min.json\". + Vuoi eleminare la repository \"%s\"? + Errore completo: + Si prevede che i nuovi capitoli saranno rilasciati tra circa %1$s, con controlli ogni %2$s. \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/ja/strings.xml b/i18n/src/commonMain/resources/MR/ja/strings.xml index df4e258b2..9c7429d80 100644 --- a/i18n/src/commonMain/resources/MR/ja/strings.xml +++ b/i18n/src/commonMain/resources/MR/ja/strings.xml @@ -500,7 +500,7 @@ 横向き 縦向き 真っ黒モード - Yotsuba + 四つ葉 陰陽 Tako ストロベリーダイキリ @@ -620,7 +620,7 @@ 津波 事前ダウンロード 読書中に自動でダウンロード - 現在のと次の章は既にダウンロード済みの場合のみ有効です + 現在のと次の章は既にダウンロード済みの場合のみ有効です。 本当に実行しますか? 多言語 前回のライブラリ更新: %s diff --git a/i18n/src/commonMain/resources/MR/ne/strings.xml b/i18n/src/commonMain/resources/MR/ne/strings.xml index 048894780..955f018de 100644 --- a/i18n/src/commonMain/resources/MR/ne/strings.xml +++ b/i18n/src/commonMain/resources/MR/ne/strings.xml @@ -210,7 +210,7 @@ दुबै कार्यहरू लामो ट्यापमा कार्यहरू देखाउनुहोस् - पृष्ठभूमि रङ + ब्याकग्राउण्ड रङ खैरो कालो स्वत @@ -595,7 +595,7 @@ थुप्रै अपडेटहरू आइकनमा नपढिएको गणना देखाउनुहोस् डुप्लिकेट अध्यायहरू छोड्नुहोस् - जारी राख्नुहोस् बटन + जारी राख्ने बटन तथ्याङ्क सुरु गरिएको लोकल @@ -705,7 +705,7 @@ जूम गर्न डबल ट्याप गर्नुहोस् %d प्रति पङ्क्ति अन्तराल सेट गर्नुहोस् - कस्टम गरिएको ल्याउने अन्तराल + कस्टम गरिएको अपडेट फ्रिक्वेन्सी प्रत्येक अपडेट गर्न सेट गर्नुहोस् छोडियो किनभने आज कुनै रिलीज अपेक्षित थिएन अन्तरालहरू @@ -715,8 +715,8 @@ %s ट्र्याकिङ हटाउने हो\? %s बाट पनि हटाउनुहोस् यसले लोकल रूपमा ट्र्याकिङ हटाउनेछ। - ठीक छ - डाउनलोड गरिएको मेट्नुहोस् + ठिक छ + डाउनलोड गरिएको हटाउनुहोस् परिणामहरू भएको पुस्तकालय सिङ्क सम्पन्न भयो पुस्तकालय सिङ्क गर्दै @@ -745,11 +745,61 @@ फाइल पिकर एपमा फाइल फर्काउन असफल भयो चयन गरिएको चयन नगरिएको - ट्र्याकर मुल्यन्कन - स्क्यानलेतर + ट्र्याकर मूल्याङ्कन + स्क्यानलेटर अरु मेनु - स्वागत! + स्वागत छ! अर्को सुरु छोड + एउटा फोल्डर चयन गर्नुपर्छ + भण्डारण गाइड + सूचना अनुमति + प्रदान गर्नुहोस् + %s मा नयाँ हुनुहुन्छ? हामी स्टार्टिङ गाइड जाँच गर्न सिफारिस गर्छौं। + नोर्ड + स्मार्ट अपडेट + यो रिपो पहिले नै अवस्थित छ! + रिपो हटाउनुहोस् + रिपो URL अवैध छ + माथि नेभिगेट गर्नुहोस् + पूर्वनिर्धारितमा फर्कनुहोस् + अनबोर्डिङ गाइड + पहिले केहि चीजहरू सेट गरौं। तपाईं पछि पनि सेटिङहरूमा गएर यसलाई परिवर्तन गर्न सक्नुहुन्छ। + एउटा फोल्डर चयन गर्नुहोस् जहाँ %1$s ले अध्याय डाउनलोड, ब्याकअप, र थप भण्डारण गर्नेछ। +\n +\nएक समर्पित फोल्डर सिफारिस गरिएको छ। +\n +\nचयन गरिएको फोल्डर: %2$s + फोल्डर चयन गर्नुहोस् + एप स्थापना गर्ने अनुमति + स्रोत एक्सटेन्शन स्थापना गर्न को लागि। + पुस्तकालय अपडेट र थपका लागि सूचना प्राप्त गर्नुहोस्। + लामो समयदेखि चलिरहेको पुस्तकालय अपडेटहरू, डाउनलोडहरू, र ब्याकअप रिस्टोरमा अवरोधहरू बेवास्ता गर्नुहोस्। + पुरानो संस्करणबाट अपडेट गर्दै र के चयन गर्ने निश्चित छैन? थप जानकारीको लागि भण्डारण गाइड हेर्नुहोस्। + ब्याकग्राउण्ड ब्याट्री प्रयोग + %s पुन: स्थापना गर्दै हुनुहुन्छ? + एक्सटेन्शनहरू स्थापना गर्न अनुमति आवश्यक छ। प्रदान गर्न यहाँ ट्याप गर्नुहोस्। + विश्वसनीय अज्ञात एक्सटेन्शनहरू रद्द गर्नुहोस् + तपाईंले कुनै पनि रिपो सेट गर्नु भएको छैन। + रिपो URL + एक्सटेन्शन रिपो + रिपो थप्नुहोस् + Mihon मा अतिरिक्त रिपो थप्नुहोस्। URL को अन्त्यमा \"index.min.json\" हुनुपर्छ। + अप्लाई + के तपाइँ रिपो \"%s\" हटाउन चाहनुहुन्छ? + खुला स्रोत रिपो + भण्डारण स्थान + उपलब्ध: %1$s / कुल: %2$s + नयाँ अध्यायहरू लगभग %1$s मा रिलीज हुने भविष्यवाणी गरिएको छ, हरेक %2$s को वरिपरि जाँच गर्दै। + छिटै + कस्टम अपडेट फ्रिक्वेन्सी: + स्क्यालेटरहरू समावेश नगर्नुहोस् + कुनै स्क्यालेटर फेला परेन + भण्डारण प्रयोग + कुनै भण्डारण स्थान सेट गरिएको छैन + स्वचालित ब्याकअप, अध्याय डाउनलोड, र स्थानीय स्रोतको लागि प्रयोग गरिन्छ। + सिर्जना गर्नुहोस् + पूर्ण त्रुटि: + संवेदनशील सेटिङहरू समावेश गर्नुहोस् (जस्तै, ट्र्याकर लगइन टोकनहरू) \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/pl/strings.xml b/i18n/src/commonMain/resources/MR/pl/strings.xml index 6ba1d7d94..f079535ed 100644 --- a/i18n/src/commonMain/resources/MR/pl/strings.xml +++ b/i18n/src/commonMain/resources/MR/pl/strings.xml @@ -745,4 +745,61 @@ Ustawienia aplikacji Usuń repozytorium Dodaj repozytorium + Zaznaczone + Przewiń w górę + Zaczynajmy + Przewodnik po pamięci + Zainstaluj uprawnienia aplikacji + Do instalacji rozszerzeń. + Zezwól + Pierwszy raz w %s? Zalecamy zapoznać się z poradnikiem. + Ponowna instalacja %s? + Repozytoria rozszerzeń + Link repozytorium + Zużycie pamięci + Niestandardowa częstotliwość aktualizacji: + Nie znaleziono skanlatorów + Nie wybrano pliku + Nie zaznaczone + Serwisy śledzące + Dane i pamięć + Szybka konfiguracja + Unikaj przerywania długich operacji takich jak pobieranie rozdziałów, aktualizacje bibliotek lub przywracanie kopii zapasowej. + Otrzymuj powiadomienia ze swojej biblioteki i więcej. + Nord + Użyj dat względnych + \"%1$s\" zamiast \"%2$s\" + Inteligentna aktualizacja + Na początek ustawmy kilka rzeczy. Zawsze możesz je później zmienić w ustawieniach. + Aktualizujesz ze starszej wersji i nie jesteś pewien co wybrać? Zobacz na przewodnik po pamięci. + Przewiduj następną aktualizację + Uprawnienia są wymagane aby zainstalować rozszerzenia. Kliknij tutaj aby je przyznać. + Wybierz folder gdzie %1$s będzie zapisywał pobrane rozdziały, kopie zapasowe i inne. +\n +\nZalecany jest dedykowany folder. +\n +\nWybrany folder:%2$s + Unieważnij zaufanie nieznanym rozszerzeniom + Nie masz ustawionych repozytoriów. + Dodaj repozytoria do Mihon. Powinien to być link z końcówką \"index.min.json\". + To repozytorium jest już dodane! + Na pewno chcesz usunąć repozytorium \"%s\"? + Repozytorium open source + Redukuje ghosting na wyświetlaczach e-ink + Brak ustawionej ścieżki pamięci + Miejsce przechowywania danych + Używane do automatycznych kopii zapasowych, pobierania rozdziałów i lokalnych źródeł. + Pełny błąd: + Login serwisu śledzącego + Utwórz + Włącz przerwy między stronami + Dołącz wrażliwe ustawienia (np. tokeny serwisu śledzącego) + Ostatnia automatyczna kopia zapasowa: %s + Ma wyniki + Oszacuj co + Wolne: %1$s / Ogółem: %2$s + Wkrótce + Licencjonowany - Brak rozdziałów + Pominięto, ponieważ nie spodziewano się dzisiaj żadnej publikacji + Wyklucz skanlatorów \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/sr/plurals.xml b/i18n/src/commonMain/resources/MR/sr/plurals.xml index 3559f7cf8..6a538ebc2 100644 --- a/i18n/src/commonMain/resources/MR/sr/plurals.xml +++ b/i18n/src/commonMain/resources/MR/sr/plurals.xml @@ -26,9 +26,9 @@ %d категорија - Pre %1$d dan - Pre %1$d dana - Pre %1$d dana + Пре %1$d дан + Пре %1$d дана + Пре %1$d дана Прескаче се %d поглавље, или не постоји у извору или је филтером издвојено @@ -80,4 +80,9 @@ %d дана %d дана + + %d репозиторија + %d репозиторија + %d репозиторија + \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/sr/strings.xml b/i18n/src/commonMain/resources/MR/sr/strings.xml index 1c08015da..b74ad34aa 100644 --- a/i18n/src/commonMain/resources/MR/sr/strings.xml +++ b/i18n/src/commonMain/resources/MR/sr/strings.xml @@ -15,6 +15,7 @@ Миграција Додаци Информације о додатку + Складиштење и подаци Подешавања Филтер Забележено @@ -83,7 +84,7 @@ Све Ограничења уређаја за аутоматска ажурирања Пуњење - Са статусом \"Завршено\" + Прескочи уносе са статусом \"Завршено\" Ажурирај пратиоца након читања Подразумевана категорија Увек питај @@ -428,7 +429,7 @@ Мрежа Подаци из датотеке резервне копије ће бити враћени. \n -\nМораћете да инсталирате све додатке које недостају и да се после тога пријавите на трекере да бисте их користили. +\nМораћете да инсталирате све додатке које недостају и да се после тога пријавите на пратиоце да бисте их користили. Сервиси који пружају побољшане услуге за одређене изворе. Наслов се аутоматски прати када га додате у колекцију. Помозите у превођењу Дели извештаје о паду @@ -535,7 +536,7 @@ Дозволи брисање забележених поглавља Искључене категорије Наслови у искљученим категоријама неће се преузимати иако су такође у укљученим категоријама. - Једносмерна синхронизација за ажурирање броја прочитаних поглавља у трекерима. За појединачно праћење наслова додирни дугме за њихово праћење. + Једносмерна синхронизација за ажурирање броја прочитаних поглавља у пратиоцима. За појединачно праћење наслова додирни дугме за њихово праћење. Подаци Инкогнито мод Омот је ажуриран @@ -556,11 +557,11 @@ Преузимање листе додатака није успело Испразни кеш меморију поглавља током покретања апликације Нема ништа за чишћење - Sa neporcitanim poglavljem(ima) + Прескочи уносе са непрочитаним поглављима Политика приватности Отказано На паузи - То није започето + Прескочи уносе који нису започети Прикажи наслов Помакни наслов на врх %1$d ажурирање није успело @@ -681,7 +682,7 @@ Низ корисничког агента не може бити празан Ресетуј подразумевани низ корисничког агента Праћени наслови - Трекери + Пратиоци Рангирање по узрасту Персонализовани омот Ресетуј подешавања читача по наслову @@ -708,7 +709,7 @@ Лиценцирано - Нема поглавља за приказ Има резултата Прескочено јер данас није очекивано издање - Изван очекиваног периода изласка + Предвиди очекивано време изласка Постави интервалу Интервали Такође уклони из %s @@ -729,4 +730,59 @@ Нема везе са интернетом HTTP %d, погледај веб сајт у WebView %s је недоступан + Релативне временске ознаке + „%1$s” уместо „%2$s” + Паметно ажурирање + Забљесни приликом листања + Смањује артефакте на е-инк екранима + Репозиторије екстензија + Место складиштења + Користи се за аутоматске резервне копије, преузимаље поглавља и локални извор. + Опозови поверење непознатим екстензијама + Оцена на пратиоцу + Аматерски преводилац + Ниједан аматерски преводилац није пронађен + Не укључуј аматерске преводиоце + Предвиђа се да ће нова поглавља изаћи за %1$s, проверава се сваких %2$s. + Ускоро + Доступно: %1$s / Укупно: %2$s + Немате додатих репозиторија. + Додај репозиторију + Избриши репозиторију + URL репозиторије + Додај додатне репозиторије у Михон. Треба да буде URL који се завршава са „index.min.json”. + Неисправан URL репозиторије + Да ли желиш да избришеш репозиторију „%s”? + Укључи и осетљива подешавања (нпр. токени за пријаву у пратиоце) + Изабери путању + Започни + Мораш да изабереш једну путању + Дозвола за обавештења + Дозвола за инсталацију апликација + Пресокочи + Следеће + За инсталирање екстензија. + За примање обавештења о ажурурању библиотеке и др. + Одобри + Добро дошли! + Водич за прво покретање + Користш %s први пут? Препоручујемо да погледаш водич за покретање + Поново инсталираш %s? + Избегни прекиде при дуготрајном ажурирању колекције, преузимању и обнављању резервне копије + Коришћење батерије у позадини + Хајде да обавимо нека подешавања. Ако желиш можеш их касније променити у подешавањима. + Није постављена локација за складиштење + Одабери путању у коју ће %1$s чувати преузимања поглавља, резервне копије и друго. +\n +\nПрепоручујемо коришћење засебне путање +\n +\nОдабрана путања: %2$s + Норд + Ажурураш са старије верзије и не знаш шта да изабереш? Потражи информације у водичу складиштења. + Водич складиштења + За инсталацију екстензија потребне су дозволе. Додирни овде за одобрење + Грешка: + Ова репозиторија већ постоји + Прилагођена учесталост ажурирања: + Отвори репозиторију \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/sv/plurals.xml b/i18n/src/commonMain/resources/MR/sv/plurals.xml index 1e7f8b937..976b04004 100644 --- a/i18n/src/commonMain/resources/MR/sv/plurals.xml +++ b/i18n/src/commonMain/resources/MR/sv/plurals.xml @@ -64,4 +64,8 @@ Nästa kapitel Nästa %d kapitel + + %d förråd + %d flera förråd + \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/sv/strings.xml b/i18n/src/commonMain/resources/MR/sv/strings.xml index b26fdcd89..c5baf79a6 100644 --- a/i18n/src/commonMain/resources/MR/sv/strings.xml +++ b/i18n/src/commonMain/resources/MR/sv/strings.xml @@ -445,7 +445,7 @@ Start datum Tryckzoner Kant - Kindle-ish + Kindle-lik L-formad Spåras Höger och Vänster @@ -616,7 +616,7 @@ Se dina nyligen uppdaterade biblioteket inlägg Widget är inte tillgänglig när applåset är aktiverat En uppdatering pågår redan - Multi + Flerspråkig Strängen för användaragent kan inte vara tom Är du säker\? Biblioteket uppdaterades senast: %s @@ -740,7 +740,7 @@ Återgå till standard Senaste automatiska säkerhetskopieringen: %s Inga scanlatorer hittades - Scanlator + Översättare Blinka vid sidbyte Lagringsanvändning Spårares betyg @@ -784,4 +784,18 @@ Osäker på vad du ska välja då du uppdaterar från en äldre version? Se lagerhanteringsguiden för mer information. Smart uppdatering Lagerhanteringsguide + Nord + Vill du ta bort förråd \"%s\"? + Återkalla tillförlitliga okända tillägg + Tilläggsförråd + Du har inga förråd inställda. + Lägg till förråd + Förråd URL + Lägg till ytterliga förråd till Mihon. Detta ska vara en URL som slutar med \"index.min.json\". + Detta förråd existerar redan! + Ta bort förråd + Ogiltig förråds URL + Öppenkällkods förråd + Snart + Anpassad uppdateringsfrekvens: \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/tr/strings.xml b/i18n/src/commonMain/resources/MR/tr/strings.xml index 6c29808df..d08383a88 100644 --- a/i18n/src/commonMain/resources/MR/tr/strings.xml +++ b/i18n/src/commonMain/resources/MR/tr/strings.xml @@ -1,7 +1,7 @@ Ad - Ulamlar + Kategoriler Kitaplık girdileri Bölümler İzleme @@ -544,7 +544,7 @@ Ayrıntılı günlük kaydı Ayrıntılı günlükleri sistem günlüğüne yaz (uygulama performansını düşürür) Yalnızca kablosuz ağda - Uyarı: Büyük toplu indirmeler kaynakların yavaşlamasına ve/veya Mihon\'yi engellemesine neden olabilir. Daha çok öğrenmek için dokunun. + Uyarı: Büyük toplu indirmeler kaynakların yavaşlamasına ve/veya Mihon\'u engellemesine neden olabilir. Daha çok öğrenmek için dokunun. 3 günde bir Tümünü güncelle Uygulama güncellemeleri @@ -755,11 +755,11 @@ Yukarı git Klasör seç Başlangıç rehberi - %s\'de yeni misiniz? Başlangıç rehberine göz atmanızı tavsiye ederiz. + %s\'da yeni misiniz? Başlangıç rehberine göz atmanızı tavsiye ederiz. Başlayın Bir klasör seçilmelidir Hoş geldiniz! - %s\'yi yeniden mi kuruyorsunuz? + %s\'u yeniden mi kuruyorsunuz? Atla Sonraki Önce bazı şeyleri ayarlayalım. Bunları daha sonra ayarlardan da değiştirebilirsiniz. @@ -785,7 +785,7 @@ Depolama kılavuzu Depo ekle Depo URL\'si - Mihon\'ye ek depolar ekleyin. Bu, \"index.min.json\" ile biten bir URL olmalıdır. + Mihon\'a ek depolar ekleyin. Bu, \"index.min.json\" ile biten bir URL olmalıdır. Bu depo zaten var! Depoyu sil Geçersiz depo URL\'si diff --git a/i18n/src/commonMain/resources/MR/uk/plurals.xml b/i18n/src/commonMain/resources/MR/uk/plurals.xml index ef8ddc586..ad4538677 100644 --- a/i18n/src/commonMain/resources/MR/uk/plurals.xml +++ b/i18n/src/commonMain/resources/MR/uk/plurals.xml @@ -95,4 +95,10 @@ %d днів %d днів + + %d репозиторій + %d репозиторії + %d репозиторіїв + %d репозиторіїв + \ No newline at end of file diff --git a/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml b/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml index 05fd2086b..c450be769 100644 --- a/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -288,7 +288,7 @@ 刷新 书架 废弃 - 此插件已被废弃,可能无法正常运行或导致应用发生故障,建议卸载 + 此插件已被废弃,可能无法正常运行或导致应用发生故障,建议卸载。 日期格式 全局更新 要退出 %1$s 吗? @@ -624,12 +624,12 @@ 你确定吗? 多语言 书架更新时间:%s - 即将从书架中删除“%s”。 + 即将从书架中删除“%s” 热门 未授予存储权限 已跳过,因为作品无需更新 搜索… - 哦豁 + 哦豁! %s 发生了意外错误。建议你反馈时提供崩溃日志。 重启应用 主题 • 日期格式 @@ -783,7 +783,7 @@ 尚未设置仓库 仓库网址 在 Mihon 中添加仓库,输入的网址结尾应为“index.min.json”。 - 如果你是从旧版更新而来,请选择之前使用的“Mihon”目录。 + 如果你是从旧版更新而来,可以查看存储指南了解详情。 存储指南 存储位置 选择文件夹 diff --git a/i18n/src/commonMain/resources/MR/zh-rTW/plurals.xml b/i18n/src/commonMain/resources/MR/zh-rTW/plurals.xml index 2169508f2..f3d9a6f0b 100644 --- a/i18n/src/commonMain/resources/MR/zh-rTW/plurals.xml +++ b/i18n/src/commonMain/resources/MR/zh-rTW/plurals.xml @@ -7,7 +7,7 @@ %d 個擴充套件可更新 - 剩餘 %1$s 本 + 剩餘 %1$s 項 共 %1$s 章 diff --git a/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml b/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml index 61e262fff..84b680379 100644 --- a/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml +++ b/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml @@ -180,7 +180,7 @@ 符合頁寬 符合頁高 原始大小 - 智慧型填充 + 智慧填充 縮放原點 自動 左邊 @@ -304,7 +304,7 @@ 立即 閒置時鎖定 上鎖應用程式 - 在切換應用程式時隱藏預覽,並禁止擷取螢幕畫面。 + 在切換應用程式時隱藏預覽,並禁止擷取螢幕畫面 防窺畫面 隱私 隱藏通知內容 @@ -594,11 +594,11 @@ 版本 語言 分級 - 未成清單 - 擱置清單 - 閱畢清單 - 願望清單 - 閱讀清單 + 已拋棄 + 擱置中 + 已完結 + 準備讀 + 閱讀中 僅透過非計量付費網路 無法開啟上次閱讀章節 自訂封面 @@ -784,13 +784,13 @@ 自訂更新頻率: 儲存庫網址 已有該儲存庫! - 智慧型更新 + 智慧更新 無效的儲存庫網址 將額外的擴充套件儲存庫新增至 Mihon。此處應填入一個結尾為「index.min.json」的網址。 確定要刪除「%s」儲存庫嗎? 刪除儲存庫 新增儲存庫 - 尚未新增任何儲存庫 + 尚未新增任何儲存庫。 擴充套件儲存庫 儲存空間指南 從舊版升級而不確定該如何選擇嗎?請參閱儲存空間指南以取得更多資訊。 diff --git a/presentation-core/build.gradle.kts b/presentation-core/build.gradle.kts index 31d10bdbd..cfae8ba2a 100644 --- a/presentation-core/build.gradle.kts +++ b/presentation-core/build.gradle.kts @@ -21,8 +21,8 @@ android { } dependencies { - api(project(":core")) - api(project(":i18n")) + api(projects.core.common) + api(projects.i18n) // Compose implementation(platform(compose.bom)) @@ -36,7 +36,6 @@ dependencies { debugImplementation(compose.ui.tooling) implementation(compose.ui.tooling.preview) implementation(compose.ui.util) - lintChecks(compose.lintchecks) implementation(kotlinx.immutables) } diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/AdaptiveSheet.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/AdaptiveSheet.kt index d36e2593f..568332ca7 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/AdaptiveSheet.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/AdaptiveSheet.kt @@ -3,6 +3,7 @@ package tachiyomi.presentation.core.components import androidx.activity.compose.BackHandler import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween +import androidx.compose.animation.rememberSplineBasedDecay import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.AnchoredDraggableState import androidx.compose.foundation.gestures.DraggableAnchors @@ -11,17 +12,14 @@ import androidx.compose.foundation.gestures.anchoredDraggable import androidx.compose.foundation.gestures.animateTo import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredWidthIn -import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.layout.widthIn -import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable @@ -113,12 +111,14 @@ fun AdaptiveSheet( } } } else { + val decayAnimationSpec = rememberSplineBasedDecay() val anchoredDraggableState = remember { AnchoredDraggableState( initialValue = 1, - animationSpec = sheetAnimationSpec, positionalThreshold = { with(density) { 56.dp.toPx() } }, velocityThreshold = { with(density) { 125.dp.toPx() } }, + snapAnimationSpec = sheetAnimationSpec, + decayAnimationSpec = decayAnimationSpec, ) } val internalOnDismissRequest = { @@ -177,10 +177,8 @@ fun AdaptiveSheet( orientation = Orientation.Vertical, enabled = enableSwipeDismiss, ) - .windowInsetsPadding( - WindowInsets.systemBars - .only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), - ), + .navigationBarsPadding() + .statusBarsPadding(), shape = MaterialTheme.shapes.extraLarge, tonalElevation = tonalElevation, content = { diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/Pager.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/Pager.kt index 521f988b8..fb3cbdf74 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/Pager.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/Pager.kt @@ -40,7 +40,7 @@ fun HorizontalPager( modifier = modifier, contentPadding = contentPadding, pageSize = pageSize, - beyondBoundsPageCount = beyondBoundsPageCount, + outOfBoundsPageCount = beyondBoundsPageCount, pageSpacing = pageSpacing, verticalAlignment = verticalAlignment, flingBehavior = PagerDefaults.flingBehavior( diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt index d29d44b88..abdf61c9f 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt @@ -43,9 +43,9 @@ import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.unit.dp import dev.icerock.moko.resources.StringResource -import tachiyomi.core.preference.Preference -import tachiyomi.core.preference.TriState -import tachiyomi.core.preference.toggle +import tachiyomi.core.common.preference.Preference +import tachiyomi.core.common.preference.TriState +import tachiyomi.core.common.preference.toggle import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.header diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Surface.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Surface.kt index 71866b61d..e472e5127 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Surface.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/Surface.kt @@ -6,7 +6,7 @@ import androidx.compose.foundation.border import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box -import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material.ripple import androidx.compose.material3.ColorScheme import androidx.compose.material3.LocalAbsoluteTonalElevation import androidx.compose.material3.LocalContentColor @@ -70,7 +70,7 @@ fun Surface( ) .combinedClickable( interactionSource = interactionSource, - indication = rememberRipple(), + indication = ripple(), enabled = enabled, role = Role.Button, onLongClick = onLongClick, diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/i18n/Localize.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/i18n/Localize.kt index 081281f7f..93013ba2b 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/i18n/Localize.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/i18n/Localize.kt @@ -5,8 +5,8 @@ import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.platform.LocalContext import dev.icerock.moko.resources.PluralsResource import dev.icerock.moko.resources.StringResource -import tachiyomi.core.i18n.pluralStringResource -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.pluralStringResource +import tachiyomi.core.common.i18n.stringResource @Composable @ReadOnlyComposable diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Preference.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Preference.kt index c68818927..4b7a5018a 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/util/Preference.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/util/Preference.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember -import tachiyomi.core.preference.Preference +import tachiyomi.core.common.preference.Preference @Composable fun Preference.collectAsState(): State { diff --git a/presentation-widget/build.gradle.kts b/presentation-widget/build.gradle.kts index b5124f50b..896979d98 100644 --- a/presentation-widget/build.gradle.kts +++ b/presentation-widget/build.gradle.kts @@ -21,13 +21,12 @@ android { } dependencies { - implementation(project(":core")) - implementation(project(":domain")) - implementation(project(":presentation-core")) - api(project(":i18n")) + implementation(projects.core.common) + implementation(projects.domain) + implementation(projects.presentationCore) + api(projects.i18n) implementation(compose.glance) - lintChecks(compose.lintchecks) implementation(kotlinx.immutables) diff --git a/presentation-widget/src/main/java/tachiyomi/presentation/widget/BaseUpdatesGridGlanceWidget.kt b/presentation-widget/src/main/java/tachiyomi/presentation/widget/BaseUpdatesGridGlanceWidget.kt index 76d84aee1..e4977bfd3 100644 --- a/presentation-widget/src/main/java/tachiyomi/presentation/widget/BaseUpdatesGridGlanceWidget.kt +++ b/presentation-widget/src/main/java/tachiyomi/presentation/widget/BaseUpdatesGridGlanceWidget.kt @@ -33,7 +33,7 @@ import eu.kanade.tachiyomi.util.system.dpToPx import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.map -import tachiyomi.core.util.lang.withIOContext +import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.manga.model.MangaCover import tachiyomi.domain.updates.interactor.GetUpdates import tachiyomi.domain.updates.model.UpdatesWithRelations diff --git a/presentation-widget/src/main/java/tachiyomi/presentation/widget/WidgetManager.kt b/presentation-widget/src/main/java/tachiyomi/presentation/widget/WidgetManager.kt index 285ba7b13..eda0ff0a1 100644 --- a/presentation-widget/src/main/java/tachiyomi/presentation/widget/WidgetManager.kt +++ b/presentation-widget/src/main/java/tachiyomi/presentation/widget/WidgetManager.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import logcat.LogPriority -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.updates.interactor.GetUpdates class WidgetManager( diff --git a/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/LockedWidget.kt b/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/LockedWidget.kt index 20096ccbf..afa422abf 100644 --- a/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/LockedWidget.kt +++ b/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/LockedWidget.kt @@ -15,7 +15,7 @@ import androidx.glance.text.Text import androidx.glance.text.TextAlign import androidx.glance.text.TextStyle import androidx.glance.unit.ColorProvider -import tachiyomi.core.Constants +import tachiyomi.core.common.Constants import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource diff --git a/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/UpdatesWidget.kt b/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/UpdatesWidget.kt index d31528170..e90e07983 100644 --- a/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/UpdatesWidget.kt +++ b/presentation-widget/src/main/java/tachiyomi/presentation/widget/components/UpdatesWidget.kt @@ -22,7 +22,7 @@ import androidx.glance.text.Text import androidx.glance.text.TextStyle import androidx.glance.unit.ColorProvider import kotlinx.collections.immutable.ImmutableList -import tachiyomi.core.Constants +import tachiyomi.core.common.Constants import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.widget.util.calculateRowAndColumnCount diff --git a/settings.gradle.kts b/settings.gradle.kts index 5aafcad34..b1a2a2dd5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,15 +35,17 @@ dependencyResolutionManagement { } } +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + rootProject.name = "Mihon" include(":app") -include(":i18n") -include(":source-api") -include(":core") -include(":macrobenchmark") +include(":core-metadata") +include(":core:common") include(":data") include(":domain") -include(":presentation-widget") +include(":i18n") +include(":macrobenchmark") include(":presentation-core") +include(":presentation-widget") +include(":source-api") include(":source-local") -include(":core-metadata") diff --git a/source-api/build.gradle.kts b/source-api/build.gradle.kts index f8c78fb19..209136e48 100644 --- a/source-api/build.gradle.kts +++ b/source-api/build.gradle.kts @@ -17,7 +17,7 @@ kotlin { } val androidMain by getting { dependencies { - implementation(project(":core")) + implementation(projects.core.common) api(libs.preferencektx) // Workaround for https://youtrack.jetbrains.com/issue/KT-57605 diff --git a/source-api/src/androidMain/kotlin/eu/kanade/tachiyomi/util/RxExtension.kt b/source-api/src/androidMain/kotlin/eu/kanade/tachiyomi/util/RxExtension.kt index 6938bb406..43fe01d83 100644 --- a/source-api/src/androidMain/kotlin/eu/kanade/tachiyomi/util/RxExtension.kt +++ b/source-api/src/androidMain/kotlin/eu/kanade/tachiyomi/util/RxExtension.kt @@ -1,6 +1,6 @@ package eu.kanade.tachiyomi.util import rx.Observable -import tachiyomi.core.util.lang.awaitSingle +import tachiyomi.core.common.util.lang.awaitSingle actual suspend fun Observable.awaitSingle(): T = awaitSingle() diff --git a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt index 937fa28a9..9be673541 100644 --- a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt +++ b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/CatalogueSource.kt @@ -3,7 +3,7 @@ package eu.kanade.tachiyomi.source import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import rx.Observable -import tachiyomi.core.util.lang.awaitSingle +import tachiyomi.core.common.util.lang.awaitSingle interface CatalogueSource : Source { diff --git a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/online/HttpSource.kt b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/online/HttpSource.kt index 3a079953b..7ffa538b5 100644 --- a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/online/HttpSource.kt +++ b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/online/HttpSource.kt @@ -16,7 +16,7 @@ import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response import rx.Observable -import tachiyomi.core.util.lang.awaitSingle +import tachiyomi.core.common.util.lang.awaitSingle import uy.kohesive.injekt.injectLazy import java.net.URI import java.net.URISyntaxException diff --git a/source-local/build.gradle.kts b/source-local/build.gradle.kts index 21f3eafa1..bc140fccd 100644 --- a/source-local/build.gradle.kts +++ b/source-local/build.gradle.kts @@ -8,8 +8,8 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - implementation(project(":source-api")) - api(project(":i18n")) + implementation(projects.sourceApi) + api(projects.i18n) implementation(libs.unifile) implementation(libs.junrar) @@ -18,11 +18,11 @@ kotlin { } val androidMain by getting { dependencies { - implementation(project(":core")) - implementation(project(":core-metadata")) + implementation(projects.core.common) + implementation(projects.coreMetadata) // Move ChapterRecognition to separate module? - implementation(project(":domain")) + implementation(projects.domain) implementation(kotlinx.bundles.serialization) } diff --git a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt index 80dd0fe9f..e5dba3740 100644 --- a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt +++ b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt @@ -20,19 +20,19 @@ import kotlinx.serialization.json.decodeFromStream import logcat.LogPriority import nl.adaptivity.xmlutil.AndroidXmlReader import nl.adaptivity.xmlutil.serialization.XML +import tachiyomi.core.common.i18n.stringResource import org.apache.commons.compress.archivers.sevenz.SevenZFile -import tachiyomi.core.i18n.stringResource import tachiyomi.core.metadata.comicinfo.COMIC_INFO_FILE import tachiyomi.core.metadata.comicinfo.ComicInfo import tachiyomi.core.metadata.comicinfo.copyFromComicInfo import tachiyomi.core.metadata.comicinfo.getComicInfo import tachiyomi.core.metadata.tachiyomi.MangaDetails -import tachiyomi.core.storage.UniFileTempFileManager -import tachiyomi.core.storage.extension -import tachiyomi.core.storage.nameWithoutExtension -import tachiyomi.core.util.lang.withIOContext -import tachiyomi.core.util.system.ImageUtil -import tachiyomi.core.util.system.logcat +import tachiyomi.core.common.storage.UniFileTempFileManager +import tachiyomi.core.common.storage.extension +import tachiyomi.core.common.storage.nameWithoutExtension +import tachiyomi.core.common.util.lang.withIOContext +import tachiyomi.core.common.util.system.ImageUtil +import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.chapter.service.ChapterRecognition import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR diff --git a/source-local/src/androidMain/kotlin/tachiyomi/source/local/filter/OrderBy.kt b/source-local/src/androidMain/kotlin/tachiyomi/source/local/filter/OrderBy.kt index 9be063b9a..956cceeee 100644 --- a/source-local/src/androidMain/kotlin/tachiyomi/source/local/filter/OrderBy.kt +++ b/source-local/src/androidMain/kotlin/tachiyomi/source/local/filter/OrderBy.kt @@ -2,7 +2,7 @@ package tachiyomi.source.local.filter import android.content.Context import eu.kanade.tachiyomi.source.model.Filter -import tachiyomi.core.i18n.stringResource +import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR sealed class OrderBy(context: Context, selection: Selection) : Filter.Sort( diff --git a/source-local/src/androidMain/kotlin/tachiyomi/source/local/image/LocalCoverManager.kt b/source-local/src/androidMain/kotlin/tachiyomi/source/local/image/LocalCoverManager.kt index 0f5a4c343..a54e3e7e4 100644 --- a/source-local/src/androidMain/kotlin/tachiyomi/source/local/image/LocalCoverManager.kt +++ b/source-local/src/androidMain/kotlin/tachiyomi/source/local/image/LocalCoverManager.kt @@ -4,8 +4,8 @@ import android.content.Context import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.storage.DiskUtil -import tachiyomi.core.storage.nameWithoutExtension -import tachiyomi.core.util.system.ImageUtil +import tachiyomi.core.common.storage.nameWithoutExtension +import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.source.local.io.LocalSourceFileSystem import java.io.InputStream diff --git a/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Archive.kt b/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Archive.kt index c83ddac9d..baf0be088 100644 --- a/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Archive.kt +++ b/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Archive.kt @@ -1,7 +1,7 @@ package tachiyomi.source.local.io import com.hippo.unifile.UniFile -import tachiyomi.core.storage.extension +import tachiyomi.core.common.storage.extension object Archive { diff --git a/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Format.kt b/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Format.kt index eb9cb5a3c..fb900aa54 100644 --- a/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Format.kt +++ b/source-local/src/commonMain/kotlin/tachiyomi/source/local/io/Format.kt @@ -1,7 +1,7 @@ package tachiyomi.source.local.io import com.hippo.unifile.UniFile -import tachiyomi.core.storage.extension +import tachiyomi.core.common.storage.extension sealed interface Format { data class Directory(val file: UniFile) : Format