Compare commits

...

29 Commits
v6.5 ... v6.5.3

Author SHA1 Message Date
Koitharu
e37455e790 Update parsers and add support for Upcoming state 2023-12-28 17:48:00 +02:00
Paper Jack
36259ba901 Translated using Weblate (Italian)
Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Paper Jack <paperjack@tutanota.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/
Translation: Kotatsu/Strings
2023-12-28 16:50:47 +02:00
Nicolò Bertazzo
5b041b9a49 Translated using Weblate (Italian)
Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Nicolò Bertazzo <n.bertazzo@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/
Translation: Kotatsu/Strings
2023-12-28 16:50:47 +02:00
Koitharu
1734e888d6 Move new sources tip to catalog 2023-12-26 20:24:14 +02:00
Koitharu
9108646cea Update parsers 2023-12-25 19:52:37 +02:00
Макар Разин
c6d1cf2f72 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (546 of 546 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (546 of 546 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Макар Разин <makarrazin14@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/uk/
Translation: Kotatsu/Strings
2023-12-25 13:26:51 +02:00
Anon
a317236cb0 Translated using Weblate (Serbian)
Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Anon <anonymousprivate76@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/sr/
Translation: Kotatsu/Strings
2023-12-25 13:26:51 +02:00
Deivinni Silva
3703c07a98 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Deivinni Silva <deivinnimds3656@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2023-12-25 13:26:51 +02:00
Koitharu
b7b32dd447 Update parsers 2023-12-25 13:18:28 +02:00
Koitharu
c103386dc5 Fix crash on file size compution 2023-12-25 10:01:43 +02:00
Koitharu
a9d6ee4a95 Update dependencies 2023-12-25 09:57:01 +02:00
Koitharu
71f2c91e5a Improve sources catalog 2023-12-23 08:44:09 +02:00
Koitharu
b878f358ff Improve explore screen 2023-12-23 07:26:31 +02:00
Deivinni Silva
4c9989da78 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Deivinni Silva <deivinnimds3656@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
2023-12-20 13:27:57 +02:00
ssantos
8e8424022a Translated using Weblate (Portuguese)
Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt/
Translation: Kotatsu/Strings
2023-12-20 13:27:57 +02:00
Koitharu
86504b8bde Update parsers 2023-12-20 13:26:33 +02:00
Zakhar Timoshenko
f082fa084f Recreate splash screen 2023-12-19 21:36:23 +03:00
Zakhar Timoshenko
040fe258e9 Fix ActionMode popup coloring 2023-12-19 20:20:20 +03:00
Koitharu
1076009572 Temporary fix checking for new chapters on large collections #584 2023-12-19 17:37:23 +02:00
Koitharu
40dde71a1d Update parsers 2023-12-19 17:37:23 +02:00
Himawariin
9503aabf78 Translated using Weblate (Filipino)
Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Himawariin <milkytrackz@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fil/
Translation: Kotatsu/Strings
2023-12-19 17:32:43 +02:00
Deivinni Silva
4ee16cfa2f Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (7 of 7 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Deivinni Silva <deivinnimds3656@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/plurals/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/pt_BR/
Translation: Kotatsu/Strings
Translation: Kotatsu/plurals
2023-12-19 17:32:43 +02:00
Koitharu
f1c9eacaf0 Fix color correction apply buttons #597 2023-12-18 18:38:48 +02:00
Koitharu
920e16be10 Merge branch 'master' into devel 2023-12-16 08:46:02 +02:00
Koitharu
451a155e08 Update parsers 2023-12-16 08:12:42 +02:00
Weblate (bot)
0612a7ad2c Translations update from Hosted Weblate (#594)
* Translated using Weblate (Thai)

Currently translated at 71.1% (387 of 544 strings)

Co-authored-by: Nayuki <me@nayuki.cyou>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/th/
Translation: Kotatsu/Strings

* Translated using Weblate (Spanish)

Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/
Translation: Kotatsu/Strings

* Translated using Weblate (Turkish)

Currently translated at 100.0% (546 of 546 strings)

Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/tr/
Translation: Kotatsu/Strings

* Translated using Weblate (Russian)

Currently translated at 99.8% (545 of 546 strings)

Co-authored-by: Hotarun <ihotarun@proton.me>
Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/
Translation: Kotatsu/Strings

---------

Co-authored-by: Nayuki <me@nayuki.cyou>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Hotarun <ihotarun@proton.me>
2023-12-15 23:26:31 +03:00
Zakhar Timoshenko
9c34f25eda Fix navBar color in details screen 2023-12-15 23:02:21 +03:00
Zakhar Timoshenko
42360c678f Revert BottomNav and CTBLayout styles 2023-12-15 22:25:24 +03:00
HotarunIchijou
04a3d02aa9 Minority UI color changes (#593)
* Transparent navigation bar

* bump com.android.material to 1.11.0 and androidx.activity to 1.8.2

* bunp gradle to 8.2.0

* color changes for dynamic theme

* removed unused things
2023-12-15 22:14:16 +03:00
57 changed files with 991 additions and 465 deletions

1
.gitignore vendored
View File

@@ -10,6 +10,7 @@
/.idea/compiler.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/ktlint-plugin.xml
/.idea/assetWizardSettings.xml
/.idea/kotlinScripting.xml
/.idea/kotlinc.xml

View File

@@ -16,8 +16,8 @@ android {
applicationId 'org.koitharu.kotatsu'
minSdk = 21
targetSdk = 34
versionCode = 606
versionName = '6.5'
versionCode = 609
versionName = '6.5.3'
generatedDensities = []
testInstrumentationRunner 'org.koitharu.kotatsu.HiltTestRunner'
ksp {
@@ -82,7 +82,7 @@ afterEvaluate {
}
dependencies {
//noinspection GradleDependency
implementation('com.github.KotatsuApp:kotatsu-parsers:42ecf8a958') {
implementation('com.github.KotatsuApp:kotatsu-parsers:a228d71d57') {
exclude group: 'org.json', module: 'json'
}
@@ -92,7 +92,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.activity:activity-ktx:1.8.1'
implementation 'androidx.activity:activity-ktx:1.8.2'
implementation 'androidx.fragment:fragment-ktx:1.6.2'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
implementation 'androidx.lifecycle:lifecycle-service:2.6.2'
@@ -103,7 +103,7 @@ dependencies {
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta02'
implementation 'androidx.preference:preference-ktx:1.2.1'
implementation 'androidx.biometric:biometric-ktx:1.2.0-alpha05'
implementation 'com.google.android.material:material:1.10.0'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.2'
implementation 'androidx.work:work-runtime:2.9.0'
@@ -120,13 +120,13 @@ dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.12.0'
implementation 'com.squareup.okio:okio:3.6.0'
implementation 'com.squareup.okio:okio:3.7.0'
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl:4.3.2'
implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:4.3.2'
implementation 'com.google.dagger:hilt-android:2.49'
kapt 'com.google.dagger:hilt-compiler:2.49'
implementation 'com.google.dagger:hilt-android:2.50'
kapt 'com.google.dagger:hilt-compiler:2.50'
implementation 'androidx.hilt:hilt-work:1.1.0'
kapt 'androidx.hilt:hilt-compiler:1.1.0'
@@ -155,6 +155,6 @@ dependencies {
androidTestImplementation 'androidx.room:room-testing:2.6.1'
androidTestImplementation 'com.squareup.moshi:moshi-kotlin:1.15.0'
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.49'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.49'
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.50'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.50'
}

View File

@@ -61,13 +61,20 @@ class CaptchaNotifier(
override fun onError(request: ImageRequest, result: ErrorResult) {
super.onError(request, result)
val e = result.throwable
if (e is CloudFlareProtectedException) {
if (e is CloudFlareProtectedException && request.parameters.value<Boolean>(PARAM_IGNORE_CAPTCHA) != true) {
notify(e)
}
}
private companion object {
companion object {
fun ImageRequest.Builder.ignoreCaptchaErrors() = setParameter(
key = PARAM_IGNORE_CAPTCHA,
value = true,
memoryCacheKey = null,
)
private const val PARAM_IGNORE_CAPTCHA = "ignore_captcha"
private const val CHANNEL_ID = "captcha"
private const val TAG = CHANNEL_ID
}

View File

@@ -12,6 +12,7 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.model.MangaState
import org.koitharu.kotatsu.parsers.util.mapToSet
import com.google.android.material.R as materialR
@JvmName("mangaIds")
fun Collection<Manga>.ids() = mapToSet { it.id }
@@ -42,15 +43,17 @@ val MangaState.titleResId: Int
MangaState.FINISHED -> R.string.state_finished
MangaState.ABANDONED -> R.string.state_abandoned
MangaState.PAUSED -> R.string.state_paused
MangaState.UPCOMING -> R.string.state_upcoming
}
@get:DrawableRes
val MangaState.iconResId: Int
get() = when (this) {
MangaState.ONGOING -> R.drawable.ic_state_ongoing
MangaState.ONGOING -> R.drawable.ic_play
MangaState.FINISHED -> R.drawable.ic_state_finished
MangaState.ABANDONED -> R.drawable.ic_state_abandoned
MangaState.PAUSED -> R.drawable.ic_action_pause
MangaState.UPCOMING -> materialR.drawable.ic_clock_black_24dp
}
fun Manga.findChapter(id: Long): MangaChapter? {

View File

@@ -1,17 +1,23 @@
package org.koitharu.kotatsu.core.model
import android.content.Context
import android.graphics.Color
import android.text.SpannableStringBuilder
import android.text.style.ForegroundColorSpan
import android.text.style.RelativeSizeSpan
import android.text.style.SuperscriptSpan
import androidx.annotation.StringRes
import androidx.core.text.buildSpannedString
import androidx.core.text.inSpans
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.util.ext.getDisplayName
import org.koitharu.kotatsu.core.util.ext.getThemeColor
import org.koitharu.kotatsu.core.util.ext.toLocale
import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.util.toTitleCase
import java.util.Locale
fun MangaSource.getLocaleTitle(): String? {
val lc = Locale(locale ?: return null)
return lc.getDisplayLanguage(lc).toTitleCase(lc)
}
import com.google.android.material.R as materialR
fun MangaSource(name: String): MangaSource {
MangaSource.entries.forEach {
@@ -33,6 +39,24 @@ val ContentType.titleResId
fun MangaSource.getSummary(context: Context): String {
val type = context.getString(contentType.titleResId)
val locale = getLocaleTitle() ?: context.getString(R.string.various_languages)
val locale = locale?.toLocale().getDisplayName(context)
return context.getString(R.string.source_summary_pattern, type, locale)
}
fun MangaSource.getTitle(context: Context): CharSequence = if (isNsfw()) {
buildSpannedString {
append(title)
append(' ')
appendNsfwLabel(context)
}
} else {
title
}
private fun SpannableStringBuilder.appendNsfwLabel(context: Context) = inSpans(
ForegroundColorSpan(context.getThemeColor(materialR.attr.colorError, Color.RED)),
RelativeSizeSpan(0.74f),
SuperscriptSpan(),
) {
append(context.getString(R.string.nsfw))
}

View File

@@ -12,4 +12,5 @@ val SortOrder.titleRes: Int
SortOrder.RATING -> R.string.by_rating
SortOrder.NEWEST -> R.string.newest
SortOrder.ALPHABETICAL -> R.string.by_name
SortOrder.ALPHABETICAL_DESC -> R.string.by_name_reverse
}

View File

@@ -70,7 +70,7 @@ class WindowInsetsDelegate : OnApplyWindowInsetsListener, View.OnLayoutChangeLis
lastInsets = null
}
interface WindowInsetsListener {
fun interface WindowInsetsListener {
fun onWindowInsetsChanged(insets: Insets)
}

View File

@@ -130,7 +130,7 @@ fun Window.setNavigationBarTransparentCompat(context: Context, elevation: Float,
} else {
// Set navbar scrim 70% of navigationBarColor
ElevationOverlayProvider(context).compositeOverlayIfNeeded(
context.getThemeColor(android.R.attr.navigationBarColor, alphaFactor),
context.getThemeColor(R.attr.m3ColorBottomMenuBackground, alphaFactor),
elevation,
)
}

View File

@@ -20,12 +20,13 @@ inline fun <T> LocaleListCompat.mapToSet(block: (Locale) -> T): Set<T> {
fun LocaleListCompat.getOrThrow(index: Int) = get(index) ?: throw NoSuchElementException()
fun String?.getLocaleDisplayName(context: Context): String {
fun String.toLocale() = Locale(this)
fun Locale?.getDisplayName(context: Context): String {
if (this == null) {
return context.getString(R.string.various_languages)
}
val lc = Locale(this)
return lc.getDisplayLanguage(lc).toTitleCase(lc)
return getDisplayLanguage(this).toTitleCase(this)
}
private class LocaleListCompatIterator(private val list: LocaleListCompat) : ListIterator<Locale> {

View File

@@ -30,6 +30,8 @@ import org.koitharu.kotatsu.bookmarks.domain.Bookmark
import org.koitharu.kotatsu.bookmarks.ui.adapter.BookmarksAdapter
import org.koitharu.kotatsu.bookmarks.ui.sheet.BookmarksSheet
import org.koitharu.kotatsu.core.model.countChaptersByBranch
import org.koitharu.kotatsu.core.model.iconResId
import org.koitharu.kotatsu.core.model.titleResId
import org.koitharu.kotatsu.core.ui.BaseFragment
import org.koitharu.kotatsu.core.ui.BaseListAdapter
import org.koitharu.kotatsu.core.ui.image.CoverSizeResolver
@@ -66,7 +68,6 @@ import org.koitharu.kotatsu.list.ui.size.StaticItemSizeResolver
import org.koitharu.kotatsu.main.ui.owners.NoModalBottomSheetOwner
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.model.MangaState
import org.koitharu.kotatsu.parsers.model.MangaTag
import org.koitharu.kotatsu.reader.ui.ReaderActivity
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo
@@ -181,28 +182,13 @@ class DetailsFragment :
ratingBar.isVisible = false
}
when (manga.state) {
MangaState.FINISHED -> infoLayout.textViewState.apply {
textAndVisible = resources.getString(R.string.state_finished)
drawableTop = ContextCompat.getDrawable(context, R.drawable.ic_state_finished)
infoLayout.textViewState.apply {
manga.state?.let { state ->
textAndVisible = resources.getString(state.titleResId)
drawableTop = ContextCompat.getDrawable(context, state.iconResId)
} ?: run {
isVisible = false
}
MangaState.ONGOING -> infoLayout.textViewState.apply {
textAndVisible = resources.getString(R.string.state_ongoing)
drawableTop = ContextCompat.getDrawable(context, R.drawable.ic_state_ongoing)
}
MangaState.ABANDONED -> infoLayout.textViewState.apply {
textAndVisible = resources.getString(R.string.state_abandoned)
drawableTop = ContextCompat.getDrawable(context, R.drawable.ic_state_abandoned)
}
MangaState.PAUSED -> infoLayout.textViewState.apply {
textAndVisible = resources.getString(R.string.state_paused)
drawableTop = ContextCompat.getDrawable(context, R.drawable.ic_action_pause)
}
null -> infoLayout.textViewState.isVisible = false
}
if (manga.source == MangaSource.LOCAL) {
infoLayout.textViewSource.isVisible = false

View File

@@ -53,6 +53,7 @@ import org.koitharu.kotatsu.local.data.LocalStorageChanges
import org.koitharu.kotatsu.local.domain.DeleteLocalMangaUseCase
import org.koitharu.kotatsu.local.domain.model.LocalManga
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingStatus
@@ -134,8 +135,14 @@ class DetailsViewModel @Inject constructor(
.map { it?.local }
.distinctUntilChanged()
.map { local ->
local?.file?.computeSize() ?: 0L
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.WhileSubscribed(), 0)
if (local != null) {
runCatchingCancellable {
local.file.computeSize()
}.getOrDefault(0L)
} else {
0L
}
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.WhileSubscribed(5000), 0L)
@Deprecated("")
val description = details

View File

@@ -160,7 +160,7 @@ class ExploreFragment :
override fun onRetryClick(error: Throwable) = Unit
override fun onEmptyActionClick() {
startActivity(SettingsActivity.newManageSourcesIntent(context ?: return))
startActivity(Intent(context ?: return, SourcesCatalogActivity::class.java))
}
private fun onOpenManga(manga: Manga) {

View File

@@ -21,7 +21,6 @@ import org.koitharu.kotatsu.core.ui.util.ReversibleAction
import org.koitharu.kotatsu.core.util.ext.MutableEventFlow
import org.koitharu.kotatsu.core.util.ext.call
import org.koitharu.kotatsu.explore.data.MangaSourcesRepository
import org.koitharu.kotatsu.explore.data.SourcesSortOrder
import org.koitharu.kotatsu.explore.domain.ExploreRepository
import org.koitharu.kotatsu.explore.ui.model.ExploreButtons
import org.koitharu.kotatsu.explore.ui.model.MangaSourceItem
@@ -30,7 +29,6 @@ import org.koitharu.kotatsu.list.ui.model.EmptyHint
import org.koitharu.kotatsu.list.ui.model.ListHeader
import org.koitharu.kotatsu.list.ui.model.ListModel
import org.koitharu.kotatsu.list.ui.model.LoadingState
import org.koitharu.kotatsu.list.ui.model.TipModel
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
@@ -56,8 +54,6 @@ class ExploreViewModel @Inject constructor(
valueProducer = { isSuggestionsEnabled },
)
val sortOrder = MutableStateFlow(SourcesSortOrder.MANUAL) // TODO
val onOpenManga = MutableEventFlow<Manga>()
val onActionDone = MutableEventFlow<ReversibleAction>()
val onShowSuggestionsTip = MutableEventFlow<Unit>()
@@ -129,31 +125,25 @@ class ExploreViewModel @Inject constructor(
randomLoading: Boolean,
newSources: Set<MangaSource>,
): List<ListModel> {
val result = ArrayList<ListModel>(sources.size + 4)
val result = ArrayList<ListModel>(sources.size + 3)
result += ExploreButtons(randomLoading)
if (recommendation != null) {
result += ListHeader(R.string.suggestions)
result += RecommendationsItem(recommendation)
}
if (sources.isNotEmpty()) {
result += ListHeader(R.string.remote_sources, R.string.catalog)
if (newSources.isNotEmpty()) {
result += TipModel(
key = TIP_NEW_SOURCES,
title = R.string.new_sources_text,
text = R.string.new_sources_text,
icon = R.drawable.ic_explore_normal,
primaryButtonText = R.string.manage,
secondaryButtonText = R.string.discard,
)
}
result += ListHeader(
textRes = R.string.remote_sources,
buttonTextRes = R.string.catalog,
badge = if (newSources.isNotEmpty()) "" else null,
)
sources.mapTo(result) { MangaSourceItem(it, isGrid) }
} else {
result += EmptyHint(
icon = R.drawable.ic_empty_common,
textPrimary = R.string.no_manga_sources,
textSecondary = R.string.no_manga_sources_text,
actionStringRes = R.string.manage,
actionStringRes = R.string.catalog,
)
}
return result

View File

@@ -8,6 +8,7 @@ import coil.ImageLoader
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.getSummary
import org.koitharu.kotatsu.core.model.getTitle
import org.koitharu.kotatsu.core.parser.favicon.faviconUri
import org.koitharu.kotatsu.core.ui.image.FaviconDrawable
import org.koitharu.kotatsu.core.ui.image.TrimTransformation
@@ -112,7 +113,7 @@ fun exploreSourceListItemAD(
binding.root.setOnContextClickListenerCompat(eventListener)
bind {
binding.textViewTitle.text = item.source.title
binding.textViewTitle.text = item.source.getTitle(context)
binding.textViewSubtitle.text = item.source.getSummary(context)
val fallbackIcon = FaviconDrawable(context, R.style.FaviconDrawable_Small, item.source.name)
binding.imageViewIcon.newImageRequest(lifecycleOwner, item.source.faviconUri())?.run {
@@ -147,7 +148,7 @@ fun exploreSourceGridItemAD(
binding.root.setOnContextClickListenerCompat(eventListener)
bind {
binding.textViewTitle.text = item.source.title
binding.textViewTitle.text = item.source.getTitle(context)
val fallbackIcon = FaviconDrawable(context, R.style.FaviconDrawable_Large, item.source.name)
binding.imageViewIcon.newImageRequest(lifecycleOwner, item.source.faviconUri())?.run {
fallback(fallbackIcon)

View File

@@ -14,22 +14,37 @@ import com.google.android.material.R as materialR
@CheckResult
fun View.bindBadge(badge: BadgeDrawable?, counter: Int): BadgeDrawable? {
return if (counter > 0) {
val badgeDrawable = badge ?: initBadge(this)
badgeDrawable.number = counter
badgeDrawable.isVisible = true
badgeDrawable.align(this)
badgeDrawable
} else {
badge?.isVisible = false
badge
}
return bindBadgeImpl(badge, null, counter)
}
@CheckResult
fun View.bindBadge(badge: BadgeDrawable?, text: String?): BadgeDrawable? {
return bindBadgeImpl(badge, text, 0)
}
fun View.clearBadge(badge: BadgeDrawable?) {
BadgeUtils.detachBadgeDrawable(badge, this)
}
private fun View.bindBadgeImpl(
badge: BadgeDrawable?,
text: String?,
counter: Int,
): BadgeDrawable? = if (text != null || counter > 0) {
val badgeDrawable = badge ?: initBadge(this)
if (counter > 0) {
badgeDrawable.number = counter
} else {
badgeDrawable.text = text?.takeUnless { it.isEmpty() }
}
badgeDrawable.isVisible = true
badgeDrawable.align(this)
badgeDrawable
} else {
badge?.isVisible = false
badge
}
private fun initBadge(anchor: View): BadgeDrawable {
val badge = BadgeDrawable.create(anchor.context)
val resources = anchor.resources

View File

@@ -2,6 +2,7 @@ package org.koitharu.kotatsu.list.ui.adapter
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import com.google.android.material.badge.BadgeDrawable
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import org.koitharu.kotatsu.databinding.ItemHeaderButtonBinding
import org.koitharu.kotatsu.list.ui.model.ListHeader
@@ -12,6 +13,8 @@ fun listHeaderAD(
) = adapterDelegateViewBinding<ListHeader, ListModel, ItemHeaderButtonBinding>(
{ inflater, parent -> ItemHeaderButtonBinding.inflate(inflater, parent, false) },
) {
var badge: BadgeDrawable? = null
if (listener != null) {
binding.buttonMore.setOnClickListener {
listener.onListHeaderClick(item, it)
@@ -23,9 +26,11 @@ fun listHeaderAD(
if (item.buttonTextRes == 0) {
binding.buttonMore.isInvisible = true
binding.buttonMore.text = null
binding.buttonMore.clearBadge(badge)
} else {
binding.buttonMore.setText(item.buttonTextRes)
binding.buttonMore.isVisible = true
badge = itemView.bindBadge(badge, item.badge)
}
}
}

View File

@@ -6,38 +6,41 @@ import org.koitharu.kotatsu.core.ui.model.DateTimeAgo
@Suppress("DataClassPrivateConstructor")
data class ListHeader private constructor(
private val text: CharSequence?,
@StringRes private val textRes: Int,
private val dateTimeAgo: DateTimeAgo?,
private val textRaw: Any,
@StringRes val buttonTextRes: Int,
val payload: Any?,
val badge: String?,
) : ListModel {
constructor(
text: CharSequence,
@StringRes buttonTextRes: Int = 0,
payload: Any? = null,
) : this(text, 0, null, buttonTextRes, payload)
badge: String? = null,
) : this(textRaw = text, buttonTextRes, payload, badge)
constructor(
@StringRes textRes: Int,
@StringRes buttonTextRes: Int = 0,
payload: Any? = null,
) : this(null, textRes, null, buttonTextRes, payload)
badge: String? = null,
) : this(textRaw = textRes, buttonTextRes, payload, badge)
constructor(
dateTimeAgo: DateTimeAgo,
@StringRes buttonTextRes: Int = 0,
payload: Any? = null,
) : this(null, 0, dateTimeAgo, buttonTextRes, payload)
badge: String? = null,
) : this(textRaw = dateTimeAgo, buttonTextRes, payload, badge)
fun getText(context: Context): CharSequence? = when {
text != null -> text
textRes != 0 -> context.getString(textRes)
else -> dateTimeAgo?.format(context.resources)
fun getText(context: Context): CharSequence? = when (textRaw) {
is CharSequence -> textRaw
is Int -> if (textRaw != 0) context.getString(textRaw) else null
is DateTimeAgo -> textRaw.format(context.resources)
else -> null
}
override fun areItemsTheSame(other: ListModel): Boolean {
return other is ListHeader && text == other.text && dateTimeAgo == other.dateTimeAgo && textRes == other.textRes
return other is ListHeader && textRaw == other.textRaw
}
}

View File

@@ -13,8 +13,6 @@ import androidx.appcompat.view.ActionMode
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.graphics.Insets
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.inputmethod.EditorInfoCompat
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
@@ -47,7 +45,6 @@ import org.koitharu.kotatsu.core.util.ext.hideKeyboard
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.observeEvent
import org.koitharu.kotatsu.core.util.ext.scaleUpActivityOptionsOf
import org.koitharu.kotatsu.core.util.ext.setNavigationBarTransparentCompat
import org.koitharu.kotatsu.databinding.ActivityMainBinding
import org.koitharu.kotatsu.details.service.MangaPrefetchService
import org.koitharu.kotatsu.details.ui.DetailsActivity
@@ -98,17 +95,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), AppBarOwner, BottomNav
super.onCreate(savedInstanceState)
setContentView(ActivityMainBinding.inflate(layoutInflater))
if (bottomNav != null) {
ViewCompat.setOnApplyWindowInsetsListener(viewBinding.root) { _, insets ->
if (insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom > 0) {
val elevation = bottomNav?.elevation ?: 0f
window.setNavigationBarTransparentCompat(this@MainActivity, elevation)
}
insets
}
ViewCompat.requestApplyInsets(viewBinding.root)
}
with(viewBinding.searchView) {
onFocusChangeListener = this@MainActivity
searchSuggestionListener = this@MainActivity
@@ -139,7 +125,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), AppBarOwner, BottomNav
viewModel.onError.observeEvent(this, SnackbarErrorObserver(viewBinding.container, null))
viewModel.isLoading.observe(this, this::onLoadingStateChanged)
viewModel.isResumeEnabled.observe(this, this::onResumeEnabledChanged)
viewModel.counters.observe(this, ::onCountersChanged)
viewModel.feedCounter.observe(this, ::onFeedCounterChanged)
viewModel.appUpdate.observe(this, MenuInvalidator(this))
viewModel.onFirstStart.observeEvent(this) {
WelcomeSheet.show(supportFragmentManager)
@@ -292,10 +278,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), AppBarOwner, BottomNav
startActivity(IntentBuilder(this).manga(manga).build(), options)
}
private fun onCountersChanged(counters: Map<NavItem, Int>) {
counters.forEach { (navItem, counter) ->
navigationDelegate.setCounter(navItem, counter)
}
private fun onFeedCounterChanged(counter: Int) {
navigationDelegate.setCounter(NavItem.FEED, counter)
}
private fun onIncognitoModeChanged(isIncognito: Boolean) {

View File

@@ -4,15 +4,11 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus
import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException
import org.koitharu.kotatsu.core.github.AppUpdateRepository
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.prefs.NavItem
import org.koitharu.kotatsu.core.prefs.observeAsStateFlow
import org.koitharu.kotatsu.core.ui.BaseViewModel
import org.koitharu.kotatsu.core.util.ext.MutableEventFlow
@@ -22,7 +18,6 @@ import org.koitharu.kotatsu.history.data.HistoryRepository
import org.koitharu.kotatsu.main.domain.ReadingResumeEnabledUseCase
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
import java.util.EnumMap
import javax.inject.Inject
@HiltViewModel
@@ -52,19 +47,8 @@ class MainViewModel @Inject constructor(
val appUpdate = appUpdateRepository.observeAvailableUpdate()
val counters = combine(
trackingRepository.observeUpdatedMangaCount(),
observeNewSourcesCount(),
) { tracks, newSources ->
val em = EnumMap<NavItem, Int>(NavItem::class.java)
em[NavItem.EXPLORE] = newSources
em[NavItem.FEED] = tracks
em
}.stateIn(
scope = viewModelScope + Dispatchers.Default,
started = SharingStarted.WhileSubscribed(5000),
initialValue = emptyMap<NavItem, Int>(),
)
val feedCounter = trackingRepository.observeUpdatedMangaCount()
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, 0)
init {
launchJob {
@@ -87,8 +71,4 @@ class MainViewModel @Inject constructor(
fun setIncognitoMode(isEnabled: Boolean) {
settings.isIncognitoModeEnabled = isEnabled
}
private fun observeNewSourcesCount() = sourcesRepository.observeNewSources()
.map { if (sourcesRepository.isSetupRequired()) 0 else it.size }
.distinctUntilChanged()
}

View File

@@ -119,9 +119,9 @@ class ColorFilterConfigActivity :
.setMessage(R.string.color_correction_apply_text)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.this_manga) { _, _ ->
viewModel.saveGlobally()
}.setNeutralButton(R.string.globally) { _, _ ->
viewModel.save()
}.setNeutralButton(R.string.globally) { _, _ ->
viewModel.saveGlobally()
}.show()
}

View File

@@ -1,11 +1,11 @@
package org.koitharu.kotatsu.search.ui.suggestion.adapter
import androidx.core.text.buildSpannedString
import androidx.lifecycle.LifecycleOwner
import coil.ImageLoader
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.getSummary
import org.koitharu.kotatsu.core.model.getTitle
import org.koitharu.kotatsu.core.parser.favicon.faviconUri
import org.koitharu.kotatsu.core.ui.image.FaviconDrawable
import org.koitharu.kotatsu.core.util.ext.enqueueWith
@@ -14,7 +14,6 @@ import org.koitharu.kotatsu.core.util.ext.source
import org.koitharu.kotatsu.databinding.ItemSearchSuggestionSourceBinding
import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionListener
import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem
import org.koitharu.kotatsu.settings.sources.adapter.appendNsfwLabel
fun searchSuggestionSourceAD(
coil: ImageLoader,
@@ -32,15 +31,7 @@ fun searchSuggestionSourceAD(
}
bind {
binding.textViewTitle.text = if (item.isNsfw) {
buildSpannedString {
append(item.source.title)
append(' ')
appendNsfwLabel(context)
}
} else {
item.source.title
}
binding.textViewTitle.text = item.source.getTitle(context)
binding.textViewSubtitle.text = item.source.getSummary(context)
binding.switchLocal.isChecked = item.isEnabled
val fallbackIcon = FaviconDrawable(context, R.style.FaviconDrawable_Small, item.source.name)

View File

@@ -1,16 +1,8 @@
package org.koitharu.kotatsu.settings.sources.adapter
import android.content.Context
import android.graphics.Color
import android.text.SpannableStringBuilder
import android.text.style.ForegroundColorSpan
import android.text.style.RelativeSizeSpan
import android.text.style.SuperscriptSpan
import android.view.View
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.text.buildSpannedString
import androidx.core.text.inSpans
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.lifecycle.LifecycleOwner
@@ -19,12 +11,12 @@ import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.getSummary
import org.koitharu.kotatsu.core.model.getTitle
import org.koitharu.kotatsu.core.parser.favicon.faviconUri
import org.koitharu.kotatsu.core.ui.image.FaviconDrawable
import org.koitharu.kotatsu.core.ui.list.OnTipCloseListener
import org.koitharu.kotatsu.core.util.ext.crossfade
import org.koitharu.kotatsu.core.util.ext.enqueueWith
import org.koitharu.kotatsu.core.util.ext.getThemeColor
import org.koitharu.kotatsu.core.util.ext.newImageRequest
import org.koitharu.kotatsu.core.util.ext.source
import org.koitharu.kotatsu.databinding.ItemSourceConfigBinding
@@ -51,15 +43,7 @@ fun sourceConfigItemCheckableDelegate(
}
bind {
binding.textViewTitle.text = if (item.isNsfw) {
buildSpannedString {
append(item.source.title)
append(' ')
appendNsfwLabel(context)
}
} else {
item.source.title
}
binding.textViewTitle.text = item.source.getTitle(context)
binding.switchToggle.isChecked = item.isEnabled
binding.switchToggle.isEnabled = item.isAvailable
binding.textViewDescription.text = item.source.getSummary(context)
@@ -101,15 +85,7 @@ fun sourceConfigItemDelegate2(
binding.imageViewMenu.setOnClickListener(eventListener)
bind {
binding.textViewTitle.text = if (item.isNsfw) {
buildSpannedString {
append(item.source.title)
append(' ')
appendNsfwLabel(context)
}
} else {
item.source.title
}
binding.textViewTitle.text = item.source.getTitle(context)
binding.imageViewAdd.isGone = item.isEnabled || !item.isAvailable
binding.imageViewRemove.isVisible = item.isEnabled
binding.imageViewMenu.isVisible = item.isEnabled
@@ -147,19 +123,6 @@ fun sourceConfigEmptySearchDelegate() =
R.layout.item_sources_empty,
) { }
fun SpannableStringBuilder.appendNsfwLabel(context: Context) = inSpans(
ForegroundColorSpan(
context.getThemeColor(
com.google.android.material.R.attr.colorError,
Color.RED,
),
),
RelativeSizeSpan(0.74f),
SuperscriptSpan(),
) {
append(context.getString(R.string.nsfw))
}
private fun showSourceMenu(
anchor: View,
item: SourceConfigItem.SourceItem,

View File

@@ -1,24 +1,27 @@
package org.koitharu.kotatsu.settings.sources.catalog
import androidx.core.text.buildSpannedString
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.lifecycle.LifecycleOwner
import coil.ImageLoader
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.browser.cloudflare.CaptchaNotifier.Companion.ignoreCaptchaErrors
import org.koitharu.kotatsu.core.model.getSummary
import org.koitharu.kotatsu.core.model.isNsfw
import org.koitharu.kotatsu.core.model.getTitle
import org.koitharu.kotatsu.core.parser.favicon.faviconUri
import org.koitharu.kotatsu.core.ui.image.FaviconDrawable
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.core.ui.util.WindowInsetsDelegate
import org.koitharu.kotatsu.core.util.ext.crossfade
import org.koitharu.kotatsu.core.util.ext.enqueueWith
import org.koitharu.kotatsu.core.util.ext.newImageRequest
import org.koitharu.kotatsu.core.util.ext.setTextAndVisible
import org.koitharu.kotatsu.core.util.ext.source
import org.koitharu.kotatsu.databinding.ItemCatalogPageBinding
import org.koitharu.kotatsu.databinding.ItemEmptyHintBinding
import org.koitharu.kotatsu.databinding.ItemSourceCatalogBinding
import org.koitharu.kotatsu.settings.sources.adapter.appendNsfwLabel
fun sourceCatalogItemSourceAD(
coil: ImageLoader,
@@ -35,15 +38,7 @@ fun sourceCatalogItemSourceAD(
}
bind {
binding.textViewTitle.text = if (item.source.isNsfw()) {
buildSpannedString {
append(item.source.title)
append(' ')
appendNsfwLabel(context)
}
} else {
item.source.title
}
binding.textViewTitle.text = item.source.getTitle(context)
if (item.showSummary) {
binding.textViewDescription.text = item.source.getSummary(context)
binding.textViewDescription.isVisible = true
@@ -57,6 +52,7 @@ fun sourceCatalogItemSourceAD(
placeholder(fallbackIcon)
fallback(fallbackIcon)
source(item.source)
ignoreCaptchaErrors()
enqueueWith(coil)
}
}
@@ -77,3 +73,30 @@ fun sourceCatalogItemHintAD(
binding.textSecondary.setTextAndVisible(item.text)
}
}
fun sourceCatalogPageAD(
listener: OnListItemClickListener<SourceCatalogItem.Source>,
coil: ImageLoader,
lifecycleOwner: LifecycleOwner,
) = adapterDelegateViewBinding<SourceCatalogPage, SourceCatalogPage, ItemCatalogPageBinding>(
{ inflater, parent -> ItemCatalogPageBinding.inflate(inflater, parent, false) },
) {
val sourcesAdapter = SourcesCatalogAdapter(listener, coil, lifecycleOwner)
with(binding.recyclerView) {
setHasFixedSize(true)
adapter = sourcesAdapter
}
val insetsDelegate = WindowInsetsDelegate()
ViewCompat.setOnApplyWindowInsetsListener(itemView, insetsDelegate)
itemView.addOnLayoutChangeListener(insetsDelegate)
insetsDelegate.addInsetsListener { insets ->
binding.recyclerView.updatePadding(
bottom = insets.bottom + binding.recyclerView.paddingTop,
)
}
bind {
sourcesAdapter.items = item.items
}
}

View File

@@ -0,0 +1,19 @@
package org.koitharu.kotatsu.settings.sources.catalog
import org.koitharu.kotatsu.list.ui.ListModelDiffCallback
import org.koitharu.kotatsu.list.ui.model.ListModel
import org.koitharu.kotatsu.parsers.model.ContentType
data class SourceCatalogPage(
val type: ContentType,
val items: List<SourceCatalogItem>,
) : ListModel {
override fun areItemsTheSame(other: ListModel): Boolean {
return other is SourceCatalogPage && other.type == type
}
override fun getChangePayload(previousState: ListModel): Any? {
return ListModelDiffCallback.PAYLOAD_NESTED_LIST_CHANGED
}
}

View File

@@ -10,30 +10,32 @@ import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import coil.ImageLoader
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.tabs.TabLayout
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayoutMediator
import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.core.model.titleResId
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.ui.BaseActivity
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.core.ui.util.ReversibleActionObserver
import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition
import org.koitharu.kotatsu.core.util.ext.getLocaleDisplayName
import org.koitharu.kotatsu.core.util.ext.getDisplayName
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.observeEvent
import org.koitharu.kotatsu.core.util.ext.toLocale
import org.koitharu.kotatsu.databinding.ActivitySourcesCatalogBinding
import org.koitharu.kotatsu.main.ui.owners.AppBarOwner
import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.settings.newsources.NewSourcesDialogFragment
import javax.inject.Inject
@AndroidEntryPoint
class SourcesCatalogActivity : BaseActivity<ActivitySourcesCatalogBinding>(),
TabLayout.OnTabSelectedListener,
OnListItemClickListener<SourceCatalogItem.Source>,
AppBarOwner, MenuItem.OnActionExpandListener {
@Inject
lateinit var coil: ImageLoader
private var newSourcesSnackbar: Snackbar? = null
override val appBar: AppBarLayout
get() = viewBinding.appbar
@@ -43,19 +45,18 @@ class SourcesCatalogActivity : BaseActivity<ActivitySourcesCatalogBinding>(),
super.onCreate(savedInstanceState)
setContentView(ActivitySourcesCatalogBinding.inflate(layoutInflater))
supportActionBar?.setDisplayHomeAsUpEnabled(true)
initTabs()
val sourcesAdapter = SourcesCatalogAdapter(this, coil, this)
with(viewBinding.recyclerView) {
setHasFixedSize(true)
adapter = sourcesAdapter
}
viewModel.content.observe(this, sourcesAdapter)
val pagerAdapter = SourcesCatalogPagerAdapter(this, coil, this)
viewBinding.pager.adapter = pagerAdapter
val tabMediator = TabLayoutMediator(viewBinding.tabs, viewBinding.pager, pagerAdapter)
tabMediator.attach()
viewModel.content.observe(this, pagerAdapter)
viewModel.hasNewSources.observe(this, ::onHasNewSourcesChanged)
viewModel.onActionDone.observeEvent(
this,
ReversibleActionObserver(viewBinding.recyclerView),
ReversibleActionObserver(viewBinding.pager),
)
viewModel.locale.observe(this) {
supportActionBar?.subtitle = it.getLocaleDisplayName(this)
supportActionBar?.subtitle = it?.toLocale().getDisplayName(this)
}
addMenuProvider(SourcesCatalogMenuProvider(this, viewModel, this))
}
@@ -65,27 +66,15 @@ class SourcesCatalogActivity : BaseActivity<ActivitySourcesCatalogBinding>(),
left = insets.left,
right = insets.right,
)
viewBinding.recyclerView.updatePadding(
bottom = insets.bottom + viewBinding.recyclerView.paddingTop,
)
}
override fun onItemClick(item: SourceCatalogItem.Source, view: View) {
viewModel.addSource(item.source)
}
override fun onTabSelected(tab: TabLayout.Tab) {
viewModel.setContentType(tab.tag as ContentType)
}
override fun onTabUnselected(tab: TabLayout.Tab) = Unit
override fun onTabReselected(tab: TabLayout.Tab) {
viewBinding.recyclerView.firstVisibleItemPosition = 0
}
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
viewBinding.tabs.isVisible = false
viewBinding.pager.isUserInputEnabled = false
val sq = (item.actionView as? SearchView)?.query?.trim()?.toString().orEmpty()
viewModel.performSearch(sq)
return true
@@ -93,21 +82,35 @@ class SourcesCatalogActivity : BaseActivity<ActivitySourcesCatalogBinding>(),
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
viewBinding.tabs.isVisible = true
viewBinding.pager.isUserInputEnabled = true
viewModel.performSearch(null)
return true
}
private fun initTabs() {
val tabs = viewBinding.tabs
for (type in ContentType.entries) {
if (viewModel.isNsfwDisabled && type == ContentType.HENTAI) {
continue
private fun onHasNewSourcesChanged(hasNewSources: Boolean) {
if (hasNewSources) {
if (newSourcesSnackbar?.isShownOrQueued == true) {
return
}
val tab = tabs.newTab()
tab.setText(type.titleResId)
tab.tag = type
tabs.addTab(tab)
val snackbar = Snackbar.make(viewBinding.pager, R.string.new_sources_text, Snackbar.LENGTH_INDEFINITE)
snackbar.setAction(R.string.explore) {
NewSourcesDialogFragment.show(supportFragmentManager)
}
snackbar.addCallback(
object : Snackbar.Callback() {
override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
super.onDismissed(transientBottomBar, event)
if (event == DISMISS_EVENT_SWIPE) {
viewModel.skipNewSources()
}
}
},
)
snackbar.show()
newSourcesSnackbar = snackbar
} else {
newSourcesSnackbar?.dismiss()
newSourcesSnackbar = null
}
tabs.addOnTabSelectedListener(this)
}
}

View File

@@ -9,7 +9,9 @@ import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuProvider
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.util.ext.getLocaleDisplayName
import org.koitharu.kotatsu.core.util.LocaleComparator
import org.koitharu.kotatsu.core.util.ext.getDisplayName
import org.koitharu.kotatsu.core.util.ext.toLocale
import org.koitharu.kotatsu.main.ui.owners.AppBarOwner
class SourcesCatalogMenuProvider(
@@ -57,15 +59,17 @@ class SourcesCatalogMenuProvider(
}
private fun showLocalesMenu() {
val locales = viewModel.locales.map {
it to it.getLocaleDisplayName(activity)
val locales = viewModel.locales.mapTo(ArrayList(viewModel.locales.size)) {
it to it?.toLocale()
}
locales.sortWith(compareBy(nullsFirst(LocaleComparator())) { it.second })
val anchor: View = (activity as AppBarOwner).appBar.let {
it.findViewById<View?>(R.id.toolbar) ?: it
}
val menu = PopupMenu(activity, anchor)
for ((i, lc) in locales.withIndex()) {
menu.menu.add(Menu.NONE, Menu.NONE, i, lc.second)
menu.menu.add(Menu.NONE, Menu.NONE, i, lc.second.getDisplayName(activity))
}
menu.setOnMenuItemClickListener {
viewModel.setLocale(locales.getOrNull(it.order)?.first)

View File

@@ -0,0 +1,25 @@
package org.koitharu.kotatsu.settings.sources.catalog
import androidx.lifecycle.LifecycleOwner
import coil.ImageLoader
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import org.koitharu.kotatsu.core.model.titleResId
import org.koitharu.kotatsu.core.ui.BaseListAdapter
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
class SourcesCatalogPagerAdapter(
listener: OnListItemClickListener<SourceCatalogItem.Source>,
coil: ImageLoader,
lifecycleOwner: LifecycleOwner,
) : BaseListAdapter<SourceCatalogPage>(), TabLayoutMediator.TabConfigurationStrategy {
init {
delegatesManager.addDelegate(sourceCatalogPageAD(listener, coil, lifecycleOwner))
}
override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
val item = items.getOrNull(position) ?: return
tab.setText(item.type.titleResId)
}
}

View File

@@ -1,5 +1,6 @@
package org.koitharu.kotatsu.settings.sources.catalog
import androidx.annotation.MainThread
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.internal.lifecycle.RetainedLifecycleImpl
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -8,9 +9,10 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.plus
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.ui.BaseViewModel
@@ -21,6 +23,8 @@ import org.koitharu.kotatsu.explore.data.MangaSourcesRepository
import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.util.mapToSet
import java.util.EnumMap
import java.util.EnumSet
import java.util.Locale
import javax.inject.Inject
@@ -28,30 +32,27 @@ import javax.inject.Inject
class SourcesCatalogViewModel @Inject constructor(
private val repository: MangaSourcesRepository,
private val listProducerFactory: SourcesCatalogListProducer.Factory,
settings: AppSettings,
private val settings: AppSettings,
) : BaseViewModel() {
private val lifecycle = RetainedLifecycleImpl()
private var searchQuery: String? = null
val onActionDone = MutableEventFlow<ReversibleAction>()
val contentType = MutableStateFlow(ContentType.entries.first())
val locales = repository.allMangaSources.mapToSet { it.locale }
val locale = MutableStateFlow(Locale.getDefault().language.takeIf { it in locales })
val isNsfwDisabled = settings.isNsfwContentDisabled
val hasNewSources = repository.observeNewSources()
.map { it.isNotEmpty() }
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, false)
private val listProducer: StateFlow<SourcesCatalogListProducer?> = combine(
locale,
contentType,
) { lc, type ->
listProducerFactory.create(lc, type, lifecycle).also {
it.setQuery(searchQuery)
}
}.stateIn(viewModelScope, SharingStarted.Eagerly, null)
private val listProducers = locale.map { lc ->
createListProducers(lc)
}.stateIn(viewModelScope, SharingStarted.Eagerly, createListProducers(locale.value))
val content = listProducer.flatMapLatest {
it?.list ?: emptyFlow()
}.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())
val content: StateFlow<List<SourceCatalogPage>> = listProducers.flatMapLatest {
val flows = it.entries.map { (type, producer) -> producer.list.map { x -> SourceCatalogPage(type, x) } }
combine<SourceCatalogPage, List<SourceCatalogPage>>(flows, Array<SourceCatalogPage>::toList)
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, emptyList())
override fun onCleared() {
super.onCleared()
@@ -60,21 +61,36 @@ class SourcesCatalogViewModel @Inject constructor(
fun performSearch(query: String?) {
searchQuery = query
listProducer.value?.setQuery(query)
listProducers.value.forEach { (_, v) -> v.setQuery(query) }
}
fun setLocale(value: String?) {
locale.value = value
}
fun setContentType(value: ContentType) {
contentType.value = value
}
fun addSource(source: MangaSource) {
launchJob(Dispatchers.Default) {
val rollback = repository.setSourceEnabled(source, true)
onActionDone.call(ReversibleAction(R.string.source_enabled, rollback))
}
}
fun skipNewSources() {
launchJob {
repository.assimilateNewSources()
}
}
@MainThread
private fun createListProducers(lc: String?): Map<ContentType, SourcesCatalogListProducer> {
val types = EnumSet.allOf(ContentType::class.java)
if (settings.isNsfwContentDisabled) {
types.remove(ContentType.HENTAI)
}
return types.associateWithTo(EnumMap(ContentType::class.java)) { type ->
listProducerFactory.create(lc, type, lifecycle).also {
it.setQuery(searchQuery)
}
}
}
}

View File

@@ -31,6 +31,7 @@ import javax.inject.Inject
import javax.inject.Provider
private const val NO_ID = 0L
private const val MAX_QUERY_IDS = 100
@Reusable
class TrackingRepository @Inject constructor(
@@ -65,7 +66,14 @@ class TrackingRepository @Inject constructor(
suspend fun getTracks(mangaList: Collection<Manga>): List<MangaTracking> {
val ids = mangaList.mapToSet { it.id }
val tracks = db.getTracksDao().findAll(ids).groupBy { it.mangaId }
val dao = db.getTracksDao()
val tracks = if (ids.size <= MAX_QUERY_IDS) {
dao.findAll(ids)
} else {
// TODO split tracks in the worker
ids.windowed(MAX_QUERY_IDS, MAX_QUERY_IDS, true)
.flatMap { dao.findAll(it) }
}.groupBy { it.mangaId }
val idSet = HashSet<Long>()
val result = ArrayList<MangaTracking>(mangaList.size)
for (item in mangaList) {

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/m3ColorBottomMenuBackground" />
</selector>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/kotatsu_onSecondaryContainer" android:state_checked="true" />
<item android:color="@color/kotatsu_secondaryContainer" android:state_checked="true" />
<item android:color="@color/kotatsu_onSurfaceVariant" android:state_checked="false" />
</selector>

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/kotatsu_m3_bottom_menu" />
</selector>

View File

@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable">
<vector
android:name="splash"
android:width="320dp"
android:height="320dp"
android:viewportWidth="320"
android:viewportHeight="320">
<group
android:name="scaleme"
android:pivotX="160"
android:pivotY="160"
android:scaleX="1"
android:scaleY="1">
<group android:name="bg">
<path
android:name="circle"
android:pathData="M 160 110 C 146.744 110 134.018 115.271 124.645 124.645 C 115.271 134.018 110 146.744 110 160 C 110 173.256 115.271 185.982 124.645 195.355 C 134.018 204.729 146.744 210 160 210 C 173.256 210 185.982 204.729 195.355 195.355 C 204.729 185.982 210 173.256 210 160 C 210 146.744 204.729 134.018 195.355 124.645 C 185.982 115.271 173.256 110 160 110 Z"
android:fillColor="@color/m3_sys_color_dynamic_dark_primary_container"
android:fillAlpha="0"
android:strokeWidth="1" />
</group>
<group
android:name="fg"
android:pivotX="160"
android:pivotY="160"
android:scaleX="0"
android:scaleY="0">
<clip-path
android:name="mask"
android:pathData="M 160 60 C 133.489 60 108.036 70.543 89.289 89.289 C 70.543 108.036 60 133.489 60 160 C 60 186.511 70.543 211.964 89.289 230.711 C 108.036 249.457 133.489 260 160 260 C 186.511 260 211.964 249.457 230.711 230.711 C 249.457 211.964 260 186.511 260 160 C 260 133.489 249.457 108.036 230.711 89.289 C 211.964 70.543 186.511 60 160 60 Z" />
<group
android:name="totoro_group"
android:scaleX="0.73903004444"
android:scaleY="0.73903004444">
<clip-path android:pathData="M0.81,0.07h432v432h-432z" />
<path
android:name="totoro"
android:pathData="M242.26,418.58c-44.77,0 -89.54,0 -134.31,0c-6.96,0 -7.12,-0.56 -6.31,-7.57c6.75,-58.64 31.14,-110.6 61.45,-160.07c6.71,-10.95 9.45,-22.06 11.05,-34.22c1.43,-10.89 5.32,-20.99 13.4,-28.93c5.67,-5.58 9.49,-5.72 14.67,0.29c6.42,7.45 12.41,15.28 18.2,23.23c2.01,2.76 3.88,4.35 7.39,4.3c9.86,-0.15 19.72,-0.13 29.58,-0.01c3.26,0.04 5.21,-1.26 7.14,-3.9c6.02,-8.18 12.19,-16.28 18.74,-24.04c4.56,-5.41 8.36,-5.29 13.65,-0.51c8.35,7.53 11.83,17.58 13.9,28.16c1.14,5.82 1.07,11.88 2.18,17.71c0.61,3.18 2.21,6.32 3.97,9.1c19.34,30.51 35.86,62.44 48.61,96.27c8.91,23.64 15.25,47.93 18.01,73.09c0.72,6.6 0.28,7.1 -6.53,7.1C332.12,418.59 287.19,418.58 242.26,418.58zM172.46,404.96c0.23,-0.04 1.58,0.09 2.4,-0.51c8.32,-6.01 16.3,-5.48 24.88,-0.06c3.28,2.07 7.64,0.92 10.26,-2.87c2.4,-3.47 2.93,-7.99 -0.37,-10.11c-6.96,-4.48 -14.69,-7.79 -22.16,-11.45c-0.71,-0.35 -1.97,0.02 -2.8,0.42c-6.1,2.95 -12.31,5.72 -18.16,9.11c-3.47,2.01 -4.86,5.62 -3.44,9.68C164.45,403.11 167.3,405.15 172.46,404.96zM218.13,370.48c-0.72,7.32 5.26,12.42 10.7,10.65c3.5,-1.14 6.64,-3.36 10.15,-4.45c2.19,-0.68 4.93,-0.73 7.1,-0.05c3.5,1.09 6.63,3.81 10.14,4.31c2.71,0.39 6.58,-0.8 8.42,-2.72c1.69,-1.77 2.38,-5.74 1.7,-8.26c-1.66,-6.13 -21.82,-15 -27.76,-12.78c-0.3,0.11 -0.6,0.25 -0.88,0.39c-4.76,2.37 -9.72,4.42 -14.2,7.23C220.99,366.38 219.28,369.23 218.13,370.48zM312.12,405.04c5.83,-0.02 8.75,-2.02 9.96,-6c1.29,-4.24 -0.29,-7.83 -4,-9.92c-5.46,-3.07 -11.09,-5.89 -16.87,-8.3c-1.97,-0.82 -4.88,-0.73 -6.87,0.1c-5.49,2.28 -10.81,5.01 -16.03,7.87c-4.63,2.54 -6.06,7.19 -3.97,11.49c2.04,4.18 6.73,5.95 11.55,4.09c2.69,-1.04 5.36,-2.29 7.8,-3.82c3.12,-1.96 5.81,-1.75 8.95,0.07C306.06,402.61 309.82,403.99 312.12,405.04zM186.6,262.09c0.05,8.66 5.72,15.1 14.55,16.52c7.21,1.16 15.06,-3.96 17.57,-11.47c2.13,-6.36 0.68,-9.3 -5.95,-10.15c-3.72,-0.47 -4.65,-1.86 -5.04,-5.35c-0.62,-5.66 -3.07,-7 -8.67,-5.72C191.46,247.66 186.55,254.03 186.6,262.09zM282.02,278.75c7.26,0.03 14.41,-5.46 16.13,-12.38c1.46,-5.89 0.26,-8.38 -5.73,-9.23c-4.07,-0.58 -5.45,-2.48 -5.77,-6.12c-0.33,-3.76 -2.15,-6.05 -6.28,-5.61c-8.6,0.91 -15.51,8.95 -14.97,17.39C265.96,271.4 273.59,278.72 282.02,278.75zM259.29,278.52c-0.09,-5.33 -3.97,-9.16 -8.9,-9.28c-5.17,-0.13 -10.35,0 -15.52,-0.04c-3.82,-0.03 -6.54,1.76 -8.08,5.12c-1.56,3.4 -0.95,6.7 1.57,9.44c2.62,2.85 5.33,5.66 8.23,8.22c3.42,3.02 7.46,3.55 11.05,0.59c3.59,-2.97 6.8,-6.44 9.9,-9.93C258.63,281.4 258.91,279.45 259.29,278.52z"
android:fillType="evenOdd"
android:fillColor="@color/m3_sys_color_dynamic_dark_primary"
android:fillAlpha="0"
android:strokeWidth="1"
tools:targetApi="s" />
</group>
</group>
</group>
</vector>
</aapt:attr>
<target android:name="circle">
<aapt:attr name="android:animation">
<set>
<objectAnimator
android:propertyName="pathData"
android:startOffset="200"
android:duration="300"
android:valueFrom="M 160 110 C 146.744 110 134.018 115.271 124.645 124.645 C 115.271 134.018 110 146.744 110 160 C 110 173.256 115.271 185.982 124.645 195.355 C 134.018 204.729 146.744 210 160 210 C 173.256 210 185.982 204.729 195.355 195.355 C 204.729 185.982 210 173.256 210 160 C 210 146.744 204.729 134.018 195.355 124.645 C 185.982 115.271 173.256 110 160 110 Z"
android:valueTo="M 160 60 C 133.489 60 108.036 70.543 89.289 89.289 C 70.543 108.036 60 133.489 60 160 C 60 186.511 70.543 211.964 89.289 230.711 C 108.036 249.457 133.489 260 160 260 C 186.511 260 211.964 249.457 230.711 230.711 C 249.457 211.964 260 186.511 260 160 C 260 133.489 249.457 108.036 230.711 89.289 C 211.964 70.543 186.511 60 160 60 Z"
android:valueType="pathType"
android:interpolator="@android:anim/overshoot_interpolator" />
<objectAnimator
android:propertyName="fillAlpha"
android:startOffset="200"
android:duration="100"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
</aapt:attr>
</target>
<target android:name="totoro_group">
<aapt:attr name="android:animation">
<set>
<objectAnimator
android:startOffset="200"
android:duration="300"
android:propertyName="translateY"
android:valueFrom="160"
android:valueTo="0"
android:interpolator="@android:interpolator/fast_out_slow_in" />
<objectAnimator
android:startOffset="200"
android:duration="300"
android:propertyName="scaleY"
android:valueFrom="0.5"
android:valueTo="0.73903004444"
android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
</aapt:attr>
</target>
<target android:name="totoro">
<aapt:attr name="android:animation">
<set>
<objectAnimator
android:propertyName="fillAlpha"
android:startOffset="200"
android:duration="100"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
</aapt:attr>
</target>
<target android:name="fg">
<aapt:attr name="android:animation">
<set>
<objectAnimator
android:propertyName="scaleX"
android:startOffset="200"
android:duration="300"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:anim/overshoot_interpolator" />
<objectAnimator
android:propertyName="scaleY"
android:startOffset="200"
android:duration="300"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:anim/overshoot_interpolator" />
</set>
</aapt:attr>
</target>
</animated-vector>

View File

@@ -1,64 +1,131 @@
<animated-vector
<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable">
<vector
android:name="vector"
android:width="288dp"
android:height="288dp"
android:viewportWidth="288"
android:viewportHeight="288">
<path
android:name="path"
android:fillColor="@color/splash_primary"
android:pathData="M 144 121.499 C 121.258 121.499 102.75 141.685 102.75 166.499 C 102.75 191.314 121.258 211.499 144 211.499 C 166.741 211.499 185.25 191.314 185.25 166.499 C 185.25 141.685 166.742 121.499 144 121.499 Z M 128.604 156.927 C 127.945 158.238 126.619 159 125.25 159 C 124.686 159 124.114 158.875 123.572 158.604 L 117.749 155.689 L 111.926 158.604 C 110.066 159.534 107.825 158.772 106.894 156.927 C 105.972 155.074 106.719 152.825 108.572 151.895 L 116.072 148.145 C 117.126 147.617 118.372 147.617 119.426 148.145 L 126.926 151.895 C 128.78 152.825 129.527 155.074 128.604 156.927 Z M 154.854 145.677 C 154.195 146.988 152.869 147.75 151.5 147.75 C 150.936 147.75 150.364 147.625 149.822 147.354 L 144 144.439 L 138.177 147.354 C 136.316 148.284 134.075 147.522 133.145 145.677 C 132.222 143.824 132.969 141.575 134.822 140.645 L 142.322 136.895 C 143.377 136.367 144.622 136.367 145.677 136.895 L 153.177 140.645 C 155.03 141.575 155.777 143.824 154.854 145.677 Z M 179.427 151.895 C 181.28 152.825 182.027 155.074 181.104 156.927 C 180.445 158.238 179.119 159 177.75 159 C 177.186 159 176.615 158.875 176.072 158.604 L 170.25 155.689 L 164.427 158.604 C 162.574 159.534 160.325 158.772 159.395 156.927 C 158.472 155.074 159.219 152.825 161.072 151.895 L 168.572 148.145 C 169.627 147.617 170.872 147.617 171.927 148.145 Z"
android:strokeWidth="1" />
<path
android:name="path_1"
android:fillAlpha="0"
android:fillColor="@color/splash_primary"
android:pathData="M 192.709 104.964 C 191.142 101.857 189.595 98.926 188.115 96.247 L 184.395 89.731 C 181.336 84.548 178.879 80.775 177.742 79.082 C 177.42 59.584 169.136 54.875 168.177 54.391 C 166.734 53.681 164.984 53.952 163.848 55.094 C 158.333 60.61 154.744 66.103 153.045 68.996 L 134.954 68.996 C 133.255 66.103 129.666 60.61 124.151 55.094 C 123.016 53.952 121.272 53.681 119.822 54.391 C 118.863 54.875 110.579 59.584 110.257 79.082 C 109.12 80.775 106.663 84.547 103.605 89.731 L 99.882 96.252 C 98.401 98.933 96.853 101.864 95.285 104.974 L 91.935 111.87 C 83.959 128.994 76.5 150.313 76.5 170.248 C 76.5 201.442 102.72 228.037 103.841 229.151 C 104.251 229.561 104.757 229.876 105.306 230.059 C 105.79 230.22 117.362 233.999 136.5 233.999 C 137.496 233.999 138.448 233.604 139.151 232.901 L 141.803 230.249 L 146.197 230.249 L 148.849 232.901 C 149.552 233.604 150.504 233.999 151.5 233.999 C 170.639 233.999 182.211 230.22 182.694 230.059 C 183.244 229.876 183.749 229.561 184.159 229.151 C 185.279 228.037 211.5 201.443 211.5 170.248 C 211.5 150.313 204.041 128.994 196.064 111.87 Z M 162.75 83.999 C 164.822 83.999 164.735 87.309 164.735 89.382 C 166.808 89.382 170.25 89.427 170.25 91.5 C 170.25 95.638 166.888 98.999 162.75 98.999 C 158.612 98.999 155.25 95.638 155.25 91.5 C 155.25 87.361 158.612 83.999 162.75 83.999 Z M 136.785 97.564 C 137.364 96.165 138.734 95.25 140.25 95.25 L 147.75 95.25 C 149.266 95.25 150.635 96.165 151.214 97.564 C 151.793 98.963 151.47 100.582 150.401 101.651 L 146.651 105.401 C 145.918 106.133 144.959 106.5 143.999 106.5 C 143.04 106.5 142.08 106.133 141.348 105.401 L 137.597 101.651 C 136.529 100.582 136.207 98.963 136.785 97.564 Z M 125.25 83.999 C 127.323 83.999 127.235 87.309 127.235 89.382 C 129.308 89.382 132.75 89.427 132.75 91.5 C 132.75 95.638 129.388 98.999 125.25 98.999 C 121.112 98.999 117.75 95.637 117.75 91.5 C 117.75 87.361 121.112 83.999 125.25 83.999 Z M 144 218.999 C 117.12 218.999 95.25 195.445 95.25 166.499 C 95.25 137.554 117.12 114 144 114 C 170.88 114 192.75 137.554 192.75 166.499 C 192.75 195.445 170.88 218.999 144 218.999 Z"
android:strokeWidth="1" />
<path
android:name="path_2"
android:fillAlpha="0"
android:fillColor="#ef5350"
android:pathData="M 160.739 158.44 C 158.668 157.198 158.323 154.077 160.084 152.508 C 160.329 152.29 162.49 151.126 164.885 149.923 C 168.283 148.216 169.46 147.734 170.24 147.734 C 171.02 147.734 172.231 148.231 175.782 150.008 C 181.059 152.65 181.457 153.016 181.457 155.234 C 181.457 156.765 181.009 157.577 179.655 158.499 C 178.268 159.443 177.207 159.257 173.531 157.425 L 170.292 155.811 L 166.974 157.429 C 163.198 159.271 162.354 159.408 160.739 158.44 Z M 134.489 147.254 C 132.75 146.194 132.17 143.625 133.288 141.937 C 134.027 140.82 142.612 136.429 144.055 136.429 C 144.759 136.429 146.131 136.998 149.552 138.71 C 153.393 140.632 154.194 141.125 154.638 141.844 C 155.428 143.122 155.516 144.373 154.903 145.613 C 154.216 147.001 153.386 147.558 151.813 147.689 C 150.606 147.789 150.298 147.688 147.211 146.177 L 143.902 144.559 L 140.733 146.146 C 137.176 147.929 135.951 148.146 134.489 147.254 Z M 108.448 158.594 C 107.987 158.349 107.357 157.781 107.048 157.331 C 106.572 156.639 106.5 156.284 106.578 155.015 C 106.709 152.893 107.213 152.446 112.383 149.872 C 115.854 148.143 116.881 147.734 117.748 147.734 C 118.625 147.734 119.651 148.152 123.361 150.023 C 127.26 151.989 127.981 152.44 128.46 153.211 C 130.051 155.77 128.211 159.04 125.18 159.04 C 124.616 159.04 123.247 158.499 121.093 157.425 L 117.853 155.811 L 114.536 157.429 C 110.902 159.201 109.938 159.386 108.448 158.594 Z"
android:strokeWidth="1" />
android:name="splash"
android:width="320dp"
android:height="320dp"
android:viewportWidth="320"
android:viewportHeight="320">
<group
android:name="scaleme"
android:pivotX="160"
android:pivotY="160"
android:scaleX="1"
android:scaleY="1">
<group android:name="bg">
<path
android:name="circle"
android:pathData="M 160 110 C 146.744 110 134.018 115.271 124.645 124.645 C 115.271 134.018 110 146.744 110 160 C 110 173.256 115.271 185.982 124.645 195.355 C 134.018 204.729 146.744 210 160 210 C 173.256 210 185.982 204.729 195.355 195.355 C 204.729 185.982 210 173.256 210 160 C 210 146.744 204.729 134.018 195.355 124.645 C 185.982 115.271 173.256 110 160 110 Z"
android:fillColor="@color/m3_sys_color_dynamic_light_primary_container"
android:fillAlpha="0"
android:strokeWidth="1" />
</group>
<group
android:name="fg"
android:pivotX="160"
android:pivotY="160"
android:scaleX="0"
android:scaleY="0">
<clip-path
android:name="mask"
android:pathData="M 160 60 C 133.489 60 108.036 70.543 89.289 89.289 C 70.543 108.036 60 133.489 60 160 C 60 186.511 70.543 211.964 89.289 230.711 C 108.036 249.457 133.489 260 160 260 C 186.511 260 211.964 249.457 230.711 230.711 C 249.457 211.964 260 186.511 260 160 C 260 133.489 249.457 108.036 230.711 89.289 C 211.964 70.543 186.511 60 160 60 Z" />
<group
android:name="totoro_group"
android:scaleX="0.73903004444"
android:scaleY="0.73903004444">
<clip-path android:pathData="M0.81,0.07h432v432h-432z" />
<path
android:name="totoro"
android:pathData="M242.26,418.58c-44.77,0 -89.54,0 -134.31,0c-6.96,0 -7.12,-0.56 -6.31,-7.57c6.75,-58.64 31.14,-110.6 61.45,-160.07c6.71,-10.95 9.45,-22.06 11.05,-34.22c1.43,-10.89 5.32,-20.99 13.4,-28.93c5.67,-5.58 9.49,-5.72 14.67,0.29c6.42,7.45 12.41,15.28 18.2,23.23c2.01,2.76 3.88,4.35 7.39,4.3c9.86,-0.15 19.72,-0.13 29.58,-0.01c3.26,0.04 5.21,-1.26 7.14,-3.9c6.02,-8.18 12.19,-16.28 18.74,-24.04c4.56,-5.41 8.36,-5.29 13.65,-0.51c8.35,7.53 11.83,17.58 13.9,28.16c1.14,5.82 1.07,11.88 2.18,17.71c0.61,3.18 2.21,6.32 3.97,9.1c19.34,30.51 35.86,62.44 48.61,96.27c8.91,23.64 15.25,47.93 18.01,73.09c0.72,6.6 0.28,7.1 -6.53,7.1C332.12,418.59 287.19,418.58 242.26,418.58zM172.46,404.96c0.23,-0.04 1.58,0.09 2.4,-0.51c8.32,-6.01 16.3,-5.48 24.88,-0.06c3.28,2.07 7.64,0.92 10.26,-2.87c2.4,-3.47 2.93,-7.99 -0.37,-10.11c-6.96,-4.48 -14.69,-7.79 -22.16,-11.45c-0.71,-0.35 -1.97,0.02 -2.8,0.42c-6.1,2.95 -12.31,5.72 -18.16,9.11c-3.47,2.01 -4.86,5.62 -3.44,9.68C164.45,403.11 167.3,405.15 172.46,404.96zM218.13,370.48c-0.72,7.32 5.26,12.42 10.7,10.65c3.5,-1.14 6.64,-3.36 10.15,-4.45c2.19,-0.68 4.93,-0.73 7.1,-0.05c3.5,1.09 6.63,3.81 10.14,4.31c2.71,0.39 6.58,-0.8 8.42,-2.72c1.69,-1.77 2.38,-5.74 1.7,-8.26c-1.66,-6.13 -21.82,-15 -27.76,-12.78c-0.3,0.11 -0.6,0.25 -0.88,0.39c-4.76,2.37 -9.72,4.42 -14.2,7.23C220.99,366.38 219.28,369.23 218.13,370.48zM312.12,405.04c5.83,-0.02 8.75,-2.02 9.96,-6c1.29,-4.24 -0.29,-7.83 -4,-9.92c-5.46,-3.07 -11.09,-5.89 -16.87,-8.3c-1.97,-0.82 -4.88,-0.73 -6.87,0.1c-5.49,2.28 -10.81,5.01 -16.03,7.87c-4.63,2.54 -6.06,7.19 -3.97,11.49c2.04,4.18 6.73,5.95 11.55,4.09c2.69,-1.04 5.36,-2.29 7.8,-3.82c3.12,-1.96 5.81,-1.75 8.95,0.07C306.06,402.61 309.82,403.99 312.12,405.04zM186.6,262.09c0.05,8.66 5.72,15.1 14.55,16.52c7.21,1.16 15.06,-3.96 17.57,-11.47c2.13,-6.36 0.68,-9.3 -5.95,-10.15c-3.72,-0.47 -4.65,-1.86 -5.04,-5.35c-0.62,-5.66 -3.07,-7 -8.67,-5.72C191.46,247.66 186.55,254.03 186.6,262.09zM282.02,278.75c7.26,0.03 14.41,-5.46 16.13,-12.38c1.46,-5.89 0.26,-8.38 -5.73,-9.23c-4.07,-0.58 -5.45,-2.48 -5.77,-6.12c-0.33,-3.76 -2.15,-6.05 -6.28,-5.61c-8.6,0.91 -15.51,8.95 -14.97,17.39C265.96,271.4 273.59,278.72 282.02,278.75zM259.29,278.52c-0.09,-5.33 -3.97,-9.16 -8.9,-9.28c-5.17,-0.13 -10.35,0 -15.52,-0.04c-3.82,-0.03 -6.54,1.76 -8.08,5.12c-1.56,3.4 -0.95,6.7 1.57,9.44c2.62,2.85 5.33,5.66 8.23,8.22c3.42,3.02 7.46,3.55 11.05,0.59c3.59,-2.97 6.8,-6.44 9.9,-9.93C258.63,281.4 258.91,279.45 259.29,278.52z"
android:fillType="evenOdd"
android:fillColor="@color/m3_sys_color_dynamic_light_primary"
android:fillAlpha="0"
android:strokeWidth="1"
tools:targetApi="s" />
</group>
</group>
</group>
</vector>
</aapt:attr>
<target android:name="path_2">
<target android:name="circle">
<aapt:attr name="android:animation">
<objectAnimator
android:duration="300"
android:interpolator="@android:anim/decelerate_interpolator"
android:propertyName="fillAlpha"
android:startOffset="500"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
<set>
<objectAnimator
android:propertyName="pathData"
android:startOffset="200"
android:duration="300"
android:valueFrom="M 160 110 C 146.744 110 134.018 115.271 124.645 124.645 C 115.271 134.018 110 146.744 110 160 C 110 173.256 115.271 185.982 124.645 195.355 C 134.018 204.729 146.744 210 160 210 C 173.256 210 185.982 204.729 195.355 195.355 C 204.729 185.982 210 173.256 210 160 C 210 146.744 204.729 134.018 195.355 124.645 C 185.982 115.271 173.256 110 160 110 Z"
android:valueTo="M 160 60 C 133.489 60 108.036 70.543 89.289 89.289 C 70.543 108.036 60 133.489 60 160 C 60 186.511 70.543 211.964 89.289 230.711 C 108.036 249.457 133.489 260 160 260 C 186.511 260 211.964 249.457 230.711 230.711 C 249.457 211.964 260 186.511 260 160 C 260 133.489 249.457 108.036 230.711 89.289 C 211.964 70.543 186.511 60 160 60 Z"
android:valueType="pathType"
android:interpolator="@android:anim/overshoot_interpolator" />
<objectAnimator
android:propertyName="fillAlpha"
android:startOffset="200"
android:duration="100"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
</aapt:attr>
</target>
<target android:name="path_1">
<target android:name="totoro_group">
<aapt:attr name="android:animation">
<objectAnimator
android:duration="500"
android:interpolator="@android:anim/accelerate_interpolator"
android:propertyName="fillAlpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
<set>
<objectAnimator
android:startOffset="200"
android:duration="300"
android:propertyName="translateY"
android:valueFrom="160"
android:valueTo="0"
android:interpolator="@android:interpolator/fast_out_slow_in" />
<objectAnimator
android:startOffset="200"
android:duration="300"
android:propertyName="scaleY"
android:valueFrom="0.5"
android:valueTo="0.73903004444"
android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
</aapt:attr>
</target>
<target android:name="path">
<target android:name="totoro">
<aapt:attr name="android:animation">
<objectAnimator
android:duration="800"
android:interpolator="@android:anim/overshoot_interpolator"
android:propertyName="pathData"
android:valueFrom="M 144 165.978 C 143.736 165.978 143.522 166.212 143.522 166.499 C 143.522 166.787 143.736 167.021 144 167.021 C 144.263 167.021 144.478 166.787 144.478 166.499 C 144.478 166.212 144.263 165.978 144 165.978 Z M 143.821 166.389 C 143.813 166.404 143.798 166.413 143.783 166.413 C 143.776 166.413 143.769 166.412 143.763 166.408 L 143.696 166.374 L 143.628 166.408 C 143.607 166.418 143.581 166.41 143.57 166.388 C 143.559 166.367 143.568 166.341 143.589 166.33 L 143.676 166.286 C 143.688 166.28 143.703 166.28 143.715 166.286 L 143.802 166.33 C 143.823 166.341 143.832 166.367 143.821 166.388 Z M 144.126 166.258 C 144.118 166.273 144.103 166.282 144.087 166.282 C 144.08 166.282 144.074 166.281 144.067 166.277 L 144 166.244 L 143.932 166.277 C 143.911 166.288 143.885 166.279 143.874 166.258 C 143.863 166.236 143.872 166.21 143.893 166.2 L 143.98 166.156 C 143.992 166.15 144.007 166.15 144.019 166.156 L 144.106 166.2 C 144.128 166.21 144.136 166.236 144.125 166.258 Z M 144.41 166.33 C 144.432 166.341 144.44 166.367 144.43 166.389 C 144.422 166.404 144.407 166.413 144.391 166.413 C 144.384 166.413 144.378 166.412 144.371 166.408 L 144.304 166.374 L 144.236 166.408 C 144.215 166.418 144.189 166.41 144.178 166.388 C 144.167 166.367 144.176 166.341 144.197 166.33 L 144.284 166.286 C 144.297 166.28 144.311 166.28 144.323 166.286 Z"
android:valueTo="M 144 121.499 C 121.258 121.499 102.75 141.685 102.75 166.499 C 102.75 191.314 121.258 211.499 144 211.499 C 166.741 211.499 185.25 191.314 185.25 166.499 C 185.25 141.685 166.742 121.499 144 121.499 Z M 128.604 156.927 C 127.945 158.238 126.619 159 125.25 159 C 124.686 159 124.114 158.875 123.572 158.604 L 117.749 155.689 L 111.926 158.604 C 110.066 159.534 107.825 158.772 106.894 156.927 C 105.972 155.074 106.719 152.825 108.572 151.895 L 116.072 148.145 C 117.126 147.617 118.372 147.617 119.426 148.145 L 126.926 151.895 C 128.78 152.825 129.527 155.074 128.604 156.927 Z M 154.854 145.677 C 154.195 146.988 152.869 147.75 151.5 147.75 C 150.936 147.75 150.364 147.625 149.822 147.354 L 144 144.439 L 138.177 147.354 C 136.316 148.284 134.075 147.522 133.145 145.677 C 132.222 143.824 132.969 141.575 134.822 140.645 L 142.322 136.895 C 143.377 136.367 144.622 136.367 145.677 136.895 L 153.177 140.645 C 155.03 141.575 155.777 143.824 154.854 145.677 Z M 179.427 151.895 C 181.28 152.825 182.027 155.074 181.104 156.927 C 180.445 158.238 179.119 159 177.75 159 C 177.186 159 176.615 158.875 176.072 158.604 L 170.25 155.689 L 164.427 158.604 C 162.574 159.534 160.325 158.772 159.395 156.927 C 158.472 155.074 159.219 152.825 161.072 151.895 L 168.572 148.145 C 169.627 147.617 170.872 147.617 171.927 148.145 Z"
android:valueType="pathType" />
<set>
<objectAnimator
android:propertyName="fillAlpha"
android:startOffset="200"
android:duration="100"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
</aapt:attr>
</target>
<target android:name="fg">
<aapt:attr name="android:animation">
<set>
<objectAnimator
android:propertyName="scaleX"
android:startOffset="200"
android:duration="300"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:anim/overshoot_interpolator" />
<objectAnimator
android:propertyName="scaleY"
android:startOffset="200"
android:duration="300"
android:valueFrom="0.5"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:anim/overshoot_interpolator" />
</set>
</aapt:attr>
</target>
</animated-vector>

View File

@@ -11,7 +11,8 @@
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
android:fitsSystemWindows="true"
app:liftOnScroll="false">
<com.google.android.material.appbar.MaterialToolbar
android:id="@id/toolbar"
@@ -27,21 +28,10 @@
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/layout_list"
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<org.koitharu.kotatsu.core.ui.list.fastscroll.FastScrollRecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_source_config" />
</FrameLayout>
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,19 @@
<?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:id="@+id/layout_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.koitharu.kotatsu.core.ui.list.fastscroll.FastScrollRecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_source_config" />
</FrameLayout>

View File

@@ -539,4 +539,8 @@
<string name="color_correction_apply_text">Гэтыя налады могуць прымяняцца глабальна або толькі да бягучай мангі. Пры глабальным прымяненні індывідуальныя налады не будуць перавызначаны.</string>
<string name="grayscale">Адценні шэрага</string>
<string name="disable_battery_optimization_summary_downloads">Можа дапамагчы з пачаткам загрузкі, калі ў вас узнікаюць з ёй праблемы</string>
<string name="welcome_text">Выберыце, якія крыніцы змесціва вы хочаце ўключыць. Гэта таксама можна наладзіць пазней у наладах</string>
<string name="restore">Аднавіць</string>
<string name="backup_date_">Дата стварэння рэзервовай копіі: %s</string>
<string name="sync_auth">Увайдзіце, каб сінхранізаваць уліковы запіс</string>
</resources>

View File

@@ -150,7 +150,7 @@
<string name="favourites_categories">Mga paboritong kategorya</string>
<string name="remove_category">Tanggalin</string>
<string name="text_empty_holder_primary">Parang walang laman dito…</string>
<string name="text_history_holder_secondary">Hanapin kung ano ang babasahin sa side menu.</string>
<string name="text_history_holder_secondary">Hanapin kung anong pwedeng basahin sa «Explore» section</string>
<string name="text_shelf_holder_secondary">Hanapin kung ano ang babasahin sa seksyong «Mag-explore»</string>
<string name="recent_manga">Kamakailan</string>
<string name="manga_save_location">Folder para sa mga download</string>
@@ -267,7 +267,7 @@
<string name="incognito_mode">Incognito mode</string>
<string name="no_chapters">Walang mga kabanata</string>
<string name="automatic_scroll">Awtomatikong pag-scroll</string>
<string name="reader_info_pattern">Ch. %1$d/%2$d Pg. %3$d/%4$d</string>
<string name="reader_info_pattern">Ka. %1$d/%2$d Pp. %3$d/%4$d</string>
<string name="reader_info_bar">Ipakita ang information bar sa pagbasa</string>
<string name="comics_archive">Archive ng mga comics</string>
<string name="folder_with_images">Folder na may mga larawan</string>
@@ -303,8 +303,8 @@
<string name="nothing_here">Wala naman dito</string>
<string name="services">Mga serbisyo</string>
<string name="allow_unstable_updates">Payagan ang mga hindi stable na update</string>
<string name="show_reading_indicators">Ipakita ang mga tagapagpahiwatig ng progress ng pagbabasa</string>
<string name="exclude_nsfw_from_history_summary">Manga na minarkahan bilang NSFW ay hindi kailanman idadagdag sa kasaysayan at ang iyong progress ay hindi mase-save</string>
<string name="show_reading_indicators">Ipakita ang pang-hiwatig ng progreso</string>
<string name="exclude_nsfw_from_history_summary">Ang mga Manga na naka-mark na NSFW ay hindi madadagdag sa history at yung progreso mo ay hindi ma-sasave</string>
<string name="clear_cookies_summary">Maaaring makatulong sa kaso ng ilang mga isyu. Ang lahat ng pahintulot ay mawawalan ng bisa</string>
<string name="invalid_domain_message">Imbalidong domain</string>
<string name="last_2_hours">Huling 2 oras</string>
@@ -313,7 +313,7 @@
<string name="no_bookmarks_yet">Wala pang bookmark</string>
<string name="nsfw">18+</string>
<string name="not_found_404">Hindi natagpuan o inalis ang nilalaman</string>
<string name="enable_logging_summary">Magtala ng ilang pagkilos para sa mga layunin ng pag-debug</string>
<string name="enable_logging_summary">Magtala ng ilang pagkilos para sa mga layunin ng pag-debug. Huwag buksan kung hindi mo alam kung ano ang ginagawa mo</string>
<string name="text_delete_local_manga_batch">Permanenteng tanggalin ang mga napiling item sa device\?</string>
<string name="chapters_empty">Walang mga kabanata sa manga na ito</string>
<string name="suggestions_updating">Nag-a-update ang mga mungkahi</string>
@@ -343,7 +343,7 @@
<string name="use_fingerprint">Gumamit ng fingerprint kung magagamit</string>
<string name="report">Ulat</string>
<string name="reset">I-reset</string>
<string name="allow_unstable_updates_summary">Magmungkahi ng mga update sa mga beta na bersyon ng app</string>
<string name="allow_unstable_updates_summary">Makakuha ng paunawa tungkol sa mga unstable build</string>
<string name="network_unavailable">Hindi magagamit ang network</string>
<string name="network_unavailable_hint">I-on ang Wi-Fi o mobile network para magbasa ng manga online</string>
<string name="reader_control_ltr_summary">Mag-tap sa kanang gilid o ang pagpindot sa kanang key ay palaging lilipat sa susunod na pahina</string>
@@ -361,16 +361,16 @@
<string name="theme_name_miku">Miku</string>
<string name="user_agent">Header ng UserAgent</string>
<string name="text_file_sizes">B|kB|MB|GB|TB</string>
<string name="standard">Standard</string>
<string name="standard">Pamantayan</string>
<string name="webtoon">Webtoon</string>
<string name="read_mode">Read mode</string>
<string name="error">Error</string>
<string name="internal_storage">Internal storage</string>
<string name="external_storage">External storage</string>
<string name="read_mode">Mode na pang-basa</string>
<string name="error">May Mali</string>
<string name="internal_storage">Pangkaloobang storage</string>
<string name="external_storage">Panlabasang storage</string>
<string name="vibration">Vibration</string>
<string name="domain">Domain</string>
<string name="light_indicator">LED indicator</string>
<string name="settings_apply_restart_required">Mangyaring i-restart ang application upang ilapat ang mga pagbabagong ito</string>
<string name="settings_apply_restart_required">I-restart ang application para ma-ilapat ang mga pagbabagong ito</string>
<string name="got_it">Nakuha ko</string>
<string name="sources_reorder_tip">I-tap at hawakan ang isang aytem upang muling ayusin ang mga ito</string>
<string name="restore_backup_description">Mag-import ng dating ginawa na backup ng data ng user</string>
@@ -389,7 +389,7 @@
<string name="sync_host_description">Maaari kang gumamit ng self-hosted synchronization server o isang default. Huwag baguhin ito kung hindi ka sigurado sa iyong ginagawa.</string>
<string name="ignore_ssl_errors">Huwag pansinin ang mga error sa SSL</string>
<string name="mirror_switching">Awtomatikong pumili ng mirror</string>
<string name="mirror_switching_summary">Awtomatikong lumipat ng mga domain para sa mga remote source sa mga error kung available ang mga mirror</string>
<string name="mirror_switching_summary">Kusang lumipat ng domain para sa mga manga source na may mali kung mayroong mga mirror</string>
<string name="cancel_all">Kanselahin lahat</string>
<string name="downloads_wifi_only">Mag-download lamang sa pamamagitan ng Wi-Fi</string>
<string name="downloads_wifi_only_summary">Itigil ang pag-download kapag lumipat sa isang mobile network</string>
@@ -423,7 +423,7 @@
<string name="data_and_privacy">Data at privacy</string>
<string name="restore_summary">Ibalik ang dating ginawang backup</string>
<string name="webtoon_zoom_summary">Payagan ang pag-zoom in na gesture sa webtoon mode</string>
<string name="reader_info_bar_summary">Ipakita ang kasalukuyang oras at pagbabasa ng progreso sa tuktok ng screen</string>
<string name="reader_info_bar_summary">Ipakita ang kasalukuyang oras at progreso ng pagbabasa sa tuktok ng screen</string>
<string name="show_pages_numbers_summary">Ipakita ang mga numero ng pahina sa ibabang gilid</string>
<string name="pages_animation_summary">I-animate ang paglipat ng pahina</string>
<string name="invalid_port_number">Imbalidong numero ng port</string>
@@ -437,8 +437,8 @@
<string name="download_option_all_unread_b">Lahat ng di-nababasang kabanata (%s)</string>
<string name="download_option_manual_selection">Manu-manong pumili ng mga kabanata</string>
<string name="invert_colors">Baliktarin ang mga kulay</string>
<string name="custom_directory">Pasadyang direktoryo</string>
<string name="pick_custom_directory">Pumili ng pasadyang direktoryo</string>
<string name="custom_directory">Custom na direktoryo</string>
<string name="pick_custom_directory">Pumili ng Custom na direktoryo</string>
<string name="no_access_to_file">Wala kang access sa file o direktoryo na ito</string>
<string name="local_manga_directories">Mga lokal na direktoryo ng manga</string>
<string name="password">Password</string>
@@ -464,17 +464,17 @@
<string name="manage_categories">Ayusin ang mga kategorya</string>
<string name="suggestions_wifi_only_summary">Huwag i-update ang mga mungkahi gamit ang mga naka-metrong network na koneksyon</string>
<string name="show">Ipakita</string>
<string name="unknown">Di-alam</string>
<string name="unknown">Di-kilala</string>
<string name="in_progress">Isinasagawa</string>
<string name="disable_nsfw">I-disable ang NSFW</string>
<string name="error_corrupted_file">Ang hindi wastong data ay ibinalik nito o ang file ay nasira</string>
<string name="error_corrupted_file">Nabalik ang di-wastong data o na-corrupt ang file</string>
<string name="related_manga_summary">Magpakita ng listahan ng mga kaugnay na manga. Sa ilang mga kaso, ito ay maaaring may mali o nawawala</string>
<string name="advanced">Advanced</string>
<string name="too_many_requests_message">Masyadong maraming request. Subukang ulit mamaya</string>
<string name="default_section">Default na seksyon</string>
<string name="manga_list">Listahan ng Manga</string>
<string name="zoom_in">Mag-zoom paloob</string>
<string name="reader_zoom_buttons_summary">Kung magpapakita ng mga button ng kontrol ng zoom sa kanang sulok sa ibaba</string>
<string name="reader_zoom_buttons_summary">Kung magpapakita ba ng mga button ng pang-zoom sa kanang sulok sa ibaba</string>
<string name="on_device">Sa device</string>
<string name="moved_to_top">Nailipat sa itaas</string>
<string name="items_limit_exceeded">Wala nang mga aytem na pwedeng idagdag</string>
@@ -487,13 +487,13 @@
<string name="enhanced_colors_summary">Binabawasan ang banding, ngunit maaaring makaapekto ito sa performance</string>
<string name="state_abandoned">Na-drop</string>
<string name="keep_screen_on">Panatilihing naka-on ang screen</string>
<string name="enhanced_colors">32-bit color mode</string>
<string name="enhanced_colors">32-bit na color mode</string>
<string name="keep_screen_on_summary">Huwag I-off ang screen habang nagbabasa ng manga</string>
<string name="suggest_new_sources_summary">I-prompt na paganahin ang mga bagong idinagdag na source pagkatapos i-update ang aplikasyon</string>
<string name="categories">Mga Kategorya</string>
<string name="list_options">Opsyon sa Listahan</string>
<string name="by_relevance">Kaugnayan</string>
<string name="online_variant">Online na baryante</string>
<string name="online_variant">Online na variant</string>
<string name="frequency_every_day">Araw araw</string>
<string name="backup_frequency">Dalas ng paglikha ng backup</string>
<string name="periodic_backups_enable">Paganahin ang periodic na pag-backup</string>
@@ -517,7 +517,8 @@
<string name="manual">Manu-mano</string>
<string name="source_enabled">Napaganang source</string>
<string name="disable_nsfw_summary">Huwag paganahin ang mga source na NSFW at itago ang manga na pang-adulto mula sa listahan kung maaari</string>
<string name="no_manga_sources_catalog_text">Walang available na source sa seksyong ito. Antabayanan</string>
<string name="no_manga_sources_catalog_text">Walang mga sources na maaring gamitin sa seksyong ito, o maaring na-add na lahat.
\nManatiling nakatutok para sa iba pang mga source</string>
<string name="available_d">Available: %1$d</string>
<string name="content_type_other">Iba pa</string>
<string name="error_multiple_states_not_supported">Ang pag-filter ayon sa maraming estado ay hindi sinusuportahan ng manga source na ito</string>
@@ -532,9 +533,14 @@
<string name="apply">Gamitin</string>
<string name="genres_search_hint">Simulan ang pag-type ng pangalan ng genre</string>
<string name="globally">Pangkahalatan</string>
<string name="downloads_settings_info">Maaari mong paganahin ang pabagal na pag-download para sa bawat source ng manga nang paisa-isa sa mga setting ng source kung nagkakaroon ka ng mga problema sa pagharang sa server-side</string>
<string name="downloads_settings_info">Maaari mong paganahin ang pag-bagal ng pag-download para sa bawat source ng manga nang paisa-isa sa mga setting ng source kung nagkakaroon ka ng mga problema sa pagharang na server-side</string>
<string name="this_manga">Itong manga na ito</string>
<string name="skip">Laktawan</string>
<string name="color_correction_apply_text">Ang mga setting na ito ay maaaring ilapat sa pangkahalatan o sa kasalukuyang manga lamang. Kung inilapat sa pangkahalatan, hindi ma-override ang mga indibidwal na setting.</string>
<string name="grayscale">Grayscale</string>
<string name="grayscale">Walang kulay</string>
<string name="welcome_text">Paki-select kung anong mga content source ang gusto mo i-enable. Pwede rin ito i-configure mamaya sa settings</string>
<string name="restore">I-balik</string>
<string name="disable_battery_optimization_summary_downloads">Baka makatulong sa pag-simula ng download kung mayroong isyu</string>
<string name="backup_date_">Petsa ng pag-backup: %s</string>
<string name="sync_auth">Mag-login para i-sync ang account</string>
</resources>

View File

@@ -268,7 +268,7 @@
<string name="show_reading_indicators">Mostrare gli indicatori di progresso della lettura</string>
<string name="data_deletion">Eliminazione dei dati</string>
<string name="show_reading_indicators_summary">Mostra la percentuale di lettura nella cronologia e nei preferiti</string>
<string name="exclude_nsfw_from_history_summary">I manga contrassegnati come per adulti non verranno mai aggiunti alla cronologia e i vostri progressi non verranno salvati</string>
<string name="exclude_nsfw_from_history_summary">I manga contrassegnati come per adulti non verranno mai aggiunti alla cronologia e i progressi non saranno salvati</string>
<string name="clear_cookies_summary">Può aiutare in caso di problemi. Tutte le autorizzazioni saranno invalidate</string>
<string name="show_all">Mostra tutto</string>
<string name="logout">Esci</string>
@@ -345,12 +345,12 @@
\n Tutti i manga in esso contenuti andranno persi e questo non può essere annullato.</string>
<string name="history_shortcuts_summary">Rendere disponibili i manga recenti premendo a lungo sull\'icona dell\'applicazione</string>
<string name="reader_info_bar">Mostra la barra delle informazioni nel lettore</string>
<string name="manga_error_description_pattern">Dettagli dell\'errore:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;1. Prova ad &lt;a href=%2$s&gt;aprire il manga in un browser web&lt;/a&gt; per assicurarsi che sia disponibile sulla sua fonte&lt;br&gt;2. Se è disponibile, inviare una segnalazione di errore agli sviluppatori.</string>
<string name="manga_error_description_pattern">Dettagli dell\'errore:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Prova ad &lt;a href=%2$s&gt;aprire il manga in un browser web&lt;/a&gt; per assicurarsi che sia disponibile sulla sua fonte&lt;br&gt;2. Controllare di stare usando la &lt;a href=kotatsu://about&gt;versione più recente di Kotatsu&lt;/a&gt;&lt;br&gt;3. Se è disponibile, inviare una segnalazione di errore agli sviluppatori.</string>
<string name="text_unsaved_changes_prompt">Salvare o eliminare le modifiche non salvate\?</string>
<string name="discard">Abbandona</string>
<string name="language">Lingua</string>
<string name="share_logs">Condividi i registri</string>
<string name="enable_logging_summary">Registra alcune azioni a scopo di debug</string>
<string name="enable_logging_summary">Registra alcune azioni a scopo di debug. Non attivare se non si è sicuri di cosa si stia facendo</string>
<string name="enable_logging">Abilita la registrazione</string>
<string name="show_suspicious_content">Mostra il contenuto sospetto</string>
<string name="theme_name_dynamic">Dinamico</string>
@@ -366,7 +366,181 @@
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_miku">Miku</string>
<string name="allow_unstable_updates">Permetti aggiornamenti instabili</string>
<string name="allow_unstable_updates_summary">Proponi aggiornamenti alle versioni beta dell\'app</string>
<string name="allow_unstable_updates_summary">Ricevi notifiche riguardo versioni instabili</string>
<string name="download_started">Scaricamento iniziato</string>
<string name="theme_name_sakura">Sakura</string>
<string name="languages">Lingue</string>
<string name="zoom_in">Ingrandire</string>
<string name="captcha_required_summary">%s richiede il completamento di un captcha per funzionare correttamente</string>
<string name="sources_catalog">Catalogo fonti</string>
<string name="download_option_all_unread">Tutti i capitoli non letti</string>
<string name="frequency_every_day">Ogni giorno</string>
<string name="categories">Categorie</string>
<string name="progress">Progresso</string>
<string name="cancel_all">Annulla tutti</string>
<string name="sync_host_description">Puoi usare un server di sincronizzazione self-hosted oppure uno di default. Non cambiare se non si è sicuri di cosa si stia facendo.</string>
<string name="error_corrupted_file">Dati non validi in ritorno o file corrotto</string>
<string name="pick_custom_directory">Seleziona cartella personalizzata</string>
<string name="list_options">Mostra lista opzioni</string>
<string name="related_manga_summary">Mostra una lista di manga correlati. In alcuni casi potrebbe essere imprecisa o mancante</string>
<string name="remove_completed_downloads_confirm">La tua cronologia dei download sarà permanentemente cancellata</string>
<string name="reader_zoom_buttons_summary">Se mostrare o no i tasti di controllo dello zoom in basso a destra</string>
<string name="content_type_manga">Manga</string>
<string name="tracker_wifi_only_summary">Non controllare nuovi capitoli mentre è in uso una connessione a consumo</string>
<string name="error_multiple_states_not_supported">Questa fonte di manga non supporta il filtraggio per multipli stati</string>
<string name="order_added">Aggiunto</string>
<string name="source_summary_pattern">%1$s, %2$s</string>
<string name="on_device">Su dispositivo</string>
<string name="password">Password</string>
<string name="download_option_whole_manga">L\'intero manga</string>
<string name="settings_apply_restart_required">Riavviare l\'applicazione per applicare queste modifiche</string>
<string name="backup_frequency">Frequenza creazione backup</string>
<string name="data_and_privacy">Dati e privacy</string>
<string name="content_type_hentai">Hentai</string>
<string name="clear_source_cookies_summary">Pulisci cookies solo per dominio specifico. Nella maggior parte dei casi invaliderà l\'autorizzazione</string>
<string name="downloads_wifi_only_summary">Smetti di scaricare quando si passa a rete mobile</string>
<string name="suggest_new_sources">Suggerisci nuove fonti dopo aggiornamento dell\'app</string>
<string name="user_agent">Intestazione UserAgent</string>
<string name="error_filter_states_genre_not_supported">Questa fonte non supporta il filtraggio per sia genere che stato</string>
<string name="ignore_ssl_errors">Ignora errori SSL</string>
<string name="error_filter_locale_genre_not_supported">Questa fonte non supporta il filtraggio per sia genere che localizzazione</string>
<string name="periodic_backups_enable">Abilita backup periodici</string>
<string name="server_address">Indirizzo server</string>
<string name="content_type_comics">Fumetti</string>
<string name="moved_to_top">Spostato in cima</string>
<string name="find_similar">Trova simili</string>
<string name="data_not_restored_text">Assicurati di aver selezionato il file di backup corretto</string>
<string name="catalog">Catalogo</string>
<string name="view_list">Vedi lista</string>
<string name="welcome_text">Selezionare le fonti di contenuti da abilitare. Si può configurare anche successivamente nelle impostazioni</string>
<string name="unknown">Sconosciuto</string>
<string name="in_progress">In progresso</string>
<string name="download_option_manual_selection">Selezione manuale capitoli</string>
<string name="enhanced_colors_summary">Riduce il banding, ma può impattare la performance</string>
<string name="pause">Pausa</string>
<string name="remove_completed">Rimuovi completati</string>
<string name="items_limit_exceeded">Impossibile aggiungere altri oggetti</string>
<string name="frequency_every_2_days">Ogni 2 giorni</string>
<string name="suggestions_notifications_summary">A volte mostra le notifiche sui manga suggeriti</string>
<string name="invalid_value_message">Valore non valido</string>
<string name="downloads_cancelled">I download sono stati annullati</string>
<string name="reader_optimize">Riduci consumo di memoria (beta)</string>
<string name="apply">Applica</string>
<string name="restore">Ripristina</string>
<string name="data_not_restored">Dati non ripristinati</string>
<string name="manage_sources">Gestisci fonti</string>
<string name="directories">Cartelle</string>
<string name="local_manga_directories">Cartelle manga locali</string>
<string name="manage_categories">Gestisci categorie</string>
<string name="no_manga_sources_found">Nessuna fonte manga trovata in base alla tua query</string>
<string name="color_light">Chiaro</string>
<string name="web_view_unavailable">WebView non disponibile: controlla se è installato un provider di WebView</string>
<string name="genres_search_hint">Inizia a scrivere il nome del genere</string>
<string name="port">Porta</string>
<string name="type">Tipo</string>
<string name="search_hint">Inserisci titolo manga, genere o nome fonte</string>
<string name="frequency_once_per_week">Una volta a settimana</string>
<string name="description">Descrizione</string>
<string name="periodic_backups">Backup periodici</string>
<string name="reader_zoom_buttons">Mostra tasti zoom</string>
<string name="sources_reorder_tip">Tocca e tieni premuto su un elemento per riordinarlo</string>
<string name="globally">Globalmente</string>
<string name="resume">Riprendi</string>
<string name="images_proxy_title">Proxy ottimizzazione immagini</string>
<string name="username">Nome utente</string>
<string name="frequency_twice_per_month">Due volte al mese</string>
<string name="main_screen_sections">Sezioni principali schermo</string>
<string name="advanced">Avanzate</string>
<string name="downloads_settings_info">Se stai avendo problemi di blocco dal server, puoi abilitare il rallentamento dei download per ogni fonte di manga nelle impostazioni delle fonti</string>
<string name="sync_settings">Impostazioni di sincronizzazione</string>
<string name="online_variant">Variante online</string>
<string name="disable_battery_optimization_summary_downloads">Potrebbe aiutare a far iniziare il download in caso di problemi</string>
<string name="error_multiple_genres_not_supported">Questa fonte di manga non supporta il filtraggio per multipli generi</string>
<string name="download_option_all_unread_b">Tutti i capitoli non letti (%s)</string>
<string name="authorization_optional">Autorizzazione (opzionale)</string>
<string name="color_dark">Scuro</string>
<string name="this_manga">Questo manga</string>
<string name="reader_info_bar_summary">Mostra l\'orario attuale e il progresso di lettura in cima allo schermo</string>
<string name="translations">Traduzioni</string>
<string name="downloads_paused">I download sono stati messi in pausa</string>
<string name="too_many_requests_message">Troppe richieste. Riprova più tardi</string>
<string name="downloads_wifi_only">Scarica solo via Wi-Fi</string>
<string name="lock_screen_rotation">Blocca rotazione schermo</string>
<string name="cancel_all_downloads_confirm">Tutti i download attivi saranno annullati, i dati scaricati parzialmente saranno persi</string>
<string name="by_relevance">Rilevanza</string>
<string name="related_manga">Manga correlati</string>
<string name="state_abandoned">Abbandonato</string>
<string name="download_option_first_n_chapters">Primo %s</string>
<string name="keep_screen_on">Tieni schermo acceso</string>
<string name="paused">In pausa</string>
<string name="text_downloads_list_holder">Non hai alcun download</string>
<string name="skip">Salta</string>
<string name="error_search_not_supported">Questa fonte di manga non supporta la ricerca</string>
<string name="invalid_port_number">Numero di porta non valido</string>
<string name="suggestions_wifi_only_summary">Non aggiornare suggerimenti mentre è in uso una connessione a consumo</string>
<string name="webtoon_zoom_summary">Consenti gesto di zoom in modalità webtoon</string>
<string name="frequency_once_per_month">Una volta al mese</string>
<string name="network">Rete</string>
<string name="downloaded">Scaricato</string>
<string name="suggestions_enable_prompt">Vuoi ricevere suggerimenti personalizzati di manga?</string>
<string name="manual">Manuale</string>
<string name="custom_directory">Cartella personalizzata</string>
<string name="more">Di più</string>
<string name="reader_optimize_summary">Riduci la qualità delle pagine fuori schermo per usare meno memoria</string>
<string name="address">Indirizzo</string>
<string name="color_correction_apply_text">Queste impostazioni possono essere applicate globalmente o per solo questo manga. Le applicazioni globali non sovrascrivono quelle individuali.</string>
<string name="source_enabled">Fonte abilitata</string>
<string name="enhanced_colors">Modalità colori 32-bit</string>
<string name="folder_with_images_import_description">Puoi selezionare una cartella contenente archivi o immagini. Ogni archivio (o sottocartella) sarà riconosciuto come singolo capitolo.</string>
<string name="default_section">Sezione default</string>
<string name="background">Sfondo</string>
<string name="disable_nsfw_summary">Disabilita fonti per adulti e nascondi manga per adulti dalla lista se possibile</string>
<string name="speed_value">x%.1f</string>
<string name="downloads_removed">I download sono stati rimossi</string>
<string name="pages_animation_summary">Animazioni cambio pagina</string>
<string name="no_access_to_file">Non hai accesso a questo file o cartella</string>
<string name="mirror_switching">Scegli mirror automaticamente</string>
<string name="restore_summary">Ripristina backup creato in precedenza</string>
<string name="show_pages_numbers_summary">Mostra numeri di pagina nell\'angolo inferiore</string>
<string name="zoom_out">Rimpicciolire</string>
<string name="keep_screen_on_summary">Non spegnere lo schermo durante la lettura di manga</string>
<string name="download_option_next_unread_n_chapters">Prossimo %s non letto</string>
<string name="clear_network_cache">Pulisci cache di rete</string>
<string name="voice_search">Ricerca vocale</string>
<string name="enable">Abilita</string>
<string name="backup_date_">Data del backup: %s</string>
<string name="images_procy_description">Usa il servizio wsrv.nl per ridurre i consumi di rete e velocizzare il caricamento delle immagini, se possibile</string>
<string name="no_manga_sources_catalog_text">Non sono disponibili fonti in questa sezione, o potrebbero essere state aggiunte tutte.
\nRimani sintonizzato</string>
<string name="available_d">Disponibile: %1$d</string>
<string name="manga_branch_title_template">%1$s (%2$s)</string>
<string name="state">Stato</string>
<string name="manga_list">Lista manga</string>
<string name="grayscale">Bianco e nero</string>
<string name="disable_nsfw">Disabilita contenuti per adulti</string>
<string name="last_successful_backup">Ultimo backup completato: %s</string>
<string name="color_white">Bianco</string>
<string name="downloads_resumed">I download sono stati ripresi</string>
<string name="details_button_tip">Tocca e tieni premuto il tasto Leggi per vedere più opzioni</string>
<string name="state_paused">In pausa</string>
<string name="to_top">Va in cima</string>
<string name="show">Mostra</string>
<string name="sync_auth_hint">Puoi accedere ad un account esistente o crearne uno nuovo</string>
<string name="backups_output_directory">Cartella salvataggio backup</string>
<string name="invert_colors">Inverti colori</string>
<string name="mirror_switching_summary">Cambiare dominio di fonte del manga automaticamente in caso di errore se sono disponibili mirror</string>
<string name="no_thanks">No grazie</string>
<string name="suggest_new_sources_summary">Chiedi se aggiungere nuove fonti dopo aggiornamento dell\'applicazione</string>
<string name="speed">Velocità</string>
<string name="download_option_all_chapters">Tutti i capitoli con traduzioni %s</string>
<string name="content_type_other">Altro</string>
<string name="suggestion_manga">Consigliato: %s</string>
<string name="color_black">Nero</string>
<string name="this_month">Questo mese</string>
<string name="sync_auth">Accedi per sincronizzare l\'account</string>
<string name="proxy">Proxy</string>
<string name="restore_backup_description">Importa un backup di dati utente creato precedentemente</string>
<string name="got_it">Ho capito</string>
<string name="comics_archive_import_description">Puoi selezionare uno o più file .cbz o .zip, ogni file sarà riconosciuto come un manga a parte.</string>
<string name="show_on_shelf">Mostra sullo Scaffale</string>
</resources>

View File

@@ -3,12 +3,13 @@
<style name="Base.V31.Kotatsu" parent="Base.V27.Kotatsu">
<item name="android:windowSplashScreenAnimatedIcon">@drawable/avd_splash</item>
<item name="android:windowSplashScreenBackground">@android:color/system_neutral2_900</item>
<item name="android:windowSplashScreenAnimationDuration">800</item>
<item name="android:windowSplashScreenAnimationDuration">@integer/splash_screen_duration</item>
<item name="android:windowSplashScreenBackground">@color/m3_sys_color_dynamic_dark_surface</item>
</style>
<!-- From ThemeOverlay.Material3.DynamicColors.Dark -->
<style name="Theme.Kotatsu.Monet">
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="isMaterial3DynamicColorApplied">true</item>
<!-- Color palettes -->
<item name="colorPrimary">@color/m3_sys_color_dynamic_dark_primary</item>
@@ -61,11 +62,11 @@
<item name="colorOnErrorContainer">@color/m3_sys_color_dark_on_error_container</item>
<item name="colorOutline">@color/m3_sys_color_dynamic_dark_outline</item>
<item name="colorOutlineVariant">@color/m3_sys_color_dynamic_dark_outline_variant</item>
<item name="android:colorBackground">@android:color/system_neutral2_900</item>
<item name="m3ColorBackground">@android:color/system_neutral2_900</item>
<item name="m3ColorExploreButton">@android:color/system_neutral2_800</item>
<item name="m3ColorCardBackground">@android:color/system_neutral2_700</item>
<item name="m3ColorBottomMenuBackground">@android:color/system_neutral2_800</item>
<item name="android:colorBackground">@color/m3_sys_color_dynamic_dark_surface</item>
<item name="m3ColorBackground">@color/m3_sys_color_dynamic_dark_surface</item>
<item name="m3ColorExploreButton">@color/m3_sys_color_dynamic_dark_surface_container_low</item>
<item name="m3ColorCardBackground">@color/m3_sys_color_dynamic_dark_surface_container_low</item>
<item name="m3ColorBottomMenuBackground">@color/m3_sys_color_dynamic_dark_surface_container_low</item>
<!-- Default Framework Text Colors. -->
<item name="android:textColorPrimary">@color/m3_dynamic_dark_default_color_primary_text
</item>

View File

@@ -11,7 +11,6 @@
<color name="status_bar_incognito">#66311B92</color>
<color name="warning">#FB8C00</color>
<color name="launcher_background">#222222</color>
<color name="splash_primary">#0C4091</color>
<!-- Color schemes colors -->
<color name="background_miku">#191C1C</color>

View File

@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="ThemeOverlay.Kotatsu" parent="ThemeOverlay.Material3.Dark" />
<style name="ThemeOverlay.Kotatsu" parent="ThemeOverlay.Material3.Dark">
<item name="android:navigationBarColor">@android:color/transparent</item>
</style>
<style name="ThemeOverlay.Kotatsu.Amoled" parent="">
<item name="colorSurface">@color/surface_amoled</item>

View File

@@ -2,31 +2,37 @@
<resources>
<plurals name="items">
<item quantity="one">%1$d item</item>
<item quantity="many">%1$d itens</item>
<item quantity="other">%1$d itens</item>
</plurals>
<plurals name="chapters">
<item quantity="one">%1$d capítulo</item>
<item quantity="many">%1$d capítulos</item>
<item quantity="other">%1$d capítulos</item>
</plurals>
<plurals name="new_chapters">
<item quantity="one">%1$d novo capítulo</item>
<item quantity="many">%1$d novos capítulos</item>
<item quantity="other">%1$d novos capítulos</item>
</plurals>
<plurals name="minutes_ago">
<item quantity="one">%1$d minuto atrás</item>
<item quantity="many">%1$d minutos atrás</item>
<item quantity="other">%1$d minutos atrás</item>
</plurals>
<plurals name="hours_ago">
<item quantity="one">%1$d hora atrás</item>
<item quantity="many">%1$d horas atrás</item>
<item quantity="other">%1$d horas atrás</item>
</plurals>
<plurals name="days_ago">
<item quantity="one">%1$d dia atrás</item>
<item quantity="many">%1$d dias atrás</item>
<item quantity="other">%1$d dias atrás</item>
</plurals>
<plurals name="months_ago">
<item quantity="one">%1$d mês atrás</item>
<item quantity="many">%1$d meses atrás</item>
<item quantity="other"></item>
<item quantity="other">%1$d meses atrás</item>
</plurals>
</resources>

View File

@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="read">Leitura</string>
<string name="read">Iniciar</string>
<string name="you_have_not_favourites_yet">Ainda não há favoritos</string>
<string name="local_storage">Armazenamento local</string>
<string name="favourites">Favoritos</string>
<string name="history">Histórico</string>
<string name="error_occurred">Um erro ocorreu</string>
<string name="error_occurred">Ocorreu um erro</string>
<string name="network_error">Erro de rede</string>
<string name="details">Detalhes</string>
<string name="details">Detalhado</string>
<string name="chapters">Capítulos</string>
<string name="list">Lista</string>
<string name="detailed_list">Lista detalhada</string>
<string name="grid">Grade</string>
<string name="list_mode">Modo de lista</string>
<string name="settings">Configurações</string>
<string name="remote_sources">Fontes de manga</string>
<string name="remote_sources">Fontes de mangá</string>
<string name="loading_">Carregando…</string>
<string name="chapter_d_of_d">Capítulo %1$d de %2$d</string>
<string name="close">Fechar</string>
@@ -38,7 +38,7 @@
<string name="by_name">Nome</string>
<string name="popular">Popular</string>
<string name="updated">Atualizado</string>
<string name="newest">O mais novo</string>
<string name="newest">Mais recente</string>
<string name="by_rating">Avaliação</string>
<string name="sort_order">Ordem de classificação</string>
<string name="filter">Filtro</string>
@@ -49,7 +49,7 @@
<string name="clear">Limpar</string>
<string name="remove">Remover</string>
<string name="_s_deleted_from_local_storage">“%s” excluído do armazenamento local</string>
<string name="save_page">Salvar página</string>
<string name="save_page">Salvar a página</string>
<string name="page_saved">Salvou</string>
<string name="share_image">Compartilhar imagem</string>
<string name="_import">Importar</string>
@@ -87,10 +87,10 @@
<string name="light_indicator">Indicador LED</string>
<string name="vibration">Vibração</string>
<string name="remove_category">Remover</string>
<string name="text_empty_holder_primary">Tá meio vazio aqui…</string>
<string name="text_empty_holder_primary">Está meio vazio aqui…</string>
<string name="text_search_holder_secondary">Tente reformular a consulta.</string>
<string name="text_history_holder_primary">O que você ler será exibido aqui</string>
<string name="text_history_holder_secondary">Encontre o que ler na aba «Explorar»</string>
<string name="text_history_holder_primary">O que você lê será exibido aqui</string>
<string name="text_history_holder_secondary">Encontre o que ler na seção «Explorar»</string>
<string name="text_local_holder_primary">Salve algo primeiro</string>
<string name="manga_shelf">Prateleira</string>
<string name="recent_manga">Recente</string>
@@ -104,18 +104,18 @@
<string name="favourites_category_empty">Categoria vazia</string>
<string name="read_later">Leia mais tarde</string>
<string name="updates">Atualizações</string>
<string name="search_results">Procurar resultados</string>
<string name="search_results">Resultados encontrados</string>
<string name="new_version_s">Nova versão: %s</string>
<string name="size_s">Tamanho: %s</string>
<string name="clear_updates_feed">Limpar feed de atualizações</string>
<string name="rotate_screen">Girar a tela</string>
<string name="update">Atualizar</string>
<string name="feed_will_update_soon">A atualização do feed começará em breve</string>
<string name="track_sources">Procure atualizações</string>
<string name="dont_check">Não verifique</string>
<string name="enter_password">Digite a senha</string>
<string name="track_sources">Procurar por atualizações</string>
<string name="dont_check">Não verificar</string>
<string name="enter_password">Digite sua senha</string>
<string name="wrong_password">Senha incorreta</string>
<string name="protect_application_summary">Peça a senha ao iniciar o Kotatsu</string>
<string name="protect_application_summary">Solicitar senha ao iniciar o Kotatsu</string>
<string name="repeat_password">Repita a senha</string>
<string name="passwords_mismatch">Senhas incompatíveis</string>
<string name="about">Sobre</string>
@@ -128,7 +128,7 @@
<string name="tap_to_try_again">Toque para tentar novamente</string>
<string name="reader_mode_hint">A configuração escolhida será lembrada para este mangá</string>
<string name="silent">Silencioso</string>
<string name="captcha_required">CAPTCHA obrigatório</string>
<string name="captcha_required">CAPTCHA Obrigatório</string>
<string name="captcha_solve">Resolver</string>
<string name="clear_cookies">Limpar cookies</string>
<string name="cookies_cleared">Todos os cookies foram removidos</string>
@@ -159,7 +159,7 @@
<string name="state_finished">Finalizado</string>
<string name="state_ongoing">Em andamento</string>
<string name="system_default">Padrão</string>
<string name="exclude_nsfw_from_history">Excluir mangá NSFW do histórico</string>
<string name="exclude_nsfw_from_history">Excluir mangás NSFW do histórico</string>
<string name="show_pages_numbers">Páginas numeradas</string>
<string name="enabled_sources">Fontes usadas</string>
<string name="available_sources">Fontes disponíveis</string>
@@ -169,16 +169,16 @@
<string name="screenshots_block_all">Sempre bloquear</string>
<string name="suggestions">Sugestões</string>
<string name="suggestions_enable">Ativar sugestões</string>
<string name="suggestions_summary">Sugerir mangá com base em suas preferências</string>
<string name="suggestions_summary">Sugerir mangás com base em suas preferências</string>
<string name="suggestions_info">Todos os dados são analisados apenas localmente neste dispositivo e nunca são enviados para qualquer lugar.</string>
<string name="text_suggestion_holder">Comece a ler mangá e você receberá sugestões personalizadas</string>
<string name="exclude_nsfw_from_suggestions">Não sugira mangá NSFW</string>
<string name="text_suggestion_holder">Comece a ler e você receberá sugestões personalizadas</string>
<string name="exclude_nsfw_from_suggestions">Não sugerir mangás NSFW</string>
<string name="history_is_empty">Sem histórico ainda</string>
<string name="enabled">Habilitado</string>
<string name="disabled">Desabilitado</string>
<string name="filter_load_error">Não foi possível carregar a lista de gêneros</string>
<string name="reset_filter">Redefinir filtro</string>
<string name="onboard_text">Selecione os idiomas que você deseja ler mangá. Você pode alterá-lo mais tarde nas configurações.</string>
<string name="onboard_text">Selecione os idiomas em que você deseja ler. Você pode alterá-los mais tarde nas configurações.</string>
<string name="never">Nunca</string>
<string name="only_using_wifi">Somente em Wi-Fi</string>
<string name="always">Sempre</string>
@@ -188,7 +188,7 @@
<string name="various_languages">Vários idiomas</string>
<string name="text_clear_history_prompt">Limpar todo o histórico de leitura permanentemente\?</string>
<string name="operation_not_supported">Esta operação não é suportada</string>
<string name="automatic">Siga o sistema</string>
<string name="automatic">Automático (segue o sistema)</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">%1$d de %2$d em</string>
<string name="webtoon">Webtoon</string>
<string name="switch_pages">Alternar páginas</string>
@@ -198,11 +198,11 @@
<string name="create_category">Nova categoria</string>
<string name="zoom_mode_fit_center">Centro de ajuste</string>
<string name="zoom_mode_keep_start">Manter no início</string>
<string name="black_dark_theme_summary">Usa menos energia em telas AMOLED</string>
<string name="black_dark_theme_summary">Consome menos bateria em telas AMOLED</string>
<string name="create_backup">Criar backup de dados</string>
<string name="text_local_holder_secondary">Salve-o de fontes online ou importe arquivos.</string>
<string name="check_for_updates">Verifique se há atualizações</string>
<string name="text_feed_holder">Novos capítulos do que você está lendo são mostrados aqui</string>
<string name="check_for_updates">Verificar se há atualizações</string>
<string name="text_feed_holder">Novos capítulos do que você está lendo são exibidos aqui</string>
<string name="app_version">Versão %s</string>
<string name="zoom_mode_fit_width">Ajustar à largura</string>
<string name="preparing_">Preparando…</string>
@@ -228,11 +228,11 @@
<string name="removal_completed">Remoção concluída</string>
<string name="text_delete_local_manga_batch">Excluir itens selecionados do dispositivo permanentemente\?</string>
<string name="hide">Esconder</string>
<string name="download_slowdown">Baixar lentidão</string>
<string name="download_slowdown">Desaceleração de download</string>
<string name="download_slowdown_summary">Ajuda a evitar o bloqueio do seu endereço IP</string>
<string name="local_manga_processing">Processamento de mangá salvo</string>
<string name="local_manga_processing">Processamento de mangás salvos</string>
<string name="chapters_will_removed_background">Os capítulos serão removidos em segundo plano</string>
<string name="new_sources_text">Novas fontes de mangá estão disponíveis</string>
<string name="new_sources_text">Novas fontes de mangás estão disponíveis</string>
<string name="check_new_chapters_title">Verifique se há novos capítulos e notifique sobre isso</string>
<string name="show_notification_new_chapters_on">Você receberá notificações sobre atualizações do mangá que está lendo</string>
<string name="edit_category">Editar categoria</string>
@@ -252,9 +252,9 @@
<string name="default_mode">Modo padrão</string>
<string name="detect_reader_mode">Detecção automática do modo de leitura</string>
<string name="detect_reader_mode_summary">Detectar automaticamente se o mangá é webtoon</string>
<string name="disable_battery_optimization">Desative a otimização da bateria</string>
<string name="disable_battery_optimization">Desative a otimização de bateria</string>
<string name="disable_battery_optimization_summary">Ajuda com verificações de atualizações em segundo plano</string>
<string name="invalid_domain_message">Endereço inválido</string>
<string name="invalid_domain_message">Domínio inválido</string>
<string name="use_fingerprint">Usar impressão digital, se disponível</string>
<string name="appwidget_shelf_description">Mangás dos seus favoritos</string>
<string name="appwidget_recent_description">Seus mangás recentemente lidos</string>
@@ -262,7 +262,7 @@
<string name="status_on_hold">Em espera</string>
<string name="status_dropped">Desistido</string>
<string name="text_shelf_holder_primary">Seus mangás serão exibidos aqui</string>
<string name="text_shelf_holder_secondary">Encontre o que ler na seção &lt;«Explorar»</string>
<string name="text_shelf_holder_secondary">Encontre o que ler na seção «Explorar»</string>
<string name="canceled">Cancelado</string>
<string name="account_already_exists">Essa conta já existe</string>
<string name="back">Voltar</string>
@@ -288,7 +288,7 @@
<string name="history_cleared">Histórico apagado</string>
<string name="manage">Gerenciar</string>
<string name="no_bookmarks_yet">Sem páginas marcadas ainda</string>
<string name="no_bookmarks_summary">Você pode criar um marcador de página enquanto lé o mangá</string>
<string name="no_bookmarks_summary">Você pode marcar uma página enquanto lê o mangá</string>
<string name="bookmarks_removed">Marcadores de página removidos</string>
<string name="no_manga_sources">Sem fontes de mangás</string>
<string name="select_range">Selecionar intervalo</string>
@@ -296,8 +296,8 @@
<string name="no_chapters">Sem capítulos</string>
<string name="manga_error_description_pattern">Detalhes do erro:&lt;br&gt;&lt;tt&gt;%1$s&lt;/tt&gt;&lt;br&gt;&lt;br&gt;1. Tente &lt;a href=%2$s&gt;abrir o mangá em um navegador da web&lt;/a&gt; para garantir que ele esteja disponível em sua fonte&lt;br&gt;2. Verifique se você está usando a &lt;ahref=kotatsu://about&gt;versão mais recente do Kotatsu&lt;/a&gt;&lt;br&gt;3. Se estiver disponível, envie um relatório de erro para os desenvolvedores.</string>
<string name="feed">Feed</string>
<string name="history_shortcuts_summary">Torne os mangás recentes visíveis pressionando o ícone do aplicativo</string>
<string name="no_manga_sources_text">Habilite as fontes de maná para ler online</string>
<string name="history_shortcuts_summary">Torne mangás recentes visíveis ao pressionar e segurar o ícone do aplicativo</string>
<string name="no_manga_sources_text">Habilite as fontes de mangás para ler online</string>
<string name="random">Aleatório</string>
<string name="categories_delete_confirm">Tem certeza que deseja excluir as categorias favoritas selecionadas\?
\nTodos os mangás serão perdidos e isso não pode ser desfeito.</string>
@@ -323,7 +323,7 @@
<string name="comics_archive">Arquivo de quadrinhos</string>
<string name="importing_manga">Importando mangá(s)</string>
<string name="import_completed">Importação completa</string>
<string name="import_completed_hint">Você pode excluir o arquivo original do dispositivo para salvar espaço</string>
<string name="import_completed_hint">Você pode excluir o arquivo original do armazenamento para economizar espaço</string>
<string name="import_will_start_soon">A importação começará em breve</string>
<string name="history_shortcuts">Mostrar atalhos de mangás recentes</string>
<string name="reader_control_ltr_summary">Tocar na borda direita ou pressionar a tecla direita sempre passa para a próxima página</string>
@@ -339,12 +339,12 @@
<string name="services">Serviços</string>
<string name="nothing_here">Não há nada aqui</string>
<string name="server_error">Erro do lado do servidor (%1$d). Por favor, tente novamente mais tarde</string>
<string name="compact">Compactar</string>
<string name="compact">Compacto</string>
<string name="enable_logging">Habilitar registros</string>
<string name="share_logs">Compartilhar registros</string>
<string name="error_no_space_left">Não há espaço disponível no aparelho</string>
<string name="error_no_space_left">Não há espaço disponível no dispositivo</string>
<string name="network_unavailable">A rede não está disponível</string>
<string name="network_unavailable_hint">Ative o Wi-Fi ou a rede móvel para ler mangá online</string>
<string name="network_unavailable_hint">Ative o Wi-Fi ou os dados móveis para ler mangá online</string>
<string name="allow_unstable_updates">Permitir atualizações instáveis</string>
<string name="download_started">Download iniciado</string>
<string name="language">Idioma</string>
@@ -354,19 +354,19 @@
<string name="show_suspicious_content">Exibir conteúdo suspeito</string>
<string name="prefetch_content">Pré-carregamento de conteúdo</string>
<string name="theme_name_dynamic">Dinâmico</string>
<string name="settings_apply_restart_required">Por favor, reinicie o app para aplicar essas mudanças</string>
<string name="settings_apply_restart_required">Por favor, reinicie o aplicativo para aplicar essas mudanças</string>
<string name="different_languages">Idiomas diferentes</string>
<string name="theme_name_asuka">Asuka</string>
<string name="theme_name_mion">Mion</string>
<string name="theme_name_rikka">Rikka</string>
<string name="theme_name_sakura">Sakura</string>
<string name="source_disabled">Fonte desativada</string>
<string name="enable_logging_summary">Gravar algumas ações para propósitos de depuração. Não ative se você não sabe o que está fazendo</string>
<string name="enable_logging_summary">Gravar algumas ações para propósitos de depuração. Não ative se você não souber o que está fazendo</string>
<string name="theme_name_mamimi">Mamimi</string>
<string name="theme_name_miku">Miku</string>
<string name="theme_name_kanade">Kanade</string>
<string name="scrobbling_empty_hint">Para acompanhar o progresso da leitura, selecione Menu → Rastrear na tela de detalhes do mangá.</string>
<string name="clear_new_chapters_counters">Também informações claras sobre novos capítulos</string>
<string name="clear_new_chapters_counters">Apagar informações sobre novos capítulos</string>
<string name="sync_auth_hint">Você pode entrar em uma conta existente ou criar uma nova</string>
<string name="allow_unstable_updates_summary">Receber notificações sobre versões beta</string>
<string name="comics_archive_import_description">Você pode selecionar um ou mais arquivos .cbz ou .zip, cada arquivo será reconhecido como um mangá separado.</string>
@@ -376,12 +376,12 @@
<string name="show_on_shelf">Mostrar na Prateleira</string>
<string name="got_it">Entendi</string>
<string name="sources_reorder_tip">Toque e segure em um item para reordená-lo</string>
<string name="user_agent">Cabeçalho UserAgent</string>
<string name="user_agent">Cabeçalho User/Agent</string>
<string name="reader_slider">Mostrar controle deslizante de troca de página</string>
<string name="webtoon_zoom">Zoom Webtoon</string>
<string name="pages_animation_summary">Animar troca de página</string>
<string name="show_pages_numbers_summary">Mostrar números de página no canto inferior</string>
<string name="find_similar">Encontrar semelhante</string>
<string name="find_similar">Encontrar similares</string>
<string name="resume">Retomar</string>
<string name="paused">Pausado</string>
<string name="remove_completed">Remoção concluída</string>
@@ -416,8 +416,8 @@
<string name="manga_branch_title_template">%1$s (%2$s)</string>
<string name="download_option_all_chapters">Todos os capítulos com tradução %s</string>
<string name="download_option_whole_manga">O mangá inteiro</string>
<string name="download_option_first_n_chapters">Primeiro %s</string>
<string name="download_option_next_unread_n_chapters">Próxima não lida %s</string>
<string name="download_option_first_n_chapters">Primeiros %s</string>
<string name="download_option_next_unread_n_chapters">Próximos %s não lidos</string>
<string name="download_option_all_unread">Todos os capítulos não lidos</string>
<string name="download_option_all_unread_b">Todos os capítulos não lidos (%s)</string>
<string name="download_option_manual_selection">Selecionar capítulos manualmente</string>
@@ -429,14 +429,14 @@
<string name="sync_host_description">Você pode usar um servidor de sincronização auto-hospedado ou um padrão. Não mude isso se não tiver certeza do que está fazendo.</string>
<string name="ignore_ssl_errors">Ignorar erros de SSL</string>
<string name="mirror_switching">Escolher espelho automaticamente</string>
<string name="mirror_switching_summary">Troca automática de domínios para fontes de mangá em caso de erros, se houver espelhos disponíveis</string>
<string name="mirror_switching_summary">Troca automática de domínios para fontes de mangás em caso de erros, se houver espelhos disponíveis</string>
<string name="pause">Pausar</string>
<string name="suggestions_enable_prompt">Quer receber sugestões personalizadas de mangás\?</string>
<string name="suggestion_manga">Sugestão: %s</string>
<string name="downloads_resumed">Os downloads foram retomados</string>
<string name="downloads_wifi_only_summary">Interrompa o download ao mudar para uma rede móvel</string>
<string name="cancel_all_downloads_confirm">Todos os downloads ativos serão cancelados, dados parcialmente baixados serão perdidos</string>
<string name="downloads_wifi_only">Baixe apenas via Wi-Fi</string>
<string name="downloads_wifi_only">Baixar apenas via Wi-Fi</string>
<string name="web_view_unavailable">WebView não disponível: verifique se o provedor WebView está instalado</string>
<string name="port">Porta</string>
<string name="address">Endereço</string>
@@ -445,7 +445,7 @@
<string name="local_manga_directories">Diretórios locais de mangá</string>
<string name="languages">Idiomas</string>
<string name="zoom_in">Aumentar o zoom</string>
<string name="captcha_required_summary">%s requer que um captcha seja resolvido para funcionar</string>
<string name="captcha_required_summary">%s requer que o captcha seja resolvido para funcionar corretamente</string>
<string name="progress">Progresso</string>
<string name="error_corrupted_file">Dados inválidos ou o arquivo está corrompido</string>
<string name="related_manga_summary">Mostra uma lista de mangás relacionados. Em alguns casos, ela pode estar incorreta ou ausente</string>
@@ -471,7 +471,7 @@
<string name="color_dark">Escuro</string>
<string name="too_many_requests_message">Muitas tentativas. Tente de novo mais tarde</string>
<string name="related_manga">Mangá relacionado</string>
<string name="suggestions_wifi_only_summary">Não atualize sugestões usando dados móveis</string>
<string name="suggestions_wifi_only_summary">Não atualize as sugestões usando dados móveis</string>
<string name="default_section">Seção padrão</string>
<string name="background">Fundo</string>
<string name="zoom_out">Diminuir o zoom</string>
@@ -482,7 +482,7 @@
<string name="to_top">Para cima</string>
<string name="show">Mostrar</string>
<string name="color_black">Preto</string>
<string name="this_month">Esse mês</string>
<string name="this_month">Este mês</string>
<string name="frequency_every_day">Diariamente</string>
<string name="categories">Categorias</string>
<string name="list_options">Opções da lista</string>
@@ -528,4 +528,19 @@
<string name="state">Estado</string>
<string name="state_paused">Pausado</string>
<string name="content_type_other">Outros</string>
<string name="error_filter_states_genre_not_supported">A filtragem por gênero e estado não é suportado por esta fonte</string>
<string name="error_filter_locale_genre_not_supported">A filtragem por gênero e localidade não é suportada por esta fonte</string>
<string name="welcome_text">Por favor, selecione quais fontes de conteúdo você gostaria de habilitar. Isso também pode ser configurado posteriormente nas configurações</string>
<string name="apply">Aplicar</string>
<string name="restore">Restaurar</string>
<string name="genres_search_hint">Comece a digitar o nome do gênero</string>
<string name="globally">Globalmente</string>
<string name="downloads_settings_info">Você pode ativar a desaceleração de download para cada fonte de mangá individualmente nas configurações da fonte, se estiver enfrentando problemas com bloqueios do lado do servidor</string>
<string name="disable_battery_optimization_summary_downloads">Pode ajudar a iniciar o download caso você tenha algum problema com isso</string>
<string name="this_manga">Este mangá</string>
<string name="skip">Pular</string>
<string name="color_correction_apply_text">Essas configurações podem ser aplicadas globalmente ou apenas ao mangá atual. Se aplicadas globalmente, as configurações individuais não serão substituídas.</string>
<string name="backup_date_">Data de backup: %s</string>
<string name="grayscale">Tons de Cinza</string>
<string name="sync_auth">Faça login para sincronizar a conta</string>
</resources>

View File

@@ -71,7 +71,7 @@
<string name="large_manga_save_confirm">Este mangá tem %s. Salvar tudo isso\?</string>
<string name="save_manga">Salvar</string>
<string name="notifications">Notificações</string>
<string name="new_chapters">Novos capítulos</string>
<string name="new_chapters">Capítulos novos</string>
<string name="download">Download</string>
<string name="notifications_settings">Configurações das notificações</string>
<string name="light_indicator">Indicador LED</string>
@@ -494,4 +494,53 @@
<string name="state_abandoned">Caiu</string>
<string name="keep_screen_on">Manter a tela ligada</string>
<string name="keep_screen_on_summary">Não desligue a tela enquanto estiver lendo mangá</string>
<string name="sources_catalog">Catálogo de fontes</string>
<string name="frequency_every_day">Diariamente</string>
<string name="content_type_manga">Mangá</string>
<string name="error_multiple_states_not_supported">A filtragem por múltiplos estados não é suportada por esta fonte</string>
<string name="source_summary_pattern">%1$s, %2$s</string>
<string name="backup_frequency">Frequência de criação de backup</string>
<string name="content_type_hentai">Hentai</string>
<string name="error_filter_states_genre_not_supported">A filtragem por gênero e estado não é suportado por esta fonte</string>
<string name="error_filter_locale_genre_not_supported">A filtragem por gênero e localidade não é suportada por esta fonte</string>
<string name="periodic_backups_enable">Ativar backups periódicos</string>
<string name="content_type_comics">Quadrinhos</string>
<string name="catalog">Catálogo</string>
<string name="welcome_text">Por favor, selecione quais fontes de conteúdo gostaria de ativar. Isso também pode ser configurado posteriormente nas configurações</string>
<string name="frequency_every_2_days">A cada 2 dias</string>
<string name="reader_optimize">Reduzir o consumo de memória (beta)</string>
<string name="apply">Aplicar</string>
<string name="restore">Restaurar</string>
<string name="manage_sources">Gerir fontes</string>
<string name="no_manga_sources_found">Nenhuma fonte de mangá disponível encontrada da sua pesquisa</string>
<string name="genres_search_hint">Comece a digitar o nome do gênero</string>
<string name="frequency_once_per_week">Semanalmente</string>
<string name="periodic_backups">Backups periódicos</string>
<string name="globally">Globalmente</string>
<string name="frequency_twice_per_month">Duas vezes ao mês</string>
<string name="downloads_settings_info">Pode ativar a desaceleração de descargas para cada fonte de mangá individualmente nas configurações da fonte, se enfrentar problemas com bloqueios do lado do servidor</string>
<string name="disable_battery_optimization_summary_downloads">Pode ajudar a iniciar a descarga caso tenha algum problema com isso</string>
<string name="error_multiple_genres_not_supported">A filtragem por múltiplos gêneros não é suportada por esta fonte</string>
<string name="this_manga">Este mangá</string>
<string name="lock_screen_rotation">Travar rotação de ecrã</string>
<string name="skip">Pular</string>
<string name="error_search_not_supported">A busca não é suportada por esta fonte</string>
<string name="frequency_once_per_month">Uma vez por mês</string>
<string name="manual">Manual</string>
<string name="reader_optimize_summary">Reduzir a qualidade das páginas fora do ecrã para usar menos memória</string>
<string name="color_correction_apply_text">Essas configurações podem ser aplicadas globalmente ou apenas ao mangá atual. Se aplicadas globalmente, as configurações individuais não serão substituídas.</string>
<string name="source_enabled">Fonte ativada</string>
<string name="disable_nsfw_summary">Desative as fontes NSFW e oculte os mangás adultos da lista, se possível</string>
<string name="speed_value">x%.1f</string>
<string name="backup_date_">Data de backup: %s</string>
<string name="no_manga_sources_catalog_text">Não há fontes disponíveis nesta secção, ou todas elas podem já ter sido adicionadas.
\nFique atento</string>
<string name="available_d">Disponível: %1$d</string>
<string name="state">Estado</string>
<string name="grayscale">Tons de Cinzento</string>
<string name="last_successful_backup">Último backup bem-sucedido: %s</string>
<string name="state_paused">Pausado</string>
<string name="backups_output_directory">Local de saída de backups</string>
<string name="content_type_other">Outros</string>
<string name="sync_auth">Faça login para sincronizar a conta</string>
</resources>

View File

@@ -542,5 +542,5 @@
<string name="sync_auth">Войти в аккаунт синхронизации</string>
<string name="welcome_text">Пожалуйста, выберите, какие источники вы хотите включить. Это можно изменить в настройках позже</string>
<string name="restore">Восстановить</string>
<string name="backup_date_">Дата резервного копирования: %s</string>
<string name="backup_date_">Дата создания резервной копии: %s</string>
</resources>

View File

@@ -12,12 +12,12 @@
<string name="grid">Табла</string>
<string name="list_mode">Режим листе</string>
<string name="settings">Подешавања</string>
<string name="remote_sources">Манга извори</string>
<string name="remote_sources">Извори манге</string>
<string name="loading_">Учитавање…</string>
<string name="chapter_d_of_d">Поглавље %1$d од %2$d</string>
<string name="close">Затвори</string>
<string name="try_again">Покушај поново</string>
<string name="clear_history">Очисти историју</string>
<string name="clear_history">Избриши историју</string>
<string name="nothing_found">Ништа није пронађено</string>
<string name="history_is_empty">Још нема историје</string>
<string name="read">Читај</string>
@@ -29,23 +29,23 @@
<string name="create_shortcut">Направи пречицу…</string>
<string name="invalid_port_number">Неважећи број порта</string>
<string name="search_manga">Претражи мангу</string>
<string name="by_name">Име</string>
<string name="clear_pages_cache">Обришите кеш странице</string>
<string name="by_name">Имену</string>
<string name="clear_pages_cache">Избриши кеш странице</string>
<string name="manga_downloading_">Преузимање…</string>
<string name="switch_pages">Окретање страница</string>
<string name="switch_pages">Листање страница</string>
<string name="delete_manga">Избриши мангу</string>
<string name="search_on_s">Претрага по %s</string>
<string name="internal_storage">Интерна меморија</string>
<string name="internal_storage">Унутрашња меморија</string>
<string name="external_storage">Спољна меморија</string>
<string name="language">Језик</string>
<string name="allow_unstable_updates">Дозволите нестабилна ажурирања</string>
<string name="allow_unstable_updates">Дозволи нестабилна ажурирања</string>
<string name="text_file_sizes">B|kB|MB|GB|TB</string>
<string name="standard">Стандардни</string>
<string name="webtoon">Манхва</string>
<string name="read_mode">Режим читања</string>
<string name="grid_size">Величина мреже</string>
<string name="clear_thumbs_cache">Обришите кеш сличица</string>
<string name="clear_search_history">Обришите историју претраге</string>
<string name="clear_thumbs_cache">Избриши кеш сличица</string>
<string name="clear_search_history">Избриши историју претраге</string>
<string name="gestures_only">Само покрети</string>
<string name="app_update_available">Доступна је нова верзија апликације</string>
<string name="open_in_browser">Отворите у веб прегледачу</string>
@@ -57,21 +57,21 @@
<string name="app_version">Верзија %s</string>
<string name="black_dark_theme">Црна</string>
<string name="black_dark_theme_summary">Троши мање енергије на AMOLED екранима</string>
<string name="show_pages_numbers">Нумерисање страница</string>
<string name="preload_pages">Претходно учитавање страница</string>
<string name="show_pages_numbers">Приказ бројева на страницама</string>
<string name="preload_pages">Преучитавање страница</string>
<string name="appearance">Изглед</string>
<string name="check_new_chapters_title">Проверите да ли постоје нова поглавља и обавестите их</string>
<string name="show_notification_new_chapters_on">Добићете обавештења о ажурирањима манге коју читате</string>
<string name="show_notification_new_chapters_on">Добићеш обавештења о ажурирањима манге коју читаш</string>
<string name="default_mode">Подразумевани режим</string>
<string name="network_unavailable">Мрежа није доступна</string>
<string name="network_unavailable_hint">Укључите Wi-Fi или мобилну мрежу да бисте читали мангу на мрежи</string>
<string name="allow_unstable_updates_summary">Понуди ажурирања за бета верзије апликације</string>
<string name="allow_unstable_updates_summary">Добијај обавештења о нестабилним верзијама апликације</string>
<string name="translations">Преводи</string>
<string name="data_and_privacy">Подаци и приватност</string>
<string name="network">Мрежа</string>
<string name="show_pages_numbers_summary">Прикажите бројеве страница у доњем углу</string>
<string name="pages_animation_summary">Анимација окретања страница</string>
<string name="images_proxy_title">Проки сервер за оптимизацију слика</string>
<string name="images_proxy_title">Прокси сервер за оптимизацију слика</string>
<string name="username">Корисничко име</string>
<string name="reader_info_bar_summary">Прикажите тренутно време и напредак читања на врху екрана</string>
<string name="authorization_optional">Ауторизација (опционално)</string>
@@ -80,8 +80,8 @@
<string name="details_button_tip">Притисните и држите дугме за читање да бисте видели више опција</string>
<string name="computing_">Рачунање…</string>
<string name="search">Претражи</string>
<string name="by_rating">Оцена</string>
<string name="sort_order">Редослед распоређивања</string>
<string name="by_rating">Оцени</string>
<string name="sort_order">Распореди по</string>
<string name="newest">Најновије</string>
<string name="light">Светла</string>
<string name="dark">Мрачна</string>
@@ -91,13 +91,13 @@
<string name="pages">Странице</string>
<string name="operation_not_supported">Ова операција није подржана</string>
<string name="error">Грешка</string>
<string name="new_chapters">Нова поглавља</string>
<string name="new_chapters">Новим поглављима</string>
<string name="notifications_settings">Подешавања обавештења</string>
<string name="new_version_s">Нова верзија: %s</string>
<string name="about_app_translation_summary">Преведите ову апликацију</string>
<string name="about_app_translation">Превод</string>
<string name="screenshots_policy">Политика снимања екрана</string>
<string name="clear_network_cache">Очистите мрежну кеш меморију</string>
<string name="clear_network_cache">Избриши мрежну кеш меморију</string>
<string name="password">Лозинка</string>
<string name="show_in_grid_view">Прикажи као мрежу</string>
<string name="page_saved">Сачувано</string>
@@ -105,17 +105,17 @@
<string name="processing_">Обрада…</string>
<string name="download_complete">Преузето</string>
<string name="downloads">Преузимања</string>
<string name="popular">Популарно</string>
<string name="updated">Ажуриран</string>
<string name="popular">Популарности</string>
<string name="updated">Ажурирано</string>
<string name="text_clear_history_prompt">Трајно избрисати сву историју читања\?</string>
<string name="remove">Уклони</string>
<string name="save_page">Сачувај страницу</string>
<string name="share_image">Подели слику</string>
<string name="text_file_not_supported">Изаберите ZIP датотеку или CBZ датотеку.</string>
<string name="no_description">Нема описа</string>
<string name="taps_on_edges">Додири по ивицама</string>
<string name="taps_on_edges">Додирни по ивицама</string>
<string name="reader_settings">Подешавања читача</string>
<string name="volume_buttons">Дугмад за јачину звука</string>
<string name="volume_buttons">Притисни дугмад за јачину звука</string>
<string name="notifications">Обавештења</string>
<string name="pages_cache">Кеш страница</string>
<string name="text_shelf_holder_secondary">Пронађите шта да читате у одељку „Преглед“</string>
@@ -132,7 +132,7 @@
<string name="favourites_categories">Омиљене категорије</string>
<string name="remove_category">Избриши</string>
<string name="enabled_d_of_d" tools:ignore="PluralsCandidate">Омогућено је %1$d од %2$d</string>
<string name="clear">Очисти</string>
<string name="clear">Избриши</string>
<string name="text_history_holder_primary">Оно што прочитате биће приказано овде</string>
<string name="delete">Избриши</string>
<string name="search_history_cleared">Очишћено</string>
@@ -160,7 +160,7 @@
<string name="download_started">Преузимање је почело</string>
<string name="categories">Категорије</string>
<string name="tracking">Пратим</string>
<string name="progress">Напредак</string>
<string name="progress">Напредку</string>
<string name="cancel_all">Откажи све</string>
<string name="sync_host_description">Можеш да користиш сервер за синхронизацију који се самостално хостује или подразумевани. Не мењај ово ако ниси сигуран шта радиш.</string>
<string name="error_corrupted_file">Враћени су неважећи подаци или је датотека оштећена</string>
@@ -181,20 +181,20 @@
<string name="disable_all">Онемогући све</string>
<string name="tracker_wifi_only_summary">Не проверавај да ли постоје нова поглавља користећи мрежне везе са ограничењем</string>
<string name="error_multiple_states_not_supported">Овај извор манга не подржава филтрирање према више стања</string>
<string name="order_added">Додато</string>
<string name="order_added">Додатим</string>
<string name="source_summary_pattern">%1$s, %2$s</string>
<string name="enable_logging">Омогући дијагностику</string>
<string name="on_device">На уређају</string>
<string name="download_option_whole_manga">Цела манга</string>
<string name="settings_apply_restart_required">Поново покрени апликацију да би применио ове промене</string>
<string name="rotate_screen">Окрени екран</string>
<string name="text_clear_updates_feed_prompt">Трајно избрисати сву историју ажурирања?</string>
<string name="text_clear_updates_feed_prompt">Трајно избриши сву историју ажурирања?</string>
<string name="source_disabled">Извор је онемогућен</string>
<string name="backup_frequency">Учесталост прављења резервне копије</string>
<string name="clear_cookies_summary">Може помоћи у случају неких проблема. Сва овлашћења ће бити поништена</string>
<string name="enable_logging_summary">Снима неке радње у сврху отклањања грешака. Немојте ово укључивати ако нисте сигурни шта радите</string>
<string name="suggestions_enable">Омогући предлоге</string>
<string name="clear_feed">Очисти фид</string>
<string name="clear_feed">Очисти новости</string>
<string name="welcome">Добродошли</string>
<string name="chapters_empty">Нема поглавља у овој манги</string>
<string name="content_type_hentai">Хентаи</string>
@@ -208,7 +208,7 @@
<string name="import_completed">Увоз је завршен</string>
<string name="different_languages">Други језици</string>
<string name="show_reading_indicators">Показатељ током читања</string>
<string name="read_later">Читај касније</string>
<string name="read_later">За касније</string>
<string name="backup_saved">Резервна копија је сачувана</string>
<string name="local_manga_processing">Сачувана обрада манге</string>
<string name="user_agent">Заглавље КорисничкогАгент-а</string>
@@ -259,7 +259,7 @@
<string name="invalid_value_message">Погрешна вредност</string>
<string name="downloads_cancelled">Преузимања су отказана</string>
<string name="webtoon_zoom">Webtoon увећање</string>
<string name="various_languages">Разни језици</string>
<string name="various_languages">Сви језици</string>
<string name="removal_completed">Уклањање је завршено</string>
<string name="theme_name_miku">Мику</string>
<string name="edit">Уреди</string>
@@ -271,7 +271,7 @@
<string name="directories">Директоријуми</string>
<string name="local_manga_directories">Локални директорији манги</string>
<string name="manage_categories">Управљај категоријама</string>
<string name="update">Ажурирање</string>
<string name="update">Ажурирај</string>
<string name="scrobbling_empty_hint">Да бисте пратили напредак читања, изаберите Изборник → Прати на екрану са детаљима манге.</string>
<string name="removed_from_history">Уклоњено из историје</string>
<string name="no_manga_sources_found">Вашим упитом није пронађен ниједан доступан извор манге</string>
@@ -282,7 +282,7 @@
<string name="port">Прикључак</string>
<string name="color_correction_hint">Изабрана подешавања боја биће запамћена за ову мангу</string>
<string name="not_found_404">Садржај није пронађен или је уклоњен</string>
<string name="feed_will_update_soon">Ажурирање фида ће ускоро почети</string>
<string name="feed_will_update_soon">Ажурирање новости ће ускоро почети</string>
<string name="appwidget_recent_description">Ваша недавно прочитана манга</string>
<string name="got_it">Разумем</string>
<string name="type">Тип</string>
@@ -293,7 +293,7 @@
<string name="disable_battery_optimization_summary">Помаже код провера ажурирања у позадини</string>
<string name="auth_not_supported_by">Пријављивање на %s није подржано</string>
<string name="status_on_hold">На чекању</string>
<string name="last_2_hours">Последња 2 сата</string>
<string name="last_2_hours">Од последња 2 сата</string>
<string name="periodic_backups">Повремене резервне копије</string>
<string name="reader_zoom_buttons">Прикажи дугмад за увећање и смањивање</string>
<string name="name">Име</string>
@@ -311,7 +311,7 @@
<string name="main_screen_sections">Одељци главног екрана</string>
<string name="confirm_exit">Притисни Назад поново да изађеш</string>
<string name="scale_mode">Режим скалирања</string>
<string name="advanced">Напредно</string>
<string name="advanced">Напредна</string>
<string name="only_using_wifi">Само на ВиФи-ју</string>
<string name="sync_settings">Подешавања синхронизације</string>
<string name="back">Назад</string>
@@ -348,7 +348,7 @@
<string name="history_shortcuts_summary">Учини недавну мангу доступном дугим притиском на икону апликације</string>
<string name="automatic_scroll">Самостално померање</string>
<string name="download_option_first_n_chapters">Прво %s</string>
<string name="keep_screen_on">Остави екран укљученим</string>
<string name="keep_screen_on">Задржи екран укљученим</string>
<string name="reverse">Уназад</string>
<string name="track_sources">Потражи ажурирања</string>
<string name="paused">Заустављено</string>
@@ -389,7 +389,7 @@
<string name="sync">Синхронизација</string>
<string name="search_chapters">Пронађи поглавље</string>
<string name="exit_confirmation">Потврда изласка</string>
<string name="manual">Упутство</string>
<string name="manual">Ручном избору</string>
<string name="comics_archive">Архива стрипова</string>
<string name="custom_directory">Прилагођени директоријум</string>
<string name="more">Више</string>
@@ -440,7 +440,7 @@
<string name="chapters_will_removed_background">Поглавља ће бити уклоњена у позадини</string>
<string name="import_completed_hint">Можете да избришете оригиналну датотеку из складишта за уштеду простора</string>
<string name="theme_name_rikka">Рикка</string>
<string name="disabled">Онемогућено</string>
<string name="disabled">Онемогући</string>
<string name="long_ago">Давно</string>
<string name="reader_control_ltr_summary">Додиром на десну ивицу или притиском на десну стрелицу пребацује се на следећу страницу</string>
<string name="incognito_mode">Режим без чувања</string>
@@ -496,7 +496,7 @@
<string name="preparing_">Припрема се…</string>
<string name="exit_confirmation_summary">Притисни Назад двапут да би изашао из апликације</string>
<string name="bookmarks_removed">Обележивачи су уклоњени</string>
<string name="screenshots_block_nsfw">Блокирајте садржај за одрасле</string>
<string name="screenshots_block_nsfw">Блокирај садржај за одрасле</string>
<string name="enter_password">Унеси лозинку</string>
<string name="repeat_password">Поновите лозинку</string>
<string name="data_restored_success">Сви подаци су обновљени</string>
@@ -520,7 +520,7 @@
<string name="bookmarks">Обележивачи</string>
<string name="show_all">Покажи све</string>
<string name="this_month">Овог месеца</string>
<string name="today">Данас</string>
<string name="today">Од данас</string>
<string name="empty_favourite_categories">Нема омиљених категорија</string>
<string name="invalid_domain_message">Неважећи домен</string>
<string name="system_default">Подразумевано</string>
@@ -539,4 +539,8 @@
<string name="skip">Прескочи</string>
<string name="color_correction_apply_text">Ова подешавања се могу применити глобално или само на тренутну мангу. Ако се примењују глобално, појединачна подешавања неће бити замењена.</string>
<string name="grayscale">Сиви тон</string>
<string name="welcome_text">Изабери које изворе садржаја желиш да омогућиш. Ово можеш касније да промениш у подешавањима</string>
<string name="restore">Поврати</string>
<string name="backup_date_">Датум резервне копије: %s</string>
<string name="sync_auth">Пријавите се за синхронизацију налога</string>
</resources>

View File

@@ -539,4 +539,8 @@
<string name="color_correction_apply_text">Ці налаштування можна застосувати глобально або лише до поточної манґи. Користувацькі налаштування не будуть замінені, якщо застосовувати їх глобально.</string>
<string name="grayscale">Відтінки сірого</string>
<string name="disable_battery_optimization_summary_downloads">Може допомогти з початком завантаження, якщо у вас виникають проблеми з нею</string>
<string name="welcome_text">Виберіть, які джерела вмісту ви хочете включити. Це також можна налаштувати пізніше в налаштуваннях</string>
<string name="restore">Відновити</string>
<string name="backup_date_">Дата створення резервної копії: %s</string>
<string name="sync_auth">Увійдіть, щоб синхронізувати обліковий запис</string>
</resources>

View File

@@ -3,6 +3,7 @@
<style name="Base.V23.Kotatsu" parent="Base.Theme.Kotatsu">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style>
<style name="Theme.Kotatsu" parent="Base.V23.Kotatsu" />

View File

@@ -2,7 +2,6 @@
<resources>
<style name="Base.V27.Kotatsu" parent="Base.V23.Kotatsu">
<item name="android:navigationBarColor">@color/navigation_bar_scrim</item>
<item name="android:windowLightNavigationBar">@bool/light_navigation_bar</item>
</style>

View File

@@ -3,14 +3,15 @@
<style name="Base.V31.Kotatsu" parent="Base.V27.Kotatsu">
<item name="android:windowSplashScreenAnimatedIcon">@drawable/avd_splash</item>
<item name="android:windowSplashScreenBackground">@android:color/system_neutral2_50</item>
<item name="android:windowSplashScreenAnimationDuration">800</item>
<item name="android:windowSplashScreenAnimationDuration">@integer/splash_screen_duration</item>
<item name="android:windowSplashScreenBackground">@color/m3_sys_color_dynamic_light_surface</item>
</style>
<style name="Theme.Kotatsu" parent="Base.V31.Kotatsu" />
<!-- From ThemeOverlay.Material3.DynamicColors.Light -->
<style name="Theme.Kotatsu.Monet">
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="isMaterial3DynamicColorApplied">true</item>
<!-- Color palettes -->
<item name="colorPrimary">@color/m3_sys_color_dynamic_light_primary</item>

View File

@@ -25,7 +25,6 @@
<color name="status_bar_incognito">#99B39DDB</color>
<color name="warning">#E65100</color>
<color name="launcher_background">#FFFFFF</color>
<color name="splash_primary">#90CAF9</color>
<!-- Color schemes colors -->
<color name="background_miku">#E4FFFA</color>

View File

@@ -7,4 +7,6 @@
<integer name="manga_badge_max_character_count">3</integer>
<integer name="explore_buttons_columns">2</integer>
<integer name="details_description_lines">5</integer>
<integer name="splash_screen_duration">450</integer>
</resources>

View File

@@ -548,4 +548,6 @@
<string name="sync_auth">Login to sync account</string>
<string name="restore">Restore</string>
<string name="backup_date_">Backup date: %s</string>
<string name="state_upcoming">Upcoming</string>
<string name="by_name_reverse">Name reversed</string>
</resources>

View File

@@ -44,12 +44,10 @@
<!-- Bottom sheet -->
<style name="ThemeOverlay.Kotatsu.BottomSheetDialog" parent="ThemeOverlay.Material3.BottomSheetDialog">
<item name="bottomSheetStyle">@style/Widget.Kotatsu.BottomSheet.Modal</item>
<item name="android:windowAnimationStyle">@style/Animation.Kotatsu.BottomSheetDialog</item>
</style>
<style name="Widget.Kotatsu.BottomSheet.Modal" parent="Widget.Material3.BottomSheet.Modal">
<item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.Kotatsu.BottomSheet</item>
<item name="backgroundTint">?attr/m3ColorBottomMenuBackground</item>
</style>

View File

@@ -68,6 +68,7 @@
<item name="android:buttonStyle">?attr/borderlessButtonStyle</item>
<item name="android:backgroundDimAmount">0.32</item>
<item name="windowActionModeOverlay">true</item>
<item name="actionBarPopupTheme">@style/Widget.Material3.PopupMenu.ListPopupWindow</item>
<item name="actionModeStyle">@style/Widget.Kotatsu.ActionMode</item>
<item name="actionModeCloseDrawable">@drawable/abc_ic_clear_material</item>
<item name="actionModeWebSearchDrawable">@drawable/abc_ic_search_api_material</item>

View File

@@ -4,9 +4,9 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.4'
classpath 'com.android.tools.build:gradle:8.2.0'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.49'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.50'
classpath 'com.google.devtools.ksp:symbol-processing-gradle-plugin:1.9.21-1.0.15'
}
}