More stuff

Last updated sorting is called "Latest chapter" now
Fixing some mangas being called manhwas
Fixed library searching from tags
Broswing manga from source now starts with the details and tags expanded
Restored click on thumbnail in details
Restored copying title and aurthor
Made toolbar in details translucent
Added mark all unread and mark previous as read in detail
Fixed changing grid size
This commit is contained in:
Jay 2020-03-07 10:52:49 -08:00
parent c62ec99aff
commit c8570759fa
62 changed files with 430 additions and 182 deletions

View File

@ -31,7 +31,7 @@ interface Category : Serializable {
fun sortingMode(): Int? = when (mangaSort) {
ALPHA_ASC, ALPHA_DSC -> LibrarySort.ALPHA
UPDATED_ASC, UPDATED_DSC -> LibrarySort.LAST_UPDATED
UPDATED_ASC, UPDATED_DSC -> LibrarySort.LATEST_CHAPTER
UNREAD_ASC, UNREAD_DSC -> LibrarySort.UNREAD
LAST_READ_ASC, LAST_READ_DSC -> LibrarySort.LAST_READ
TOTAL_ASC, TOTAL_DSC -> LibrarySort.TOTAL
@ -41,7 +41,7 @@ interface Category : Serializable {
fun sortRes(): Int = when (mangaSort) {
ALPHA_ASC, ALPHA_DSC -> R.string.title
UPDATED_ASC, UPDATED_DSC -> R.string.action_sort_last_updated
UPDATED_ASC, UPDATED_DSC -> R.string.action_sort_latest_chapter
UNREAD_ASC, UNREAD_DSC -> R.string.action_filter_unread
LAST_READ_ASC, LAST_READ_DSC -> R.string.action_sort_last_read
TOTAL_ASC, TOTAL_DSC -> R.string.action_sort_total
@ -60,7 +60,7 @@ interface Category : Serializable {
fun changeSortTo(sort: Int) {
mangaSort = when (sort) {
LibrarySort.ALPHA -> ALPHA_ASC
LibrarySort.LAST_UPDATED -> UPDATED_ASC
LibrarySort.LATEST_CHAPTER -> UPDATED_ASC
LibrarySort.UNREAD -> UNREAD_ASC
LibrarySort.LAST_READ -> LAST_READ_ASC
LibrarySort.TOTAL -> ALPHA_ASC
@ -96,7 +96,7 @@ interface Category : Serializable {
id = -1
mangaSort = when (libSort) {
LibrarySort.ALPHA -> ALPHA_ASC
LibrarySort.LAST_UPDATED -> UPDATED_ASC
LibrarySort.LATEST_CHAPTER -> UPDATED_ASC
LibrarySort.UNREAD -> UNREAD_ASC
LibrarySort.LAST_READ -> LAST_READ_ASC
LibrarySort.TOTAL -> TOTAL_ASC

View File

@ -33,8 +33,9 @@ interface Chapter : SChapter, Serializable {
chapter_number = -1f
}
fun createH(): Chapter = ChapterImpl().apply {
fun createHeader(isExpanded: Boolean): Chapter = ChapterImpl().apply {
id = Long.MIN_VALUE
read = isExpanded
manga_id = null
}
}

View File

@ -39,6 +39,11 @@ interface Manga : SManga {
val sourceName = Injekt.get<SourceManager>().getOrStub(source).name
val currentTags = currentGenres()?.split(",")?.map { it.trim().toLowerCase(Locale.US) }
return if (currentTags?.any
{ tag ->
tag.startsWith("japanese") || tag == "manga"
} == true)
TYPE_MANGA
else if (currentTags?.any
{ tag ->
tag.startsWith("english") || tag == "comic"
} == true || isComicSource(sourceName))
@ -51,10 +56,14 @@ interface Manga : SManga {
TYPE_MANHUA
else if (currentTags?.any
{ tag ->
tag == "long strip" || tag == "manhwa" ||
tag.contains("webtoon")
tag == "long strip" || tag == "manhwa"
} == true || isWebtoonSource(sourceName))
TYPE_MANHWA
else if (currentTags?.any
{ tag ->
tag.startsWith("webtoon")
} == true)
TYPE_WEBTOON
else TYPE_MANGA
}
@ -65,7 +74,8 @@ interface Manga : SManga {
{ tag ->
tag == "long strip" || tag == "manhwa" ||
tag.contains("webtoon")
} == true || isWebtoonSource(sourceName))
} == true || isWebtoonSource(sourceName) ||
sourceName.contains("tapastic", true))
ReaderActivity.WEBTOON
else if (currentTags?.any
{ tag ->
@ -142,14 +152,11 @@ interface Manga : SManga {
const val DISPLAY_NUMBER = 0x00100000
const val DISPLAY_MASK = 0x00100000
const val READ_WEBTOON = 0
const val READ_LTR = 1
const val READ_RTL = 2
const val TYPE_MANGA = 0
const val TYPE_MANHWA = 1
const val TYPE_MANHUA = 2
const val TYPE_COMIC = 3
const val TYPE_WEBTOON = 4
fun create(source: Long): Manga = MangaImpl().apply {
this.source = source

View File

@ -139,7 +139,7 @@ class LibraryCategoryAdapter(val libraryListener: LibraryListener) :
else
"Read"
}
LibrarySort.LAST_UPDATED -> {
LibrarySort.LATEST_CHAPTER -> {
val lastUpdate = (iFlexible as LibraryItem).manga.last_update
if (lastUpdate > 0)
getShortDate(Date(lastUpdate))

View File

@ -86,8 +86,6 @@ open class LibraryController(
*/
protected var query = ""
var customQuery = ""
/**
* Currently selected mangas.
*/
@ -258,24 +256,6 @@ open class LibraryController(
}
}
override fun onChangeEnded(
changeHandler: ControllerChangeHandler,
changeType: ControllerChangeType
) {
super.onChangeEnded(changeHandler, changeType)
if (changeType.isEnter) {
if (customQuery.isNotEmpty()) {
query = customQuery
((activity as MainActivity).toolbar.menu.findItem(
R.id.action_search
)?.actionView as? SearchView)?.setQuery(
customQuery, true
)
}
customQuery = ""
}
}
override fun onActivityResumed(activity: Activity) {
super.onActivityResumed(activity)
if (observeLater && ::presenter.isInitialized) {
@ -509,7 +489,7 @@ open class LibraryController(
}
open fun search(query: String) {
this.customQuery = query
onSearch(query)
}
override fun handleRootBack(): Boolean {

View File

@ -100,7 +100,7 @@ class LibraryHeaderItem(private val categoryF: (Int) -> Category, val catId: Int
sortText.text = itemView.context.getString(R.string.sort_by_,
itemView.context.getString(
when (category.sortingMode()) {
LibrarySort.LAST_UPDATED -> R.string.action_sort_last_updated
LibrarySort.LATEST_CHAPTER -> R.string.action_sort_latest_chapter
LibrarySort.DRAG_AND_DROP ->
if (category.id == -1) R.string.category
else R.string.action_sort_drag_and_drop
@ -168,7 +168,7 @@ class LibraryHeaderItem(private val categoryF: (Int) -> Category, val catId: Int
LibrarySort.TOTAL -> R.id.action_total_chaps
LibrarySort.LAST_READ -> R.id.action_last_read
LibrarySort.UNREAD -> R.id.action_unread
LibrarySort.LAST_UPDATED -> R.id.action_update
LibrarySort.LATEST_CHAPTER -> R.id.action_update
else -> R.id.action_alpha
}
)

View File

@ -245,11 +245,11 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
}
override fun reattachAdapter() {
libraryLayout = preferences.libraryLayout().getOrDefault()
if (libraryLayout == 0) recycler.spanCount = 1
else recycler.columnWidth = (90 + (preferences.gridSize().getOrDefault() * 30)).dpToPx
val position =
(recycler.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
libraryLayout = preferences.libraryLayout().getOrDefault()
recycler.adapter = adapter
(recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(position, 0)

View File

@ -170,7 +170,10 @@ class LibraryPresenter(
if (filterUnread == STATE_REALLY_EXCLUDE && item.manga.unread > 0) return@f false
if (filterMangaType > 0) {
if (filterMangaType != item.manga.mangaType()) return@f false
if (if (filterMangaType == Manga.TYPE_MANHWA)
(filterMangaType != item.manga.mangaType() &&
filterMangaType != Manga.TYPE_WEBTOON)
else filterMangaType != item.manga.mangaType()) return@f false
}
if (filterCompleted == STATE_INCLUDE && item.manga.status != SManga.COMPLETED)
@ -297,7 +300,7 @@ class LibraryPresenter(
val manga2LastRead = lastReadManga[i2.manga.id!!] ?: lastReadManga.size
manga1LastRead.compareTo(manga2LastRead)
}
sortingMode == LibrarySort.LAST_UPDATED -> i2.manga.last_update.compareTo(i1
sortingMode == LibrarySort.LATEST_CHAPTER -> i2.manga.last_update.compareTo(i1
.manga.last_update)
sortingMode == LibrarySort.UNREAD ->
when {
@ -364,7 +367,7 @@ class LibraryPresenter(
category.mangaSort != null -> {
var sort = when (category.sortingMode()) {
LibrarySort.ALPHA -> sortAlphabetical(i1, i2)
LibrarySort.LAST_UPDATED -> i2.manga.last_update.compareTo(i1.manga.last_update)
LibrarySort.LATEST_CHAPTER -> i2.manga.last_update.compareTo(i1.manga.last_update)
LibrarySort.UNREAD -> when {
i1.manga.unread == i2.manga.unread -> 0
i1.manga.unread == 0 -> if (category.isAscending()) 1 else -1

View File

@ -4,7 +4,7 @@ object LibrarySort {
const val ALPHA = 0
const val LAST_READ = 1
const val LAST_UPDATED = 2
const val LATEST_CHAPTER = 2
const val UNREAD = 3
const val TOTAL = 4
const val DRAG_AND_DROP = 6

View File

@ -1,5 +1,9 @@
package eu.kanade.tachiyomi.ui.manga
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.app.Activity
import android.app.PendingIntent
@ -10,6 +14,7 @@ import android.content.Intent
import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.os.Build
@ -21,6 +26,7 @@ import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.view.animation.DecelerateInterpolator
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
@ -29,6 +35,11 @@ import androidx.core.graphics.drawable.IconCompat
import androidx.palette.graphics.Palette
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.ChangeBounds
import androidx.transition.ChangeImageTransform
import androidx.transition.TransitionManager
import androidx.transition.TransitionSet
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
@ -65,6 +76,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaController.Companion.FROM_CATALOGUE_EXT
import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem
import eu.kanade.tachiyomi.ui.manga.chapter.ChapterMatHolder
import eu.kanade.tachiyomi.ui.manga.chapter.ChaptersAdapter
import eu.kanade.tachiyomi.ui.manga.chapter.DownloadCustomChaptersDialog
import eu.kanade.tachiyomi.ui.manga.info.EditMangaDialog
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
@ -83,8 +95,7 @@ import jp.wasabeef.glide.transformations.CropSquareTransformation
import jp.wasabeef.glide.transformations.MaskTransformation
import kotlinx.android.synthetic.main.main_activity.*
import kotlinx.android.synthetic.main.manga_details_controller.*
import kotlinx.android.synthetic.main.manga_details_controller.swipe_refresh
import kotlinx.android.synthetic.main.manga_info_controller.*
import kotlinx.android.synthetic.main.manga_header_item.*
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.io.File
@ -94,6 +105,7 @@ class MangaDetailsController : BaseController,
FlexibleAdapter.OnItemLongClickListener,
ChaptersAdapter.MangaHeaderInterface,
ChangeMangaCategoriesDialog.Listener,
DownloadCustomChaptersDialog.Listener,
NoToolbarElevationController {
constructor(manga: Manga?,
@ -129,12 +141,17 @@ class MangaDetailsController : BaseController,
var coverColor:Int? = null
var toolbarIsColored = false
private var snack: Snackbar? = null
private val fromCatalogue = args.getBoolean(FROM_CATALOGUE_EXTRA, false)
val fromCatalogue = args.getBoolean(FROM_CATALOGUE_EXTRA, false)
var coverDrawable:Drawable? = null
/**
* Adapter containing a list of chapters.
*/
private var adapter: ChaptersAdapter? = null
// Hold a reference to the current animator,
// so that it can be canceled mid-way.
private var currentAnimator: Animator? = null
var headerHeight = 0
init {
@ -183,8 +200,10 @@ class MangaDetailsController : BaseController,
}
presenter.onCreate()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
recycler.setOnScrollChangeListener { _, _, _, _, _ ->
recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val atTop = !recycler.canScrollVertically(-1)
if ((!atTop && !toolbarIsColored) || (atTop && toolbarIsColored)) {
toolbarIsColored = !atTop
@ -194,10 +213,10 @@ class MangaDetailsController : BaseController,
if (colorAnimator?.isRunning == true) activity?.window?.statusBarColor
?: color
else ColorUtils.setAlphaComponent(
color, if (toolbarIsColored) 0 else 255
color, if (toolbarIsColored) 0 else 175
)
val colorTo = ColorUtils.setAlphaComponent(
color, if (toolbarIsColored) 255 else 0
color, if (toolbarIsColored) 175 else 0
)
colorAnimator?.cancel()
colorAnimator = ValueAnimator.ofObject(
@ -209,13 +228,19 @@ class MangaDetailsController : BaseController,
activity?.window?.statusBarColor = (animator.animatedValue as Int)
}
colorAnimator?.start()
val isCurrentController = router?.backstack?.lastOrNull()?.controller() == this
val isCurrentController =
router?.backstack?.lastOrNull()?.controller() == this@MangaDetailsController
if (isCurrentController) setTitle()
}
}
}
})
setPaletteColor()
if (manga?.initialized != true)
swipe_refresh.post {
swipe_refresh.isRefreshing = true
}
swipe_refresh.setOnRefreshListener {
presenter.refreshAll()
}
@ -230,6 +255,7 @@ class MangaDetailsController : BaseController,
override fun onResourceReady(resource: Drawable,
transition: Transition<in Drawable>?
) {
coverDrawable = resource
Palette.from(
(resource as BitmapDrawable).bitmap).generate {
if (recycler == null) return@generate
@ -247,8 +273,9 @@ class MangaDetailsController : BaseController,
(recycler.findViewHolderForAdapterPosition(0) as? MangaHeaderHolder)
?.setBackDrop(backDropColor)
if (toolbarIsColored) {
(activity as MainActivity).toolbar.setBackgroundColor(backDropColor)
activity?.window?.statusBarColor = backDropColor
val translucentColor = ColorUtils.setAlphaComponent(backDropColor, 175)
(activity as MainActivity).toolbar.setBackgroundColor(translucentColor)
activity?.window?.statusBarColor = translucentColor
}
}
}
@ -370,6 +397,7 @@ class MangaDetailsController : BaseController,
R.id.action_bookmark -> bookmarkChapters(chapters, true)
R.id.action_remove_bookmark -> bookmarkChapters(chapters, false)
R.id.action_mark_as_read -> markAsRead(chapters)
R.id.action_mark_previous_as_read -> markPreviousAsRead(item)
R.id.action_mark_as_unread -> markAsUnread(chapters)
}
true
@ -379,6 +407,15 @@ class MangaDetailsController : BaseController,
popup.show()
}
private fun markPreviousAsRead(chapter: ChapterItem) {
val adapter = adapter ?: return
val chapters = if (presenter.sortDescending()) adapter.items.reversed() else adapter.items
val chapterPos = chapters.indexOf(chapter)
if (chapterPos != -1) {
markAsRead(chapters.take(chapterPos))
}
}
private fun bookmarkChapters(chapters: List<ChapterItem>, bookmarked: Boolean) {
//destroyActionModeIfNeeded()
presenter.bookmarkChapters(chapters, bookmarked)
@ -417,6 +454,8 @@ class MangaDetailsController : BaseController,
menu.findItem(R.id.action_download).isVisible = !presenter.isLockedFromSearch
menu.findItem(R.id.action_mark_all_as_read).isVisible =
presenter.getNextUnreadChapter() != null && !presenter.isLockedFromSearch
menu.findItem(R.id.action_mark_all_as_unread).isVisible =
!presenter.allUnread() && !presenter.isLockedFromSearch
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
@ -434,6 +473,7 @@ class MangaDetailsController : BaseController,
.negativeButton(android.R.string.cancel)
.show()
}
R.id.action_mark_all_as_unread -> markAsUnread(presenter.chapters)
R.id.download_next, R.id.download_next_5, R.id.download_next_10,
R.id.download_custom, R.id.download_unread, R.id.download_all
-> downloadChapters(item.itemId)
@ -446,7 +486,7 @@ class MangaDetailsController : BaseController,
* Called to run Intent with [Intent.ACTION_SEND], which show share dialog.
*/
override fun prepareToShareManga() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && manga_cover.drawable != null)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && coverDrawable != null)
GlideApp.with(activity!!).asBitmap().load(presenter.manga).into(object :
CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
@ -486,7 +526,7 @@ class MangaDetailsController : BaseController,
}
}
private fun openInWebView() {
override fun openInWebView() {
val source = presenter.source as? HttpSource ?: return
val url = try {
@ -626,7 +666,14 @@ class MangaDetailsController : BaseController,
}
private fun showCustomDownloadDialog() {
// DownloadCustomChaptersDialog(this, presenter.chapters.size).showDialog(router)
DownloadCustomChaptersDialog(this, presenter.chapters.size).showDialog(router)
}
override fun downloadCustomChapters(amount: Int) {
val chaptersToDownload = presenter.getUnreadChaptersSorted().take(amount)
if (chaptersToDownload.isNotEmpty()) {
downloadChapters(chaptersToDownload)
}
}
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
@ -710,32 +757,52 @@ class MangaDetailsController : BaseController,
}
}
else {
if (presenter.toggleFavorite()) {
val categories = presenter.getCategories()
val defaultCategoryId = presenter.preferences.defaultCategory()
val defaultCategory = categories.find { it.id == defaultCategoryId }
when {
defaultCategory != null -> presenter.moveMangaToCategory(manga, defaultCategory)
defaultCategoryId == 0 || categories.isEmpty() -> // 'Default' or no category
presenter.moveMangaToCategory(manga, null)
else -> {
val ids = presenter.getMangaCategoryIds(manga)
val preselected = ids.mapNotNull { id ->
categories.indexOfFirst { it.id == id }.takeIf { it != -1 }
}.toTypedArray()
ChangeMangaCategoriesDialog(
this,
listOf(manga),
categories,
preselected
).showDialog(router)
}
}
showAddedSnack()
} else {
showRemovedSnack()
if (!manga.favorite) {
toggleMangaFavorite()
}
else {
val headerHolder = recycler.findViewHolderForAdapterPosition(0) as? MangaHeaderHolder ?:
return
val popup = PopupMenu(view!!.context, headerHolder.favorite_button)
popup.menu.add(R.string.remove_from_library)
// Set a listener so we are notified if a menu item is clicked
popup.setOnMenuItemClickListener {
toggleMangaFavorite()
true
}
popup.show()
}
}
}
private fun toggleMangaFavorite() {
val manga = presenter.manga
if (presenter.toggleFavorite()) {
val categories = presenter.getCategories()
val defaultCategoryId = presenter.preferences.defaultCategory()
val defaultCategory = categories.find { it.id == defaultCategoryId }
when {
defaultCategory != null -> presenter.moveMangaToCategory(manga, defaultCategory)
defaultCategoryId == 0 || categories.isEmpty() -> // 'Default' or no category
presenter.moveMangaToCategory(manga, null)
else -> {
val ids = presenter.getMangaCategoryIds(manga)
val preselected = ids.mapNotNull { id ->
categories.indexOfFirst { it.id == id }.takeIf { it != -1 }
}.toTypedArray()
ChangeMangaCategoriesDialog(
this,
listOf(manga),
categories,
preselected
).showDialog(router)
}
}
showAddedSnack()
} else {
showRemovedSnack()
}
}
@ -762,7 +829,9 @@ class MangaDetailsController : BaseController,
}
})
}
(activity as? MainActivity)?.setUndoSnackBar(snack, fab_favorite)
val favButton = (recycler.findViewHolderForAdapterPosition(0)
as? MangaHeaderHolder)?.favorite_button
(activity as? MainActivity)?.setUndoSnackBar(snack, favButton)
}
override fun mangaPresenter(): MangaDetailsPresenter = presenter
@ -775,19 +844,158 @@ class MangaDetailsController : BaseController,
/**
* Copies a string to clipboard
*
* @param label Label to show to the user describing the content
* @param content the actual text to copy to the board
* @param label Label to show to the user describing the content
*/
private fun copyToClipboard(label: String, content: String, resId: Int) {
override fun copyToClipboard(content: String, label: Int) {
if (content.isBlank()) return
val activity = activity ?: return
val view = view ?: return
val contentType = view.context.getString(label)
val clipboard = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setPrimaryClip(ClipData.newPlainText(label, content))
clipboard.setPrimaryClip(ClipData.newPlainText(contentType, content))
snack = view.snack(view.context.getString(R.string.copied_to_clipboard, view.context
.getString(resId)))
snack = view.snack(view.context.getString(R.string.copied_to_clipboard, contentType))
}
override fun handleBack(): Boolean {
if (manga_cover_full?.visibility == View.VISIBLE)
{
manga_cover_full?.performClick()
return true
}
return super.handleBack()
}
override fun zoomImageFromThumb(thumbView: View) {
// If there's an animation in progress, cancel it immediately and proceed with this one.
currentAnimator?.cancel()
// Load the high-resolution "zoomed-in" image.
val expandedImageView = manga_cover_full ?: return
val fullBackdrop = full_backdrop
val image = coverDrawable ?: return
expandedImageView.setImageDrawable(image)
// Hide the thumbnail and show the zoomed-in view. When the animation
// begins, it will position the zoomed-in view in the place of the
// thumbnail.
thumbView.alpha = 0f
expandedImageView.visibility = View.VISIBLE
fullBackdrop.visibility = View.VISIBLE
// Set the pivot point to 0 to match thumbnail
swipe_refresh.isEnabled = false
val rect = Rect()
thumbView.getGlobalVisibleRect(rect)
expandedImageView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
height = thumbView.height
width = thumbView.width
topMargin = rect.top
leftMargin = rect.left
rightMargin = rect.right
bottomMargin = rect.bottom
}
expandedImageView.requestLayout()
expandedImageView.post {
val defMargin = 16.dpToPx
expandedImageView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
height = ViewGroup.LayoutParams.MATCH_PARENT
width = ViewGroup.LayoutParams.MATCH_PARENT
topMargin = defMargin + headerHeight
leftMargin = defMargin
rightMargin = defMargin
bottomMargin = defMargin + recycler.paddingBottom
}
val shortAnimationDuration = resources?.getInteger(
android.R.integer.config_shortAnimTime
) ?: 0
// TransitionSet for the full cover because using animation for this SUCKS
val transitionSet = TransitionSet()
val bound = ChangeBounds()
transitionSet.addTransition(bound)
val changeImageTransform = ChangeImageTransform()
transitionSet.addTransition(changeImageTransform)
transitionSet.duration = shortAnimationDuration.toLong()
TransitionManager.beginDelayedTransition(frame_layout, transitionSet)
// AnimationSet for backdrop because idk how to use TransitionSet
currentAnimator = AnimatorSet().apply {
play(
ObjectAnimator.ofFloat(fullBackdrop, View.ALPHA, 0f, 0.5f)
)
duration = shortAnimationDuration.toLong()
interpolator = DecelerateInterpolator()
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
TransitionManager.endTransitions(frame_layout)
currentAnimator = null
}
override fun onAnimationCancel(animation: Animator) {
TransitionManager.endTransitions(frame_layout)
currentAnimator = null
}
})
start()
}
expandedImageView.setOnClickListener {
currentAnimator?.cancel()
val rect = Rect()
thumbView.getGlobalVisibleRect(rect)
expandedImageView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
height = thumbView.height
width = thumbView.width
topMargin = rect.top
leftMargin = rect.left
rightMargin = rect.right
bottomMargin = rect.bottom
}
// Zoom out back to tc thumbnail
val transitionSet = TransitionSet()
val bound = ChangeBounds()
transitionSet.addTransition(bound)
val changeImageTransform = ChangeImageTransform()
transitionSet.addTransition(changeImageTransform)
transitionSet.duration = shortAnimationDuration.toLong()
TransitionManager.beginDelayedTransition(frame_layout, transitionSet)
// Animation to remove backdrop and hide the full cover
currentAnimator = AnimatorSet().apply {
play(ObjectAnimator.ofFloat(fullBackdrop, View.ALPHA, 0f))
duration = shortAnimationDuration.toLong()
interpolator = DecelerateInterpolator()
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
thumbView.alpha = 1f
expandedImageView.visibility = View.GONE
fullBackdrop.visibility = View.GONE
swipe_refresh.isEnabled = true
currentAnimator = null
}
override fun onAnimationCancel(animation: Animator) {
thumbView.alpha = 1f
expandedImageView.visibility = View.GONE
fullBackdrop.visibility = View.GONE
swipe_refresh.isEnabled = true
currentAnimator = null
}
})
start()
}
}
}
}
}

View File

@ -28,7 +28,6 @@ import eu.kanade.tachiyomi.ui.manga.chapter.ChapterItem
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.system.launchUI
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@ -67,7 +66,7 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController,
var chapters:List<ChapterItem> = emptyList()
private set
var headerItem = ChapterItem(Chapter.createH(), manga)
var headerItem = ChapterItem(Chapter.createHeader(controller.fromCatalogue), manga)
fun onCreate() {
isLockedFromSearch = SecureActivityDelegate.shouldBeLocked()
@ -75,10 +74,9 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController,
downloadManager.addListener(this)
LibraryUpdateService.setListener(this)
if (!manga.initialized) {
isLoading = true
controller.setRefresh(true)
controller.updateHeader()
launchUI {
controller.setRefresh(true)
}
refreshAll()
}
else {
@ -243,11 +241,9 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController,
true -> { c1, c2 -> c2.chapter_number.compareTo(c1.chapter_number) }
false -> { c1, c2 -> c1.chapter_number.compareTo(c2.chapter_number) }
}
else -> throw NotImplementedError("Unimplemented sorting method")
else -> { c1, c2 -> c1.source_order.compareTo(c2.source_order) }
}
chapters = chapters.sortedWith(Comparator(sortFunction))
//if (sortDescending())
// chapters = chapters.reversed()
return chapters
}
@ -258,6 +254,8 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController,
return chapters.sortedByDescending { it.source_order }.find { !it.read }
}
fun allUnread(): Boolean = chapters.none { it.read }
fun getUnreadChaptersSorted() = chapters
.filter { !it.read && it.status == Download.NOT_DOWNLOADED }
.distinctBy { it.name }

View File

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.ui.manga
import android.annotation.SuppressLint
import android.content.res.ColorStateList
import android.graphics.Color
import android.view.View
@ -27,9 +28,12 @@ import java.util.Locale
class MangaHeaderHolder(
private val view: View,
private val adapter: ChaptersAdapter
private val adapter: ChaptersAdapter,
startExpanded: Boolean
) : MangaChapterHolder(view, adapter) {
init {
start_reading_button.setOnClickListener { adapter.coverListener?.readNextChapter() }
top_view.updateLayoutParams<ConstraintLayout.LayoutParams> {
@ -49,7 +53,8 @@ class MangaHeaderHolder(
filter_button.setOnClickListener { adapter.coverListener?.showChapterFilter() }
filters_text.setOnClickListener { adapter.coverListener?.showChapterFilter() }
chapters_title.setOnClickListener { adapter.coverListener?.showChapterFilter() }
share_button.setOnClickListener { adapter.coverListener?.prepareToShareManga() }
webview_button.setOnClickListener { adapter.coverListener?.openInWebView() }
share_button.setOnClickListener { adapter.coverListener?.prepareToShareManga() }
favorite_button.setOnClickListener {
adapter.coverListener?.favoriteManga(false)
}
@ -57,6 +62,17 @@ class MangaHeaderHolder(
adapter.coverListener?.favoriteManga(true)
true
}
manga_full_title.setOnLongClickListener {
adapter.coverListener?.copyToClipboard(manga_full_title.text.toString(), R.string.manga_info_full_title_label)
true
}
manga_author.setOnLongClickListener {
adapter.coverListener?.copyToClipboard(manga_author.text.toString(), R.string.manga_info_author_label)
true
}
manga_cover.setOnClickListener { adapter.coverListener?.zoomImageFromThumb(cover_card) }
if (startExpanded)
expandDesc()
}
private fun expandDesc() {
@ -68,6 +84,7 @@ class MangaHeaderHolder(
}
}
@SuppressLint("SetTextI18n")
override fun bind(item: ChapterItem, manga: Manga) {
val presenter = adapter.coverListener?.mangaPresenter() ?: return
manga_full_title.text = manga.currentTitle()
@ -79,11 +96,11 @@ class MangaHeaderHolder(
if (manga.currentAuthor() == manga.currentArtist() ||
manga.currentArtist().isNullOrBlank())
manga_author.text = manga.currentAuthor()
manga_author.text = manga.currentAuthor()?.trim()
else {
manga_author.text = "${manga.currentAuthor()?.trim()}, ${manga.currentArtist()}"
}
manga_summary.text = manga.currentDesc() ?: itemView.context.getString(R.string
manga_summary.text = manga.currentDesc()?.trim() ?: itemView.context.getString(R.string
.no_description)
manga_summary.post {
@ -100,6 +117,7 @@ class MangaHeaderHolder(
manga.mangaType() == Manga.TYPE_MANHWA -> R.string.manhwa
manga.mangaType() == Manga.TYPE_MANHUA -> R.string.manhua
manga.mangaType() == Manga.TYPE_COMIC -> R.string.comic
manga.mangaType() == Manga.TYPE_WEBTOON -> R.string.webtoon
else -> R.string.manga
}
).toLowerCase(Locale.getDefault()))

View File

@ -45,7 +45,8 @@ class ChapterItem(val chapter: Chapter, val manga: Manga) :
}
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): MangaChapterHolder {
return if (chapter.isHeader) MangaHeaderHolder(view, adapter as ChaptersAdapter)
return if (chapter.isHeader) MangaHeaderHolder(view, adapter as ChaptersAdapter,
startExpanded = chapter.read)
else ChapterMatHolder(view, adapter as ChaptersAdapter)
}

View File

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.manga.chapter
import android.content.Context
import android.view.MenuItem
import android.view.View
import androidx.fragment.app.FragmentActivity
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.R
@ -61,11 +62,14 @@ class ChaptersAdapter(
fun coverColor(): Int?
fun mangaPresenter(): MangaDetailsPresenter
fun prepareToShareManga()
fun openInWebView()
fun readNextChapter()
fun downloadChapter(position: Int)
fun topCoverHeight(): Int
fun tagClicked(text: String)
fun showChapterFilter()
fun favoriteManga(longPress: Boolean)
fun copyToClipboard(content: String, label: Int)
fun zoomImageFromThumb(thumbView: View)
}
}

View File

@ -14,7 +14,7 @@ class SettingsReaderController : SettingsController() {
key = Keys.defaultViewer
titleRes = R.string.pref_viewer_type
entriesRes = arrayOf(R.string.left_to_right_viewer, R.string.right_to_left_viewer,
R.string.vertical_viewer, R.string.webtoon_viewer)
R.string.vertical_viewer, R.string.webtoon)
entryRange = 1..4
defaultValue = 1
}
@ -102,7 +102,7 @@ class SettingsReaderController : SettingsController() {
}
}
preferenceCategory {
titleRes = R.string.webtoon_viewer
titleRes = R.string.webtoon
switchPreference {
key = Keys.cropBordersWebtoon

View File

@ -11,14 +11,14 @@ class AutofitRecyclerView @JvmOverloads constructor(context: Context, attrs: Att
val manager = GridLayoutManager(context, 1)
var columnWidth = -1
/* set(value) {
set(value) {
field = value
if (value > 0) {
if (value > 0 && measuredWidth > 0) {
val count = max(1, measuredWidth / value)
spanCount = count
manager.spanCount = count
//manager.spanCount = count
}
}*/
}
var spanCount = 0

View File

@ -125,7 +125,7 @@
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:orientation="vertical"
android:layout_height="32sp">
android:layout_height="30sp">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
style="@style/TextAppearance.Regular.Body1.Light"

View File

@ -79,22 +79,22 @@
android:drawableEnd="@drawable/ic_sort_white_24dp"
android:drawablePadding="6dp"
android:drawableTint="@color/gray_button"
android:ellipsize="none"
android:ellipsize="start"
android:focusable="true"
android:gravity="center|end"
android:textAlignment="textEnd"
android:maxLines="2"
android:padding="6dp"
android:textAlignment="textEnd"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body2"
android:textColor="?android:attr/textColorPrimary"
android:textSize="12sp"
android:textStyle="normal"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="@id/category_title"
app:layout_constraintTop_toTopOf="@id/category_title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@id/space"
app:layout_constraintTop_toTopOf="@id/category_title"
app:layout_constraintWidth_min="100dp"
tools:text="Drag and Drop" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -2,13 +2,13 @@
<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/frame_layout"
android:id="@+id/frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:colorBackground">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@id/swipe_refresh"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:colorBackground">
@ -25,30 +25,6 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/chapters_title"
tools:listitem="@layout/chapters_mat_item"/>
<View
android:id="@+id/full_backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0"
android:clickable="true"
android:focusable="true"
android:foreground="@color/md_black_1000"
android:visibility="invisible"
tools:background="@color/md_black_1000" />
<ImageView
android:id="@+id/manga_cover_full"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:contentDescription="@string/description_cover"
android:visibility="invisible" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<eu.davidea.fastscroller.FastScroller
android:id="@+id/fast_scroller"
@ -57,4 +33,30 @@
android:layout_gravity="end"
app:fastScrollerBubbleEnabled="false"
tools:visibility="visible" />
<View
android:id="@+id/full_backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0"
android:clickable="true"
android:focusable="true"
android:foreground="@color/md_black_1000"
android:visibility="invisible"
tools:background="@color/md_black_1000" />
<ImageView
android:id="@+id/manga_cover_full"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:elevation="10dp"
android:translationZ="20dp"
android:layout_marginBottom="16dp"
android:contentDescription="@string/description_cover"
android:visibility="invisible" />
</FrameLayout>

View File

@ -64,6 +64,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
android:contentDescription="@string/description_cover"
android:maxHeight="300dp"
tools:background="@color/material_grey_700"
@ -164,14 +167,29 @@
android:text="@string/manga_tracking_tab"
app:icon="@drawable/ic_sync_black_24dp" />
<ImageView
android:id="@+id/share_button"
android:id="@+id/webview_button"
style="@style/Theme.Widget.CustomImageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="6dp"
android:layout_marginEnd="6dp"
android:tooltipText="@string/action_open_in_web_view"
android:padding="5dp"
android:contentDescription="@string/action_open_in_web_view"
android:src="@drawable/ic_open_in_webview_white_24dp" />
<ImageView
android:id="@+id/share_button"
style="@style/Theme.Widget.CustomImageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="0dp"
android:layout_marginEnd="6dp"
android:tooltipText="@string/action_share"
android:padding="5dp"
android:contentDescription="@string/action_share"
android:src="@drawable/ic_share_white_24dp" />
@ -214,7 +232,7 @@
<View
android:id="@+id/more_bg_gradient"
android:layout_width="50dp"
android:layout_height="20sp"
android:layout_height="16sp"
android:layout_marginEnd="30dp"
android:background="@drawable/full_gradient"
android:backgroundTint="?android:attr/colorBackground"
@ -224,7 +242,7 @@
<View
android:id="@+id/more_bg_solid"
android:layout_width="0dp"
android:layout_height="20sp"
android:layout_height="16sp"
android:layout_marginStart="45dp"
android:background="?android:attr/colorBackground"
app:layout_constraintBottom_toBottomOf="@id/manga_summary"
@ -331,6 +349,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:padding="5dp"
android:tooltipText="@string/action_filter"
android:src="@drawable/ic_filter_list_white_24dp"
app:layout_constraintBottom_toBottomOf="@id/chapters_title"
app:layout_constraintEnd_toEndOf="parent"

View File

@ -232,7 +232,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/webtoon_viewer"
android:text="@string/webtoon"
android:textColor="?attr/colorAccent"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"

View File

@ -14,7 +14,7 @@
<item
android:id="@+id/action_update"
android:title="@string/action_sort_last_updated"
android:title="@string/action_sort_latest_chapter"
android:icon="@drawable/ic_blank_24dp"/>
<item

View File

@ -15,4 +15,7 @@
<item android:id="@+id/action_remove_bookmark"
android:title="@string/action_remove_bookmark"
android:visible="true" />
<item android:id="@+id/action_mark_previous_as_read"
android:title="@string/action_mark_previous_as_read"/>
</menu>

View File

@ -15,7 +15,7 @@
<item
android:id="@+id/action_update"
android:title="@string/action_sort_last_updated"
android:title="@string/action_sort_latest_chapter"
android:icon="@drawable/ic_blank_24dp"/>
<item
android:id="@+id/action_unread"

View File

@ -11,7 +11,7 @@
<item
android:id="@+id/action_download"
android:icon="@drawable/ic_file_download_white_24dp"
android:title="@string/action_share"
android:title="@string/action_download"
app:showAsAction="ifRoom">
<menu>
<item
@ -42,8 +42,9 @@
app:showAsAction="never" />
<item
android:id="@+id/action_open_in_web_view"
android:title="@string/action_open_in_web_view"
android:id="@+id/action_mark_all_as_unread"
android:icon="@drawable/ic_done_all_white_24dp"
android:title="@string/action_mark_all_as_unread"
app:showAsAction="never" />
<item

View File

@ -131,7 +131,7 @@
<string name="left_to_right_viewer">من اليسار لليمين</string>
<string name="right_to_left_viewer">من اليمين لليسار</string>
<string name="vertical_viewer">عموديا</string>
<string name="webtoon_viewer">ويبتون</string>
<string name="webtoon">ويبتون</string>
<string name="pref_image_scale_type">كيفية ضبط الأبعاد</string>
<string name="scale_type_fit_screen">ملائمة الشاشة</string>
<string name="scale_type_stretch">التمدد</string>

View File

@ -120,7 +120,7 @@
<string name="left_to_right_viewer">От ляво надясно</string>
<string name="right_to_left_viewer">От дясно наляво</string>
<string name="vertical_viewer">Вертикално</string>
<string name="webtoon_viewer">Уебкомикс</string>
<string name="webtoon">Уебкомикс</string>
<string name="pref_image_scale_type">Увеличение</string>
<string name="scale_type_fit_screen">Запълване</string>
<string name="scale_type_stretch">Разтегляне</string>

View File

@ -130,7 +130,7 @@
<string name="left_to_right_viewer">বাম থেকে ডানে</string>
<string name="right_to_left_viewer">ডান থেকে বামে</string>
<string name="vertical_viewer">সোঁজাসুজি</string>
<string name="webtoon_viewer">ওয়েবটুন</string>
<string name="webtoon">ওয়েবটুন</string>
<string name="pref_image_scale_type">স্কেল ধরণ</string>
<string name="scale_type_fit_screen">সম্পূর্ণ স্ক্রিন</string>
<string name="scale_type_stretch">ছড়ানো</string>

View File

@ -151,7 +151,7 @@
<string name="left_to_right_viewer">D\'esquerra a dreta</string>
<string name="right_to_left_viewer">De dreta a esquerra</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Webtoons</string>
<string name="webtoon">Webtoons</string>
<string name="pager_viewer">Paginat</string>
<string name="pref_image_scale_type">Tipus d\'escalat</string>
<string name="scale_type_fit_screen">Ajusta a la pantalla</string>

View File

@ -242,7 +242,7 @@
<string name="pref_viewer_type">Výchozí prohlížeč</string>
<string name="default_viewer">Výchozí</string>
<string name="vertical_viewer">Vertikální</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Typ úpravy velikosti</string>
<string name="scale_type_fit_screen">Přizpůsobit obrazovce</string>
<string name="scale_type_stretch">Natáhnout</string>

View File

@ -124,7 +124,7 @@
<string name="left_to_right_viewer">Links nach rechts</string>
<string name="right_to_left_viewer">Rechts nach links</string>
<string name="vertical_viewer">Vertikal</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Skalierung</string>
<string name="scale_type_fit_screen">Bild ausfüllen</string>
<string name="scale_type_stretch">Strecken</string>

View File

@ -152,7 +152,7 @@
<string name="left_to_right_viewer">Αριστερά προς τα δεξιά</string>
<string name="right_to_left_viewer">Δεξιά προς τα αριστερά</string>
<string name="vertical_viewer">Κάθετα</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pager_viewer">Σελιδοποίηση</string>
<string name="pref_image_scale_type">Διάσταση κλίμακας</string>
<string name="scale_type_fit_screen">Προσαρμογή στην οθόνη</string>

View File

@ -92,7 +92,7 @@
<string name="left_to_right_viewer">Izquierda a derecha</string>
<string name="right_to_left_viewer">Derecha a izquierda</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Tipo de escalado</string>
<string name="scale_type_fit_screen">Ajustar a la pantalla</string>
<string name="scale_type_stretch">Estirado</string>

View File

@ -209,7 +209,7 @@
<string name="left_to_right_viewer">Vasemmalta oikealle</string>
<string name="right_to_left_viewer">Oikealta vasemmalle</string>
<string name="vertical_viewer">Pystysuora</string>
<string name="webtoon_viewer">Webtoon-tyylinen</string>
<string name="webtoon">Webtoon-tyylinen</string>
<string name="pager_viewer">Sivut</string>
<string name="pref_image_scale_type">Skaalauksen tyyppi</string>
<string name="scale_type_fit_screen">Sovita näyttöön</string>

View File

@ -112,7 +112,7 @@
<string name="left_to_right_viewer">Gauche à droite</string>
<string name="right_to_left_viewer">Droite à gauche</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Type de mise à l\'échelle</string>
<string name="scale_type_fit_screen">Adapter à l\'écran</string>
<string name="scale_type_stretch">Étirer</string>

View File

@ -127,7 +127,7 @@
<string name="left_to_right_viewer">बाएं से दाएं</string>
<string name="right_to_left_viewer">दाएं से बाएं</string>
<string name="vertical_viewer">शीर्ष से असंतत</string>
<string name="webtoon_viewer">वेबटून</string>
<string name="webtoon">वेबटून</string>
<string name="pref_image_scale_type">मापन प्ररूप</string>
<string name="scale_type_fit_screen">उपयुक्त स्क्रीन</string>
<string name="scale_type_stretch">खींचें</string>

View File

@ -142,7 +142,7 @@
<string name="left_to_right_viewer">Balról jobbra</string>
<string name="right_to_left_viewer">Jobbról balra</string>
<string name="vertical_viewer">Függőlegesen</string>
<string name="webtoon_viewer">Folytonos</string>
<string name="webtoon">Folytonos</string>
<string name="scale_type_fit_screen">Képernyőhöz igazítás</string>
<string name="label_migration">Forrás váltása</string>
<string name="label_extensions">Bővítmények</string>

View File

@ -126,7 +126,7 @@
<string name="left_to_right_viewer">Kiri ke kanan</string>
<string name="right_to_left_viewer">Kanan ke kiri</string>
<string name="vertical_viewer">Vertikal</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Tipe skala</string>
<string name="scale_type_fit_screen">Pas layar</string>
<string name="scale_type_stretch">Rentangkan</string>

View File

@ -111,7 +111,7 @@
<string name="left_to_right_viewer">Da sinistra a destra</string>
<string name="right_to_left_viewer">Da destra a sinistra</string>
<string name="vertical_viewer">Verticale</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Scala</string>
<string name="scale_type_fit_screen">Adatta a schermo</string>
<string name="scale_type_stretch">Riempi schermo</string>

View File

@ -130,7 +130,7 @@
<string name="left_to_right_viewer">左から右</string>
<string name="right_to_left_viewer">右から左</string>
<string name="vertical_viewer">縦反転</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pager_viewer">ページャ</string>
<string name="pref_image_scale_type">スケールの種類</string>
<string name="scale_type_fit_screen">フィット画面</string>

View File

@ -140,7 +140,7 @@
<string name="left_to_right_viewer">왼쪽에서 오른쪽으로</string>
<string name="right_to_left_viewer">오른쪽에서 왼쪽으로</string>
<string name="vertical_viewer">수직으로</string>
<string name="webtoon_viewer">웹툰</string>
<string name="webtoon">웹툰</string>
<string name="scale_type_stretch">늘리기</string>
<string name="scale_type_fit_width">가로 맞추기</string>
<string name="scale_type_fit_height">세로 맞추기</string>

View File

@ -126,7 +126,7 @@
<string name="left_to_right_viewer">Kiri ke kanan</string>
<string name="right_to_left_viewer">Kanan ke kiri</string>
<string name="vertical_viewer">Menegak</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Skala</string>
<string name="scale_type_fit_screen">Muat skrin</string>
<string name="scale_type_stretch">Regang</string>

View File

@ -147,7 +147,7 @@
<string name="left_to_right_viewer">Venstre til høyre</string>
<string name="right_to_left_viewer">Høyre til venstre</string>
<string name="vertical_viewer">Loddrett</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Skalatype</string>
<string name="scale_type_fit_screen">Tilpass skjerm</string>
<string name="scale_type_stretch">Strekk</string>

View File

@ -105,7 +105,7 @@
<string name="left_to_right_viewer">Links naar rechts</string>
<string name="right_to_left_viewer">Rechts naar links</string>
<string name="vertical_viewer">Verticaal</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="scale_type_stretch">Uitrekken</string>
<string name="scale_type_fit_width">Aanpassen aan de breedte</string>
<string name="scale_type_fit_height">Aanpassen aan de hoogte</string>

View File

@ -184,7 +184,7 @@
<string name="left_to_right_viewer">Od lewej do prawej</string>
<string name="right_to_left_viewer">Od prawej do lewej</string>
<string name="vertical_viewer">Pionowo</string>
<string name="webtoon_viewer">Web-komiks</string>
<string name="webtoon">Web-komiks</string>
<string name="pref_viewer_type">Domyślny styl czytania</string>
<string name="scale_type_fit_screen">Dopasuj do ekranu</string>
<string name="scale_type_stretch">Rozciągnij</string>

View File

@ -126,7 +126,7 @@
<string name="left_to_right_viewer">Esquerda para direita</string>
<string name="right_to_left_viewer">Direita para esquerda</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Vertical contínuo</string>
<string name="webtoon">Vertical contínuo</string>
<string name="pref_image_scale_type">Tipo de escala</string>
<string name="scale_type_fit_screen">Ajustar à tela</string>
<string name="scale_type_stretch">Estender</string>

View File

@ -95,7 +95,7 @@
<string name="left_to_right_viewer">Esquerda para Direita</string>
<string name="right_to_left_viewer">Direita para Esquerda</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pref_image_scale_type">Tipo de escala</string>
<string name="scale_type_fit_screen">Ajustar ao ecrã</string>
<string name="scale_type_stretch">Esticar</string>

View File

@ -152,7 +152,7 @@
<string name="left_to_right_viewer">De la stânga la dreapta</string>
<string name="right_to_left_viewer">De la dreapta la stânga</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Benzi desenate web</string>
<string name="webtoon">Benzi desenate web</string>
<string name="pager_viewer">Setări pagini</string>
<string name="pref_image_scale_type">Tip de mărime</string>
<string name="scale_type_fit_screen">Potrivire ecran</string>

View File

@ -652,7 +652,7 @@
<string name="want_to_read">Хочу прочитать</string>
<string name="webtoon_viewer">Веб-комикс</string>
<string name="webtoon">Веб-комикс</string>
<string name="white_background">Белый</string>

View File

@ -153,7 +153,7 @@
<string name="left_to_right_viewer">Dae manca a destra</string>
<string name="right_to_left_viewer">Dae destra a manca</string>
<string name="vertical_viewer">Verticale</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pager_viewer">Impaginadore</string>
<string name="pref_image_scale_type">Casta de iscala</string>
<string name="scale_type_fit_screen">Adata a s\'ischermu</string>

View File

@ -166,7 +166,7 @@
<string name="left_to_right_viewer">Zľava doprava</string>
<string name="right_to_left_viewer">Sprava doľava</string>
<string name="vertical_viewer">Vertikálne</string>
<string name="webtoon_viewer">Ako Webtoon - Zhora dole a strany sa spájajú do jednej dlhej</string>
<string name="webtoon">Ako Webtoon - Zhora dole a strany sa spájajú do jednej dlhej</string>
<string name="pager_viewer">pager</string>
<string name="pref_image_scale_type">Mód škálovania</string>
<string name="scale_type_fit_screen">Prispôsobiť obrazovke</string>

View File

@ -153,7 +153,7 @@
<string name="left_to_right_viewer">S leva na desno</string>
<string name="right_to_left_viewer">S desna na levo</string>
<string name="vertical_viewer">Verticalno</string>
<string name="webtoon_viewer">"Webtoon "</string>
<string name="webtoon">"Webtoon "</string>
<string name="pager_viewer">Stranično</string>
<string name="pref_image_scale_type">Tip skaliranja</string>
<string name="scale_type_fit_screen">Popuni ekran</string>

View File

@ -152,7 +152,7 @@
<string name="left_to_right_viewer">Vänster till höger</string>
<string name="right_to_left_viewer">Höger till vänster</string>
<string name="vertical_viewer">Vertikal</string>
<string name="webtoon_viewer">Webbtoon</string>
<string name="webtoon">Webbtoon</string>
<string name="pager_viewer">Sidläsare</string>
<string name="pref_image_scale_type">Skal typ</string>
<string name="scale_type_fit_screen">Passa skärmen</string>

View File

@ -155,7 +155,7 @@
<string name="left_to_right_viewer">จากซ้ายไปขวา</string>
<string name="right_to_left_viewer">จากขวาไปซ้าย</string>
<string name="vertical_viewer">แนวตั้ง</string>
<string name="webtoon_viewer">เว็บตูน</string>
<string name="webtoon">เว็บตูน</string>
<string name="pager_viewer">การแสดงหน้า</string>
<string name="pref_image_scale_type">ชนิดของมาตราส่วน</string>
<string name="scale_type_fit_screen">หน้าจอพอดี</string>

View File

@ -156,7 +156,7 @@
<string name="left_to_right_viewer">Kaliwa pakanan</string>
<string name="right_to_left_viewer">Kanan pakaliwa</string>
<string name="vertical_viewer">Patayo</string>
<string name="webtoon_viewer">Pa-webtoon</string>
<string name="webtoon">Pa-webtoon</string>
<string name="pager_viewer">Pager</string>
<string name="pref_image_scale_type">Uri ng pag-scale</string>
<string name="scale_type_fit_screen">Pagkasyahin sa screen</string>

View File

@ -151,7 +151,7 @@
<string name="left_to_right_viewer">Soldan sağa</string>
<string name="right_to_left_viewer">Sağdan sola</string>
<string name="vertical_viewer">Dikey</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pager_viewer">Sayfalama</string>
<string name="pref_image_scale_type">Boyutlandırma türü</string>
<string name="scale_type_fit_screen">Ekrana sığdır</string>

View File

@ -152,7 +152,7 @@
<string name="left_to_right_viewer">Зліва направо</string>
<string name="right_to_left_viewer">Справа наліво</string>
<string name="vertical_viewer">Вертикальний</string>
<string name="webtoon_viewer">Комікс</string>
<string name="webtoon">Комікс</string>
<string name="pager_viewer">Сторінка</string>
<string name="pref_image_scale_type">Масштабування</string>
<string name="scale_type_fit_screen">По екрану</string>

View File

@ -115,7 +115,7 @@
<string name="left_to_right_viewer">Trái sang phải</string>
<string name="right_to_left_viewer">Phải sang trái</string>
<string name="vertical_viewer">Theo chiều dọc</string>
<string name="webtoon_viewer">Chế độ cuộn</string>
<string name="webtoon">Chế độ cuộn</string>
<string name="pref_image_scale_type">Kiểu tỉ lệ</string>
<string name="scale_type_fit_screen">Vừa màn hình</string>
<string name="scale_type_stretch">Kéo dãn</string>

View File

@ -151,7 +151,7 @@
<string name="left_to_right_viewer">从左到右</string>
<string name="right_to_left_viewer">从右到左</string>
<string name="vertical_viewer">从上到下</string>
<string name="webtoon_viewer">卷纸模式</string>
<string name="webtoon">卷纸模式</string>
<string name="pager_viewer">页面</string>
<string name="pref_image_scale_type">显示模式</string>
<string name="scale_type_fit_screen">填充屏幕</string>

View File

@ -222,7 +222,7 @@
<string name="left_to_right_viewer">由左至右</string>
<string name="right_to_left_viewer">由右至左</string>
<string name="vertical_viewer">由上至下</string>
<string name="webtoon_viewer">Webtoon 式</string>
<string name="webtoon">Webtoon 式</string>
<string name="pager_viewer">單頁式</string>
<string name="pref_image_scale_type">縮放模式</string>
<string name="scale_type_fit_screen">符合螢幕</string>

View File

@ -6,7 +6,7 @@
<item>@string/left_to_right_viewer</item>
<item>@string/right_to_left_viewer</item>
<item>@string/vertical_viewer</item>
<item>@string/webtoon_viewer</item>
<item>@string/webtoon</item>
</string-array>
<string-array name="reader_themes">

View File

@ -69,6 +69,7 @@
<string name="action_select_all">Select all</string>
<string name="action_mark_as_read">Mark as read</string>
<string name="action_mark_all_as_read">Mark all as read</string>
<string name="action_mark_all_as_unread">Mark all as unread</string>
<string name="action_mark_as_unread">Mark as unread</string>
<string name="action_mark_previous_as_read">Mark previous as read</string>
<string name="action_mark_multiple">Mark multiple</string>
@ -126,7 +127,8 @@
<string name="action_copy_now">Copy now</string>
<string name="action_reorganize_by">Reorder</string>
<string name="action_reverse_order">Reverse order</string>
<string name="action_sort_last_updated">Last updated</string>
<string name="action_sort_last_updated">Last Updated</string>
<string name="action_sort_latest_chapter">Latest chapter</string>
<string name="action_hide_title">Hide title</string>
<string name="action_show_title">Show title</string>
<string name="action_newest">Newest</string>
@ -298,7 +300,7 @@
<string name="left_to_right_viewer">Left to right</string>
<string name="right_to_left_viewer">Right to left</string>
<string name="vertical_viewer">Vertical</string>
<string name="webtoon_viewer">Webtoon</string>
<string name="webtoon">Webtoon</string>
<string name="pager_viewer">Pager</string>
<string name="pref_image_scale_type">Scale type</string>
<string name="scale_type_fit_screen">Fit screen</string>
@ -509,6 +511,7 @@
</plurals>
<string name="no_description">No description</string>
<string name="mark_all_as_read_message">Mark all chapters as read?</string>
<string name="remove_from_library">Remove from library</string>
<!-- Manga chapters fragment -->
<string name="start_reading">Start reading</string>