Fixes for grid sizes on all device sizes

Catalouge grid now matches library grid type
This commit is contained in:
Jay 2020-04-07 22:32:28 -04:00
parent 839bfb8807
commit 26571a2508
7 changed files with 81 additions and 65 deletions

View File

@ -93,6 +93,7 @@ fun getRecentsQueryDistinct(search: String) = """
ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = newest_chapter.${Chapter.COL_MANGA_ID}
WHERE ${Manga.COL_FAVORITE} = 1
AND newest_chapter.${History.COL_CHAPTER_ID} = ${Chapter.TABLE}.${Chapter.COL_ID}
AND ${Chapter.COL_DATE_FETCH} > ${Manga.COL_DATE_ADDED}
AND lower(${Manga.COL_TITLE}) LIKE '%$search%'
ORDER BY ${Chapter.COL_DATE_UPLOAD} DESC
LIMIT 8

View File

@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.ui.catalogue.browse
import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
@ -12,7 +11,6 @@ import androidx.appcompat.widget.SearchView
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.f2prateek.rx.preferences.Preference
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents
@ -22,6 +20,7 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
@ -109,11 +108,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
*/
private var searchViewSubscription: Subscription? = null
/**
* Subscription for the number of manga per row.
*/
private var numColumnsSubscription: Subscription? = null
/**
* Endless loading item.
*/
@ -150,8 +144,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
}
override fun onDestroyView(view: View) {
numColumnsSubscription?.unsubscribe()
numColumnsSubscription = null
searchViewSubscription?.unsubscribe()
searchViewSubscription = null
adapter = null
@ -161,8 +153,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
}
private fun setupRecycler(view: View) {
numColumnsSubscription?.unsubscribe()
var oldPosition = RecyclerView.NO_POSITION
val oldRecycler = catalogue_view?.getChildAt(1)
if (oldRecycler is RecyclerView) {
@ -181,11 +171,11 @@ open class BrowseCatalogueController(bundle: Bundle) :
}
} else {
(catalogue_view.inflate(R.layout.catalogue_recycler_autofit) as AutofitRecyclerView).apply {
numColumnsSubscription = getColumnsPreferenceForCurrentOrientation().asObservable()
.doOnNext { spanCount = it }
.skip(1)
// Set again the adapter to recalculate the covers height
.subscribe { adapter = this@BrowseCatalogueController.adapter }
columnWidth = when (preferences.gridSize().getOrDefault()) {
0 -> 1f
2 -> 1.66f
else -> 1.25f
}
(layoutManager as androidx.recyclerview.widget.GridLayoutManager).spanSizeLookup = object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
@ -458,18 +448,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
}
}
/**
* Returns a preference for the number of manga per row based on the current orientation.
*
* @return the preference.
*/
fun getColumnsPreferenceForCurrentOrientation(): Preference<Int> {
return if (resources?.configuration?.orientation == Configuration.ORIENTATION_PORTRAIT)
preferences.portraitColumns()
else
preferences.landscapeColumns()
}
/**
* Returns the view holder for the given manga.
*

View File

@ -149,6 +149,7 @@ open class BrowseCataloguePresenter(
val sourceId = source.id
val catalogueAsList = prefs.catalogueAsList()
val catalougeListType = prefs.libraryLayout()
// Prepare the pager.
pagerSubscription?.let { remove(it) }
@ -156,7 +157,7 @@ open class BrowseCataloguePresenter(
.observeOn(Schedulers.io())
.map { it.first to it.second.map { networkToLocalManga(it, sourceId) } }
.doOnNext { initializeMangas(it.second) }
.map { it.first to it.second.map { CatalogueItem(it, catalogueAsList) } }
.map { it.first to it.second.map { CatalogueItem(it, catalogueAsList, catalougeListType) } }
.observeOn(AndroidSchedulers.mainThread())
.subscribeReplay({ view, (page, mangas) ->
view.onAddPage(page, mangas)

View File

@ -10,6 +10,7 @@ import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.glide.GlideApp
import eu.kanade.tachiyomi.ui.library.LibraryCategoryAdapter
import eu.kanade.tachiyomi.util.view.gone
import eu.kanade.tachiyomi.widget.StateImageViewTarget
import kotlinx.android.synthetic.main.catalogue_grid_item.*
import kotlinx.android.synthetic.main.unread_download_badge.*
@ -25,9 +26,18 @@ import kotlinx.android.synthetic.main.unread_download_badge.*
*/
class CatalogueGridHolder(
private val view: View,
private val adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
) :
CatalogueHolder(view, adapter) {
private val adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
compact: Boolean
) : CatalogueHolder(view, adapter) {
init {
if (compact) {
text_layout.gone()
} else {
compact_title.gone()
gradient.gone()
}
}
/**
* Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this
@ -37,7 +47,8 @@ class CatalogueGridHolder(
*/
override fun onSetValues(manga: Manga) {
// Update the title of the manga.
compact_title.text = manga.title
title.text = manga.title
compact_title.text = title.text
badge_view.setInLibrary(manga.favorite)
// Update the cover.

View File

@ -1,10 +1,12 @@
package eu.kanade.tachiyomi.ui.catalogue.browse
import android.view.Gravity
import android.view.View
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.f2prateek.rx.preferences.Preference
import eu.davidea.flexibleadapter.FlexibleAdapter
@ -14,11 +16,15 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.view.gone
import eu.kanade.tachiyomi.util.view.updateLayoutParams
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
import kotlinx.android.synthetic.main.catalogue_grid_item.view.*
class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference<Boolean>) :
class CatalogueItem(
val manga: Manga,
private val catalogueAsList: Preference<Boolean>,
private val catalogueListType: Preference<Int>
) :
AbstractFlexibleItem<CatalogueHolder>() {
override fun getLayoutRes(): Int {
@ -31,19 +37,36 @@ class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference<Bo
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): CatalogueHolder {
val parent = adapter.recyclerView
return if (parent is AutofitRecyclerView) {
val listType = catalogueListType.getOrDefault()
view.apply {
val coverHeight = (parent.itemWidth / 3 * 4f).toInt()
constraint_layout.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT,
WRAP_CONTENT)
val marginParams = card.layoutParams as ConstraintLayout.LayoutParams
marginParams.bottomMargin = 10.dpToPx
card.layoutParams = marginParams
text_layout.gone()
constraint_layout.minHeight = 0
cover_thumbnail.adjustViewBounds = false
cover_thumbnail.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, coverHeight)
if (listType == 1) {
gradient.layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
(coverHeight * 0.66f).toInt(),
Gravity.BOTTOM)
card.updateLayoutParams<ConstraintLayout.LayoutParams> {
bottomMargin = 6.dpToPx
}
CatalogueGridHolder(view, adapter)
} else {
constraint_layout.background = ContextCompat.getDrawable(
context, R.drawable.library_item_selector
)
}
constraint_layout.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(
ViewGroup.LayoutParams.MATCH_PARENT,
(parent.itemWidth / 3f * 3.7f).toInt()
)
}
CatalogueGridHolder(view, adapter, listType == 1)
} else {
CatalogueListHolder(view, adapter)
}

View File

@ -378,11 +378,14 @@ class LibraryController(
if (libraryLayout == 0) {
recycler.spanCount = 1
recycler.updatePaddingRelative(
start = 0,
end = 0
start = 0, end = 0
)
} else {
recycler.columnWidth = (90 + (preferences.gridSize().getOrDefault() * 30)).dpToPx
recycler.columnWidth = when (preferences.gridSize().getOrDefault()) {
0 -> 1f
2 -> 1.66f
else -> 1.25f
}
recycler.updatePaddingRelative(
start = (if (alwaysShowScroller) 2 else 5).dpToPx,
end = (if (alwaysShowScroller) 12 else 5).dpToPx

View File

@ -3,21 +3,20 @@ package eu.kanade.tachiyomi.widget
import android.content.Context
import android.util.AttributeSet
import androidx.recyclerview.widget.GridLayoutManager
import eu.kanade.tachiyomi.util.system.pxToDp
import kotlin.math.max
import kotlin.math.roundToInt
class AutofitRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
androidx.recyclerview.widget.RecyclerView(context, attrs) {
val manager = GridLayoutManager(context, 1)
var columnWidth = -1
var columnWidth = -1f
set(value) {
field = value
if (value > 0 && measuredWidth > 0) {
val count = max(1, measuredWidth / value)
spanCount = count
// manager.spanCount = count
}
if (measuredWidth > 0)
setSpan(true)
}
var spanCount = 0
@ -35,28 +34,28 @@ class AutofitRecyclerView @JvmOverloads constructor(context: Context, attrs: Att
}
init {
if (attrs != null) {
val attrsArray = intArrayOf(android.R.attr.columnWidth)
val array = context.obtainStyledAttributes(attrs, attrsArray)
columnWidth = array.getDimensionPixelSize(0, -1)
array.recycle()
}
layoutManager = manager
}
private fun getTempSpan(): Int {
if (spanCount == 0 && columnWidth > 0) {
return max(1, measuredWidth / columnWidth)
val dpWidth = (measuredWidth.pxToDp / 100f).roundToInt()
return max(1, (dpWidth / columnWidth).roundToInt())
}
return 2
return 3
}
override fun onMeasure(widthSpec: Int, heightSpec: Int) {
super.onMeasure(widthSpec, heightSpec)
if (spanCount == 0 && columnWidth > 0) {
val count = max(1, measuredWidth / columnWidth)
setSpan()
}
private fun setSpan(force: Boolean = false) {
if ((spanCount == 0 || force) && columnWidth > 0) {
val dpWidth = (measuredWidth.pxToDp / 100f).roundToInt()
val count = max(1, (dpWidth / columnWidth).roundToInt())
spanCount = count
// Timber.d("Dp width: $dpWidth - RSpan: $spanCount")
}
}
}