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 [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
+
+
+
-[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