mirror of
https://github.com/mihonapp/mihon.git
synced 2024-11-14 22:42:49 +01:00
Compare commits
19 Commits
ac085b04ae
...
2a8111950a
Author | SHA1 | Date | |
---|---|---|---|
|
2a8111950a | ||
|
f507231a18 | ||
|
8e52cdce2a | ||
|
bc4a36ca01 | ||
|
082b9beeeb | ||
|
4bcba0503a | ||
|
cf33f250cc | ||
|
915a967151 | ||
|
9cc0c4e035 | ||
|
222e111806 | ||
|
8489b0dd8b | ||
|
88ed634978 | ||
|
32188f9f65 | ||
|
05efc4ebeb | ||
|
65bfa083f2 | ||
|
b8a9998bbd | ||
|
d736bec003 | ||
|
348b23a9fd | ||
|
121b2ec829 |
6
.github/ISSUE_TEMPLATE/config.yml
vendored
6
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -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
|
||||
|
2
.github/ISSUE_TEMPLATE/report_issue.yml
vendored
2
.github/ISSUE_TEMPLATE/report_issue.yml
vendored
@ -94,8 +94,6 @@ 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.16.1](https://github.com/mihonapp/mihon/releases/latest)**.
|
||||
|
2
.github/ISSUE_TEMPLATE/request_feature.yml
vendored
2
.github/ISSUE_TEMPLATE/request_feature.yml
vendored
@ -31,8 +31,6 @@ 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.16.1](https://github.com/mihonapp/mihon/releases/latest)**.
|
||||
required: true
|
||||
- label: I will fill out all of the requested information in this form.
|
||||
|
@ -22,8 +22,8 @@ android {
|
||||
defaultConfig {
|
||||
applicationId = "app.mihon"
|
||||
|
||||
versionCode = 2
|
||||
versionName = "0.16.1"
|
||||
versionCode = 3
|
||||
versionName = "0.16.2"
|
||||
|
||||
buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
|
||||
buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"")
|
||||
|
@ -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
|
||||
|
@ -19,10 +19,10 @@ 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
|
||||
@ -33,16 +33,14 @@ fun DbTrack.toDomainTrack(idRequired: Boolean = true): Track? {
|
||||
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,
|
||||
|
@ -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}"), "")
|
||||
|
@ -97,5 +97,5 @@ fun AdaptiveSheet(
|
||||
|
||||
private val dialogProperties = DialogProperties(
|
||||
usePlatformDefaultWidth = false,
|
||||
decorFitsSystemWindows = false,
|
||||
decorFitsSystemWindows = true,
|
||||
)
|
||||
|
@ -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(),
|
||||
|
@ -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
|
||||
|
@ -48,9 +48,9 @@ import tachiyomi.presentation.core.util.isScrolledToStart
|
||||
|
||||
@Composable
|
||||
fun TrackStatusSelector(
|
||||
selection: Int,
|
||||
onSelectionChange: (Int) -> Unit,
|
||||
selections: Map<Int, StringResource?>,
|
||||
selection: Long,
|
||||
onSelectionChange: (Long) -> Unit,
|
||||
selections: Map<Long, StringResource?>,
|
||||
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 = {},
|
||||
|
@ -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(),
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -384,7 +384,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
|
||||
private fun writeErrorFile(errors: List<Pair<Manga, String?>>): 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:
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -27,22 +27,22 @@ interface Tracker {
|
||||
@DrawableRes
|
||||
fun getLogo(): Int
|
||||
|
||||
fun getStatusList(): List<Int>
|
||||
fun getStatusList(): List<Long>
|
||||
|
||||
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<String>
|
||||
|
||||
// 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)
|
||||
|
||||
|
@ -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<Int> {
|
||||
override fun getStatusList(): List<Long> {
|
||||
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<String> {
|
||||
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()
|
||||
}
|
||||
}
|
||||
@ -192,7 +192,7 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker {
|
||||
} 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)
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ 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
|
||||
@ -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,
|
||||
)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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<Int> {
|
||||
override fun getStatusList(): List<Long> {
|
||||
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)
|
||||
|
@ -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
|
||||
@ -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<Collection>(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
|
||||
}
|
||||
|
@ -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<String?>? = 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? = "",
|
||||
)
|
||||
|
@ -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<Long> = 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<String> = 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
|
||||
|
@ -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<List<VolumeDto>>()
|
||||
}
|
||||
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<ChapterDto>().number!!.replace(",", ".").toFloat()
|
||||
return it.parseAs<ChapterDto>().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 {
|
||||
|
@ -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<Int> {
|
||||
override fun getStatusList(): List<Long> {
|
||||
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<String> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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<Long> = 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<String> = 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
|
||||
|
@ -67,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
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -19,11 +19,11 @@ 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..10)
|
||||
.flatMap { decimal ->
|
||||
@ -46,11 +46,11 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker
|
||||
|
||||
override fun getLogoColor(): Int = Color.rgb(146, 160, 173)
|
||||
|
||||
override fun getStatusList(): List<Int> {
|
||||
override fun getStatusList(): List<Long> {
|
||||
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
|
||||
@ -59,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<String> = SCORE_LIST
|
||||
|
||||
override fun indexToScore(index: Int): Float = if (index == 0) 0f else 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()
|
||||
|
||||
@ -88,7 +88,7 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker
|
||||
val (series, rating) = api.getSeriesListItem(track)
|
||||
track.copyFrom(series, rating)
|
||||
} catch (e: Exception) {
|
||||
track.score = 0f
|
||||
track.score = 0.0
|
||||
api.addSeriesToList(track, hasReadChapters)
|
||||
track
|
||||
}
|
||||
@ -108,7 +108,7 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker
|
||||
|
||||
private fun Track.copyFrom(item: ListItem, rating: Rating?): Track = apply {
|
||||
item.copyTo(this)
|
||||
score = rating?.rating ?: 0f
|
||||
score = rating?.rating ?: 0.0
|
||||
}
|
||||
|
||||
override suspend fun login(username: String, password: String) {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<Int> {
|
||||
override fun getStatusList(): List<Long> {
|
||||
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<String> = 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()
|
||||
}
|
||||
}
|
||||
@ -111,7 +111,7 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker {
|
||||
} 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))
|
||||
}
|
||||
|
@ -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
|
||||
@ -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<TrackSearch> {
|
||||
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<JsonObject>()
|
||||
.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 {
|
||||
|
@ -8,28 +8,26 @@ 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 == null) {
|
||||
throw IOException("No authentication token")
|
||||
throw IOException("MAL: User is not authenticated")
|
||||
}
|
||||
|
||||
// Add the authorization header to the original request
|
||||
@ -66,15 +64,16 @@ 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 {
|
||||
return runCatching {
|
||||
val oauthResponse = chain.proceed(MyAnimeListApi.refreshTokenRequest(oauth!!))
|
||||
|
||||
if (oauthResponse.code == 401) {
|
||||
myanimelist.setAuthExpired()
|
||||
}
|
||||
if (oauthResponse.isSuccessful) {
|
||||
with(json) { oauthResponse.parseAs<OAuth>() }
|
||||
} else {
|
||||
@ -82,11 +81,9 @@ class MyAnimeListInterceptor(private val myanimelist: MyAnimeList, private var t
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
if (newOauth.getOrNull() == null) {
|
||||
throw IOException("Failed to refresh the access token")
|
||||
}
|
||||
|
||||
return newOauth.getOrNull()!!
|
||||
.getOrNull()
|
||||
?: throw MALTokenExpired()
|
||||
}
|
||||
}
|
||||
|
||||
class MALTokenExpired : IOException("MAL: Login has expired")
|
||||
|
@ -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
|
||||
@ -79,7 +79,7 @@ class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker {
|
||||
} 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<Int> {
|
||||
override fun getStatusList(): List<Long> {
|
||||
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)
|
||||
|
||||
|
@ -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
|
||||
@ -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
|
||||
}
|
||||
|
@ -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<Long> = 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<String> = 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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
||||
|
@ -285,13 +285,13 @@ private data class TrackStatusSelectorScreen(
|
||||
private class Model(
|
||||
private val track: Track,
|
||||
private val tracker: Tracker,
|
||||
) : StateScreenModel<Model.State>(State(track.status.toInt())) {
|
||||
) : StateScreenModel<Model.State>(State(track.status)) {
|
||||
|
||||
fun getSelections(): Map<Int, StringResource?> {
|
||||
fun getSelections(): Map<Long, StringResource?> {
|
||||
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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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") }
|
||||
|
@ -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<Int> = (1..6).toList(),
|
||||
val valReadingStatus: Int = 1,
|
||||
val valRereadingStatus: Int = 1,
|
||||
val valCompletionStatus: Int = 2,
|
||||
val valStatuses: List<Long> = (1L..6L).toList(),
|
||||
val valReadingStatus: Long = 1L,
|
||||
val valRereadingStatus: Long = 1L,
|
||||
val valCompletionStatus: Long = 2L,
|
||||
val valScoreList: ImmutableList<String> = (0..10).map(Int::toString).toImmutableList(),
|
||||
val val10PointScore: Double = 5.4,
|
||||
val valSearchResults: List<TrackSearch> = listOf(),
|
||||
@ -34,29 +34,29 @@ data class DummyTracker(
|
||||
|
||||
override fun getLogo(): Int = valLogo
|
||||
|
||||
override fun getStatusList(): List<Int> = valStatuses
|
||||
override fun getStatusList(): List<Long> = 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<String> = 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(
|
||||
|
@ -1,4 +1,4 @@
|
||||
|
||||
import io.gitlab.arturbosch.detekt.Detekt
|
||||
import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask
|
||||
import org.gradle.accessors.dm.LibrariesForLibs
|
||||
|
||||
@ -29,7 +29,7 @@ detekt {
|
||||
baseline = file(baselineFile)
|
||||
}
|
||||
|
||||
tasks.withType<io.gitlab.arturbosch.detekt.Detekt>().configureEach {
|
||||
tasks.withType<Detekt>().configureEach {
|
||||
include(kotlinFiles)
|
||||
exclude(resourceFiles, buildFiles, generatedFiles, scriptsFiles)
|
||||
reports {
|
||||
@ -39,7 +39,7 @@ tasks.withType<io.gitlab.arturbosch.detekt.Detekt>().configureEach {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType<io.gitlab.arturbosch.detekt.Detekt>().configureEach {
|
||||
tasks.withType<Detekt>().configureEach {
|
||||
jvmTarget = JavaVersion.VERSION_17.toString()
|
||||
}
|
||||
tasks.withType<DetektCreateBaselineTask>().configureEach {
|
||||
|
@ -5,33 +5,21 @@
|
||||
<ID>ComplexCondition:MangaScreenModel.kt$MangaScreenModel$(selectedItem.selected && selected) || (!selectedItem.selected && !selected)</ID>
|
||||
<ID>ComplexCondition:ReaderNavigationOverlayView.kt$ReaderNavigationOverlayView$isVisible || (!showOnStart && firstLaunch) || navigation is DisabledNavigation</ID>
|
||||
<ID>ComplexCondition:ReaderPageImageView.kt$ReaderPageImageView$config != null && config!!.landscapeZoom && config!!.minimumScaleType == SCALE_TYPE_CENTER_INSIDE && sWidth > sHeight && scale == minScale</ID>
|
||||
<ID>ComposableFunctionName:Button.kt$@Composable fun TextButton( onClick: () -> Unit, modifier: Modifier = Modifier, onLongClick: (() -> Unit)? = null, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, elevation: ButtonElevation? = null, shape: Shape = M3ButtonDefaults.textShape, border: BorderStroke? = null, colors: ButtonColors = ButtonColors( containerColor = Color.Transparent, contentColor = MaterialTheme.colorScheme.primary, disabledContainerColor = Color.Transparent, disabledContentColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f), ), contentPadding: PaddingValues = M3ButtonDefaults.TextButtonContentPadding, content: @Composable RowScope.() -> Unit, )</ID>
|
||||
<ID>ComposableFunctionName:LibraryToolbar.kt$@Composable fun LibraryToolbar( 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?, )</ID>
|
||||
<ID>ComposableFunctionName:MangaCover.kt$MangaCover$@Composable operator fun invoke( data: Any?, modifier: Modifier = Modifier, contentDescription: String = "", shape: Shape = MaterialTheme.shapes.extraSmall, onClick: (() -> Unit)? = null, )</ID>
|
||||
<ID>ComposableFunctionName:TachiyomiTheme.kt$@Composable fun TachiyomiPreviewTheme( appTheme: AppTheme = AppTheme.DEFAULT, isAmoled: Boolean = false, content: @Composable () -> Unit, )</ID>
|
||||
<ID>ComposableParametersOrdering:AdaptiveSheet.kt$tonalElevation: Dp = 1.dp</ID>
|
||||
<ID>ComposableParametersOrdering:ChapterDownloadIndicator.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:ChapterSettingsDialog.kt$manga: Manga? = null</ID>
|
||||
<ID>ComposableParametersOrdering:CommonMangaItem.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:LazyColumnWithAction.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:LazyGrid.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:LazyLibraryGrid.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:LazyList.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:MangaInfoHeader.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:PermissionStep.kt$PermissionStep$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:PullRefresh.kt$positionalThreshold: Dp = 64.dp</ID>
|
||||
<ID>ComposableParametersOrdering:SettingsItems.kt$enabled: Boolean = true</ID>
|
||||
<ID>ComposableParametersOrdering:SettingsSearchScreen.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:SourcePreferencesScreen.kt$SourcePreferencesScreen$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:SwitchPreferenceWidget.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParametersOrdering:TrackingPreferenceWidget.kt$modifier: Modifier = Modifier</ID>
|
||||
<ID>ComposableParamOrder:ChapterSettingsDialog.kt$ChapterSettingsDialog</ID>
|
||||
<ID>ComposableParamOrder:LazyLibraryGrid.kt$LazyLibraryGrid</ID>
|
||||
<ID>ComposableParamOrder:SwitchPreferenceWidget.kt$SwitchPreferenceWidget</ID>
|
||||
<ID>ComposableParamOrder:TrackingPreferenceWidget.kt$TrackingPreferenceWidget</ID>
|
||||
<ID>ComposableParamOrder:TriStateListDialog.kt$TriStateListDialog</ID>
|
||||
<ID>CompositionLocalAllowlist:Navigator.kt$LocalBackPress</ID>
|
||||
<ID>CompositionLocalAllowlist:PreferenceItem.kt$LocalPreferenceHighlighted</ID>
|
||||
<ID>CompositionLocalAllowlist:PreferenceItem.kt$LocalPreferenceMinHeight</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val average_score: Int</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val image_url_lge: String</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val publishing_status: String</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val remote_id: Long</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val start_date_fuzzy: Long</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val title_user_pref: String</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val total_chapters: Int</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALManga$val total_chapters: Long</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val chapters_read: Int</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val completed_date_fuzzy: Long</ID>
|
||||
<ID>ConstructorParameterNaming:AnilistModels.kt$ALUserManga$val library_id: Long</ID>
|
||||
@ -177,26 +165,103 @@
|
||||
<ID>InstanceOfCheckForException:ReaderViewModel.kt$ReaderViewModel$e is CancellationException</ID>
|
||||
<ID>InstanceOfCheckForException:UncaughtExceptionInterceptor.kt$UncaughtExceptionInterceptor$e is IOException</ID>
|
||||
<ID>LargeClass:MangaScreenModel.kt$MangaScreenModel : StateScreenModel</ID>
|
||||
<ID>LongMethod:AboutScreen.kt$AboutScreen$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:AdaptiveSheet.kt$@Composable fun AdaptiveSheet( isTabletUi: Boolean, tonalElevation: Dp, enableSwipeDismiss: Boolean, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, content: @Composable () -> Unit, )</ID>
|
||||
<ID>LongMethod:AnilistApi.kt$AnilistApi$suspend fun findLibManga(track: Track, userid: Int): Track?</ID>
|
||||
<ID>LongMethod:AppBar.kt$@Composable fun AppBarActions( actions: ImmutableList<AppBar.AppBarAction>, )</ID>
|
||||
<ID>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() }, )</ID>
|
||||
<ID>LongMethod:AppModule.kt$AppModule$override fun InjektRegistrar.registerInjectables()</ID>
|
||||
<ID>LongMethod:AppThemePreferenceWidget.kt$@Composable fun AppThemePreviewItem( selected: Boolean, onClick: () -> Unit, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:BrowseSourceScreen.kt$BrowseSourceScreen$@Composable override fun Content()</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:Button.kt$ButtonElevation$@Composable private fun animateElevation( enabled: Boolean, interactionSource: InteractionSource, ): State<Dp></ID>
|
||||
<ID>LongMethod:CategoryDialogs.kt$@Composable fun ChangeCategoryDialog( initialSelection: ImmutableList<CheckboxState<Category>>, onDismissRequest: () -> Unit, onEditCategories: () -> Unit, onConfirm: (List<Long>, List<Long>) -> Unit, )</ID>
|
||||
<ID>LongMethod:ChapterDownloadIndicator.kt$@Composable private fun DownloadingIndicator( enabled: Boolean, downloadState: Download.State, downloadProgressProvider: () -> Int, onClick: (ChapterDownloadAction) -> Unit, modifier: Modifier = Modifier, )</ID>
|
||||
<ID>LongMethod:ChapterNavigator.kt$@Composable fun ChapterNavigator( isRtl: Boolean, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onSliderValueChange: (Int) -> Unit, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:ClearDatabaseScreen.kt$ClearDatabaseScreen$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:ColorFilterPage.kt$@Composable internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)</ID>
|
||||
<ID>LongMethod:CreateBackupScreen.kt$CreateBackupScreen$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:DomainModule.kt$DomainModule$override fun InjektRegistrar.registerInjectables()</ID>
|
||||
<ID>LongMethod:DownloadCache.kt$DownloadCache$private fun renewCache()</ID>
|
||||
<ID>LongMethod:DownloadQueueScreen.kt$DownloadQueueScreen$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:Downloader.kt$Downloader$private suspend fun downloadChapter(download: Download)</ID>
|
||||
<ID>LongMethod:EditTextPreferenceWidget.kt$@Composable fun EditTextPreferenceWidget( title: String, subtitle: String?, icon: ImageVector?, value: String, onConfirm: suspend (String) -> Boolean, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:ExtensionDetailsScreen.kt$@Composable private fun DetailsHeader( extension: Extension, onClickAgeRating: () -> Unit, onClickUninstall: () -> Unit, onClickAppInfo: (() -> Unit)?, )</ID>
|
||||
<ID>LongMethod:ExtensionLoader.kt$ExtensionLoader$private fun loadExtension(context: Context, extensionInfo: ExtensionInfo): LoadResult</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:ExtensionsScreen.kt$@Composable private fun ExtensionItemActions( extension: Extension, installStep: InstallStep, modifier: Modifier = Modifier, onClickItemCancel: (Extension) -> Unit = {}, onClickItemAction: (Extension) -> Unit = {}, onClickItemSecondaryAction: (Extension) -> Unit = {}, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:HomeScreen.kt$HomeScreen$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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>, )</ID>
|
||||
<ID>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)?, )</ID>
|
||||
<ID>LongMethod:LibraryScreenModel.kt$LibraryScreenModel$private fun LibraryMap.applySort( // Map<MangaId, List<Track>> trackMap: Map<Long, List<Track>>, ): LibraryMap</ID>
|
||||
<ID>LongMethod:LibraryScreenModel.kt$LibraryScreenModel$private suspend fun LibraryMap.applyFilters( trackMap: Map<Long, List<Track>>, loggedInTrackers: Map<Long, TriState>, ): LibraryMap</ID>
|
||||
<ID>LongMethod:LibrarySettingsDialog.kt$@Composable private fun ColumnScope.DisplayPage( screenModel: LibrarySettingsScreenModel, )</ID>
|
||||
<ID>LongMethod:LibrarySettingsDialog.kt$@Composable private fun ColumnScope.FilterPage( screenModel: LibrarySettingsScreenModel, )</ID>
|
||||
<ID>LongMethod:LibraryTab.kt$LibraryTab$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:LibraryUpdateJob.kt$LibraryUpdateJob$private suspend fun addMangaToQueue(categoryId: Long)</ID>
|
||||
<ID>LongMethod:LibraryUpdateJob.kt$LibraryUpdateJob$private suspend fun updateChapterList()</ID>
|
||||
<ID>LongMethod:MainActivity.kt$MainActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
|
||||
<ID>LongMethod:MainActivity.kt$MainActivity$private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean</ID>
|
||||
<ID>LongMethod:MangaBottomActionMenu.kt$@Composable fun LibraryBottomActionMenu( visible: Boolean, onChangeCategoryClicked: () -> Unit, onMarkAsReadClicked: () -> Unit, onMarkAsUnreadClicked: () -> Unit, onDownloadClicked: ((DownloadAction) -> Unit)?, onDeleteClicked: () -> Unit, modifier: Modifier = Modifier, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:MangaCoverDialog.kt$@Composable fun MangaCoverDialog( coverDataProvider: () -> Manga, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, )</ID>
|
||||
<ID>LongMethod:MangaDialogs.kt$@Composable fun SetIntervalDialog( interval: Int, nextUpdate: Instant?, onDismissRequest: () -> Unit, onValueChanged: ((Int) -> Unit)? = null, )</ID>
|
||||
<ID>LongMethod:MangaInfoHeader.kt$@Composable fun ExpandableMangaDescription( defaultExpandState: Boolean, description: String?, tagsProvider: () -> List<String>?, onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, modifier: Modifier = Modifier, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:MangaInfoHeader.kt$@Composable private fun MangaSummary( expandedDescription: String, shrunkDescription: String, expanded: Boolean, modifier: Modifier = Modifier, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:MangaScreen.kt$MangaScreen$@Composable override fun Content()</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:MigrateDialog.kt$@Composable internal fun MigrateDialog( oldManga: Manga, newManga: Manga, screenModel: MigrateDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, )</ID>
|
||||
<ID>LongMethod:MigrateDialog.kt$MigrateDialogScreenModel$private suspend fun migrateMangaInternal( oldSource: Source?, newSource: Source, oldManga: Manga, newManga: Manga, sourceChapters: List<SChapter>, replace: Boolean, flags: Int, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:Notifications.kt$Notifications$fun createChannels(context: Context)</ID>
|
||||
<ID>LongMethod:PreferenceItem.kt$@Composable internal fun PreferenceItem( item: Preference.PreferenceItem<*>, highlightKey: String?, )</ID>
|
||||
<ID>LongMethod:ReaderActivity.kt$ReaderActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
|
||||
<ID>LongMethod:ReaderActivity.kt$ReaderActivity$private fun initializeMenu()</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:ReadingModePage.kt$@Composable private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenModel)</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:ScanlatorFilterDialog.kt$@Composable fun ScanlatorFilterDialog( availableScanlators: Set<String>, excludedScanlators: Set<String>, onDismissRequest: () -> Unit, onConfirm: (Set<String>) -> Unit, )</ID>
|
||||
<ID>LongMethod:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$@Composable private fun getExtensionsGroup( basePreferences: BasePreferences, ): Preference.PreferenceGroup</ID>
|
||||
<ID>LongMethod:SettingsAdvancedScreen.kt$SettingsAdvancedScreen$@Composable private fun getNetworkGroup( networkPreferences: NetworkPreferences, ): Preference.PreferenceGroup</ID>
|
||||
<ID>LongMethod:SettingsDataScreen.kt$SettingsDataScreen$@Composable private fun getBackupAndRestoreGroup(backupPreferences: BackupPreferences): Preference.PreferenceGroup</ID>
|
||||
<ID>LongMethod:SettingsLibraryScreen.kt$SettingsLibraryScreen$@Composable private fun getGlobalUpdateGroup( allCategories: List<Category>, libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup</ID>
|
||||
<ID>LongMethod:SettingsMainScreen.kt$SettingsMainScreen$@Composable fun Content(twoPane: Boolean)</ID>
|
||||
<ID>LongMethod:SettingsReaderScreen.kt$SettingsReaderScreen$@Composable private fun getPagedGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup</ID>
|
||||
<ID>LongMethod:SettingsReaderScreen.kt$SettingsReaderScreen$@Composable private fun getWebtoonGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup</ID>
|
||||
<ID>LongMethod:SettingsSearchScreen.kt$@Composable private fun SearchResult( searchKey: String, modifier: Modifier = Modifier, listState: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(), onItemClick: (SearchResultItem) -> Unit, )</ID>
|
||||
<ID>LongMethod:SettingsSearchScreen.kt$SettingsSearchScreen$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:SettingsTrackingScreen.kt$SettingsTrackingScreen$@Composable override fun getPreferences(): List<Preference></ID>
|
||||
<ID>LongMethod:SettingsTrackingScreen.kt$SettingsTrackingScreen$@Composable private fun TrackingLoginDialog( tracker: Tracker, uNameStringRes: StringResource, onDismissRequest: () -> Unit, )</ID>
|
||||
<ID>LongMethod:SourceFilterDialog.kt$@Composable private fun FilterItem(filter: Filter<*>, onUpdate: () -> Unit)</ID>
|
||||
<ID>LongMethod:SourceSearchScreen.kt$SourceSearchScreen$@Composable override fun Content()</ID>
|
||||
<ID>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></ID>
|
||||
<ID>LongMethod:TrackInfoDialog.kt$TrackInfoDialogHomeScreen$@Composable override fun Content()</ID>
|
||||
<ID>LongMethod:TrackInfoDialog.kt$TrackerRemoveScreen$@Composable override fun Content()</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:TrackerSearch.kt$@Composable private fun SearchResultItem( trackSearch: TrackSearch, selected: Boolean, onClick: () -> Unit, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:UpdatesTab.kt$UpdatesTab$@Composable override fun Content()</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongMethod:UpdatesWidget.kt$@Composable fun UpdatesWidget( data: ImmutableList<Pair<Long, Bitmap?>>?, contentColor: ColorProvider, topPadding: Dp, bottomPadding: Dp, modifier: GlanceModifier = GlanceModifier, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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 = {}, )</ID>
|
||||
<ID>LongMethod:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>LongParameterList:BottomReaderBar.kt$( backgroundColor: Color, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, )</ID>
|
||||
<ID>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, )</ID>
|
||||
<ID>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, )</ID>
|
||||
@ -281,9 +346,9 @@
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$10f</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$18</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$20</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$20f</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$20.0</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$25</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$25f</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$25.0</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$35</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$5</ID>
|
||||
<ID>MagicNumber:Anilist.kt$Anilist$60</ID>
|
||||
@ -591,13 +656,14 @@
|
||||
<ID>MagicNumber:Tabs.kt$0.12f</ID>
|
||||
<ID>MagicNumber:TimeUtils.kt$4</ID>
|
||||
<ID>MagicNumber:TrackInfoDialog.kt$TrackChapterSelectorScreen.Model$10000</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$3</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$4</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$5</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$6</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$3L</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$4L</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$5L</ID>
|
||||
<ID>MagicNumber:TrackInfoDialogSelector.kt$6L</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$10</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$100</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$1000</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$1000L</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$100L</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$30</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$365</ID>
|
||||
<ID>MagicNumber:TrackerSearchPreviewProvider.kt$TrackerSearchPreviewProvider$40</ID>
|
||||
@ -660,23 +726,89 @@
|
||||
<ID>MaxLineLength:SpecificHostRateLimitInterceptor.kt$*</ID>
|
||||
<ID>MaxLineLength:WebViewUtil.kt$WebViewUtil$*</ID>
|
||||
<ID>MemberNameEqualsClassName:ExtensionInstaller.kt$ExtensionInstaller$private val extensionInstaller = Injekt.get<BasePreferences>().extensionInstaller()</ID>
|
||||
<ID>ModifierHeightWithText:CommonMangaItem.kt$height(56.dp)</ID>
|
||||
<ID>ModifierHeightWithText:TrackInfoDialogHome.kt$height(48.dp)</ID>
|
||||
<ID>ModifierParameterPosition:ChapterDownloadIndicator.kt$@Composable private fun DownloadedIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (ChapterDownloadAction) -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:ChapterDownloadIndicator.kt$@Composable private fun ErrorIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (ChapterDownloadAction) -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:ChapterDownloadIndicator.kt$@Composable private fun NotDownloadedIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (ChapterDownloadAction) -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:CommonMangaItem.kt$@Composable private fun ContinueReadingButton( modifier: Modifier = Modifier, onClickContinueReading: () -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:LazyColumnWithAction.kt$@Composable fun LazyColumnWithAction( contentPadding: PaddingValues, actionLabel: String, onClickAction: () -> Unit, modifier: Modifier = Modifier, actionEnabled: Boolean = true, content: LazyListScope.() -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:LazyGrid.kt$@Composable fun FastScrollLazyVerticalGrid( columns: GridCells, modifier: Modifier = Modifier, state: LazyGridState = rememberLazyGridState(), thumbAllowed: () -> Boolean = { true }, thumbColor: Color = MaterialTheme.colorScheme.primary, contentPadding: PaddingValues = PaddingValues(0.dp), topContentPadding: Dp = Dp.Hairline, bottomContentPadding: Dp = Dp.Hairline, endContentPadding: Dp = Dp.Hairline, reverseLayout: Boolean = false, verticalArrangement: Arrangement.Vertical = if (!reverseLayout) Arrangement.Top else Arrangement.Bottom, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, userScrollEnabled: Boolean = true, content: LazyGridScope.() -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:LazyLibraryGrid.kt$@Composable internal fun LazyLibraryGrid( modifier: Modifier = Modifier, columns: Int, contentPadding: PaddingValues, content: LazyGridScope.() -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:LazyList.kt$@Composable fun FastScrollLazyColumn( modifier: Modifier = Modifier, state: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(0.dp), reverseLayout: Boolean = false, verticalArrangement: Arrangement.Vertical = if (!reverseLayout) Arrangement.Top else Arrangement.Bottom, horizontalAlignment: Alignment.Horizontal = Alignment.Start, userScrollEnabled: Boolean = true, content: LazyListScope.() -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:LazyList.kt$@Composable fun ScrollbarLazyColumn( modifier: Modifier = Modifier, state: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(0.dp), reverseLayout: Boolean = false, verticalArrangement: Arrangement.Vertical = if (!reverseLayout) Arrangement.Top else Arrangement.Bottom, horizontalAlignment: Alignment.Horizontal = Alignment.Start, userScrollEnabled: Boolean = true, content: LazyListScope.() -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:MangaInfoHeader.kt$@Composable private fun TagsChip( text: String, modifier: Modifier = Modifier, onClick: () -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:PermissionStep.kt$PermissionStep$@Composable private fun PermissionItem( title: String, subtitle: String, granted: Boolean, modifier: Modifier = Modifier, onButtonClick: () -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:SettingsSearchScreen.kt$@Composable private fun SearchResult( searchKey: String, modifier: Modifier = Modifier, listState: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(), onItemClick: (SearchResultItem) -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:SourcePreferencesScreen.kt$SourcePreferencesScreen$@Composable private fun FragmentContainer( fragmentManager: FragmentManager, modifier: Modifier = Modifier, commit: FragmentTransaction.(containerId: Int) -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:SwitchPreferenceWidget.kt$@Composable fun SwitchPreferenceWidget( modifier: Modifier = Modifier, title: String, subtitle: String? = null, icon: ImageVector? = null, checked: Boolean = false, onCheckedChanged: (Boolean) -> Unit, )</ID>
|
||||
<ID>ModifierParameterPosition:TrackingPreferenceWidget.kt$@Composable fun TrackingPreferenceWidget( modifier: Modifier = Modifier, tracker: Tracker, checked: Boolean, onClick: (() -> Unit)? = null, )</ID>
|
||||
<ID>ModifierClickableOrder:ScanlatorFilterDialog.kt$clickable { if (isExcluded) { mutableExcludedScanlators.remove(scanlator) } else { mutableExcludedScanlators.add(scanlator) } }</ID>
|
||||
<ID>ModifierMissing:AppBar.kt$AppBarActions</ID>
|
||||
<ID>ModifierMissing:AppThemePreferenceWidget.kt$AppThemePreviewItem</ID>
|
||||
<ID>ModifierMissing:BottomReaderBar.kt$BottomReaderBar</ID>
|
||||
<ID>ModifierMissing:BrowseSourceComfortableGrid.kt$BrowseSourceComfortableGrid</ID>
|
||||
<ID>ModifierMissing:BrowseSourceCompactGrid.kt$BrowseSourceCompactGrid</ID>
|
||||
<ID>ModifierMissing:BrowseSourceList.kt$BrowseSourceList</ID>
|
||||
<ID>ModifierMissing:BrowseSourceScreen.kt$BrowseSourceContent</ID>
|
||||
<ID>ModifierMissing:BrowseSourceToolbar.kt$BrowseSourceToolbar</ID>
|
||||
<ID>ModifierMissing:CategoryScreen.kt$CategoryScreen</ID>
|
||||
<ID>ModifierMissing:ChapterNavigator.kt$ChapterNavigator</ID>
|
||||
<ID>ModifierMissing:ChapterSettingsDialog.kt$ChapterSettingsDialog</ID>
|
||||
<ID>ModifierMissing:ChapterSettingsDialog.kt$ScanlatorFilterItem</ID>
|
||||
<ID>ModifierMissing:CollapsibleBox.kt$CollapsibleBox</ID>
|
||||
<ID>ModifierMissing:CommonMangaItem.kt$MangaComfortableGridItem</ID>
|
||||
<ID>ModifierMissing:CommonMangaItem.kt$MangaCompactGridItem</ID>
|
||||
<ID>ModifierMissing:CommonMangaItem.kt$MangaListItem</ID>
|
||||
<ID>ModifierMissing:CrashScreen.kt$CrashScreen</ID>
|
||||
<ID>ModifierMissing:ExtensionDetailsScreen.kt$ExtensionDetailsScreen</ID>
|
||||
<ID>ModifierMissing:ExtensionFilterScreen.kt$ExtensionFilterScreen</ID>
|
||||
<ID>ModifierMissing:ExtensionReposScreen.kt$ExtensionReposScreen</ID>
|
||||
<ID>ModifierMissing:ExtensionsScreen.kt$ExtensionScreen</ID>
|
||||
<ID>ModifierMissing:GlobalSearchCardRow.kt$GlobalSearchCardRow</ID>
|
||||
<ID>ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchErrorResultItem</ID>
|
||||
<ID>ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchLoadingResultItem</ID>
|
||||
<ID>ModifierMissing:GlobalSearchResultItems.kt$GlobalSearchResultItem</ID>
|
||||
<ID>ModifierMissing:GlobalSearchScreen.kt$GlobalSearchScreen</ID>
|
||||
<ID>ModifierMissing:GlobalSearchToolbar.kt$GlobalSearchToolbar</ID>
|
||||
<ID>ModifierMissing:HistoryScreen.kt$HistoryScreen</ID>
|
||||
<ID>ModifierMissing:HomeScreen.kt$HomeScreen$NavigationRailItem</ID>
|
||||
<ID>ModifierMissing:InfoScreen.kt$InfoScreen</ID>
|
||||
<ID>ModifierMissing:LibraryContent.kt$LibraryContent</ID>
|
||||
<ID>ModifierMissing:LibraryPager.kt$LibraryPager</ID>
|
||||
<ID>ModifierMissing:LibrarySettingsDialog.kt$LibrarySettingsDialog</ID>
|
||||
<ID>ModifierMissing:LogoHeader.kt$LogoHeader</ID>
|
||||
<ID>ModifierMissing:MangaCoverDialog.kt$MangaCoverDialog</ID>
|
||||
<ID>ModifierMissing:MangaScreen.kt$MangaScreenLargeImpl</ID>
|
||||
<ID>ModifierMissing:MigrateMangaScreen.kt$MigrateMangaScreen</ID>
|
||||
<ID>ModifierMissing:MigrateSearchScreen.kt$MigrateSearchScreen</ID>
|
||||
<ID>ModifierMissing:MigrateSourceScreen.kt$MigrateSourceScreen</ID>
|
||||
<ID>ModifierMissing:ModeSelectionDialog.kt$ModeSelectionDialog</ID>
|
||||
<ID>ModifierMissing:MoreScreen.kt$MoreScreen</ID>
|
||||
<ID>ModifierMissing:NewUpdateScreen.kt$NewUpdateScreen</ID>
|
||||
<ID>ModifierMissing:OnboardingScreen.kt$OnboardingScreen</ID>
|
||||
<ID>ModifierMissing:PageIndicatorText.kt$PageIndicatorText</ID>
|
||||
<ID>ModifierMissing:PreferenceGroupHeader.kt$PreferenceGroupHeader</ID>
|
||||
<ID>ModifierMissing:PreferenceScaffold.kt$PreferenceScaffold</ID>
|
||||
<ID>ModifierMissing:ReaderAppBars.kt$ReaderAppBars</ID>
|
||||
<ID>ModifierMissing:ReaderPageActionsDialog.kt$ReaderPageActionsDialog</ID>
|
||||
<ID>ModifierMissing:ReaderSettingsDialog.kt$ReaderSettingsDialog</ID>
|
||||
<ID>ModifierMissing:SectionCard.kt$SectionCard</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$CheckboxItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$HeadingItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$IconItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$RadioItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$SelectItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$SettingsChipRow</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$SettingsIconGrid</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$SliderItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$SortItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$TextItem</ID>
|
||||
<ID>ModifierMissing:SettingsItems.kt$TriStateItem</ID>
|
||||
<ID>ModifierMissing:SettingsMainScreen.kt$SettingsMainScreen$Content</ID>
|
||||
<ID>ModifierMissing:SourceFilterDialog.kt$SourceFilterDialog</ID>
|
||||
<ID>ModifierMissing:SourcesFilterScreen.kt$SourcesFilterScreen</ID>
|
||||
<ID>ModifierMissing:SourcesScreen.kt$SourcesScreen</ID>
|
||||
<ID>ModifierMissing:StatsScreenContent.kt$StatsScreenContent</ID>
|
||||
<ID>ModifierMissing:TabbedScreen.kt$TabbedScreen</ID>
|
||||
<ID>ModifierMissing:Tabs.kt$TabText</ID>
|
||||
<ID>ModifierMissing:TrackInfoDialogHome.kt$TrackInfoDialogHome</ID>
|
||||
<ID>ModifierMissing:TrackInfoDialogSelector.kt$TrackChapterSelector</ID>
|
||||
<ID>ModifierMissing:TrackInfoDialogSelector.kt$TrackDateSelector</ID>
|
||||
<ID>ModifierMissing:TrackInfoDialogSelector.kt$TrackScoreSelector</ID>
|
||||
<ID>ModifierMissing:TrackInfoDialogSelector.kt$TrackStatusSelector</ID>
|
||||
<ID>ModifierMissing:TrackLogoIcon.kt$TrackLogoIcon</ID>
|
||||
<ID>ModifierMissing:TrackerSearch.kt$TrackerSearch</ID>
|
||||
<ID>ModifierMissing:UpdatesScreen.kt$UpdateScreen</ID>
|
||||
<ID>ModifierMissing:WebViewScreenContent.kt$WebViewScreenContent</ID>
|
||||
<ID>ModifierMissing:WheelPicker.kt$WheelPickerDefaults$Background</ID>
|
||||
<ID>ModifierMissing:WheelPicker.kt$WheelPickerDefaults$Item</ID>
|
||||
<ID>ModifierNotUsedAtRoot:DropdownMenu.kt$modifier = modifier</ID>
|
||||
<ID>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)</ID>
|
||||
<ID>ModifierNotUsedAtRoot:TrackingPreferenceWidget.kt$modifier = modifier .clickable(enabled = onClick != null, onClick = { onClick?.invoke() }) .fillMaxWidth() .padding(horizontal = PrefsHorizontalPadding, vertical = 8.dp)</ID>
|
||||
<ID>NestedBlockDepth:Anilist.kt$Anilist$override suspend fun update(track: Track, didReadChapter: Boolean): Track</ID>
|
||||
<ID>NestedBlockDepth:AppLanguageScreen.kt$AppLanguageScreen$private fun getLangs(context: Context): ImmutableList<Language></ID>
|
||||
<ID>NestedBlockDepth:BackupRestorer.kt$BackupRestorer$private fun writeErrorLog(): File</ID>
|
||||
@ -689,7 +821,7 @@
|
||||
<ID>NestedBlockDepth:ExtensionInstaller.kt$ExtensionInstaller$fun installApk(downloadId: Long, uri: Uri)</ID>
|
||||
<ID>NestedBlockDepth:ImageUtil.kt$ImageUtil$fun chooseBackground(context: Context, imageStream: InputStream): Drawable</ID>
|
||||
<ID>NestedBlockDepth:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String?</ID>
|
||||
<ID>NestedBlockDepth:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Float</ID>
|
||||
<ID>NestedBlockDepth:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Double</ID>
|
||||
<ID>NestedBlockDepth:Kitsu.kt$Kitsu$override suspend fun update(track: Track, didReadChapter: Boolean): Track</ID>
|
||||
<ID>NestedBlockDepth:LibraryUpdateJob.kt$LibraryUpdateJob$private fun writeErrorFile(errors: List<Pair<Manga, String?>>): File</ID>
|
||||
<ID>NestedBlockDepth:LocalSource.kt$LocalSource$private fun copyComicInfoFileFromArchive(chapterArchives: List<UniFile>, folderPath: String?): File?</ID>
|
||||
@ -700,8 +832,8 @@
|
||||
<ID>NestedBlockDepth:WebtoonRecyclerView.kt$WebtoonRecyclerView.Detector$override fun onTouchEvent(ev: MotionEvent): Boolean</ID>
|
||||
<ID>NewLineAtEndOfFile:Commands.kt$.Commands.kt</ID>
|
||||
<ID>NoConsecutiveBlankLines:LocalesConfigPlugin.kt$ </ID>
|
||||
<ID>PublicComposablePreview:Scrollbar.kt$@Preview(widthDp = 400, heightDp = 400, showBackground = true) @Composable fun LazyListScrollbarPreview()</ID>
|
||||
<ID>PublicComposablePreview:Scrollbar.kt$@Preview(widthDp = 400, showBackground = true) @Composable fun LazyListHorizontalScrollbarPreview()</ID>
|
||||
<ID>PreviewPublic:Scrollbar.kt$LazyListHorizontalScrollbarPreview</ID>
|
||||
<ID>PreviewPublic:Scrollbar.kt$LazyListScrollbarPreview</ID>
|
||||
<ID>RethrowCaughtException:LocalSource.kt$LocalSource$throw e</ID>
|
||||
<ID>ReturnCount:AndroidDatabaseHandler.kt$AndroidDatabaseHandler$private suspend fun <T> dispatch(inTransaction: Boolean, block: suspend Database.() -> T): T</ID>
|
||||
<ID>ReturnCount:AndroidSourceManager.kt$AndroidSourceManager$private suspend fun createStubSource(id: Long): StubSource</ID>
|
||||
@ -724,7 +856,7 @@
|
||||
<ID>ReturnCount:ImageUtil.kt$ImageUtil$fun isAnimatedAndSupported(stream: InputStream): Boolean</ID>
|
||||
<ID>ReturnCount:ImageUtil.kt$ImageUtil$fun splitTallImage(tmpDir: UniFile, imageFile: UniFile, filenamePrefix: String): Boolean</ID>
|
||||
<ID>ReturnCount:KavitaApi.kt$KavitaApi$fun getNewToken(apiUrl: String, apiKey: String): String?</ID>
|
||||
<ID>ReturnCount:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Float</ID>
|
||||
<ID>ReturnCount:KavitaApi.kt$KavitaApi$private fun getLatestChapterRead(url: String): Double</ID>
|
||||
<ID>ReturnCount:KitsuDateHelper.kt$KitsuDateHelper$fun parse(dateString: String?): Long</ID>
|
||||
<ID>ReturnCount:LibraryUpdateJob.kt$LibraryUpdateJob$override suspend fun doWork(): Result</ID>
|
||||
<ID>ReturnCount:LocalSource.kt$LocalSource$private fun copyComicInfoFileFromArchive(chapterArchives: List<UniFile>, folderPath: String?): File?</ID>
|
||||
@ -1097,6 +1229,34 @@
|
||||
<ID>TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val DEFAULT_RATE = 1f</ID>
|
||||
<ID>TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val MAX_SCALE_RATE = 3f</ID>
|
||||
<ID>TopLevelPropertyNaming:WebtoonRecyclerView.kt$private const val MIN_RATE = 0.5f</ID>
|
||||
<ID>UnstableCollections:CategoryScreen.kt$List<Category></ID>
|
||||
<ID>UnstableCollections:Commons.kt$List<Category></ID>
|
||||
<ID>UnstableCollections:Commons.kt$Set<String></ID>
|
||||
<ID>UnstableCollections:GlobalSearchCardRow.kt$List<Manga></ID>
|
||||
<ID>UnstableCollections:GlobalSearchScreen.kt$Map<CatalogueSource, SearchItemResult></ID>
|
||||
<ID>UnstableCollections:HistoryScreen.kt$List<HistoryUiModel></ID>
|
||||
<ID>UnstableCollections:LibraryComfortableGrid.kt$List<LibraryItem></ID>
|
||||
<ID>UnstableCollections:LibraryComfortableGrid.kt$List<LibraryManga></ID>
|
||||
<ID>UnstableCollections:LibraryCompactGrid.kt$List<LibraryItem></ID>
|
||||
<ID>UnstableCollections:LibraryCompactGrid.kt$List<LibraryManga></ID>
|
||||
<ID>UnstableCollections:LibraryContent.kt$List<Category></ID>
|
||||
<ID>UnstableCollections:LibraryContent.kt$List<LibraryManga></ID>
|
||||
<ID>UnstableCollections:LibraryList.kt$List<LibraryItem></ID>
|
||||
<ID>UnstableCollections:LibraryList.kt$List<LibraryManga></ID>
|
||||
<ID>UnstableCollections:LibraryPager.kt$List<LibraryManga></ID>
|
||||
<ID>UnstableCollections:LibraryTabs.kt$List<Category></ID>
|
||||
<ID>UnstableCollections:ListPreferenceWidget.kt$Map<out T, String></ID>
|
||||
<ID>UnstableCollections:MangaScreen.kt$List<ChapterList.Item></ID>
|
||||
<ID>UnstableCollections:MultiSelectListPreferenceWidget.kt$Set<String></ID>
|
||||
<ID>UnstableCollections:PreferenceScreen.kt$List<Preference></ID>
|
||||
<ID>UnstableCollections:ScanlatorFilterDialog.kt$Set<String></ID>
|
||||
<ID>UnstableCollections:SettingsDownloadScreen.kt$SettingsDownloadScreen$List<Category></ID>
|
||||
<ID>UnstableCollections:SettingsLibraryScreen.kt$SettingsLibraryScreen$List<Category></ID>
|
||||
<ID>UnstableCollections:TrackInfoDialogHome.kt$List<TrackItem></ID>
|
||||
<ID>UnstableCollections:TrackInfoDialogSelector.kt$Map<Long, StringResource?></ID>
|
||||
<ID>UnstableCollections:TriStateListDialog.kt$List<T></ID>
|
||||
<ID>UnstableCollections:UpdatesScreen.kt$List<UpdatesItem></ID>
|
||||
<ID>UnstableCollections:WebViewScreenContent.kt$Map<String, String></ID>
|
||||
<ID>UnusedParameter:UpdatesRepositoryImpl.kt$UpdatesRepositoryImpl$dateUpload: Long</ID>
|
||||
<ID>UnusedPrivateMember:AppThemePreferenceWidget.kt$@PreviewLightDark @Composable private fun AppThemesListPreview()</ID>
|
||||
<ID>UnusedPrivateMember:ChapterTransition.kt$@PreviewLightDark @Composable private fun TransitionTextLongTitlePreview()</ID>
|
||||
@ -1151,13 +1311,13 @@
|
||||
<ID>VariableNaming:SManga.kt$SManga$var thumbnail_url: String?</ID>
|
||||
<ID>VariableNaming:SManga.kt$SManga$var update_strategy: UpdateStrategy</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var finished_reading_date: Long</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var last_chapter_read: Float</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var last_chapter_read: Double</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var library_id: Long?</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var manga_id: Long</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var remote_id: Long</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var started_reading_date: Long</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var total_chapters: Int</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var tracker_id: Int</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var total_chapters: Long</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var tracker_id: Long</ID>
|
||||
<ID>VariableNaming:Track.kt$Track$var tracking_url: String</ID>
|
||||
<ID>VariableNaming:TrackSearch.kt$TrackSearch$var cover_url: String = ""</ID>
|
||||
<ID>VariableNaming:TrackSearch.kt$TrackSearch$var publishing_status: String = ""</ID>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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"
|
||||
|
||||
|
@ -23,4 +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" }
|
||||
|
||||
|
@ -9,7 +9,7 @@ sqldelight = "2.0.0"
|
||||
sqlite = "2.4.0"
|
||||
voyager = "1.0.0"
|
||||
detekt = "1.23.1"
|
||||
detektCompose = "1.3.0"
|
||||
detektCompose = "0.3.11"
|
||||
|
||||
[libraries]
|
||||
desugar = "com.android.tools:desugar_jdk_libs:2.0.4"
|
||||
@ -94,9 +94,10 @@ voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.
|
||||
voyager-screenmodel = { module = "cafe.adriel.voyager:voyager-screenmodel", version.ref = "voyager" }
|
||||
voyager-tab-navigator = { module = "cafe.adriel.voyager:voyager-tab-navigator", version.ref = "voyager" }
|
||||
voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" }
|
||||
|
||||
detekt-gradlePlugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" }
|
||||
detekt-rules-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" }
|
||||
detekt-rules-compose = { module = "ru.kode:detekt-rules-compose", version.ref = "detektCompose" }
|
||||
detekt-rules-compose = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" }
|
||||
|
||||
[bundles]
|
||||
okhttp = ["okhttp-core", "okhttp-logging", "okhttp-brotli", "okhttp-dnsoverhttps"]
|
||||
|
@ -128,4 +128,12 @@
|
||||
<item quantity="many">%d يومًا</item>
|
||||
<item quantity="other">%d يوم</item>
|
||||
</plurals>
|
||||
<plurals name="num_repos">
|
||||
<item quantity="zero">%d</item>
|
||||
<item quantity="one">مستودع</item>
|
||||
<item quantity="two">مستودعان</item>
|
||||
<item quantity="few">%d مستودعات</item>
|
||||
<item quantity="many">%d مستودعات</item>
|
||||
<item quantity="other"></item>
|
||||
</plurals>
|
||||
</resources>
|
@ -232,7 +232,7 @@
|
||||
<string name="label_extensions">الإضافات</string>
|
||||
<string name="label_extension_info">معلومات الإضافة</string>
|
||||
<string name="action_display_download_badge">الفصول المحملة</string>
|
||||
<string name="ext_update">تحديث</string>
|
||||
<string name="ext_update">حدث</string>
|
||||
<string name="ext_install">تثبيت</string>
|
||||
<string name="ext_pending">المُعلقة</string>
|
||||
<string name="ext_downloading">جارى التنزيل</string>
|
||||
@ -242,11 +242,9 @@
|
||||
<string name="ext_untrusted">غير موثوق فيه</string>
|
||||
<string name="ext_uninstall">إلغاء التثبيت</string>
|
||||
<string name="untrusted_extension">إضافة ذات ريبة</string>
|
||||
<string name="untrusted_extension_message">هذه اﻹضافة موقَّعة بشهادة ذات ريبة ولم تفعَّل.
|
||||
<string name="untrusted_extension_message">يمكن للملحقات الخبيثة قراءة أي بيانات اعتماد مخزنة لتسجيل الدخول أو تنفيذ تعليمات برمجية عشوائية.
|
||||
\n
|
||||
\nيمكن لأي إضافة خبيثة قراءة بيانات اعتماد تسجيل الدخول المخزَّنة أو تنفيذ تعليمات برمجية عشوائية.
|
||||
\n
|
||||
\nأنت تقبل هذه المخاطر إن وثقت بالشهادة.</string>
|
||||
\nمن خلال الوثوق بهذا الامتداد، فإنك تقبل هذه المخاطر.</string>
|
||||
<string name="pref_double_tap_anim_speed">سرعة مؤثر النقر المزدوج</string>
|
||||
<string name="pager_viewer">عارض الصفحات</string>
|
||||
<string name="double_tap_anim_speed_0">لا مؤثرات</string>
|
||||
@ -372,7 +370,7 @@
|
||||
<string name="label_data">البيانات</string>
|
||||
<string name="backup_restore_missing_sources">المصادر المفقودة:</string>
|
||||
<string name="invalid_backup_file_missing_manga">النسخة الإحتياطية لا تحتوي على أيّة إدخالات المكتبة.</string>
|
||||
<string name="invalid_backup_file">ملفُّ النسخ الاحتياطيِّ غير صالح</string>
|
||||
<string name="invalid_backup_file">ملف النسخ الاحتياطي غير صالح:</string>
|
||||
<string name="tracking_info">مزامنة أحادية تُحدِّث قراءة الفصول في المتتبعات الخارجية، ولك تعيين التتبِّع لكلِّ مدخلة على حدى، وذلك من زرِّ التتبع فيهم.</string>
|
||||
<string name="pref_library_update_refresh_metadata_summary">تحقق من وجود غلاف جديد وتفاصيل جديدة عند تحديث المكتبة</string>
|
||||
<string name="pref_library_update_refresh_metadata">تحديث البيانات الوصفية تلقائياً</string>
|
||||
@ -456,9 +454,7 @@
|
||||
<string name="action_order_by_upload_date">حسب تاريخ الرفع</string>
|
||||
<string name="action_order_by_chapter_number">حسب رقم الفصل</string>
|
||||
<string name="pref_dns_over_https">إستخدام DNS عبر HTTPS (DoH)</string>
|
||||
<string name="backup_restore_content_full">تم استيراد البيانات من ملف نسخ الاحتياطي.
|
||||
\n
|
||||
\nيتوجب تثبيت الإضافات المفقودة و تسجيل الدخول إلى منصات التعقب تالياً لاستعمالهم.</string>
|
||||
<string name="backup_restore_content_full">قد تحتاج إلى تثبيت أي إضافات مفقودة وتسجيل الدخول إلى خدمات التتبع بعد ذلك لاستخدامها.</string>
|
||||
<string name="nav_zone_right">يمين</string>
|
||||
<string name="nav_zone_left">يسار</string>
|
||||
<string name="nav_zone_next">التالي</string>
|
||||
@ -773,4 +769,33 @@
|
||||
\nوالأحسن أن يكون المجلَّد مخصوصًا لذلك.
|
||||
\n
|
||||
\nالمجلَّد المحدَّد: %2$s</string>
|
||||
<string name="onboarding_permission_install_apps">إذن تثبيت التطبيقات</string>
|
||||
<string name="onboarding_permission_install_apps_description">لتثبيت ملحقات المصدر.</string>
|
||||
<string name="onboarding_permission_notifications">إذن الإشعار</string>
|
||||
<string name="onboarding_permission_notifications_description">احصل على تنبيهات لتحديثات المكتبة والمزيد.</string>
|
||||
<string name="onboarding_permission_ignore_battery_opts">استخدام البطارية في الخلفية</string>
|
||||
<string name="onboarding_permission_action_grant">منح</string>
|
||||
<string name="ext_permission_install_apps_warning">الأذونات مطلوبة لتثبيت الإضافات. انقر هنا لمنحها.</string>
|
||||
<string name="ext_revoke_trust">إبطال الإضافات غير المعروفة الموثوق بها</string>
|
||||
<string name="label_extension_repos">مستودع الإضافات</string>
|
||||
<string name="label_add_repo_input">رابط المستودع</string>
|
||||
<string name="action_add_repo_message">إضافة مستودعات إضافية إلى ميهون. يجب أن يكون هذا الرابط ينتهي بـ \"index.min.json\".</string>
|
||||
<string name="error_repo_exists">هذا المستودع موجود بالفعل!</string>
|
||||
<string name="action_delete_repo">حذف المستودع</string>
|
||||
<string name="invalid_repo_name">رابط المستودع غير صالح</string>
|
||||
<string name="delete_repo_confirmation">هل ترغب في حذف \"1%s\" من المستودع؟</string>
|
||||
<string name="action_open_repo">مستودع مفتوح المصدر</string>
|
||||
<string name="invalid_backup_file_error">الخطأ الكامل:</string>
|
||||
<string name="private_settings">تضمين إعدادات حساسة (على سبيل المثال، رموز تسجيل دخول المتتبع)</string>
|
||||
<string name="manga_interval_expected_update_soon">قريباً</string>
|
||||
<string name="manga_interval_custom_amount">تكرار تحديث مخصص:</string>
|
||||
<string name="onboarding_storage_help_info">هل تقوم بالتحديث من إصدار أقدم ولست متأكداً مما تختاره؟ ارجع إلى دليل التخزين لمزيد من المعلومات.</string>
|
||||
<string name="onboarding_storage_help_action">دليل التخزين</string>
|
||||
<string name="onboarding_permission_ignore_battery_opts_description">تجنّب الانقطاعات في تحديثات المكتبة الطويلة الأمد والتنزيلات واستعادة النسخ الاحتياطية.</string>
|
||||
<string name="pref_library_update_smart_update">تحديث ذكي</string>
|
||||
<string name="theme_nord">Nord</string>
|
||||
<string name="information_empty_repos">لم يتم تعيين أي مستودع .</string>
|
||||
<string name="action_add_repo">إضافة مستودع</string>
|
||||
<string name="manga_interval_expected_update">من المتوقع أن يتم إصدار فصول جديدة في حوالي 1%1$s، والتحقق من كل 2%2$s .</string>
|
||||
<string name="available_disk_space_info">متاح: %1$s / الكل: %2$s</string>
|
||||
</resources>
|
@ -29,12 +29,12 @@
|
||||
<item quantity="other">Ҫӗнӗ сыпӑксем %d хайлав валли тупӑннӑ</item>
|
||||
</plurals>
|
||||
<plurals name="manga_num_chapters">
|
||||
<item quantity="one">1 сыпӑк</item>
|
||||
<item quantity="one">%1$s сыпӑк</item>
|
||||
<item quantity="other">%1$s сыпӑк</item>
|
||||
</plurals>
|
||||
<plurals name="download_queue_summary">
|
||||
<item quantity="one">1 юлчӗ</item>
|
||||
<item quantity="other">%1$s юлчӗ</item>
|
||||
<item quantity="one">%1$s йулчӗ</item>
|
||||
<item quantity="other">%1$s йулчӗ</item>
|
||||
</plurals>
|
||||
<plurals name="num_trackers">
|
||||
<item quantity="one">1 сӑнану</item>
|
||||
@ -48,4 +48,20 @@
|
||||
<item quantity="one">Ӗнер</item>
|
||||
<item quantity="other">%1$d кун кайалла</item>
|
||||
</plurals>
|
||||
<plurals name="next_unread_chapters">
|
||||
<item quantity="one">Тепӗр вуламан сыпӑк</item>
|
||||
<item quantity="other">Тепӗр %d вуламан сыпӑк</item>
|
||||
</plurals>
|
||||
<plurals name="day">
|
||||
<item quantity="one">1 кун</item>
|
||||
<item quantity="other">%d кун</item>
|
||||
</plurals>
|
||||
<plurals name="missing_chapters">
|
||||
<item quantity="one">%1$s сыпӑк ҫук</item>
|
||||
<item quantity="other">%1$s сыпӑк ҫук</item>
|
||||
</plurals>
|
||||
<plurals name="download_amount">
|
||||
<item quantity="one">Тепӗр сыпӑк</item>
|
||||
<item quantity="other">Тепӗр %d сыпӑк</item>
|
||||
</plurals>
|
||||
</resources>
|
@ -128,16 +128,16 @@
|
||||
<string name="fifth_to_last">Ab fünftletzt gelesenem Kapitel</string>
|
||||
<string name="pref_download_new">Neue Kapitel herunterladen</string>
|
||||
<string name="services">Tracker</string>
|
||||
<string name="pref_create_backup">Sicherung erstellen</string>
|
||||
<string name="pref_create_backup">Datensicherung erstellen</string>
|
||||
<string name="pref_create_backup_summ">Kann benutzt werden, um die aktuelle Bibliothek wiederherzustellen</string>
|
||||
<string name="pref_restore_backup">Sicherung wiederherstellen</string>
|
||||
<string name="pref_restore_backup">Datensicherung wiederherstellen</string>
|
||||
<string name="pref_restore_backup_summ">Bibliothek mit Hilfe einer Datensicherung wiederherstellen</string>
|
||||
<string name="pref_backup_interval">Automatische Sicherungshäufigkeit</string>
|
||||
<string name="backup_created">Sicherung erstellt</string>
|
||||
<string name="backup_created">Datensicherung erstellt</string>
|
||||
<string name="restore_completed">Wiederherstellen abgeschlossen</string>
|
||||
<string name="backup_choice">Was möchtest du sichern\?</string>
|
||||
<string name="restoring_backup">Sicherung wird wiederhergestellt</string>
|
||||
<string name="creating_backup">Sicherung wird erstellt</string>
|
||||
<string name="restoring_backup">Datensicherung wird wiederhergestellt</string>
|
||||
<string name="creating_backup">Datensicherung wird erstellt</string>
|
||||
<string name="pref_clear_chapter_cache">Kapitel-Zwischenspeicher leeren</string>
|
||||
<string name="used_cache">Belegt: %1$s</string>
|
||||
<string name="cache_deleted">Zwischenspeicher geleert, %1$d Dateien gelöscht</string>
|
||||
@ -351,11 +351,11 @@
|
||||
<string name="website">Webseite</string>
|
||||
<string name="label_downloaded_only">Nur Heruntergeladenes</string>
|
||||
<string name="recent_manga_time">Kap. %1$s - %2$s</string>
|
||||
<string name="restoring_backup_error">Sicherungswiederherstellung fehlgeschlagen</string>
|
||||
<string name="creating_backup_error">Sicherung fehlgeschlagen</string>
|
||||
<string name="restoring_backup_error">Datensicherungswiederherstellung fehlgeschlagen</string>
|
||||
<string name="creating_backup_error">Datensicherung fehlgeschlagen</string>
|
||||
<string name="restoring_backup_canceled">Wiederherstellung abgebrochen</string>
|
||||
<string name="restore_in_progress">Wiederherstellung wird bereits durchgeführt</string>
|
||||
<string name="backup_in_progress">Sicherung wird bereits durchgeführt</string>
|
||||
<string name="backup_in_progress">Datensicherung wird bereits durchgeführt</string>
|
||||
<string name="check_for_updates">Nach Aktualisierungen suchen</string>
|
||||
<string name="last_used_source">Zuletzt genutzt</string>
|
||||
<string name="local_source_help_guide">Anleitung für lokale Quellen</string>
|
||||
@ -371,7 +371,7 @@
|
||||
<string name="sort_by_upload_date">Nach Uploaddatum</string>
|
||||
<string name="label_data">Daten</string>
|
||||
<string name="backup_restore_missing_sources">Fehlende Quellen:</string>
|
||||
<string name="invalid_backup_file_missing_manga">Sicherung beinhaltet keinerlei Bibliothekseinträge.</string>
|
||||
<string name="invalid_backup_file_missing_manga">Datensicherung beinhaltet keinerlei Bibliothekseinträge.</string>
|
||||
<string name="invalid_backup_file">Ungültige Sicherungsdatei:</string>
|
||||
<string name="pref_library_update_refresh_metadata_summary">Auf neue Cover und Details überprüfen, wenn die Bibliothek aktualisiert wird</string>
|
||||
<string name="pref_library_update_refresh_metadata">Metadaten automatisch aktualisieren</string>
|
||||
@ -542,7 +542,7 @@
|
||||
<string name="action_display_language_badge">Sprache</string>
|
||||
<string name="label_warning">Warnung</string>
|
||||
<string name="notification_size_warning">Große Aktualisierungen schaden Quellen und könnten zu langsameren Aktualisierungen sowie höherem Akkuverbrauch führen. Tippe, um mehr zu erfahren.</string>
|
||||
<string name="backup_info">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.</string>
|
||||
<string name="backup_info">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.</string>
|
||||
<string name="connected_to_wifi">Nur über WLAN</string>
|
||||
<string name="update_72hour">Alle 3 Tage</string>
|
||||
<string name="download_queue_size_warning">Achtung: Große Downloads könnten dazu führen, dass Quellen langsamer werden und/oder Mihon blockieren. Tippe, um mehr zu erfahren.</string>
|
||||
@ -793,7 +793,7 @@
|
||||
<string name="label_add_repo_input">Repository-URL</string>
|
||||
<string name="action_add_repo_message">Füge zusätzliche Repositorys zu Mihon hinzu. Deren URL sollte mit „index.min.json“ enden.</string>
|
||||
<string name="invalid_repo_name">Ungültige Repository-URL</string>
|
||||
<string name="manga_interval_expected_update">Neue Kapitel vsl. in ca. %1$s, überprüfe ca. alle %2$s</string>
|
||||
<string name="manga_interval_expected_update">Ca. %1$s bis zur Veröffentlichung neuer Kapitel, wird ca. alle %2$s überprüft.</string>
|
||||
<string name="theme_nord">Nord</string>
|
||||
<string name="action_open_repo">Open-Source-Repository</string>
|
||||
<string name="manga_interval_expected_update_soon">Bald</string>
|
||||
|
@ -622,4 +622,40 @@
|
||||
<string name="updates_last_update_info">آخرین به روز رسانی کتابخانه: %s</string>
|
||||
<string name="pref_update_only_in_release_period">خارج از دوره انتشار موزد انتظار</string>
|
||||
<string name="pref_double_tap_zoom">برای بزرگ نمایی دوبار ضربه بزنید</string>
|
||||
<string name="action_filter_interval_custom">تناوب به روز رسانی شخسی سازی شده</string>
|
||||
<string name="onboarding_heading">خوش آمدید!</string>
|
||||
<string name="onboarding_description">بیاید برخی چیز ها را تنظیم کنیم. شما همیشه میتوانید این تنظیمات را در بخش تنظیمات تغییر دهید.</string>
|
||||
<string name="onboarding_action_next">بعدی</string>
|
||||
<string name="onboarding_permission_install_apps_description">برای نصب افزانه منبع.</string>
|
||||
<string name="onboarding_permission_notifications">دسترسی اعلان ها</string>
|
||||
<string name="onboarding_permission_notifications_description">برای به روز رسانی های کتابخانه و بیشتر مطلع شوید.</string>
|
||||
<string name="onboarding_permission_ignore_battery_opts">استفاده از باطری</string>
|
||||
<string name="onboarding_permission_ignore_battery_opts_description">از وقفه در به روز رسانی های کتاب خانه، بارگیری و پشتیبان گیری های طولانی اجتناب کنید.</string>
|
||||
<string name="onboarding_permission_action_grant">اعطا کردن</string>
|
||||
<string name="onboarding_guides_new_user">به %s نا آشنا هستید؟ ما پیشنهاد میکنیم تا یک سر به راهنمای شروع بزنید.</string>
|
||||
<string name="onboarding_guides_returning_user">نصب مجدد %s؟</string>
|
||||
<string name="pref_relative_format">زمان بندی های نسبی</string>
|
||||
<string name="pref_library_update_smart_update">به روز رسانی هوشمند</string>
|
||||
<string name="pref_chapter_swipe">کشیدن قسمت</string>
|
||||
<string name="ext_revoke_trust">لغو اعتماد افزونه های ناشناخته</string>
|
||||
<string name="label_extension_repos">مخازن افزونه ها</string>
|
||||
<string name="action_add_repo">اضافه کردن مخزن</string>
|
||||
<string name="label_add_repo_input">آدرس مخزن</string>
|
||||
<string name="error_repo_exists">این مخزن در حال حاضر وجود دارد!</string>
|
||||
<string name="action_delete_repo">حذف مخزن</string>
|
||||
<string name="invalid_repo_name">آدرس مخزن بی اعتبار است</string>
|
||||
<string name="delete_repo_confirmation">آشا شما میخواهید تا \"%s\" مخزن را حذف کنید؟</string>
|
||||
<string name="pref_page_rotate_invert">جهت چرخش صفحات گسترده را برعکس کن</string>
|
||||
<string name="no_location_set">مکان ذخیره سازی تنظیم نشده است</string>
|
||||
<string name="split_tall_images">عکس های بلند را تقسیم کن</string>
|
||||
<string name="track_activity_name">ورود به ناضر</string>
|
||||
<string name="pref_hide_in_library_items">اجرای داخل کتاب خانه را مخفی کن</string>
|
||||
<string name="pref_storage_location">محل زخیره سازی</string>
|
||||
<string name="onboarding_action_finish">شروع کنید</string>
|
||||
<string name="onboarding_action_skip">پرش</string>
|
||||
<string name="ext_permission_install_apps_warning">مجوز برای نصب افزونه ها لازم است. به اینجا ضربه بزنید تا اعطا کنید.</string>
|
||||
<string name="action_add_repo_message">به میهون مخازن اضافی اضافه کنید. این باید یک آدرس باشد که با \"index.min.json\" تمام شود.</string>
|
||||
<string name="information_empty_repos">شما هیچ مخزنی برای تنظیم ندارید.</string>
|
||||
<string name="action_open_repo">مخزن منبع باز</string>
|
||||
<string name="pref_flash_page_summ">مقدار رد باقی مانده در نمایش گر های E-ink کاهش میابد</string>
|
||||
</resources>
|
@ -72,7 +72,7 @@
|
||||
<string name="label_extensions">Laajennukset</string>
|
||||
<string name="label_extension_info">Laajennuksen tiedot</string>
|
||||
<string name="action_filter">Suodatus</string>
|
||||
<string name="action_filter_bookmarked">Kirjanmerkki</string>
|
||||
<string name="action_filter_bookmarked">Kirjanmerkityt</string>
|
||||
<string name="action_filter_unread">Lukemattomat</string>
|
||||
<string name="action_filter_empty">Poista suodattimet</string>
|
||||
<string name="action_sort_alpha">Aakkosjärjestyksessä</string>
|
||||
@ -103,7 +103,7 @@
|
||||
<string name="action_install">Asenna</string>
|
||||
<string name="action_share">Jaa</string>
|
||||
<string name="action_save">Tallenna</string>
|
||||
<string name="action_reset">Resetoi</string>
|
||||
<string name="action_reset">Nollaa</string>
|
||||
<string name="action_undo">Kumoa</string>
|
||||
<string name="action_open_log">Avaa loki</string>
|
||||
<string name="action_restore">Palauta</string>
|
||||
@ -447,7 +447,7 @@
|
||||
<string name="pref_dump_crash_logs_summary">Tallentaa virhelokit tiedostoon jaettavaksi kehittäjien kanssa</string>
|
||||
<string name="action_desc">Laskeva</string>
|
||||
<string name="action_asc">Nouseva</string>
|
||||
<string name="action_order_by_chapter_number">Luvunumeron mukaan</string>
|
||||
<string name="action_order_by_chapter_number">Lukunumeron mukaan</string>
|
||||
<string name="action_order_by_upload_date">Lisäyspäivämäärän mukaan</string>
|
||||
<string name="action_filter_tracked">Seuratut</string>
|
||||
<string name="action_display_show_number_of_items">Näytä kohteiden määrä</string>
|
||||
@ -615,4 +615,35 @@
|
||||
<string name="backup_info">Varmuuskopioita kannattaa säilyttää myös muissa paikoissa.</string>
|
||||
<string name="wish_list">Toivelista</string>
|
||||
<string name="cant_open_last_read_chapter">Viimeksi luettua lukua ei voitu avata</string>
|
||||
</resources>
|
||||
<string name="selected">Valitut</string>
|
||||
<string name="scanlator">Skanlaattori</string>
|
||||
<string name="label_data_storage">Data ja tallennustila</string>
|
||||
<string name="label_stats">Tilastotiedot</string>
|
||||
<string name="label_downloaded">Ladattu</string>
|
||||
<string name="action_sort_next_updated">Seuraava odotettu päivitys</string>
|
||||
<string name="action_sort_tracker_score">Seurannan pisteytys</string>
|
||||
<string name="action_update_category">Päivitä kategoria</string>
|
||||
<string name="action_sort_category">Järjestä kategoriat</string>
|
||||
<string name="action_display_show_continue_reading_button">Jatka lukemista painike</string>
|
||||
<string name="action_apply">Käytä</string>
|
||||
<string name="action_ok">OK</string>
|
||||
<string name="action_revert_to_default">Palauta oletus</string>
|
||||
<string name="crash_screen_description">%s kohtasi odottamattoman virheen. Ehdotamme että jaat kaatumisen lokitiedot tukikanavallemme Discordissa.</string>
|
||||
<string name="delete_downloaded">Poista ladatut</string>
|
||||
<string name="create_backup_file_error">Varmuuskopiotiedoston luonti epäonnistui</string>
|
||||
<string name="confirm_add_duplicate_manga">Kirjastossasi on jo samanniminen merkintä.
|
||||
\n
|
||||
\nHaluatko silti jatkaa?</string>
|
||||
<string name="crash_screen_title">Hupsista!</string>
|
||||
<string name="copied_to_clipboard_plain">Kopioitu leikepöydälle</string>
|
||||
<string name="crash_screen_restart_application">Uudelleenkäynnistä applikaatio</string>
|
||||
<string name="custom_cover">Mukautettu kansikuva</string>
|
||||
<string name="not_selected">Ei valitut</string>
|
||||
<string name="action_menu_overflow_description">Lisää asetuksia</string>
|
||||
<string name="label_local">Paikallinen</string>
|
||||
<string name="label_started">Aloitettu</string>
|
||||
<string name="action_open_random_manga">Avaa satunnainen merkintä</string>
|
||||
<string name="sort_category_confirmation">Haluatko järjestää kategoriat aakkosjärjestykseen?</string>
|
||||
<string name="action_copy_to_clipboard">Kopioi leikepöydälle</string>
|
||||
<string name="action_move_to_bottom_all_for_series">Siirrä sarja pohjimmaiseksi</string>
|
||||
</resources>
|
@ -728,7 +728,7 @@
|
||||
<string name="action_move_to_bottom_all_for_series">Pindahkan seri ke bawah</string>
|
||||
<string name="pref_relative_format">Penanda waktu</string>
|
||||
<string name="pref_relative_format_summary">\"%1$s\" seharusnya \"%2$s\"</string>
|
||||
<string name="action_sort_category">Mengurutkan kategori</string>
|
||||
<string name="action_sort_category">Urutkan kategori</string>
|
||||
<string name="notification_updating_progress">Memperbarui pustaka... (%s)</string>
|
||||
<string name="sort_category_confirmation">Apakah Anda ingin mengurutkan kategori menurut abjad\?</string>
|
||||
<string name="file_null_uri_error">Tidak ada file yang dipilih</string>
|
||||
|
@ -199,7 +199,7 @@
|
||||
<string name="update_weekly">Ogni settimana</string>
|
||||
<string name="default_category">Categoria predefinita</string>
|
||||
<string name="track">Tracking</string>
|
||||
<string name="pref_category_tracking">Tracking</string>
|
||||
<string name="pref_category_tracking">Tracciamento</string>
|
||||
<string name="default_category_summary">Chiedi sempre</string>
|
||||
<string name="pref_crop_borders">Ritaglia bordi</string>
|
||||
<string name="pref_read_with_volume_keys_inverted">Inverti i tasti del volume</string>
|
||||
@ -236,11 +236,9 @@
|
||||
<string name="ext_untrusted">Non attendibile</string>
|
||||
<string name="ext_uninstall">Disinstalla</string>
|
||||
<string name="untrusted_extension">Estensione non attendibile</string>
|
||||
<string name="untrusted_extension_message">Questa estensione è stata firmata con un certificato non attendibile e non è stata attivata.
|
||||
<string name="untrusted_extension_message">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.</string>
|
||||
\nFidandoti di questa estensione, accetti questi rischi.</string>
|
||||
<string name="pref_double_tap_anim_speed">Velocità animazioni doppio tocco</string>
|
||||
<string name="pager_viewer">Per pagina</string>
|
||||
<string name="double_tap_anim_speed_0">Senza animazione</string>
|
||||
@ -783,4 +781,23 @@
|
||||
<string name="private_settings">Includi impostazioni sensibili (es. token di login dei tracker)</string>
|
||||
<string name="onboarding_permission_action_grant">Consenti</string>
|
||||
<string name="exclude_scanlators">Escludi scanlator</string>
|
||||
<string name="onboarding_storage_help_action">Guida all\'archiviazione</string>
|
||||
<string name="label_extension_repos">Repository delle estensioni</string>
|
||||
<string name="action_add_repo">Aggiungi repository</string>
|
||||
<string name="label_add_repo_input">URL repository</string>
|
||||
<string name="error_repo_exists">Questa repository esiste già!</string>
|
||||
<string name="action_delete_repo">Elimina repository</string>
|
||||
<string name="invalid_repo_name">URL repository non valida</string>
|
||||
<string name="action_open_repo">Repository open source</string>
|
||||
<string name="manga_interval_expected_update_soon">Presto</string>
|
||||
<string name="manga_interval_custom_amount">Frequenza di aggiornamento personalizzata:</string>
|
||||
<string name="onboarding_storage_help_info">State aggiornando da una versione precedente e non siete sicuri di cosa selezionare? Per ulteriori informazioni, consultare la guida all\'archiviazione</string>
|
||||
<string name="theme_nord">Nord</string>
|
||||
<string name="pref_library_update_smart_update">Aggiornamento intelligente</string>
|
||||
<string name="ext_revoke_trust">Revoca le estensioni sconosciute affidabili</string>
|
||||
<string name="information_empty_repos">Non hai repository impostate.</string>
|
||||
<string name="action_add_repo_message">Aggiungi altri repository a Mihon. Questo dovrebbe essere un URL che termina con \"index.min.json\".</string>
|
||||
<string name="delete_repo_confirmation">Vuoi eleminare la repository \"%s\"?</string>
|
||||
<string name="invalid_backup_file_error">Errore completo:</string>
|
||||
<string name="manga_interval_expected_update">Si prevede che i nuovi capitoli saranno rilasciati tra circa %1$s, con controlli ogni %2$s.</string>
|
||||
</resources>
|
@ -500,7 +500,7 @@
|
||||
<string name="rotation_landscape">横向き</string>
|
||||
<string name="rotation_portrait">縦向き</string>
|
||||
<string name="pref_dark_theme_pure_black">真っ黒モード</string>
|
||||
<string name="theme_yotsuba">Yotsuba</string>
|
||||
<string name="theme_yotsuba">四つ葉</string>
|
||||
<string name="theme_yinyang">陰陽</string>
|
||||
<string name="theme_tako">Tako</string>
|
||||
<string name="theme_strawberrydaiquiri">ストロベリーダイキリ</string>
|
||||
@ -620,7 +620,7 @@
|
||||
<string name="theme_tidalwave">津波</string>
|
||||
<string name="download_ahead">事前ダウンロード</string>
|
||||
<string name="auto_download_while_reading">読書中に自動でダウンロード</string>
|
||||
<string name="download_ahead_info">現在のと次の章は既にダウンロード済みの場合のみ有効です</string>
|
||||
<string name="download_ahead_info">現在のと次の章は既にダウンロード済みの場合のみ有効です。</string>
|
||||
<string name="are_you_sure">本当に実行しますか?</string>
|
||||
<string name="multi_lang">多言語</string>
|
||||
<string name="updates_last_update_info">前回のライブラリ更新: %s</string>
|
||||
|
@ -210,7 +210,7 @@
|
||||
<string name="tapping_inverted_both">दुबै</string>
|
||||
<string name="pref_reader_actions">कार्यहरू</string>
|
||||
<string name="pref_read_with_long_tap">लामो ट्यापमा कार्यहरू देखाउनुहोस्</string>
|
||||
<string name="pref_reader_theme">पृष्ठभूमि रङ</string>
|
||||
<string name="pref_reader_theme">ब्याकग्राउण्ड रङ</string>
|
||||
<string name="gray_background">खैरो</string>
|
||||
<string name="black_background">कालो</string>
|
||||
<string name="automatic_background">स्वत</string>
|
||||
@ -595,7 +595,7 @@
|
||||
<string name="multi_lang">थुप्रै</string>
|
||||
<string name="pref_library_update_show_tab_badge">अपडेटहरू आइकनमा नपढिएको गणना देखाउनुहोस्</string>
|
||||
<string name="pref_skip_dupe_chapters">डुप्लिकेट अध्यायहरू छोड्नुहोस्</string>
|
||||
<string name="action_display_show_continue_reading_button">जारी राख्नुहोस् बटन</string>
|
||||
<string name="action_display_show_continue_reading_button">जारी राख्ने बटन</string>
|
||||
<string name="label_stats">तथ्याङ्क</string>
|
||||
<string name="label_started">सुरु गरिएको</string>
|
||||
<string name="label_local">लोकल</string>
|
||||
@ -705,7 +705,7 @@
|
||||
<string name="pref_double_tap_zoom">जूम गर्न डबल ट्याप गर्नुहोस्</string>
|
||||
<string name="pref_library_columns_per_row">%d प्रति पङ्क्ति</string>
|
||||
<string name="action_set_interval">अन्तराल सेट गर्नुहोस्</string>
|
||||
<string name="action_filter_interval_custom">कस्टम गरिएको ल्याउने अन्तराल</string>
|
||||
<string name="action_filter_interval_custom">कस्टम गरिएको अपडेट फ्रिक्वेन्सी</string>
|
||||
<string name="manga_display_modified_interval_title">प्रत्येक अपडेट गर्न सेट गर्नुहोस्</string>
|
||||
<string name="skipped_reason_not_in_release_period">छोडियो किनभने आज कुनै रिलीज अपेक्षित थिएन</string>
|
||||
<string name="intervals_header">अन्तरालहरू</string>
|
||||
@ -715,8 +715,8 @@
|
||||
<string name="track_delete_title">%s ट्र्याकिङ हटाउने हो\?</string>
|
||||
<string name="track_delete_remote_text">%s बाट पनि हटाउनुहोस्</string>
|
||||
<string name="track_delete_text">यसले लोकल रूपमा ट्र्याकिङ हटाउनेछ।</string>
|
||||
<string name="action_ok">ठीक छ</string>
|
||||
<string name="delete_downloaded">डाउनलोड गरिएको मेट्नुहोस्</string>
|
||||
<string name="action_ok">ठिक छ</string>
|
||||
<string name="delete_downloaded">डाउनलोड गरिएको हटाउनुहोस्</string>
|
||||
<string name="has_results">परिणामहरू भएको</string>
|
||||
<string name="library_sync_complete">पुस्तकालय सिङ्क सम्पन्न भयो</string>
|
||||
<string name="syncing_library">पुस्तकालय सिङ्क गर्दै</string>
|
||||
@ -745,11 +745,61 @@
|
||||
<string name="file_null_uri_error">फाइल पिकर एपमा फाइल फर्काउन असफल भयो</string>
|
||||
<string name="selected">चयन गरिएको</string>
|
||||
<string name="not_selected">चयन नगरिएको</string>
|
||||
<string name="action_sort_tracker_score">ट्र्याकर मुल्यन्कन</string>
|
||||
<string name="scanlator">स्क्यानलेतर</string>
|
||||
<string name="action_sort_tracker_score">ट्र्याकर मूल्याङ्कन</string>
|
||||
<string name="scanlator">स्क्यानलेटर</string>
|
||||
<string name="action_menu_overflow_description">अरु मेनु</string>
|
||||
<string name="onboarding_heading">स्वागत!</string>
|
||||
<string name="onboarding_heading">स्वागत छ!</string>
|
||||
<string name="onboarding_action_next">अर्को</string>
|
||||
<string name="onboarding_action_finish">सुरु</string>
|
||||
<string name="onboarding_action_skip">छोड</string>
|
||||
<string name="onboarding_storage_selection_required">एउटा फोल्डर चयन गर्नुपर्छ</string>
|
||||
<string name="onboarding_storage_help_action">भण्डारण गाइड</string>
|
||||
<string name="onboarding_permission_notifications">सूचना अनुमति</string>
|
||||
<string name="onboarding_permission_action_grant">प्रदान गर्नुहोस्</string>
|
||||
<string name="onboarding_guides_new_user">%s मा नयाँ हुनुहुन्छ? हामी स्टार्टिङ गाइड जाँच गर्न सिफारिस गर्छौं।</string>
|
||||
<string name="theme_nord">नोर्ड</string>
|
||||
<string name="pref_library_update_smart_update">स्मार्ट अपडेट</string>
|
||||
<string name="error_repo_exists">यो रिपो पहिले नै अवस्थित छ!</string>
|
||||
<string name="action_delete_repo">रिपो हटाउनुहोस्</string>
|
||||
<string name="invalid_repo_name">रिपो URL अवैध छ</string>
|
||||
<string name="action_bar_up_description">माथि नेभिगेट गर्नुहोस्</string>
|
||||
<string name="action_revert_to_default">पूर्वनिर्धारितमा फर्कनुहोस्</string>
|
||||
<string name="pref_onboarding_guide">अनबोर्डिङ गाइड</string>
|
||||
<string name="onboarding_description">पहिले केहि चीजहरू सेट गरौं। तपाईं पछि पनि सेटिङहरूमा गएर यसलाई परिवर्तन गर्न सक्नुहुन्छ।</string>
|
||||
<string name="onboarding_storage_info">एउटा फोल्डर चयन गर्नुहोस् जहाँ %1$s ले अध्याय डाउनलोड, ब्याकअप, र थप भण्डारण गर्नेछ।
|
||||
\n
|
||||
\nएक समर्पित फोल्डर सिफारिस गरिएको छ।
|
||||
\n
|
||||
\nचयन गरिएको फोल्डर: %2$s</string>
|
||||
<string name="onboarding_storage_action_select">फोल्डर चयन गर्नुहोस्</string>
|
||||
<string name="onboarding_permission_install_apps">एप स्थापना गर्ने अनुमति</string>
|
||||
<string name="onboarding_permission_install_apps_description">स्रोत एक्सटेन्शन स्थापना गर्न को लागि।</string>
|
||||
<string name="onboarding_permission_notifications_description">पुस्तकालय अपडेट र थपका लागि सूचना प्राप्त गर्नुहोस्।</string>
|
||||
<string name="onboarding_permission_ignore_battery_opts_description">लामो समयदेखि चलिरहेको पुस्तकालय अपडेटहरू, डाउनलोडहरू, र ब्याकअप रिस्टोरमा अवरोधहरू बेवास्ता गर्नुहोस्।</string>
|
||||
<string name="onboarding_storage_help_info">पुरानो संस्करणबाट अपडेट गर्दै र के चयन गर्ने निश्चित छैन? थप जानकारीको लागि भण्डारण गाइड हेर्नुहोस्।</string>
|
||||
<string name="onboarding_permission_ignore_battery_opts">ब्याकग्राउण्ड ब्याट्री प्रयोग</string>
|
||||
<string name="onboarding_guides_returning_user">%s पुन: स्थापना गर्दै हुनुहुन्छ?</string>
|
||||
<string name="ext_permission_install_apps_warning">एक्सटेन्शनहरू स्थापना गर्न अनुमति आवश्यक छ। प्रदान गर्न यहाँ ट्याप गर्नुहोस्।</string>
|
||||
<string name="ext_revoke_trust">विश्वसनीय अज्ञात एक्सटेन्शनहरू रद्द गर्नुहोस्</string>
|
||||
<string name="information_empty_repos">तपाईंले कुनै पनि रिपो सेट गर्नु भएको छैन।</string>
|
||||
<string name="label_add_repo_input">रिपो URL</string>
|
||||
<string name="label_extension_repos">एक्सटेन्शन रिपो</string>
|
||||
<string name="action_add_repo">रिपो थप्नुहोस्</string>
|
||||
<string name="action_add_repo_message">Mihon मा अतिरिक्त रिपो थप्नुहोस्। URL को अन्त्यमा \"index.min.json\" हुनुपर्छ।</string>
|
||||
<string name="action_apply">अप्लाई</string>
|
||||
<string name="delete_repo_confirmation">के तपाइँ रिपो \"%s\" हटाउन चाहनुहुन्छ?</string>
|
||||
<string name="action_open_repo">खुला स्रोत रिपो</string>
|
||||
<string name="pref_storage_location">भण्डारण स्थान</string>
|
||||
<string name="available_disk_space_info">उपलब्ध: %1$s / कुल: %2$s</string>
|
||||
<string name="manga_interval_expected_update">नयाँ अध्यायहरू लगभग %1$s मा रिलीज हुने भविष्यवाणी गरिएको छ, हरेक %2$s को वरिपरि जाँच गर्दै।</string>
|
||||
<string name="manga_interval_expected_update_soon">छिटै</string>
|
||||
<string name="manga_interval_custom_amount">कस्टम अपडेट फ्रिक्वेन्सी:</string>
|
||||
<string name="exclude_scanlators">स्क्यालेटरहरू समावेश नगर्नुहोस्</string>
|
||||
<string name="no_scanlators_found">कुनै स्क्यालेटर फेला परेन</string>
|
||||
<string name="pref_storage_usage">भण्डारण प्रयोग</string>
|
||||
<string name="no_location_set">कुनै भण्डारण स्थान सेट गरिएको छैन</string>
|
||||
<string name="pref_storage_location_info">स्वचालित ब्याकअप, अध्याय डाउनलोड, र स्थानीय स्रोतको लागि प्रयोग गरिन्छ।</string>
|
||||
<string name="action_create">सिर्जना गर्नुहोस्</string>
|
||||
<string name="invalid_backup_file_error">पूर्ण त्रुटि:</string>
|
||||
<string name="private_settings">संवेदनशील सेटिङहरू समावेश गर्नुहोस् (जस्तै, ट्र्याकर लगइन टोकनहरू)</string>
|
||||
</resources>
|
@ -745,4 +745,61 @@
|
||||
<string name="app_settings">Ustawienia aplikacji</string>
|
||||
<string name="action_delete_repo">Usuń repozytorium</string>
|
||||
<string name="action_add_repo">Dodaj repozytorium</string>
|
||||
<string name="selected">Zaznaczone</string>
|
||||
<string name="action_bar_up_description">Przewiń w górę</string>
|
||||
<string name="onboarding_action_finish">Zaczynajmy</string>
|
||||
<string name="onboarding_storage_help_action">Przewodnik po pamięci</string>
|
||||
<string name="onboarding_permission_install_apps">Zainstaluj uprawnienia aplikacji</string>
|
||||
<string name="onboarding_permission_install_apps_description">Do instalacji rozszerzeń.</string>
|
||||
<string name="onboarding_permission_action_grant">Zezwól</string>
|
||||
<string name="onboarding_guides_new_user">Pierwszy raz w %s? Zalecamy zapoznać się z poradnikiem.</string>
|
||||
<string name="onboarding_guides_returning_user">Ponowna instalacja %s?</string>
|
||||
<string name="label_extension_repos">Repozytoria rozszerzeń</string>
|
||||
<string name="label_add_repo_input">Link repozytorium</string>
|
||||
<string name="pref_storage_usage">Zużycie pamięci</string>
|
||||
<string name="manga_interval_custom_amount">Niestandardowa częstotliwość aktualizacji:</string>
|
||||
<string name="no_scanlators_found">Nie znaleziono skanlatorów</string>
|
||||
<string name="file_null_uri_error">Nie wybrano pliku</string>
|
||||
<string name="not_selected">Nie zaznaczone</string>
|
||||
<string name="action_sort_tracker_score">Serwisy śledzące</string>
|
||||
<string name="label_data_storage">Dane i pamięć</string>
|
||||
<string name="pref_onboarding_guide">Szybka konfiguracja</string>
|
||||
<string name="onboarding_permission_ignore_battery_opts_description">Unikaj przerywania długich operacji takich jak pobieranie rozdziałów, aktualizacje bibliotek lub przywracanie kopii zapasowej.</string>
|
||||
<string name="onboarding_permission_notifications_description">Otrzymuj powiadomienia ze swojej biblioteki i więcej.</string>
|
||||
<string name="theme_nord">Nord</string>
|
||||
<string name="pref_relative_format">Użyj dat względnych</string>
|
||||
<string name="pref_relative_format_summary">\"%1$s\" zamiast \"%2$s\"</string>
|
||||
<string name="pref_library_update_smart_update">Inteligentna aktualizacja</string>
|
||||
<string name="onboarding_description">Na początek ustawmy kilka rzeczy. Zawsze możesz je później zmienić w ustawieniach.</string>
|
||||
<string name="onboarding_storage_help_info">Aktualizujesz ze starszej wersji i nie jesteś pewien co wybrać? Zobacz na przewodnik po pamięci.</string>
|
||||
<string name="pref_update_only_in_release_period">Przewiduj następną aktualizację</string>
|
||||
<string name="ext_permission_install_apps_warning">Uprawnienia są wymagane aby zainstalować rozszerzenia. Kliknij tutaj aby je przyznać.</string>
|
||||
<string name="onboarding_storage_info">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</string>
|
||||
<string name="ext_revoke_trust">Unieważnij zaufanie nieznanym rozszerzeniom</string>
|
||||
<string name="information_empty_repos">Nie masz ustawionych repozytoriów.</string>
|
||||
<string name="action_add_repo_message">Dodaj repozytoria do Mihon. Powinien to być link z końcówką \"index.min.json\".</string>
|
||||
<string name="error_repo_exists">To repozytorium jest już dodane!</string>
|
||||
<string name="delete_repo_confirmation">Na pewno chcesz usunąć repozytorium \"%s\"?</string>
|
||||
<string name="action_open_repo">Repozytorium open source</string>
|
||||
<string name="pref_flash_page_summ">Redukuje ghosting na wyświetlaczach e-ink</string>
|
||||
<string name="no_location_set">Brak ustawionej ścieżki pamięci</string>
|
||||
<string name="pref_storage_location">Miejsce przechowywania danych</string>
|
||||
<string name="pref_storage_location_info">Używane do automatycznych kopii zapasowych, pobierania rozdziałów i lokalnych źródeł.</string>
|
||||
<string name="invalid_backup_file_error">Pełny błąd:</string>
|
||||
<string name="track_activity_name">Login serwisu śledzącego</string>
|
||||
<string name="action_create">Utwórz</string>
|
||||
<string name="pref_flash_page">Włącz przerwy między stronami</string>
|
||||
<string name="private_settings">Dołącz wrażliwe ustawienia (np. tokeny serwisu śledzącego)</string>
|
||||
<string name="last_auto_backup_info">Ostatnia automatyczna kopia zapasowa: %s</string>
|
||||
<string name="has_results">Ma wyniki</string>
|
||||
<string name="manga_display_interval_title">Oszacuj co</string>
|
||||
<string name="available_disk_space_info">Wolne: %1$s / Ogółem: %2$s</string>
|
||||
<string name="manga_interval_expected_update_soon">Wkrótce</string>
|
||||
<string name="licensed_manga_chapters_error">Licencjonowany - Brak rozdziałów</string>
|
||||
<string name="skipped_reason_not_in_release_period">Pominięto, ponieważ nie spodziewano się dzisiaj żadnej publikacji</string>
|
||||
<string name="exclude_scanlators">Wyklucz skanlatorów</string>
|
||||
</resources>
|
@ -64,4 +64,8 @@
|
||||
<item quantity="one">Nästa kapitel</item>
|
||||
<item quantity="other">Nästa %d kapitel</item>
|
||||
</plurals>
|
||||
<plurals name="num_repos">
|
||||
<item quantity="one">%d förråd</item>
|
||||
<item quantity="other">%d flera förråd</item>
|
||||
</plurals>
|
||||
</resources>
|
@ -445,7 +445,7 @@
|
||||
<string name="track_started_reading_date">Start datum</string>
|
||||
<string name="pref_viewer_nav">Tryckzoner</string>
|
||||
<string name="edge_nav">Kant</string>
|
||||
<string name="kindlish_nav">Kindle-ish</string>
|
||||
<string name="kindlish_nav">Kindle-lik</string>
|
||||
<string name="l_nav">L-formad</string>
|
||||
<string name="action_filter_tracked">Spåras</string>
|
||||
<string name="right_and_left_nav">Höger och Vänster</string>
|
||||
@ -616,7 +616,7 @@
|
||||
<string name="appwidget_updates_description">Se dina nyligen uppdaterade biblioteket inlägg</string>
|
||||
<string name="appwidget_unavailable_locked">Widget är inte tillgänglig när applåset är aktiverat</string>
|
||||
<string name="update_already_running">En uppdatering pågår redan</string>
|
||||
<string name="multi_lang">Multi</string>
|
||||
<string name="multi_lang">Flerspråkig</string>
|
||||
<string name="error_user_agent_string_blank">Strängen för användaragent kan inte vara tom</string>
|
||||
<string name="are_you_sure">Är du säker\?</string>
|
||||
<string name="updates_last_update_info">Biblioteket uppdaterades senast: %s</string>
|
||||
@ -740,7 +740,7 @@
|
||||
<string name="action_revert_to_default">Återgå till standard</string>
|
||||
<string name="last_auto_backup_info">Senaste automatiska säkerhetskopieringen: %s</string>
|
||||
<string name="no_scanlators_found">Inga scanlatorer hittades</string>
|
||||
<string name="scanlator">Scanlator</string>
|
||||
<string name="scanlator">Översättare</string>
|
||||
<string name="pref_flash_page">Blinka vid sidbyte</string>
|
||||
<string name="pref_storage_usage">Lagringsanvändning</string>
|
||||
<string name="action_sort_tracker_score">Spårares betyg</string>
|
||||
@ -784,4 +784,18 @@
|
||||
<string name="onboarding_storage_help_info">Osäker på vad du ska välja då du uppdaterar från en äldre version? Se lagerhanteringsguiden för mer information.</string>
|
||||
<string name="pref_library_update_smart_update">Smart uppdatering</string>
|
||||
<string name="onboarding_storage_help_action">Lagerhanteringsguide</string>
|
||||
<string name="theme_nord">Nord</string>
|
||||
<string name="delete_repo_confirmation">Vill du ta bort förråd \"%s\"?</string>
|
||||
<string name="ext_revoke_trust">Återkalla tillförlitliga okända tillägg</string>
|
||||
<string name="label_extension_repos">Tilläggsförråd</string>
|
||||
<string name="information_empty_repos">Du har inga förråd inställda.</string>
|
||||
<string name="action_add_repo">Lägg till förråd</string>
|
||||
<string name="label_add_repo_input">Förråd URL</string>
|
||||
<string name="action_add_repo_message">Lägg till ytterliga förråd till Mihon. Detta ska vara en URL som slutar med \"index.min.json\".</string>
|
||||
<string name="error_repo_exists">Detta förråd existerar redan!</string>
|
||||
<string name="action_delete_repo">Ta bort förråd</string>
|
||||
<string name="invalid_repo_name">Ogiltig förråds URL</string>
|
||||
<string name="action_open_repo">Öppenkällkods förråd</string>
|
||||
<string name="manga_interval_expected_update_soon">Snart</string>
|
||||
<string name="manga_interval_custom_amount">Anpassad uppdateringsfrekvens:</string>
|
||||
</resources>
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="name">Ad</string>
|
||||
<string name="categories">Ulamlar</string>
|
||||
<string name="categories">Kategoriler</string>
|
||||
<string name="manga">Kitaplık girdileri</string>
|
||||
<string name="chapters">Bölümler</string>
|
||||
<string name="track">İzleme</string>
|
||||
@ -798,4 +798,4 @@
|
||||
<string name="ext_revoke_trust">Güvenilen bilinmeyen uzantıları iptal et</string>
|
||||
<string name="manga_interval_expected_update_soon">Yakında</string>
|
||||
<string name="action_open_repo">Açık kaynaklı depo</string>
|
||||
</resources>
|
||||
</resources>
|
@ -95,4 +95,10 @@
|
||||
<item quantity="many">%d днів</item>
|
||||
<item quantity="other">%d днів</item>
|
||||
</plurals>
|
||||
<plurals name="num_repos">
|
||||
<item quantity="one">%d репозиторій</item>
|
||||
<item quantity="few">%d репозиторії</item>
|
||||
<item quantity="many">%d репозиторіїв</item>
|
||||
<item quantity="other">%d репозиторіїв</item>
|
||||
</plurals>
|
||||
</resources>
|
@ -288,7 +288,7 @@
|
||||
<string name="action_webview_refresh">刷新</string>
|
||||
<string name="pref_category_library">书架</string>
|
||||
<string name="ext_obsolete">废弃</string>
|
||||
<string name="obsolete_extension_message">此插件已被废弃,可能无法正常运行或导致应用发生故障,建议卸载</string>
|
||||
<string name="obsolete_extension_message">此插件已被废弃,可能无法正常运行或导致应用发生故障,建议卸载。</string>
|
||||
<string name="pref_date_format">日期格式</string>
|
||||
<string name="pref_category_library_update">全局更新</string>
|
||||
<string name="logout_title">要退出 %1$s 吗?</string>
|
||||
@ -624,12 +624,12 @@
|
||||
<string name="are_you_sure">你确定吗?</string>
|
||||
<string name="multi_lang">多语言</string>
|
||||
<string name="updates_last_update_info">书架更新时间:%s</string>
|
||||
<string name="remove_manga">即将从书架中删除“%s”。</string>
|
||||
<string name="remove_manga">即将从书架中删除“%s”</string>
|
||||
<string name="popular">热门</string>
|
||||
<string name="missing_storage_permission">未授予存储权限</string>
|
||||
<string name="skipped_reason_not_always_update">已跳过,因为作品无需更新</string>
|
||||
<string name="action_search_hint">搜索…</string>
|
||||
<string name="crash_screen_title">哦豁</string>
|
||||
<string name="crash_screen_title">哦豁!</string>
|
||||
<string name="crash_screen_description">%s 发生了意外错误。建议你反馈时提供崩溃日志。</string>
|
||||
<string name="crash_screen_restart_application">重启应用</string>
|
||||
<string name="pref_appearance_summary">主题 • 日期格式</string>
|
||||
@ -783,7 +783,7 @@
|
||||
<string name="information_empty_repos">尚未设置仓库</string>
|
||||
<string name="label_add_repo_input">仓库网址</string>
|
||||
<string name="action_add_repo_message">在 Mihon 中添加仓库,输入的网址结尾应为“index.min.json”。</string>
|
||||
<string name="onboarding_storage_help_info">如果你是从旧版更新而来,请选择之前使用的“Mihon”目录。</string>
|
||||
<string name="onboarding_storage_help_info">如果你是从旧版更新而来,可以查看存储指南了解详情。</string>
|
||||
<string name="onboarding_storage_help_action">存储指南</string>
|
||||
<string name="pref_storage_location">存储位置</string>
|
||||
<string name="onboarding_storage_action_select">选择文件夹</string>
|
||||
|
@ -7,7 +7,7 @@
|
||||
<item quantity="other">%d 個擴充套件可更新</item>
|
||||
</plurals>
|
||||
<plurals name="download_queue_summary">
|
||||
<item quantity="other">剩餘 %1$s 本</item>
|
||||
<item quantity="other">剩餘 %1$s 項</item>
|
||||
</plurals>
|
||||
<plurals name="manga_num_chapters">
|
||||
<item quantity="other">共 %1$s 章</item>
|
||||
|
@ -180,7 +180,7 @@
|
||||
<string name="scale_type_fit_width">符合頁寬</string>
|
||||
<string name="scale_type_fit_height">符合頁高</string>
|
||||
<string name="scale_type_original_size">原始大小</string>
|
||||
<string name="scale_type_smart_fit">智慧型填充</string>
|
||||
<string name="scale_type_smart_fit">智慧填充</string>
|
||||
<string name="pref_zoom_start">縮放原點</string>
|
||||
<string name="zoom_start_automatic">自動</string>
|
||||
<string name="zoom_start_left">左邊</string>
|
||||
@ -304,7 +304,7 @@
|
||||
<string name="lock_always">立即</string>
|
||||
<string name="lock_when_idle">閒置時鎖定</string>
|
||||
<string name="lock_with_biometrics">上鎖應用程式</string>
|
||||
<string name="secure_screen_summary">在切換應用程式時隱藏預覽,並禁止擷取螢幕畫面。</string>
|
||||
<string name="secure_screen_summary">在切換應用程式時隱藏預覽,並禁止擷取螢幕畫面</string>
|
||||
<string name="secure_screen">防窺畫面</string>
|
||||
<string name="pref_category_security">隱私</string>
|
||||
<string name="hide_notification_content">隱藏通知內容</string>
|
||||
@ -790,7 +790,7 @@
|
||||
<string name="delete_repo_confirmation">確定要刪除「%s」儲存庫嗎?</string>
|
||||
<string name="action_delete_repo">刪除儲存庫</string>
|
||||
<string name="action_add_repo">新增儲存庫</string>
|
||||
<string name="information_empty_repos">尚未新增任何儲存庫</string>
|
||||
<string name="information_empty_repos">尚未新增任何儲存庫。</string>
|
||||
<string name="label_extension_repos">擴充套件儲存庫</string>
|
||||
<string name="onboarding_storage_help_action">儲存空間指南</string>
|
||||
<string name="onboarding_storage_help_info">從舊版升級而不確定該如何選擇嗎?請參閱儲存空間指南以取得更多資訊。</string>
|
||||
|
@ -11,17 +11,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
|
||||
@ -177,10 +174,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 = {
|
||||
|
Loading…
Reference in New Issue
Block a user