diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml
index da79440dc..5a7bfdd10 100644
--- a/.github/workflows/build_pull_request.yml
+++ b/.github/workflows/build_pull_request.yml
@@ -28,7 +28,7 @@ jobs:
uses: actions/dependency-review-action@v3
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 17
distribution: adopt
diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml
index e43c229a0..6127d3f30 100644
--- a/.github/workflows/build_push.yml
+++ b/.github/workflows/build_push.yml
@@ -23,7 +23,7 @@ jobs:
uses: gradle/wrapper-validation-action@v1
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 17
distribution: adopt
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a48438b57..6eb320050 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -22,7 +22,7 @@ android {
defaultConfig {
applicationId = "eu.kanade.tachiyomi"
- versionCode = 110
+ versionCode = 111
versionName = "0.14.7"
buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
@@ -196,7 +196,6 @@ dependencies {
// RxJava
implementation(libs.rxjava)
- implementation(libs.flowreactivenetwork)
// Networking
implementation(libs.bundles.okhttp)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index fe6f4a6c7..e7d560094 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -7,6 +7,9 @@
+
+
+
@@ -21,6 +24,8 @@
+
+
@@ -151,10 +158,6 @@
android:name=".data.notification.NotificationReceiver"
android:exported="false" />
-
-
@@ -168,6 +171,11 @@
android:value="true" />
+
+
SourceSwitchPreference(
+ modifier = Modifier.animateItemPlacement(),
source = source,
onClickSourcePreferences = onClickSourcePreferences,
onClickSource = onClickSource,
diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt
index 51acdfccf..c65f0d0b1 100644
--- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionFilterScreen.kt
@@ -58,6 +58,7 @@ private fun ExtensionFilterContent(
) {
items(state.languages) { language ->
SwitchPreferenceWidget(
+ modifier = Modifier.animateItemPlacement(),
title = LocaleHelper.getSourceDisplayName(language, context),
checked = language in state.enabledLanguages,
onCheckedChanged = { onClickLang(language) },
diff --git a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt
index 3469af6ca..2e4c6fc0b 100644
--- a/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt
@@ -148,12 +148,14 @@ private fun ExtensionContent(
}
ExtensionHeader(
textRes = header.textRes,
+ modifier = Modifier.animateItemPlacement(),
action = action,
)
}
is ExtensionUiModel.Header.Text -> {
ExtensionHeader(
text = header.text,
+ modifier = Modifier.animateItemPlacement(),
)
}
}
@@ -165,6 +167,7 @@ private fun ExtensionContent(
key = { "extension-${it.hashCode()}" },
) { item ->
ExtensionItem(
+ modifier = Modifier.animateItemPlacement(),
item = item,
onClickItem = {
when (it) {
diff --git a/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt
index b7dc70ebb..e45ca5189 100644
--- a/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/browse/MigrateSourceScreen.kt
@@ -132,6 +132,7 @@ private fun MigrateSourceList(
key = { (source, _) -> "migrate-${source.id}" },
) { (source, count) ->
MigrateSourceItem(
+ modifier = Modifier.animateItemPlacement(),
source = source,
count = count,
onClickItem = { onClickItem(source) },
diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt
index 6306800b8..e334a451e 100644
--- a/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesFilterScreen.kt
@@ -68,6 +68,7 @@ private fun SourcesFilterContent(
contentType = "source-filter-header",
) {
SourcesFilterHeader(
+ modifier = Modifier.animateItemPlacement(),
language = language,
enabled = enabled,
onClickItem = onClickLanguage,
@@ -80,6 +81,7 @@ private fun SourcesFilterContent(
contentType = { "source-filter-item" },
) { source ->
SourcesFilterItem(
+ modifier = Modifier.animateItemPlacement(),
source = source,
enabled = "${source.id}" !in state.disabledSources,
onClickItem = onClickSource,
diff --git a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt
index 94cca357d..d0411b7a8 100644
--- a/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt
@@ -74,10 +74,12 @@ fun SourcesScreen(
when (model) {
is SourceUiModel.Header -> {
SourceHeader(
+ modifier = Modifier.animateItemPlacement(),
language = model.language,
)
}
is SourceUiModel.Item -> SourceItem(
+ modifier = Modifier.animateItemPlacement(),
source = model.source,
onClickItem = onClickItem,
onLongClickItem = onLongClickItem,
diff --git a/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt b/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt
index 471ec7fc9..34a6a1217 100644
--- a/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/category/CategoryScreen.kt
@@ -107,6 +107,7 @@ private fun CategoryContent(
key = { _, category -> "category-${category.id}" },
) { index, category ->
CategoryListItem(
+ modifier = Modifier.animateItemPlacement(),
category = category,
canMoveUp = index != 0,
canMoveDown = index != categories.lastIndex,
diff --git a/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt b/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt
index ec6416480..ce6871e13 100644
--- a/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/history/HistoryScreen.kt
@@ -123,6 +123,7 @@ private fun HistoryScreenContent(
when (item) {
is HistoryUiModel.Header -> {
RelativeDateHeader(
+ modifier = Modifier.animateItemPlacement(),
date = item.date,
relativeTime = relativeTime,
dateFormat = dateFormat,
@@ -131,6 +132,7 @@ private fun HistoryScreenContent(
is HistoryUiModel.Item -> {
val value = item.item
HistoryItem(
+ modifier = Modifier.animateItemPlacement(),
history = value,
onClickCover = { onClickCover(value) },
onClickResume = { onClickResume(value) },
diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt
index 04d1137a0..87eceb99e 100644
--- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt
@@ -114,7 +114,8 @@ object SettingsDataScreen : SearchableSettings {
return Preference.PreferenceItem.TextPreference(
title = stringResource(MR.strings.pref_storage_location),
subtitle = remember(storageDir) {
- (UniFile.fromUri(context, storageDir.toUri())?.filePath)
+ val file = UniFile.fromUri(context, storageDir.toUri())
+ file?.filePath ?: file?.uri?.toString()
} ?: stringResource(MR.strings.invalid_location, storageDir),
onClick = {
try {
diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt
index b4be0ebd9..3eecee438 100644
--- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt
@@ -13,7 +13,6 @@ import eu.kanade.presentation.more.settings.Preference
import eu.kanade.presentation.more.settings.PreferenceScaffold
import eu.kanade.presentation.more.settings.screen.about.AboutScreen
import eu.kanade.presentation.util.Screen
-import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.WebViewUtil
import kotlinx.coroutines.guava.await
diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt
index 2c891e271..ea8db81e8 100644
--- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt
@@ -18,17 +18,18 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach
-import androidx.lifecycle.asFlow
import androidx.work.WorkInfo
import androidx.work.WorkQuery
import cafe.adriel.voyager.core.model.ScreenModel
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
+import eu.kanade.domain.ui.UiPreferences
import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.components.AppBarActions
import eu.kanade.presentation.util.Screen
import eu.kanade.presentation.util.ioCoroutineScope
+import eu.kanade.tachiyomi.util.lang.toDateTimestampString
import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.system.workManager
import kotlinx.collections.immutable.persistentListOf
@@ -39,6 +40,9 @@ import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.util.plus
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import java.util.Date
class WorkerInfoScreen : Screen() {
@@ -116,22 +120,19 @@ class WorkerInfoScreen : Screen() {
private val workManager = context.workManager
val finished = workManager
- .getWorkInfosLiveData(
+ .getWorkInfosFlow(
WorkQuery.fromStates(WorkInfo.State.SUCCEEDED, WorkInfo.State.FAILED, WorkInfo.State.CANCELLED),
)
- .asFlow()
.map(::constructString)
.stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "")
val running = workManager
- .getWorkInfosLiveData(WorkQuery.fromStates(WorkInfo.State.RUNNING))
- .asFlow()
+ .getWorkInfosFlow(WorkQuery.fromStates(WorkInfo.State.RUNNING))
.map(::constructString)
.stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "")
val enqueued = workManager
- .getWorkInfosLiveData(WorkQuery.fromStates(WorkInfo.State.ENQUEUED))
- .asFlow()
+ .getWorkInfosFlow(WorkQuery.fromStates(WorkInfo.State.ENQUEUED))
.map(::constructString)
.stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "")
@@ -146,6 +147,16 @@ class WorkerInfoScreen : Screen() {
appendLine(" - $it")
}
appendLine("State: ${workInfo.state}")
+ if (workInfo.state == WorkInfo.State.ENQUEUED) {
+ appendLine(
+ "Next scheduled run: ${Date(workInfo.nextScheduleTimeMillis).toDateTimestampString(
+ UiPreferences.dateFormat(
+ Injekt.get().dateFormat().get(),
+ ),
+ )}",
+ )
+ appendLine("Attempt #${workInfo.runAttemptCount + 1}")
+ }
appendLine()
}
}
diff --git a/app/src/main/java/eu/kanade/presentation/reader/BrightnessOverlay.kt b/app/src/main/java/eu/kanade/presentation/reader/BrightnessOverlay.kt
deleted file mode 100644
index b945906a4..000000000
--- a/app/src/main/java/eu/kanade/presentation/reader/BrightnessOverlay.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package eu.kanade.presentation.reader
-
-import androidx.annotation.IntRange
-import androidx.compose.foundation.Canvas
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.graphicsLayer
-import kotlin.math.abs
-
-@Composable
-fun BrightnessOverlay(
- @IntRange(from = -100, to = 100) value: Int,
-) {
- if (value >= 0) return
-
- Canvas(
- modifier = Modifier
- .fillMaxSize()
- .graphicsLayer {
- alpha = abs(value) / 100f
- },
- ) {
- drawRect(Color.Black)
- }
-}
diff --git a/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt b/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt
index ea6f3d58f..22a02444c 100644
--- a/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt
+++ b/app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt
@@ -11,8 +11,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.PreviewLightDark
import dev.icerock.moko.resources.StringResource
import eu.kanade.domain.manga.model.readerOrientation
@@ -72,7 +70,7 @@ private fun DialogContent(
selected = mode
},
modifier = Modifier.fillMaxWidth(),
- imageVector = ImageVector.vectorResource(mode.iconRes),
+ imageVector = mode.icon,
title = stringResource(mode.stringRes),
)
}
diff --git a/app/src/main/java/eu/kanade/presentation/reader/ReaderContentOverlay.kt b/app/src/main/java/eu/kanade/presentation/reader/ReaderContentOverlay.kt
new file mode 100644
index 000000000..4f72ac9af
--- /dev/null
+++ b/app/src/main/java/eu/kanade/presentation/reader/ReaderContentOverlay.kt
@@ -0,0 +1,49 @@
+package eu.kanade.presentation.reader
+
+import androidx.annotation.ColorInt
+import androidx.annotation.IntRange
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.BlendMode
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
+import kotlin.math.abs
+
+@Composable
+fun ReaderContentOverlay(
+ @IntRange(from = -100, to = 100) brightness: Int,
+ @ColorInt color: Int?,
+ colorBlendMode: BlendMode?,
+ modifier: Modifier = Modifier,
+) {
+ if (brightness < 0) {
+ val brightnessAlpha = remember(brightness) {
+ abs(brightness) / 100f
+ }
+
+ Canvas(
+ modifier = modifier
+ .fillMaxSize()
+ .graphicsLayer {
+ alpha = brightnessAlpha
+ },
+ ) {
+ drawRect(Color.Black)
+ }
+ }
+
+ if (color != null) {
+ Canvas(
+ modifier = modifier
+ .fillMaxSize(),
+ ) {
+ drawRect(
+ color = Color(color),
+ blendMode = colorBlendMode ?: BlendMode.SrcOver,
+ )
+ }
+ }
+}
diff --git a/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt b/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt
index b1f7189ed..8d0cae57b 100644
--- a/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt
+++ b/app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt
@@ -49,7 +49,7 @@ fun BottomReaderBar(
IconButton(onClick = onClickOrientation) {
Icon(
- painter = painterResource(orientation.iconRes),
+ imageVector = orientation.icon,
contentDescription = stringResource(MR.strings.rotation_type),
)
}
diff --git a/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt b/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt
index 1e7324956..1c5a9c6fb 100644
--- a/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt
+++ b/app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt
@@ -1,6 +1,5 @@
package eu.kanade.presentation.reader.settings
-import android.os.Build
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.material3.FilterChip
import androidx.compose.material3.Text
@@ -10,6 +9,7 @@ import androidx.core.graphics.alpha
import androidx.core.graphics.blue
import androidx.core.graphics.green
import androidx.core.graphics.red
+import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences.Companion.ColorFilterMode
import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel
import tachiyomi.core.preference.getAndSet
import tachiyomi.i18n.MR
@@ -21,25 +21,6 @@ import tachiyomi.presentation.core.util.collectAsState
@Composable
internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel) {
- val colorFilterModes = buildList {
- addAll(
- listOf(
- MR.strings.label_default,
- MR.strings.filter_mode_multiply,
- MR.strings.filter_mode_screen,
- ),
- )
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- addAll(
- listOf(
- MR.strings.filter_mode_overlay,
- MR.strings.filter_mode_lighten,
- MR.strings.filter_mode_darken,
- ),
- )
- }
- }.map { stringResource(it) }
-
val customBrightness by screenModel.preferences.customBrightness().collectAsState()
CheckboxItem(
label = stringResource(MR.strings.pref_custom_brightness),
@@ -118,11 +99,11 @@ internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel)
val colorFilterMode by screenModel.preferences.colorFilterMode().collectAsState()
SettingsChipRow(MR.strings.pref_color_filter_mode) {
- colorFilterModes.mapIndexed { index, it ->
+ ColorFilterMode.mapIndexed { index, it ->
FilterChip(
selected = colorFilterMode == index,
onClick = { screenModel.preferences.colorFilterMode().set(index) },
- label = { Text(it) },
+ label = { Text(stringResource(it.first)) },
)
}
}
diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt
index f2aa4fb16..ea5a81010 100644
--- a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt
+++ b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt
@@ -193,6 +193,7 @@ fun TrackerSearch(
type = it.publishing_type.toLowerCase(Locale.current).capitalize(Locale.current),
startDate = it.start_date,
status = it.publishing_status.toLowerCase(Locale.current).capitalize(Locale.current),
+ score = it.score,
description = it.summary.trim(),
selected = it == selected,
onClick = { onSelectedChange(it) },
@@ -218,6 +219,7 @@ private fun SearchResultItem(
type: String,
startDate: String,
status: String,
+ score: Float,
description: String,
selected: Boolean,
onClick: () -> Unit,
@@ -279,6 +281,12 @@ private fun SearchResultItem(
text = status,
)
}
+ if (score != -1f) {
+ SearchResultItemDetails(
+ title = stringResource(MR.strings.score),
+ text = score.toString(),
+ )
+ }
}
}
if (description.isNotBlank()) {
diff --git a/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt b/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt
index ad2e0dbc3..eeaee2008 100644
--- a/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt
+++ b/app/src/main/java/eu/kanade/presentation/updates/UpdatesUiItem.kt
@@ -53,6 +53,7 @@ internal fun LazyListScope.updatesLastUpdatedItem(
item(key = "updates-lastUpdated") {
Box(
modifier = Modifier
+ .animateItemPlacement()
.padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small),
) {
Text(
@@ -89,12 +90,14 @@ internal fun LazyListScope.updatesUiItems(
when (item) {
is UpdatesUiModel.Header -> {
ListGroupHeader(
+ modifier = Modifier.animateItemPlacement(),
text = item.date,
)
}
is UpdatesUiModel.Item -> {
val updatesItem = item.item
UpdatesUiItem(
+ modifier = Modifier.animateItemPlacement(),
update = updatesItem.update,
selected = updatesItem.selected,
readProgress = updatesItem.update.lastPageRead
diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt
index c55ce35da..1c7887dca 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt
@@ -416,6 +416,11 @@ object Migrations {
newKey = { Preference.appStateKey(it) },
)
}
+ if (oldVersion < 111) {
+ File(context.cacheDir, "dl_index_cache")
+ .takeIf { it.exists() }
+ ?.delete()
+ }
return true
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt
index bc37b8c75..f6fe367f3 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateJob.kt
@@ -17,6 +17,7 @@ import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.util.system.cancelNotification
import eu.kanade.tachiyomi.util.system.isRunning
+import eu.kanade.tachiyomi.util.system.setForegroundSafely
import eu.kanade.tachiyomi.util.system.workManager
import logcat.LogPriority
import tachiyomi.core.util.system.logcat
@@ -39,19 +40,14 @@ class BackupCreateJob(private val context: Context, workerParams: WorkerParamete
if (isAutoBackup && BackupRestoreJob.isRunning(context)) return Result.retry()
- val backupPreferences = Injekt.get()
-
val uri = inputData.getString(LOCATION_URI_KEY)?.toUri()
?: getAutomaticBackupLocation()
?: return Result.failure()
- val flags = inputData.getInt(BACKUP_FLAGS_KEY, BackupCreateFlags.AutomaticDefaults)
+ setForegroundSafely()
- try {
- setForeground(getForegroundInfo())
- } catch (e: IllegalStateException) {
- logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" }
- }
+ val flags = inputData.getInt(BACKUP_FLAGS_KEY, BackupCreateFlags.AutomaticDefaults)
+ val backupPreferences = Injekt.get()
return try {
val location = BackupCreator(context).createBackup(uri, flags, isAutoBackup)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt
index 1c335ae6e..113cae002 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt
@@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.data.backup
-import android.Manifest
import android.content.Context
import android.net.Uri
import com.hippo.unifile.UniFile
@@ -31,7 +30,6 @@ import eu.kanade.tachiyomi.data.backup.models.backupTrackMapper
import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.preferenceKey
import eu.kanade.tachiyomi.source.sourcePreferences
-import eu.kanade.tachiyomi.util.system.hasPermission
import kotlinx.serialization.protobuf.ProtoBuf
import logcat.LogPriority
import okio.buffer
@@ -73,10 +71,6 @@ class BackupCreator(
* @param isAutoBackup backup called from scheduled backup job
*/
suspend fun createBackup(uri: Uri, flags: Int, isAutoBackup: Boolean): String {
- if (!context.hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- throw IllegalStateException(context.stringResource(MR.strings.missing_storage_permission))
- }
-
val databaseManga = getFavorites.await()
val backup = Backup(
backupMangas(databaseManga, flags),
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt
index 835796898..71bdbcc08 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt
@@ -79,11 +79,7 @@ class BackupNotifier(private val context: Context) {
addAction(
R.drawable.ic_share_24dp,
context.stringResource(MR.strings.action_share),
- NotificationReceiver.shareBackupPendingBroadcast(
- context,
- unifile.uri,
- Notifications.ID_BACKUP_COMPLETE,
- ),
+ NotificationReceiver.shareBackupPendingBroadcast(context, unifile.uri),
)
show(Notifications.ID_BACKUP_COMPLETE)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt
index f9b41c330..e4595a4b5 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreJob.kt
@@ -12,6 +12,7 @@ import androidx.work.workDataOf
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.util.system.cancelNotification
import eu.kanade.tachiyomi.util.system.isRunning
+import eu.kanade.tachiyomi.util.system.setForegroundSafely
import eu.kanade.tachiyomi.util.system.workManager
import kotlinx.coroutines.CancellationException
import logcat.LogPriority
@@ -29,11 +30,7 @@ class BackupRestoreJob(private val context: Context, workerParams: WorkerParamet
?: return Result.failure()
val sync = inputData.getBoolean(SYNC_KEY, false)
- try {
- setForeground(getForegroundInfo())
- } catch (e: IllegalStateException) {
- logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" }
- }
+ setForegroundSafely()
return try {
val restorer = BackupRestorer(context, notifier)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt
index f3c8cc60a..561d32b91 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt
@@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.data.coil
+import androidx.core.net.toUri
import coil.ImageLoader
import coil.decode.DataSource
import coil.decode.ImageSource
@@ -10,6 +11,7 @@ import coil.fetch.SourceResult
import coil.network.HttpException
import coil.request.Options
import coil.request.Parameters
+import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher.Companion.USE_CUSTOM_COVER
import eu.kanade.tachiyomi.network.await
@@ -24,6 +26,7 @@ import okio.Path.Companion.toOkioPath
import okio.Source
import okio.buffer
import okio.sink
+import okio.source
import tachiyomi.core.util.system.logcat
import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.manga.model.MangaCover
@@ -69,8 +72,9 @@ class MangaCoverFetcher(
// diskCacheKey is thumbnail_url
if (url == null) error("No cover specified")
return when (getResourceType(url)) {
- Type.URL -> httpLoader()
Type.File -> fileLoader(File(url.substringAfter("file://")))
+ Type.URI -> fileUriLoader(url)
+ Type.URL -> httpLoader()
null -> error("Invalid image")
}
}
@@ -83,6 +87,18 @@ class MangaCoverFetcher(
)
}
+ private fun fileUriLoader(uri: String): FetchResult {
+ val source = UniFile.fromUri(options.context, uri.toUri())!!
+ .openInputStream()
+ .source()
+ .buffer()
+ return SourceResult(
+ source = ImageSource(source = source, context = options.context),
+ mimeType = "image/*",
+ dataSource = DataSource.DISK,
+ )
+ }
+
private suspend fun httpLoader(): FetchResult {
// Only cache separately if it's a library item
val libraryCoverCacheFile = if (isLibraryManga) {
@@ -256,12 +272,15 @@ class MangaCoverFetcher(
cover.isNullOrEmpty() -> null
cover.startsWith("http", true) || cover.startsWith("Custom-", true) -> Type.URL
cover.startsWith("/") || cover.startsWith("file://") -> Type.File
+ cover.startsWith("content") -> Type.URI
else -> null
}
}
private enum class Type {
- File, URL
+ File,
+ URI,
+ URL,
}
class MangaFactory(
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt
index 9fe7dbfee..17930a89e 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt
@@ -94,7 +94,7 @@ class DownloadCache(
.stateIn(scope, SharingStarted.WhileSubscribed(), false)
private val diskCacheFile: File
- get() = File(context.cacheDir, "dl_index_cache")
+ get() = File(context.cacheDir, "dl_index_cache_v2")
private val rootDownloadsDirLock = Mutex()
private var rootDownloadsDir = RootDirectory(provider.downloadsDir)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadJob.kt
new file mode 100644
index 000000000..93826afe0
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadJob.kt
@@ -0,0 +1,117 @@
+package eu.kanade.tachiyomi.data.download
+
+import android.content.Context
+import android.content.pm.ServiceInfo
+import android.os.Build
+import androidx.lifecycle.asFlow
+import androidx.work.CoroutineWorker
+import androidx.work.ExistingWorkPolicy
+import androidx.work.ForegroundInfo
+import androidx.work.OneTimeWorkRequestBuilder
+import androidx.work.WorkInfo
+import androidx.work.WorkManager
+import androidx.work.WorkerParameters
+import eu.kanade.tachiyomi.R
+import eu.kanade.tachiyomi.data.notification.Notifications
+import eu.kanade.tachiyomi.util.system.isConnectedToWifi
+import eu.kanade.tachiyomi.util.system.isOnline
+import eu.kanade.tachiyomi.util.system.notificationBuilder
+import eu.kanade.tachiyomi.util.system.setForegroundSafely
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.map
+import tachiyomi.domain.download.service.DownloadPreferences
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+
+/**
+ * This worker is used to manage the downloader. The system can decide to stop the worker, in
+ * which case the downloader is also stopped. It's also stopped while there's no network available.
+ */
+class DownloadJob(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) {
+
+ private val downloadManager: DownloadManager = Injekt.get()
+ private val downloadPreferences: DownloadPreferences = Injekt.get()
+
+ override suspend fun getForegroundInfo(): ForegroundInfo {
+ val notification = applicationContext.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) {
+ setContentTitle(applicationContext.getString(R.string.download_notifier_downloader_title))
+ setSmallIcon(android.R.drawable.stat_sys_download)
+ }.build()
+ return ForegroundInfo(
+ Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS,
+ notification,
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
+ } else {
+ 0
+ },
+ )
+ }
+
+ override suspend fun doWork(): Result {
+ var active = checkConnectivity() && downloadManager.downloaderStart()
+
+ if (!active) {
+ return Result.failure()
+ }
+
+ setForegroundSafely()
+
+ // Keep the worker running when needed
+ while (active) {
+ delay(100)
+ active = !isStopped && downloadManager.isRunning && checkConnectivity()
+ }
+
+ return Result.success()
+ }
+
+ private fun checkConnectivity(): Boolean {
+ return with(applicationContext) {
+ if (isOnline()) {
+ val noWifi = downloadPreferences.downloadOnlyOverWifi().get() && !isConnectedToWifi()
+ if (noWifi) {
+ downloadManager.downloaderStop(
+ applicationContext.getString(R.string.download_notifier_text_only_wifi),
+ )
+ }
+ !noWifi
+ } else {
+ downloadManager.downloaderStop(applicationContext.getString(R.string.download_notifier_no_network))
+ false
+ }
+ }
+ }
+
+ companion object {
+ private const val TAG = "Downloader"
+
+ fun start(context: Context) {
+ val request = OneTimeWorkRequestBuilder()
+ .addTag(TAG)
+ .build()
+ WorkManager.getInstance(context)
+ .enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request)
+ }
+
+ fun stop(context: Context) {
+ WorkManager.getInstance(context)
+ .cancelUniqueWork(TAG)
+ }
+
+ fun isRunning(context: Context): Boolean {
+ return WorkManager.getInstance(context)
+ .getWorkInfosForUniqueWork(TAG)
+ .get()
+ .let { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 }
+ }
+
+ fun isRunningFlow(context: Context): Flow {
+ return WorkManager.getInstance(context)
+ .getWorkInfosForUniqueWorkLiveData(TAG)
+ .asFlow()
+ .map { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 }
+ }
+ }
+}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt
index ba5c4d81a..3e447f4ab 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt
@@ -46,6 +46,9 @@ class DownloadManager(
*/
private val downloader = Downloader(context, provider, cache)
+ val isRunning: Boolean
+ get() = downloader.isRunning
+
/**
* Queue to delay the deletion of a list of chapters until triggered.
*/
@@ -59,13 +62,19 @@ class DownloadManager(
fun downloaderStop(reason: String? = null) = downloader.stop(reason)
val isDownloaderRunning
- get() = DownloadService.isRunning
+ get() = DownloadJob.isRunningFlow(context)
/**
* Tells the downloader to begin downloads.
*/
fun startDownloads() {
- DownloadService.start(context)
+ if (downloader.isRunning) return
+
+ if (DownloadJob.isRunning(context)) {
+ downloader.start()
+ } else {
+ DownloadJob.start(context)
+ }
}
/**
@@ -94,22 +103,16 @@ class DownloadManager(
return queueState.value.find { it.chapter.id == chapterId }
}
- fun startDownloadNow(chapterId: Long?) {
- if (chapterId == null) return
- val download = getQueuedDownloadOrNull(chapterId)
+ fun startDownloadNow(chapterId: Long) {
+ val existingDownload = getQueuedDownloadOrNull(chapterId)
// If not in queue try to start a new download
- val toAdd = download ?: runBlocking { Download.fromChapterId(chapterId) } ?: return
- val queue = queueState.value.toMutableList()
- download?.let { queue.remove(it) }
- queue.add(0, toAdd)
- reorderQueue(queue)
- if (!downloader.isRunning) {
- if (DownloadService.isRunning(context)) {
- downloader.start()
- } else {
- DownloadService.start(context)
- }
+ val toAdd = existingDownload ?: runBlocking { Download.fromChapterId(chapterId) } ?: return
+ queueState.value.toMutableList().apply {
+ existingDownload?.let { remove(it) }
+ add(0, toAdd)
+ reorderQueue(this)
}
+ startDownloads()
}
/**
@@ -143,7 +146,7 @@ class DownloadManager(
addAll(0, downloads)
reorderQueue(this)
}
- if (!DownloadService.isRunning(context)) DownloadService.start(context)
+ if (!DownloadJob.isRunning(context)) startDownloads()
}
/**
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt
deleted file mode 100644
index 9ce5c5b2a..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt
+++ /dev/null
@@ -1,151 +0,0 @@
-package eu.kanade.tachiyomi.data.download
-
-import android.app.Notification
-import android.app.Service
-import android.content.Context
-import android.content.Intent
-import android.os.IBinder
-import android.os.PowerManager
-import androidx.core.content.ContextCompat
-import dev.icerock.moko.resources.StringResource
-import eu.kanade.tachiyomi.data.notification.Notifications
-import eu.kanade.tachiyomi.util.system.acquireWakeLock
-import eu.kanade.tachiyomi.util.system.isConnectedToWifi
-import eu.kanade.tachiyomi.util.system.isOnline
-import eu.kanade.tachiyomi.util.system.isServiceRunning
-import eu.kanade.tachiyomi.util.system.notificationBuilder
-import eu.kanade.tachiyomi.util.system.toast
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.catch
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import logcat.LogPriority
-import ru.beryukhov.reactivenetwork.ReactiveNetwork
-import tachiyomi.core.i18n.stringResource
-import tachiyomi.core.util.lang.withUIContext
-import tachiyomi.core.util.system.logcat
-import tachiyomi.domain.download.service.DownloadPreferences
-import tachiyomi.i18n.MR
-import uy.kohesive.injekt.injectLazy
-
-/**
- * This service is used to manage the downloader. The system can decide to stop the service, in
- * which case the downloader is also stopped. It's also stopped while there's no network available.
- * While the downloader is running, a wake lock will be held.
- */
-class DownloadService : Service() {
-
- companion object {
-
- private val _isRunning = MutableStateFlow(false)
- val isRunning = _isRunning.asStateFlow()
-
- /**
- * Starts this service.
- *
- * @param context the application context.
- */
- fun start(context: Context) {
- val intent = Intent(context, DownloadService::class.java)
- ContextCompat.startForegroundService(context, intent)
- }
-
- /**
- * Stops this service.
- *
- * @param context the application context.
- */
- fun stop(context: Context) {
- context.stopService(Intent(context, DownloadService::class.java))
- }
-
- /**
- * Returns the status of the service.
- *
- * @param context the application context.
- * @return true if the service is running, false otherwise.
- */
- fun isRunning(context: Context): Boolean {
- return context.isServiceRunning(DownloadService::class.java)
- }
- }
-
- private val downloadManager: DownloadManager by injectLazy()
- private val downloadPreferences: DownloadPreferences by injectLazy()
-
- /**
- * Wake lock to prevent the device to enter sleep mode.
- */
- private lateinit var wakeLock: PowerManager.WakeLock
-
- private lateinit var scope: CoroutineScope
-
- override fun onCreate() {
- scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
- startForeground(Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS, getPlaceholderNotification())
- wakeLock = acquireWakeLock(javaClass.name)
- _isRunning.value = true
- listenNetworkChanges()
- }
-
- override fun onDestroy() {
- scope.cancel()
- _isRunning.value = false
- downloadManager.downloaderStop()
- if (wakeLock.isHeld) {
- wakeLock.release()
- }
- }
-
- // Not used
- override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- return START_NOT_STICKY
- }
-
- // Not used
- override fun onBind(intent: Intent): IBinder? {
- return null
- }
-
- private fun downloaderStop(string: StringResource) {
- downloadManager.downloaderStop(stringResource(string))
- }
-
- private fun listenNetworkChanges() {
- ReactiveNetwork()
- .observeNetworkConnectivity(applicationContext)
- .onEach {
- withUIContext {
- if (isOnline()) {
- if (downloadPreferences.downloadOnlyOverWifi().get() && !isConnectedToWifi()) {
- downloaderStop(MR.strings.download_notifier_text_only_wifi)
- } else {
- val started = downloadManager.downloaderStart()
- if (!started) stopSelf()
- }
- } else {
- downloaderStop(MR.strings.download_notifier_no_network)
- }
- }
- }
- .catch { error ->
- withUIContext {
- logcat(LogPriority.ERROR, error)
- toast(MR.strings.download_queue_error)
- stopSelf()
- }
- }
- .launchIn(scope)
- }
-
- private fun getPlaceholderNotification(): Notification {
- return notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) {
- setContentTitle(stringResource(MR.strings.download_notifier_downloader_title))
- }.build()
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt
index 5e58d4f6a..1dd117f41 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt
@@ -161,10 +161,7 @@ class Downloader(
isPaused = false
- // Prevent recursion when DownloadService.onDestroy() calls downloader.stop()
- if (DownloadService.isRunning.value) {
- DownloadService.stop(context)
- }
+ DownloadJob.stop(context)
}
/**
@@ -310,7 +307,7 @@ class Downloader(
)
}
}
- DownloadService.start(context)
+ DownloadJob.start(context)
}
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
index 89fd40dcc..d733f176e 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
@@ -1,6 +1,8 @@
package eu.kanade.tachiyomi.data.library
import android.content.Context
+import android.content.pm.ServiceInfo
+import android.os.Build
import androidx.work.BackoffPolicy
import androidx.work.Constraints
import androidx.work.CoroutineWorker
@@ -28,6 +30,7 @@ import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.system.createFileInCacheDir
import eu.kanade.tachiyomi.util.system.isConnectedToWifi
import eu.kanade.tachiyomi.util.system.isRunning
+import eu.kanade.tachiyomi.util.system.setForegroundSafely
import eu.kanade.tachiyomi.util.system.workManager
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.async
@@ -106,11 +109,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
}
}
- try {
- setForeground(getForegroundInfo())
- } catch (e: IllegalStateException) {
- logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" }
- }
+ setForegroundSafely()
libraryPreferences.lastUpdatedTimestamp().set(Date().time)
@@ -140,6 +139,11 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
return ForegroundInfo(
Notifications.ID_LIBRARY_PROGRESS,
notifier.progressNotificationBuilder.build(),
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
+ } else {
+ 0
+ },
)
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt
index c2121ccf9..fc8de7617 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/MetadataUpdateJob.kt
@@ -1,6 +1,8 @@
package eu.kanade.tachiyomi.data.library
import android.content.Context
+import android.content.pm.ServiceInfo
+import android.os.Build
import androidx.work.CoroutineWorker
import androidx.work.ExistingWorkPolicy
import androidx.work.ForegroundInfo
@@ -16,6 +18,7 @@ import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.source.UnmeteredSource
import eu.kanade.tachiyomi.util.prepUpdateCover
import eu.kanade.tachiyomi.util.system.isRunning
+import eu.kanade.tachiyomi.util.system.setForegroundSafely
import eu.kanade.tachiyomi.util.system.workManager
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.async
@@ -51,11 +54,7 @@ class MetadataUpdateJob(private val context: Context, workerParams: WorkerParame
private var mangaToUpdate: List = mutableListOf()
override suspend fun doWork(): Result {
- try {
- setForeground(getForegroundInfo())
- } catch (e: IllegalStateException) {
- logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" }
- }
+ setForegroundSafely()
addMangaToQueue()
@@ -82,6 +81,11 @@ class MetadataUpdateJob(private val context: Context, workerParams: WorkerParame
return ForegroundInfo(
Notifications.ID_LIBRARY_PROGRESS,
notifier.progressNotificationBuilder.build(),
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
+ } else {
+ 0
+ },
)
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt
index e3da3b7e3..51a5bdc72 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt
@@ -7,6 +7,7 @@ import android.content.Intent
import android.net.Uri
import android.os.Build
import androidx.core.net.toUri
+import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.backup.BackupRestoreJob
import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
@@ -15,7 +16,6 @@ import eu.kanade.tachiyomi.data.updater.AppUpdateDownloadJob
import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.util.storage.DiskUtil
-import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.system.cancelNotification
import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat
import eu.kanade.tachiyomi.util.system.notificationManager
@@ -36,7 +36,6 @@ import tachiyomi.i18n.MR
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
-import java.io.File
import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID
/**
@@ -65,15 +64,13 @@ class NotificationReceiver : BroadcastReceiver() {
ACTION_SHARE_IMAGE ->
shareImage(
context,
- intent.getStringExtra(EXTRA_FILE_LOCATION)!!,
- intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1),
+ intent.getStringExtra(EXTRA_URI)!!.toUri(),
)
// Delete image from path and dismiss notification
ACTION_DELETE_IMAGE ->
deleteImage(
context,
- intent.getStringExtra(EXTRA_FILE_LOCATION)!!,
- intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1),
+ intent.getStringExtra(EXTRA_URI)!!.toUri(),
)
// Share backup file
ACTION_SHARE_BACKUP ->
@@ -81,7 +78,6 @@ class NotificationReceiver : BroadcastReceiver() {
context,
intent.getParcelableExtraCompat(EXTRA_URI)!!,
"application/x-protobuf+gzip",
- intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1),
)
ACTION_CANCEL_RESTORE -> cancelRestore(context)
@@ -140,12 +136,10 @@ class NotificationReceiver : BroadcastReceiver() {
* Called to start share intent to share image
*
* @param context context of application
- * @param path path of file
- * @param notificationId id of notification
+ * @param uri path of file
*/
- private fun shareImage(context: Context, path: String, notificationId: Int) {
- dismissNotification(context, notificationId)
- context.startActivity(File(path).getUriCompat(context).toShareIntent(context))
+ private fun shareImage(context: Context, uri: Uri) {
+ context.startActivity(uri.toShareIntent(context))
}
/**
@@ -153,10 +147,8 @@ class NotificationReceiver : BroadcastReceiver() {
*
* @param context context of application
* @param path path of file
- * @param notificationId id of notification
*/
- private fun shareFile(context: Context, uri: Uri, fileMimeType: String, notificationId: Int) {
- dismissNotification(context, notificationId)
+ private fun shareFile(context: Context, uri: Uri, fileMimeType: String) {
context.startActivity(uri.toShareIntent(context, fileMimeType))
}
@@ -183,17 +175,11 @@ class NotificationReceiver : BroadcastReceiver() {
/**
* Called to delete image
*
- * @param path path of file
- * @param notificationId id of notification
+ * @param uri path of file
*/
- private fun deleteImage(context: Context, path: String, notificationId: Int) {
- dismissNotification(context, notificationId)
-
- // Delete file
- val file = File(path)
- file.delete()
-
- DiskUtil.scanMedia(context, file.toUri())
+ private fun deleteImage(context: Context, uri: Uri) {
+ UniFile.fromUri(context, uri)?.delete()
+ DiskUtil.scanMedia(context, uri)
}
/**
@@ -423,18 +409,17 @@ class NotificationReceiver : BroadcastReceiver() {
}
/**
- * Returns [PendingIntent] that starts a service which cancels the notification and starts a share activity
+ * Returns [PendingIntent] that starts a share activity
*
* @param context context of application
- * @param path location path of file
+ * @param uri location path of file
* @param notificationId id of notification
* @return [PendingIntent]
*/
- internal fun shareImagePendingBroadcast(context: Context, path: String, notificationId: Int): PendingIntent {
+ internal fun shareImagePendingBroadcast(context: Context, uri: Uri): PendingIntent {
val intent = Intent(context, NotificationReceiver::class.java).apply {
action = ACTION_SHARE_IMAGE
- putExtra(EXTRA_FILE_LOCATION, path)
- putExtra(EXTRA_NOTIFICATION_ID, notificationId)
+ putExtra(EXTRA_URI, uri.toString())
}
return PendingIntent.getBroadcast(
context,
@@ -448,15 +433,13 @@ class NotificationReceiver : BroadcastReceiver() {
* Returns [PendingIntent] that starts a service which removes an image from disk
*
* @param context context of application
- * @param path location path of file
- * @param notificationId id of notification
+ * @param uri location path of file
* @return [PendingIntent]
*/
- internal fun deleteImagePendingBroadcast(context: Context, path: String, notificationId: Int): PendingIntent {
+ internal fun deleteImagePendingBroadcast(context: Context, uri: Uri): PendingIntent {
val intent = Intent(context, NotificationReceiver::class.java).apply {
action = ACTION_DELETE_IMAGE
- putExtra(EXTRA_FILE_LOCATION, path)
- putExtra(EXTRA_NOTIFICATION_ID, notificationId)
+ putExtra(EXTRA_URI, uri.toString())
}
return PendingIntent.getBroadcast(
context,
@@ -639,14 +622,12 @@ class NotificationReceiver : BroadcastReceiver() {
*
* @param context context of application
* @param uri uri of backup file
- * @param notificationId id of notification
* @return [PendingIntent]
*/
- internal fun shareBackupPendingBroadcast(context: Context, uri: Uri, notificationId: Int): PendingIntent {
+ internal fun shareBackupPendingBroadcast(context: Context, uri: Uri): PendingIntent {
val intent = Intent(context, NotificationReceiver::class.java).apply {
action = ACTION_SHARE_BACKUP
putExtra(EXTRA_URI, uri)
- putExtra(EXTRA_NOTIFICATION_ID, notificationId)
}
return PendingIntent.getBroadcast(
context,
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt
index b1142c74d..c1d0a855b 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt
@@ -153,6 +153,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|month
|day
|}
+ |averageScore
|}
|}
|}
@@ -309,6 +310,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
struct["status"]!!.jsonPrimitive.contentOrNull ?: "",
parseDate(struct, "startDate"),
struct["chapters"]!!.jsonPrimitive.intOrNull ?: 0,
+ struct["averageScore"]?.jsonPrimitive?.intOrNull ?: -1,
)
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt
index e0103371e..eb2f15ab2 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistModels.kt
@@ -19,6 +19,7 @@ data class ALManga(
val publishing_status: String,
val start_date_fuzzy: Long,
val total_chapters: Int,
+ val average_score: Int,
) {
fun toTrack() = TrackSearch.create(TrackerManager.ANILIST).apply {
@@ -27,6 +28,7 @@ data class ALManga(
total_chapters = this@ALManga.total_chapters
cover_url = image_url_lge
summary = description?.htmlDecode() ?: ""
+ score = average_score.toFloat()
tracking_url = AnilistApi.mangaUrl(media_id)
publishing_status = this@ALManga.publishing_status
publishing_type = format
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt
index 6762fdcaf..29db49ec5 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt
@@ -11,6 +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.int
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
@@ -108,11 +109,13 @@ class BangumiApi(
} else {
0
}
+ val rating = obj["rating"]?.jsonObject?.get("score")?.jsonPrimitive?.floatOrNull ?: -1f
return TrackSearch.create(trackId).apply {
media_id = obj["id"]!!.jsonPrimitive.long
title = obj["name_cn"]!!.jsonPrimitive.content
cover_url = coverUrl
summary = obj["name"]!!.jsonPrimitive.content
+ score = rating
tracking_url = obj["url"]!!.jsonPrimitive.content
total_chapters = totalChapters
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt
index 2d54b266b..5406be0ad 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt
@@ -279,7 +279,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor)
private const val algoliaAppId = "AWQO5J657S"
private const val algoliaFilter =
"&facetFilters=%5B%22kind%3Amanga%22%5D&attributesToRetrieve=" +
- "%5B%22synopsis%22%2C%22canonicalTitle%22%2C%22chapterCount%22%2C%22" +
+ "%5B%22synopsis%22%2C%22averageRating%22%2C%22canonicalTitle%22%2C%22chapterCount%22%2C%22" +
"posterImage%22%2C%22startDate%22%2C%22subtype%22%2C%22endDate%22%2C%20%22id%22%5D"
fun mangaUrl(remoteId: Long): String {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt
index 1cbf16c71..156f6d8f3 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt
@@ -28,6 +28,7 @@ class KitsuSearchManga(obj: JsonObject) {
null
}
private val synopsis = obj["synopsis"]?.jsonPrimitive?.contentOrNull
+ private val rating = obj["averageRating"]?.jsonPrimitive?.contentOrNull?.toFloatOrNull()
private var startDate = obj["startDate"]?.jsonPrimitive?.contentOrNull?.let {
val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US)
outputDf.format(Date(it.toLong() * 1000))
@@ -42,6 +43,7 @@ class KitsuSearchManga(obj: JsonObject) {
cover_url = original ?: ""
summary = synopsis ?: ""
tracking_url = KitsuApi.mangaUrl(media_id)
+ score = rating ?: -1f
publishing_status = if (endDate == null) {
"Publishing"
} else {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt
index 2f930b50c..7151aab62 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/model/TrackSearch.kt
@@ -20,7 +20,7 @@ class TrackSearch : Track {
override var total_chapters: Int = 0
- override var score: Float = 0f
+ override var score: Float = -1f
override var status: Int = 0
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt
index db89bcc11..444c5512f 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt
@@ -16,6 +16,7 @@ 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.int
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
@@ -103,7 +104,7 @@ class MyAnimeListApi(
.appendPath(id.toString())
.appendQueryParameter(
"fields",
- "id,title,synopsis,num_chapters,main_picture,status,media_type,start_date",
+ "id,title,synopsis,num_chapters,mean,main_picture,status,media_type,start_date",
)
.build()
with(json) {
@@ -117,6 +118,7 @@ class MyAnimeListApi(
title = obj["title"]!!.jsonPrimitive.content
summary = obj["synopsis"]?.jsonPrimitive?.content ?: ""
total_chapters = obj["num_chapters"]!!.jsonPrimitive.int
+ score = obj["mean"]?.jsonPrimitive?.floatOrNull ?: -1f
cover_url =
obj["main_picture"]?.jsonObject?.get("large")?.jsonPrimitive?.content
?: ""
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt
index 8ae22f3c9..0a5bba772 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt
@@ -107,6 +107,7 @@ class ShikimoriApi(
total_chapters = obj["chapters"]!!.jsonPrimitive.int
cover_url = baseUrl + obj["image"]!!.jsonObject["preview"]!!.jsonPrimitive.content
summary = ""
+ score = obj["score"]!!.jsonPrimitive.float
tracking_url = baseUrl + obj["url"]!!.jsonPrimitive.content
publishing_status = obj["status"]!!.jsonPrimitive.content
publishing_type = obj["kind"]!!.jsonPrimitive.content
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt
index 581f15a12..a242485c4 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt
@@ -17,13 +17,12 @@ import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.newCachelessCallWithProgress
import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.storage.saveTo
+import eu.kanade.tachiyomi.util.system.setForegroundSafely
import eu.kanade.tachiyomi.util.system.workManager
-import logcat.LogPriority
import okhttp3.internal.http2.ErrorCode
import okhttp3.internal.http2.StreamResetException
import tachiyomi.core.i18n.stringResource
import tachiyomi.core.util.lang.withIOContext
-import tachiyomi.core.util.system.logcat
import tachiyomi.i18n.MR
import uy.kohesive.injekt.injectLazy
import java.io.File
@@ -43,11 +42,7 @@ class AppUpdateDownloadJob(private val context: Context, workerParams: WorkerPar
return Result.failure()
}
- try {
- setForeground(getForegroundInfo())
- } catch (e: IllegalStateException) {
- logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" }
- }
+ setForegroundSafely()
withIOContext {
downloadApk(title, url)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt
index dc017c328..02589cec9 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt
@@ -10,7 +10,6 @@ import eu.kanade.tachiyomi.core.security.SecurityPreferences
import eu.kanade.tachiyomi.ui.security.UnlockActivity
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported
-import eu.kanade.tachiyomi.util.system.overridePendingTransitionCompat
import eu.kanade.tachiyomi.util.view.setSecureScreen
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
@@ -107,7 +106,7 @@ class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObser
if (activity.isAuthenticationSupported()) {
if (!SecureActivityDelegate.requireUnlock) return
activity.startActivity(Intent(activity, UnlockActivity::class.java))
- activity.overridePendingTransitionCompat(0, 0)
+ activity.overridePendingTransition(0, 0)
} else {
securityPreferences.useAuthenticator().set(false)
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt
index c79c111fc..3064ad60f 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt
@@ -6,7 +6,6 @@ import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.download.DownloadCache
import tachiyomi.domain.manga.model.Manga
import tachiyomi.i18n.MR
-import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
data class MigrationFlag(
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt
index 3cfb3ff1a..3f8896632 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadQueueScreenModel.kt
@@ -11,12 +11,14 @@ import eu.kanade.tachiyomi.source.model.Page
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import uy.kohesive.injekt.Injekt
@@ -137,8 +139,8 @@ class DownloadQueueScreenModel(
adapter = null
}
- val isDownloaderRunning
- get() = downloadManager.isDownloaderRunning
+ val isDownloaderRunning = downloadManager.isDownloaderRunning
+ .stateIn(screenModelScope, SharingStarted.WhileSubscribed(5000), false)
fun getDownloadStatusFlow() = downloadManager.statusFlow()
fun getDownloadProgressFlow() = downloadManager.progressFlow()
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
index 7900b377c..c67a49084 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
@@ -34,17 +34,16 @@ import androidx.core.transition.doOnEnd
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
-import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.google.android.material.elevation.SurfaceColors
import com.google.android.material.transition.platform.MaterialContainerTransform
import dev.chrisbanes.insetter.applyInsetter
import eu.kanade.domain.base.BasePreferences
-import eu.kanade.presentation.reader.BrightnessOverlay
import eu.kanade.presentation.reader.DisplayRefreshHost
import eu.kanade.presentation.reader.OrientationSelectDialog
import eu.kanade.presentation.reader.PageIndicatorText
+import eu.kanade.presentation.reader.ReaderContentOverlay
import eu.kanade.presentation.reader.ReaderPageActionsDialog
import eu.kanade.presentation.reader.ReadingModeSelectDialog
import eu.kanade.presentation.reader.appbars.ReaderAppBars
@@ -70,7 +69,6 @@ import eu.kanade.tachiyomi.ui.reader.viewer.ReaderProgressIndicator
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.system.hasDisplayCutout
import eu.kanade.tachiyomi.util.system.isNightMode
-import eu.kanade.tachiyomi.util.system.overridePendingTransitionCompat
import eu.kanade.tachiyomi.util.system.toShareIntent
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.setComposeContent
@@ -90,7 +88,6 @@ import tachiyomi.core.util.lang.launchIO
import tachiyomi.core.util.lang.launchNonCancellable
import tachiyomi.core.util.lang.withUIContext
import tachiyomi.core.util.system.logcat
-import tachiyomi.domain.manga.model.Manga
import tachiyomi.i18n.MR
import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt
@@ -139,7 +136,7 @@ class ReaderActivity : BaseActivity() {
*/
override fun onCreate(savedInstanceState: Bundle?) {
registerSecureActivity(this)
- overridePendingTransitionCompat(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit)
+ overridePendingTransition(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit)
super.onCreate(savedInstanceState)
@@ -185,7 +182,7 @@ class ReaderActivity : BaseActivity() {
.map { it.manga }
.distinctUntilChanged()
.filterNotNull()
- .onEach(::setManga)
+ .onEach { updateViewer() }
.launchIn(lifecycleScope)
viewModel.state
@@ -270,7 +267,7 @@ class ReaderActivity : BaseActivity() {
override fun finish() {
viewModel.onActivityFinish()
super.finish()
- overridePendingTransitionCompat(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit)
+ overridePendingTransition(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit)
}
override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
@@ -332,11 +329,24 @@ class ReaderActivity : BaseActivity() {
val isFullscreen by readerPreferences.fullscreen().collectAsState()
val flashOnPageChange by readerPreferences.flashOnPageChange().collectAsState()
+ val colorOverlayEnabled by readerPreferences.colorFilter().collectAsState()
+ val colorOverlay by readerPreferences.colorFilterValue().collectAsState()
+ val colorOverlayMode by readerPreferences.colorFilterMode().collectAsState()
+ val colorOverlayBlendMode = remember(colorOverlayMode) {
+ ReaderPreferences.ColorFilterMode.getOrNull(colorOverlayMode)?.second
+ }
+
val cropBorderPaged by readerPreferences.cropBorders().collectAsState()
val cropBorderWebtoon by readerPreferences.cropBordersWebtoon().collectAsState()
val isPagerType = ReadingMode.isPagerType(viewModel.getMangaReadingMode())
val cropEnabled = if (isPagerType) cropBorderPaged else cropBorderWebtoon
+ ReaderContentOverlay(
+ brightness = state.brightnessOverlayValue,
+ color = colorOverlay.takeIf { colorOverlayEnabled },
+ colorBlendMode = colorOverlayBlendMode,
+ )
+
ReaderAppBars(
visible = state.menuVisible,
fullscreen = isFullscreen,
@@ -379,10 +389,6 @@ class ReaderActivity : BaseActivity() {
onClickSettings = viewModel::openSettingsDialog,
)
- BrightnessOverlay(
- value = state.brightnessOverlayValue,
- )
-
if (flashOnPageChange) {
DisplayRefreshHost(
hostState = displayRefreshHost,
@@ -479,10 +485,9 @@ class ReaderActivity : BaseActivity() {
}
/**
- * Called from the presenter when a manga is ready. Used to instantiate the appropriate viewer
- * and the toolbar title.
+ * Called from the presenter when a manga is ready. Used to instantiate the appropriate viewer.
*/
- private fun setManga(manga: Manga) {
+ private fun updateViewer() {
val prevViewer = viewModel.state.value.viewer
val newViewer = ReadingMode.toViewer(viewModel.getMangaReadingMode(), this)
@@ -806,14 +811,6 @@ class ReaderActivity : BaseActivity() {
.onEach(::setCustomBrightness)
.launchIn(lifecycleScope)
- readerPreferences.colorFilter().changes()
- .onEach(::setColorFilter)
- .launchIn(lifecycleScope)
-
- readerPreferences.colorFilterMode().changes()
- .onEach { setColorFilter(readerPreferences.colorFilter().get()) }
- .launchIn(lifecycleScope)
-
merge(readerPreferences.grayscale().changes(), readerPreferences.invertedColors().changes())
.onEach { setLayerPaint(readerPreferences.grayscale().get(), readerPreferences.invertedColors().get()) }
.launchIn(lifecycleScope)
@@ -885,20 +882,6 @@ class ReaderActivity : BaseActivity() {
}
}
- /**
- * Sets the color filter overlay according to [enabled].
- */
- private fun setColorFilter(enabled: Boolean) {
- if (enabled) {
- readerPreferences.colorFilterValue().changes()
- .sample(100)
- .onEach(::setColorFilterValue)
- .launchIn(lifecycleScope)
- } else {
- binding.colorOverlay.isVisible = false
- }
- }
-
/**
* Sets the brightness of the screen. Range is [-75, 100].
* From -75 to -1 a semi-transparent black view is overlaid with the minimum brightness.
@@ -920,15 +903,6 @@ class ReaderActivity : BaseActivity() {
viewModel.setBrightnessOverlayValue(value)
}
-
- /**
- * Sets the color filter [value].
- */
- private fun setColorFilterValue(value: Int) {
- binding.colorOverlay.isVisible = true
- binding.colorOverlay.setFilterColor(value, readerPreferences.colorFilterMode().get())
- }
-
private fun setLayerPaint(grayscale: Boolean, invertedColors: Boolean) {
val paint = if (grayscale || invertedColors) getCombinedPaint(grayscale, invertedColors) else null
binding.viewerContainer.setLayerType(LAYER_TYPE_HARDWARE, paint)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt
deleted file mode 100644
index 6266ab239..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package eu.kanade.tachiyomi.ui.reader
-
-import android.content.Context
-import android.graphics.Canvas
-import android.graphics.Paint
-import android.graphics.PorterDuff
-import android.util.AttributeSet
-import android.view.View
-import androidx.core.graphics.toXfermode
-
-class ReaderColorFilterView(
- context: Context,
- attrs: AttributeSet? = null,
-) : View(context, attrs) {
-
- private val colorFilterPaint: Paint = Paint()
-
- fun setFilterColor(color: Int, filterMode: Int) {
- colorFilterPaint.color = color
- colorFilterPaint.xfermode = when (filterMode) {
- 1 -> PorterDuff.Mode.MULTIPLY
- 2 -> PorterDuff.Mode.SCREEN
- 3 -> PorterDuff.Mode.OVERLAY
- 4 -> PorterDuff.Mode.LIGHTEN
- 5 -> PorterDuff.Mode.DARKEN
- else -> PorterDuff.Mode.SRC_OVER
- }.toXfermode()
-
- invalidate()
- }
-
- override fun onDraw(canvas: Canvas) {
- super.onDraw(canvas)
- canvas.drawPaint(colorFilterPaint)
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt
index 56813b714..de5b5f011 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt
@@ -81,13 +81,13 @@ class SaveImageNotifier(private val context: Context) {
addAction(
R.drawable.ic_share_24dp,
context.stringResource(MR.strings.action_share),
- NotificationReceiver.shareImagePendingBroadcast(context, uri.path!!, notificationId),
+ NotificationReceiver.shareImagePendingBroadcast(context, uri),
)
// Delete action
addAction(
R.drawable.ic_delete_24dp,
context.stringResource(MR.strings.action_delete),
- NotificationReceiver.deleteImagePendingBroadcast(context, uri.path!!, notificationId),
+ NotificationReceiver.deleteImagePendingBroadcast(context, uri),
)
updateNotification()
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt
index 01073cd60..ad0e58a15 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderOrientation.kt
@@ -1,57 +1,62 @@
package eu.kanade.tachiyomi.ui.reader.setting
import android.content.pm.ActivityInfo
-import androidx.annotation.DrawableRes
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ScreenLockLandscape
+import androidx.compose.material.icons.filled.ScreenLockPortrait
+import androidx.compose.material.icons.filled.ScreenRotation
+import androidx.compose.material.icons.filled.StayCurrentLandscape
+import androidx.compose.material.icons.filled.StayCurrentPortrait
+import androidx.compose.ui.graphics.vector.ImageVector
import dev.icerock.moko.resources.StringResource
-import eu.kanade.tachiyomi.R
import tachiyomi.i18n.MR
enum class ReaderOrientation(
val flag: Int,
val stringRes: StringResource,
- @DrawableRes val iconRes: Int,
+ val icon: ImageVector,
val flagValue: Int,
) {
DEFAULT(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED,
MR.strings.label_default,
- R.drawable.ic_screen_rotation_24dp,
+ Icons.Default.ScreenRotation,
0x00000000,
),
FREE(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED,
MR.strings.rotation_free,
- R.drawable.ic_screen_rotation_24dp,
+ Icons.Default.ScreenRotation,
0x00000008,
),
PORTRAIT(
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT,
MR.strings.rotation_portrait,
- R.drawable.ic_stay_current_portrait_24dp,
+ Icons.Default.StayCurrentPortrait,
0x00000010,
),
LANDSCAPE(
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE,
MR.strings.rotation_landscape,
- R.drawable.ic_stay_current_landscape_24dp,
+ Icons.Default.StayCurrentLandscape,
0x00000018,
),
LOCKED_PORTRAIT(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,
MR.strings.rotation_force_portrait,
- R.drawable.ic_screen_lock_portrait_24dp,
+ Icons.Default.ScreenLockPortrait,
0x00000020,
),
LOCKED_LANDSCAPE(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,
MR.strings.rotation_force_landscape,
- R.drawable.ic_screen_lock_landscape_24dp,
+ Icons.Default.ScreenLockLandscape,
0x00000028,
),
REVERSE_PORTRAIT(
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT,
MR.strings.rotation_reverse_portrait,
- R.drawable.ic_stay_current_portrait_24dp,
+ Icons.Default.StayCurrentPortrait,
0x00000030,
),
;
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt
index f4992dbc0..4de0ecd94 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt
@@ -1,5 +1,7 @@
package eu.kanade.tachiyomi.ui.reader.setting
+import android.os.Build
+import androidx.compose.ui.graphics.BlendMode
import dev.icerock.moko.resources.StringResource
import tachiyomi.core.preference.PreferenceStore
import tachiyomi.core.preference.getEnum
@@ -178,5 +180,24 @@ class ReaderPreferences(
MR.strings.zoom_start_right,
MR.strings.zoom_start_center,
)
+
+ val ColorFilterMode = buildList {
+ addAll(
+ listOf(
+ MR.strings.label_default to BlendMode.SrcOver,
+ MR.strings.filter_mode_multiply to BlendMode.Modulate,
+ MR.strings.filter_mode_screen to BlendMode.Screen,
+ ),
+ )
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ addAll(
+ listOf(
+ MR.strings.filter_mode_overlay to BlendMode.Overlay,
+ MR.strings.filter_mode_lighten to BlendMode.Lighten,
+ MR.strings.filter_mode_darken to BlendMode.Darken,
+ ),
+ )
+ }
+ }
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt
index 5afd8364c..61d09dc79 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt
@@ -13,7 +13,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
import eu.kanade.tachiyomi.util.system.WebViewUtil
import eu.kanade.tachiyomi.util.system.openInBrowser
-import eu.kanade.tachiyomi.util.system.overridePendingTransitionCompat
import eu.kanade.tachiyomi.util.system.toShareIntent
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.setComposeContent
@@ -36,7 +35,7 @@ class WebViewActivity : BaseActivity() {
}
override fun onCreate(savedInstanceState: Bundle?) {
- overridePendingTransitionCompat(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit)
+ overridePendingTransition(R.anim.shared_axis_x_push_enter, R.anim.shared_axis_x_push_exit)
super.onCreate(savedInstanceState)
if (!WebViewUtil.supportsWebView(this)) {
@@ -78,7 +77,7 @@ class WebViewActivity : BaseActivity() {
override fun finish() {
super.finish()
- overridePendingTransitionCompat(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit)
+ overridePendingTransition(R.anim.shared_axis_x_pop_enter, R.anim.shared_axis_x_pop_exit)
}
private fun shareWebpage(url: String) {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt
deleted file mode 100644
index c145f0e28..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ActivityExtensions.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package eu.kanade.tachiyomi.util.system
-
-import android.app.Activity
-import android.os.Build
-import androidx.annotation.AnimRes
-
-fun Activity.overridePendingTransitionCompat(@AnimRes enterAnim: Int, @AnimRes exitAnim: Int) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
- overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, enterAnim, exitAnim)
- } else {
- @Suppress("DEPRECATION")
- overridePendingTransition(enterAnim, exitAnim)
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt
index 5f91bfbac..05c0971fd 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt
@@ -1,18 +1,15 @@
package eu.kanade.tachiyomi.util.system
-import android.app.ActivityManager
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
-import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build
import android.os.PowerManager
import androidx.appcompat.view.ContextThemeWrapper
-import androidx.core.content.PermissionChecker
import androidx.core.content.getSystemService
import androidx.core.net.toUri
import com.hippo.unifile.UniFile
@@ -55,39 +52,9 @@ fun Context.copyToClipboard(label: String, content: String) {
}
}
-/**
- * Checks if the give permission is granted.
- *
- * @param permission the permission to check.
- * @return true if it has permissions.
- */
-fun Context.hasPermission(
- permission: String,
-) = PermissionChecker.checkSelfPermission(this, permission) == PermissionChecker.PERMISSION_GRANTED
-
val Context.powerManager: PowerManager
get() = getSystemService()!!
-/**
- * Convenience method to acquire a partial wake lock.
- */
-fun Context.acquireWakeLock(tag: String): PowerManager.WakeLock {
- val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$tag:WakeLock")
- wakeLock.acquire()
- return wakeLock
-}
-
-/**
- * Returns true if the given service class is running.
- */
-fun Context.isServiceRunning(serviceClass: Class<*>): Boolean {
- val className = serviceClass.name
- val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
- @Suppress("DEPRECATION")
- return manager.getRunningServices(Integer.MAX_VALUE)
- .any { className == it.service.className }
-}
-
fun Context.openInBrowser(url: String, forceDefaultBrowser: Boolean = false) {
this.openInBrowser(url.toUri(), forceDefaultBrowser)
}
@@ -200,11 +167,3 @@ fun Context.isInstalledFromFDroid(): Boolean {
// F-Droid builds typically disable the updater
(!BuildConfig.INCLUDE_UPDATER && !isDevFlavor)
}
-
-fun Context.getApplicationIcon(pkgName: String): Drawable? {
- return try {
- packageManager.getApplicationIcon(pkgName)
- } catch (e: PackageManager.NameNotFoundException) {
- null
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt
index 02d721725..e565921db 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/WorkManagerExtensions.kt
@@ -1,8 +1,12 @@
package eu.kanade.tachiyomi.util.system
import android.content.Context
+import androidx.work.CoroutineWorker
import androidx.work.WorkInfo
import androidx.work.WorkManager
+import kotlinx.coroutines.delay
+import logcat.LogPriority
+import tachiyomi.core.util.system.logcat
val Context.workManager: WorkManager
get() = WorkManager.getInstance(this)
@@ -11,3 +15,21 @@ fun WorkManager.isRunning(tag: String): Boolean {
val list = this.getWorkInfosByTag(tag).get()
return list.any { it.state == WorkInfo.State.RUNNING }
}
+
+/**
+ * Makes this worker run in the context of a foreground service.
+ *
+ * Note that this function is a no-op if the process is subject to foreground
+ * service restrictions.
+ *
+ * Moving to foreground service context requires the worker to run a bit longer,
+ * allowing Service.startForeground() to be called and avoiding system crash.
+ */
+suspend fun CoroutineWorker.setForegroundSafely() {
+ try {
+ setForeground(getForegroundInfo())
+ delay(500)
+ } catch (e: IllegalStateException) {
+ logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" }
+ }
+}
diff --git a/app/src/main/res/color/ripple_toolbar_fainter.xml b/app/src/main/res/color/ripple_toolbar_fainter.xml
deleted file mode 100644
index e7fb4ba66..000000000
--- a/app/src/main/res/color/ripple_toolbar_fainter.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/color/slider_active_track.xml b/app/src/main/res/color/slider_active_track.xml
deleted file mode 100644
index 764d21bf3..000000000
--- a/app/src/main/res/color/slider_active_track.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/color/slider_inactive_track.xml b/app/src/main/res/color/slider_inactive_track.xml
deleted file mode 100644
index 0f624c117..000000000
--- a/app/src/main/res/color/slider_inactive_track.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_blank_24dp.xml b/app/src/main/res/drawable/ic_blank_24dp.xml
deleted file mode 100644
index 940db069f..000000000
--- a/app/src/main/res/drawable/ic_blank_24dp.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_offline_pin_24dp.xml b/app/src/main/res/drawable/ic_offline_pin_24dp.xml
deleted file mode 100644
index f3dcb3625..000000000
--- a/app/src/main/res/drawable/ic_offline_pin_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_screen_lock_landscape_24dp.xml b/app/src/main/res/drawable/ic_screen_lock_landscape_24dp.xml
deleted file mode 100644
index 6c46c7b8a..000000000
--- a/app/src/main/res/drawable/ic_screen_lock_landscape_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_screen_lock_portrait_24dp.xml b/app/src/main/res/drawable/ic_screen_lock_portrait_24dp.xml
deleted file mode 100644
index c7ee82f6b..000000000
--- a/app/src/main/res/drawable/ic_screen_lock_portrait_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_screen_rotation_24dp.xml b/app/src/main/res/drawable/ic_screen_rotation_24dp.xml
deleted file mode 100644
index 04460bd85..000000000
--- a/app/src/main/res/drawable/ic_screen_rotation_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_stay_current_landscape_24dp.xml b/app/src/main/res/drawable/ic_stay_current_landscape_24dp.xml
deleted file mode 100644
index a36b366c4..000000000
--- a/app/src/main/res/drawable/ic_stay_current_landscape_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_stay_current_portrait_24dp.xml b/app/src/main/res/drawable/ic_stay_current_portrait_24dp.xml
deleted file mode 100644
index 25ce49739..000000000
--- a/app/src/main/res/drawable/ic_stay_current_portrait_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_webview_24dp.xml b/app/src/main/res/drawable/ic_webview_24dp.xml
deleted file mode 100644
index 9400f45ed..000000000
--- a/app/src/main/res/drawable/ic_webview_24dp.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/transparent_tabs_background.xml b/app/src/main/res/drawable/transparent_tabs_background.xml
deleted file mode 100644
index a503ef698..000000000
--- a/app/src/main/res/drawable/transparent_tabs_background.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- -
-
-
-
-
- -
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/reader_activity.xml b/app/src/main/res/layout/reader_activity.xml
index da843c09f..ed289767a 100644
--- a/app/src/main/res/layout/reader_activity.xml
+++ b/app/src/main/res/layout/reader_activity.xml
@@ -21,12 +21,6 @@
-
-
- 24dp
-
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index e82288767..af52b6c3d 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,6 +1,4 @@
- 16dp
-
16dp
12dp
diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml
index 7ef758874..09c6b0e77 100644
--- a/gradle/androidx.versions.toml
+++ b/gradle/androidx.versions.toml
@@ -1,5 +1,5 @@
[versions]
-agp_version = "8.1.4"
+agp_version = "8.2.0"
lifecycle_version = "2.6.2"
paging_version = "3.2.1"
@@ -20,14 +20,14 @@ lifecycle-common = { module = "androidx.lifecycle:lifecycle-common", version.ref
lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.ref = "lifecycle_version" }
lifecycle-runtimektx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle_version" }
-workmanager = "androidx.work:work-runtime-ktx:2.8.1"
+workmanager = "androidx.work:work-runtime:2.9.0"
paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "paging_version" }
paging-compose = { module = "androidx.paging:paging-compose", version.ref = "paging_version" }
-benchmark-macro = "androidx.benchmark:benchmark-macro-junit4:1.2.1"
-test-ext = "androidx.test.ext:junit-ktx:1.2.0-alpha01"
-test-espresso-core = "androidx.test.espresso:espresso-core:3.6.0-alpha01"
+benchmark-macro = "androidx.benchmark:benchmark-macro-junit4:1.2.2"
+test-ext = "androidx.test.ext:junit-ktx:1.2.0-alpha02"
+test-espresso-core = "androidx.test.espresso:espresso-core:3.6.0-alpha02"
test-uiautomator = "androidx.test.uiautomator:uiautomator:2.3.0-alpha05"
[bundles]
diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml
index ce7b074bf..6bfad292f 100644
--- a/gradle/compose.versions.toml
+++ b/gradle/compose.versions.toml
@@ -1,6 +1,6 @@
[versions]
-compiler = "1.5.4"
-compose-bom = "2023.12.00-alpha02"
+compiler = "1.5.5"
+compose-bom = "2023.12.00-alpha03"
accompanist = "0.33.2-alpha"
[libraries]
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index c556a1674..6d27bb4dc 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -15,7 +15,6 @@ android-shortcut-gradle = "com.github.zellius:android-shortcut-gradle-plugin:0.1
google-services-gradle = "com.google.gms:google-services:4.4.0"
rxjava = "io.reactivex:rxjava:1.3.8"
-flowreactivenetwork = "ru.beryukhov:flowreactivenetwork:1.0.4"
okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp_version" }
okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp_version" }
@@ -27,7 +26,7 @@ conscrypt-android = "org.conscrypt:conscrypt-android:2.5.2"
quickjs-android = "app.cash.quickjs:quickjs-android:0.9.2"
-jsoup = "org.jsoup:jsoup:1.16.2"
+jsoup = "org.jsoup:jsoup:1.17.1"
disklrucache = "com.jakewharton:disklrucache:2.0.2"
unifile = "com.github.tachiyomiorg:unifile:7c257e1c64"
@@ -94,11 +93,10 @@ voyager-navigator = { module = "cafe.adriel.voyager:voyager-navigator", version.
voyager-tab-navigator = { module = "cafe.adriel.voyager:voyager-tab-navigator", version.ref = "voyager" }
voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" }
-ktlint = "org.jlleitschuh.gradle:ktlint-gradle:11.6.1"
+ktlint = "org.jlleitschuh.gradle:ktlint-gradle:12.0.2"
google-api-services-drive = "com.google.apis:google-api-services-drive:v3-rev197-1.25.0"
google-api-client-oauth = "com.google.oauth-client:google-oauth-client:1.34.1"
-
[bundles]
okhttp = ["okhttp-core", "okhttp-logging", "okhttp-brotli", "okhttp-dnsoverhttps"]
js-engine = ["quickjs-android"]
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 3fa8f862f..1af9e0930 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/i18n/src/commonMain/resources/MR/am/strings.xml b/i18n/src/commonMain/resources/MR/am/strings.xml
index 4a07d01ac..b829f44db 100644
--- a/i18n/src/commonMain/resources/MR/am/strings.xml
+++ b/i18n/src/commonMain/resources/MR/am/strings.xml
@@ -158,12 +158,10 @@
ማስተካከያዎች
ተጨማሪ
ስም
- ብጁ አካባቢ
ዕልባት የተደረገባቸውን ምዕራፎች ሰርዝ
ካነበብኩ በኋላ
በእጅ እንደተነበበ ምልክት ከተደረገ በኋላ
ምዕራፎችን ሰርዝ
- አካባቢን ያውርዱ
የጎን ሽፋን
ንባብ
የንባብ ሁነታ
@@ -246,9 +244,7 @@
ኣ
ልክ ያልሆነ የመጠባበቂያ ፋይል
ምትኬ ተፈጥሯል
- ከፍተኛ መጠባበቂያዎች
የመጠባበቂያ ድግግሞሽ
- የመጠባበቂያ ቦታ
ቤተ-መጽሐፍት ከመጠባበቂያ ፋይል ይመልሱ
ምትኬ ወደነበረበት
የአሁኑን ቤተ-መጽሐፍት ወደነበረበት ለመመለስ ሊያገለግል ይችላል
diff --git a/i18n/src/commonMain/resources/MR/ar/strings.xml b/i18n/src/commonMain/resources/MR/ar/strings.xml
index ec7204278..7040a74da 100644
--- a/i18n/src/commonMain/resources/MR/ar/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ar/strings.xml
@@ -116,10 +116,8 @@
حر
الوضع الرأسي اﻹجباري
الوضع الأفقي الإجباري
- موقع التنزيل
بعد وضع علامة \"مقروءة\" يدوياً
الحذف تلقائيا بعد القراءة
- مجلد مخصص
معطل
آخر فصل مقروء
من الفصل الثاني قبل الأخير
@@ -132,9 +130,7 @@
يمكن استخدامها لإستعادة المكتبة الحالية
إستعادة النسخة الإحتياطية
إستعادة مكتبة من ملف نسخة إحتياطية
- موقع النسخ الإحتياطي
معدل النسخ الاحتياطي التلقائي
- أقصى عدد للنسخ الاحتياطية التلقائية
أُنشئت نسخة احتياطية
اكتملت الاستعادة
ما الذي تريد نسخه احتياطيّاً؟
@@ -350,7 +346,6 @@
الفصول %1$s
الفصل %1$s و%2$d فصول أخرى
الفصل %1$s
- جارٍ التحقق من وجود فصول جديدة
الفصل %1$s - %2$s
تُحدَّث المكتبة
وضع القراءة
@@ -768,4 +763,10 @@
لم يُعثَر على مترجمين
المترجم
احجب بعض المترجمين
+ خيارات أكثر
+ محدَّد
+ غير مُحدَّد
+ اصعد
+ مكان التخزين
+ يُستخدَم في الاحتياط وتنزيل الفصول والمصدر المحليِّ.
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/be/strings.xml b/i18n/src/commonMain/resources/MR/be/strings.xml
index 2e94d6897..e1799953d 100644
--- a/i18n/src/commonMain/resources/MR/be/strings.xml
+++ b/i18n/src/commonMain/resources/MR/be/strings.xml
@@ -288,12 +288,10 @@
Перадапошняя частка
Апошняя прачытаная частка
Адключана
- Карыстацкая дырэкторыя
Дазволіць выдаленне частак з закладкамі
Аўтаматычна пасля чытання
Пасля таго, як пазначана як \"Прачытанае\"
Выдаліць часткі
- Каталог загрузак
Найнізкая
Нізкая
Высокая
diff --git a/i18n/src/commonMain/resources/MR/bg/strings.xml b/i18n/src/commonMain/resources/MR/bg/strings.xml
index 2ff68ca60..8efd0173d 100644
--- a/i18n/src/commonMain/resources/MR/bg/strings.xml
+++ b/i18n/src/commonMain/resources/MR/bg/strings.xml
@@ -106,10 +106,8 @@
G
B
A
- Директория на изтеглянията
След маркиране като прочетено
След прочитане автоматично изтрийте
- Персонализирана директория
Изключено
Последно прочетена глава
Предпоследна прочетена глава
@@ -214,9 +212,7 @@
Може да се използва за възстановяване на текущата библиотека
Възстанови резервно копие
Възстанови библиотеката от резервно копие
- Директория за резервното копие
Честота на запазване
- Максимален брой копия
Резервно копие създадено
Възстановяването завършено
Какво искате да запазите?
@@ -310,7 +306,6 @@
Глави %1$s
Глава %1$s и %2$d още
Глава %1$s
- Проверяване за нови глави
Гл. %1$s - %2$s
Обновяване на библиотеката
Добави проследяване
diff --git a/i18n/src/commonMain/resources/MR/bn/strings.xml b/i18n/src/commonMain/resources/MR/bn/strings.xml
index 8605763b0..07728c4bb 100644
--- a/i18n/src/commonMain/resources/MR/bn/strings.xml
+++ b/i18n/src/commonMain/resources/MR/bn/strings.xml
@@ -122,10 +122,8 @@
স
নী
আ
- ডাউনলোডের স্থান
পঠিত হিসেবে চিহ্নিত করার পর
পড়ার পর স্বয়ংক্রিয়ভাবে
- স্বনির্ধারিত নির্দেশক
নিষ্ক্রিয়
শেষ পঠিত অধ্যায়
২য় থেকে শেষ অধ্যায়
@@ -138,9 +136,7 @@
বর্তমান সংগ্রহশালা পুনরুদ্ধারের জন্য ব্যাবহার করা যাবে
ব্যাকআপ পুনরুদ্ধার
ব্যাকআপ ফাইল থেকে সংগ্রহশালা পুনরুদ্ধার করুন
- ব্যাকআপের স্থান
ব্যাকআপ ফ্রিকোয়েন্সি
- সর্বোচ্চ ব্যাকআপ
ব্যাকআপ তৈরী হয়েছে
পুনরুদ্ধার সম্পন্ন হয়েছে
আপনি কি ব্যাকআপ করতে ইচ্ছুক?
@@ -393,7 +389,6 @@
অধ্যায়গুলি %1$s
অধ্যায় %1$s এবং %2$d আরও
অধ্যায় %1$s
- নতুন অধ্যায়ের জন্য অনুসন্ধান করা হচ্ছে
কম সঞ্চয়স্থানের কারণে অধ্যায়গুলি ডাউনলোড করা যায়নি
অঃ %1$s - %2$s
সংগ্রহশালার হালনাগাদ হচ্ছে
diff --git a/i18n/src/commonMain/resources/MR/ca/plurals.xml b/i18n/src/commonMain/resources/MR/ca/plurals.xml
index 0309ac347..a8c2ffa28 100644
--- a/i18n/src/commonMain/resources/MR/ca/plurals.xml
+++ b/i18n/src/commonMain/resources/MR/ca/plurals.xml
@@ -2,66 +2,82 @@
- Després d’%1$s minut
+ - Després de %1$s minuts
- Després de %1$s minuts
- %1$d capítol nou
+ - %1$d capítols nous
- %1$d capítols nous
- Capítols %1$s i 1 més
+ - Capítols %1$s i %2$d més
- Capítols %1$s i %2$d més
- Per a %d element
+ - Per a %d elements
- Per a %d elements
- Hi ha una actualització d’una extensió
+ - Hi ha actualitzacions de %d extensions
- Hi ha actualitzacions de %d extensions
- En resta %1$s
+ - En resten %1$s
- En resten %1$s
- Fet en %1$s amb %2$s error
+ - Fet en %1$s amb %2$s errors
- Fet en %1$s amb %2$s errors
- %d categoria
+ - %d categories
- %d categories
- %1$s capítol
+ - %1$s capítols
- %1$s capítols
- %d servei de seguiment
+ - %d serveis de seguiment
- %d serveis de seguiment
- S’ha omès %d capítol. És possible que manqui a la font o que hagi estat filtrat
+ - S’han omès %d capítols. És possible que manquin a la font o que hagin estat filtrats
- S’han omès %d capítols. És possible que manquin a la font o que hagin estat filtrats
- Ahir
+ - Fa %1$d dies
- Fa %1$d dies
- El següent capítol no llegit
+ - Els següents %d capítols no llegits
- Els següents %d capítols no llegits
- El següent capítol
+ - Els següents %d capítols
- Els següents %d capítols
- Manca %1$s capítol
+ - Manquen %1$s capítols
- Manquen %1$s capítols
- 1 dia
+ - %d dies
- %d dies
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/ca/strings.xml b/i18n/src/commonMain/resources/MR/ca/strings.xml
index 3740982d9..b132407c8 100644
--- a/i18n/src/commonMain/resources/MR/ca/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ca/strings.xml
@@ -144,11 +144,9 @@
G
B
A
- Ubicació de les baixades
Després de marcar com a llegit de manera manual
Suprimeix automàticament després de llegir
Velocitat de l’animació del doble toc
- Ubicació personalitzada
Desactivat
Darrer capítol llegit
Penúltim capítol llegit
@@ -161,9 +159,7 @@
Es pot utilitzar per a restaurar la biblioteca actual
Restaura una còpia de seguretat
Restaura la biblioteca del fitxer de còpia de seguretat
- Ubicació de la còpia de seguretat
Freqüència de la còpia de seguretat automàtica
- Màxim de còpies de seguretat automàtiques
S’ha creat la còpia de seguretat
S’ha completat la restauració
De què voleu fer una còpia de seguretat\?
@@ -327,7 +323,6 @@
Capítol %1$s i %2$d més
Capítols %1$s
Amaga el contingut de les notificacions
- S’està comprovant si hi ha capítols nous
Desactiva l’optimització de la bateria
Fa que funcionin millor les actualitzacions de la biblioteca en segon pla i les còpies de seguretat
L’optimització de la bateria ja està desactivada
@@ -768,4 +763,10 @@
Puntuació del servei de seguiment
Dades i emmagatzematge
Exclou scanlators
+ Seleccionat
+ No seleccionat
+ Ubicació de l’emmagatzematge
+ S’utilitza per a les còpies de seguretat automàtiques, les baixades de capítols i la font local.
+ Més opcions
+ Navega cap amunt
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/ceb/strings.xml b/i18n/src/commonMain/resources/MR/ceb/strings.xml
index 2ab18919f..01b4ce101 100644
--- a/i18n/src/commonMain/resources/MR/ceb/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ceb/strings.xml
@@ -297,13 +297,11 @@
Pagbasa
Taas
Ubos
- Lokasyon sa pag-download
Pagtangtang sa mga kapitulo
Human gimarkahan sa mano-mano ingon nabasa na
Human sa pagbasa awtomatikong tangtangon
Tugoti ang pagtangtang sa gimarkahan nga mga kapitulo
Wala iapil nga mga kategorya
- Pasadya nga lokasyon
Nabaldado
Ikalima hangtod sa kataposang pagbasa sa kapitulo
Awtomatikong pag-download
@@ -350,8 +348,6 @@
Uri sa sukdanan sa hulagway
Ibalik ang backup
Ibalik ang librarya gikan sa backup file
- Backup nga lokasyon
- Maximum nga pag-backup
Gihimo ang backup
Kadaghanon sa pag-backup
Dili balido nga backup file
diff --git a/i18n/src/commonMain/resources/MR/cs/strings.xml b/i18n/src/commonMain/resources/MR/cs/strings.xml
index a770c0c64..a752f5af0 100644
--- a/i18n/src/commonMain/resources/MR/cs/strings.xml
+++ b/i18n/src/commonMain/resources/MR/cs/strings.xml
@@ -84,10 +84,8 @@
G
B
A
- Umístění pro stažení
Po ručním označení jako přečtené
Po přečtení automaticky smazat
- Vlastní umístění
Stahovat nové kapitoly
Uživatelské jméno
Heslo
@@ -207,7 +205,6 @@
Sledovače
Vytvořit zálohu
Obnovit zálohu
- Místo zálohy
Frekvence automatických záloh
Záloha vytvořena
Obnova dokončena
@@ -258,7 +255,6 @@
Pátá předposlední přečtená kapitola
Lze použít k obnovení aktuální knihovny
Obnovit knihovnu ze záložního souboru
- Maximum automatických záloh
Přihlásit se do %1$s
Název zdroje
Číslo kapitoly
@@ -420,7 +416,6 @@
Kapitoly %1$s
Kapitola %1$s a %2$d dalších
Kapitola %1$s
- Hledám nové kapitoly
Nelze stáhnout kapitoly kvůli nedostatku místa
Návod k přesunu zdrojů
Jste si jistý/á\? Všechna historie bude navždy ztracena.
diff --git a/i18n/src/commonMain/resources/MR/cv/strings.xml b/i18n/src/commonMain/resources/MR/cv/strings.xml
index 9ded14d5d..d0401db23 100644
--- a/i18n/src/commonMain/resources/MR/cv/strings.xml
+++ b/i18n/src/commonMain/resources/MR/cv/strings.xml
@@ -11,7 +11,6 @@
Юлашки вуланӑ сыпăк
Сӳнтернӗ
Вуланӑ хыҫҫӑн
- Тийев вырӑнӗ
Вулани
Кӑвак
Симӗс
@@ -190,7 +189,6 @@
Вуланӑ сыпӑкран тӑваттӑмӗшӗ
Вуланӑ сыпӑкран виҫҫӗмӗшӗ
Юлашкинчен маларахри
- Усӑҫ палӑртнӑ вырӑнӗ
Вуланӑ пек палӑртнӑ хыҫҫӑн катерт
Хӑйӗн виҫе
Елсерен
@@ -275,7 +273,6 @@
Хуплашкана ҫӗнетеймерӗ
%1$s сыпӑкӗ тата ытти %2$d
%1$s сыпӑкӗсем
- Ҫӗнӗ сыпӑксен пуррине тӗрӗслени
Сыпӑксене тийесе илме пулмасть. Тийевсем пайӗнче ҫӗнӗрен хӑтланса пӑхма пултаратӑн
Ӑтавла
Куҫар
@@ -401,8 +398,6 @@
Хальхи вулавăша тавӑрма усӑ курма пулать
Янтӑвра манкӑсем ҫук.
Янтӑв тӑвӑннӑ
- Май килнӗ таран янтӑвсем
- Янтӑв вырнаҫни
Вулавӑша янтӑвран тавӑр
Янтӑв тавӑр
Янтӑв ту
diff --git a/i18n/src/commonMain/resources/MR/da/strings.xml b/i18n/src/commonMain/resources/MR/da/strings.xml
index 3362db563..cb2a3bea7 100644
--- a/i18n/src/commonMain/resources/MR/da/strings.xml
+++ b/i18n/src/commonMain/resources/MR/da/strings.xml
@@ -286,7 +286,6 @@
Læser
Udvidelsesopdateringer
Sikkerhedskopiering mislykkedes
- Placering af sikkerhedskopi
Fri
Fejl
Gendannelse fuldført
@@ -300,7 +299,6 @@
Læsetilstand
Du er ved at fjerne \"%s\" fra dit bibliotek
Højeste
- Maksimale antal automatiske sikkerhedskopier
Lav
Kildeindstillinger
App-indstillinger
diff --git a/i18n/src/commonMain/resources/MR/de/strings.xml b/i18n/src/commonMain/resources/MR/de/strings.xml
index 58231342e..737264efe 100644
--- a/i18n/src/commonMain/resources/MR/de/strings.xml
+++ b/i18n/src/commonMain/resources/MR/de/strings.xml
@@ -118,10 +118,8 @@
G
B
A
- Speicherort
Nachdem manuell als gelesen markiert
Automatisch nach dem Lesen löschen
- Eigener Speicherort
Deaktiviert
Ab zuletzt gelesenem Kapitel
Ab zweitletzt gelesenem Kapitel
@@ -134,9 +132,7 @@
Kann benutzt werden, um die aktuelle Bibliothek wiederherzustellen
Datensicherung wiederherstellen
Bibliothek mit Hilfe einer Datensicherung wiederherstellen
- Sicherungsspeicherort
Automatische Datensicherungshäufigkeit
- Maximale Anzahl automatischer Datensicherungen
Datensicherung erstellt
Wiederherstellen abgeschlossen
Was möchtest du sichern\?
@@ -327,7 +323,6 @@
Kapitel %1$s und %2$d mehr
Kapitel %1$s
Benachrichtigungsinhalt verbergen
- Überprüfe auf neue Kapitel
Akkuverbrauch-Optimierung deaktivieren
Hilft bei Bibliotheksaktualisierungen und -sicherungen im Hintergrund
Akkuverbrauch-Optimierung ist bereits deaktiviert
@@ -768,4 +763,10 @@
Speichernutzung
Tracker-Bewertung
Scanlatoren ausschließen
+ Ausgewählt
+ Nicht ausgewählt
+ Speicherort
+ Wird für automatische Datensicherungen, heruntergeladene Kapitel und lokale Quellen verwendet.
+ Weitere Optionen
+ Nach oben navigieren
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/el/strings.xml b/i18n/src/commonMain/resources/MR/el/strings.xml
index 9d086ba05..d27a7219e 100644
--- a/i18n/src/commonMain/resources/MR/el/strings.xml
+++ b/i18n/src/commonMain/resources/MR/el/strings.xml
@@ -145,10 +145,8 @@
G
B
A
- Τοποθεσία λήψεων
Αφού επισημανθεί χειροκίνητα ως αναγνωσμένο
Αυτόματη διαγραφή μετά την ανάγνωση
- Προσαρμοσμένη τοποθεσία
Απενεργοποιημένο
Τελευταίο αναγνωσμένο κεφάλαιο
Προτελευταίο αναγνωσμένο κεφάλαιο
@@ -161,9 +159,7 @@
Μπορεί να χρησιμοποιηθεί για επαναφορά τρέχουσας βιβλιοθήκης
Επαναφορά αντιγράφου ασφαλείας
Επαναφορά βιβλιοθήκης από αρχείο αντιγράφου ασφαλείας
- Τοποθεσία αντιγράφων ασφαλείας
Συχνότητα αυτόματων αντιγράφων ασφαλείας
- Μέγιστα αυτόματα αντίγραφα ασφαλείας
Δημιουργήθηκε αντίγραφο ασφαλείας
Η επαναφορά ολοκληρώθηκε
Τι αντίγραφο ασφαλείας θέλετε να δημιουργήσετε;
@@ -308,7 +304,6 @@
Κεφάλαιο %1$s και %2$d ακόμη
Κεφάλαια %1$s
Κεφάλαιο %1$s
- Έλεγχος για νέα κεφάλαια
Κεφ. %1$s - %2$s
Ενημέρωση βιβλιοθήκης
Σε παύση
@@ -768,4 +763,10 @@
Δε βρέθηκαν scanlators
Scanlator
Εξαίρεση scanlator
+ Περισσότερες επιλογές
+ Επιλεγμένο
+ Μη επιλεγμένο
+ Πλοήγηση προς τα πάνω
+ Τοποθεσία αποθήκευσης
+ Χρησιμοποιείται για αυτόματα αντίγραφα ασφαλείας, λήψη κεφαλαίων και τοπική πηγή.
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/eo/strings.xml b/i18n/src/commonMain/resources/MR/eo/strings.xml
index ef4cf570f..03555cbfc 100644
--- a/i18n/src/commonMain/resources/MR/eo/strings.xml
+++ b/i18n/src/commonMain/resources/MR/eo/strings.xml
@@ -108,12 +108,10 @@
Ĉiutage
Nevalida savkopia dosiero
Savkopio kreita
- Savkopiejo
Krei savkopion
Elŝuti novajn ĉapitrojn
Malŝaltita
Forigi ĉapitrojn
- Elŝutejo
Sen animacioj
Originala grando
Streĉi
@@ -132,7 +130,6 @@
En biblioteko
Aldonita al biblioteko
Aldoni al biblioteko
- Propra dosierujo
Aŭtomate post legado
Legada
Legada reĝimo
@@ -364,7 +361,6 @@
Kromaĵaj ĝisdatigoj
Elŝutito paŭzigita
Elŝutilo
- Kontrolas por trovi novajn ĉapitrojn
Por ĉi-serion
Propra filtrilo
Fonto ne subtenita
@@ -386,7 +382,6 @@
Restaŭras savkopion
Restaŭrado kompletita
Savkopio enhavas neniun mangaon.
- Maksimume savkopioj
Deviga horizontala
Deviga vertikala
Vertikala
diff --git a/i18n/src/commonMain/resources/MR/es/strings.xml b/i18n/src/commonMain/resources/MR/es/strings.xml
index 764824f21..4fc2ae17d 100644
--- a/i18n/src/commonMain/resources/MR/es/strings.xml
+++ b/i18n/src/commonMain/resources/MR/es/strings.xml
@@ -87,10 +87,8 @@
Cualquier dirección
Forzar en vertical
Forzar en horizontal
- Carpeta de descarga
Borrarlos tras marcarlos como leídos de forma manual
Borrar capítulos terminados de forma automática
- Ubicación personalizada
Servicios de seguimiento
Vaciar la caché de capítulos
Usado: %1$s
@@ -205,9 +203,7 @@
Se puede utilizar para restaurar la biblioteca actual
Restaurar copia de seguridad
Restaurar la biblioteca a partir de una copia de seguridad
- Ubicación de la copia de respaldo
- Frecuencia de la copia de seguridad automática
- Copias de seguridad automáticas máximas
+ Frecuencia de respaldo automático
Copia de seguridad creada
Restauración completada
¿De qué quieres hacer una copia de seguridad\?
@@ -328,7 +324,6 @@
Capítulo %1$s y %2$d más
Capítulos %1$s
Ocultar el contenido de las notificaciones
- Buscando nuevos capítulos
Desactivar la optimización de batería
Correo electrónico
Mejora la cadencia de las actualizaciones y las copias de respaldo que se hagan en segundo plano
@@ -398,7 +393,7 @@
No se ha encontrado la fuente
Desactivar
Es necesario reiniciar la aplicación para que surja efecto
- Networking
+ Red
Estado desconocido
Ambos
Vertical
@@ -486,7 +481,7 @@
Mostrar el número de elementos
Fecha de obtención del capítulo
Tipo de rotación
- Crea carpetas según el título de las entradas
+ Crea carpetas según el título de la obra
Guardar las páginas en carpetas independientes
Acciones
Escala de grises
@@ -554,7 +549,7 @@
Advertencia
Las actualizaciones grandes pueden implicar un mayor uso de la batería y que los distintos servicios bloqueen o ralenticen el acceso a tu dispositivo. Toca aquí para más información.
Idioma
- También deberías guardar las copias de seguridad en otros lugares. Las copias de seguridad pueden contener datos confidenciales, incluidas las contraseñas almacenadas.
+ Es una buena idea tener copias de respaldo fuera de tu dispositivo. También incluyen contraseñas y otros datos privados que seguramente no quieras compartir.
Solo con Wi-Fi
Cada 3 días
Advertencia: Las descargas grandes pueden llevar a que las fuentes se vuelvan cada vez más lentas y en casos extremos que los servidores limiten o impidan el acceso a Tachiyomi. Toca aquí para más información.
@@ -653,7 +648,7 @@
Temas de colores y formatos de fecha
Volcar datos del cuelgue y estado de ahorro de batería
Pantalla segura y desbloqueo biométrico
- Copias de seguridad manuales y automáticas, y el espacio de almacenamiento
+ Copias de seguridad manuales y automáticas, almacenamiento
Fuentes, extensiones y búsqueda global
¡Vaya!
Reiniciar la aplicación
@@ -730,7 +725,7 @@
Intervalo de descarga personalizado
Comprobar de forma mensual (28 días)
Aceptar
- ¿Quitar el rastreo de %s\?
+ ¿Quieres desvincular %s?
Esto eliminará el seguimiento localmente.
Quitar también de %s
Borrar los ya descargados
@@ -754,18 +749,24 @@
Ajustes de la aplicación
Ordenar categorías
¿Quieres ordenar las categorías de forma alfabética\?
- Ningún archivo seleccionado
+ No has elegido ningún archivo
Nunca
- Reducir el ghosting en las pantallas de tinta electrónica
- Última copia de seguridad automática: %s
- Parpadeo en blanco al cambiar de página
+ Esta transición minimiza las manchas y el efecto de retención de imagen en pantallas de tinta electrónica
+ Última copia automática: %s
+ Parpadear a blanco al cambiar de página
Datos y almacenamiento
Almacenamiento utilizado
Puntuación del rastreador
Aplicar
Volver a la configuración predeterminada
Crear
- Sin ningún scanlators
- Scanlator
- Omitir a los scanlators
+ Sin escanducciones
+ Escanductor
+ Excluir escanducciones
+ Seleccionado
+ Sin seleccionar
+ Más opciones
+ Subir un nivel
+ Ubicación del almacenamiento
+ Se utiliza para las copias de seguridad automáticas, las descargas de capítulos y la fuente local.
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/eu/strings.xml b/i18n/src/commonMain/resources/MR/eu/strings.xml
index 9d5e9a0b3..a56f0df97 100644
--- a/i18n/src/commonMain/resources/MR/eu/strings.xml
+++ b/i18n/src/commonMain/resources/MR/eu/strings.xml
@@ -118,7 +118,6 @@
Alboko betegarria
Erakutsi beti kapituluaren trantsizioa
Azkenik irakurritako kapitulua
- Deskarga kokapena
Ezabatu kapituluak
Atzetik hasita laugarren irakurritako kapitulua
Saioa hasi gabeko jarraitzaileak:
@@ -223,7 +222,6 @@
Irakurria bezala eskuz markatu ondoren
Baimendu laster-markadun kapituluak ezabatzea
Irakurri ondoren automatikoki ezabatu
- Kokapen pertsonalizatua
Zerbitzu hobetuak
Lagundu itzultzen
Ez da aurkitu fitxategiak hautatzeko aplikaziorik
@@ -431,7 +429,6 @@
Ziur zaude\? Historia guztia galduko da.
Iturrien migrazio gida
Hautatu sartu nahi dituzun datuak
- Kapitulu berriak bilatzen
Kapitulu berriak aurkituak
Ez da ezer irakurri azkenaldian
Deskargarik ez
@@ -458,9 +455,7 @@
Altuena
Babeskopia erabili
Berreskuratu liburutegia babeskopia fitxategitik
- Babeskopiaren kokapena
Babeskopien maiztasuna
- Gehienezko babeskopiak
Alfabetikoki
Oharra
Autentifikatu aldaketa berresteko
diff --git a/i18n/src/commonMain/resources/MR/fa/plurals.xml b/i18n/src/commonMain/resources/MR/fa/plurals.xml
index 560caa806..d6516ab44 100644
--- a/i18n/src/commonMain/resources/MR/fa/plurals.xml
+++ b/i18n/src/commonMain/resources/MR/fa/plurals.xml
@@ -52,4 +52,16 @@
- قسمت خوانده نشده بعدی
- %d قسمت خوانده نشده بعدی
+
+ - قسمت بعدی
+ - %d قسمت بعدی
+
+
+ - %1$s قسمت گم شده
+ - %1$s قسمت گم شده
+
+
+ - 1 روز
+ - %d روز
+
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/fa/strings.xml b/i18n/src/commonMain/resources/MR/fa/strings.xml
index 48505584c..35996b2cc 100644
--- a/i18n/src/commonMain/resources/MR/fa/strings.xml
+++ b/i18n/src/commonMain/resources/MR/fa/strings.xml
@@ -14,7 +14,6 @@
قسمت %1$s و %2$d قسمت دیگر
قسمت %1$s
قسمتهای جدید پیدا شدند
- درحال بررسی برای قسمتهای جدید
دانلود قسمت ها با خطا مواجه شد. با مراجعه به بخش دانلودها می توانید دوباره تلاش کنید
کپی
تغییر منبع
@@ -120,9 +119,7 @@
هیچ نتیجه ای یافت نشد
نتیجه بیشتری یافت نشد
تب ها
- حداکثر تعداد نسخههای پشتیبان
زمان پشتیبان گیری
- محل پشتیبان گیری
بازگرداندن کتابخانه از فایل پشتیبان
برگرداندن نسخه پشتیبان
می تواند برای بازگرداندن کتابخانه فعلی استفاده شود
@@ -144,8 +141,6 @@
برای این مجموعه
بازکردن عکس با خطا مواجه شد
قصد خواندن دارم(Plan to read)
- مکان سفارشی
- مکان دانلود
هم اندازه حالت هوشمند
Multiply
Overlay
@@ -601,4 +596,22 @@
شما باید از پشتیبانی ها در جا های دیگر هم کپی داشته باشید.
بروزرسانی دسته بندی
کپی کردن به کلیپبرد
+ فرمت RARv5 پشتیبانی نشده
+ متوقف شده
+ باز گشایی %s
+ پاک کردن قسمت های دانلود شده
+ ذخیره
+ باز نشانی به حالت اولیه
+ منظم کردن دسته بندی ها
+ گزینه های بیشتر
+ انتخاب شده
+ انتخاب نشده
+ مجموعه ها را به پایین منطقل کن
+ برو به بالا
+ امتیاز رهگیز
+ داده های و ذخیره سازی
+ آیا مایلید که دسته بندی ها را به ترتیب الفبا منظم کنید؟
+ باشه
+ به روز رسانی مورد انتظار بعدی
+ هشدار: حجم زیاد بارگیری ممکن است باعث اهسته تر شدن سرعت ویا مسدود کردن Tachiyomi از منبع شود. برای اطلاعات بیشتر لمس کنید.
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/fi/strings.xml b/i18n/src/commonMain/resources/MR/fi/strings.xml
index ac27efe69..bb54521b9 100644
--- a/i18n/src/commonMain/resources/MR/fi/strings.xml
+++ b/i18n/src/commonMain/resources/MR/fi/strings.xml
@@ -192,10 +192,8 @@
Vihreä
Sininen
Alpha
- Lataus kansio
Manuaalisesti luetuksi merkitsemisen jälkeen
Lukemisen jälkeen
- Mukautettu kansio
Pois käytöstä
Viimeksi luettu luku
Toiseksi viimeinen luku
@@ -207,7 +205,6 @@
Voidaan käyttää nykyisen kirjaston palauttamiseen
Palauta kirjasto varmuuskopiointi-tiedostosta
Varmuuskopioinnin tiheys
- Varmuuskopioiden enimmäismäärä
Varmuuskopio luotu
Palautus valmis
Mitä haluat varmuuskopioida\?
@@ -260,7 +257,6 @@
Kategoriat poistettu
Luo varmuuskopio
Palauta varmuuskopio
- Varmuuskopio kansio
Paikalliset lähteet
Muut
Viimeisimmät
@@ -323,7 +319,6 @@
Luku %1$s ja %2$d lisää
Luvut %1$s
Piilota ilmoitusten sisältö
- Etsitään uusia lukuja
Lukitse käyttämättömänä
Salaa näyttö
Turvallinen ruutu piilottaa sovelluksen sisällön sovelluksia vaihdettaessa ja estää kuvakaappauksen ottamisen
diff --git a/i18n/src/commonMain/resources/MR/fil/strings.xml b/i18n/src/commonMain/resources/MR/fil/strings.xml
index c1c0b0be9..82ae744d6 100644
--- a/i18n/src/commonMain/resources/MR/fil/strings.xml
+++ b/i18n/src/commonMain/resources/MR/fil/strings.xml
@@ -115,10 +115,8 @@
Pangalawa sa huling nabasa
Huling nabasang kabanata
Sarado
- Pinili kong lugar
Pagkamarkahang nabasa na
Pagkatapos basahin, kusang burahin
- Lokasyon sa pag-download
Kapal ng gilid
Pagbabasa
Ipakita palagi ang paglipat-kabanata
@@ -229,9 +227,7 @@
Hindi naglalaman ang backup ng kahit anong mga entry sa Aklatan.
Invalid na backup
Nai-backup na
- Pinakamarami na awtomatikong pag-backup
Awtomatikong dalas ng pag-backup
- Lokasyon ng backup
I-restore ang Aklatan mula sa backup
I-restore ang backup
Magagamit para ma-restore ang kasalukuyang Aklatan
@@ -276,7 +272,6 @@
Kabanata %1$s at karagdagang %2$d pa
Kabanata %1$s
May mga bagong kabanata
- Naghahanap ng mga bagong kabanata
Di ma-download ang mga kabanata dahil sa mababang espasyo
Di ma-download ang mga kabanata. Subukan mo uli ito sa Dina-download
Kopyahin
@@ -768,4 +763,10 @@
Scanlator
Ibukod ang mga scanlator
Lumikha
+ Lokasyon ng storage
+ Ginagamit para sa automatikong pa-backup, pag-download ng mga kabanata, at lokal na source.
+ Ibang opsiyon
+ Napili
+ Di napili
+ Mag-navigate pataas
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/fr/strings.xml b/i18n/src/commonMain/resources/MR/fr/strings.xml
index 11311ee49..ce6307a12 100644
--- a/i18n/src/commonMain/resources/MR/fr/strings.xml
+++ b/i18n/src/commonMain/resources/MR/fr/strings.xml
@@ -105,7 +105,6 @@
V
B
O
- Répertoire de téléchargement
Suppression automatique après lecture
Désactivé
Dernier chapitre lu
@@ -186,7 +185,6 @@
Aucune connexion disponible
Êtes-vous sûr(e) \? Les chapitres lus et la progression des entrées non présentes dans la bibliothèque seront perdues
Supprimer les chapitres sélectionnés \?
- Répertoire personnalisé
Impossible de télécharger le chapitre en raison d\'une erreur inattendue
Cinquième chapitre avant le dernier lu
Connecté
@@ -208,7 +206,6 @@
En pause
Ouvrir le fichier
Restaurer
- Dossier de sauvegarde
Restauration terminée
Que voulez-vous sauvegarder \?
Supprimer les chapitres téléchargés ?
@@ -219,7 +216,6 @@
Restaurer une sauvegarde
Restaurer la bibliothèque à partir d\'un fichier de sauvegarde
Fréquence de sauvegarde
- Nombre maximal de sauvegardes
Sauvegarde créée
Restauration de sauvegarde en cours
Création de sauvegarde en cours
@@ -327,7 +323,6 @@
Chapitre %1$s et %2$d autres
Chapitres %1$s
Cacher le contenu des notifications
- Recherche de nouveaux chapitres
Désactiver la fonction d\'optimisation de la batterie
Facilite les mises à jour et sauvegardes de la bibliothèque en arrière-plan
La fonction d\'optimisation de la batterie est déjà désactivée
@@ -742,4 +737,20 @@
Déplacer la série vers le bas
Supprimez également de %s
Impossible de joindre %s
+ Paramètres de l\'application
+ Supprimer le(s) téléchargement(s)
+ Appliquer
+ Réintialiser les valeurs par défaut
+ Trier les catégories
+ Plus d\'options
+ Sélectionné
+ Pas sélectionné(e)
+ Scanlator
+ Faire l\'écran clignoter sur le changement de page
+ Naviguer vers le haut
+ Score du service de suivi
+ Données et stockage
+ Voulez-vous trier les catégories par ordre alphabétique ?
+ Se connecter au service de suivi
+ « %1$s » au lieu de « %2$s »
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/gl/strings.xml b/i18n/src/commonMain/resources/MR/gl/strings.xml
index 0babeef68..e46e0b145 100644
--- a/i18n/src/commonMain/resources/MR/gl/strings.xml
+++ b/i18n/src/commonMain/resources/MR/gl/strings.xml
@@ -10,12 +10,10 @@
Cola de baixadas
Último capítulo lido
Deshabilitado
- Ubicación personalizada
Permitir eliminar os capítulos marcados como favoritos
Eliminar automaticamente despois de ler
Despois de marcar manualmente como lido
Eliminar capítulos
- Localización das baixadas
Recheo lateral
Lendo
Modo de lectura
@@ -274,7 +272,6 @@
Imaxe gardada
Restaurar a copia de seguridade
Frecuencia das copias de seguridade
- Máximo de copias de seguridade
Fontes faltantes:
Invalidar o índice de baixadas
Garda os rexistros de erros nun ficheiro para compartilo cos desenvolvedores
@@ -370,7 +367,6 @@
Clasificación por idades
Servizos mellorados
Estes servizos proporcionan funcións melloradas para fontes concretas. Faise un seguemento automático dos elementos ao engadilos á biblioteca.
- Localización da copia de seguridade
Xa se está facendo unha copia de seguridade
Compartir os rexistros de erros
Error ao compartir a portada
@@ -592,7 +588,6 @@
Fonte local
En seguimento
Lendo
- Procurando capítulos novos
Non hai ningunha conexión Wi-Fi dispoñible
%s pechouse por un problema inesperado. Aconsellámoste que compartas os rexistros de erros na canle de soporte no Discord (en inglés).
Reinicia a aplicación
diff --git a/i18n/src/commonMain/resources/MR/he/strings.xml b/i18n/src/commonMain/resources/MR/he/strings.xml
index 0b08ea497..3e28e22e7 100644
--- a/i18n/src/commonMain/resources/MR/he/strings.xml
+++ b/i18n/src/commonMain/resources/MR/he/strings.xml
@@ -27,7 +27,6 @@
פרק %1$s ו-%2$d נוספים
פרק %1$s
נמצאו פרקים חדשים
- מחפש פרקים חדשים
לא ניתן להוריד פרקים. אפשר לנסות שוב בדף ההורדות
העתק
העברה
@@ -206,9 +205,7 @@
מה אתה רוצה לגבות\?
השחזור הושלם
גיבוי נוצר
- מספר גיבויים מקסימלי
תדירות גיבוי
- מיקום גיבוי
שחזר ספרייה מקובץ גיבוי
שחזור גיבוי
ניתן לשימוש על מנת לשחזר את הספרייה הנוכחית
@@ -221,10 +218,8 @@
הפרק השלישי מהסוף שנקרא
הפרק השני מהסוף שנקרא
פרק שנקרא בפעם האחרונה
- מיקום מותאם אישית
אוטומטי לאחר סיום הקריאה
אחרי שמסומן ידנית כנקרא
- מיקום ההורדה
הצג תמיד מעברי פרקים
אלפא
כחול
diff --git a/i18n/src/commonMain/resources/MR/hi/strings.xml b/i18n/src/commonMain/resources/MR/hi/strings.xml
index 040bb7f72..2c41fa2cb 100644
--- a/i18n/src/commonMain/resources/MR/hi/strings.xml
+++ b/i18n/src/commonMain/resources/MR/hi/strings.xml
@@ -122,10 +122,8 @@
G
B
A
- डाउनलोड निर्देशिका
\'पढ़ें\' के रूप में खुद से चिह्नित करने के बाद
पढ़ने के बाद स्वचालित रूप से हटाएं
- इच्छा अनुसार निर्देशिका
बंद करें
अंतिम पढ़ा अध्याय
दूसरा से अंतिम पढ़ा गया अध्याय
@@ -138,9 +136,7 @@
वर्तमान पुस्तकालय को पुनर्स्थापित करने के लिए उपयोग किया जा सकता है
बैकअप पुनर्स्थापित करे
बैकअप फ़ाइल से लाइब्रेरी पुनर्स्थापित करें
- बैकअप निर्देशिका
बैकअप फ़्रीक्वेंसी
- अधिकतम बैकअप
बैकअप बनाया गया है
पुनर्स्थापना पूर्ण हुआ
आप बैकअप के लिए क्या चाहते हैं?
@@ -327,7 +323,6 @@
अध्याय %1$s और %2$d अधिक
अध्याय %1$s
अधिसूचना सामग्री छुपाएं
- नए अध्यायों के लिए जांच
बैटरी अनुकूलन को अक्षम करना
पृष्ठभूमि पुस्तकालय अपडेट और बैकअप के साथ मदद करता है
बैटरी अनुकूलन पहले से ही अक्षम है
diff --git a/i18n/src/commonMain/resources/MR/hr/strings.xml b/i18n/src/commonMain/resources/MR/hr/strings.xml
index 4f4aa4532..091f32522 100644
--- a/i18n/src/commonMain/resources/MR/hr/strings.xml
+++ b/i18n/src/commonMain/resources/MR/hr/strings.xml
@@ -148,9 +148,7 @@
%02d min, %02d s
Obnavljanje je završeno
Sigurnosna kopija je stvorena
- Maksimalni broj sigurnosnih kopija
Učestalost automatskog spremanja sigurnosnih kopija
- Mjesto spremanja sigurnosnih kopija
Obnovi biblioteku iz sigurnosne kopije
Obnovi sigurnosnu kopiju
Može se koristiti za obnavljanje trenutačne biblioteke
@@ -164,10 +162,8 @@
Predzadnje pročitano poglavlje
Zadnje pročitano poglavlje
Deaktivirano
- Prilagođeno mjesto
Automatski izbriši nakon čitanja
Nakon ručnog označivanja kao pročitano
- Mjesto preuzimanja
Odmak od ruba
Čitanje
Uvijek prikaži prijelaze između poglavlja
@@ -241,7 +237,6 @@
Poglavlje %1$s i još %2$d
Poglavlje %1$s
Pronađena su nova poglavlja
- Traženje novih poglavlja
Neuspjelo preuzimanje poglavlja. Pokušaj ponovo u odjeljku preuzimanja
Kopiraj
Migriraj
@@ -768,4 +763,10 @@
Korištenje memorije
Rezultat tragača
Isključi amaterske prevoditelje
+ Mjesto spremanja
+ Koristi se za automatske sigurnosne kopije, preuzimanje poglavlja i lokalni izvor.
+ Više opcija
+ Odabrano
+ Neodabrano
+ Navigiraj prema gore
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/hu/plurals.xml b/i18n/src/commonMain/resources/MR/hu/plurals.xml
index 1ed5bf5a5..535bbf3a1 100644
--- a/i18n/src/commonMain/resources/MR/hu/plurals.xml
+++ b/i18n/src/commonMain/resources/MR/hu/plurals.xml
@@ -60,4 +60,8 @@
- Hiányzó %1$s fejezet
- Hiányzó %1$s fejezetek
+
+ - 1 nap
+ - %d nap
+
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/hu/strings.xml b/i18n/src/commonMain/resources/MR/hu/strings.xml
index 3d0cc6ccd..97faaa878 100644
--- a/i18n/src/commonMain/resources/MR/hu/strings.xml
+++ b/i18n/src/commonMain/resources/MR/hu/strings.xml
@@ -50,7 +50,6 @@
Hangerőszabályzó gombokkal
Gombok felcserélése
Háttérszín
- Letöltések helye
Verzió
Összeomlás-jelentések küldése
Befejezett
@@ -340,7 +339,6 @@
Utolsó előtti előtti befejezett fejezet
Utolsó előtti befejezett fejezet
Kikapcsolva
- Egyedi hely
Tiltott kategóriák
Könyvjelzőzött fejezetek törlésének engedélyezése
Automatikus törlés olvasás után
@@ -452,8 +450,6 @@
Nem lehetett a fejezeteket letölteni. Próbálja újra a letöltések menüpontban
Válaszon ki egy forrást, ahonnan importálni szeretne
Nem lehetett letölteni kevés tárhely miatt
- Biztonsági mentés helye
- Maximális biztonsági mentések száma
Biztonsági mentés létrehozása
Biztonsági mentés sikertelen
Sütik törlése
@@ -517,7 +513,6 @@
Biztonsági mentés már folyamatban van
Nincs telepítve
Figyelmeztetés: a tömeges letöltések a források lelassulásához és/vagy a Tachiyomi leállásához vezethetnek. Koppintson további információért.
- Új fejezetek keresése
%1$d frissítés kihagyva
Koppintson további információért
Nem sikerült a fedlap frissítése
@@ -715,4 +710,46 @@
Jobbra csúsztatási cselekmény
Forgatott széles oldalak megfordítása
Ok
+ Tárolási hely
+ Érints ide, ha Cloudflare segítségre van szükséged
+ Soha
+ Átlépve, mert a sorozatot nem kell frissíteni
+ E-ink képernyőkön csökkenti a visszamaradó képet
+ %s feloldása
+ Automatikus biztonsági mentésekhez, fejezetek letöltéséhez, és helyi forráshoz használt.
+ Frissítés beállítása minden
+ Könyvtár szinkronizálása
+ Biztonsági mentés készítése nem sikerült
+ Intervallumok
+ Visszaállítás alapértelmezettre
+ Felhasználói ágens (user agent) szöveg nem lehet üres
+ Kategória alapján
+ További lehetőségek
+ Könyvtár szinkronizálása elkészült
+ Utolsó automatikus biztonsági mentés: %s
+ Intervallum testreszabása
+ Kiválasztott
+ Nincs szkennelő-fordító találat
+ Nem kiválasztott
+ Sorozat alulra küldése
+ Szkennelő-fordító
+ Villantson fehéren lap változtatáskor
+ Nincs internet kapcsolat
+ Tárolóhely felhasználás
+ Könyvtár frissítése ... (%s)
+ Bejegyzések
+ Felnavigálás
+ Adat és tárolás
+ Szeretnéd a kategóriákat betűrendbe rendezni?
+ Átlépve, mert ma nem várható kiadás
+ Nincs fájl kiválasztva
+ Érvénytelen felhasználói ágens (user agent) szöveg
+ Forrás beállítások
+ Applikáció beállítások
+ Vannak eredmények
+ Relatív időbélyegek
+ HTTP %d, nézd meg a honlapot WebViewban
+ \"%1$s\", ahelyett hogy \"%2$s\"
+ %s nem elérhető
+ Szkennelő-fordítók tiltása
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/in/strings.xml b/i18n/src/commonMain/resources/MR/in/strings.xml
index 2424833ee..57178454c 100644
--- a/i18n/src/commonMain/resources/MR/in/strings.xml
+++ b/i18n/src/commonMain/resources/MR/in/strings.xml
@@ -110,7 +110,7 @@
Kiri
Kanan
Tengah
- rotasi bawaan
+ Rotasi bawaan
Bebas
Terkunci tegak
Terkunci mendatar
@@ -118,10 +118,8 @@
G
B
A
- Lokasi unduhan
Setelah secara manual ditandai telah dibaca
Otomatis hapus setelah dibaca
- Lokasi kustom
Tidak Aktif
Bab terakhir yang dibaca
Bab kedua dari terakhir dibaca
@@ -134,9 +132,7 @@
Dapat digunakan untuk memulihkan isi pustaka saat ini
Pulihkan cadangan
Pulihkan isi pustaka dari berkas cadangan
- Tempat pencadangan
Frekuensi pencadangan otomatis
- Jumlah maksimum pencadangan otomatis
Cadangan dibuat
Pemulihan selesai
Apa saja yang ingin Anda cadangkan\?
@@ -325,7 +321,6 @@
Gagal untuk menembus Cloudflare
Harap perbarui aplikasi WebView untuk kompatibilitas yang lebih baik
Pembaruan bab
- Memeriksa bab baru
Nonaktifkan optimisasi baterai
Optimalisasi baterai sudah dimatikan
Alamat surel
@@ -768,4 +763,10 @@
Skor pelacak
Data dan penyimpanan
Kecualikan pemindai
+ Opsi lebih lanjut
+ Dipilih
+ Tidak dipilih
+ Navigasi ke atas
+ Lokasi penyimpanan
+ Digunakan untuk pencadangan otomatis, pengunduhan bab, dan sumber lokal.
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/it/strings.xml b/i18n/src/commonMain/resources/MR/it/strings.xml
index f9191305f..2171a2e97 100644
--- a/i18n/src/commonMain/resources/MR/it/strings.xml
+++ b/i18n/src/commonMain/resources/MR/it/strings.xml
@@ -102,10 +102,8 @@
G
B
A
- Posizione dei download
Dopo averli contrassegnati manualmente come letti
Cancella automaticamente dopo la lettura
- Posizione personalizzata
Disabilitato
Ultimo capitolo letto
Penultimo capitolo letto
@@ -209,9 +207,7 @@
Può essere utilizzato per ripristinare la libreria attuale
Ripristina backup
Ripristina la libreria da un file di backup
- Posizione dei backup
Frequenza dei backup automatici
- Massimo numero di backup automatici
Backup creato
Ripristino completato
Di cosa vuoi fare il backup\?
@@ -327,7 +323,6 @@
Capitoli %1$s
Capitolo %1$s e altri %2$d
Capitolo %1$s
- Cercando nuovi capitoli
Indirizzo e-mail
Ottimizzazione batteria già disattivata
Facilita gli aggiornamenti e i backup in secondo piano
diff --git a/i18n/src/commonMain/resources/MR/ja/plurals.xml b/i18n/src/commonMain/resources/MR/ja/plurals.xml
index 8c6bfcfac..cac385e17 100644
--- a/i18n/src/commonMain/resources/MR/ja/plurals.xml
+++ b/i18n/src/commonMain/resources/MR/ja/plurals.xml
@@ -4,22 +4,22 @@
- %1$s分後
- - %1$d新しい章
+ - %1$d件の新しい章
- 残り%1$s件
- - %1$sで完成済み %2$s件のエラーが発生しました
+ - %1$sで完了しました (%2$s件のエラー)
- %d件のカテゴリー
- - %d件の拡張機能の更新が利用可能
+ - %d件の拡張機能の更新が利用可能です
- - 第%1$s章とその他%2$d章
+ - %1$s章と他%2$d章
- %d件の項目
@@ -31,7 +31,7 @@
- %d個のトラッカー
- - ソースには存在しないか、フィルターによって排除されたため、%d章がスキップされました
+ - %d章をスキップします。ソースに章が存在しないか、フィルタリングされています。
- %1$d日前
@@ -43,7 +43,7 @@
- 次の%d章
- - %1$s章が欠けています
+ - %1$s章が存在しません
- %d日
diff --git a/i18n/src/commonMain/resources/MR/ja/strings.xml b/i18n/src/commonMain/resources/MR/ja/strings.xml
index e78c82161..5f8249a50 100644
--- a/i18n/src/commonMain/resources/MR/ja/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ja/strings.xml
@@ -100,9 +100,9 @@
白
ブラック
既定のビューアモード
- ページに分ける(左から右)
- ページに分ける(右から左)
- ページに分ける(上から下)
+ ページ分割 (左から右)
+ ページ分割 (右から左)
+ ページ分割 (上から下)
縦長のストリップ
ページに分ける
スケールの種類
@@ -125,10 +125,8 @@
G
B
A
- ダウンロードフォルダ
手動で既読にした後
読んだ後自動で削除
- カスタムディレクトリ
無効
最後に読んだ章の2番目
新しい章をダウンロード
@@ -136,9 +134,7 @@
現在のライブラリを復元するために使用できます
バックアップを復元
バックアップファイルからライブラリを復元する
- バックアップディレクトリ
自動バックアップの頻度
- 最大の自動バックアップ数
バックアップが作成されました
チャプタキャッシュをクリア
消去中にエラーが発生しました
@@ -204,7 +200,7 @@
次をクリップボードにコピーしました:
\n%1$s
第%1$s章
- ダウンロード中(%1$d/%2$d)
+ ダウンロード中 (%1$d/%2$d)
エラー
一時停止済み
ソースタイトル
@@ -295,7 +291,7 @@
ログアウト
ログアウトしました
一時停止
- 他
+ その他
その他
最新章の更新順
章を見る
@@ -373,7 +369,6 @@
章の更新
WebViewアプリを更新して互換性を向上させてください
WebViewが必要です
- 新しい章を確認中
ライブラリを更新中
ビューアモード
詳細を非表示
@@ -391,7 +386,7 @@
ライブラリ内
ローカルソースガイド
ピン留め済み
- 最近に使用済み
+ 最近に使用
現在のビューアモードを、ビューアが立ち上がるとしばらく表示します
ビューアモードを表示
ソースが見つかりませんでした
@@ -472,7 +467,7 @@
前へ
ビューアが立ち上がるとしばらく表示します
タップ可能なゾーンを表示
- DNS over HTTPS(DoH)
+ DNS over HTTPS (DoH)
含まれているカテゴリーに入っていても、除外対象カテゴリーにある項目は更新されません。
自動ダウンロード
下記を除外: %s
@@ -522,7 +517,7 @@
ダウンロードを開始します
ダイナミック
一部のスマホメーカーはバックグラウンドサービスを終了する追加のアプリ制限を施しています。修正する方法についてはこのWebサイトをご覧ください。
- 背景活動
+ バックグラウンドアクティビティ
MIUI最適化が有効な場合はバックアップ・復元が正常に機能しない恐れがあります。
最低
低い
@@ -585,7 +580,7 @@
タップでもっと詳しく
スキップ済み
%1$d件の更新に失敗しました
- 縦向き(反転)
+ 縦向き (反転)
シリーズをトップに移動
無効
バックアップできるライブラリ項目はありません
@@ -675,12 +670,12 @@
ローカル
開始済み
閲覧時間
- 項目
- グローバルアップデート対象
- 総計
+ 作品
+ グローバルアップデート
+ 合計
閲覧済み
トラッカー
- 追跡中の作品
+ トラッキング中の作品
使用中
N/A
%d時間
@@ -688,9 +683,9 @@
%d秒
統計情報
概要
- 読了した作品
+ 読み終わった作品
ダウンロード済み
- 平均点数
+ 平均
%d日
後で
カテゴリが空です
@@ -732,7 +727,7 @@
%s からも削除
ダウンロードを削除
10+チェック後半
- 落とした\? 20歳以上後半と2ヶ月
+ 落とした? 20歳以上後半と2ヶ月
チェック期間を過ぎました
OK
ライブラリを同期しています
@@ -750,7 +745,7 @@
相対的なタイムスタンプ
「%2$s」の代わりに「%1$s」を使用
カテゴリの並べ替え
- ライブラリの更新中…(%s)
+ ライブラリの更新中… (%s)
カテゴリをアルファベット順で並べ替えますか?
ソース設定
アプリ設定
@@ -768,4 +763,10 @@
スキャンレーターが見つかりませんでした
スキャンレーター
スキャンレーターを除外
+ その他のオプション
+ 選択済み
+ 未選択
+ 上に移動
+ 保存場所
+ 自動バックアップ、章のダウンロード、ローカル ソースの保存位置となります。
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/jv/strings.xml b/i18n/src/commonMain/resources/MR/jv/strings.xml
index 743d80f42..ae0ef92e8 100644
--- a/i18n/src/commonMain/resources/MR/jv/strings.xml
+++ b/i18n/src/commonMain/resources/MR/jv/strings.xml
@@ -13,7 +13,6 @@
Versi
DNS liwat HTTPS
Dipateni
- Lokasi donlot
T
B
I
@@ -312,4 +311,7 @@
Diwiwiti
Diundhuh
Telusuri…
+ Ngehapus downloadan
+ Dipilih
+ Gak dipilih
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml b/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml
index a34b277fc..9d4038b90 100644
--- a/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ka-rGE/strings.xml
@@ -173,10 +173,8 @@
ყოველთვის აჩვენე თავებს შორის გადასვლა
კითხვა
ცარიელი არეა გვერდებზე
- გადმოწერის ადგილი დისკზე
წაშალე წაკითხულად მონიშვნის შემდეგ
წაკკითხვის შემდეგ წაშალე
- ინდივიდუალური ადგილმდებარეობა
გამორთული
ბოლო წაკითხული თავი
ბოლოს წინა წაკითხული თავი
@@ -190,9 +188,7 @@
შესაძლებელია გამოყენებულ იქნას ახლანდელი ბიბლიოთეკის ასადგენად
რეზერვის აღდგენა
ბიბლიოთეკის აღდგენა რეზერვიდან
- რეზერვის ლოკაცია
რეზერვის შექმნის სიხშირე
- მაქსიმალური რეზერვი
რეზერვი შექმნილია
არასწორი სარეზერვო ფაილი
მარქაფი ბიბლიოთეკის ჩანაწერებს არ შეიცავს.
@@ -314,7 +310,6 @@
მიგრაცია
კოპირება
ვერ მოხერხდა თავების გადმოწერა. შეგიძლია სცადო თავიდან გადმოწერების სექციაში
- ახალი თავების ძებნა
ახალი თავები მოიძებნა
თავი %1$s
თავი %1$s და %2$d მეტი
diff --git a/i18n/src/commonMain/resources/MR/kk/strings.xml b/i18n/src/commonMain/resources/MR/kk/strings.xml
index 6721346ce..190113347 100644
--- a/i18n/src/commonMain/resources/MR/kk/strings.xml
+++ b/i18n/src/commonMain/resources/MR/kk/strings.xml
@@ -291,9 +291,7 @@
Сұр
Әдепкі оқу режимі
Ең жоғары
- Жүктеу орны
Саналмайтын санаттар
- Реттелетін орын
Қолмен оқылған деп белгіленгеннен кейін
Оқығаннан кейін автоматты түрде жою
Бетбелгіленген тарауларды жоюға рұқсат беру
@@ -408,7 +406,6 @@
Туындылар мұқабасын жаңарту
Cloudflare айналып өтілмеді
Жақсырақ үйлесімділік үшін WebView-ді жаңартыңыз
- Сақтық көшірме бумасы
Бақылау қызметіне кірілмеген:
Соңғы
Сұрыптау
@@ -419,7 +416,6 @@
Күн
Шығып жатыр
Қалпына келтіру әлдеқашан орындалуда
- Сақтық көшірме саны
Сақтық көшірмесіне нені қалайсыз\?
Сақтық көшірмесін қалпына келтіру
Сақтық көшірмесі әлдеқашан орындалуда
@@ -587,7 +583,6 @@
Қолданбаны өшіріп қосу
Тараулар жүктелмеді. Жүктеулер кезегіне барып, сол жерден байқап көре аласыз
Жадта орын аз болғандықтан тараулар жүктелмейді
- Жаңа тараулар бар ма екенін тексеру
%1$s тарау мен %2$d
Бұны істер алдыңда жазбаны кітапханаңызға қосыңыз
Туынды аяқталған үшін өткізіп жіберілді
diff --git a/i18n/src/commonMain/resources/MR/kn/strings.xml b/i18n/src/commonMain/resources/MR/kn/strings.xml
index 8e7407d7b..1ea09b5a9 100644
--- a/i18n/src/commonMain/resources/MR/kn/strings.xml
+++ b/i18n/src/commonMain/resources/MR/kn/strings.xml
@@ -115,9 +115,7 @@
%02d ನಿಮಿಷ, %02d ಸೆಕೆಂಡು
ಮರುಸ್ಥಾಪನೆ ಪೂರ್ಣಗೊಂಡಿದೆ
ಬ್ಯಾಕಪ್ ರಚಿಸಲಾಗಿದೆ
- ಗರಿಷ್ಠ ಬ್ಯಾಕಪ್ಗಳು
ಬ್ಯಾಕಪ್ ಆವರ್ತನ
- ಬ್ಯಾಕಪ್ ಸ್ಥಳ
ಬ್ಯಾಕಪ್ ಫೈಲ್ನಿಂದ ಗ್ರಂಥಾಲಯವನ್ನು ಮರುಸ್ಥಾಪಿಸಿ
ಬ್ಯಾಕಪ್ ಮರುಸ್ಥಾಪಿಸಿ
ಪ್ರಸ್ತುತ ಗ್ರಂಥಾಲಯವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಬಳಸಬಹುದು
@@ -132,10 +130,8 @@
ಕೊನೆಯ ಅಧ್ಯಾಯದಿಂದ ಎರಡನೆಯದು
ಕೊನೆಯದಾಗಿ ಓದಿದ ಅಧ್ಯಾಯ
ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ
- ಕಸ್ಟಮ್ ಸ್ಥಳ
ಓದಿದ ನಂತರ
ಓದಿದಂತೆ ಗುರುತಿಸಿದಾಗ ತೆಗೆದುಹಾಕಿ
- ಡೌನ್ಲೋಡ್ ಸ್ಥಳ
ಸೈಡ್ ಪ್ಯಾಡಿಂಗ್
ಓದುತ್ತಿರುವ
ಅಧ್ಯಾಯ ಪರಿವರ್ತನೆಯನ್ನು ಯಾವಾಗಲೂ ತೋರಿಸಿ
@@ -254,7 +250,6 @@
ಅಧ್ಯಾಯ %1$s ಮತ್ತು %2$d ಹೆಚ್ಚು
ಅಧ್ಯಾಯ %1$s
ಹೊಸ ಅಧ್ಯಾಯಗಳು ಕಂಡುಬಂದಿವೆ
- ಹೊಸ ಅಧ್ಯಾಯಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ
ಅಧ್ಯಾಯಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಡೌನ್ಲೋಡ್ಗಳ ವಿಭಾಗದಲ್ಲಿ ನೀವು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಬಹುದು
ನಕಲಿಸಿ
ಸ್ಥಳಾಂತರಿಸಿ
diff --git a/i18n/src/commonMain/resources/MR/ko/strings.xml b/i18n/src/commonMain/resources/MR/ko/strings.xml
index 371f76e50..af2e5cf34 100644
--- a/i18n/src/commonMain/resources/MR/ko/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ko/strings.xml
@@ -137,9 +137,7 @@
백업 생성
백업 복원
백업 파일에서 서재 복원
- 백업 위치
백업 주기
- 최대 백업
백업 생성됨
복원 완료
백업 복원중
@@ -243,8 +241,6 @@
G
B
A
- 다운로드 폴더
- 사용자 정의 위치
끝에서 두번째 회차
끝에서 세번째 회차
끝에서 네번째 회차
@@ -476,7 +472,6 @@
기록이 삭제되었습니다
저장 공간이 부족하여 회차를 다운로드 할 수 없습니다
경고: 대량 다운로드는 소스가 느려지거나 Tachiyomi를 차단할 수 있습니다. 탭하여 자세히 알아보기.
- 새로운 회차 확인 중
대규모 업데이트는 소스에 피해를 입히고 업데이트가 느려지고 배터리 사용량이 증가할 수 있습니다. 탭하여 자세히 알아보기.
%1$s화
%1$d개의 업데이트가 실패했습니다
diff --git a/i18n/src/commonMain/resources/MR/lt/strings.xml b/i18n/src/commonMain/resources/MR/lt/strings.xml
index 92c7f2bf2..7905d0f18 100644
--- a/i18n/src/commonMain/resources/MR/lt/strings.xml
+++ b/i18n/src/commonMain/resources/MR/lt/strings.xml
@@ -320,24 +320,20 @@
Leisti naikinti žymėtus skyrius
Penktas nuo paskutinio skaityto
Automatinis atsisiuntimas
- Maksimalus atsarginių kopijų skaičius
Sukurta atsarginė kopija
aukštas
- Atsisiuntimo vieta
Naikinti skyrius
Mažiausias
Rankinių būdu pažymėtas, kaip skaitytas
Perskaičius automatiškai naikinti
Patobulintos paslaugos
Atkurti biblioteką iš atsarginės failo kopijos
- Atsarginės kopijos vieta
Atsarginėje kopijoje nėra jokių bibliotekos įrašų.
Netinkamas atsarginės kopijos failas
Aukščiausias
Kurti atsarginę kopiją
Atkurti atsarginę kopiją
Neįtrauktos kategorijos
- Pasirinktina vieta
Paskiausiai skaitytas skyrius
Įrašai neįtrauktose kategorijose nebus atsisiųsti, net jei jie taip pat yra įtraukti į kategorijas.
Palieskite, kad sužinotumėte daugiau
@@ -358,7 +354,6 @@
Priskirti šiai serijai
Baigta:
Dabartinis:
- Ieškoma naujų skyrių
Nepavyko atnaujinti %1$d
Prieš atlikdami šį veiksmą, pridėkite įrašą į savo biblioteką
Praleista, nes nėra perskaitytų skyrių
diff --git a/i18n/src/commonMain/resources/MR/lv/strings.xml b/i18n/src/commonMain/resources/MR/lv/strings.xml
index e1686922c..22ec8a73d 100644
--- a/i18n/src/commonMain/resources/MR/lv/strings.xml
+++ b/i18n/src/commonMain/resources/MR/lv/strings.xml
@@ -163,7 +163,6 @@
Vēl turpinās
Nosaukums
Izdzēst nodaļas
- Lejuplādes vieta
Automātiska lejupielāde
Atjaunot dublējumu
Sekotāji, kas nav pieteikušies:
@@ -348,7 +347,6 @@
Augstākais
Brīdinājums
Izlaist izlasītās nodaļas
- Pielāgota lokācija
Invertēts
Reizināt
Ekrāns
@@ -372,7 +370,6 @@
Uzlabo lasītāja veiktspēju, sadalot garus lejupielādētus attēlus
Pakalpojumi, kas nodrošina uzlabotus līdzekļus konkrētiem avotiem. Pievienojot bibliotēkai, ieraksts tiks automātiski izsekots.
Izveidot dublējumu
- Dublējuma atrašanās vieta
Nederīgs dublējuma fails
Dublējumu biežums
Kopijas vajadzētu glabāt arī citās vietās.
@@ -400,7 +397,6 @@
Nav ko tīrīt
Atspējot akumulatora optimizāciju
Atjaunot bibliotēku no dublējuma faila
- Maksimālais dublējumu skaits
Notīrīt sīkfailus
Izvēlēties DNS pār HTTPS (DoH)
Sīkfaili notīrīti
@@ -513,7 +509,6 @@
Lasīšanas režīms
Nākošā nodaļa nav atrasta
Nu, šis ir neveikli
- Pārbauda, vai nav jaunu nodaļu
%1$d atjauninājums(-i) izlaists(-i)
Atvērt vietnē GitHub
Šī Android versija vairs netiek atbalstīta
diff --git a/i18n/src/commonMain/resources/MR/ms/strings.xml b/i18n/src/commonMain/resources/MR/ms/strings.xml
index 1cb6c1a59..c9d4ea92d 100644
--- a/i18n/src/commonMain/resources/MR/ms/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ms/strings.xml
@@ -121,10 +121,8 @@
G
B
A
- Lokasi muat turun
Selepas secara manual ditandakan sebagai dibaca
Selepas membaca padam secara automatik
- Lokasi tersuai
Dinyahkan
Bab terakhir dibaca
Bab kedua terakhir dibaca
@@ -137,9 +135,7 @@
Boleh digunakan untuk memulihkan pustaka semasa
Pulihkan sandaran
Pulihkan pustaka daripada fail sandaran
- Lokasi sandaran
Kekerapan sandaran
- Sandaran maksimum
Sandaran dicipta
Pemulihan selesai
Apakah yang ingin anda sandarkan?
@@ -327,7 +323,6 @@
Bab %1$s dan %2$d lagi
Bab %1$s
Sembunyikan kandungan pemberitahuan
- Mencari bab baharu
Nyahdaya pengoptimuman bateri
Membantu dengan pengemaskinian latar belakang pustaka dan sandaran
Pengoptimuman bateri sudah dinyahdayakan
diff --git a/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml b/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml
index 71d9d6e9c..90f0c92fe 100644
--- a/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml
+++ b/i18n/src/commonMain/resources/MR/nb-rNO/strings.xml
@@ -140,10 +140,8 @@
G
B
A
- Nedlastingsmappe
Etter manuelt markert som lest
Slett automatisk etter lesing
- Egendefinert mappe
Avskrudd
Sist leste kapittel
Nest sist leste kapittel
@@ -156,9 +154,7 @@
Kan brukes til å gjenopprette nåværende bibliotek
Gjenopprett sikkerhetskopi
Gjenopprett bibliotek fra sikkerhetskopifil
- Sikkerhetskopi-mappe
Sikkerhetskopieringsfrekvens
- Maks antall sikkerhetskopier
Sikkerhetskopi opprettet
Gjenoppretting fullført
Hva ønsker du å sikkerhetskopiere\?
@@ -363,7 +359,6 @@
Loddrett
vannrett
Ingen
- Søker etter nye kapitler
Kilden ikke funnet
For denne serien
Ukjent status
@@ -754,4 +749,24 @@
Programinnstillinger
Relative tidsstempler
\"%1$s\" istedenfor \"%2$s\"
+ Lagringsplass
+ Opprett
+ Aldri
+ Reduserer etterbilde på e-ink skjermer
+ Brukt for automatiske sikkerhetskopier, nedlastede kapitler og lokal kilde.
+ Bruk
+ Gjenopprett standardinnstillinger
+ Flere valg
+ Siste automatisk sikkerhetskopi: %s
+ Valgt
+ Ingen skanningsoversettere funnet
+ Ikke valgt
+ Skanningsoversetter
+ Blink hvitt ved sidebytte
+ Lagringsbruk
+ Naviger opp
+ Sporer poengsum
+ Data og lagring
+ Ingen fil valgt
+ Ekskluder skanningsoversettere
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/ne/strings.xml b/i18n/src/commonMain/resources/MR/ne/strings.xml
index 5e977a022..40f3508f7 100644
--- a/i18n/src/commonMain/resources/MR/ne/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ne/strings.xml
@@ -295,7 +295,6 @@
G
पढ्ने मोड
स्क्रोलमा मेनु लुकाउनका लागि संवेदनशीलता
- डाउनलोड स्थान
अन्तिम पढिएको अध्याय भन्दा पहिले १ अध्याय
स्वत: डाउनलोड गर्नुहोस्
ट्र्याकिङ गाइड
@@ -348,7 +347,6 @@
उच्च
सबैभन्दा कम
अध्यायहरू हटाउनुहोस्
- कस्टम स्थान
आफै पढिएको रूपमा चिन्ह लगाइएपछि
पढिसकेपछि स्वचालित रूपमा हटाउनुहोस्
CBZ अभिलेख को रूपमा सेभ गर्नुहोस्
@@ -371,7 +369,6 @@
डेटा
खाली गर्दा त्रुटि भयो
स्थिति
- नयाँ अध्यायहरूको लागि जाँच गर्दै
डाउनलोड गर्दै…
अपडेट स्थापना गर्न ट्याप गर्नुहोस्
अप्रत्याशित त्रुटिका कारण अध्याय डाउनलोड गर्न सकिएन
@@ -394,9 +391,7 @@
ब्याकअप रिस्टोर गर्नुहोस्
ब्याकअप फाइलबाट पुस्तकालय रिस्टोर गर्नुहोस्
ब्याकअपमा कुनै पनि पुस्तकालयका इन्ट्री समावेश छैन।
- ब्याकअप स्थान
स्वचालित ब्याकअप फ्रिक्वेन्सी
- अधिकतम स्वचालित ब्याकअपहरू
प्रयोग गरिएको: %1$s
क्यास खाली गरियो। %1$d फाइलहरू हटाएका छन्
अध्याय %1$s र %2$d अरू
diff --git a/i18n/src/commonMain/resources/MR/nl/strings.xml b/i18n/src/commonMain/resources/MR/nl/strings.xml
index cf5c4d9d7..f894c0132 100644
--- a/i18n/src/commonMain/resources/MR/nl/strings.xml
+++ b/i18n/src/commonMain/resources/MR/nl/strings.xml
@@ -101,8 +101,6 @@
G
B
A
- Downloadlocatie
- Aangepaste locatie
Laatst gelezen hoofdstuk
Een-na-laatste gelezen hoofdstuk
Twee-na-laatste gelezen hoofdstuk
@@ -112,9 +110,7 @@
Kan worden gebruikt om de huidige bibliotheek te herstellen
Back-up herstellen
Herstellen van back-up bestand
- Back-uplocatie
Frequentie van automatische back-ups
- Maximaal aantal automatische back-ups
Back-up gemaakt
Herstellen voltooid
Wat wil je back-uppen?
@@ -337,7 +333,6 @@
Hoofdstukken %1$s
Hoofdstuk %1$s en %2$d meer
Hoofdstuk %1$s
- Zoeken naar nieuwe hoofdstukken
Hfst. %1$s - %2$s
Bibliotheek bijwerken
Tracking toevoegen
diff --git a/i18n/src/commonMain/resources/MR/nn/strings.xml b/i18n/src/commonMain/resources/MR/nn/strings.xml
index 71ca74d36..4579d3fb0 100644
--- a/i18n/src/commonMain/resources/MR/nn/strings.xml
+++ b/i18n/src/commonMain/resources/MR/nn/strings.xml
@@ -190,7 +190,6 @@
Spor
Lag reservekopi
Gjenopprett reservekopi
- Reservekopifil-mappe
Reservekopi oppretta
Ugyldig reservekopifil
Reservekopi inneheld ingen manga.
diff --git a/i18n/src/commonMain/resources/MR/pl/strings.xml b/i18n/src/commonMain/resources/MR/pl/strings.xml
index 9e28dfc11..96c824b8c 100644
--- a/i18n/src/commonMain/resources/MR/pl/strings.xml
+++ b/i18n/src/commonMain/resources/MR/pl/strings.xml
@@ -160,10 +160,8 @@
G
B
A
- Lokalizacja pobierania
Po ręcznym oznaczeniu jako przeczytane
Usuwaj rozdziały automatycznie po przeczytaniu
- Niestandardowa lokalizacja
Wyłączone
Ostatnio czytany rozdział
Przedostatnio czytany rozdział
@@ -178,9 +176,7 @@
Może być użyta do przywrócenia aktualnej biblioteki
Przywróć kopię zapasową
Przywraca bibliotekę z pliku kopii zapasowej
- Lokalizacja kopii zapasowych
Częstotliwość tworzenia kopii
- Maks. ilość kopii automatycznych
Co zawrzeć w kopii zapasowej?
Przywracanie kopii zapasowej
Tworzenie kopii zapasowej
@@ -365,7 +361,6 @@
WebView jest wymagany do poprawnego działania aplikacji
Rozdziały %1$s
Rozdział %1$s i %2$d więcej
- Poszukiwanie nowych rozdziałów
Tryb czytania
Źródła lokalne - poradnik
Pokazuj zawartość w strefie odcięcia
@@ -736,4 +731,7 @@
W miesiącu (28 dni)
OK
To usunie śledzenie lokalne.
+ Zatwierdź
+ Przywróć do domyślnych
+ Przenieś serię na dół
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml b/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml
index 861bb7a70..cde48563d 100644
--- a/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml
+++ b/i18n/src/commonMain/resources/MR/pt-rBR/strings.xml
@@ -120,10 +120,8 @@
G
B
A
- Local de download
Após marcado como lido manualmente
Excluir automaticamente após a leitura
- Local personalizado
Desativado
Último capítulo lido
Penúltimo capítulo lido
@@ -136,9 +134,7 @@
Pode ser usado para restaurar a biblioteca atual
Restaurar backup
Restaura a biblioteca de um arquivo de backup
- Local de backup
Frequência de backup automático
- Máximo de backups automáticos
Backup criado
Restauração concluída
Do que você deseja fazer backup\?
@@ -327,7 +323,6 @@
Capítulo %1$s e mais %2$d
Capítulos %1$s
Ocultar conteúdo da notificação
- Verificando por novos capítulos
Desativar a otimização de bateria
Ajuda com as atualizações e os backups da biblioteca em segundo plano
A otimização de bateria já está desativada
@@ -768,4 +763,10 @@
Scanlator
Excluir scanlators
Criar
+ Selecionado
+ Não selecionado
+ Local de armazenamento
+ Usado para backups automáticos, downloads de capítulos e na fonte local.
+ Mais opções
+ Navegar para cima
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/pt/strings.xml b/i18n/src/commonMain/resources/MR/pt/strings.xml
index 1ee6c095e..a5a8f59fe 100644
--- a/i18n/src/commonMain/resources/MR/pt/strings.xml
+++ b/i18n/src/commonMain/resources/MR/pt/strings.xml
@@ -87,10 +87,8 @@
Livre
Vertical bloqueado
Horizontal bloqueado
- Localização das Transferências
Após marcado como lido manualmente
Eliminar automaticamente após a leitura
- Localização personalizada
Desativado
Último capítulo
Penúltimo capítulo lido
@@ -226,11 +224,9 @@
Velocidade de animação de toque duplo
Paginação
R
- Localização de cópia de segurança
Cópia de segurança criada
Restauro completo
O que pretende fazer cópia de segurança\?
- Máximo de cópias de segurança
Capítulos transferidos
Confiar
Não confiável
@@ -326,7 +322,6 @@
Capítulo %1$s e %2$d mais
Capítulos %1$s
Esconder conteúdo das notificações
- Verificando por novos capítulos
Desativar otimização de bateria
Ajuda com a atualização e cópia de segurança da biblioteca em segundo plano
A otimização de bateria já está desativada
diff --git a/i18n/src/commonMain/resources/MR/ro/strings.xml b/i18n/src/commonMain/resources/MR/ro/strings.xml
index c0ce88489..47afbd831 100644
--- a/i18n/src/commonMain/resources/MR/ro/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ro/strings.xml
@@ -145,10 +145,8 @@
G
B
A
- Locația descărcărilor
După ce a fost marcat manual ca citit
După citire ștergeți automat
- Locație personalizată
Deactivat
Ultimul capitol citit
Penultimul capitol citit
@@ -161,9 +159,7 @@
Poate fii folosit pentru a restaura biblioteca curentă
Restaurează copia de rezervă
Restaurează biblioteca din fișierul copiei de rezervă
- Locația copiei de rezervă
Frecventă de creere a copiilor de rezervă
- Numărul maxim de copii de rezervă
Backup creat
Restaurare completă
Doriți să creați o copie de rezervă\?
@@ -327,7 +323,6 @@
Capitolul %1$s și %2$d în plus
Capitolele %1$s
Ascunde conținutul notificării
- Verificând pentru capitole noi
Dezactivați optimizarea bateriei
Ajută la actualizările și copiile de rezervă ale bibliotecii în fundal
Optimizarea bateriei este deja dezactivată
diff --git a/i18n/src/commonMain/resources/MR/ru/strings.xml b/i18n/src/commonMain/resources/MR/ru/strings.xml
index 1eb0b2e28..7f78bef3c 100644
--- a/i18n/src/commonMain/resources/MR/ru/strings.xml
+++ b/i18n/src/commonMain/resources/MR/ru/strings.xml
@@ -61,7 +61,6 @@
Использовать это изображение как обложку\?
Cookies очищены
Обложка обновлена
- Пользовательская папка
Пользовательский фильтр
Не удалось загрузить изображение
Это действие удалит дату прочтения этой главы. Вы уверены\?
@@ -126,7 +125,6 @@
Удалить историю для серий, которые не находятся в библиотеке
Пользовательская яркость
Пользовательский светофильтр
- Папка загрузок
Загружать новые главы
Отправлять отчёты об ошибках
Анимированные переходы страниц
@@ -209,9 +207,7 @@
Источник на устройстве
Серии библиотеки
Больше нет результатов
- Папка резервной копии
Частота автоматических резервных копий
- Количество автоматических резервных копий
Создать резервную копию
Можно использовать для восстановления текущей библиотеки
Обрезать поля
@@ -325,7 +321,6 @@
Главы %1$s
Глава %1$s
Отображение
- Проверка наличия новых глав
Обновление библиотеки
Оптимизация батареи уже выключена
Помогает с обновлением библиотеки и резервной копией в фоне
@@ -768,4 +763,10 @@
Переводчики не найдены
Переводчик
Исключить переводчиков
+ Выбрано
+ Не выбрано
+ Другие опции
+ Перейти вверх
+ Путь хранилища
+ Используется для автоматических резевных копии, загрузок глав и источнике на устройстве.
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/sa/strings.xml b/i18n/src/commonMain/resources/MR/sa/strings.xml
index a5e057ba0..ba0d9e5a6 100644
--- a/i18n/src/commonMain/resources/MR/sa/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sa/strings.xml
@@ -303,13 +303,11 @@
उच्चतमम्
पुटचिह्नकृतानाम् अध्यायानां नाशयितुम् अनुमन्यताम्
वर्जितवर्गाः
- स्वकृतस्थलम्
अशक्तं कृतम्
अन्तिमपठितः अध्यायः
अन्तिमपठितात् अध्यायात् पूर्वम्
अन्तिमपठितात् अध्यायात् द्वितीयपूर्वम्
सेवाः
- अवारोपणस्थलम्
पठितमिति स्वीयचिह्नितात् परम्
पठनात् परं स्वयञ्चालितं नाशयतु
CBZ-लेखागारम् इव अमुकनाम्ना रक्षतु
@@ -326,9 +324,7 @@
प्रतिलेखनं निर्मातु
एतत् उपयुज्य वर्तमानग्रन्थालयं समादातुं शक्यते
प्रतिलेखनं समाददातु
- प्रतिलेखनस्थलम्
प्रतिलेखनस्य आवर्तनता
- अधिकतमप्रतिलेखनानि
प्रतिलेखनं पूर्वमेव प्रगतौ अस्ति
%02d निमेषाः %02d क्षणाः च
प्रतिलेखनस्य समादानम् अनुत्तीर्णम्
@@ -515,7 +511,6 @@
अध्यायः %1$s – %2$s
अग्रिमाध्यायः नास्ति
पूर्वाध्यायः नास्ति
- नूतनाध्यायेभ्यः मार्गति
%1$s: %2$s पुटः च %3$d
पठिताः अध्यायाः न सन्ति
नूतननवीकरणानि न उपलभ्यानि
diff --git a/i18n/src/commonMain/resources/MR/sah/strings.xml b/i18n/src/commonMain/resources/MR/sah/strings.xml
index e33dbadb3..c8300a91c 100644
--- a/i18n/src/commonMain/resources/MR/sah/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sah/strings.xml
@@ -237,9 +237,7 @@
Хаппаас куопуйа маангата суох.
Хаппаас куопуйа алдьаммыт билэтэ
Хаппаас куопуйа оҥоһуллунна
- Муҥутугар дылы хаппаас куопуйалар
Хаппаас куопуйа оҥоһуутун түргэнэ
- Хаппаас куопуйа сурунаала
Бэбэлэтиэкэни хаппаас куопуйа билэтиттэн төнүҥнэрии
Хаппаас куопуйаны куолутунан туруоруу
Билиҥни бибилиотеканы төнүннэрэргэ туттуохха сөп
@@ -254,10 +252,8 @@
Бүтэһик түһүмэх иннинээҕи
Бүтэһигинэн ааҕыллыбыт түһүмэх
Араарыллыбыт
- Туттааччы ыйдарыыта
Ааҕы кэннэ
Ааҕыллыбыт диэн суруллубутун кэннэ
- Хачайдааһын сурунаала
Уларыйыы киирэрин гына эбилиги хос холбоо
Кээс сотторуутугар сыыһааһын буолла
Кээс ыраастанна. %1$d билэ сотторуллубут этэ
diff --git a/i18n/src/commonMain/resources/MR/sc/strings.xml b/i18n/src/commonMain/resources/MR/sc/strings.xml
index c54c10a42..9153343cf 100644
--- a/i18n/src/commonMain/resources/MR/sc/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sc/strings.xml
@@ -146,10 +146,8 @@
G
B
A
- Cartella de sos iscarrigamentos
A pustis de l\'àere marcadu manualmente comente lèghidu
Iscantzella in automàticu a pustis de sa leghidura
- Cartella personalizada
Disabilitadu
Leghe s\'ùrtimu capìtulu
Penùrtimu capìtulu lèghidu
@@ -162,9 +160,7 @@
Podet èssere impreada pro ripristinare sa biblioteca atuale
Riprìstina una còpia de seguresa
Riprìstina sa biblioteca dae una còpia de seguresa
- Cartella de sa còpia de seguresa
Frecuèntzia de sarvatàgiu de sas còpias de seguresa
- Màssimu de còpias de seguresa
Còpia de seguresa creada
Riprìstinu acabadu
De ite cheres fàghere una còpia de seguresa\?
@@ -327,7 +323,6 @@
Capìtulu %1$s e àteros %2$d
Capìtulos %1$s
Cua su cuntenutu de sas notìficas
- Chirchende capìtulos noos
Disabìlita s\'otimizatzione de sa bateria
Agiudat cun sos agiornamentos de sa biblioteca e sas còpias de seguresa
S\'otimizatzione de sa bateria est giai disabilitada
@@ -749,4 +744,29 @@
HTTP %d, verìfica su situ in WebView
\"%1$s\" in càmbiu de \"%2$s\"
Non s\'est pòdidu atzèdere a %s
+ Positzione de archiviatzione
+ Crea
+ Mai
+ Mìnimat s\'efetu pantasma in ischermos cun tinta eletrònica
+ Impreadu pro sas còpias de seguresa automàticas, sos iscarrigamentos de sos capìtulos e s\'orìgine locale.
+ Àplica
+ Riprìstina a sos valores predefinidos
+ Òrdina sas categorias
+ Prus optziones
+ Ùrtima còpia de seguresa automàtica: %s
+ Seletzionadu
+ Perunu iscandutore agatadu
+ Non seletzionadu
+ Iscandutore (iscansidore+tradutore)
+ Lampìgia in biancu in su càmbiu de pàgina
+ Impreu de sa memòria
+ Agiornende sa biblioteca… (%s)
+ Nàviga cara a subra
+ Votu de s\'arrastadore
+ Datos e archiviatzione
+ Boles ordinare sas categorias in manera alfabètica?
+ Perunu archìviu seletzionadu
+ Impostatziones de sas fontes
+ Impostatziones de s\'aplicatzione
+ Esclude sos iscandutores (iscansidores+tradutores)
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/sdh/strings.xml b/i18n/src/commonMain/resources/MR/sdh/strings.xml
index 6172e7469..9b4a4a81c 100644
--- a/i18n/src/commonMain/resources/MR/sdh/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sdh/strings.xml
@@ -55,7 +55,6 @@
هیچ مانگایەکت لەم دواییانە نەخوێندووەتەوە
زانیاری زیادکراو
یارمەتی
- گەڕان بە دوای چاپتەری نوێدا
تۆماری ڕابردووەکەت بەتاڵە
گەڕان لە ناو سازکارییەکان
وەک نەخوێندراوێک ئاماژەی پێبکە
@@ -189,7 +188,6 @@
کردنە ناو کۆکراوەکان
تکایە مانگا بۆ کۆکراوەکان زیاد بکە پێش کردنی ئەمە
زیادکردنی مانگا بۆ کۆکراوەکان؟
- شوێنی داونلۆد
داونلۆدکردن
تەنها داونلۆدکراوەکان
ئەمە ڕێگری ناکات لە دەرکەوتنی بابەتی سەروو 18 ی نا فەرمی لە بەرنامەکە.
diff --git a/i18n/src/commonMain/resources/MR/sk/strings.xml b/i18n/src/commonMain/resources/MR/sk/strings.xml
index b095dc1f1..46fbb2b33 100644
--- a/i18n/src/commonMain/resources/MR/sk/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sk/strings.xml
@@ -156,10 +156,8 @@
G
B
A
- Kam stahovať
Po manuálnom označení ako prečítané
Po prečítaní automaticky odstrániť
- Vlastný adresár
Zakázané
Naposledy čítaná kapitola
Predposledná prečítaná kapitola
@@ -172,9 +170,7 @@
Možno použiť na obnovenie aktuálnej knižnice
Obnoviť zálohu
Obnoviť knižnicu zo záložného súboru
- Adresár na zálohy
Frekvencia zálohovania
- Maximálny počet záloh
Záloha bola vytvorená
Obnovenie dokončené
Čo chcete zálohovať\?
@@ -306,7 +302,6 @@
Nepodarilo sa obísť službu Cloudflare
Pozastavené
Neprečítané
- Hľadám nové kapitoly
Skryť obsah upozornení
Zakázať všetko
Povoliť všetko
diff --git a/i18n/src/commonMain/resources/MR/sq/strings.xml b/i18n/src/commonMain/resources/MR/sq/strings.xml
index eeed53f50..ceda2b70d 100644
--- a/i18n/src/commonMain/resources/MR/sq/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sq/strings.xml
@@ -341,10 +341,8 @@
Modaliteti i leximit
Më e larta
E ulët
- Shkarko vendndodhjen
Fshi kapitujt
Kategoritë e përjashtuara
- Vendndodhja e personalizuar
Vendndodhja e pavlefshme: %s
Kapitulli i fundit i lexuar
Kapitulli i katërt deri tek i fundit i lexuar
@@ -401,7 +399,6 @@
Shërbime që ofrojnë veçori të përmirësuara për burime specifike. Regjistrimet gjurmohen automatikisht kur shtohen në bibliotekën tuaj.
Pista
Frekuenca rezervë
- Rezervimet maksimale
Gjurmuesit nuk kanë hyrë në:
%02d min, %02d sek
Rezervimi/rivendosja mund të mos funksionojë siç duhet nëse Optimizimi MIUI është i çaktivizuar.
@@ -502,7 +499,6 @@
Krijo kopje rezervë
Mund të përdoret për të rivendosur bibliotekën aktuale
Rivendos kopjen rezervë
- Vendndodhja rezervë
U krijua një kopje rezervë
Burimet që mungojnë:
Rivendosja përfundoi
@@ -629,7 +625,6 @@
Rinisni aplikacionin
Kapitujt nuk mund të shkarkoheshin për shkak të hapësirës së ulët të ruajtjes
Paralajmërim: shkarkimet e mëdha me shumicë mund të çojnë në ngadalësimin e burimeve dhe/ose bllokimin e Tachiyomi. Trokit për të mësuar më shumë.
- Duke kontrolluar për kapituj të rinj
U gjetën kapituj të rinj
Trokit për të mësuar më shumë
Përditësimi i kopertinës dështoi
diff --git a/i18n/src/commonMain/resources/MR/sr/strings.xml b/i18n/src/commonMain/resources/MR/sr/strings.xml
index 8106d435b..8cab68641 100644
--- a/i18n/src/commonMain/resources/MR/sr/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sr/strings.xml
@@ -145,10 +145,8 @@
G
B
A
- Локација преузимања
Када су означена као прочитана
Аутоматски обриши након читања
- Друга локација
Онемогућено
Последње прочитано поглавље
Претпоследње прочитано поглавље
@@ -161,9 +159,7 @@
Може се користити за враћање на тренутно стање колекције
Врати се на резервну копију
Врати се на колекцију из резервне копије
- Локација резервних копија
Учесталост прављења резервних копија
- Максималан број резервних копија
Направљена је резервна копија
Враћање је завршено
Шта све желите да буде у резервној копији\?
@@ -276,7 +272,6 @@
Поглавље %1$s и још %2$d
Поглавље %1$s
Пронађена су нова поглавља
- Тражење нових поглавља
Неуспешно преузимање поглавља. Покушајте поново у секцији за преузимања
Копирај
Мигрирај
diff --git a/i18n/src/commonMain/resources/MR/sv/strings.xml b/i18n/src/commonMain/resources/MR/sv/strings.xml
index d871040a1..747b406f0 100644
--- a/i18n/src/commonMain/resources/MR/sv/strings.xml
+++ b/i18n/src/commonMain/resources/MR/sv/strings.xml
@@ -145,10 +145,8 @@
G
B
A
- Nedladdningsplats
Efter manuellt markerad som läst
Ta bort automatiskt efter läsning
- Anpassad plats
Inaktiverad
Senaste lästa kapitel
Näst sist lästa kapitel
@@ -161,9 +159,7 @@
Kan användas för att återställa biblioteket
Återställ säkerhetskopia
Återställ biblioteket från en säkerhetskopia
- Säkerhetskopieringsplats
Automatisk säkerhetskopieringsfrekvens
- Max antal automatiska säkerhetskopior
Säkerhetskopia skapad
Återställning slutförd
Vad vill du säkerhetskopiera\?
@@ -327,7 +323,6 @@
Kapitel %1$s och %2$d till
Kapitlen %1$s
Dölj notisinnehåll
- Letar efter nya kapitel
Inaktivera batterioptimering
Hjälper till med uppdateringar och säkerhetskopior i bakgrunden
Batterioptimering är redan inaktiverat
@@ -768,4 +763,10 @@
Data och lagring
Ingen fil vald
Exkludera scanlatorer
+ Lagringsplats
+ Används för automatisk säkerhetskopiering, kapitelnedladdningar och lokal källa.
+ Mer alternativ
+ Vald
+ Inte vald
+ Navigera upp
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/th/strings.xml b/i18n/src/commonMain/resources/MR/th/strings.xml
index ea8c8cdb4..524645175 100644
--- a/i18n/src/commonMain/resources/MR/th/strings.xml
+++ b/i18n/src/commonMain/resources/MR/th/strings.xml
@@ -146,10 +146,8 @@
เขียว
น้ำเงิน
โปร่งใส
- ตําแหน่งที่ดาวน์โหลด
หลังจากทําเครื่องหมายว่าอ่านแล้วด้วยตนเอง
ลบอัตโนมัติหลังจากที่อ่านแล้ว
- ตําแหน่งกําหนดเอง
ปิดการใช้งาน
ตอนที่อ่านล่าสุด
ตอนรองก่อนตอนที่อ่านล่าสุด
@@ -162,9 +160,7 @@
สามารถใช้ในการเรียกคืนค่าคลังปัจจุบัน
เรียกคืนค่าการสำรองข้อมูล
เรียกคืนค่าคลังจากแฟ้มข้อมูลสำรอง
- ตําแหน่งที่ตั้งข้อมูลสํารอง
ความถี่ในการสำรองข้อมูลอัตโนมัติ
- จำนวนการสำรองข้อมูลอัตโนมัติสูงสุด
สร้างการสำรองข้อมูลแล้ว
คืนค่าเสร็จสมบูรณ์
ต้องการสำรองข้อมูลใดบ้าง\?
@@ -475,7 +471,6 @@
ซิงค์ทางเดียวเพื่ออัปเดตความคืบหน้าของตอนกับตัวติดตามภายนอก ตั้งค่าการติดตามรายการในแต่ละรายการได้จากปุ่มติดตาม
รายการในหมวดหมู่ที่ยกเว้นไว้จะไม่ถูกดาวน์โหลดแม้ว่าจะอยู่ในหมวดหมู่ที่รวมอยู่ด้วยก็ตาม
ดาวน์โหลดอัตโนมัติ
- กำลังตรวจสอบตอนหาใหม่
ไม่สามารถดาวน์โหลดตอนได้เนื่องจากพื้นที่จัดเก็บเหลือน้อย
ไม่รองรับ Android เวอร์ชันนี้อีกต่อไป
ไม่พบแอปเลือกแฟ้ม
@@ -768,4 +763,10 @@
ผู้แปล
คะแนนจากตัวติดตาม
ผู้แปลที่เว้นไว้
+ ตำแหน่งที่จัดเก็บ
+ ใช้สำหรับการสำรองข้อมูลอัตโนมัติ การดาวน์โหลดตอน และแหล่งที่มาในเครื่อง
+ ตัวเลือกเพิ่มเติม
+ เลือกแล้ว
+ ยังไม่ได้เลือก
+ ขึ้นไปข้างบน
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/tr/strings.xml b/i18n/src/commonMain/resources/MR/tr/strings.xml
index 1dadacd74..620e77364 100644
--- a/i18n/src/commonMain/resources/MR/tr/strings.xml
+++ b/i18n/src/commonMain/resources/MR/tr/strings.xml
@@ -145,10 +145,8 @@
Y
M
A
- İndirme konumu
Elle okundu olarak imlenince
Okunduktan sonra kendiliğinden sil
- Özel konum
Devre dışı
Son okunan bölüm
Okunan sondan ikinci bölüm
@@ -161,9 +159,7 @@
Şu anki kitaplığı geri yüklemek için kullanılabilir
Yedeği geri yükle
Kitaplığı yedek dosyasından geri yükle
- Yedekleme konumu
Kendiliğinden yedekleme sıklığı
- En fazla kendiliğinden yedek
Yedek oluşturuldu
Geri yükleme tamamlandı
Neyi yedeklemek istiyorsunuz?
@@ -327,7 +323,6 @@
Bölüm %1$s ve %2$d daha
Bölüm %1$s
Bildirim içeriğini gizle
- Yeni bölümler aranıyor
Pil iyileştirmeyi devre dışı bırak
Arka plan kitaplık güncellemelerine ve yedeklemelerine yardım eder
Pil iyileştirme zaten devre dışı
@@ -768,4 +763,10 @@
Veri ve depolama
Tarevirileri hariç tut
Oluştur
+ Seçilmedi
+ Diğer seçenekler
+ Seçili
+ Depolama yeri
+ Kendiliğinden yedeklemeler, bölüm indirmeleri ve yerel kaynak için kullanılır.
+ Yukarı git
\ No newline at end of file
diff --git a/i18n/src/commonMain/resources/MR/uk/strings.xml b/i18n/src/commonMain/resources/MR/uk/strings.xml
index b2ebae4be..5ed5a3f12 100644
--- a/i18n/src/commonMain/resources/MR/uk/strings.xml
+++ b/i18n/src/commonMain/resources/MR/uk/strings.xml
@@ -145,10 +145,8 @@
G
B
A
- Директорія завантажень
Після того, як було відмічено прочитаним вручну
Автоматично видаляти після прочитання
- Користувацька директорія
Вимкнено
Останній прочитаний розділ
Передостанній прочитаний розділ
@@ -161,9 +159,7 @@
Можна використовувати для відновлення поточної бібліотеки
Відновити резервну копію
Відновити бібліотеку з резервної копії
- Директорія резервної копії
Частота автоматичних бекапів
- Максимальна кількість автоматичних бекапів
Резервна копія створена
Відновлення завершено
Що ви хочете зберегти до резервної копії\?
@@ -327,7 +323,6 @@
Розділ %1$s та ще %2$d
Розділи %1$s
Приховати вміст сповіщень
- Перевірка нових розділів
Вимкнути збереження батареї
Допомагає фоновому оновленню бібліотеки та резервним копіям
Збереження батареї вже вимкнено
diff --git a/i18n/src/commonMain/resources/MR/uz/strings.xml b/i18n/src/commonMain/resources/MR/uz/strings.xml
index f7e264530..b0edbd333 100644
--- a/i18n/src/commonMain/resources/MR/uz/strings.xml
+++ b/i18n/src/commonMain/resources/MR/uz/strings.xml
@@ -335,12 +335,10 @@
Boblarni o\'chirish
Noto\'g\'ri joylashuv: %s
Past
- Foydalanuvchi papkasi
«O\'qilgan» deb belgilangandan so\'ng o\'chirish
Avtomatik
Portret
O\'zgarmas portret
- Yuklamalar papkasi
Aylantirish vaqtida menyu yashirish sezuvchanligi
O\'zgarmas landshaft
Kattalashtirish
diff --git a/i18n/src/commonMain/resources/MR/vi/strings.xml b/i18n/src/commonMain/resources/MR/vi/strings.xml
index c2d0ad164..d94f2b7d9 100644
--- a/i18n/src/commonMain/resources/MR/vi/strings.xml
+++ b/i18n/src/commonMain/resources/MR/vi/strings.xml
@@ -106,10 +106,8 @@
G
B
A
- Đường dẫn tải xuống
Sau khi đánh dấu thủ công là đã đọc
Tự động xóa sau khi đọc
- Đường dẫn tùy chỉnh
Vô hiệu hóa
Chương đã đọc gần nhất
Hai chương đã đọc gần nhất
@@ -241,9 +239,7 @@
Có thể sử dụng để khôi phục thư viện hiện tại
Khôi phục sao lưu
Khôi phục thư viện từ tập tin sao lưu
- Nơi lưu trữ
Lịch sao lưu
- Số sao lưu tối đa
Sao lưu đã được tạo
Khôi phục hoàn tất
Bạn có muốn sao lưu không\?
@@ -290,7 +286,6 @@
Vui lòng cập nhật WebView để tương thích tốt hơn
Bỏ qua Cloudflare thất bại
Chương %1$s
- Kiểm tra các chương cập nhật mới
Đang cập nhật thư viện
Đã tạm ngưng
Bạn đã đăng xuất
diff --git a/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml b/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml
index 15b841174..73b5d1e1c 100644
--- a/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml
+++ b/i18n/src/commonMain/resources/MR/zh-rCN/strings.xml
@@ -145,10 +145,8 @@
G
B
A
- 下载路径
手动标记为已读后
阅毕自动删除
- 自定义路径
关闭
最后阅读的章节
倒数第二已读章节
@@ -161,9 +159,7 @@
可用于还原当前书架数据
还原备份
从备份文件中还原
- 备份路径
自动备份频率
- 最大自动备份数
已创建备份
还原完毕
需要备份什么?
@@ -327,7 +323,6 @@
第 %1$s 章
第 %1$s 章及另外 %2$d 章
第 %1$s 章
- 正在检查新章节
关闭电池优化
有助于后台更新书架和备份
电池优化已被关闭
diff --git a/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml b/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml
index 59a113b81..699a6c910 100644
--- a/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml
+++ b/i18n/src/commonMain/resources/MR/zh-rTW/strings.xml
@@ -108,15 +108,12 @@
G
B
A
- 下載位置
手動標示為已讀後
- 自訂位置
已停用
自動下載新章節
歷程平台
建立備份
還原備份
- 備份位置
自動備份頻率
已建立備份
還原成功
@@ -267,7 +264,6 @@
\n
\n若選擇信任該憑證,即表示你願意承擔上述風險。
最後閱畢的章節
- 最大自動備份數量
您確定要這樣做嗎?未收藏的漫畫的閱讀進度和章節會被刪除
新上架
歷程
@@ -390,7 +386,6 @@
垂直
水平
反轉輕觸區域
- 正在檢查是否有新章節
捲動式 (頁間留空)
無
%02d 分 %02d 秒
@@ -768,4 +763,10 @@
掃譯者
排除掃譯者
建立
+ 更多選項
+ 已勾選
+ 尚未勾選
+ 向上瀏覽
+ 儲存位置
+ 供自動備份、章節下載和本機來源使用。
\ No newline at end of file
diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt
index b24baec43..9642cec71 100644
--- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt
+++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/material/PullRefresh.kt
@@ -47,22 +47,11 @@ fun PullRefresh(
content: @Composable () -> Unit,
) {
val state = rememberPullToRefreshState(
- initialRefreshing = refreshing,
+ isRefreshing = refreshing,
extraVerticalOffset = indicatorPadding.calculateTopPadding(),
enabled = enabled,
+ onRefresh = onRefresh,
)
- if (state.isRefreshing) {
- LaunchedEffect(true) {
- onRefresh()
- }
- }
- LaunchedEffect(refreshing) {
- if (refreshing && !state.isRefreshing) {
- state.startRefreshAnimated()
- } else if (!refreshing && state.isRefreshing) {
- state.endRefreshAnimated()
- }
- }
Box(modifier.nestedScroll(state.nestedScrollConnection)) {
content()
@@ -94,10 +83,11 @@ fun PullRefresh(
@Composable
private fun rememberPullToRefreshState(
- initialRefreshing: Boolean,
+ isRefreshing: Boolean,
extraVerticalOffset: Dp,
positionalThreshold: Dp = 64.dp,
enabled: () -> Boolean = { true },
+ onRefresh: () -> Unit,
): PullToRefreshStateImpl {
val density = LocalDensity.current
val extraVerticalOffsetPx = with(density) { extraVerticalOffset.toPx() }
@@ -106,18 +96,29 @@ private fun rememberPullToRefreshState(
extraVerticalOffset,
positionalThresholdPx,
enabled,
+ onRefresh,
saver = PullToRefreshStateImpl.Saver(
extraVerticalOffset = extraVerticalOffsetPx,
positionalThreshold = positionalThresholdPx,
enabled = enabled,
+ onRefresh = onRefresh,
),
) {
PullToRefreshStateImpl(
- initialRefreshing = initialRefreshing,
+ initialRefreshing = isRefreshing,
extraVerticalOffset = extraVerticalOffsetPx,
positionalThreshold = positionalThresholdPx,
enabled = enabled,
+ onRefresh = onRefresh,
)
+ }.also {
+ LaunchedEffect(isRefreshing) {
+ if (isRefreshing && !it.isRefreshing) {
+ it.startRefreshAnimated()
+ } else if (!isRefreshing && it.isRefreshing) {
+ it.endRefreshAnimated()
+ }
+ }
}
}
@@ -128,6 +129,7 @@ private fun rememberPullToRefreshState(
* @param extraVerticalOffset Extra vertical offset, in pixels, for the "refreshing" state
* @param initialRefreshing The initial refreshing value of [PullToRefreshState]
* @param enabled a callback used to determine whether scroll events are to be handled by this
+ * @param onRefresh a callback to run when pull-to-refresh action is triggered by user
* [PullToRefreshState]
*/
private class PullToRefreshStateImpl(
@@ -135,6 +137,7 @@ private class PullToRefreshStateImpl(
private val extraVerticalOffset: Float,
override val positionalThreshold: Float,
enabled: () -> Boolean,
+ private val onRefresh: () -> Unit,
) : PullToRefreshState {
override val progress get() = adjustedDistancePulled / positionalThreshold
@@ -215,6 +218,7 @@ private class PullToRefreshStateImpl(
if (isRefreshing) return 0f // Already refreshing, do nothing
// Trigger refresh
if (adjustedDistancePulled > positionalThreshold) {
+ onRefresh()
startRefreshAnimated()
} else {
animateTo(0f)
@@ -263,6 +267,7 @@ private class PullToRefreshStateImpl(
extraVerticalOffset: Float,
positionalThreshold: Float,
enabled: () -> Boolean,
+ onRefresh: () -> Unit,
) = Saver(
save = { it.isRefreshing },
restore = { isRefreshing ->
@@ -271,6 +276,7 @@ private class PullToRefreshStateImpl(
extraVerticalOffset = extraVerticalOffset,
positionalThreshold = positionalThreshold,
enabled = enabled,
+ onRefresh = onRefresh,
)
},
)
diff --git a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt
index 1305001f5..6177e7746 100644
--- a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt
+++ b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt
@@ -127,7 +127,7 @@ actual class LocalSource(
// Try to find the cover
coverManager.find(mangaDir.name.orEmpty())?.let {
- thumbnail_url = it.filePath
+ thumbnail_url = it.uri.toString()
}
}
}
@@ -140,7 +140,7 @@ actual class LocalSource(
// Manga details related
override suspend fun getMangaDetails(manga: SManga): SManga = withIOContext {
coverManager.find(manga.url)?.let {
- manga.thumbnail_url = it.filePath
+ manga.thumbnail_url = it.uri.toString()
}
// Augment manga details based on metadata files