Implement latest updates. (#472)

This commit is contained in:
Roman Martinez
2016-09-30 12:11:51 -07:00
committed by inorichi
parent 09a8a494a0
commit 0b3dda18d3
27 changed files with 482 additions and 103 deletions

View File

@@ -41,7 +41,7 @@ import java.util.concurrent.TimeUnit.MILLISECONDS
* Uses R.layout.fragment_catalogue.
*/
@RequiresPresenter(CataloguePresenter::class)
class CatalogueFragment : BaseRxFragment<CataloguePresenter>(), FlexibleViewHolder.OnListItemClickListener {
open class CatalogueFragment : BaseRxFragment<CataloguePresenter>(), FlexibleViewHolder.OnListItemClickListener {
/**
* Spinner shown in the toolbar to change the selected source.

View File

@@ -4,19 +4,10 @@ import eu.kanade.tachiyomi.data.source.model.MangasPage
import eu.kanade.tachiyomi.data.source.online.OnlineSource
import eu.kanade.tachiyomi.data.source.online.OnlineSource.Filter
import rx.Observable
import rx.subjects.PublishSubject
class CataloguePager(val source: OnlineSource, val query: String, val filters: List<Filter>) {
open class CataloguePager(val source: OnlineSource, val query: String, val filters: List<Filter>): Pager() {
private var lastPage: MangasPage? = null
private val results = PublishSubject.create<MangasPage>()
fun results(): Observable<MangasPage> {
return results.asObservable()
}
fun requestNext(transformer: (Observable<MangasPage>) -> Observable<MangasPage>): Observable<MangasPage> {
override fun requestNext(transformer: (Observable<MangasPage>) -> Observable<MangasPage>): Observable<MangasPage> {
val lastPage = lastPage
val page = if (lastPage == null)
@@ -34,8 +25,4 @@ class CataloguePager(val source: OnlineSource, val query: String, val filters: L
.doOnNext { this@CataloguePager.lastPage = it }
}
fun hasNextPage(): Boolean {
return lastPage == null || lastPage?.nextPageUrl != null
}
}

View File

@@ -26,7 +26,7 @@ import java.util.NoSuchElementException
/**
* Presenter of [CatalogueFragment].
*/
class CataloguePresenter : BasePresenter<CatalogueFragment>() {
open class CataloguePresenter : BasePresenter<CatalogueFragment>() {
/**
* Source manager.
@@ -73,7 +73,7 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
/**
* Pager containing a list of manga results.
*/
private lateinit var pager: CataloguePager
private lateinit var pager: Pager
/**
* Subject that initializes a list of manga.
@@ -140,7 +140,7 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
}
// Create a new pager.
pager = CataloguePager(source, query, filters)
pager = createPager(query, filters)
// Prepare the pager.
pagerSubscription?.let { remove(it) }
@@ -305,7 +305,7 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
* @param source the source to check.
* @return true if the source is valid, false otherwise.
*/
fun isValidSource(source: Source?): Boolean {
open fun isValidSource(source: Source?): Boolean {
if (source == null) return false
if (source is LoginSource) {
@@ -327,7 +327,7 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
/**
* Returns a list of enabled sources ordered by language and name.
*/
private fun getEnabledSources(): List<OnlineSource> {
open protected fun getEnabledSources(): List<OnlineSource> {
val languages = prefs.enabledLanguages().getOrDefault()
val hiddenCatalogues = prefs.hiddenCatalogues().getOrDefault()
@@ -371,4 +371,8 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
restartPager(filters = selectedFilters)
}
open fun createPager(query: String, filters: List<Filter>): Pager {
return CataloguePager(source, query, filters)
}
}

View File

@@ -0,0 +1,25 @@
package eu.kanade.tachiyomi.ui.catalogue
import eu.kanade.tachiyomi.data.source.model.MangasPage
import rx.subjects.PublishSubject
import rx.Observable
/**
* A general pager for source requests (latest updates, popular, search)
*/
abstract class Pager {
protected var lastPage: MangasPage? = null
protected val results = PublishSubject.create<MangasPage>()
fun results(): Observable<MangasPage> {
return results.asObservable()
}
fun hasNextPage(): Boolean {
return lastPage == null || lastPage?.nextPageUrl != null
}
abstract fun requestNext(transformer: (Observable<MangasPage>) -> Observable<MangasPage>): Observable<MangasPage>
}

View File

@@ -0,0 +1,29 @@
package eu.kanade.tachiyomi.ui.latest_updates
import eu.kanade.tachiyomi.ui.catalogue.CatalogueFragment
import nucleus.factory.RequiresPresenter
import android.view.*
import eu.kanade.tachiyomi.R
/**
* Fragment that shows the manga from the catalogue. Inherit CatalogueFragment.
*/
@RequiresPresenter(LatestUpdatesPresenter::class)
class LatestUpdatesFragment : CatalogueFragment() {
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
menu.findItem(R.id.action_search).isVisible = false
menu.findItem(R.id.action_set_filter).isVisible = false
}
companion object {
fun newInstance(): LatestUpdatesFragment {
return LatestUpdatesFragment()
}
}
}

View File

@@ -0,0 +1,28 @@
package eu.kanade.tachiyomi.ui.latest_updates
import eu.kanade.tachiyomi.data.source.model.MangasPage
import eu.kanade.tachiyomi.data.source.online.OnlineSource
import eu.kanade.tachiyomi.ui.catalogue.Pager
import rx.Observable
/**
* LatestUpdatesPager inherited from the general Pager.
*/
class LatestUpdatesPager(val source: OnlineSource): Pager() {
override fun requestNext(transformer: (Observable<MangasPage>) -> Observable<MangasPage>): Observable<MangasPage> {
val lastPage = lastPage
val page = if (lastPage == null)
MangasPage(1)
else
MangasPage(lastPage.page + 1).apply { url = lastPage.nextPageUrl!! }
val observable = source.fetchLatestUpdates(page)
return transformer(observable)
.doOnNext { results.onNext(it) }
.doOnNext { this@LatestUpdatesPager.lastPage = it }
}
}

View File

@@ -0,0 +1,26 @@
package eu.kanade.tachiyomi.ui.latest_updates
import eu.kanade.tachiyomi.data.source.Source
import eu.kanade.tachiyomi.data.source.online.OnlineSource
import eu.kanade.tachiyomi.ui.catalogue.CataloguePresenter
import eu.kanade.tachiyomi.ui.catalogue.Pager
import eu.kanade.tachiyomi.data.source.online.OnlineSource.Filter
/**
* Presenter of [LatestUpdatesFragment]. Inherit CataloguePresenter.
*/
class LatestUpdatesPresenter : CataloguePresenter() {
override fun createPager(query: String, filters: List<Filter>): Pager {
return LatestUpdatesPager(source)
}
override fun getEnabledSources(): List<OnlineSource> {
return super.getEnabledSources().filter { it.supportsLatest }
}
override fun isValidSource(source: Source?): Boolean {
return super.isValidSource(source) && (source as OnlineSource).supportsLatest
}
}

View File

@@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.backup.BackupFragment
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
import eu.kanade.tachiyomi.ui.catalogue.CatalogueFragment
import eu.kanade.tachiyomi.ui.latest_updates.LatestUpdatesFragment
import eu.kanade.tachiyomi.ui.download.DownloadFragment
import eu.kanade.tachiyomi.ui.library.LibraryFragment
import eu.kanade.tachiyomi.ui.recent_updates.RecentChaptersFragment
@@ -58,9 +59,10 @@ class MainActivity : BaseActivity() {
val id = item.itemId
when (id) {
R.id.nav_drawer_library -> setFragment(LibraryFragment.newInstance(), id)
R.id.nav_drawer_recently_read -> setFragment(RecentlyReadFragment.newInstance(), id)
R.id.nav_drawer_recent_updates -> setFragment(RecentChaptersFragment.newInstance(), id)
R.id.nav_drawer_recently_read -> setFragment(RecentlyReadFragment.newInstance(), id)
R.id.nav_drawer_catalogues -> setFragment(CatalogueFragment.newInstance(), id)
R.id.nav_drawer_latest_updates -> setFragment(LatestUpdatesFragment.newInstance(), id)
R.id.nav_drawer_downloads -> setFragment(DownloadFragment.newInstance(), id)
R.id.nav_drawer_settings -> {
val intent = Intent(this, SettingsActivity::class.java)