mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Use synthetic view's new caching method
This commit is contained in:
		@@ -6,21 +6,39 @@ import android.view.LayoutInflater
 | 
			
		||||
import android.view.MenuItem
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import com.bluelinelabs.conductor.Controller
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeHandler
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeType
 | 
			
		||||
import com.bluelinelabs.conductor.RestoreViewOnCreateController
 | 
			
		||||
import kotlinx.android.extensions.LayoutContainer
 | 
			
		||||
import kotlinx.android.synthetic.*
 | 
			
		||||
 | 
			
		||||
abstract class BaseController(bundle: Bundle? = null) : RestoreViewOnCreateController(bundle) {
 | 
			
		||||
abstract class BaseController(bundle: Bundle? = null) : RestoreViewOnCreateController(bundle),
 | 
			
		||||
        LayoutContainer {
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        addLifecycleListener(object : LifecycleListener() {
 | 
			
		||||
            override fun postCreateView(controller: Controller, view: View) {
 | 
			
		||||
                onViewCreated(view)
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override val containerView: View?
 | 
			
		||||
        get() = view
 | 
			
		||||
 | 
			
		||||
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedViewState: Bundle?): View {
 | 
			
		||||
        val view = inflateView(inflater, container)
 | 
			
		||||
        onViewCreated(view, savedViewState)
 | 
			
		||||
        return view
 | 
			
		||||
        return inflateView(inflater, container)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        clearFindViewByIdCache()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    abstract fun inflateView(inflater: LayoutInflater, container: ViewGroup): View
 | 
			
		||||
 | 
			
		||||
    open fun onViewCreated(view: View, savedViewState: Bundle?) { }
 | 
			
		||||
    open fun onViewCreated(view: View) { }
 | 
			
		||||
 | 
			
		||||
    override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
 | 
			
		||||
        if (type.isEnter) {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@ import android.os.Build
 | 
			
		||||
import android.support.v4.content.ContextCompat
 | 
			
		||||
import com.bluelinelabs.conductor.Controller
 | 
			
		||||
import com.bluelinelabs.conductor.Router
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
 | 
			
		||||
 | 
			
		||||
fun Router.popControllerWithTag(tag: String): Boolean {
 | 
			
		||||
    val controller = getControllerWithTag(tag)
 | 
			
		||||
@@ -24,4 +26,10 @@ fun Controller.requestPermissionsSafe(permissions: Array<String>, requestCode: I
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun Controller.withFadeTransaction(): RouterTransaction {
 | 
			
		||||
    return RouterTransaction.with(this)
 | 
			
		||||
            .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
            .popChangeHandler(FadeChangeHandler())
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ abstract class RxController(bundle: Bundle? = null) : BaseController(bundle) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @CallSuper
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        if (untilDestroySubscriptions.isUnsubscribed) {
 | 
			
		||||
            untilDestroySubscriptions = CompositeSubscription()
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,6 @@ import android.support.v4.widget.DrawerLayout
 | 
			
		||||
import android.support.v7.widget.*
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.afollestad.materialdialogs.MaterialDialog
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
 | 
			
		||||
import com.f2prateek.rx.preferences.Preference
 | 
			
		||||
import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
@@ -21,12 +19,13 @@ import eu.kanade.tachiyomi.source.CatalogueSource
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.FilterList
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.SecondaryDrawerController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.library.ChangeMangaCategoriesDialog
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaController
 | 
			
		||||
import eu.kanade.tachiyomi.util.*
 | 
			
		||||
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
 | 
			
		||||
import eu.kanade.tachiyomi.widget.DrawerSwipeCloseListener
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_controller.*
 | 
			
		||||
import kotlinx.android.synthetic.main.main_activity.*
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import rx.Subscription
 | 
			
		||||
@@ -112,8 +111,8 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
        return inflater.inflate(R.layout.catalogue_controller, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        // Initialize adapter, scroll listener and recycler views
 | 
			
		||||
        adapter = FlexibleAdapter(null, this)
 | 
			
		||||
@@ -121,11 +120,10 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
 | 
			
		||||
        navView?.setFilters(presenter.filterItems)
 | 
			
		||||
 | 
			
		||||
        view.progress?.visible()
 | 
			
		||||
        progress?.visible()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        numColumnsSubscription?.unsubscribe()
 | 
			
		||||
        numColumnsSubscription = null
 | 
			
		||||
        searchViewSubscription?.unsubscribe()
 | 
			
		||||
@@ -133,6 +131,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
        adapter = null
 | 
			
		||||
        snack = null
 | 
			
		||||
        recycler = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createSecondaryDrawer(drawer: DrawerLayout): ViewGroup? {
 | 
			
		||||
@@ -172,12 +171,12 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
        numColumnsSubscription?.unsubscribe()
 | 
			
		||||
 | 
			
		||||
        var oldPosition = RecyclerView.NO_POSITION
 | 
			
		||||
            val oldRecycler = view.catalogue_view?.getChildAt(1)
 | 
			
		||||
            val oldRecycler = catalogue_view?.getChildAt(1)
 | 
			
		||||
            if (oldRecycler is RecyclerView) {
 | 
			
		||||
                oldPosition = (oldRecycler.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
 | 
			
		||||
                oldRecycler.adapter = null
 | 
			
		||||
 | 
			
		||||
                view.catalogue_view?.removeView(oldRecycler)
 | 
			
		||||
                catalogue_view?.removeView(oldRecycler)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        val recycler = if (presenter.isListMode) {
 | 
			
		||||
@@ -187,7 +186,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
                addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            (view.catalogue_view.inflate(R.layout.catalogue_recycler_autofit) as AutofitRecyclerView).apply {
 | 
			
		||||
            (catalogue_view.inflate(R.layout.catalogue_recycler_autofit) as AutofitRecyclerView).apply {
 | 
			
		||||
                numColumnsSubscription = getColumnsPreferenceForCurrentOrientation().asObservable()
 | 
			
		||||
                        .doOnNext { spanCount = it }
 | 
			
		||||
                        .skip(1)
 | 
			
		||||
@@ -207,7 +206,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
        recycler.setHasFixedSize(true)
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
 | 
			
		||||
        view.catalogue_view.addView(recycler, 1)
 | 
			
		||||
        catalogue_view.addView(recycler, 1)
 | 
			
		||||
 | 
			
		||||
        if (oldPosition != RecyclerView.NO_POSITION) {
 | 
			
		||||
            recycler.layoutManager.scrollToPosition(oldPosition)
 | 
			
		||||
@@ -330,7 +329,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
        val message = if (error is NoResultsException) "No results found" else (error.message ?: "")
 | 
			
		||||
 | 
			
		||||
        snack?.dismiss()
 | 
			
		||||
        snack = view?.catalogue_view?.snack(message, Snackbar.LENGTH_INDEFINITE) {
 | 
			
		||||
        snack = catalogue_view?.snack(message, Snackbar.LENGTH_INDEFINITE) {
 | 
			
		||||
            setAction(R.string.action_retry) {
 | 
			
		||||
                // If not the first page, show bottom progress bar.
 | 
			
		||||
                if (adapter.mainItemCount > 0) {
 | 
			
		||||
@@ -357,7 +356,6 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
     * Called by the adapter when scrolled near the bottom.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onLoadMore(lastPosition: Int, currentPage: Int) {
 | 
			
		||||
        Timber.e("onLoadMore")
 | 
			
		||||
        if (presenter.hasNextPage()) {
 | 
			
		||||
            presenter.requestNext()
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -391,7 +389,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
        setupRecycler(view)
 | 
			
		||||
        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..adapter.itemCount-1).mapNotNull {
 | 
			
		||||
            val mangas = (0 until adapter.itemCount).mapNotNull {
 | 
			
		||||
                (adapter.getItem(it) as? CatalogueItem)?.manga
 | 
			
		||||
            }
 | 
			
		||||
            presenter.initializeMangas(mangas)
 | 
			
		||||
@@ -433,7 +431,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
     * Shows the progress bar.
 | 
			
		||||
     */
 | 
			
		||||
    private fun showProgressBar() {
 | 
			
		||||
        view?.progress?.visible()
 | 
			
		||||
        progress?.visible()
 | 
			
		||||
        snack?.dismiss()
 | 
			
		||||
        snack = null
 | 
			
		||||
    }
 | 
			
		||||
@@ -442,7 +440,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
     * Hides active progress bars.
 | 
			
		||||
     */
 | 
			
		||||
    private fun hideProgressBar() {
 | 
			
		||||
        view?.progress?.gone()
 | 
			
		||||
        progress?.gone()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -453,9 +451,7 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
     */
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
        val item = adapter?.getItem(position) as? CatalogueItem ?: return false
 | 
			
		||||
        router.pushController(RouterTransaction.with(MangaController(item.manga, true))
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
        router.pushController(MangaController(item.manga, true).withFadeTransaction())
 | 
			
		||||
 | 
			
		||||
        return false
 | 
			
		||||
    }
 | 
			
		||||
@@ -470,10 +466,11 @@ open class CatalogueController(bundle: Bundle) :
 | 
			
		||||
     * @param position the position of the element clicked.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onItemLongClick(position: Int) {
 | 
			
		||||
        val activity = activity ?: return
 | 
			
		||||
        val manga = (adapter?.getItem(position) as? CatalogueItem?)?.manga ?: return
 | 
			
		||||
        if (manga.favorite) {
 | 
			
		||||
            MaterialDialog.Builder(activity!!)
 | 
			
		||||
                    .items(resources?.getString(R.string.remove_from_library))
 | 
			
		||||
            MaterialDialog.Builder(activity)
 | 
			
		||||
                    .items(activity.getString(R.string.remove_from_library))
 | 
			
		||||
                    .itemsCallback { _, _, which, _ ->
 | 
			
		||||
                        when (which) {
 | 
			
		||||
                            0 -> {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,15 +4,14 @@ import android.os.Bundle
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.support.v7.widget.SearchView
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
 | 
			
		||||
import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.source.CatalogueSource
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaController
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_global_search_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_global_search_controller.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This controller shows and manages the different search result in global search.
 | 
			
		||||
@@ -71,9 +70,7 @@ class CatalogueSearchController(private val initialQuery: String? = null) :
 | 
			
		||||
     */
 | 
			
		||||
    override fun onMangaClick(manga: Manga) {
 | 
			
		||||
        // Open MangaController.
 | 
			
		||||
        router.pushController(RouterTransaction.with(MangaController(manga, true))
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
        router.pushController(MangaController(manga, true).withFadeTransaction())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -115,18 +112,15 @@ class CatalogueSearchController(private val initialQuery: String? = null) :
 | 
			
		||||
     * Called when the view is created
 | 
			
		||||
     *
 | 
			
		||||
     * @param view view of controller
 | 
			
		||||
     * @param savedViewState information from previous state.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        adapter = CatalogueSearchAdapter(this)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            // Create recycler and set adapter.
 | 
			
		||||
            recycler.layoutManager = LinearLayoutManager(context)
 | 
			
		||||
            recycler.adapter = adapter
 | 
			
		||||
        }
 | 
			
		||||
        // Create recycler and set adapter.
 | 
			
		||||
        recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.main
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.support.v7.widget.SearchView
 | 
			
		||||
import android.view.*
 | 
			
		||||
@@ -16,12 +15,13 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.source.CatalogueSource
 | 
			
		||||
import eu.kanade.tachiyomi.source.online.LoginSource
 | 
			
		||||
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.catalogue.global_search.CatalogueSearchController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.latest_updates.LatestUpdatesController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.setting.SettingsSourcesController
 | 
			
		||||
import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_main_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_main_controller.*
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
 | 
			
		||||
@@ -89,19 +89,16 @@ class CatalogueMainController : NucleusController<CatalogueMainPresenter>(),
 | 
			
		||||
     * Called when the view is created
 | 
			
		||||
     *
 | 
			
		||||
     * @param view view of controller
 | 
			
		||||
     * @param savedViewState information from previous state.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        adapter = CatalogueMainAdapter(this)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            // Create recycler and set adapter.
 | 
			
		||||
            recycler.layoutManager = LinearLayoutManager(context)
 | 
			
		||||
            recycler.adapter = adapter
 | 
			
		||||
            recycler.addItemDecoration(SourceDividerItemDecoration(context))
 | 
			
		||||
        }
 | 
			
		||||
        // Create recycler and set adapter.
 | 
			
		||||
        recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
        recycler.addItemDecoration(SourceDividerItemDecoration(view.context))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
@@ -165,9 +162,7 @@ class CatalogueMainController : NucleusController<CatalogueMainPresenter>(),
 | 
			
		||||
     */
 | 
			
		||||
    private fun openCatalogue(source: CatalogueSource, controller: CatalogueController) {
 | 
			
		||||
        preferences.lastUsedCatalogueSource().set(source.id)
 | 
			
		||||
        router.pushController(RouterTransaction.with(controller)
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler()))
 | 
			
		||||
        router.pushController(controller.withFadeTransaction())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -192,9 +187,7 @@ class CatalogueMainController : NucleusController<CatalogueMainPresenter>(),
 | 
			
		||||
                .filter { it.isSubmitted }
 | 
			
		||||
                .subscribeUntilDestroy {
 | 
			
		||||
                    val query = it.queryText().toString()
 | 
			
		||||
                    router.pushController((RouterTransaction.with(CatalogueSearchController(query)))
 | 
			
		||||
                            .popChangeHandler(FadeChangeHandler())
 | 
			
		||||
                            .pushChangeHandler(FadeChangeHandler()))
 | 
			
		||||
                    router.pushController(CatalogueSearchController(query).withFadeTransaction())
 | 
			
		||||
                }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.category
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.Snackbar
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import android.support.v7.view.ActionMode
 | 
			
		||||
@@ -15,7 +14,7 @@ import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import kotlinx.android.synthetic.main.categories_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.categories_controller.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Controller to manage the categories for the users' library.
 | 
			
		||||
@@ -70,22 +69,19 @@ class CategoryController : NucleusController<CategoryPresenter>(),
 | 
			
		||||
     * Called after view inflation. Used to initialize the view.
 | 
			
		||||
     *
 | 
			
		||||
     * @param view The view of this controller.
 | 
			
		||||
     * @param savedViewState The saved state of the view.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            adapter = CategoryAdapter(this@CategoryController)
 | 
			
		||||
            recycler.layoutManager = LinearLayoutManager(context)
 | 
			
		||||
            recycler.setHasFixedSize(true)
 | 
			
		||||
            recycler.adapter = adapter
 | 
			
		||||
            adapter?.isHandleDragEnabled = true
 | 
			
		||||
            adapter?.isPermanentDelete = false
 | 
			
		||||
        adapter = CategoryAdapter(this@CategoryController)
 | 
			
		||||
        recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        recycler.setHasFixedSize(true)
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
        adapter?.isHandleDragEnabled = true
 | 
			
		||||
        adapter?.isPermanentDelete = false
 | 
			
		||||
 | 
			
		||||
            fab.clicks().subscribeUntilDestroy {
 | 
			
		||||
                CategoryCreateDialog(this@CategoryController).showDialog(router, null)
 | 
			
		||||
            }
 | 
			
		||||
        fab.clicks().subscribeUntilDestroy {
 | 
			
		||||
            CategoryCreateDialog(this@CategoryController).showDialog(router, null)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -95,12 +91,12 @@ class CategoryController : NucleusController<CategoryPresenter>(),
 | 
			
		||||
     * @param view The view of this controller.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        // Manually call callback to delete categories if required
 | 
			
		||||
        undoHelper?.onDeleteConfirmed(Snackbar.Callback.DISMISS_EVENT_MANUAL)
 | 
			
		||||
        undoHelper = null
 | 
			
		||||
        actionMode = null
 | 
			
		||||
        adapter = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.download
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.view.*
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
@@ -8,7 +7,7 @@ import eu.kanade.tachiyomi.data.download.DownloadService
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Page
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import kotlinx.android.synthetic.main.download_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.download_controller.*
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import rx.Subscription
 | 
			
		||||
import rx.android.schedulers.AndroidSchedulers
 | 
			
		||||
@@ -52,21 +51,19 @@ class DownloadController : NucleusController<DownloadPresenter>() {
 | 
			
		||||
        return resources?.getString(R.string.label_download_queue)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        // Check if download queue is empty and update information accordingly.
 | 
			
		||||
        setInformationView()
 | 
			
		||||
 | 
			
		||||
        // Initialize adapter.
 | 
			
		||||
        adapter = DownloadAdapter()
 | 
			
		||||
        with(view) {
 | 
			
		||||
            recycler.adapter = adapter
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
 | 
			
		||||
            // Set the layout manager for the recycler and fixed size.
 | 
			
		||||
            recycler.layoutManager = LinearLayoutManager(context)
 | 
			
		||||
            recycler.setHasFixedSize(true)
 | 
			
		||||
        }
 | 
			
		||||
        // Set the layout manager for the recycler and fixed size.
 | 
			
		||||
        recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        recycler.setHasFixedSize(true)
 | 
			
		||||
 | 
			
		||||
        // Suscribe to changes
 | 
			
		||||
        DownloadService.runningRelay
 | 
			
		||||
@@ -83,12 +80,12 @@ class DownloadController : NucleusController<DownloadPresenter>() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        for (subscription in progressSubscriptions.values) {
 | 
			
		||||
            subscription.unsubscribe()
 | 
			
		||||
        }
 | 
			
		||||
        progressSubscriptions.clear()
 | 
			
		||||
        adapter = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
 | 
			
		||||
@@ -232,20 +229,18 @@ class DownloadController : NucleusController<DownloadPresenter>() {
 | 
			
		||||
     * @return the holder of the download or null if it's not bound.
 | 
			
		||||
     */
 | 
			
		||||
    private fun getHolder(download: Download): DownloadHolder? {
 | 
			
		||||
        val recycler = view?.recycler ?: return null
 | 
			
		||||
        return recycler.findViewHolderForItemId(download.chapter.id!!) as? DownloadHolder
 | 
			
		||||
        return recycler?.findViewHolderForItemId(download.chapter.id!!) as? DownloadHolder
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set information view when queue is empty
 | 
			
		||||
     */
 | 
			
		||||
    private fun setInformationView() {
 | 
			
		||||
        val emptyView = view?.empty_view ?: return
 | 
			
		||||
        if (presenter.downloadQueue.isEmpty()) {
 | 
			
		||||
            emptyView.show(R.drawable.ic_file_download_black_128dp,
 | 
			
		||||
            empty_view?.show(R.drawable.ic_file_download_black_128dp,
 | 
			
		||||
                    R.string.information_no_downloads)
 | 
			
		||||
        } else {
 | 
			
		||||
            emptyView.hide()
 | 
			
		||||
            empty_view?.hide()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,8 +14,6 @@ import android.support.v7.widget.SearchView
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeHandler
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeType
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
 | 
			
		||||
import com.f2prateek.rx.preferences.Preference
 | 
			
		||||
import com.jakewharton.rxbinding.support.v4.view.pageSelections
 | 
			
		||||
import com.jakewharton.rxbinding.support.v7.widget.queryTextChanges
 | 
			
		||||
@@ -30,13 +28,14 @@ import eu.kanade.tachiyomi.data.preference.getOrDefault
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.SecondaryDrawerController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.TabbedController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.category.CategoryController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.main.MainActivity
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaController
 | 
			
		||||
import eu.kanade.tachiyomi.util.inflate
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import eu.kanade.tachiyomi.widget.DrawerSwipeCloseListener
 | 
			
		||||
import kotlinx.android.synthetic.main.library_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.library_controller.*
 | 
			
		||||
import kotlinx.android.synthetic.main.main_activity.*
 | 
			
		||||
import rx.Subscription
 | 
			
		||||
import timber.log.Timber
 | 
			
		||||
@@ -100,14 +99,8 @@ class LibraryController(
 | 
			
		||||
        private set
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * TabLayout of the categories.
 | 
			
		||||
     * Adapter of the view pager.
 | 
			
		||||
     */
 | 
			
		||||
    private val tabs: TabLayout?
 | 
			
		||||
        get() = activity?.tabs
 | 
			
		||||
 | 
			
		||||
    private val drawer: DrawerLayout?
 | 
			
		||||
        get() = activity?.drawer
 | 
			
		||||
 | 
			
		||||
    private var adapter: LibraryAdapter? = null
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -141,43 +134,41 @@ class LibraryController(
 | 
			
		||||
        return inflater.inflate(R.layout.library_controller, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        adapter = LibraryAdapter(this)
 | 
			
		||||
        with(view) {
 | 
			
		||||
            view_pager.adapter = adapter
 | 
			
		||||
            view_pager.pageSelections().skip(1).subscribeUntilDestroy {
 | 
			
		||||
                preferences.lastUsedCategory().set(it)
 | 
			
		||||
                activeCategory = it
 | 
			
		||||
            }
 | 
			
		||||
        view_pager.adapter = adapter
 | 
			
		||||
        view_pager.pageSelections().skip(1).subscribeUntilDestroy {
 | 
			
		||||
            preferences.lastUsedCategory().set(it)
 | 
			
		||||
            activeCategory = it
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            getColumnsPreferenceForCurrentOrientation().asObservable()
 | 
			
		||||
                    .doOnNext { mangaPerRow = it }
 | 
			
		||||
                    .skip(1)
 | 
			
		||||
                    // Set again the adapter to recalculate the covers height
 | 
			
		||||
                    .subscribeUntilDestroy { reattachAdapter() }
 | 
			
		||||
        getColumnsPreferenceForCurrentOrientation().asObservable()
 | 
			
		||||
                .doOnNext { mangaPerRow = it }
 | 
			
		||||
                .skip(1)
 | 
			
		||||
                // Set again the adapter to recalculate the covers height
 | 
			
		||||
                .subscribeUntilDestroy { reattachAdapter() }
 | 
			
		||||
 | 
			
		||||
            if (selectedMangas.isNotEmpty()) {
 | 
			
		||||
                createActionModeIfNeeded()
 | 
			
		||||
            }
 | 
			
		||||
        if (selectedMangas.isNotEmpty()) {
 | 
			
		||||
            createActionModeIfNeeded()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
 | 
			
		||||
        super.onChangeStarted(handler, type)
 | 
			
		||||
        if (type.isEnter) {
 | 
			
		||||
            activity?.tabs?.setupWithViewPager(view?.view_pager)
 | 
			
		||||
            activity?.tabs?.setupWithViewPager(view_pager)
 | 
			
		||||
            presenter.subscribeLibrary()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        adapter = null
 | 
			
		||||
        actionMode = null
 | 
			
		||||
        tabsVisibilitySubscription?.unsubscribe()
 | 
			
		||||
        tabsVisibilitySubscription = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createSecondaryDrawer(drawer: DrawerLayout): ViewGroup {
 | 
			
		||||
@@ -233,14 +224,14 @@ class LibraryController(
 | 
			
		||||
 | 
			
		||||
        // Show empty view if needed
 | 
			
		||||
        if (mangaMap.isNotEmpty()) {
 | 
			
		||||
            view.empty_view.hide()
 | 
			
		||||
            empty_view.hide()
 | 
			
		||||
        } else {
 | 
			
		||||
            view.empty_view.show(R.drawable.ic_book_black_128dp, R.string.information_empty_library)
 | 
			
		||||
            empty_view.show(R.drawable.ic_book_black_128dp, R.string.information_empty_library)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get the current active category.
 | 
			
		||||
        val activeCat = if (adapter.categories.isNotEmpty())
 | 
			
		||||
            view.view_pager.currentItem
 | 
			
		||||
            view_pager.currentItem
 | 
			
		||||
        else
 | 
			
		||||
            activeCategory
 | 
			
		||||
 | 
			
		||||
@@ -248,14 +239,14 @@ class LibraryController(
 | 
			
		||||
        adapter.categories = categories
 | 
			
		||||
 | 
			
		||||
        // Restore active category.
 | 
			
		||||
        view.view_pager.setCurrentItem(activeCat, false)
 | 
			
		||||
        view_pager.setCurrentItem(activeCat, false)
 | 
			
		||||
 | 
			
		||||
        tabsVisibilityRelay.call(categories.size > 1)
 | 
			
		||||
 | 
			
		||||
        // Delay the scroll position to allow the view to be properly measured.
 | 
			
		||||
        view.post {
 | 
			
		||||
            if (isAttached) {
 | 
			
		||||
                tabs?.setScrollPosition(view.view_pager.currentItem, 0f, true)
 | 
			
		||||
                activity?.tabs?.setScrollPosition(view_pager.currentItem, 0f, true)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -298,14 +289,13 @@ class LibraryController(
 | 
			
		||||
     * Reattaches the adapter to the view pager to recreate fragments
 | 
			
		||||
     */
 | 
			
		||||
    private fun reattachAdapter() {
 | 
			
		||||
        val pager = view?.view_pager ?: return
 | 
			
		||||
        val adapter = adapter ?: return
 | 
			
		||||
 | 
			
		||||
        val position = pager.currentItem
 | 
			
		||||
        val position = view_pager.currentItem
 | 
			
		||||
 | 
			
		||||
        adapter.recycle = false
 | 
			
		||||
        pager.adapter = adapter
 | 
			
		||||
        pager.currentItem = position
 | 
			
		||||
        view_pager.adapter = adapter
 | 
			
		||||
        view_pager.currentItem = position
 | 
			
		||||
        adapter.recycle = true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -331,7 +321,7 @@ class LibraryController(
 | 
			
		||||
        val searchItem = menu.findItem(R.id.action_search)
 | 
			
		||||
        val searchView = searchItem.actionView as SearchView
 | 
			
		||||
 | 
			
		||||
        if (!query.isNullOrEmpty()) {
 | 
			
		||||
        if (!query.isEmpty()) {
 | 
			
		||||
            searchItem.expandActionView()
 | 
			
		||||
            searchView.setQuery(query, true)
 | 
			
		||||
            searchView.clearFocus()
 | 
			
		||||
@@ -361,15 +351,13 @@ class LibraryController(
 | 
			
		||||
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
 | 
			
		||||
        when (item.itemId) {
 | 
			
		||||
            R.id.action_filter -> {
 | 
			
		||||
                navView?.let { drawer?.openDrawer(Gravity.END) }
 | 
			
		||||
                navView?.let { activity?.drawer?.openDrawer(Gravity.END) }
 | 
			
		||||
            }
 | 
			
		||||
            R.id.action_update_library -> {
 | 
			
		||||
                activity?.let { LibraryUpdateService.start(it) }
 | 
			
		||||
            }
 | 
			
		||||
            R.id.action_edit_categories -> {
 | 
			
		||||
                router.pushController(RouterTransaction.with(CategoryController())
 | 
			
		||||
                        .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                        .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
                router.pushController(CategoryController().withFadeTransaction())
 | 
			
		||||
            }
 | 
			
		||||
            else -> return super.onOptionsItemSelected(item)
 | 
			
		||||
        }
 | 
			
		||||
@@ -425,9 +413,7 @@ class LibraryController(
 | 
			
		||||
        // Notify the presenter a manga is being opened.
 | 
			
		||||
        presenter.onOpenManga()
 | 
			
		||||
 | 
			
		||||
        router.pushController(RouterTransaction.with(MangaController(manga))
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
        router.pushController(MangaController(manga).withFadeTransaction())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -462,11 +448,11 @@ class LibraryController(
 | 
			
		||||
                .toTypedArray()
 | 
			
		||||
 | 
			
		||||
        ChangeMangaCategoriesDialog(this, mangas, categories, commonCategoriesIndexes)
 | 
			
		||||
                .showDialog(router, null)
 | 
			
		||||
                .showDialog(router)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun showDeleteMangaDialog() {
 | 
			
		||||
        DeleteLibraryMangasDialog(this, selectedMangas.toList()).showDialog(router, null)
 | 
			
		||||
        DeleteLibraryMangasDialog(this, selectedMangas.toList()).showDialog(router)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun updateCategoriesForMangas(mangas: List<Manga>, categories: List<Category>) {
 | 
			
		||||
@@ -481,8 +467,6 @@ class LibraryController(
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Changes the cover for the selected manga.
 | 
			
		||||
     *
 | 
			
		||||
     * @param mangas a list of selected manga.
 | 
			
		||||
     */
 | 
			
		||||
    private fun changeSelectedCover() {
 | 
			
		||||
        val manga = selectedMangas.firstOrNull() ?: return
 | 
			
		||||
 
 | 
			
		||||
@@ -14,10 +14,7 @@ import eu.kanade.tachiyomi.Migrations
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NoToolbarElevationController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.SecondaryDrawerController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.TabbedController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.*
 | 
			
		||||
import eu.kanade.tachiyomi.ui.catalogue.main.CatalogueMainController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.download.DownloadController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.library.LibraryController
 | 
			
		||||
@@ -85,14 +82,11 @@ class MainActivity : BaseActivity() {
 | 
			
		||||
                    R.id.nav_drawer_recently_read -> setRoot(RecentlyReadController(), id)
 | 
			
		||||
                    R.id.nav_drawer_catalogues -> setRoot(CatalogueMainController(), id)
 | 
			
		||||
                    R.id.nav_drawer_downloads -> {
 | 
			
		||||
                        router.pushController(RouterTransaction.with(DownloadController())
 | 
			
		||||
                                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
                        router.pushController(DownloadController().withFadeTransaction())
 | 
			
		||||
                    }
 | 
			
		||||
                    R.id.nav_drawer_settings -> {
 | 
			
		||||
                        router.pushController(SettingsMainController().withFadeTransaction())
 | 
			
		||||
                    }
 | 
			
		||||
                    R.id.nav_drawer_settings ->
 | 
			
		||||
                        router.pushController(RouterTransaction.with(SettingsMainController())
 | 
			
		||||
                                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            drawer.closeDrawer(GravityCompat.START)
 | 
			
		||||
@@ -189,10 +183,7 @@ class MainActivity : BaseActivity() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setRoot(controller: Controller, id: Int) {
 | 
			
		||||
        router.setRoot(RouterTransaction.with(controller)
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .tag(id.toString()))
 | 
			
		||||
        router.setRoot(controller.withFadeTransaction().tag(id.toString()))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun syncActivityViewWithController(to: Controller?, from: Controller? = null) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.manga
 | 
			
		||||
 | 
			
		||||
import android.Manifest.permission.READ_EXTERNAL_STORAGE
 | 
			
		||||
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.TabLayout
 | 
			
		||||
import android.support.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
@@ -32,7 +30,7 @@ import eu.kanade.tachiyomi.ui.manga.info.MangaInfoController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.track.TrackController
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import kotlinx.android.synthetic.main.main_activity.*
 | 
			
		||||
import kotlinx.android.synthetic.main.manga_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.manga_controller.*
 | 
			
		||||
import rx.Subscription
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
@@ -81,21 +79,19 @@ class MangaController : RxController, TabbedController {
 | 
			
		||||
        return inflater.inflate(R.layout.manga_controller, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        if (manga == null || source == null) return
 | 
			
		||||
 | 
			
		||||
        requestPermissionsSafe(arrayOf(WRITE_EXTERNAL_STORAGE), 301)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            adapter = MangaDetailAdapter()
 | 
			
		||||
            view_pager.offscreenPageLimit = 3
 | 
			
		||||
            view_pager.adapter = adapter
 | 
			
		||||
        adapter = MangaDetailAdapter()
 | 
			
		||||
        view_pager.offscreenPageLimit = 3
 | 
			
		||||
        view_pager.adapter = adapter
 | 
			
		||||
 | 
			
		||||
            if (!fromCatalogue)
 | 
			
		||||
                view_pager.currentItem = CHAPTERS_CONTROLLER
 | 
			
		||||
        }
 | 
			
		||||
        if (!fromCatalogue)
 | 
			
		||||
            view_pager.currentItem = CHAPTERS_CONTROLLER
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
@@ -106,7 +102,7 @@ class MangaController : RxController, TabbedController {
 | 
			
		||||
    override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
 | 
			
		||||
        super.onChangeStarted(handler, type)
 | 
			
		||||
        if (type.isEnter) {
 | 
			
		||||
            activity?.tabs?.setupWithViewPager(view?.view_pager)
 | 
			
		||||
            activity?.tabs?.setupWithViewPager(view_pager)
 | 
			
		||||
            trackingIconSubscription = trackingIconRelay.subscribe { setTrackingIconInternal(it) }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import android.animation.Animator
 | 
			
		||||
import android.animation.AnimatorListenerAdapter
 | 
			
		||||
import android.app.Activity
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.Snackbar
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import android.support.v7.view.ActionMode
 | 
			
		||||
@@ -26,7 +25,7 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity
 | 
			
		||||
import eu.kanade.tachiyomi.util.getCoordinates
 | 
			
		||||
import eu.kanade.tachiyomi.util.snack
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import kotlinx.android.synthetic.main.chapters_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.chapters_controller.*
 | 
			
		||||
import timber.log.Timber
 | 
			
		||||
 | 
			
		||||
class ChaptersController : NucleusController<ChaptersPresenter>(),
 | 
			
		||||
@@ -69,57 +68,55 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
 | 
			
		||||
        return inflater.inflate(R.layout.chapters_controller, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        // Init RecyclerView and adapter
 | 
			
		||||
        adapter = ChaptersAdapter(this, view.context)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            recycler.adapter = adapter
 | 
			
		||||
            recycler.layoutManager = LinearLayoutManager(context)
 | 
			
		||||
            recycler.addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
 | 
			
		||||
            recycler.setHasFixedSize(true)
 | 
			
		||||
            adapter?.fastScroller = view.fast_scroller
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
        recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        recycler.addItemDecoration(DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL))
 | 
			
		||||
        recycler.setHasFixedSize(true)
 | 
			
		||||
        adapter?.fastScroller = fast_scroller
 | 
			
		||||
 | 
			
		||||
            swipe_refresh.refreshes().subscribeUntilDestroy { fetchChaptersFromSource() }
 | 
			
		||||
        swipe_refresh.refreshes().subscribeUntilDestroy { fetchChaptersFromSource() }
 | 
			
		||||
 | 
			
		||||
            fab.clicks().subscribeUntilDestroy {
 | 
			
		||||
                val item = presenter.getNextUnreadChapter()
 | 
			
		||||
                if (item != null) {
 | 
			
		||||
                    // Create animation listener
 | 
			
		||||
                    val revealAnimationListener: Animator.AnimatorListener = object : AnimatorListenerAdapter() {
 | 
			
		||||
                        override fun onAnimationStart(animation: Animator?) {
 | 
			
		||||
                            openChapter(item.chapter, true)
 | 
			
		||||
                        }
 | 
			
		||||
        fab.clicks().subscribeUntilDestroy {
 | 
			
		||||
            val item = presenter.getNextUnreadChapter()
 | 
			
		||||
            if (item != null) {
 | 
			
		||||
                // Create animation listener
 | 
			
		||||
                val revealAnimationListener: Animator.AnimatorListener = object : AnimatorListenerAdapter() {
 | 
			
		||||
                    override fun onAnimationStart(animation: Animator?) {
 | 
			
		||||
                        openChapter(item.chapter, true)
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Get coordinates and start animation
 | 
			
		||||
                    val coordinates = fab.getCoordinates()
 | 
			
		||||
                    if (!reveal_view.showRevealEffect(coordinates.x, coordinates.y, revealAnimationListener)) {
 | 
			
		||||
                        openChapter(item.chapter)
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    context.toast(R.string.no_next_chapter)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Get coordinates and start animation
 | 
			
		||||
                val coordinates = fab.getCoordinates()
 | 
			
		||||
                if (!reveal_view.showRevealEffect(coordinates.x, coordinates.y, revealAnimationListener)) {
 | 
			
		||||
                    openChapter(item.chapter)
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                view.context.toast(R.string.no_next_chapter)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        adapter = null
 | 
			
		||||
        actionMode = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onActivityResumed(activity: Activity) {
 | 
			
		||||
        val view = view ?: return
 | 
			
		||||
        if (view == null) return
 | 
			
		||||
 | 
			
		||||
        // Check if animation view is visible
 | 
			
		||||
        if (view.reveal_view.visibility == View.VISIBLE) {
 | 
			
		||||
        if (reveal_view.visibility == View.VISIBLE) {
 | 
			
		||||
            // Show the unReveal effect
 | 
			
		||||
            val coordinates = view.fab.getCoordinates()
 | 
			
		||||
            view.reveal_view.hideRevealEffect(coordinates.x, coordinates.y, 1920)
 | 
			
		||||
            val coordinates = fab.getCoordinates()
 | 
			
		||||
            reveal_view.hideRevealEffect(coordinates.x, coordinates.y, 1920)
 | 
			
		||||
        }
 | 
			
		||||
        super.onActivityResumed(activity)
 | 
			
		||||
    }
 | 
			
		||||
@@ -213,16 +210,16 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun fetchChaptersFromSource() {
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = true
 | 
			
		||||
        swipe_refresh?.isRefreshing = true
 | 
			
		||||
        presenter.fetchChaptersFromSource()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onFetchChaptersDone() {
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = false
 | 
			
		||||
        swipe_refresh?.isRefreshing = false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onFetchChaptersError(error: Throwable) {
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = false
 | 
			
		||||
        swipe_refresh?.isRefreshing = false
 | 
			
		||||
        activity?.toast(error.message)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -231,7 +228,7 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun getHolder(chapter: Chapter): ChapterHolder? {
 | 
			
		||||
        return view?.recycler?.findViewHolderForItemId(chapter.id!!) as? ChapterHolder
 | 
			
		||||
        return recycler?.findViewHolderForItemId(chapter.id!!) as? ChapterHolder
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun openChapter(chapter: Chapter, hasAnimation: Boolean = false) {
 | 
			
		||||
@@ -365,7 +362,7 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
 | 
			
		||||
        destroyActionModeIfNeeded()
 | 
			
		||||
        presenter.downloadChapters(chapters)
 | 
			
		||||
        if (view != null && !presenter.manga.favorite) {
 | 
			
		||||
            view.recycler?.snack(view.context.getString(R.string.snack_add_to_library), Snackbar.LENGTH_INDEFINITE) {
 | 
			
		||||
            recycler?.snack(view.context.getString(R.string.snack_add_to_library), Snackbar.LENGTH_INDEFINITE) {
 | 
			
		||||
                setAction(R.string.action_add) {
 | 
			
		||||
                    presenter.addToLibrary()
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ import eu.kanade.tachiyomi.util.snack
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import jp.wasabeef.glide.transformations.CropSquareTransformation
 | 
			
		||||
import jp.wasabeef.glide.transformations.MaskTransformation
 | 
			
		||||
import kotlinx.android.synthetic.main.manga_info_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.manga_info_controller.*
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.text.DecimalFormat
 | 
			
		||||
 | 
			
		||||
@@ -71,17 +71,14 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
 | 
			
		||||
        return inflater.inflate(R.layout.manga_info_controller, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            // Set onclickListener to toggle favorite when FAB clicked.
 | 
			
		||||
            fab_favorite.clicks().subscribeUntilDestroy { onFabClick() }
 | 
			
		||||
 | 
			
		||||
            // Set SwipeRefresh to refresh manga data.
 | 
			
		||||
            swipe_refresh.refreshes().subscribeUntilDestroy { fetchMangaFromSource() }
 | 
			
		||||
        }
 | 
			
		||||
        // Set onclickListener to toggle favorite when FAB clicked.
 | 
			
		||||
        fab_favorite.clicks().subscribeUntilDestroy { onFabClick() }
 | 
			
		||||
 | 
			
		||||
        // Set SwipeRefresh to refresh manga data.
 | 
			
		||||
        swipe_refresh.refreshes().subscribeUntilDestroy { fetchMangaFromSource() }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
 | 
			
		||||
@@ -124,50 +121,49 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
 | 
			
		||||
     */
 | 
			
		||||
    private fun setMangaInfo(manga: Manga, source: Source?) {
 | 
			
		||||
        val view = view ?: return
 | 
			
		||||
        with(view) {
 | 
			
		||||
            // Update artist TextView.
 | 
			
		||||
            manga_artist.text = manga.artist
 | 
			
		||||
 | 
			
		||||
            // Update author TextView.
 | 
			
		||||
            manga_author.text = manga.author
 | 
			
		||||
        // Update artist TextView.
 | 
			
		||||
        manga_artist.text = manga.artist
 | 
			
		||||
 | 
			
		||||
            // If manga source is known update source TextView.
 | 
			
		||||
            if (source != null) {
 | 
			
		||||
                manga_source.text = source.toString()
 | 
			
		||||
            }
 | 
			
		||||
        // Update author TextView.
 | 
			
		||||
        manga_author.text = manga.author
 | 
			
		||||
 | 
			
		||||
            // Update genres TextView.
 | 
			
		||||
            manga_genres.text = manga.genre
 | 
			
		||||
        // If manga source is known update source TextView.
 | 
			
		||||
        if (source != null) {
 | 
			
		||||
            manga_source.text = source.toString()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            // Update status TextView.
 | 
			
		||||
            manga_status.setText(when (manga.status) {
 | 
			
		||||
                SManga.ONGOING -> R.string.ongoing
 | 
			
		||||
                SManga.COMPLETED -> R.string.completed
 | 
			
		||||
                SManga.LICENSED -> R.string.licensed
 | 
			
		||||
                else -> R.string.unknown
 | 
			
		||||
            })
 | 
			
		||||
        // Update genres TextView.
 | 
			
		||||
        manga_genres.text = manga.genre
 | 
			
		||||
 | 
			
		||||
            // Update description TextView.
 | 
			
		||||
            manga_summary.text = manga.description
 | 
			
		||||
        // Update status TextView.
 | 
			
		||||
        manga_status.setText(when (manga.status) {
 | 
			
		||||
            SManga.ONGOING -> R.string.ongoing
 | 
			
		||||
            SManga.COMPLETED -> R.string.completed
 | 
			
		||||
            SManga.LICENSED -> R.string.licensed
 | 
			
		||||
            else -> R.string.unknown
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
            // Set the favorite drawable to the correct one.
 | 
			
		||||
            setFavoriteDrawable(manga.favorite)
 | 
			
		||||
        // Update description TextView.
 | 
			
		||||
        manga_summary.text = manga.description
 | 
			
		||||
 | 
			
		||||
            // Set cover if it wasn't already.
 | 
			
		||||
            if (manga_cover.drawable == null && !manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
                GlideApp.with(context)
 | 
			
		||||
        // Set the favorite drawable to the correct one.
 | 
			
		||||
        setFavoriteDrawable(manga.favorite)
 | 
			
		||||
 | 
			
		||||
        // Set cover if it wasn't already.
 | 
			
		||||
        if (manga_cover.drawable == null && !manga.thumbnail_url.isNullOrEmpty()) {
 | 
			
		||||
            GlideApp.with(view.context)
 | 
			
		||||
                    .load(manga)
 | 
			
		||||
                    .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
 | 
			
		||||
                    .centerCrop()
 | 
			
		||||
                    .into(manga_cover)
 | 
			
		||||
 | 
			
		||||
            if (backdrop != null) {
 | 
			
		||||
                GlideApp.with(view.context)
 | 
			
		||||
                        .load(manga)
 | 
			
		||||
                        .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
 | 
			
		||||
                        .centerCrop()
 | 
			
		||||
                        .into(manga_cover)
 | 
			
		||||
 | 
			
		||||
                if (backdrop != null) {
 | 
			
		||||
                    GlideApp.with(context)
 | 
			
		||||
                            .load(manga)
 | 
			
		||||
                            .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
 | 
			
		||||
                            .centerCrop()
 | 
			
		||||
                            .into(backdrop)
 | 
			
		||||
                }
 | 
			
		||||
                        .into(backdrop)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -178,7 +174,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
 | 
			
		||||
     * @param count number of chapters.
 | 
			
		||||
     */
 | 
			
		||||
    fun setChapterCount(count: Float) {
 | 
			
		||||
        view?.manga_chapters?.text = DecimalFormat("#.#").format(count)
 | 
			
		||||
        manga_chapters?.text = DecimalFormat("#.#").format(count)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -243,7 +239,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
 | 
			
		||||
    private fun setFavoriteDrawable(isFavorite: Boolean) {
 | 
			
		||||
        // Set the Favorite drawable to the correct one.
 | 
			
		||||
        // Border drawable if false, filled drawable if true.
 | 
			
		||||
        view?.fab_favorite?.setImageResource(if (isFavorite)
 | 
			
		||||
        fab_favorite?.setImageResource(if (isFavorite)
 | 
			
		||||
            R.drawable.ic_bookmark_white_24dp
 | 
			
		||||
        else
 | 
			
		||||
            R.drawable.ic_bookmark_border_white_24dp)
 | 
			
		||||
@@ -279,7 +275,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
 | 
			
		||||
     * @param value whether it should be refreshing or not.
 | 
			
		||||
     */
 | 
			
		||||
    private fun setRefreshing(value: Boolean) {
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = value
 | 
			
		||||
        swipe_refresh?.isRefreshing = value
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.manga.track
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
@@ -11,7 +10,7 @@ import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaController
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import kotlinx.android.synthetic.main.track_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.track_controller.*
 | 
			
		||||
 | 
			
		||||
class TrackController : NucleusController<TrackPresenter>(),
 | 
			
		||||
        TrackAdapter.OnRowClickListener,
 | 
			
		||||
@@ -35,8 +34,8 @@ class TrackController : NucleusController<TrackPresenter>(),
 | 
			
		||||
        return inflater.inflate(R.layout.track_controller, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        adapter = TrackAdapter(this)
 | 
			
		||||
        with(view) {
 | 
			
		||||
@@ -48,14 +47,14 @@ class TrackController : NucleusController<TrackPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        adapter = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onNextTrackings(trackings: List<TrackItem>) {
 | 
			
		||||
        val atLeastOneLink = trackings.any { it.track != null }
 | 
			
		||||
        adapter?.items = trackings
 | 
			
		||||
        view?.swipe_refresh?.isEnabled = atLeastOneLink
 | 
			
		||||
        swipe_refresh?.isEnabled = atLeastOneLink
 | 
			
		||||
        (parentController as? MangaController)?.setTrackingIcon(atLeastOneLink)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -73,11 +72,11 @@ class TrackController : NucleusController<TrackPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onRefreshDone() {
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = false
 | 
			
		||||
        swipe_refresh?.isRefreshing = false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onRefreshError(error: Throwable) {
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = false
 | 
			
		||||
        swipe_refresh?.isRefreshing = false
 | 
			
		||||
        activity?.toast(error.message)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -109,17 +108,17 @@ class TrackController : NucleusController<TrackPresenter>(),
 | 
			
		||||
 | 
			
		||||
    override fun setStatus(item: TrackItem, selection: Int) {
 | 
			
		||||
        presenter.setStatus(item, selection)
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = true
 | 
			
		||||
        swipe_refresh?.isRefreshing = true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun setScore(item: TrackItem, score: Int) {
 | 
			
		||||
        presenter.setScore(item, score)
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = true
 | 
			
		||||
        swipe_refresh?.isRefreshing = true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun setChaptersRead(item: TrackItem, chaptersRead: Int) {
 | 
			
		||||
        presenter.setLastChapterRead(item, chaptersRead)
 | 
			
		||||
        view?.swipe_refresh?.isRefreshing = true
 | 
			
		||||
        swipe_refresh?.isRefreshing = true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private companion object {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.recent_updates
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import android.support.v7.view.ActionMode
 | 
			
		||||
import android.support.v7.widget.DividerItemDecoration
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
 | 
			
		||||
import com.jakewharton.rxbinding.support.v4.widget.refreshes
 | 
			
		||||
import com.jakewharton.rxbinding.support.v7.widget.scrollStateChanges
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
@@ -19,10 +16,11 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateService
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NoToolbarElevationController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.popControllerWithTag
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import kotlinx.android.synthetic.main.recent_chapters_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.recent_chapters_controller.*
 | 
			
		||||
import timber.log.Timber
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -65,42 +63,39 @@ class RecentChaptersController : NucleusController<RecentChaptersPresenter>(),
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when view is created
 | 
			
		||||
     * @param view created view
 | 
			
		||||
     * @param savedViewState status of saved sate
 | 
			
		||||
     */
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            // Init RecyclerView and adapter
 | 
			
		||||
            val layoutManager = LinearLayoutManager(context)
 | 
			
		||||
            recycler.layoutManager = layoutManager
 | 
			
		||||
            recycler.addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
 | 
			
		||||
            recycler.setHasFixedSize(true)
 | 
			
		||||
            adapter = RecentChaptersAdapter(this@RecentChaptersController)
 | 
			
		||||
            recycler.adapter = adapter
 | 
			
		||||
        // Init RecyclerView and adapter
 | 
			
		||||
        val layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        recycler.layoutManager = layoutManager
 | 
			
		||||
        recycler.addItemDecoration(DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL))
 | 
			
		||||
        recycler.setHasFixedSize(true)
 | 
			
		||||
        adapter = RecentChaptersAdapter(this@RecentChaptersController)
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
 | 
			
		||||
            recycler.scrollStateChanges().subscribeUntilDestroy {
 | 
			
		||||
                // Disable swipe refresh when view is not at the top
 | 
			
		||||
                val firstPos = layoutManager.findFirstCompletelyVisibleItemPosition()
 | 
			
		||||
                swipe_refresh.isEnabled = firstPos <= 0
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            swipe_refresh.setDistanceToTriggerSync((2 * 64 * resources.displayMetrics.density).toInt())
 | 
			
		||||
            swipe_refresh.refreshes().subscribeUntilDestroy {
 | 
			
		||||
                if (!LibraryUpdateService.isRunning(context)) {
 | 
			
		||||
                    LibraryUpdateService.start(context)
 | 
			
		||||
                    context.toast(R.string.action_update_library)
 | 
			
		||||
                }
 | 
			
		||||
                // It can be a very long operation, so we disable swipe refresh and show a toast.
 | 
			
		||||
                swipe_refresh.isRefreshing = false
 | 
			
		||||
        recycler.scrollStateChanges().subscribeUntilDestroy {
 | 
			
		||||
            // Disable swipe refresh when view is not at the top
 | 
			
		||||
            val firstPos = layoutManager.findFirstCompletelyVisibleItemPosition()
 | 
			
		||||
            swipe_refresh.isEnabled = firstPos <= 0
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        swipe_refresh.setDistanceToTriggerSync((2 * 64 * view.resources.displayMetrics.density).toInt())
 | 
			
		||||
        swipe_refresh.refreshes().subscribeUntilDestroy {
 | 
			
		||||
            if (!LibraryUpdateService.isRunning(view.context)) {
 | 
			
		||||
                LibraryUpdateService.start(view.context)
 | 
			
		||||
                view.context.toast(R.string.action_update_library)
 | 
			
		||||
            }
 | 
			
		||||
            // It can be a very long operation, so we disable swipe refresh and show a toast.
 | 
			
		||||
            swipe_refresh.isRefreshing = false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        adapter = null
 | 
			
		||||
        actionMode = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -180,11 +175,10 @@ class RecentChaptersController : NucleusController<RecentChaptersPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onUpdateEmptyView(size: Int) {
 | 
			
		||||
        val emptyView = view?.empty_view ?: return
 | 
			
		||||
        if (size > 0) {
 | 
			
		||||
            emptyView.hide()
 | 
			
		||||
            empty_view?.hide()
 | 
			
		||||
        } else {
 | 
			
		||||
            emptyView.show(R.drawable.ic_update_black_128dp, R.string.information_no_recent)
 | 
			
		||||
            empty_view?.show(R.drawable.ic_update_black_128dp, R.string.information_no_recent)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -201,7 +195,7 @@ class RecentChaptersController : NucleusController<RecentChaptersPresenter>(),
 | 
			
		||||
     * @param download [Download] object containing download progress.
 | 
			
		||||
     */
 | 
			
		||||
    private fun getHolder(download: Download): RecentChapterHolder? {
 | 
			
		||||
        return view?.recycler?.findViewHolderForItemId(download.chapter.id!!) as? RecentChapterHolder
 | 
			
		||||
        return recycler?.findViewHolderForItemId(download.chapter.id!!) as? RecentChapterHolder
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -260,9 +254,7 @@ class RecentChaptersController : NucleusController<RecentChaptersPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun openManga(chapter: RecentChapterItem) {
 | 
			
		||||
        router.pushController(RouterTransaction.with(MangaController(chapter.manga))
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
        router.pushController(MangaController(chapter.manga).withFadeTransaction())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,19 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.recently_read
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.History
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import kotlinx.android.synthetic.main.recently_read_controller.view.*
 | 
			
		||||
import kotlinx.android.synthetic.main.recently_read_controller.*
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fragment that shows recently read manga.
 | 
			
		||||
@@ -51,23 +49,20 @@ class RecentlyReadController : NucleusController<RecentlyReadPresenter>(),
 | 
			
		||||
     * Called when view is created
 | 
			
		||||
     *
 | 
			
		||||
     * @param view created view
 | 
			
		||||
     * @param savedViewState saved state of the view
 | 
			
		||||
     */
 | 
			
		||||
    override fun onViewCreated(view: View, savedViewState: Bundle?) {
 | 
			
		||||
        super.onViewCreated(view, savedViewState)
 | 
			
		||||
    override fun onViewCreated(view: View) {
 | 
			
		||||
        super.onViewCreated(view)
 | 
			
		||||
 | 
			
		||||
        with(view) {
 | 
			
		||||
            // Initialize adapter
 | 
			
		||||
            recycler.layoutManager = LinearLayoutManager(context)
 | 
			
		||||
            adapter = RecentlyReadAdapter(this@RecentlyReadController)
 | 
			
		||||
            recycler.setHasFixedSize(true)
 | 
			
		||||
            recycler.adapter = adapter
 | 
			
		||||
        }
 | 
			
		||||
        // Initialize adapter
 | 
			
		||||
        recycler.layoutManager = LinearLayoutManager(view.context)
 | 
			
		||||
        adapter = RecentlyReadAdapter(this@RecentlyReadController)
 | 
			
		||||
        recycler.setHasFixedSize(true)
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView(view: View) {
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
        adapter = null
 | 
			
		||||
        super.onDestroyView(view)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -80,11 +75,10 @@ class RecentlyReadController : NucleusController<RecentlyReadPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onUpdateEmptyView(size: Int) {
 | 
			
		||||
        val emptyView = view?.empty_view ?: return
 | 
			
		||||
        if (size > 0) {
 | 
			
		||||
            emptyView.hide()
 | 
			
		||||
            empty_view.hide()
 | 
			
		||||
        } else {
 | 
			
		||||
            emptyView.show(R.drawable.ic_glasses_black_128dp, R.string.information_no_recent_manga)
 | 
			
		||||
            empty_view.show(R.drawable.ic_glasses_black_128dp, R.string.information_no_recent_manga)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -108,9 +102,7 @@ class RecentlyReadController : NucleusController<RecentlyReadPresenter>(),
 | 
			
		||||
 | 
			
		||||
    override fun onCoverClick(position: Int) {
 | 
			
		||||
        val manga = adapter?.getItem(position)?.mch?.manga ?: return
 | 
			
		||||
        router.pushController(RouterTransaction.with(MangaController(manga))
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
        router.pushController(MangaController(manga).withFadeTransaction())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun removeHistory(manga: Manga, history: History, all: Boolean) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.setting
 | 
			
		||||
 | 
			
		||||
import android.support.v7.preference.PreferenceScreen
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.util.getResourceColor
 | 
			
		||||
 | 
			
		||||
class SettingsMainController : SettingsController() {
 | 
			
		||||
@@ -57,8 +56,6 @@ class SettingsMainController : SettingsController() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun navigateTo(controller: SettingsController) {
 | 
			
		||||
        router.pushController(RouterTransaction.with(controller)
 | 
			
		||||
                .pushChangeHandler(FadeChangeHandler())
 | 
			
		||||
                .popChangeHandler(FadeChangeHandler()))
 | 
			
		||||
        router.pushController(controller.withFadeTransaction())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user