|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
package eu.kanade.tachiyomi.ui.catalogue.browse
|
|
|
|
|
package eu.kanade.tachiyomi.ui.source.browse
|
|
|
|
|
|
|
|
|
|
import android.os.Bundle
|
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
@ -27,10 +27,10 @@ import eu.kanade.tachiyomi.source.model.FilterList
|
|
|
|
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
|
|
|
|
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
|
|
|
|
|
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
|
|
|
|
import eu.kanade.tachiyomi.ui.catalogue.CatalogueController
|
|
|
|
|
import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
|
|
|
|
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
|
|
|
|
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
|
|
|
|
|
import eu.kanade.tachiyomi.ui.source.SourceController
|
|
|
|
|
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
|
|
|
|
|
import eu.kanade.tachiyomi.util.system.connectivityManager
|
|
|
|
|
import eu.kanade.tachiyomi.util.system.dpToPx
|
|
|
|
@ -42,7 +42,7 @@ import eu.kanade.tachiyomi.util.view.updateLayoutParams
|
|
|
|
|
import eu.kanade.tachiyomi.util.view.visible
|
|
|
|
|
import eu.kanade.tachiyomi.util.view.visibleIf
|
|
|
|
|
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
|
|
|
|
|
import kotlinx.android.synthetic.main.catalogue_controller.*
|
|
|
|
|
import kotlinx.android.synthetic.main.browse_source_controller.*
|
|
|
|
|
import rx.Observable
|
|
|
|
|
import rx.Subscription
|
|
|
|
|
import rx.android.schedulers.AndroidSchedulers
|
|
|
|
@ -53,8 +53,8 @@ import java.util.concurrent.TimeUnit
|
|
|
|
|
/**
|
|
|
|
|
* Controller to manage the catalogues available in the app.
|
|
|
|
|
*/
|
|
|
|
|
open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
NucleusController<BrowseCataloguePresenter>(bundle),
|
|
|
|
|
open class BrowseSourceController(bundle: Bundle) :
|
|
|
|
|
NucleusController<BrowseSourcePresenter>(bundle),
|
|
|
|
|
FlexibleAdapter.OnItemClickListener,
|
|
|
|
|
FlexibleAdapter.OnItemLongClickListener,
|
|
|
|
|
FlexibleAdapter.EndlessScrollListener,
|
|
|
|
@ -63,7 +63,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
constructor(
|
|
|
|
|
source: CatalogueSource,
|
|
|
|
|
searchQuery: String? = null,
|
|
|
|
|
smartSearchConfig: CatalogueController.SmartSearchConfig? = null
|
|
|
|
|
smartSearchConfig: SourceController.SmartSearchConfig? = null
|
|
|
|
|
) : this(Bundle().apply {
|
|
|
|
|
putLong(SOURCE_ID_KEY, source.id)
|
|
|
|
|
|
|
|
|
@ -93,11 +93,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
*/
|
|
|
|
|
private var snack: Snackbar? = null
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Navigation view containing filter items.
|
|
|
|
|
*/
|
|
|
|
|
private var navView: CatalogueNavigationView? = null
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Recycler view with the list of results.
|
|
|
|
|
*/
|
|
|
|
@ -121,12 +116,12 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
return presenter.source.name
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun createPresenter(): BrowseCataloguePresenter {
|
|
|
|
|
return BrowseCataloguePresenter(args.getLong(SOURCE_ID_KEY))
|
|
|
|
|
override fun createPresenter(): BrowseSourcePresenter {
|
|
|
|
|
return BrowseSourcePresenter(args.getLong(SOURCE_ID_KEY))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
|
|
|
|
|
return inflater.inflate(R.layout.catalogue_controller, container, false)
|
|
|
|
|
return inflater.inflate(R.layout.browse_source_controller, container, false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onViewCreated(view: View) {
|
|
|
|
@ -136,8 +131,6 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
adapter = FlexibleAdapter(null, this)
|
|
|
|
|
setupRecycler(view)
|
|
|
|
|
|
|
|
|
|
navView?.setFilters(presenter.filterItems)
|
|
|
|
|
|
|
|
|
|
fab.visibleIf(presenter.sourceFilters.isNotEmpty())
|
|
|
|
|
fab.setOnClickListener { showFilters() }
|
|
|
|
|
progress?.visible()
|
|
|
|
@ -170,7 +163,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
(catalogue_view.inflate(R.layout.catalogue_recycler_autofit) as AutofitRecyclerView).apply {
|
|
|
|
|
(catalogue_view.inflate(R.layout.manga_recycler_autofit) as AutofitRecyclerView).apply {
|
|
|
|
|
columnWidth = when (preferences.gridSize().getOrDefault()) {
|
|
|
|
|
0 -> 1f
|
|
|
|
|
2 -> 1.66f
|
|
|
|
@ -180,7 +173,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
(layoutManager as androidx.recyclerview.widget.GridLayoutManager).spanSizeLookup = object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() {
|
|
|
|
|
override fun getSpanSize(position: Int): Int {
|
|
|
|
|
return when (adapter?.getItemViewType(position)) {
|
|
|
|
|
R.layout.catalogue_grid_item, null -> 1
|
|
|
|
|
R.layout.manga_grid_item, null -> 1
|
|
|
|
|
else -> spanCount
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -229,7 +222,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
|
|
|
|
|
val searchEventsObservable = searchView.queryTextChangeEvents()
|
|
|
|
|
.skip(1)
|
|
|
|
|
.filter { router.backstack.lastOrNull()?.controller() == this@BrowseCatalogueController }
|
|
|
|
|
.filter { router.backstack.lastOrNull()?.controller() == this@BrowseSourceController }
|
|
|
|
|
.share()
|
|
|
|
|
val writingObservable = searchEventsObservable
|
|
|
|
|
.filter { !it.isSubmitted }
|
|
|
|
@ -278,7 +271,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun showFilters() {
|
|
|
|
|
val sheet = CatalogueSearchSheet(activity!!)
|
|
|
|
|
val sheet = SourceSearchSheet(activity!!)
|
|
|
|
|
sheet.setFilters(presenter.filterItems)
|
|
|
|
|
presenter.filtersChanged = false
|
|
|
|
|
val oldFilters = mutableListOf<Any?>()
|
|
|
|
@ -358,7 +351,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
* @param page the current page.
|
|
|
|
|
* @param mangas the list of manga of the page.
|
|
|
|
|
*/
|
|
|
|
|
fun onAddPage(page: Int, mangas: List<CatalogueItem>) {
|
|
|
|
|
fun onAddPage(page: Int, mangas: List<BrowseSourceItem>) {
|
|
|
|
|
val adapter = adapter ?: return
|
|
|
|
|
hideProgressBar()
|
|
|
|
|
if (page == 1) {
|
|
|
|
@ -381,7 +374,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
|
|
|
|
|
snack?.dismiss()
|
|
|
|
|
val message = if (error is NoResultsException) catalogue_view.context.getString(R.string.no_results_found) else (error.message ?: "")
|
|
|
|
|
snack = catalouge_layout?.snack(message, Snackbar.LENGTH_INDEFINITE) {
|
|
|
|
|
snack = source_layout?.snack(message, Snackbar.LENGTH_INDEFINITE) {
|
|
|
|
|
setAction(R.string.retry) {
|
|
|
|
|
// If not the first page, show bottom progress bar.
|
|
|
|
|
if (adapter.mainItemCount > 0) {
|
|
|
|
@ -442,7 +435,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
if (!isListMode || !view.context.connectivityManager.isActiveNetworkMetered) {
|
|
|
|
|
// Initialize mangas if going to grid view or if over wifi when going to list view
|
|
|
|
|
val mangas = (0 until adapter.itemCount).mapNotNull {
|
|
|
|
|
(adapter.getItem(it) as? CatalogueItem)?.manga
|
|
|
|
|
(adapter.getItem(it) as? BrowseSourceItem)?.manga
|
|
|
|
|
}
|
|
|
|
|
presenter.initializeMangas(mangas)
|
|
|
|
|
}
|
|
|
|
@ -454,13 +447,13 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
* @param manga the manga to find.
|
|
|
|
|
* @return the holder of the manga or null if it's not bound.
|
|
|
|
|
*/
|
|
|
|
|
private fun getHolder(manga: Manga): CatalogueHolder? {
|
|
|
|
|
private fun getHolder(manga: Manga): BrowseSourceHolder? {
|
|
|
|
|
val adapter = adapter ?: return null
|
|
|
|
|
|
|
|
|
|
adapter.allBoundViewHolders.forEach { holder ->
|
|
|
|
|
val item = adapter.getItem(holder.adapterPosition) as? CatalogueItem
|
|
|
|
|
val item = adapter.getItem(holder.adapterPosition) as? BrowseSourceItem
|
|
|
|
|
if (item != null && item.manga.id!! == manga.id!!) {
|
|
|
|
|
return holder as CatalogueHolder
|
|
|
|
|
return holder as BrowseSourceHolder
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -490,7 +483,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
* @return true if the item should be selected, false otherwise.
|
|
|
|
|
*/
|
|
|
|
|
override fun onItemClick(view: View?, position: Int): Boolean {
|
|
|
|
|
val item = adapter?.getItem(position) as? CatalogueItem ?: return false
|
|
|
|
|
val item = adapter?.getItem(position) as? BrowseSourceItem ?: return false
|
|
|
|
|
router.pushController(MangaDetailsController(item.manga, true).withFadeTransaction())
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
@ -506,12 +499,12 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
* @param position the position of the element clicked.
|
|
|
|
|
*/
|
|
|
|
|
override fun onItemLongClick(position: Int) {
|
|
|
|
|
val manga = (adapter?.getItem(position) as? CatalogueItem?)?.manga ?: return
|
|
|
|
|
val manga = (adapter?.getItem(position) as? BrowseSourceItem?)?.manga ?: return
|
|
|
|
|
snack?.dismiss()
|
|
|
|
|
if (manga.favorite) {
|
|
|
|
|
presenter.changeMangaFavorite(manga)
|
|
|
|
|
adapter?.notifyItemChanged(position)
|
|
|
|
|
snack = catalouge_layout?.snack(R.string.removed_from_library, Snackbar.LENGTH_INDEFINITE) {
|
|
|
|
|
snack = source_layout?.snack(R.string.removed_from_library, Snackbar.LENGTH_INDEFINITE) {
|
|
|
|
|
setAction(R.string.undo) {
|
|
|
|
|
if (!manga.favorite) addManga(manga, position)
|
|
|
|
|
}
|
|
|
|
@ -525,7 +518,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|
|
|
|
(activity as? MainActivity)?.setUndoSnackBar(snack)
|
|
|
|
|
} else {
|
|
|
|
|
addManga(manga, position)
|
|
|
|
|
snack = catalouge_layout?.snack(R.string.added_to_library)
|
|
|
|
|
snack = source_layout?.snack(R.string.added_to_library)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|