mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-12-23 16:51:49 +01:00
Binding Holders
I'm in absolute pain
This commit is contained in:
parent
ea3ea165aa
commit
89f4ad393b
@ -4,11 +4,11 @@ import android.view.View
|
||||
import androidx.appcompat.widget.PopupMenu
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.download.model.Download
|
||||
import eu.kanade.tachiyomi.databinding.DownloadItemBinding
|
||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.util.system.getResourceColor
|
||||
import eu.kanade.tachiyomi.util.view.setVectorCompat
|
||||
import eu.kanade.tachiyomi.util.view.visibleIf
|
||||
import kotlinx.android.synthetic.main.download_item.*
|
||||
|
||||
/**
|
||||
* Class used to hold the data of a download.
|
||||
@ -20,9 +20,10 @@ import kotlinx.android.synthetic.main.download_item.*
|
||||
class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
|
||||
BaseFlexibleViewHolder(view, adapter) {
|
||||
|
||||
private val binding = DownloadItemBinding.bind(view)
|
||||
init {
|
||||
setDragHandleView(reorder)
|
||||
migration_menu.setOnClickListener { it.post { showPopupMenu(it) } }
|
||||
setDragHandleView(binding.reorder)
|
||||
binding.downloadMenu.setOnClickListener { it.post { showPopupMenu(it) } }
|
||||
}
|
||||
|
||||
private lateinit var download: Download
|
||||
@ -30,30 +31,30 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
|
||||
/**
|
||||
* Binds this holder with the given category.
|
||||
*
|
||||
* @param category The category to bind.
|
||||
* @param download The download to bind.
|
||||
*/
|
||||
fun bind(download: Download) {
|
||||
this.download = download
|
||||
// Update the chapter name.
|
||||
chapter_title.text = download.chapter.name
|
||||
binding.chapterTitle.text = download.chapter.name
|
||||
|
||||
// Update the manga title
|
||||
title.text = download.manga.title
|
||||
binding.title.text = download.manga.title
|
||||
|
||||
// Update the progress bar and the number of downloaded pages
|
||||
val pages = download.pages
|
||||
if (pages == null) {
|
||||
download_progress.progress = 0
|
||||
download_progress.max = 1
|
||||
download_progress_text.text = ""
|
||||
binding.downloadProgress.progress = 0
|
||||
binding.downloadProgress.max = 1
|
||||
binding.downloadProgressText.text = ""
|
||||
} else {
|
||||
download_progress.max = pages.size * 100
|
||||
binding.downloadProgress.max = pages.size * 100
|
||||
notifyProgress()
|
||||
notifyDownloadedPages()
|
||||
}
|
||||
|
||||
migration_menu.visibleIf(flexibleAdapterPosition != 0 || flexibleAdapterPosition != adapter.itemCount - 1)
|
||||
migration_menu.setVectorCompat(
|
||||
binding.downloadMenu.visibleIf(flexibleAdapterPosition != 0 || flexibleAdapterPosition != adapter.itemCount - 1)
|
||||
binding.downloadMenu.setVectorCompat(
|
||||
R.drawable.ic_more_vert_24dp,
|
||||
view.context
|
||||
.getResourceColor(android.R.attr.textColorPrimary)
|
||||
@ -65,10 +66,10 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
|
||||
*/
|
||||
fun notifyProgress() {
|
||||
val pages = download.pages ?: return
|
||||
if (download_progress.max == 1) {
|
||||
download_progress.max = pages.size * 100
|
||||
if (binding.downloadProgress.max == 1) {
|
||||
binding.downloadProgress.max = pages.size * 100
|
||||
}
|
||||
download_progress.progress = download.pageProgress
|
||||
binding.downloadProgress.progress = download.pageProgress
|
||||
}
|
||||
|
||||
/**
|
||||
@ -76,7 +77,7 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
|
||||
*/
|
||||
fun notifyDownloadedPages() {
|
||||
val pages = download.pages ?: return
|
||||
download_progress_text.text = "${download.downloadedImages}/${pages.size}"
|
||||
binding.downloadProgressText.text = "${download.downloadedImages}/${pages.size}"
|
||||
}
|
||||
|
||||
override fun onItemReleased(position: Int) {
|
||||
@ -93,8 +94,6 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
|
||||
// Inflate our menu resource into the PopupMenu's Menu
|
||||
popup.menuInflater.inflate(R.menu.download_single, popup.menu)
|
||||
|
||||
val download = item.download
|
||||
|
||||
popup.menu.findItem(R.id.move_to_top).isVisible = flexibleAdapterPosition != 0
|
||||
popup.menu.findItem(R.id.move_to_bottom).isVisible = flexibleAdapterPosition != adapter
|
||||
.itemCount - 1
|
||||
@ -110,14 +109,14 @@ class DownloadHolder(private val view: View, val adapter: DownloadAdapter) :
|
||||
}
|
||||
|
||||
override fun getFrontView(): View {
|
||||
return front_view
|
||||
return binding.frontView
|
||||
}
|
||||
|
||||
override fun getRearRightView(): View {
|
||||
return right_view
|
||||
return binding.rightView
|
||||
}
|
||||
|
||||
override fun getRearLeftView(): View {
|
||||
return left_view
|
||||
return binding.leftView
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,10 @@ import android.view.ViewGroup
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.databinding.ExtensionDetailHeaderBinding
|
||||
import eu.kanade.tachiyomi.ui.extension.getApplicationIcon
|
||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||
import eu.kanade.tachiyomi.util.view.inflate
|
||||
import kotlinx.android.synthetic.main.extension_detail_header.view.*
|
||||
|
||||
class ExtensionDetailsHeaderAdapter(private val presenter: ExtensionDetailsPresenter) :
|
||||
RecyclerView.Adapter<ExtensionDetailsHeaderAdapter.HeaderViewHolder>() {
|
||||
@ -34,28 +34,29 @@ class ExtensionDetailsHeaderAdapter(private val presenter: ExtensionDetailsPrese
|
||||
|
||||
inner class HeaderViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
|
||||
fun bind() {
|
||||
val binding = ExtensionDetailHeaderBinding.bind(view)
|
||||
val extension = presenter.extension ?: return
|
||||
val context = view.context
|
||||
|
||||
extension.getApplicationIcon(context)?.let { view.extension_icon.setImageDrawable(it) }
|
||||
view.extension_title.text = extension.name
|
||||
view.extension_version.text = context.getString(R.string.version_, extension.versionName)
|
||||
view.extension_lang.text = context.getString(R.string.language_, LocaleHelper.getSourceDisplayName(extension.lang, context))
|
||||
view.extension_nsfw.isVisible = extension.isNsfw
|
||||
view.extension_pkg.text = extension.pkgName
|
||||
extension.getApplicationIcon(context)?.let { binding.extensionIcon.setImageDrawable(it) }
|
||||
binding.extensionTitle.text = extension.name
|
||||
binding.extensionVersion.text = context.getString(R.string.version_, extension.versionName)
|
||||
binding.extensionLang.text = context.getString(R.string.language_, LocaleHelper.getSourceDisplayName(extension.lang, context))
|
||||
binding.extensionNsfw.isVisible = extension.isNsfw
|
||||
binding.extensionPkg.text = extension.pkgName
|
||||
|
||||
view.extension_uninstall_button.setOnClickListener {
|
||||
binding.extensionUninstallButton.setOnClickListener {
|
||||
presenter.uninstallExtension()
|
||||
}
|
||||
|
||||
if (extension.isObsolete) {
|
||||
view.extension_warning_banner.isVisible = true
|
||||
view.extension_warning_banner.setText(R.string.obsolete_extension_message)
|
||||
binding.extensionWarningBanner.isVisible = true
|
||||
binding.extensionWarningBanner.setText(R.string.obsolete_extension_message)
|
||||
}
|
||||
|
||||
if (extension.isUnofficial) {
|
||||
view.extension_warning_banner.isVisible = true
|
||||
view.extension_warning_banner.setText(R.string.unofficial_extension_message)
|
||||
binding.extensionWarningBanner.isVisible = true
|
||||
binding.extensionWarningBanner.setText(R.string.unofficial_extension_message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,10 +8,11 @@ import coil.api.clear
|
||||
import coil.api.load
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
|
||||
import eu.kanade.tachiyomi.databinding.TrackSearchItemBinding
|
||||
import eu.kanade.tachiyomi.util.view.gone
|
||||
import eu.kanade.tachiyomi.util.view.inflate
|
||||
import kotlinx.android.synthetic.main.track_search_item.view.*
|
||||
import java.util.ArrayList
|
||||
import java.util.Locale
|
||||
|
||||
class TrackSearchAdapter(context: Context) :
|
||||
ArrayAdapter<TrackSearch>(context, R.layout.track_search_item, ArrayList<TrackSearch>()) {
|
||||
@ -43,32 +44,33 @@ class TrackSearchAdapter(context: Context) :
|
||||
class TrackSearchHolder(private val view: View) {
|
||||
|
||||
fun onSetValues(track: TrackSearch) {
|
||||
view.track_search_title.text = track.title
|
||||
view.track_search_summary.text = track.summary
|
||||
view.track_search_cover.clear()
|
||||
if (!track.cover_url.isNullOrEmpty()) {
|
||||
view.track_search_cover.load(track.cover_url)
|
||||
val binding = TrackSearchItemBinding.bind(view)
|
||||
binding.trackSearchTitle.text = track.title
|
||||
binding.trackSearchSummary.text = track.summary
|
||||
binding.trackSearchCover.clear()
|
||||
if (track.cover_url.isNotEmpty()) {
|
||||
binding.trackSearchCover.load(track.cover_url)
|
||||
}
|
||||
|
||||
if (track.publishing_status.isNullOrBlank()) {
|
||||
view.track_search_status.gone()
|
||||
view.track_search_status_result.gone()
|
||||
if (track.publishing_status.isBlank()) {
|
||||
binding.trackSearchStatus.gone()
|
||||
binding.trackSearchStatusResult.gone()
|
||||
} else {
|
||||
view.track_search_status_result.text = track.publishing_status.capitalize()
|
||||
binding.trackSearchStatusResult.text = track.publishing_status.capitalize(Locale.ROOT)
|
||||
}
|
||||
|
||||
if (track.publishing_type.isNullOrBlank()) {
|
||||
view.track_search_type.gone()
|
||||
view.track_search_type_result.gone()
|
||||
if (track.publishing_type.isBlank()) {
|
||||
binding.trackSearchType.gone()
|
||||
binding.trackSearchTypeResult.gone()
|
||||
} else {
|
||||
view.track_search_type_result.text = track.publishing_type.capitalize()
|
||||
binding.trackSearchTypeResult.text = track.publishing_type.capitalize(Locale.ROOT)
|
||||
}
|
||||
|
||||
if (track.start_date.isNullOrBlank()) {
|
||||
view.track_search_start.gone()
|
||||
view.track_search_start_result.gone()
|
||||
if (track.start_date.isBlank()) {
|
||||
binding.trackSearchStart.gone()
|
||||
binding.trackSearchStartResult.gone()
|
||||
} else {
|
||||
view.track_search_start_result.text = track.start_date
|
||||
binding.trackSearchStartResult.text = track.start_date
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,8 +6,8 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem
|
||||
import eu.davidea.flexibleadapter.items.IFlexible
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.databinding.SourceHeaderItemBinding
|
||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||
import kotlinx.android.synthetic.main.source_header_item.*
|
||||
|
||||
/**
|
||||
* Item that contains the selection header.
|
||||
@ -25,7 +25,7 @@ class SelectionHeader : AbstractHeaderItem<SelectionHeader.Holder>() {
|
||||
* Creates a new view holder for this item.
|
||||
*/
|
||||
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
|
||||
return SelectionHeader.Holder(view, adapter)
|
||||
return Holder(view, adapter)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -42,7 +42,8 @@ class SelectionHeader : AbstractHeaderItem<SelectionHeader.Holder>() {
|
||||
|
||||
class Holder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>) : BaseFlexibleViewHolder(view, adapter) {
|
||||
init {
|
||||
title.text = view.context.getString(R.string.select_a_source_then_item_to_migrate)
|
||||
val binding = SourceHeaderItemBinding.bind(view)
|
||||
binding.title.text = view.context.getString(R.string.select_a_source_then_item_to_migrate)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,11 +7,10 @@ import coil.api.clear
|
||||
import coil.transform.CircleCropTransformation
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.image.coil.loadLibraryManga
|
||||
import eu.kanade.tachiyomi.databinding.RecentChaptersItemBinding
|
||||
import eu.kanade.tachiyomi.ui.manga.chapter.BaseChapterHolder
|
||||
import eu.kanade.tachiyomi.util.chapter.ChapterUtil
|
||||
import eu.kanade.tachiyomi.util.system.getResourceColor
|
||||
import kotlinx.android.synthetic.main.download_button.*
|
||||
import kotlinx.android.synthetic.main.recent_chapters_item.*
|
||||
|
||||
/**
|
||||
* Holder that contains chapter item
|
||||
@ -41,8 +40,9 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
|
||||
*/
|
||||
private var item: RecentChapterItem? = null
|
||||
|
||||
private val binding = RecentChaptersItemBinding.bind(view)
|
||||
init {
|
||||
manga_cover.setOnClickListener {
|
||||
binding.mangaCover.setOnClickListener {
|
||||
adapter.coverClickListener.onCoverClick(flexibleAdapterPosition)
|
||||
}
|
||||
}
|
||||
@ -55,16 +55,16 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
|
||||
fun bind(item: RecentChapterItem) {
|
||||
this.item = item
|
||||
|
||||
// Set chapter title
|
||||
chapter_title.text = item.chapter.name
|
||||
// Set chapter binding.title
|
||||
binding.chapterTitle.text = item.chapter.name
|
||||
|
||||
// Set manga title
|
||||
title.text = item.manga.title
|
||||
// Set manga binding.title
|
||||
binding.title.text = item.manga.title
|
||||
|
||||
if (front_view.translationX == 0f) {
|
||||
read.setImageDrawable(
|
||||
if (binding.frontView.translationX == 0f) {
|
||||
binding.read.setImageDrawable(
|
||||
ContextCompat.getDrawable(
|
||||
read.context,
|
||||
binding.root.context,
|
||||
if (item.read) R.drawable.ic_eye_off_24dp
|
||||
else R.drawable.ic_eye_24dp
|
||||
)
|
||||
@ -73,15 +73,15 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
|
||||
|
||||
// Set cover
|
||||
if ((view.context as? Activity)?.isDestroyed != true) {
|
||||
manga_cover.clear()
|
||||
manga_cover.loadLibraryManga(item.manga) {
|
||||
binding.mangaCover.clear()
|
||||
binding.mangaCover.loadLibraryManga(item.manga) {
|
||||
transformations(CircleCropTransformation())
|
||||
}
|
||||
}
|
||||
|
||||
val chapterColor = ChapterUtil.chapterColor(itemView.context, item)
|
||||
chapter_title.setTextColor(chapterColor)
|
||||
title.setTextColor(chapterColor)
|
||||
binding.chapterTitle.setTextColor(chapterColor)
|
||||
binding.title.setTextColor(chapterColor)
|
||||
|
||||
// Set chapter status
|
||||
notifyStatus(item.status, item.progress)
|
||||
@ -89,15 +89,15 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
|
||||
}
|
||||
|
||||
private fun resetFrontView() {
|
||||
if (front_view.translationX != 0f) itemView.post { adapter.notifyItemChanged(flexibleAdapterPosition) }
|
||||
if (binding.frontView.translationX != 0f) itemView.post { adapter.notifyItemChanged(flexibleAdapterPosition) }
|
||||
}
|
||||
|
||||
override fun getFrontView(): View {
|
||||
return front_view
|
||||
return binding.frontView
|
||||
}
|
||||
|
||||
override fun getRearRightView(): View {
|
||||
return right_view
|
||||
return binding.rightView
|
||||
}
|
||||
|
||||
/**
|
||||
@ -106,5 +106,5 @@ class RecentChapterHolder(private val view: View, private val adapter: RecentCha
|
||||
* @param status download status
|
||||
*/
|
||||
fun notifyStatus(status: Int, progress: Int) =
|
||||
download_button.setDownloadStatus(status, progress)
|
||||
binding.downloadButton.root.setDownloadStatus(status, progress)
|
||||
}
|
||||
|
@ -5,9 +5,9 @@ import coil.api.clear
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory
|
||||
import eu.kanade.tachiyomi.data.image.coil.loadLibraryManga
|
||||
import eu.kanade.tachiyomi.databinding.RecentlyReadItemBinding
|
||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.util.lang.toTimestampString
|
||||
import kotlinx.android.synthetic.main.recently_read_item.*
|
||||
import java.util.Date
|
||||
|
||||
/**
|
||||
@ -24,16 +24,17 @@ class RecentlyReadHolder(
|
||||
val adapter: RecentlyReadAdapter
|
||||
) : BaseFlexibleViewHolder(view, adapter) {
|
||||
|
||||
private val binding = RecentlyReadItemBinding.bind(view)
|
||||
init {
|
||||
remove.setOnClickListener {
|
||||
binding.remove.setOnClickListener {
|
||||
adapter.removeClickListener.onRemoveClick(flexibleAdapterPosition)
|
||||
}
|
||||
|
||||
resume.setOnClickListener {
|
||||
binding.resume.setOnClickListener {
|
||||
adapter.resumeClickListener.onResumeClick(flexibleAdapterPosition)
|
||||
}
|
||||
|
||||
cover.setOnClickListener {
|
||||
binding.cover.setOnClickListener {
|
||||
adapter.coverClickListener.onCoverClick(flexibleAdapterPosition)
|
||||
}
|
||||
}
|
||||
@ -48,18 +49,18 @@ class RecentlyReadHolder(
|
||||
val (manga, chapter, history) = item
|
||||
|
||||
// Set manga title
|
||||
title.text = manga.title
|
||||
binding.title.text = manga.title
|
||||
|
||||
// Set source + chapter title
|
||||
val formattedNumber = adapter.decimalFormat.format(chapter.chapter_number.toDouble())
|
||||
manga_source.text = itemView.context.getString(R.string.source_dash_chapter_)
|
||||
binding.mangaSource.text = itemView.context.getString(R.string.source_dash_chapter_)
|
||||
.format(adapter.sourceManager.getOrStub(manga.source).toString(), formattedNumber)
|
||||
|
||||
// Set last read timestamp title
|
||||
last_read.text = Date(history.last_read).toTimestampString(adapter.dateFormat)
|
||||
binding.lastRead.text = Date(history.last_read).toTimestampString(adapter.dateFormat)
|
||||
|
||||
// Set cover
|
||||
cover.clear()
|
||||
cover.loadLibraryManga(manga)
|
||||
// Set binding.cover
|
||||
binding.cover.clear()
|
||||
binding.cover.loadLibraryManga(manga)
|
||||
}
|
||||
}
|
||||
|
@ -6,10 +6,10 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem
|
||||
import eu.davidea.flexibleadapter.items.IFlexible
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.databinding.RecentsHeaderItemBinding
|
||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.ui.library.LibraryHeaderItem
|
||||
import eu.kanade.tachiyomi.util.view.visibleIf
|
||||
import kotlinx.android.synthetic.main.recents_header_item.*
|
||||
|
||||
class RecentMangaHeaderItem(val recentsType: Int) :
|
||||
AbstractHeaderItem<RecentMangaHeaderItem.Holder>() {
|
||||
@ -60,13 +60,14 @@ class RecentMangaHeaderItem(val recentsType: Int) :
|
||||
true
|
||||
) {
|
||||
|
||||
private val binding = RecentsHeaderItemBinding.bind(view)
|
||||
init {
|
||||
action_history.setOnClickListener { adapter.delegate.showHistory() }
|
||||
action_update.setOnClickListener { adapter.delegate.showUpdates() }
|
||||
binding.actionHistory.setOnClickListener { adapter.delegate.showHistory() }
|
||||
binding.actionUpdate.setOnClickListener { adapter.delegate.showUpdates() }
|
||||
}
|
||||
|
||||
fun bind(recentsType: Int) {
|
||||
title.setText(
|
||||
binding.title.setText(
|
||||
when (recentsType) {
|
||||
CONTINUE_READING -> R.string.continue_reading
|
||||
NEW_CHAPTERS -> R.string.new_chapters
|
||||
@ -74,9 +75,9 @@ class RecentMangaHeaderItem(val recentsType: Int) :
|
||||
else -> R.string.continue_reading
|
||||
}
|
||||
)
|
||||
action_history.visibleIf(recentsType == -1)
|
||||
action_update.visibleIf(recentsType == -1)
|
||||
title.visibleIf(recentsType != -1)
|
||||
binding.actionHistory.visibleIf(recentsType == -1)
|
||||
binding.actionUpdate.visibleIf(recentsType == -1)
|
||||
binding.title.visibleIf(recentsType != -1)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,8 +5,8 @@ import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.ColorUtils
|
||||
import eu.davidea.viewholders.FlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.databinding.SettingsSearchControllerCardBinding
|
||||
import eu.kanade.tachiyomi.util.lang.highlightText
|
||||
import kotlinx.android.synthetic.main.settings_search_controller_card.view.*
|
||||
import kotlin.reflect.full.createInstance
|
||||
|
||||
/**
|
||||
@ -18,8 +18,9 @@ import kotlin.reflect.full.createInstance
|
||||
class SettingsSearchHolder(view: View, val adapter: SettingsSearchAdapter) :
|
||||
FlexibleViewHolder(view, adapter) {
|
||||
|
||||
private val binding = SettingsSearchControllerCardBinding.bind(view)
|
||||
init {
|
||||
view.title_wrapper.setOnClickListener {
|
||||
binding.titleWrapper.setOnClickListener {
|
||||
adapter.getItem(bindingAdapterPosition)?.let {
|
||||
val ctrl = it.settingsSearchResult.searchController::class.createInstance()
|
||||
ctrl.preferenceKey = it.settingsSearchResult.key
|
||||
@ -37,8 +38,8 @@ class SettingsSearchHolder(view: View, val adapter: SettingsSearchAdapter) :
|
||||
*/
|
||||
fun bind(item: SettingsSearchItem) {
|
||||
val color = ColorUtils.setAlphaComponent(ContextCompat.getColor(itemView.context, R.color.colorAccent), 75)
|
||||
itemView.search_result_pref_title.text = item.settingsSearchResult.title.highlightText(item.searchResult, color)
|
||||
itemView.search_result_pref_summary.text = item.settingsSearchResult.summary.highlightText(item.searchResult, color)
|
||||
itemView.search_result_pref_breadcrumb.text = item.settingsSearchResult.breadcrumb.highlightText(item.searchResult, color)
|
||||
binding.searchResultPrefTitle.text = item.settingsSearchResult.title.highlightText(item.searchResult, color)
|
||||
binding.searchResultPrefSummary.text = item.settingsSearchResult.summary.highlightText(item.searchResult, color)
|
||||
binding.searchResultPrefBreadcrumb.text = item.settingsSearchResult.breadcrumb.highlightText(item.searchResult, color)
|
||||
}
|
||||
}
|
||||
|
@ -4,14 +4,15 @@ import android.view.View
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||
import eu.davidea.flexibleadapter.items.IFlexible
|
||||
import eu.kanade.tachiyomi.databinding.SourceHeaderItemBinding
|
||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||
import kotlinx.android.synthetic.main.source_header_item.*
|
||||
|
||||
class LangHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>) :
|
||||
BaseFlexibleViewHolder(view, adapter) {
|
||||
|
||||
fun bind(item: LangItem) {
|
||||
title.text = LocaleHelper.getSourceDisplayName(item.code, itemView.context)
|
||||
val binding = SourceHeaderItemBinding.bind(itemView)
|
||||
binding.title.text = LocaleHelper.getSourceDisplayName(item.code, itemView.context)
|
||||
}
|
||||
}
|
||||
|
@ -12,8 +12,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.ui.library.LibraryCategoryAdapter
|
||||
import eu.kanade.tachiyomi.util.view.gone
|
||||
import eu.kanade.tachiyomi.data.image.coil.CoverViewTarget
|
||||
import kotlinx.android.synthetic.main.manga_grid_item.*
|
||||
import kotlinx.android.synthetic.main.unread_download_badge.*
|
||||
import eu.kanade.tachiyomi.databinding.MangaGridItemBinding
|
||||
|
||||
/**
|
||||
* Class used to hold the displayed data of a manga in the library, like the cover or the title.
|
||||
@ -30,12 +29,13 @@ class BrowseSourceGridHolder(
|
||||
compact: Boolean
|
||||
) : BrowseSourceHolder(view, adapter) {
|
||||
|
||||
private val binding = MangaGridItemBinding.bind(view)
|
||||
init {
|
||||
if (compact) {
|
||||
text_layout.gone()
|
||||
binding.textLayout.gone()
|
||||
} else {
|
||||
compact_title.gone()
|
||||
gradient.gone()
|
||||
binding.compactTitle.gone()
|
||||
binding.gradient.gone()
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,9 +47,9 @@ class BrowseSourceGridHolder(
|
||||
*/
|
||||
override fun onSetValues(manga: Manga) {
|
||||
// Update the title of the manga.
|
||||
title.text = manga.title
|
||||
compact_title.text = title.text
|
||||
badge_view.setInLibrary(manga.favorite)
|
||||
binding.title.text = manga.title
|
||||
binding.compactTitle.text = binding.title.text
|
||||
binding.unreadDownloadBadge.root.setInLibrary(manga.favorite)
|
||||
|
||||
// Update the cover.
|
||||
setImage(manga)
|
||||
@ -58,11 +58,11 @@ class BrowseSourceGridHolder(
|
||||
override fun setImage(manga: Manga) {
|
||||
if ((view.context as? Activity)?.isDestroyed == true) return
|
||||
if (manga.thumbnail_url == null) {
|
||||
cover_thumbnail.clear()
|
||||
binding.coverThumbnail.clear()
|
||||
} else {
|
||||
val id = manga.id ?: return
|
||||
val request = LoadRequest.Builder(view.context).data(manga)
|
||||
.target(CoverViewTarget(cover_thumbnail, progress)).build()
|
||||
.target(CoverViewTarget(binding.coverThumbnail, binding.progress)).build()
|
||||
Coil.imageLoader(view.context).execute(request)
|
||||
}
|
||||
}
|
||||
|
@ -15,10 +15,10 @@ import eu.davidea.flexibleadapter.items.IFlexible
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||
import eu.kanade.tachiyomi.databinding.MangaGridItemBinding
|
||||
import eu.kanade.tachiyomi.util.system.dpToPx
|
||||
import eu.kanade.tachiyomi.util.view.updateLayoutParams
|
||||
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
|
||||
import kotlinx.android.synthetic.main.manga_grid_item.view.*
|
||||
|
||||
class BrowseSourceItem(
|
||||
val manga: Manga,
|
||||
@ -40,32 +40,33 @@ class BrowseSourceItem(
|
||||
return if (parent is AutofitRecyclerView && !catalogueAsList.getOrDefault()) {
|
||||
val listType = catalogueListType.getOrDefault()
|
||||
view.apply {
|
||||
val binding = MangaGridItemBinding.bind(this)
|
||||
val coverHeight = (parent.itemWidth / 3 * 4f).toInt()
|
||||
if (listType == 1) {
|
||||
gradient.layoutParams = FrameLayout.LayoutParams(
|
||||
binding.gradient.layoutParams = FrameLayout.LayoutParams(
|
||||
FrameLayout.LayoutParams.MATCH_PARENT,
|
||||
(coverHeight * 0.66f).toInt(),
|
||||
Gravity.BOTTOM
|
||||
)
|
||||
card.updateLayoutParams<ConstraintLayout.LayoutParams> {
|
||||
binding.card.updateLayoutParams<ConstraintLayout.LayoutParams> {
|
||||
bottomMargin = 6.dpToPx
|
||||
}
|
||||
} else {
|
||||
constraint_layout.background = ContextCompat.getDrawable(
|
||||
binding.constraintLayout.background = ContextCompat.getDrawable(
|
||||
context,
|
||||
R.drawable.library_item_selector
|
||||
)
|
||||
}
|
||||
constraint_layout.layoutParams = FrameLayout.LayoutParams(
|
||||
binding.constraintLayout.layoutParams = FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
cover_thumbnail.maxHeight = Int.MAX_VALUE
|
||||
cover_thumbnail.minimumHeight = 0
|
||||
constraint_layout.minHeight = 0
|
||||
cover_thumbnail.scaleType = ImageView.ScaleType.CENTER_CROP
|
||||
cover_thumbnail.adjustViewBounds = false
|
||||
cover_thumbnail.layoutParams = FrameLayout.LayoutParams(
|
||||
binding.coverThumbnail.maxHeight = Int.MAX_VALUE
|
||||
binding.coverThumbnail.minimumHeight = 0
|
||||
binding.constraintLayout.minHeight = 0
|
||||
binding.coverThumbnail.scaleType = ImageView.ScaleType.CENTER_CROP
|
||||
binding.coverThumbnail.adjustViewBounds = false
|
||||
binding.coverThumbnail.layoutParams = FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
(parent.itemWidth / 3f * 3.7f).toInt()
|
||||
)
|
||||
|
@ -11,7 +11,7 @@ import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.util.system.getResourceColor
|
||||
import eu.kanade.tachiyomi.data.image.coil.CoverViewTarget
|
||||
import kotlinx.android.synthetic.main.manga_list_item.*
|
||||
import eu.kanade.tachiyomi.databinding.MangaListItemBinding
|
||||
|
||||
/**
|
||||
* Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
|
||||
@ -24,6 +24,8 @@ import kotlinx.android.synthetic.main.manga_list_item.*
|
||||
class BrowseSourceListHolder(private val view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>) :
|
||||
BrowseSourceHolder(view, adapter) {
|
||||
|
||||
private val binding = MangaListItemBinding.bind(view)
|
||||
|
||||
/**
|
||||
* Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
|
||||
* holder with the given manga.
|
||||
@ -31,8 +33,8 @@ class BrowseSourceListHolder(private val view: View, adapter: FlexibleAdapter<IF
|
||||
* @param manga the manga to bind.
|
||||
*/
|
||||
override fun onSetValues(manga: Manga) {
|
||||
title.text = manga.title
|
||||
with(subtitle) {
|
||||
binding.title.text = manga.title
|
||||
with(binding.subtitle) {
|
||||
visibility = if (manga.favorite) View.VISIBLE else View.GONE
|
||||
text = view.resources.getString(R.string.in_library)
|
||||
setTextColor(view.context.getResourceColor(android.R.attr.colorAccent))
|
||||
@ -44,11 +46,11 @@ class BrowseSourceListHolder(private val view: View, adapter: FlexibleAdapter<IF
|
||||
override fun setImage(manga: Manga) {
|
||||
// Update the cover.
|
||||
if (manga.thumbnail_url == null) {
|
||||
cover_thumbnail.clear()
|
||||
binding.coverThumbnail.clear()
|
||||
} else {
|
||||
val id = manga.id ?: return
|
||||
manga.id ?: return
|
||||
val request = LoadRequest.Builder(view.context).data(manga)
|
||||
.target(CoverViewTarget(cover_thumbnail)).build()
|
||||
.target(CoverViewTarget(binding.coverThumbnail)).build()
|
||||
Coil.imageLoader(view.context).execute(request)
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,10 @@ package eu.kanade.tachiyomi.ui.source.global_search
|
||||
|
||||
import android.view.View
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.databinding.SourceGlobalSearchControllerCardBinding
|
||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.util.view.gone
|
||||
import eu.kanade.tachiyomi.util.view.visible
|
||||
import kotlinx.android.synthetic.main.source_global_search_controller_card.*
|
||||
|
||||
/**
|
||||
* Holder that binds the [GlobalSearchItem] containing catalogue cards.
|
||||
@ -23,11 +23,13 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
|
||||
|
||||
private var lastBoundResults: List<GlobalSearchMangaItem>? = null
|
||||
|
||||
private val binding = SourceGlobalSearchControllerCardBinding.bind(view)
|
||||
|
||||
init {
|
||||
// Set layout horizontal.
|
||||
recycler.layoutManager =
|
||||
binding.recycler.layoutManager =
|
||||
androidx.recyclerview.widget.LinearLayoutManager(view.context, androidx.recyclerview.widget.LinearLayoutManager.HORIZONTAL, false)
|
||||
recycler.adapter = mangaAdapter
|
||||
binding.recycler.adapter = mangaAdapter
|
||||
}
|
||||
|
||||
/**
|
||||
@ -43,20 +45,20 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
|
||||
val langSuffix = if (source.lang.isNotEmpty()) " (${source.lang})" else ""
|
||||
|
||||
// Set Title with country code if available.
|
||||
title.text = titlePrefix + source.name + langSuffix
|
||||
binding.title.text = titlePrefix + source.name + langSuffix
|
||||
|
||||
when {
|
||||
results == null -> {
|
||||
progress.visible()
|
||||
binding.progress.visible()
|
||||
showHolder()
|
||||
}
|
||||
results.isEmpty() -> {
|
||||
progress.gone()
|
||||
no_results.visible()
|
||||
source_card.gone()
|
||||
binding.progress.gone()
|
||||
binding.noResults.visible()
|
||||
binding.sourceCard.gone()
|
||||
}
|
||||
else -> {
|
||||
progress.gone()
|
||||
binding.progress.gone()
|
||||
showHolder()
|
||||
}
|
||||
}
|
||||
@ -93,7 +95,7 @@ class GlobalSearchHolder(view: View, val adapter: GlobalSearchAdapter) :
|
||||
}
|
||||
|
||||
private fun showHolder() {
|
||||
source_card.visible()
|
||||
no_results.gone()
|
||||
binding.sourceCard.visible()
|
||||
binding.noResults.gone()
|
||||
}
|
||||
}
|
||||
|
@ -9,11 +9,12 @@ import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
||||
import eu.kanade.tachiyomi.util.view.visibleIf
|
||||
import eu.kanade.tachiyomi.data.image.coil.CoverViewTarget
|
||||
import kotlinx.android.synthetic.main.source_global_search_controller_card_item.*
|
||||
import eu.kanade.tachiyomi.databinding.SourceGlobalSearchControllerCardItemBinding
|
||||
|
||||
class GlobalSearchMangaHolder(view: View, adapter: GlobalSearchCardAdapter) :
|
||||
BaseFlexibleViewHolder(view, adapter) {
|
||||
|
||||
private val binding = SourceGlobalSearchControllerCardItemBinding.bind(view)
|
||||
init {
|
||||
// Call onMangaClickListener when item is pressed.
|
||||
itemView.setOnClickListener {
|
||||
@ -32,18 +33,18 @@ class GlobalSearchMangaHolder(view: View, adapter: GlobalSearchCardAdapter) :
|
||||
}
|
||||
|
||||
fun bind(manga: Manga) {
|
||||
title.text = manga.title
|
||||
favorite_button.visibleIf(manga.favorite)
|
||||
binding.title.text = manga.title
|
||||
binding.favoriteButton.visibleIf(manga.favorite)
|
||||
setImage(manga)
|
||||
}
|
||||
|
||||
fun setImage(manga: Manga) {
|
||||
itemImage.clear()
|
||||
binding.itemImage.clear()
|
||||
if (!manga.thumbnail_url.isNullOrEmpty()) {
|
||||
val request = LoadRequest.Builder(itemView.context).data(manga)
|
||||
.placeholder(android.R.color.transparent)
|
||||
.memoryCachePolicy(CachePolicy.DISABLED)
|
||||
.target(CoverViewTarget(itemImage, progress)).build()
|
||||
.target(CoverViewTarget(binding.itemImage, binding.progress)).build()
|
||||
Coil.imageLoader(itemView.context).execute(request)
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@
|
||||
android:id="@+id/close_right"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:tint="@color/md_white_1000"
|
||||
app:tint="@color/md_white_1000"
|
||||
android:layout_gravity="end|center"
|
||||
android:contentDescription="@string/cancel"
|
||||
android:layout_marginEnd="21dp"
|
||||
@ -37,7 +37,7 @@
|
||||
android:contentDescription="@string/cancel"
|
||||
android:layout_gravity="start|center"
|
||||
android:layout_marginStart="21dp"
|
||||
android:tint="@color/md_white_1000"
|
||||
app:tint="@color/md_white_1000"
|
||||
android:src="@drawable/ic_close_24dp" />
|
||||
</FrameLayout>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
@ -55,7 +55,7 @@
|
||||
android:layout_gravity="start"
|
||||
android:contentDescription="@string/reorder"
|
||||
android:scaleType="center"
|
||||
android:tint="?android:attr/textColorPrimary"
|
||||
app:tint="?android:attr/textColorPrimary"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
@ -84,7 +84,7 @@
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textAppearance="@style/TextAppearance.Regular.Caption"
|
||||
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
||||
app:layout_constraintEnd_toStartOf="@+id/download_menu"
|
||||
android:layout_marginEnd="16dp"
|
||||
app:layout_constraintStart_toStartOf="@+id/title"
|
||||
app:layout_constraintTop_toBottomOf="@+id/title"
|
||||
@ -97,7 +97,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
||||
app:layout_constraintEnd_toStartOf="@+id/download_menu"
|
||||
app:layout_constraintStart_toEndOf="@+id/reorder"
|
||||
android:layout_marginEnd="16dp"
|
||||
app:layout_constraintTop_toBottomOf="@+id/chapter_title" />
|
||||
@ -111,12 +111,12 @@
|
||||
android:textAppearance="@style/TextAppearance.Regular.Caption.Hint"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/title"
|
||||
android:layout_marginEnd="16dp"
|
||||
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
||||
app:layout_constraintEnd_toStartOf="@+id/download_menu"
|
||||
app:layout_constraintTop_toTopOf="@+id/title"
|
||||
tools:text="(0/10)" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/migration_menu"
|
||||
android:id="@+id/download_menu"
|
||||
android:layout_width="44dp"
|
||||
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
|
||||
android:layout_toEndOf="@id/download_progress_text"
|
||||
|
@ -12,7 +12,7 @@
|
||||
app:layout_constraintVertical_bias="1.0"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/imageView"
|
||||
app:layout_constraintEnd_toStartOf="@id/imageView"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
@ -26,9 +26,9 @@
|
||||
android:scaleType="center"
|
||||
android:layout_marginBottom="45dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/migration_manga_card_to"
|
||||
app:layout_constraintEnd_toStartOf="@id/migration_manga_card_to"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/migration_manga_card_from"
|
||||
app:layout_constraintStart_toEndOf="@id/migration_manga_card_from"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:srcCompat="@drawable/ic_chevron_right_24dp" />
|
||||
|
||||
@ -39,9 +39,9 @@
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/migration_menu"
|
||||
app:layout_constraintEnd_toStartOf="@id/migration_menu"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/imageView"
|
||||
app:layout_constraintStart_toEndOf="@id/imageView"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<ImageView
|
||||
@ -55,7 +55,7 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/migration_manga_card_to"
|
||||
app:layout_constraintStart_toEndOf="@id/migration_manga_card_to"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:srcCompat="@drawable/ic_more_vert_24dp"
|
||||
android:visibility="invisible"/>
|
||||
@ -65,9 +65,9 @@
|
||||
android:id="@+id/skip_manga"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/migration_menu"
|
||||
app:layout_constraintEnd_toEndOf="@+id/migration_menu"
|
||||
app:layout_constraintStart_toStartOf="@+id/migration_menu"
|
||||
app:layout_constraintTop_toTopOf="@+id/migration_menu"
|
||||
app:layout_constraintBottom_toBottomOf="@id/migration_menu"
|
||||
app:layout_constraintEnd_toEndOf="@id/migration_menu"
|
||||
app:layout_constraintStart_toStartOf="@id/migration_menu"
|
||||
app:layout_constraintTop_toTopOf="@id/migration_menu"
|
||||
app:srcCompat="@drawable/ic_close_24dp" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -51,9 +51,9 @@
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textAppearance="@style/TextAppearance.Regular.Body1"
|
||||
app:layout_constraintBottom_toTopOf="@+id/chapter_title"
|
||||
app:layout_constraintEnd_toStartOf="@+id/download_button"
|
||||
app:layout_constraintStart_toEndOf="@+id/manga_cover"
|
||||
app:layout_constraintBottom_toTopOf="@id/chapter_title"
|
||||
app:layout_constraintEnd_toStartOf="@id/download_button"
|
||||
app:layout_constraintStart_toEndOf="@id/manga_cover"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Manga title" />
|
||||
@ -68,13 +68,14 @@
|
||||
android:maxLines="1"
|
||||
android:textAppearance="@style/TextAppearance.Regular.Caption"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/download_button"
|
||||
app:layout_constraintStart_toEndOf="@+id/manga_cover"
|
||||
app:layout_constraintTop_toBottomOf="@+id/title"
|
||||
app:layout_constraintEnd_toStartOf="@id/download_button"
|
||||
app:layout_constraintStart_toEndOf="@id/manga_cover"
|
||||
app:layout_constraintTop_toBottomOf="@id/title"
|
||||
tools:text="Chapter title" />
|
||||
|
||||
<include
|
||||
layout="@layout/download_button"
|
||||
android:id="@+id/download_button"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
|
Loading…
Reference in New Issue
Block a user