From 92f94389927d4b83cc821cec8773f85e5548f8f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Mon, 12 Jul 2021 12:59:34 +0000 Subject: [PATCH 001/159] App strings reworked --- app/src/main/res/values/strings.xml | 148 ++++++++++++++-------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 615dd5eb8..e9dc3e30a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,8 +6,8 @@ Local storage Favourites History - An error has occurred - Network connection error + An error occurred + Could not connect to the Internet Details Chapters List @@ -22,12 +22,12 @@ Try again Clear history Nothing found - History is empty + No history yet Read Add bookmark - You have not favourites yet - Add to favourites - Add new category + No favourites yet + Favourite + New category Add Enter category name Save @@ -36,40 +36,42 @@ Share %s Search Search manga - Manga downloading… + Downloading… Processing… - Download complete + Downloaded Downloads - By name + Name Popular Updated Newest - By rating + Rating All - Sort order + Sorting order Genre Filter Theme Light Dark + Black + Uses less power on AMOLED screens Automatic Pages Clear - Do you really want to clear all your reading history? This action cannot be undone. + Clear all reading history permanently? Remove \"%s\" removed from history \"%s\" deleted from local storage - Wait for the load to finish + Waiting for loading to finish… Save page - Page saved successful + Saved Share image Import Delete - This operation is not supported - Invalid file. Only ZIP and CBZ are supported. + Unsupported operation + Either pick a ZIP or CBZ file. No description History and cache - Clear pages cache + Clear page cache Cache B|kB|MB|GB|TB Standard @@ -78,32 +80,32 @@ Grid size Search on %s Delete manga - Do you really want to delete \"%s\" from your phone\'s local storage? \nThis operation cannot be undone. + Delete \"%s\" from device storage permanently? Reader settings Switch pages - Taps on edges + Tap edges Volume buttons Continue Warning - This operation may consume a lot of network traffic - Don`t ask again + This may download a lot of data + Don't ask again Cancelling… Error - Clear thumbnails cache + Clear thumbnail cache Clear search history - Search history cleared + Cleared Gestures only Internal storage External storage Domain - Check for updates automatically - Application update is available - Show notification if update is available + Check for new versions of the app + A new version of the app is available + Show notification if a new version is available Open in browser - This manga has %s. Do you want to save all of it? - Save manga + This manga has %s. Save all of it? + Save Notifications - Enabled %1$d of %2$d + Turned on %1$d of %2$d New chapters Notify about updates of manga you are reading Download @@ -111,61 +113,61 @@ Restart Notifications settings Notification sound - Light indicator + LED indicator Vibration - Favourites categories + Favourite categories Categories… Rename - Do you really want to remove category \"%s\" from your favourites? \nAll containing manga will be lost. - Remove category + Remove the \"%s\" category from your favourites? \nAll manga in it will be lost. + Remove It\'s kind of empty here… - You can use categories to organize your favourite manga. Press «+» to create a category + Use categories to organize your favourites. Press «+» to create a category Try to reformulate the query. - Manga you are reading will be displayed here - You can find what to read in side menu. - You have not any saved manga yet - You can save it from online sources or import from file. - Manga shelf - Recent manga - Pages animation - Manga download location + What you read is displayed here + Find what to read in the side menu. + Save something first + Save it from online sources or import files. + Shelf + Recent + Page animation + Downloads Not available - Cannot find any available storage + No available storage Other storage - Use secure connection (HTTPS) + Use secure (HTTPS) connection Done All favourites - This category is empty + Empty category Read later Updates - Here you will see the new chapters of the manga you are reading + New chapters of what you are reading are shown here Search results Related New version: %s Size: %s Waiting for network… Clear updates feed - Updates feed cleared + Cleared Rotate screen Update Feed update will start soon - Check updates for manga - Don`t check + Look for updates + Don't check Enter password Wrong password - Protect application - Ask for password on application start + Protect the app + Ask for password when starting Kotatsu Repeat password - Passwords do not match + Mismatching passwords About Version %s Check for updates Checking for updates… - Update check failed + Could not look for updates No updates available - Right to left - Prefer Right to left reader - You can set up the reading mode for each manga separately + Right-to-left ← + Prefer right-to-left reader + Reading mode can be set up separately for each file New category Create issue on GitHub Scale mode @@ -173,51 +175,49 @@ Fit to height Fit to width Keep at start - Black dark theme - Useful for AMOLED screens - Restart required + App restart required Create data backup Restore from backup Data restored Preparing… File not found - All data restored successfully - The data restored, but there are errors - You can create backup of your history and favourites and restore it + All data restored + The data restored, but with errors + Create a backup of your history and favourites to be restored later Just now Yesterday Long ago Group Today Tap to try again - Chosen configuration will be remembered for this manga + Chosen configuration will be remembered for this file Silent - CAPTCHA is required + CAPTCHA required Solve Clear cookies - All cookies was removed + Removed Checking for new chapters: %1$d of %2$d Clear feed - All updates history will be cleared and this action cannot be undone. Are you sure? - New chapters checking + Clear all update history permanently? + New-chapter check Reverse Sign in - You should authorize to view this content + Authorise viewing this content Default: %s …and %1$d more Next - Enter password that will be required when the application starts + Enter password required to start the app Confirm - Password must be at least 4 characters + Use four characters or more Hide toolbar when scrolling Search only on %s - Do you really want to remove all recent search queries? This action cannot be undone. + Remove all recent search queries permanently? Other Languages Welcome Description - Backup saved successfully - Some manufacturers can change the system behavior, which may breaks background tasks. + Saved + Some devices have different system behavior, which may break background tasks. Read more - \ No newline at end of file + From e6b6a6bb37af1bc187a91411784c1aa92265e511 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 12 Jul 2021 20:29:14 +0300 Subject: [PATCH 002/159] Update app/src/main/res/values/strings.xml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Allan Nordhøy --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9dc3e30a..83a84c363 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -167,7 +167,7 @@ No updates available Right-to-left ← Prefer right-to-left reader - Reading mode can be set up separately for each file + Reading mode can be set up separately for each series New category Create issue on GitHub Scale mode From 550dfa9c9e26333d436721e303206893afa8ed96 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 12 Jul 2021 20:29:30 +0300 Subject: [PATCH 003/159] Update app/src/main/res/values/strings.xml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Allan Nordhøy --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83a84c363..b7b7ccbd2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -191,7 +191,7 @@ Group Today Tap to try again - Chosen configuration will be remembered for this file + Chosen configuration will be remembered for this series Silent CAPTCHA required Solve From bb685751cd0786f97e7e256fb34ed2d8b62eb67e Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 3 Oct 2021 20:09:47 +0300 Subject: [PATCH 004/159] Change Readmanga domain + set User-Agent --- .../core/parser/site/GroupleRepository.kt | 17 +++++++++++------ .../core/parser/site/ReadmangaRepository.kt | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt index 2d35111e8..1f5e666c3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.core.parser.site +import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Response import org.koitharu.kotatsu.base.domain.MangaLoaderContext @@ -39,14 +40,14 @@ abstract class GroupleRepository(loaderContext: MangaLoaderContext) : getSortKey( sortOrder ) - }&offset=${offset upBy PAGE_SIZE}" + }&offset=${offset upBy PAGE_SIZE}", HEADER ) tags.size == 1 -> loaderContext.httpGet( "https://$domain/list/genre/${tags.first().key}?sortType=${ getSortKey( sortOrder ) - }&offset=${offset upBy PAGE_SIZE}" + }&offset=${offset upBy PAGE_SIZE}", HEADER ) offset > 0 -> return emptyList() else -> advancedSearch(domain, tags) @@ -104,7 +105,7 @@ abstract class GroupleRepository(loaderContext: MangaLoaderContext) : } override suspend fun getDetails(manga: Manga): Manga { - val doc = loaderContext.httpGet(manga.url.withDomain()).parseHtml() + val doc = loaderContext.httpGet(manga.url.withDomain(), HEADER).parseHtml() val root = doc.body().getElementById("mangaBox")?.selectFirst("div.leftContent") ?: throw ParseException("Cannot find root") return manga.copy( @@ -136,7 +137,7 @@ abstract class GroupleRepository(loaderContext: MangaLoaderContext) : } override suspend fun getPages(chapter: MangaChapter): List { - val doc = loaderContext.httpGet(chapter.url.withDomain() + "?mtr=1").parseHtml() + val doc = loaderContext.httpGet(chapter.url.withDomain() + "?mtr=1", HEADER).parseHtml() val scripts = doc.select("script") for (script in scripts) { val data = script.html() @@ -163,7 +164,7 @@ abstract class GroupleRepository(loaderContext: MangaLoaderContext) : } override suspend fun getTags(): Set { - val doc = loaderContext.httpGet("https://${getDomain()}/list/genres/sort_name").parseHtml() + val doc = loaderContext.httpGet("https://${getDomain()}/list/genres/sort_name", HEADER).parseHtml() val root = doc.body().getElementById("mangaBox")?.selectFirst("div.leftContent") ?.selectFirst("table.table") ?: parseFailed("Cannot find root") return root.select("a.element-link").mapToSet { a -> @@ -188,7 +189,7 @@ abstract class GroupleRepository(loaderContext: MangaLoaderContext) : private suspend fun advancedSearch(domain: String, tags: Set): Response { val url = "https://$domain/search/advanced" // Step 1: map catalog genres names to advanced-search genres ids - val tagsIndex = loaderContext.httpGet(url).parseHtml() + val tagsIndex = loaderContext.httpGet(url, HEADER).parseHtml() .body().selectFirst("form.search-form") ?.select("div.form-group") ?.get(1) ?: parseFailed("Genres filter element not found") @@ -226,5 +227,9 @@ abstract class GroupleRepository(loaderContext: MangaLoaderContext) : private const val PAGE_SIZE = 70 private const val PAGE_SIZE_SEARCH = 50 + val HEADER = Headers.Builder() + .add("User-Agent", "readmangafun") + .build() } + } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt index 3871a966f..ab95903d5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/ReadmangaRepository.kt @@ -5,6 +5,6 @@ import org.koitharu.kotatsu.core.model.MangaSource class ReadmangaRepository(loaderContext: MangaLoaderContext) : GroupleRepository(loaderContext) { - override val defaultDomain = "readmanga.live" + override val defaultDomain = "readmanga.io" override val source = MangaSource.READMANGA_RU } \ No newline at end of file From be0c8f2c964fecdff19fef9cb8a53c64957663c4 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 3 Oct 2021 20:13:05 +0300 Subject: [PATCH 005/159] Add manga status label to details screen --- .../kotatsu/details/ui/DetailsFragment.kt | 31 ++++++++++++++++++- .../main/res/drawable/ic_state_finished.xml | 5 +++ .../main/res/drawable/ic_state_ongoing.xml | 6 ++++ .../main/res/drawable/ic_state_unknown.xml | 5 +++ .../layout-w600dp-land/fragment_details.xml | 17 +++++++++- .../layout-w600dp-port/fragment_details.xml | 17 +++++++++- app/src/main/res/layout/fragment_details.xml | 17 +++++++++- app/src/main/res/values-ru/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ 9 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/ic_state_finished.xml create mode 100644 app/src/main/res/drawable/ic_state_ongoing.xml create mode 100644 app/src/main/res/drawable/ic_state_unknown.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index a427f2b3e..bf43e2220 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -5,6 +5,7 @@ import android.text.Spanned import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.Insets import androidx.core.net.toUri import androidx.core.text.parseAsHtml @@ -23,13 +24,13 @@ import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.core.model.MangaSource +import org.koitharu.kotatsu.core.model.MangaState import org.koitharu.kotatsu.databinding.FragmentDetailsBinding import org.koitharu.kotatsu.favourites.ui.categories.select.FavouriteCategoriesDialog import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.utils.FileSizeUtils import org.koitharu.kotatsu.utils.ext.* -import kotlin.random.Random class DetailsFragment : BaseFragment(), View.OnClickListener, View.OnLongClickListener { @@ -52,6 +53,8 @@ class DetailsFragment : BaseFragment(), View.OnClickList private fun onMangaUpdated(manga: Manga) { with(binding) { + + // Main imageViewCover.newImageRequest(manga.largeCoverUrl ?: manga.coverUrl) .referer(manga.publicUrl) .fallback(R.drawable.ic_placeholder) @@ -66,6 +69,28 @@ class DetailsFragment : BaseFragment(), View.OnClickList textViewDescription.text = manga.description?.parseAsHtml()?.takeUnless(Spanned::isBlank) ?: getString(R.string.no_description) + when (manga.state) { + MangaState.FINISHED -> { + textViewState.apply { + text = resources.getString(R.string.state_finished) + drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_finished, context.theme) + } + } + MangaState.ONGOING -> { + textViewState.apply { + text = resources.getString(R.string.state_ongoing) + drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_ongoing, context.theme) + } + } + else -> { + textViewState.apply { + text = resources.getString(R.string.state_unknown) + drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_unknown, context.theme) + } + } + } + + // Info containers if (manga.chapters?.isNotEmpty() == true) { chaptersContainer.isVisible = true textViewChapters.text = manga.chapters.let { @@ -96,10 +121,14 @@ class DetailsFragment : BaseFragment(), View.OnClickList } else { sizeContainer.isVisible = false } + + // Buttons buttonFavorite.setOnClickListener(this@DetailsFragment) buttonRead.setOnClickListener(this@DetailsFragment) buttonRead.setOnLongClickListener(this@DetailsFragment) buttonRead.isEnabled = !manga.chapters.isNullOrEmpty() + + // Chips bindTags(manga) } } diff --git a/app/src/main/res/drawable/ic_state_finished.xml b/app/src/main/res/drawable/ic_state_finished.xml new file mode 100644 index 000000000..84c2e8961 --- /dev/null +++ b/app/src/main/res/drawable/ic_state_finished.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_state_ongoing.xml b/app/src/main/res/drawable/ic_state_ongoing.xml new file mode 100644 index 000000000..4b642a0d2 --- /dev/null +++ b/app/src/main/res/drawable/ic_state_ongoing.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_state_unknown.xml b/app/src/main/res/drawable/ic_state_unknown.xml new file mode 100644 index 000000000..1b82bf426 --- /dev/null +++ b/app/src/main/res/drawable/ic_state_unknown.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout-w600dp-land/fragment_details.xml b/app/src/main/res/layout-w600dp-land/fragment_details.xml index f1b1f770c..c8bdefeb2 100644 --- a/app/src/main/res/layout-w600dp-land/fragment_details.xml +++ b/app/src/main/res/layout-w600dp-land/fragment_details.xml @@ -6,6 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" + android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + diff --git a/app/src/main/res/layout-w600dp-port/fragment_details.xml b/app/src/main/res/layout-w600dp-port/fragment_details.xml index e9d6d8eed..d23a53352 100644 --- a/app/src/main/res/layout-w600dp-port/fragment_details.xml +++ b/app/src/main/res/layout-w600dp-port/fragment_details.xml @@ -6,6 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" + android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml index de9d42076..e3a49813b 100644 --- a/app/src/main/res/layout/fragment_details.xml +++ b/app/src/main/res/layout/fragment_details.xml @@ -6,6 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" + android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + @@ -277,12 +292,12 @@ android:layout_height="wrap_content" android:indeterminate="true" android:visibility="gone" - app:showAnimationBehavior="inward" app:hideAnimationBehavior="outward" app:layout_constraintBottom_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + app:showAnimationBehavior="inward" tools:visibility="visible" /> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 862eb79f5..040b32e6b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -237,4 +237,7 @@ Авторизация в %s не поддерживается Вы выйдете из всех источников, в которых Вы авторизованы Жанры + Завершено + Онгоинг + Неизвестно \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e09f1ba22..d79933964 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -240,4 +240,7 @@ Authorization on %s is not supported You will be logged out from all sources that you are authorized in Genres + Finished + Ongoing + Unknown \ No newline at end of file From c5921f8a62fed7782c57c8e28da73d8f3035eefe Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 3 Oct 2021 20:13:49 +0300 Subject: [PATCH 006/159] Minor interface adjustments --- .../java/org/koitharu/kotatsu/search/ui/SearchActivity.kt | 3 +++ app/src/main/res/layout/fragment_chapters.xml | 1 + app/src/main/res/layout/item_current_filter.xml | 4 +++- app/src/main/res/layout/item_filter_header.xml | 4 +--- app/src/main/res/values/dimens.xml | 2 +- app/src/main/res/values/styles.xml | 1 + 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt index 7221f6d11..cf05ff106 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt @@ -51,6 +51,9 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery left = insets.left, right = insets.right ) + binding.container.updatePadding( + bottom = insets.bottom + ) } override fun onQueryTextSubmit(query: String?): Boolean { diff --git a/app/src/main/res/layout/fragment_chapters.xml b/app/src/main/res/layout/fragment_chapters.xml index 755056519..72b02995e 100644 --- a/app/src/main/res/layout/fragment_chapters.xml +++ b/app/src/main/res/layout/fragment_chapters.xml @@ -26,6 +26,7 @@ android:layout_alignParentStart="true" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" + android:clipToPadding="false" android:orientation="vertical" android:scrollbarStyle="outsideOverlay" app:fastScrollEnabled="true" diff --git a/app/src/main/res/layout/item_current_filter.xml b/app/src/main/res/layout/item_current_filter.xml index 1014b0fdd..363c385d4 100644 --- a/app/src/main/res/layout/item_current_filter.xml +++ b/app/src/main/res/layout/item_current_filter.xml @@ -3,7 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:paddingStart="8dp" + android:paddingEnd="8dp"> \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index da8545884..d97a88bd7 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -20,7 +20,7 @@ 120dp 46dp 120dp - 34dp + 48dp 16dp 36dp 48dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 285d771f8..399534df8 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -48,6 +48,7 @@ ?attr/colorPrimary @android:color/transparent ?attr/colorPrimary + ?attr/colorPrimary 12sp From af114d74df20dbb60d0f4c1fe3a58cad109a0de5 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 3 Oct 2021 20:25:08 +0300 Subject: [PATCH 007/159] Add new source: MangaOwl --- .../kotatsu/core/model/MangaSource.kt | 3 +- .../kotatsu/core/parser/ParserModule.kt | 1 + .../core/parser/site/MangaOwlRepository.kt | 159 ++++++++++++++++++ 3 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt index f881a59f0..10cc61c91 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/MangaSource.kt @@ -39,7 +39,8 @@ enum class MangaSource( NINEMANGA_IT("NineManga Italiano", "it", NineMangaRepository.Italiano::class.java), NINEMANGA_BR("NineManga Brasil", "pt", NineMangaRepository.Brazil::class.java), NINEMANGA_FR("NineManga Français", "fr", NineMangaRepository.Francais::class.java), - EXHENTAI("ExHentai", null, ExHentaiRepository::class.java) + EXHENTAI("ExHentai", null, ExHentaiRepository::class.java), + MANGAOWL("MangaOwl", "en", MangaOwlRepository::class.java) ; @get:Throws(NoBeanDefFoundException::class) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt index 361bdfa61..d63676a44 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt @@ -33,4 +33,5 @@ val parserModule factory(named(MangaSource.NINEMANGA_IT)) { NineMangaRepository.Italiano(get()) } factory(named(MangaSource.NINEMANGA_FR)) { NineMangaRepository.Francais(get()) } factory(named(MangaSource.EXHENTAI)) { ExHentaiRepository(get()) } + factory(named(MangaSource.MANGAOWL)) { MangaOwlRepository(get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt new file mode 100644 index 000000000..768463562 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt @@ -0,0 +1,159 @@ +package org.koitharu.kotatsu.core.parser.site + +import org.koitharu.kotatsu.base.domain.MangaLoaderContext +import org.koitharu.kotatsu.core.exceptions.ParseException +import org.koitharu.kotatsu.core.model.* +import org.koitharu.kotatsu.core.parser.RemoteMangaRepository +import org.koitharu.kotatsu.utils.ext.* +import java.util.* + +class MangaOwlRepository(loaderContext: MangaLoaderContext) : RemoteMangaRepository(loaderContext) { + + override val source = MangaSource.MANGAOWL + + override val defaultDomain = "mangaowls.com" + + override val sortOrders: Set = EnumSet.of( + SortOrder.POPULARITY, + SortOrder.NEWEST, + SortOrder.UPDATED + ) + + override suspend fun getList2( + offset: Int, + query: String?, + tags: Set?, + sortOrder: SortOrder?, + ): List { + val page = (offset / 36f).toIntUp().inc() + val link = buildString { + append("https://") + append(getDomain()) + when { + !query.isNullOrEmpty() -> { + append("/search/${page}?search=") + append(query.urlEncoded()) + } + !tags.isNullOrEmpty() -> { + for (tag in tags) { + append(tag.key) + } + append("/${page}?type=${getAlternativeSortKey(sortOrder)}") + } + else -> { + append("/${getSortKey(sortOrder)}/${page}") + } + } + } + val doc = loaderContext.httpGet(link).parseHtml() + val slides = doc.body().select("ul.slides") ?: parseFailed("An error occurred while parsing") + val items = slides.select("div.col-md-2") + return items.mapNotNull { item -> + val href = item.select("h6 a").attr("href") ?: return@mapNotNull null + Manga( + id = generateUid(href), + title = item.select("h6 a").text(), + coverUrl = item.select("div.img-responsive").attr("abs:data-background-image"), + altTitle = item.select("h6 a").attr("alt") ?: return@mapNotNull null, + author = null, + rating = runCatching { + item.selectFirst("div.block-stars") + ?.text() + ?.toFloatOrNull() + ?.div(10f) + }.getOrNull() ?: Manga.NO_RATING, + url = href, + publicUrl = href.withDomain(), + source = source + ) + } + } + + override suspend fun getDetails(manga: Manga): Manga { + val doc = loaderContext.httpGet(manga.publicUrl).parseHtml() + val info = doc.body().selectFirst("div.single_detail") ?: parseFailed("An error occurred while parsing") + val table = doc.body().selectFirst("div.single-grid-right") ?: parseFailed("An error occurred while parsing") + return manga.copy( + description = info.selectFirst(".description")?.html(), + largeCoverUrl = info.select("img").first()?.let { img -> + if (img.hasAttr("data-src")) img.attr("abs:data-src") else img.attr("abs:src") + }, + author = info.select("p.fexi_header_para a.author_link").text(), + state = parseStatus(info.select("p.fexi_header_para:contains(status)").first()?.ownText()), + tags = manga.tags + info.select("div.col-xs-12.col-md-8.single-right-grid-right > p > a[href*=genres]") + .mapNotNull { + val a = it.selectFirst("a") ?: return@mapNotNull null + MangaTag( + title = a.text(), + key = a.attr("href"), + source = source + ) + }, + chapters = table.select("div.table.table-chapter-list").select("li.list-group-item.chapter_list").asReversed().mapIndexed { i, li -> + val a = li.select("a") + val href = a.attr("href").ifEmpty { + parseFailed("Link is missing") + } + MangaChapter( + id = generateUid(href), + name = a.select("label").text(), + number = i + 1, + url = href, + source = MangaSource.MANGAOWL + ) + } + ) + } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.withDomain() + val doc = loaderContext.httpGet(fullUrl).parseHtml() + val root = doc.body().select("div.item img.owl-lazy") ?: throw ParseException("Root not found") + return root.map { div -> + val url = div?.attr("abs:data-src") ?: parseFailed("Page image not found") + MangaPage( + id = generateUid(url), + url = url, + referer = fullUrl, + source = MangaSource.MANGAOWL + ) + } + } + + private fun parseStatus(status: String?) = when { + status == null -> null + status.contains("Ongoing") -> MangaState.ONGOING + status.contains("Completed") -> MangaState.FINISHED + else -> null + } + + override suspend fun getTags(): Set { + val doc = loaderContext.httpGet("https://${getDomain()}/").parseHtml() + val root = doc.body().select("ul.dropdown-menu.multi-column.columns-3").select("li") + return root.mapToSet { p -> + val a = p.selectFirst("a") ?: parseFailed("a is null") + MangaTag( + title = a.text().toCamelCase(), + key = a.attr("href"), + source = source + ) + } + } + + private fun getSortKey(sortOrder: SortOrder?) = + when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + SortOrder.POPULARITY -> "popular" + SortOrder.NEWEST -> "new_release" + SortOrder.UPDATED -> "lastest" + else -> "lastest" + } + + private fun getAlternativeSortKey(sortOrder: SortOrder?) = + when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + SortOrder.POPULARITY -> "0" + SortOrder.NEWEST -> "2" + SortOrder.UPDATED -> "3" + else -> "3" + } + +} \ No newline at end of file From 4aab4e636d003e8ece10c32f4d1d40bcebed444f Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Mon, 4 Oct 2021 10:54:03 +0300 Subject: [PATCH 008/159] Fix display of the snackbar in details activity --- .../java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt | 5 ++++- app/src/main/res/layout-w600dp/activity_details.xml | 2 ++ app/src/main/res/layout/activity_details.xml | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 84745b56d..af987e208 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -85,13 +85,16 @@ class DetailsActivity : BaseActivity(), finishAfterTransition() } else -> { - Snackbar.make(binding.pager, e.getDisplayMessage(resources), Snackbar.LENGTH_LONG) + Snackbar.make(binding.coordinator, e.getDisplayMessage(resources), Snackbar.LENGTH_LONG) .show() } } } override fun onWindowInsetsChanged(insets: Insets) { + binding.coordinator.updatePadding( + bottom = insets.bottom + ) binding.toolbar.updatePadding( top = insets.top, left = insets.left, diff --git a/app/src/main/res/layout-w600dp/activity_details.xml b/app/src/main/res/layout-w600dp/activity_details.xml index af351d3aa..3f3832b27 100644 --- a/app/src/main/res/layout-w600dp/activity_details.xml +++ b/app/src/main/res/layout-w600dp/activity_details.xml @@ -3,8 +3,10 @@ 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/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" tools:context=".details.ui.DetailsActivity"> Date: Mon, 4 Oct 2021 10:56:01 +0300 Subject: [PATCH 009/159] MangaOwl adjustments --- .../kotatsu/core/parser/site/MangaOwlRepository.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt index 768463562..d8f8e4e00 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangaOwlRepository.kt @@ -49,12 +49,12 @@ class MangaOwlRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposit val slides = doc.body().select("ul.slides") ?: parseFailed("An error occurred while parsing") val items = slides.select("div.col-md-2") return items.mapNotNull { item -> - val href = item.select("h6 a").attr("href") ?: return@mapNotNull null + val href = item.selectFirst("h6 a")?.relUrl("href") ?: return@mapNotNull null Manga( id = generateUid(href), - title = item.select("h6 a").text(), + title = item.selectFirst("h6 a")?.text() ?: return@mapNotNull null, coverUrl = item.select("div.img-responsive").attr("abs:data-background-image"), - altTitle = item.select("h6 a").attr("alt") ?: return@mapNotNull null, + altTitle = null, author = null, rating = runCatching { item.selectFirst("div.block-stars") @@ -78,7 +78,7 @@ class MangaOwlRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposit largeCoverUrl = info.select("img").first()?.let { img -> if (img.hasAttr("data-src")) img.attr("abs:data-src") else img.attr("abs:src") }, - author = info.select("p.fexi_header_para a.author_link").text(), + author = info.selectFirst("p.fexi_header_para a.author_link")?.text(), state = parseStatus(info.select("p.fexi_header_para:contains(status)").first()?.ownText()), tags = manga.tags + info.select("div.col-xs-12.col-md-8.single-right-grid-right > p > a[href*=genres]") .mapNotNull { @@ -110,7 +110,7 @@ class MangaOwlRepository(loaderContext: MangaLoaderContext) : RemoteMangaReposit val doc = loaderContext.httpGet(fullUrl).parseHtml() val root = doc.body().select("div.item img.owl-lazy") ?: throw ParseException("Root not found") return root.map { div -> - val url = div?.attr("abs:data-src") ?: parseFailed("Page image not found") + val url = div?.relUrl("data-src") ?: parseFailed("Page image not found") MangaPage( id = generateUid(url), url = url, From ee2ed0159d62a773908affd10b084817ee6faf2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aliaksiej=20Razuma=C5=AD?= Date: Thu, 9 Sep 2021 07:59:11 +0000 Subject: [PATCH 010/159] Translated using Weblate (Belarusian) Currently translated at 100.0% (236 of 236 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/ --- app/src/main/res/values-be/strings.xml | 144 +++++++++++++------------ 1 file changed, 73 insertions(+), 71 deletions(-) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 2959c53bb..39749005a 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -1,31 +1,31 @@ - Зачыніць меню + Закрыць меню Адкрыць меню На прыладзе Абраныя Гісторыя Адбылася памылка - Памылка сеткавага падключэння + Памылка сеткавага злучэння Падрабязнасцi - Часткi + Главы Спіс Падрабязны спіс Табліца Выгляд спісу - Наладжвання - Онлайн каталогі + Налады + Анлайн крыніцы Загрузка… - Частка %1$d з %2$d - Зачыніць + Глава %1$d з %2$d + Закрыць Паўтарыць Ачысціць гісторыю Нічога не знойдзена Гісторыя пустая Чытаць Дадаць закладку - Дадайце цікавую для вас мангу ў выбранае, каб не страціць яе - Дадаць у абранае + Дадайце цікавую для вас мангу ў абранае, каб не страціць яе + Дадаць у абраныя Стварыць катэгорыю Дадаць Увядзіце назву @@ -35,11 +35,11 @@ Падзялiцца %s Пошук Пошук мангі - Загрузка мангі… + Спампоўванне мангі… Апрацоўка… - Загрузка завершана - Загрузкi - Па імя + Спампоўванне завершана + Спампоўкі + Па імю Папулярная Абноўленая Новая @@ -65,7 +65,7 @@ Імпарт Выдаліць Аперацыя не падтрымліваецца - Непадтрымоўваны файл. Падтрымліваюцца толькі ZIP і CBZ. + Файл не падтрымліваецца. Падтрымліваюцца толькі ZIP і CBZ. Няма апісання Гісторыя і кэш Ачысціць кэш старонак @@ -77,14 +77,15 @@ Памер табліцы Пошук па %s Выдаліць мангу - Настаўленні чытання + Налады чытання Гартанне старонак - Вы ўпэўненыя, што жадаеце выдаліць \"%s\" з прылады? Гэта дзеянне нельга будзе адмяніць. - Націску па краях + Вы ўпэўненыя, што жадаеце выдаліць \"%s\" з прылады\? +\nГэта дзеянне нельга будзе адмяніць. + Націск па краях Кнопкі гучнасці - Прадоўжыць - Папярэджанне - Дадзеная аперацыя можа прывесці да вялікага выдатку трафіку + Працягнцуць + Папярэджванне + Гэтае дзеянне можа прывесці да вялікага расходу трафіка Больш не пытацца Адмена… Памылка @@ -92,20 +93,20 @@ Гісторыя пошуку ачышчана Ачысціць гісторыю пошуку Толькі жэсты - Унутраны назапашвальнік + Унутранае сховішча Знешняе сховішча Дамен - Правяраць абнаўленне прыкладання - Даступна абнаўленне прыкладання + Правяраць на наяўнасць абнаўленняў + Даступна абнаўленне праграмы Паказваць апавяшчэнне пры наяўнасці новай версіі - Адкрыць у браўзэры + Адкрыць у браўзеры У гэтай манге %s. Вы ўпэўненыя, што хочаце захаваць іх усё? Захаваць мангу - Паведамлення + Паведамленні Уключана %1$d з %2$d - Новыя часткi - Апавяшчаць аб абнаўленні мангі, якую вы чытаеце - Загрузіць + Новыя главы + Апавяшчаць пра абнаўленні мангі, якую вы чытаеце + Спампаваць Чытаць з пачатку Перазапусціць Налады апавяшчэнняў @@ -115,68 +116,69 @@ Катэгорыі абранага Катэгорыi… Перайменаваць - Вы ўпэўненыя, што хочаце выдаліць катэгорыю \"%s\"? Уся манга з дадзенай катэгорыі будзе страчана. + Вы ўпэўнены, што хочаце выдаліць катэгорыю \"%s\"\? +\nУся манга з дадзенай катэгорыі будзе страчана. Выдаліць катэгорыю - Катэгорыі дапамагаюць парадкаваць выбраную мангу. Націсніце «+», каб стварыць катэгорыю - Полка з мангай + Катэгорыі дапамагаюць упарадкоўваць абраную мангу. Націсніце «+», каб стварыць катэгорыю + Паліца з мангай Нядаўняя манга Анімацыя гартання - Месца захавання мангі + Месца спампоўвання мангі Недаступна - Не атрымалася знайсці ні аднаго даступнага сховішчы + Не атрымалася знайсці ніводнага даступнага сховішча Іншае сховішча - Абароненае злучэнне (HTTPS) + Бяспечнае злучэнне (HTTPS) Гатова - Усё выбранае + Усе абраныя У гэтай катэгорыі нічога няма Прачытаць пазней - Абнаўлення - Тут будуць адлюстроўвацца абнаўлення мангі, якую вы чытаеце + Абнаўленні + Тут будуць паказвацца абнаўлення мангі, якую вы чытаеце Вынікі пошуку Падобныя Новая версія: %s Памер: %s - Чаканне падлучэння… + Чаканне злучэння… Ачысціць стужку абнаўленняў Стужка абнаўленняў ачышчана Павярнуць экран Абнавіць Абнаўленне хутка пачнецца - Правяраць абнаўлення мангі + Правяраць абнаўленні мангі Не правяраць Увядзіце пароль - Няправільны пароль - Абараніць прыкладанне - Запытваць пароль пры запуску прыкладання + Няверны пароль + Абараніць праграму + Запытваць пароль пры запуску праграмы Паўтарыце пароль Паролі не супадаюць Аб праграме Версія %s - Праверыць абнаўлення - Праверка абнаўлення… - Памылка пры праверцы абнаўлення + Праверыць абнаўленні + Праверка абнаўленняў… + Памылка пры праверцы абнаўленняў Няма даступных абнаўленняў Справа налева - Аддаваць перавагу рэжым Справа налева + Аддаваць перавагу рэжыму Справа налева Вы можаце наладзіць рэжым чытання для кожнай мангі асобна Стварыць катэгорыю - Стварыць праблему на GitHub + Пачаць абмеркаванне праблемы на GitHub Маштабаванне - Ўпісаць у экран + Умясціць у экран Падагнаць па вышыні Падагнаць па шырыні Зыходны памер Чорная цёмная тэма Карысна для AMOLED экранаў - Патрабуецца перазапуск - Рэзервовае капіраванне + Патрэбны перазапуск + Рэзервовае капіяванне і аднаўленне Стварыць рэзервовую копію - Аднавіць дадзеныя - Дадзеныя адноўлены + Аднавіць данныя + Данныя адноўлены Падрыхтоўка… Файл не знойдзены - Усе дадзеныя паспяхова адноўлены - Дадзеныя адноўлены, але ўзніклі некаторыя памылкі + Усе данныя паспяхова адноўлены + Данныя адноўлены, але ўзніклі некаторыя памылкі Вы можаце стварыць рэзервовую копію абранага і гісторыі і потым аднавіць іх Толькі што Учора @@ -193,19 +195,19 @@ Праверка новых частак: %1$d з %2$d Ачысціць стужку Уся гісторыя абнаўленняў будзе ачышчана і яе нельга будзе вярнуць. Вы ўпэўненыя? - Праверка новых частак - У зваротным парадку + Праверка новых глаў + У адваротным парадку Увайсці Для прагляду гэтага кантэнту патрабуецца аўтарызацыя Прадвызначаны: %s …і яшчэ %1$d Далей - Калі ласка, увядзіце пароль, які спатрэбіцца пры запуску прыкладання - Пацвярджаць - Пароль павінен змяшчаць не менш за 4 сімвалаў + Калі ласка, увядзіце пароль, які спатрэбіцца пры запуску праграмы + Пацвердзіць + Пароль павінен змяшчаць не менш за 4 сімвалы Схаваць загаловак пры прагортцы Пошук толькі па %s - Вы сапраўды хочаце выдаліць усе апошнія пошукавыя запыты? Гэта дзеянне не можа быць адменена. + Вы сапраўды хочаце выдаліць усе апошнія пошукавыя запыты\? Гэта дзеянне нельга будзе адмяніць. Апісанне Падрабязна Некаторыя вытворцы могуць змяняць паводзіны сістэмы, што можа парушаць выкананне фонавых задач. @@ -213,25 +215,25 @@ Вітаю Мовы Іншыя - Вы можаце захаваць яго з онлайн-крыніц або імпартаваць з файла. - У Вас яшчэ няма ні адной захаванай мангі - Вы можаце знайсці, што пачытаць у бакавым меню. - Тут будзе адлюстроўвацца манга, якую вы чытаеце + Вы можаце захаваць мангу з анлайн-крыніц або імпартаваць з файла. + У вас яшчэ няма ніводнай захаванай мангі + Вы можаце знайсці, што пачытаць, у бакавым меню. + Тут будзе паказана манга, якую вы чытаеце Паспрабуйце перафармуляваць запыт. Тут неяк пуста… - Частка адсутнічае - Гэтая частка адсутнічае на вашым прыладзе. Загрузіце або прачытайце яе онлайн. - На дадзены момант няма актыўных загрузак + Глава адсутнічае + Гэтая глава адсутнічае на вашай прыладзе. Спампуйце ціпрачытайце яе онлайн. + На дадзены момант няма актыўных спамповак У чарзе Ліцэнзія Аўтарскія правы і ліцэнзіі Гэтыя людзі робяць Kotatsu лепш! - Падзяка - Калі вам падабаецца гэта дадатак, вы можаце дапамагчы фінансава з дапамогай Yoomoney (Яндэкс.Грошы) - Падтрымаць распрацоўніка + Падзякі + Калі вам падабаецца гэтая праграма, вы можаце дапамагчы фінансава з дапамогай ЮMoney (был. Яндекс.Деньги) + Падтрымаць распрацоўшчыка Тэма на 4PDA Зваротная сувязь Аўтар - Перавесці гэты дадатак + Дапамагчы з перакладам праграмы Пераклад \ No newline at end of file From db91458abc8358d2e8989e69a464df4a9a7e5f15 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Fri, 10 Sep 2021 03:33:25 +0000 Subject: [PATCH 011/159] Translated using Weblate (Spanish) Currently translated at 97.4% (230 of 236 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 30 ++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 72a0f75e1..cbdb85dae 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -56,8 +56,8 @@ Borrar ¿Realmente quieres borrar todo tu historial de lectura? Esta acción no se puede deshacer. Eliminar - \"%s\" retirado del historial - \"%s\" borrado del almacenamiento local + «%s» retirado del historial + «%s» borrado del almacenamiento local Espera que termine la carga Guardar página Página guardada con éxito @@ -77,7 +77,8 @@ Tamaño de la cuadrícula Buscar en %s Borrar manga - ¿Realmente quieres borrar \"%s\" del almacenamiento local de tu teléfono? \nEsta operación no se puede deshacer. + ¿Realmente quieres borrar «%s» del almacenamiento local de tu teléfono\? +\nEsta operación no se puede deshacer. Ajustes del lector Cambiar de página Tapas en los bordes @@ -115,7 +116,8 @@ Categorías favoritas Categorías… Renombrar - ¿Realmente quieres eliminar la categoría \"%s\" de tus favoritos? \nTodo el manga en ella se perderá. + ¿Realmente quieres eliminar la categoría «%s» de tus favoritos\? +\nTodo el manga en ella se perderá. Quitar categoría Puedes usar categorías para organizar tus mangas favoritos. Pulsa «+» para crear una categoría Estante de manga @@ -208,4 +210,24 @@ Puede encontrar qué leer en el menú lateral. El manga que estás leyendo se mostrará aquí Está un poco vacío aquí… + Agradecimientos + Si te gusta esta aplicación, puedes ayudar económicamente a través de Yoomoney (ex. Yandex.Money) + Apoyar al desarrollador + Buscar sólo en %s + ¡Estas personas hacen que Kotatsu sea mejor! + Licencia + Derechos de autor y licencias + Falta un capítulo + Traducir esta aplicación + Comentarios + Autor + Traducción + Actualmente no hay descargas activas + En la cola + Leer más + Copia de seguridad guardada correctamente + Descripción + Bienvenido/a + Idiomas + Otro \ No newline at end of file From 33f0eb9f38063cfc6d880bf958c71c7df5a4a503 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 16 Sep 2021 04:47:31 +0200 Subject: [PATCH 012/159] Added translation using Weblate (Finnish) --- app/src/main/res/values-fi/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-fi/strings.xml diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-fi/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From b390fd49cac3f4c32a15742f39923f489aad21d3 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 16 Sep 2021 17:06:51 +0000 Subject: [PATCH 013/159] Translated using Weblate (Belarusian) Currently translated at 100.0% (240 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/ --- app/src/main/res/values-be/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 39749005a..5216a641b 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -236,4 +236,8 @@ Аўтар Дапамагчы з перакладам праграмы Пераклад + Вы выйдзеце з усіх крыніц, у якіх вы аўтарызаваны + Аўтарызацыя на %s не падтрымліваецца + Аўтарызацыя выканана + Жанры \ No newline at end of file From 1888aba335652c3d66928599dc7ebafedc46d78c Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 16 Sep 2021 03:43:31 +0000 Subject: [PATCH 014/159] Translated using Weblate (Spanish) Currently translated at 96.6% (232 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index cbdb85dae..adc3dae97 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -230,4 +230,6 @@ Bienvenido/a Idiomas Otro + Géneros + Intenta reformular la consulta. \ No newline at end of file From a50943ed01ade2c57a24b7713b7be05c3f61bfa4 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 16 Sep 2021 03:44:35 +0000 Subject: [PATCH 015/159] Translated using Weblate (Russian) Currently translated at 99.5% (239 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/ru/ --- app/src/main/res/values-ru/strings.xml | 56 +++++++++++++------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 040b32e6b..fcd449057 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -56,8 +56,8 @@ Очистить Вы уверены, что хотите очистить историю? Это действие нельзя будет отменить. Удалить - \"%s\" удалено из истории - \"%s\" удалено с устройства + «%s» удалено из истории + «%s» удалено с устройства Дождитесь окончания загрузки Сохранить страницу Страница сохранена @@ -77,7 +77,8 @@ Размер таблицы Поиск по %s Удалить мангу - Вы уверены, что хотите удалить \"%s\" с устройства? \nЭто действие нельзя будет отменить. + Вы уверены, что хотите удалить «%s» с устройства\? +\nЭто действие нельзя будет отменить. Настройки чтения Листание страниц Нажатия по краям @@ -115,7 +116,8 @@ Категории избранного Категории… Переименовать - Вы уверены, что хотите удалить категорию \"%s\"? \nВся манга из данной категории будет утеряна. + Вы уверены, что хотите удалить категорию «%s»\? +\nВся манга из данной категории будет утеряна. Удалить категорию Как-то здесь пусто… Попробуйте переформулировать запрос. @@ -213,29 +215,29 @@ Другие Описание Языки - Добро пожаловать - Вы действительно хотите удалить все недавние поисковые запросы? Это действие не может быть отменено. - Резервная копия успешно сохранена - Некоторые производители могут изменять поведение системы, нарушая работу фоновых задач. - Подробнее - В очереди - На данный момент нет активных загрузок - Глава отсутствует - Эта глава отсутствует на вашем устройстве. Скачайте или прочитайте её онлайн. - Помочь с переводом приложения - Перевод - Автор - Тема на 4PDA - Обратная связь - Поддержать разработчика - Если вам нравится это приложение, вы можете помочь финансово с помощью ЮMoney (бывш. Яндекс.Деньги) - Благодарности - Эти люди помогают Kotatsu стать лучше! - Авторские права и лицензии - Лицензия - Авторизация выполнена - Авторизация в %s не поддерживается - Вы выйдете из всех источников, в которых Вы авторизованы + Добро пожаловать + Вы действительно хотите удалить все недавние поисковые запросы? Это действие не может быть отменено. + Резервная копия успешно сохранена + Некоторые производители могут изменять поведение системы, нарушая работу фоновых задач. + Подробнее + В очереди + На данный момент нет активных загрузок + Глава отсутствует + Эта глава отсутствует на вашем устройстве. Скачайте или прочитайте её онлайн. + Помочь с переводом приложения + Перевод + Автор + Тема на 4PDA + Обратная связь + Поддержать разработчика + Если вам нравится это приложение, вы можете помочь финансово с помощью ЮMoney (бывш. Яндекс.Деньги) + Благодарности + Эти люди помогают Kotatsu стать лучше! + Авторские права и лицензии + Лицензия + Авторизация выполнена + Авторизация в %s не поддерживается + Вы выйдете из всех источников, в которых Вы авторизованы Жанры Завершено Онгоинг From 1c644188cd41376b390b5f5f9db6daebb803ceb1 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 16 Sep 2021 02:46:07 +0000 Subject: [PATCH 016/159] Translated using Weblate (German) Currently translated at 100.0% (240 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ --- app/src/main/res/values-de/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6f80ea1c8..cab2e888a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -236,4 +236,8 @@ Autor Übersetzung Diese Anwendung übersetzen + Du wirst von allen Quellen abgemeldet, für die du berechtigt bist + Genres + Autorisierung auf %s wird nicht unterstützt + Autorisierung abgeschlossen \ No newline at end of file From 19fdd54dbdc4fd3584ee51f78b44042ac28e837f Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 16 Sep 2021 02:46:59 +0000 Subject: [PATCH 017/159] Translated using Weblate (Italian) Currently translated at 100.0% (240 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/ --- app/src/main/res/values-it/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 32645cbbf..b00369fcb 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -236,4 +236,8 @@ Autore Traduzione Traduci questa applicazione + Generi + Sarai disconnesso/a da tutte le fonti in cui sei autorizzato/a + L\'autorizzazione su %s non è supportata + Autorizzazione completa \ No newline at end of file From de53445ac50e41b3513cd7d7d2301c7ae1f0c224 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 16 Sep 2021 02:43:52 +0000 Subject: [PATCH 018/159] Translated using Weblate (French) Currently translated at 100.0% (240 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8f9d8e163..da9b61284 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -236,4 +236,8 @@ Auteur Traduction Traduire cette application + Genres + Vous serez déconnecté·e de toutes les sources pour lesquelles vous avez une autorisation + L\'autorisation sur %s n\'est pas prise en charge + Autorisation complète \ No newline at end of file From a09d71cb136cabccdb01af434f798bbbf8442122 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 16 Sep 2021 03:42:53 +0000 Subject: [PATCH 019/159] Translated using Weblate (Finnish) Currently translated at 100.0% (240 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fi/ --- app/src/main/res/values-fi/strings.xml | 243 ++++++++++++++++++++++++- 1 file changed, 242 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index a6b3daec9..0c47fbc7f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1,2 +1,243 @@ - \ No newline at end of file + + Sinut kirjaudutaan ulos kaikista lähteistä, joihin sinulla on valtuutus + Tyylilajit + %s -valtuutusta ei tueta + Valtuutus valmis + Lisenssi + Tekijänoikeudet ja lisenssit + Nämä ihmiset tekevät Kotatsusta paremman! + Kiitokset + Jos pidät tästä sovelluksesta, voit auttaa taloudellisesti Yoomoneyn (ent. Yandex.Money) kautta + Tue kehittäjää + Aihe 4PDA: ssa + Palaute + Kirjailija + Käännös + Käännä tämä sovellus + Luku puuttuu + Tämä luku puuttuu laitteestasi. Lataa tai lue se verkossa. + Tällä hetkellä ei ole aktiivisia latauksia + Jonossa + Lue lisää + Jotkin valmistajat voivat muuttaa järjestelmän käyttäytymistä, mikä voi keskeyttää taustatehtäviä. + Varmuuskopiointi tallennettu onnistuneesti + Kuvaus + Tervetuloa + Kielet + Muut + Haluatko todella poistaa kaikki viimeaikaiset hakukyselyt\? Tätä toimenpidettä ei voi peruuttaa. + Hae vain kohteesta %s + Piilota työkalupalkki selattaessa + Salasanan on oltava vähintään 4 merkkiä + Vahvista + Syötä salasana, joka vaaditaan, kun sovellus käynnistyy + Seuraava + … ja %1$d muuta + Oletusarvo: %s + Sinun pitäisi valtuuttaa nähdäksesi tämän sisällön + Kirjaudu sisään + Takaperin + Uusien lukujen tarkastaminen + Kaikki päivityshistoria tyhjennetään, eikä tätä toimenpidettä voi peruuttaa. Oletko varma\? + Tyhjennä syöttö + Uusien lukujen tarkistaminen: %1$d ja %2$d välillä + Kaikki evästeet poistettiin + Tyhjennä evästeet + Ratkaise + CAPTCHA vaaditaan + Äänetön + Valittu kokoonpano muistetaan tästä mangasta + Yritä uudelleen napauttamalla + Tänään + Ryhmä + Kauan sitten + Eilen + Juuri nyt + Voit luoda varmuuskopion historiastasi ja suosikeistasi ja palauttaa sen + Tiedot palautettu, mutta niissä on virheitä + Kaikki tiedot palautettu onnistuneesti + Tiedostoa ei löytynyt + Valmistellaan… + Tiedot palautettu + Palauta varmuuskopiosta + Luo tietojen varmuuskopio + Varmuuskopiointi ja palautus + Uudelleenkäynnistys vaaditaan + Hyödyllinen AMOLED-näytöille + Musta tumma teema + Pidä alussa + Sovita leveyteen + Sovita korkeuteen + Sovita keskelle + Skaalaustila + Luo ongelma GitHubissa + Uusi luokka + Voit määrittää lukutilan jokaiselle mangalle erikseen + Mieluummin oikealta vasemmalle lukutila + Oikealta vasemmalle + Ei päivityksiä saatavilla + Päivityksen tarkistus epäonnistui + Päivityksiä tarkistetaan… + Tarkista päivitykset + Versio %s + Tietoja + Salasanat eivät täsmää + Älä tarkista + Tarkista mangan päivitykset + Syötteen päivitys alkaa pian + Päivitä + Käännä näyttöä + Tyhjennä päivityssyöte + Päivitykset syötteen tyhjennetty + Verkkoa odotetaan… + Koko: %s + Uusi versio: %s + Aiheeseen liittyvät + Hakutulokset + Täällä näet lukemasi mangan uudet luvut + Päivitykset + Lue myöhemmin + Tämä luokka on tyhjä + Kaikki suosikit + Valmis + Käytä suojattua yhteyttä (HTTPS) + Muu tallennustila + Ei löydy vapaata tallennustilaa + Ei saatavilla + Mangan latauspaikka + Sivujen animaatio + Viimeaikaiset mangat + Mangahylly + Voit tallentaa sen verkkolähteistä tai tuoda sen tiedostosta. + Sinulla ei ole vielä yhtään tallennettua mangaa + Löydät luettavaa sivuvalikosta. + Manga, jota luet, näytetään täällä + Yritä muotoilla kysely uudelleen. + Voit käyttää kategorioita suosikkimangojesi järjestämiseen. Paina ”+” luodaksesi luokan + Täällä on aika tyhjää… + Poista luokka + Haluatko todella poistaa luokan ”%s” suosikeistasi\? +\nKaikki mangat menetetään. + Nimeä uudelleen + Luokat… + Suosikkiluokat + Tärinä + Merkkivalo + Ilmoitusääni + Ilmoitusten asetukset + Käynnistä uudelleen + Lue alusta + Lataa + Ilmoita lukemastasi mangan päivityksistä + Uusia lukuja + Käytössä %1$d / %2$d + Ilmoitukset + Tallenna manga + Tässä mangassa on %s. Haluatko tallentaa sen kokonaan\? + Avaa selaimessa + Näytä ilmoitus, jos päivitys on saatavilla + Sovelluksen päivitys on saatavilla + Tarkista päivitykset automaattisesti + Verkkotunnus + Ulkoinen tallennustila + Sisäinen tallennustila + Vain eleet + Hakuhistoria tyhjennetty + Tyhjennä hakuhistoria + Tyhjennä pikkukuvien välimuisti + Virhe + Peruutetaan… + Älä kysy uudestaan + Tämä toiminto voi kuluttaa paljon verkkoliikennettä + Varoitus + Jatka + Äänenvoimakkuuspainikkeet + Reunojen napauttaminen + Vaihda sivuja + Lukijan asetukset + Haluatko todella poistaa ”%s” puhelimen paikallisesta tallennustilasta\? +\nTätä toimintoa ei voi peruuttaa. + Poista manga + Hae kohteesta %s + Ruudukon koko + Lukutila + Webtoon + Vakio + t|kt|Mt|Gt|Tt + Välimuisti + Tyhjennä sivujen välimuisti + Historia ja välimuisti + Ei kuvausta + Virheellinen tiedosto. Vain ZIP ja CBZ ovat tuettuja. + Tätä toimintoa ei tueta + Poista + Tuo + Jaa kuva + Sivu tallennettu onnistuneesti + Tallenna sivu + Odota, että lataus päättyy + ”%s” poistettu paikallisesta tallennustilasta + ”%s” poistettu historiasta + Poista + Haluatko todella tyhjentää koko lukuhistoriasi\? Tätä toimenpidettä ei voi perua. + Tyhjennä + Sivut + Automaattinen + Tumma + Vaalea + Teema + Suodatin + Tyylilaji + Lajittelujärjestys + Kaikki + Luokituksen mukaan + Uusimmat + Päivitetty + Suosittu + Nimen mukaan + Lataukset + Lataus valmis + Käsitellään… + Manga ladataan… + Etsi manga + Etsi + Jaa %s + Luo pikakuvake… + Jaa + Tallenna + Kirjoita luokan nimi + Lisää + Lisää uusi luokka + Lisää suosikkeihin + Sinulla ei ole vielä suosikkeja + Lisää kirjanmerkki + Lue + Historia on tyhjä + Mitään ei löytynyt + Tyhjennä historia + Yritä uudelleen + Sulje + Luku %1$d / %2$d + Ladataan… + Kaukolähteet + Asetukset + Luettelotila + Ruudukko + Luettelo + Yksityiskohtainen luettelo + Luvut + Yksityiskohdat + Verkkoyhteysvirhe + On tapahtunut virhe + Historia + Suosikit + Paikallinen tallennustila + Avaa valikko + Sulje valikko + Toista salasana + Kysy salasanaa sovelluksen alkaessa + Suojaa sovellus + Väärä salasana + Syötä salasana + \ No newline at end of file From f9e40e17c465e52cfa7e849b704d62516470938d Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Sat, 18 Sep 2021 01:48:57 +0000 Subject: [PATCH 020/159] Translated using Weblate (Spanish) Currently translated at 97.0% (233 of 240 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index adc3dae97..7d514acd7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -232,4 +232,5 @@ Otro Géneros Intenta reformular la consulta. + ¿Realmente quiere eliminar todas las consultas de búsqueda recientes\? Esta acción no se puede deshacer. \ No newline at end of file From 9e6cb1837ee008d4eb3e5c79207df5d5c6cd82b1 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Mon, 4 Oct 2021 18:40:23 +0300 Subject: [PATCH 021/159] Remove "Unknown" status label due confusion --- .../koitharu/kotatsu/details/ui/DetailsFragment.kt | 11 +++-------- app/src/main/res/drawable/ic_state_unknown.xml | 5 ----- 2 files changed, 3 insertions(+), 13 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_state_unknown.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index bf43e2220..bb6e7dcc2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -72,22 +72,17 @@ class DetailsFragment : BaseFragment(), View.OnClickList when (manga.state) { MangaState.FINISHED -> { textViewState.apply { - text = resources.getString(R.string.state_finished) + textAndVisible = resources.getString(R.string.state_finished) drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_finished, context.theme) } } MangaState.ONGOING -> { textViewState.apply { - text = resources.getString(R.string.state_ongoing) + textAndVisible = resources.getString(R.string.state_ongoing) drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_ongoing, context.theme) } } - else -> { - textViewState.apply { - text = resources.getString(R.string.state_unknown) - drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_unknown, context.theme) - } - } + else -> textViewState.isVisible = false } // Info containers diff --git a/app/src/main/res/drawable/ic_state_unknown.xml b/app/src/main/res/drawable/ic_state_unknown.xml deleted file mode 100644 index 1b82bf426..000000000 --- a/app/src/main/res/drawable/ic_state_unknown.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - From fce9f543e17e9dc118e6e70d2ab667a1557ec057 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Mon, 4 Oct 2021 18:41:01 +0300 Subject: [PATCH 022/159] Trust user-added CAs --- app/src/main/AndroidManifest.xml | 2 +- .../main/res/xml/network_security_config.xml | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/xml/network_security_config.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e18e81392..b9aa1d3f1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,7 +21,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" - android:usesCleartextTraffic="true" + android:networkSecurityConfig="@xml/network_security_config" tools:ignore="UnusedAttribute"> + + + + + + + + + + + + \ No newline at end of file From 5cb4758b38f962bc2fb370c1001b0dd596ebe0d3 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Mon, 4 Oct 2021 19:18:21 +0300 Subject: [PATCH 023/159] Remove unused strings --- app/src/main/res/values-ru/strings.xml | 3 +-- app/src/main/res/values/strings.xml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fcd449057..6c6b29751 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -239,7 +239,6 @@ Авторизация в %s не поддерживается Вы выйдете из всех источников, в которых Вы авторизованы Жанры - Завершено + Завершено Онгоинг - Неизвестно \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d79933964..eb3f5f617 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -240,7 +240,6 @@ Authorization on %s is not supported You will be logged out from all sources that you are authorized in Genres - Finished + Finished Ongoing - Unknown \ No newline at end of file From 0360df999f1954f481b88e077d6cdea3bf4ce9ac Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Tue, 5 Oct 2021 22:14:13 +0000 Subject: [PATCH 024/159] Translated using Weblate (German) Currently translated at 100.0% (242 of 242 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/de/ --- app/src/main/res/values-de/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index cab2e888a..0ed085d0b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -240,4 +240,6 @@ Genres Autorisierung auf %s wird nicht unterstützt Autorisierung abgeschlossen + Beendet + Fortlaufend \ No newline at end of file From efe96a6e05f5b35961a254aa87c1a4b7c472c668 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Tue, 5 Oct 2021 22:14:50 +0000 Subject: [PATCH 025/159] Translated using Weblate (Italian) Currently translated at 100.0% (242 of 242 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/it/ --- app/src/main/res/values-it/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b00369fcb..5e86a82e1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -240,4 +240,6 @@ Sarai disconnesso/a da tutte le fonti in cui sei autorizzato/a L\'autorizzazione su %s non è supportata Autorizzazione completa + Finito + In corso \ No newline at end of file From 2adf8a139cfa39e09d626a2718f179b79b8bad1d Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Tue, 5 Oct 2021 22:13:12 +0000 Subject: [PATCH 026/159] Translated using Weblate (French) Currently translated at 100.0% (242 of 242 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fr/ --- app/src/main/res/values-fr/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index da9b61284..cf8e3a660 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -240,4 +240,6 @@ Vous serez déconnecté·e de toutes les sources pour lesquelles vous avez une autorisation L\'autorisation sur %s n\'est pas prise en charge Autorisation complète + Terminé + En cours \ No newline at end of file From 1b6837d406d2d97ee9e6557602d00ef1d73cca32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aliaksiej=20Razuma=C5=AD?= Date: Thu, 7 Oct 2021 11:44:57 +0000 Subject: [PATCH 027/159] Translated using Weblate (Belarusian) Currently translated at 100.0% (242 of 242 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/be/ --- app/src/main/res/values-be/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 5216a641b..b2aee447d 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -240,4 +240,6 @@ Аўтарызацыя на %s не падтрымліваецца Аўтарызацыя выканана Жанры + Завершана + Ангоінг \ No newline at end of file From a4e1381238e220d1a346f7e45f0c0a8f3be21ccb Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 8 Oct 2021 18:56:35 +0300 Subject: [PATCH 028/159] Improve CoverImageView --- .../kotatsu/base/ui/widgets/CoverImageView.kt | 48 +++++++++++++------ .../org/koitharu/kotatsu/utils/ext/ViewExt.kt | 29 ++++++++++- app/src/main/res/layout/item_manga_grid.xml | 9 ++-- 3 files changed, 66 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CoverImageView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CoverImageView.kt index 049452f4f..d387a761b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CoverImageView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/CoverImageView.kt @@ -6,10 +6,11 @@ import android.widget.LinearLayout import androidx.appcompat.widget.AppCompatImageView import androidx.core.content.withStyledAttributes import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.utils.ext.resolveAdjustedSize class CoverImageView @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, ) : AppCompatImageView(context, attrs, defStyleAttr) { private var orientation: Int = HORIZONTAL @@ -21,25 +22,42 @@ class CoverImageView @JvmOverloads constructor( } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val w: Int + val h: Int if (orientation == VERTICAL) { - val originalHeight = MeasureSpec.getSize(heightMeasureSpec) - super.onMeasure( - MeasureSpec.makeMeasureSpec( - (originalHeight * ASPECT_RATIO_WIDTH / ASPECT_RATIO_HEIGHT).toInt(), - MeasureSpec.EXACTLY - ), - MeasureSpec.makeMeasureSpec(originalHeight, MeasureSpec.EXACTLY) + val desiredHeight = (drawable?.intrinsicHeight?.coerceAtLeast(0) ?: 0) + + paddingTop + paddingBottom + h = resolveAdjustedSize( + desiredHeight.coerceAtLeast(suggestedMinimumHeight), + maxHeight, + heightMeasureSpec + ) + val desiredWidth = + (h * ASPECT_RATIO_WIDTH / ASPECT_RATIO_HEIGHT).toInt() + paddingLeft + paddingRight + w = resolveAdjustedSize( + desiredWidth.coerceAtLeast(suggestedMinimumWidth), + maxWidth, + widthMeasureSpec ) } else { - val originalWidth = MeasureSpec.getSize(widthMeasureSpec) - super.onMeasure( - MeasureSpec.makeMeasureSpec(originalWidth, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec( - (originalWidth * ASPECT_RATIO_HEIGHT / ASPECT_RATIO_WIDTH).toInt(), - MeasureSpec.EXACTLY - ) + val desiredWidth = (drawable?.intrinsicWidth?.coerceAtLeast(0) ?: 0) + + paddingLeft + paddingRight + w = resolveAdjustedSize( + desiredWidth.coerceAtLeast(suggestedMinimumWidth), + maxWidth, + widthMeasureSpec + ) + val desiredHeight = + (w * ASPECT_RATIO_HEIGHT / ASPECT_RATIO_WIDTH).toInt() + paddingTop + paddingBottom + h = resolveAdjustedSize( + desiredHeight.coerceAtLeast(suggestedMinimumHeight), + maxHeight, + heightMeasureSpec ) } + val widthSize = resolveSizeAndState(w, widthMeasureSpec, 0) + val heightSize = resolveSizeAndState(h, heightMeasureSpec, 0) + setMeasuredDimension(widthSize, heightSize) } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index ac6950379..87e21bf2d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -5,6 +5,7 @@ import android.graphics.Rect import android.view.LayoutInflater import android.view.Menu import android.view.View +import android.view.View.MeasureSpec import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import androidx.annotation.LayoutRes @@ -53,7 +54,7 @@ var RecyclerView.firstItem: Int inline fun View.showPopupMenu( @MenuRes menuRes: Int, onPrepare: (Menu) -> Unit = {}, - onItemClick: PopupMenu.OnMenuItemClickListener + onItemClick: PopupMenu.OnMenuItemClickListener, ) { val menu = PopupMenu(context, this) menu.inflate(menuRes) @@ -171,4 +172,30 @@ fun BaseProgressIndicator<*>.setIndeterminateCompat(indeterminate: Boolean) { isIndeterminate = indeterminate } } +} + +fun resolveAdjustedSize( + desiredSize: Int, + maxSize: Int, + measureSpec: Int, +): Int { + val specMode = MeasureSpec.getMode(measureSpec) + val specSize = MeasureSpec.getSize(measureSpec) + return when (specMode) { + MeasureSpec.UNSPECIFIED -> + // Parent says we can be as big as we want. Just don't be larger + // than max size imposed on ourselves. + desiredSize.coerceAtMost(maxSize) + MeasureSpec.AT_MOST -> + // Parent says we can be as big as we want, up to specSize. + // Don't be larger than specSize, and don't be larger than + // the max size imposed on ourselves. + desiredSize.coerceAtMost(specSize).coerceAtMost(maxSize) + MeasureSpec.EXACTLY -> + // No choice. Do what we are told. + specSize + else -> + // This should not happen + desiredSize + } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_manga_grid.xml b/app/src/main/res/layout/item_manga_grid.xml index 801ab2d7b..a0cd5915f 100644 --- a/app/src/main/res/layout/item_manga_grid.xml +++ b/app/src/main/res/layout/item_manga_grid.xml @@ -12,9 +12,9 @@ android:id="@+id/card" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginHorizontal="8dp" android:layout_marginTop="8dp" android:layout_marginBottom="4dp" - android:layout_marginHorizontal="8dp" app:cardCornerRadius="4dp" app:cardElevation="4dp"> @@ -22,9 +22,10 @@ android:id="@+id/imageView_cover" android:layout_width="match_parent" android:layout_height="wrap_content" - android:scaleType="centerCrop" android:orientation="horizontal" - tools:ignore="ContentDescription" /> + android:scaleType="centerCrop" + tools:ignore="ContentDescription" + tools:src="@tools:sample/backgrounds/scenic[3]" /> @@ -33,12 +34,12 @@ style="@style/TextAppearance.AppCompat.Body2" android:layout_width="match_parent" android:layout_height="wrap_content" + android:elegantTextHeight="false" android:ellipsize="end" android:lineSpacingExtra="-2dp" android:maxLines="2" android:paddingHorizontal="8dp" android:paddingBottom="4dp" - android:elegantTextHeight="false" tools:text="Sample name" /> \ No newline at end of file From 0a8d677fe8926a3efd6d974b1f1b44913d6d4022 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 9 Oct 2021 15:44:57 +0300 Subject: [PATCH 029/159] Search by author name --- .../kotatsu/details/ui/DetailsFragment.kt | 17 ++++++++++++++--- .../res/layout-w600dp-land/fragment_details.xml | 7 +++++-- .../res/layout-w600dp-port/fragment_details.xml | 7 +++++-- app/src/main/res/layout/fragment_details.xml | 8 ++++++-- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index bb6e7dcc2..9e6bd5533 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -29,6 +29,7 @@ import org.koitharu.kotatsu.databinding.FragmentDetailsBinding import org.koitharu.kotatsu.favourites.ui.categories.select.FavouriteCategoriesDialog import org.koitharu.kotatsu.reader.ui.ReaderActivity import org.koitharu.kotatsu.reader.ui.ReaderState +import org.koitharu.kotatsu.search.ui.SearchActivity import org.koitharu.kotatsu.utils.FileSizeUtils import org.koitharu.kotatsu.utils.ext.* @@ -45,6 +46,10 @@ class DetailsFragment : BaseFragment(), View.OnClickList override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.textViewAuthor.setOnClickListener(this) + binding.buttonFavorite.setOnClickListener(this) + binding.buttonRead.setOnClickListener(this) + binding.buttonRead.setOnLongClickListener(this) viewModel.manga.observe(viewLifecycleOwner, ::onMangaUpdated) viewModel.isLoading.observe(viewLifecycleOwner, ::onLoadingStateChanged) viewModel.favouriteCategories.observe(viewLifecycleOwner, ::onFavouriteChanged) @@ -118,9 +123,6 @@ class DetailsFragment : BaseFragment(), View.OnClickList } // Buttons - buttonFavorite.setOnClickListener(this@DetailsFragment) - buttonRead.setOnClickListener(this@DetailsFragment) - buttonRead.setOnLongClickListener(this@DetailsFragment) buttonRead.isEnabled = !manga.chapters.isNullOrEmpty() // Chips @@ -178,6 +180,15 @@ class DetailsFragment : BaseFragment(), View.OnClickList ) } } + R.id.textView_author -> { + startActivity( + SearchActivity.newIntent( + context = v.context, + source = manga.source, + query = manga.author ?: return, + ) + ) + } } } diff --git a/app/src/main/res/layout-w600dp-land/fragment_details.xml b/app/src/main/res/layout-w600dp-land/fragment_details.xml index c8bdefeb2..4ce68a753 100644 --- a/app/src/main/res/layout-w600dp-land/fragment_details.xml +++ b/app/src/main/res/layout-w600dp-land/fragment_details.xml @@ -5,8 +5,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:scrollbars="vertical" android:clipToPadding="false" + android:scrollbars="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior"> @@ -81,12 +81,15 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" + android:background="@drawable/list_selector" android:requiresFadingEdge="horizontal" android:textColor="?colorAccent" android:textStyle="bold" app:layout_constraintEnd_toEndOf="@id/textView_title" + app:layout_constraintHorizontal_bias="0" app:layout_constraintStart_toStartOf="@id/textView_title" app:layout_constraintTop_toBottomOf="@id/textView_subtitle" + app:layout_constraintWidth_default="wrap" tools:text="@tools:sample/full_names" /> @@ -82,12 +82,15 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" + android:background="@drawable/list_selector" android:requiresFadingEdge="horizontal" android:textColor="?colorAccent" android:textStyle="bold" app:layout_constraintEnd_toEndOf="@id/textView_title" + app:layout_constraintHorizontal_bias="0" app:layout_constraintStart_toStartOf="@id/textView_title" app:layout_constraintTop_toBottomOf="@id/textView_subtitle" + app:layout_constraintWidth_default="wrap" tools:text="@tools:sample/full_names" /> @@ -81,12 +82,15 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="4dp" + android:background="@drawable/list_selector" android:requiresFadingEdge="horizontal" android:textColor="?colorAccent" android:textStyle="bold" app:layout_constraintEnd_toEndOf="@id/textView_title" + app:layout_constraintHorizontal_bias="0" app:layout_constraintStart_toStartOf="@id/textView_title" app:layout_constraintTop_toBottomOf="@id/textView_subtitle" + app:layout_constraintWidth_default="wrap" tools:text="@tools:sample/full_names" /> Date: Sat, 9 Oct 2021 15:56:19 +0300 Subject: [PATCH 030/159] Fix pagination --- .../main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt index eeeb12866..29c3a67f0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/PrimitiveExt.kt @@ -35,7 +35,7 @@ fun Float.toIntUp(): Int { infix fun Int.upBy(step: Int): Int { val mod = this % step - return if (mod == this) { + return if (mod == 0) { this } else { this - mod + step From 17d7deef2d1e414273db8d2335ef93d5de031da7 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Tue, 12 Oct 2021 18:37:19 +0000 Subject: [PATCH 031/159] Translated using Weblate (Spanish) Currently translated at 98.7% (239 of 242 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/es/ --- app/src/main/res/values-es/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7d514acd7..81ead8f9e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -233,4 +233,10 @@ Géneros Intenta reformular la consulta. ¿Realmente quiere eliminar todas las consultas de búsqueda recientes\? Esta acción no se puede deshacer. + Terminado + En curso + Ocultar la barra de herramientas al desplazarse + Este capítulo no aparece en su dispositivo. Descárguelo o léalo en línea. + Autorización completa + Tema sobre 4PDA \ No newline at end of file From e6ce03b516673fbbef268f19b2076567952ed40f Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Tue, 12 Oct 2021 18:33:59 +0000 Subject: [PATCH 032/159] Translated using Weblate (Finnish) Currently translated at 100.0% (242 of 242 strings) Translation: Kotatsu/Strings Translate-URL: https://hosted.weblate.org/projects/kotatsu/strings/fi/ --- app/src/main/res/values-fi/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 0c47fbc7f..4241b137f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -240,4 +240,6 @@ Suojaa sovellus Väärä salasana Syötä salasana + Päättynyt + Jatkuva \ No newline at end of file From d911ee12f23ddb0e505a8242630c2619c2c1f3e3 Mon Sep 17 00:00:00 2001 From: abidin toumi Date: Thu, 14 Oct 2021 15:51:46 +0200 Subject: [PATCH 033/159] Added translation using Weblate (Arabic) --- app/src/main/res/values-ar/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/src/main/res/values-ar/strings.xml diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml new file mode 100644 index 000000000..a6b3daec9 --- /dev/null +++ b/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From ad76d6d4148a9591035eeeeea4a4a3c9e33e04e7 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 17 Oct 2021 21:50:03 +0300 Subject: [PATCH 034/159] Use custom Snackbar for DetailsActivity --- .../kotatsu/base/ui/widgets/FadingSnackbar.kt | 97 +++++++++++++++++++ .../kotatsu/details/ui/DetailsActivity.kt | 5 +- .../drawable/fading_snackbar_background.xml | 7 ++ .../res/layout-w600dp/activity_details.xml | 8 +- app/src/main/res/layout/activity_details.xml | 8 +- .../res/layout/fading_snackbar_layout.xml | 61 ++++++++++++ 6 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt create mode 100644 app/src/main/res/drawable/fading_snackbar_background.xml create mode 100644 app/src/main/res/layout/fading_snackbar_layout.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt new file mode 100644 index 000000000..0ef88f839 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/FadingSnackbar.kt @@ -0,0 +1,97 @@ +/* + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.koitharu.kotatsu.base.ui.widgets + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.Button +import android.widget.FrameLayout +import android.widget.TextView +import androidx.annotation.StringRes +import androidx.core.view.postDelayed +import org.koitharu.kotatsu.R + +/** + * A custom snackbar implementation allowing more control over placement and entry/exit animations. + * + * Xtimms: Well, my sufferings over the Snackbar in [DetailsActivity] will go away forever... Thanks, Google. + * + * https://github.com/google/iosched/blob/main/mobile/src/main/java/com/google/samples/apps/iosched/widget/FadingSnackbar.kt + */ +class FadingSnackbar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet, + defStyleAttr: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr) { + + private val message: TextView + private val action: Button + + init { + val view = LayoutInflater.from(context).inflate(R.layout.fading_snackbar_layout, this, true) + message = view.findViewById(R.id.snackbar_text) + action = view.findViewById(R.id.snackbar_action) + } + + fun dismiss() { + if (visibility == VISIBLE && alpha == 1f) { + animate() + .alpha(0f) + .withEndAction { visibility = GONE } + .duration = EXIT_DURATION + } + } + + fun show( + messageText: CharSequence? = null, + @StringRes actionId: Int? = null, + longDuration: Boolean = true, + actionClick: () -> Unit = { dismiss() }, + dismissListener: () -> Unit = { } + ) { + message.text = messageText + if (actionId != null) { + action.run { + visibility = VISIBLE + text = context.getString(actionId) + setOnClickListener { + actionClick() + } + } + } else { + action.visibility = GONE + } + alpha = 0f + visibility = VISIBLE + animate() + .alpha(1f) + .duration = ENTER_DURATION + val showDuration = ENTER_DURATION + if (longDuration) LONG_DURATION else SHORT_DURATION + postDelayed(showDuration) { + dismiss() + dismissListener() + } + } + + companion object { + private const val ENTER_DURATION = 300L + private const val EXIT_DURATION = 200L + private const val SHORT_DURATION = 1_500L + private const val LONG_DURATION = 2_750L + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index af987e208..57213f9df 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -85,14 +85,13 @@ class DetailsActivity : BaseActivity(), finishAfterTransition() } else -> { - Snackbar.make(binding.coordinator, e.getDisplayMessage(resources), Snackbar.LENGTH_LONG) - .show() + binding.snackbar.show(e.getDisplayMessage(resources)) } } } override fun onWindowInsetsChanged(insets: Insets) { - binding.coordinator.updatePadding( + binding.snackbar.updatePadding( bottom = insets.bottom ) binding.toolbar.updatePadding( diff --git a/app/src/main/res/drawable/fading_snackbar_background.xml b/app/src/main/res/drawable/fading_snackbar_background.xml new file mode 100644 index 000000000..8bb1d9ce1 --- /dev/null +++ b/app/src/main/res/drawable/fading_snackbar_background.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-w600dp/activity_details.xml b/app/src/main/res/layout-w600dp/activity_details.xml index 3f3832b27..6e89585c7 100644 --- a/app/src/main/res/layout-w600dp/activity_details.xml +++ b/app/src/main/res/layout-w600dp/activity_details.xml @@ -6,7 +6,6 @@ android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" - android:clipToPadding="false" tools:context=".details.ui.DetailsActivity"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index da7df642a..39f3f7d81 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -6,7 +6,6 @@ android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" - android:clipToPadding="false" tools:context=".details.ui.DetailsActivity"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fading_snackbar_layout.xml b/app/src/main/res/layout/fading_snackbar_layout.xml new file mode 100644 index 000000000..4c75ce8b9 --- /dev/null +++ b/app/src/main/res/layout/fading_snackbar_layout.xml @@ -0,0 +1,61 @@ + + + + + + + + + +