Merge remote-tracking branch 'origin/devel' into devel

pull/125/head^2
Zakhar Timoshenko 4 years ago
commit 4e976fc4ec

@ -10,7 +10,7 @@ Kotatsu is a free and open source manga reader for Android.
alt="Get it on F-Droid" alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/org.koitharu.kotatsu) height="80">](https://f-droid.org/packages/org.koitharu.kotatsu)
Download APK from Github Releases: Download APK from GitHub Releases:
- [Latest release](https://github.com/KotatsuApp/Kotatsu/releases/latest) - [Latest release](https://github.com/KotatsuApp/Kotatsu/releases/latest)

@ -14,8 +14,8 @@ android {
applicationId 'org.koitharu.kotatsu' applicationId 'org.koitharu.kotatsu'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 32 targetSdkVersion 32
versionCode 410 versionCode 411
versionName '3.3.1' versionName '3.3.2'
generatedDensities = [] generatedDensities = []
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

@ -6,14 +6,12 @@ import androidx.annotation.CallSuper
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner
import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.settings.SettingsActivity
import org.koitharu.kotatsu.settings.SettingsHeadersFragment import org.koitharu.kotatsu.settings.SettingsHeadersFragment
abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : abstract class BasePreferenceFragment(@StringRes private val titleId: Int) :

@ -15,11 +15,11 @@ class BackupZipOutput(val file: File) : Closeable {
private val output = ZipOutput(file, Deflater.BEST_COMPRESSION) private val output = ZipOutput(file, Deflater.BEST_COMPRESSION)
suspend fun put(entry: BackupEntry) { suspend fun put(entry: BackupEntry) = runInterruptible(Dispatchers.IO) {
output.put(entry.name, entry.data.toString(2)) output.put(entry.name, entry.data.toString(2))
} }
suspend fun finish() { suspend fun finish() = runInterruptible(Dispatchers.IO) {
output.finish() output.finish()
} }

@ -1,8 +1,6 @@
package org.koitharu.kotatsu.core.exceptions package org.koitharu.kotatsu.core.exceptions
import androidx.annotation.StringRes
import okio.IOException import okio.IOException
import org.koitharu.kotatsu.R
class CloudFlareProtectedException( class CloudFlareProtectedException(
val url: String val url: String

@ -321,9 +321,6 @@ class AppSettings(context: Context) {
const val KEY_APP_UPDATE = "app_update" const val KEY_APP_UPDATE = "app_update"
const val KEY_APP_UPDATE_AUTO = "app_update_auto" const val KEY_APP_UPDATE_AUTO = "app_update_auto"
const val KEY_APP_TRANSLATION = "about_app_translation" const val KEY_APP_TRANSLATION = "about_app_translation"
const val KEY_FEEDBACK_4PDA = "about_feedback_4pda"
const val KEY_FEEDBACK_DISCORD = "about_feedback_discord"
const val KEY_FEEDBACK_GITHUB = "about_feedback_github"
private const val NETWORK_NEVER = 0 private const val NETWORK_NEVER = 0
private const val NETWORK_ALWAYS = 1 private const val NETWORK_ALWAYS = 1

@ -9,7 +9,6 @@ import androidx.collection.ArraySet
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.isNotEmpty import androidx.core.view.isNotEmpty
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar

@ -16,6 +16,7 @@ abstract class BasePageHolder<B : ViewBinding>(
exceptionResolver: ExceptionResolver exceptionResolver: ExceptionResolver
) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback { ) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback {
@Suppress("LeakingThis")
protected val delegate = PageHolderDelegate(loader, settings, this, exceptionResolver) protected val delegate = PageHolderDelegate(loader, settings, this, exceptionResolver)
protected val bindingInfo = LayoutPageInfoBinding.bind(binding.root) protected val bindingInfo = LayoutPageInfoBinding.bind(binding.root)

@ -11,10 +11,11 @@ import org.koitharu.kotatsu.utils.ext.resetTransformations
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
@Suppress("LeakingThis")
abstract class BaseReaderAdapter<H : BasePageHolder<*>>( abstract class BaseReaderAdapter<H : BasePageHolder<*>>(
private val loader: PageLoader, private val loader: PageLoader,
private val settings: AppSettings, private val settings: AppSettings,
private val exceptionResolver: ExceptionResolver private val exceptionResolver: ExceptionResolver,
) : RecyclerView.Adapter<H>() { ) : RecyclerView.Adapter<H>() {
private val differ = AsyncListDiffer(this, DiffCallback()) private val differ = AsyncListDiffer(this, DiffCallback())

@ -3,7 +3,6 @@ package org.koitharu.kotatsu.search.ui
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.graphics.Insets import androidx.core.graphics.Insets

@ -22,7 +22,6 @@ import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner
import org.koitharu.kotatsu.databinding.ActivitySettingsBinding import org.koitharu.kotatsu.databinding.ActivitySettingsBinding
import org.koitharu.kotatsu.main.ui.AppBarOwner import org.koitharu.kotatsu.main.ui.AppBarOwner
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.tracker.domain.Tracker
import org.koitharu.kotatsu.utils.ext.isScrolledToTop import org.koitharu.kotatsu.utils.ext.isScrolledToTop
class SettingsActivity : class SettingsActivity :

@ -29,6 +29,6 @@ class RingtonePickContract(private val title: String?) : ActivityResultContract<
} }
override fun parseResult(resultCode: Int, intent: Intent?): Uri? { override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
return intent?.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) return intent?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
} }
} }

@ -32,14 +32,14 @@ class SuggestionRepository(
suspend fun replace(suggestions: Iterable<MangaSuggestion>) { suspend fun replace(suggestions: Iterable<MangaSuggestion>) {
db.withTransaction { db.withTransaction {
db.suggestionDao.deleteAll() db.suggestionDao.deleteAll()
suggestions.forEach { x -> suggestions.forEach { (manga, relevance) ->
val tags = x.manga.tags.toEntities() val tags = manga.tags.toEntities()
db.tagsDao.upsert(tags) db.tagsDao.upsert(tags)
db.mangaDao.upsert(x.manga.toEntity(), tags) db.mangaDao.upsert(manga.toEntity(), tags)
db.suggestionDao.upsert( db.suggestionDao.upsert(
SuggestionEntity( SuggestionEntity(
mangaId = x.manga.id, mangaId = manga.id,
relevance = x.relevance, relevance = relevance,
createdAt = System.currentTimeMillis(), createdAt = System.currentTimeMillis(),
) )
) )

@ -35,7 +35,7 @@ class ScreenOrientationHelper(private val activity: Activity) {
isLandscape = !isLandscape isLandscape = !isLandscape
} }
fun observeAutoOrientation() = callbackFlow<Boolean> { fun observeAutoOrientation() = callbackFlow {
val observer = object : ContentObserver(Handler(activity.mainLooper)) { val observer = object : ContentObserver(Handler(activity.mainLooper)) {
override fun onChange(selfChange: Boolean) { override fun onChange(selfChange: Boolean) {
trySendBlocking(isAutoRotationEnabled) trySendBlocking(isAutoRotationEnabled)

@ -1,20 +0,0 @@
package org.koitharu.kotatsu.utils.ext
import android.view.View
import androidx.core.graphics.Insets
fun Insets.getStart(view: View): Int {
return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
right
} else {
left
}
}
fun Insets.getEnd(view: View): Int {
return if (view.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
left
} else {
right
}
}

@ -4,11 +4,10 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.liveData import androidx.lifecycle.liveData
import kotlinx.coroutines.Deferred
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import org.koitharu.kotatsu.utils.BufferedObserver import org.koitharu.kotatsu.utils.BufferedObserver
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
fun <T> LiveData<T?>.observeNotNull(owner: LifecycleOwner, observer: Observer<T>) { fun <T> LiveData<T?>.observeNotNull(owner: LifecycleOwner, observer: Observer<T>) {
this.observe(owner) { this.observe(owner) {

@ -5,8 +5,6 @@ import android.graphics.Rect
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.annotation.StringRes
import androidx.appcompat.widget.TooltipCompat
import androidx.core.view.children import androidx.core.view.children
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView

@ -7,6 +7,7 @@ import android.widget.RemoteViewsService
import coil.ImageLoader import coil.ImageLoader
import coil.executeBlocking import coil.executeBlocking
import coil.request.ImageRequest import coil.request.ImageRequest
import coil.size.Scale
import coil.size.Size import coil.size.Size
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -54,6 +55,7 @@ class RecentListFactory(
ImageRequest.Builder(context) ImageRequest.Builder(context)
.data(item.coverUrl) .data(item.coverUrl)
.size(coverSize) .size(coverSize)
.scale(Scale.FILL)
.transformations(transformation) .transformations(transformation)
.build() .build()
).requireBitmap() ).requireBitmap()

@ -7,6 +7,7 @@ import android.widget.RemoteViewsService
import coil.ImageLoader import coil.ImageLoader
import coil.executeBlocking import coil.executeBlocking
import coil.request.ImageRequest import coil.request.ImageRequest
import coil.size.Scale
import coil.size.Size import coil.size.Size
import coil.transform.RoundedCornersTransformation import coil.transform.RoundedCornersTransformation
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -65,6 +66,7 @@ class ShelfListFactory(
ImageRequest.Builder(context) ImageRequest.Builder(context)
.data(item.coverUrl) .data(item.coverUrl)
.size(coverSize) .size(coverSize)
.scale(Scale.FILL)
.transformations(transformation) .transformations(transformation)
.build() .build()
).requireBitmap() ).requireBitmap()

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorPrimaryContainer" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorPrimaryContainer" android:state_checked="true" android:state_enabled="false" />
<item android:color="?colorSurfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorSurfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorPrimary" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorPrimary" android:state_checked="true" android:state_enabled="false" />
<item android:color="?colorOnSurfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="?colorOnSurfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/kotatsu_primaryContainer" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/kotatsu_primaryContainer" android:state_checked="true" android:state_enabled="false" />
<item android:color="@color/kotatsu_surfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/kotatsu_surfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/blue_primary" android:state_checked="true" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/blue_primary" android:state_checked="true" android:state_enabled="false" />
<item android:color="@color/kotatsu_onSurfaceVariant" android:state_checked="false" android:state_enabled="true" />
<item android:alpha="@dimen/material_emphasis_disabled" android:color="@color/kotatsu_onSurfaceVariant" android:state_checked="false" android:state_enabled="false" />
</selector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="32dp" />
<solid android:color="?attr/colorTertiary" />
</shape>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M2 16h8v-2H2m16 0v-4h-2v4h-4v2h4v4h2v-4h4v-2m-8-8H2v2h12m0 2H2v2h12v-2z" />
</vector>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M14,19H18V5H14M6,19H10V5H6V19Z" />
</vector>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M8,5.14V19.14L19,12.14L8,5.14Z" />
</vector>

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="4dp"
android:left="4dp"
android:right="4dp"
android:top="4dp">
<shape android:shape="oval">
<solid android:color="@color/selector_switch_thumb" />
<size
android:width="20dp"
android:height="20dp" />
</shape>
</item>
</layer-list>

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/selector_switch_track" />
<corners android:radius="56dp" />
<size
android:width="64dp"
android:height="28dp" />
</shape>
</item>
</layer-list>

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="14dp"
android:paddingTop="8dp"
android:paddingEnd="14dp">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/inputLayout"
app:boxBackgroundMode="filled"
app:boxBackgroundColor="@android:color/transparent"
app:hintEnabled="false"
app:expandedHintEnabled="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/inputEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:singleLine="true"
tools:hint="@tools:sample/lorem[2]" />
</com.google.android.material.textfield.TextInputLayout>
</FrameLayout>

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/checkedTextView"
android:layout_width="match_parent"
android:layout_height="?android:listPreferredItemHeightSmall"
android:background="?android:selectableItemBackground"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:gravity="start|center_vertical"
android:paddingStart="?android:listPreferredItemPaddingStart"
android:paddingEnd="?android:listPreferredItemPaddingEnd"
android:textAppearance="?attr/textAppearanceBodyLarge"
tools:checked="true"
tools:text="@tools:sample/lorem[4]" />

@ -2,7 +2,10 @@
<FrameLayout <FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:background="?android:attr/colorBackground"
android:padding="4dp"
android:theme="@style/Theme.Kotatsu.AppWidgetContainer">
<StackView <StackView
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/action_share"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="ifRoom"
android:title="@string/share"
tools:ignore="AppCompatResource" />
</menu>

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:icon="@drawable/ic_pause"
android:id="@+id/action_pause"
android:title="Pause"
app:showAsAction="ifRoom|withText" />
<item
android:icon="@drawable/ic_resume"
android:id="@+id/action_resume"
android:title="Resume"
app:showAsAction="ifRoom|withText" />
</menu>

@ -299,4 +299,7 @@
<string name="send">Senden</string> <string name="send">Senden</string>
<string name="crash_text">Etwas ist schief gelaufen. Bitte senden Sie einen Fehlerbericht an die Entwickler, damit wir das Problem beheben können.</string> <string name="crash_text">Etwas ist schief gelaufen. Bitte senden Sie einen Fehlerbericht an die Entwickler, damit wir das Problem beheben können.</string>
<string name="disable_all">Alle deaktivieren</string> <string name="disable_all">Alle deaktivieren</string>
<string name="use_fingerprint">Fingerabdruck verwenden, falls vorhanden</string>
<string name="appwidget_shelf_description">Manga aus Ihren Favoriten</string>
<string name="appwidget_recent_description">Ihr kürzlich gelesener Manga</string>
</resources> </resources>

@ -298,4 +298,7 @@
<string name="disable_battery_optimization">Desactivar la optimización de la batería</string> <string name="disable_battery_optimization">Desactivar la optimización de la batería</string>
<string name="send">Enviar</string> <string name="send">Enviar</string>
<string name="crash_text">Algo ha ido mal. Por favor, envía un informe de errores a los desarrolladores para ayudarnos a solucionarlo.</string> <string name="crash_text">Algo ha ido mal. Por favor, envía un informe de errores a los desarrolladores para ayudarnos a solucionarlo.</string>
<string name="use_fingerprint">Utilizar la huella dactilar si está disponible</string>
<string name="appwidget_shelf_description">Mangas de tus favoritos</string>
<string name="appwidget_recent_description">Sus mangas recientemente leídos</string>
</resources> </resources>

@ -299,4 +299,7 @@
<string name="crash_text">Jokin meni pieleen. Lähetä vikailmoitus kehittäjille, jotta voimme korjata sen.</string> <string name="crash_text">Jokin meni pieleen. Lähetä vikailmoitus kehittäjille, jotta voimme korjata sen.</string>
<string name="disable_all">Poista kaikki käytöstä</string> <string name="disable_all">Poista kaikki käytöstä</string>
<string name="send">Lähetä</string> <string name="send">Lähetä</string>
<string name="use_fingerprint">Käytä sormenjälkeä, jos käytettävissä</string>
<string name="appwidget_shelf_description">Manga suosikeistasi</string>
<string name="appwidget_recent_description">Äskettäin lukemasi manga</string>
</resources> </resources>

@ -299,4 +299,7 @@
<string name="crash_text">Un problème est survenu. Veuillez soumettre un rapport de bogue aux développeurs pour nous aider à le corriger.</string> <string name="crash_text">Un problème est survenu. Veuillez soumettre un rapport de bogue aux développeurs pour nous aider à le corriger.</string>
<string name="send">Envoyer</string> <string name="send">Envoyer</string>
<string name="disable_all">Tout désactiver</string> <string name="disable_all">Tout désactiver</string>
<string name="use_fingerprint">Utiliser l\'empreinte digitale si elle est disponible</string>
<string name="appwidget_recent_description">Vos mangas récemment lus</string>
<string name="appwidget_shelf_description">Les mangas de vos favoris</string>
</resources> </resources>

@ -299,4 +299,7 @@
<string name="crash_text">Qualcosa è andato storto. Si prega di inviare una segnalazione di bug agli sviluppatori per aiutarci a risolvere il problema.</string> <string name="crash_text">Qualcosa è andato storto. Si prega di inviare una segnalazione di bug agli sviluppatori per aiutarci a risolvere il problema.</string>
<string name="send">Invia</string> <string name="send">Invia</string>
<string name="disable_all">Disabilita tutto</string> <string name="disable_all">Disabilita tutto</string>
<string name="use_fingerprint">Usa le impronte digitali se disponibili</string>
<string name="appwidget_shelf_description">Manga dai preferiti</string>
<string name="appwidget_recent_description">I manga letti di recente</string>
</resources> </resources>

@ -299,4 +299,7 @@
<string name="crash_text">何か問題が発生しました。開発者にバグレポートを提出し、解決にご協力ください。</string> <string name="crash_text">何か問題が発生しました。開発者にバグレポートを提出し、解決にご協力ください。</string>
<string name="send">送信</string> <string name="send">送信</string>
<string name="disable_all">すべて無効にする</string> <string name="disable_all">すべて無効にする</string>
<string name="appwidget_recent_description">最近読んだ漫画</string>
<string name="use_fingerprint">指紋がある場合は、指紋を使用する</string>
<string name="appwidget_shelf_description">お気に入りの漫画</string>
</resources> </resources>

@ -282,4 +282,23 @@
<string name="edit">Изменить</string> <string name="edit">Изменить</string>
<string name="edit_category">Изменить категорию</string> <string name="edit_category">Изменить категорию</string>
<string name="empty_favourite_categories">Нет категорий избранного</string> <string name="empty_favourite_categories">Нет категорий избранного</string>
<string name="bookmark_add">Добавить закладку</string>
<string name="bookmark_remove">Удалить закладку</string>
<string name="bookmarks">Закладки</string>
<string name="bookmark_removed">Закладка удалена</string>
<string name="bookmark_added">Закладка добавлена</string>
<string name="undo">Отменить</string>
<string name="removed_from_history">Удалено из истории</string>
<string name="dns_over_https">DNS через HTTPS</string>
<string name="default_mode">Режим по умолчанию</string>
<string name="detect_reader_mode">Автоопределение режима чтения</string>
<string name="detect_reader_mode_summary">Автоматически определяет, является ли манга веб-комиксом</string>
<string name="disable_battery_optimization">Отключить оптимизацию батареи</string>
<string name="disable_battery_optimization_summary">Помогает с фоновой проверкой обновлений</string>
<string name="crash_text">Что-то пошло не так. Пожалуйста, отправьте отчёт разработчикам, чтобы помочь всё исправить</string>
<string name="send">Отправить</string>
<string name="disable_all">Отключить все</string>
<string name="use_fingerprint">Использовать отпечаток пальца, если доступно</string>
<string name="appwidget_shelf_description">Манга из Вашего избранного</string>
<string name="appwidget_recent_description">Манга, которую Вы недавно читали</string>
</resources> </resources>

@ -194,7 +194,6 @@
<string name="search_results">Arama sonuçları</string> <string name="search_results">Arama sonuçları</string>
<string name="waiting_for_network">Ağ bekleniyor…</string> <string name="waiting_for_network">Ağ bekleniyor…</string>
<string name="repeat_password">Parolayı tekrarla</string> <string name="repeat_password">Parolayı tekrarla</string>
<string name="prefer_rtl_reader">Sağdan sola (←) okuyucuyu tercih et</string>
<string name="dont_check">Denetleme</string> <string name="dont_check">Denetleme</string>
<string name="wrong_password">Yanlış parola</string> <string name="wrong_password">Yanlış parola</string>
<string name="report_github">GitHub\'da sorun oluştur</string> <string name="report_github">GitHub\'da sorun oluştur</string>
@ -300,4 +299,7 @@
<string name="crash_text">Bir şeyler yanlış gitti. Düzeltmemize yardımcı olması için lütfen geliştiricilere bir hata bildirimi gönderin.</string> <string name="crash_text">Bir şeyler yanlış gitti. Düzeltmemize yardımcı olması için lütfen geliştiricilere bir hata bildirimi gönderin.</string>
<string name="send">Gönder</string> <string name="send">Gönder</string>
<string name="disable_all">Tümünü devre dışı bırak</string> <string name="disable_all">Tümünü devre dışı bırak</string>
<string name="use_fingerprint">Varsa parmak izi kullan</string>
<string name="appwidget_shelf_description">Favorilerinizden mangalar</string>
<string name="appwidget_recent_description">Son okuduğunuz mangalar</string>
</resources> </resources>

@ -288,14 +288,18 @@
<string name="bookmarks">Закладки</string> <string name="bookmarks">Закладки</string>
<string name="bookmark_removed">Закладка видалена</string> <string name="bookmark_removed">Закладка видалена</string>
<string name="bookmark_added">Додано закладку</string> <string name="bookmark_added">Додано закладку</string>
<string name="undo">Скасувати</string> <string name="undo">Відмінити</string>
<string name="removed_from_history">Видалено з історії</string> <string name="removed_from_history">Видалено з історії</string>
<string name="dns_over_https">DNS через HTTPS</string> <string name="dns_over_https">DNS через HTTPS</string>
<string name="default_mode">Типовий режим</string> <string name="default_mode">Режим за замовчуванням</string>
<string name="detect_reader_mode_summary">Автоматично визначати, чи є манга вебтуном</string> <string name="detect_reader_mode_summary">Автоматично визначати, чи є манга вебтуном</string>
<string name="detect_reader_mode">Автовизначення режиму читання</string> <string name="detect_reader_mode">Автовизначення режиму читання</string>
<string name="disable_battery_optimization">Вимкнути оптимізацію акумулятора</string> <string name="disable_battery_optimization">Вимкнути оптимізацію акумулятора</string>
<string name="disable_battery_optimization_summary">Допомагає з перевірками фонових оновлень</string> <string name="disable_battery_optimization_summary">Допомагає з перевірками фонових оновлень</string>
<string name="crash_text">Щось пішло не так. Будь ласка, надішліть звіт про помилку розробникам, щоб допомогти нам її виправити.</string> <string name="crash_text">Щось пішло не так. Будь ласка, надішліть звіт про помилку розробникам, щоб допомогти нам її виправити.</string>
<string name="send">Надіслати</string> <string name="send">Надіслати</string>
<string name="disable_all">Вимкнути все</string>
<string name="use_fingerprint">Використовувати відбиток пальця, якщо доступно</string>
<string name="appwidget_shelf_description">Манга з Вашого улюбленого</string>
<string name="appwidget_recent_description">Манга, яку Ви нещодавно читали</string>
</resources> </resources>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources>
<bool name="is_tablet">false</bool> <bool name="is_tablet">false</bool>
<bool name="light_status_bar">true</bool> <bool name="light_status_bar">true</bool>
<bool name="light_navigation_bar">false</bool> <bool name="light_navigation_bar">false</bool>

@ -104,7 +104,7 @@
</style> </style>
<style name="Theme.Kotatsu.AppWidgetContainer" parent="@style/Theme.MaterialComponents.Light"> <style name="Theme.Kotatsu.AppWidgetContainer" parent="@style/Theme.MaterialComponents.Light">
<item name="android:colorBackground">@color/kotatsu_background</item> <item name="android:colorBackground">@android:color/transparent</item>
<item name="android:panelColorBackground">@color/kotatsu_primaryContainer</item> <item name="android:panelColorBackground">@color/kotatsu_primaryContainer</item>
</style> </style>
</resources> </resources>

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:tools="http://schemas.android.com/tools"> <network-security-config
xmlns:tools="http://schemas.android.com/tools">
<!-- Need to allow cleartext traffic for some sources --> <!-- Need to allow cleartext traffic for some sources -->
<base-config <base-config
cleartextTrafficPermitted="true" cleartextTrafficPermitted="true"
@ -8,7 +9,7 @@
<!-- Trust preinstalled CAs --> <!-- Trust preinstalled CAs -->
<certificates src="system" /> <certificates src="system" />
<!-- Additionally trust user added CAs --> <!-- Additionally, trust user added CAs -->
<certificates <certificates
src="user" src="user"
tools:ignore="AcceptsUserCertificates" /> tools:ignore="AcceptsUserCertificates" />

@ -1,13 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<appwidget-provider <appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:description="@string/appwidget_recent_description" android:description="@string/appwidget_recent_description"
android:initialLayout="@layout/widget_recent" android:initialLayout="@layout/widget_recent"
android:minWidth="110dp" android:minWidth="120dp"
android:minHeight="110dp" android:minHeight="40dp"
android:minResizeWidth="40dp" android:minResizeWidth="120dp"
android:minResizeHeight="40dp" android:minResizeHeight="40dp"
android:previewImage="@drawable/ic_appwidget_recent" android:previewImage="@drawable/ic_appwidget_recent"
android:resizeMode="horizontal|vertical" android:resizeMode="horizontal|vertical"
android:targetCellWidth="2"
android:targetCellHeight="2"
android:updatePeriodMillis="0" android:updatePeriodMillis="0"
android:widgetCategory="home_screen" /> android:widgetCategory="home_screen"
tools:ignore="UnusedAttribute" />

@ -5,12 +5,14 @@
android:configure="org.koitharu.kotatsu.widget.shelf.ShelfConfigActivity" android:configure="org.koitharu.kotatsu.widget.shelf.ShelfConfigActivity"
android:description="@string/appwidget_shelf_description" android:description="@string/appwidget_shelf_description"
android:initialLayout="@layout/widget_shelf" android:initialLayout="@layout/widget_shelf"
android:minWidth="110dp" android:minWidth="160dp"
android:minHeight="110dp" android:minHeight="120dp"
android:minResizeWidth="40dp" android:minResizeWidth="120dp"
android:minResizeHeight="40dp" android:minResizeHeight="40dp"
android:previewImage="@drawable/ic_appwidget_shelf" android:previewImage="@drawable/ic_appwidget_shelf"
android:resizeMode="horizontal|vertical" android:resizeMode="horizontal|vertical"
android:targetCellWidth="3"
android:targetCellHeight="2"
android:updatePeriodMillis="0" android:updatePeriodMillis="0"
android:widgetCategory="home_screen" android:widgetCategory="home_screen"
android:widgetFeatures="reconfigurable" android:widgetFeatures="reconfigurable"

@ -5,7 +5,7 @@ Kotatsu - приложения для чтения манги с открыты
- Поиск манги по имени и жанрам - Поиск манги по имени и жанрам
- История чтения - История чтения
- Избранное с пользовательскими категориями - Избранное с пользовательскими категориями
- Возможность сохранять мангу и читать её оффлайн. Поддержка сторонних комиксов в формате CBZ - Возможность сохранять мангу и читать её офлайн. Поддержка сторонних комиксов в формате CBZ
- Интерфейс также оптимизирован для планшетов - Интерфейс также оптимизирован для планшетов
- Поддержка манхвы (Webtoon) - Поддержка манхвы (Webtoon)
- Уведомления о новых главах и лента обновлений - Уведомления о новых главах и лента обновлений

Loading…
Cancel
Save