parent
b512c67b5d
commit
112cdd54e3
@ -1,128 +1,116 @@
|
|||||||
package eu.kanade.tachiyomi.ui.manga.chapter
|
package eu.kanade.tachiyomi.ui.manga.chapter
|
||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.PopupMenu
|
import android.widget.PopupMenu
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.davidea.viewholders.FlexibleViewHolder
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.download.model.Download
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
import eu.kanade.tachiyomi.util.getResourceColor
|
import eu.kanade.tachiyomi.util.getResourceColor
|
||||||
import kotlinx.android.synthetic.main.item_chapter.view.*
|
import kotlinx.android.synthetic.main.item_chapter.view.*
|
||||||
import java.text.DateFormat
|
import java.text.DateFormat
|
||||||
import java.text.DecimalFormat
|
import java.text.DecimalFormat
|
||||||
import java.text.DecimalFormatSymbols
|
import java.text.DecimalFormatSymbols
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class ChaptersHolder(
|
class ChapterHolder(
|
||||||
private val view: View,
|
private val view: View,
|
||||||
private val adapter: ChaptersAdapter,
|
private val adapter: ChaptersAdapter)
|
||||||
listener: FlexibleViewHolder.OnListItemClickListener)
|
: FlexibleViewHolder(view, adapter) {
|
||||||
: FlexibleViewHolder(view, adapter, listener) {
|
|
||||||
|
private val readColor = view.context.getResourceColor(android.R.attr.textColorHint)
|
||||||
private val readColor = view.context.getResourceColor(android.R.attr.textColorHint)
|
private val unreadColor = view.context.getResourceColor(android.R.attr.textColorPrimary)
|
||||||
private val unreadColor = view.context.getResourceColor(android.R.attr.textColorPrimary)
|
private val bookmarkedColor = view.context.getResourceColor(R.attr.colorAccent)
|
||||||
private val bookmarkedColor = view.context.getResourceColor(R.attr.colorAccent)
|
private val decimalFormat = DecimalFormat("#.###", DecimalFormatSymbols().apply { decimalSeparator = '.' })
|
||||||
private val decimalFormat = DecimalFormat("#.###", DecimalFormatSymbols().apply { decimalSeparator = '.' })
|
private val df = DateFormat.getDateInstance(DateFormat.SHORT)
|
||||||
private val df = DateFormat.getDateInstance(DateFormat.SHORT)
|
|
||||||
|
init {
|
||||||
private var item: ChapterModel? = null
|
// We need to post a Runnable to show the popup to make sure that the PopupMenu is
|
||||||
|
// correctly positioned. The reason being that the view may change position before the
|
||||||
init {
|
// PopupMenu is shown.
|
||||||
// We need to post a Runnable to show the popup to make sure that the PopupMenu is
|
view.chapter_menu.setOnClickListener { it.post { showPopupMenu(it) } }
|
||||||
// correctly positioned. The reason being that the view may change position before the
|
}
|
||||||
// PopupMenu is shown.
|
|
||||||
view.chapter_menu.setOnClickListener { it.post { showPopupMenu(it) } }
|
fun bind(item: ChapterItem, manga: Manga) = with(view) {
|
||||||
}
|
val chapter = item.chapter
|
||||||
|
|
||||||
fun onSetValues(chapter: ChapterModel, manga: Manga?) = with(view) {
|
chapter_title.text = when (manga.displayMode) {
|
||||||
item = chapter
|
Manga.DISPLAY_NUMBER -> {
|
||||||
|
val formattedNumber = decimalFormat.format(chapter.chapter_number.toDouble())
|
||||||
chapter_title.text = when (manga?.displayMode) {
|
context.getString(R.string.display_mode_chapter, formattedNumber)
|
||||||
Manga.DISPLAY_NUMBER -> {
|
}
|
||||||
val formattedNumber = decimalFormat.format(chapter.chapter_number.toDouble())
|
else -> chapter.name
|
||||||
context.getString(R.string.display_mode_chapter, formattedNumber)
|
}
|
||||||
}
|
|
||||||
else -> chapter.name
|
// Set correct text color
|
||||||
}
|
chapter_title.setTextColor(if (chapter.read) readColor else unreadColor)
|
||||||
|
if (chapter.bookmark) chapter_title.setTextColor(bookmarkedColor)
|
||||||
// Set correct text color
|
|
||||||
chapter_title.setTextColor(if (chapter.read) readColor else unreadColor)
|
if (chapter.date_upload > 0) {
|
||||||
if (chapter.bookmark) chapter_title.setTextColor(bookmarkedColor)
|
chapter_date.text = df.format(Date(chapter.date_upload))
|
||||||
|
chapter_date.setTextColor(if (chapter.read) readColor else unreadColor)
|
||||||
if (chapter.date_upload > 0) {
|
} else {
|
||||||
chapter_date.text = df.format(Date(chapter.date_upload))
|
chapter_date.text = ""
|
||||||
chapter_date.setTextColor(if (chapter.read) readColor else unreadColor)
|
}
|
||||||
} else {
|
|
||||||
chapter_date.text = ""
|
chapter_pages.text = if (!chapter.read && chapter.last_page_read > 0) {
|
||||||
}
|
context.getString(R.string.chapter_progress, chapter.last_page_read + 1)
|
||||||
|
} else {
|
||||||
chapter_pages.text = if (!chapter.read && chapter.last_page_read > 0) {
|
""
|
||||||
context.getString(R.string.chapter_progress, chapter.last_page_read + 1)
|
}
|
||||||
} else {
|
|
||||||
""
|
notifyStatus(item.status)
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyStatus(chapter.status)
|
fun notifyStatus(status: Int) = with(view.download_text) {
|
||||||
}
|
when (status) {
|
||||||
|
Download.QUEUE -> setText(R.string.chapter_queued)
|
||||||
fun notifyStatus(status: Int) = with(view.download_text) {
|
Download.DOWNLOADING -> setText(R.string.chapter_downloading)
|
||||||
when (status) {
|
Download.DOWNLOADED -> setText(R.string.chapter_downloaded)
|
||||||
Download.QUEUE -> setText(R.string.chapter_queued)
|
Download.ERROR -> setText(R.string.chapter_error)
|
||||||
Download.DOWNLOADING -> setText(R.string.chapter_downloading)
|
else -> text = ""
|
||||||
Download.DOWNLOADED -> setText(R.string.chapter_downloaded)
|
}
|
||||||
Download.ERROR -> setText(R.string.chapter_error)
|
}
|
||||||
else -> text = ""
|
|
||||||
}
|
private fun showPopupMenu(view: View) {
|
||||||
}
|
val item = adapter.getItem(adapterPosition) ?: return
|
||||||
|
|
||||||
private fun showPopupMenu(view: View) = item?.let { chapter ->
|
// Create a PopupMenu, giving it the clicked view for an anchor
|
||||||
// Create a PopupMenu, giving it the clicked view for an anchor
|
val popup = PopupMenu(view.context, view)
|
||||||
val popup = PopupMenu(view.context, view)
|
|
||||||
|
// Inflate our menu resource into the PopupMenu's Menu
|
||||||
// Inflate our menu resource into the PopupMenu's Menu
|
popup.menuInflater.inflate(R.menu.chapter_single, popup.menu)
|
||||||
popup.menuInflater.inflate(R.menu.chapter_single, popup.menu)
|
|
||||||
|
val chapter = item.chapter
|
||||||
// Hide download and show delete if the chapter is downloaded
|
|
||||||
if (chapter.isDownloaded) {
|
// Hide download and show delete if the chapter is downloaded
|
||||||
popup.menu.findItem(R.id.action_download).isVisible = false
|
if (item.isDownloaded) {
|
||||||
popup.menu.findItem(R.id.action_delete).isVisible = true
|
popup.menu.findItem(R.id.action_download).isVisible = false
|
||||||
}
|
popup.menu.findItem(R.id.action_delete).isVisible = true
|
||||||
|
}
|
||||||
// Hide bookmark if bookmark
|
|
||||||
popup.menu.findItem(R.id.action_bookmark).isVisible = !chapter.bookmark
|
// Hide bookmark if bookmark
|
||||||
popup.menu.findItem(R.id.action_remove_bookmark).isVisible = chapter.bookmark
|
popup.menu.findItem(R.id.action_bookmark).isVisible = !chapter.bookmark
|
||||||
|
popup.menu.findItem(R.id.action_remove_bookmark).isVisible = chapter.bookmark
|
||||||
// Hide mark as unread when the chapter is unread
|
|
||||||
if (!chapter.read && chapter.last_page_read == 0) {
|
// Hide mark as unread when the chapter is unread
|
||||||
popup.menu.findItem(R.id.action_mark_as_unread).isVisible = false
|
if (!chapter.read && chapter.last_page_read == 0) {
|
||||||
}
|
popup.menu.findItem(R.id.action_mark_as_unread).isVisible = false
|
||||||
|
}
|
||||||
// Hide mark as read when the chapter is read
|
|
||||||
if (chapter.read) {
|
// Hide mark as read when the chapter is read
|
||||||
popup.menu.findItem(R.id.action_mark_as_read).isVisible = false
|
if (chapter.read) {
|
||||||
}
|
popup.menu.findItem(R.id.action_mark_as_read).isVisible = false
|
||||||
|
}
|
||||||
// Set a listener so we are notified if a menu item is clicked
|
|
||||||
popup.setOnMenuItemClickListener { menuItem ->
|
// Set a listener so we are notified if a menu item is clicked
|
||||||
val chapterList = listOf(chapter)
|
popup.setOnMenuItemClickListener { menuItem ->
|
||||||
|
adapter.menuItemListener(adapterPosition, menuItem)
|
||||||
with(adapter.fragment) {
|
true
|
||||||
when (menuItem.itemId) {
|
}
|
||||||
R.id.action_download -> downloadChapters(chapterList)
|
|
||||||
R.id.action_bookmark -> bookmarkChapters(chapterList, true)
|
// Finally show the PopupMenu
|
||||||
R.id.action_remove_bookmark -> bookmarkChapters(chapterList, false)
|
popup.show()
|
||||||
R.id.action_delete -> deleteChapters(chapterList)
|
}
|
||||||
R.id.action_mark_as_read -> markAsRead(chapterList)
|
|
||||||
R.id.action_mark_as_unread -> markAsUnread(chapterList)
|
}
|
||||||
R.id.action_mark_previous_as_read -> markPreviousAsRead(chapter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally show the PopupMenu
|
|
||||||
popup.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,50 @@
|
|||||||
|
package eu.kanade.tachiyomi.ui.manga.chapter
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
|
||||||
|
import eu.kanade.tachiyomi.R
|
||||||
|
import eu.kanade.tachiyomi.data.database.models.Chapter
|
||||||
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
import eu.kanade.tachiyomi.data.download.model.Download
|
||||||
|
|
||||||
|
class ChapterItem(val chapter: Chapter, val manga: Manga) : AbstractFlexibleItem<ChapterHolder>(),
|
||||||
|
Chapter by chapter {
|
||||||
|
|
||||||
|
private var _status: Int = 0
|
||||||
|
|
||||||
|
var status: Int
|
||||||
|
get() = download?.status ?: _status
|
||||||
|
set(value) { _status = value }
|
||||||
|
|
||||||
|
@Transient var download: Download? = null
|
||||||
|
|
||||||
|
val isDownloaded: Boolean
|
||||||
|
get() = status == Download.DOWNLOADED
|
||||||
|
|
||||||
|
override fun getLayoutRes(): Int {
|
||||||
|
return R.layout.item_chapter
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createViewHolder(adapter: FlexibleAdapter<*>, inflater: LayoutInflater, parent: ViewGroup): ChapterHolder {
|
||||||
|
return ChapterHolder(inflater.inflate(layoutRes, parent, false), adapter as ChaptersAdapter)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: ChapterHolder, position: Int, payloads: List<Any?>?) {
|
||||||
|
holder.bind(this, manga)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (this === other) return true
|
||||||
|
if (other is ChapterItem) {
|
||||||
|
return chapter.id!! == other.chapter.id!!
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return chapter.id!!.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,19 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.ui.manga.chapter
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter
|
|
||||||
import eu.kanade.tachiyomi.data.download.model.Download
|
|
||||||
|
|
||||||
class ChapterModel(c: Chapter) : Chapter by c {
|
|
||||||
|
|
||||||
private var _status: Int = 0
|
|
||||||
|
|
||||||
var status: Int
|
|
||||||
get() = download?.status ?: _status
|
|
||||||
set(value) { _status = value }
|
|
||||||
|
|
||||||
@Transient var download: Download? = null
|
|
||||||
|
|
||||||
val isDownloaded: Boolean
|
|
||||||
get() = status == Download.DOWNLOADED
|
|
||||||
|
|
||||||
}
|
|
@ -1,42 +1,19 @@
|
|||||||
package eu.kanade.tachiyomi.ui.manga.chapter
|
package eu.kanade.tachiyomi.ui.manga.chapter
|
||||||
|
|
||||||
import android.view.ViewGroup
|
import android.view.MenuItem
|
||||||
import eu.davidea.flexibleadapter4.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
import eu.kanade.tachiyomi.R
|
|
||||||
import eu.kanade.tachiyomi.util.inflate
|
|
||||||
|
|
||||||
class ChaptersAdapter(val fragment: ChaptersFragment) : FlexibleAdapter<ChaptersHolder, ChapterModel>() {
|
class ChaptersAdapter(val fragment: ChaptersFragment) : FlexibleAdapter<ChapterItem>(null, fragment, true) {
|
||||||
|
|
||||||
init {
|
var items: List<ChapterItem> = emptyList()
|
||||||
setHasStableIds(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
var items: List<ChapterModel>
|
|
||||||
get() = mItems
|
|
||||||
set(value) {
|
|
||||||
mItems = value
|
|
||||||
notifyDataSetChanged()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun updateDataSet(param: String) {
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChaptersHolder {
|
|
||||||
val v = parent.inflate(R.layout.item_chapter)
|
|
||||||
return ChaptersHolder(v, this, fragment)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: ChaptersHolder, position: Int) {
|
|
||||||
val chapter = getItem(position)
|
|
||||||
val manga = fragment.presenter.manga
|
|
||||||
holder.onSetValues(chapter, manga)
|
|
||||||
|
|
||||||
//When user scrolls this bind the correct selection status
|
val menuItemListener: (Int, MenuItem) -> Unit = { position, item ->
|
||||||
holder.itemView.isActivated = isSelected(position)
|
fragment.onItemMenuClick(position, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemId(position: Int): Long {
|
override fun updateDataSet(items: List<ChapterItem>) {
|
||||||
return mItems[position].id!!
|
this.items = items
|
||||||
|
super.updateDataSet(items.toList())
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in new issue