diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt index a14fd3b41e..14a6a6effd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt @@ -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 diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt index 4934ffee4f..6e81a75421 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt @@ -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 { - return if (resources?.configuration?.orientation == Configuration.ORIENTATION_PORTRAIT) - preferences.portraitColumns() - else - preferences.landscapeColumns() - } - /** * Returns the view holder for the given manga. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt index 040e693e49..3cc8fee9d3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt @@ -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) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueGridHolder.kt index b5fa56f5b4..3853bc8edf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueGridHolder.kt @@ -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> -) : - CatalogueHolder(view, adapter) { + private val adapter: FlexibleAdapter>, + 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. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueItem.kt index 3ee6f023d4..23a9c1bf2f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueItem.kt @@ -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) : +class CatalogueItem( + val manga: Manga, + private val catalogueAsList: Preference, + private val catalogueListType: Preference +) : AbstractFlexibleItem() { override fun getLayoutRes(): Int { @@ -31,19 +37,36 @@ class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference>): 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() + if (listType == 1) { + gradient.layoutParams = FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + (coverHeight * 0.66f).toInt(), + Gravity.BOTTOM) + card.updateLayoutParams { + bottomMargin = 6.dpToPx + } + } 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(MATCH_PARENT, coverHeight) + cover_thumbnail.layoutParams = FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + (parent.itemWidth / 3f * 3.7f).toInt() + ) } - CatalogueGridHolder(view, adapter) + CatalogueGridHolder(view, adapter, listType == 1) } else { CatalogueListHolder(view, adapter) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index f59d6e120f..688ec375fb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -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 diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt index 28836aaacd..dd3ebcd522 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt @@ -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") } } }