From 9f0da3f1d63afa34c1394bec7108e9f6858fc9f1 Mon Sep 17 00:00:00 2001 From: len Date: Fri, 22 Apr 2016 13:50:51 +0200 Subject: [PATCH] Upgrade to nucleus 3 --- app/build.gradle | 2 +- .../ui/base/activity/BaseRxActivity.java | 8 ++--- .../ui/base/fragment/BaseRxFragment.java | 14 ++++----- .../ui/catalogue/CatalogueFragment.kt | 3 +- .../tachiyomi/ui/manga/MangaActivity.kt | 30 +++++++++++------- .../tachiyomi/ui/manga/MangaPresenter.kt | 31 +++++-------------- .../ui/manga/chapter/ChaptersFragment.kt | 5 ++- .../ui/manga/chapter/ChaptersPresenter.kt | 4 --- .../tachiyomi/ui/reader/ReaderActivity.kt | 10 +++++- .../tachiyomi/ui/reader/ReaderPresenter.kt | 2 +- .../ui/recent/RecentChaptersFragment.kt | 10 ++---- .../ui/recent/RecentChaptersPresenter.kt | 10 ------ .../eu/kanade/tachiyomi/util/SharedData.kt | 12 ++++++- 13 files changed, 66 insertions(+), 75 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3b36c4c749..cb7bff0d15 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -142,7 +142,7 @@ dependencies { kapt "com.pushtorefresh.storio:sqlite-annotations-processor:$STORIO_VERSION" // Model View Presenter - compile 'info.android15.nucleus:nucleus:2.0.5' + compile 'info.android15.nucleus:nucleus:3.0.0-beta' // Dependency injection compile "com.google.dagger:dagger:$DAGGER_VERSION" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseRxActivity.java b/app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseRxActivity.java index ec5a12b5bd..3592547937 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseRxActivity.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseRxActivity.java @@ -11,7 +11,6 @@ import nucleus.presenter.Presenter; import nucleus.view.PresenterLifecycleDelegate; import nucleus.view.ViewWithPresenter; - /** * This class is an example of how an activity could controls it's presenter. * You can inherit from this class or copy/paste this class's code to @@ -87,8 +86,9 @@ public abstract class BaseRxActivity

extends BaseActivity i } @Override - protected void onPause() { - super.onPause(); - presenterDelegate.onPause(isFinishing()); + protected void onDestroy() { + super.onDestroy(); + presenterDelegate.onDropView(); + presenterDelegate.onDestroy(!isChangingConfigurations()); } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/fragment/BaseRxFragment.java b/app/src/main/java/eu/kanade/tachiyomi/ui/base/fragment/BaseRxFragment.java index 84044cdc8c..e03e6a1cae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/fragment/BaseRxFragment.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/fragment/BaseRxFragment.java @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.ui.base.fragment; import android.os.Bundle; -import android.support.v4.app.Fragment; import eu.kanade.tachiyomi.App; import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter; @@ -85,13 +84,14 @@ public abstract class BaseRxFragment

extends BaseFragment i } @Override - public void onPause() { - super.onPause(); - presenterDelegate.onPause(getActivity().isFinishing() || isRemoving(this)); + public void onDestroyView() { + super.onDestroyView(); + presenterDelegate.onDropView(); } - private static boolean isRemoving(Fragment fragment) { - Fragment parent = fragment.getParentFragment(); - return fragment.isRemoving() || (parent != null && isRemoving(parent)); + @Override + public void onDestroy() { + super.onDestroy(); + presenterDelegate.onDestroy(!getActivity().isChangingConfigurations()); } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueFragment.kt index d7736dee6b..3981f5a0fd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueFragment.kt @@ -458,8 +458,7 @@ class CatalogueFragment : BaseRxFragment(), FlexibleViewHold override fun onListItemClick(position: Int): Boolean { val item = adapter.getItem(position) ?: return false - val intent = MangaActivity.newIntent(activity, item) - intent.putExtra(MangaActivity.FROM_CATALOGUE, true) + val intent = MangaActivity.newIntent(activity, item, true) startActivity(intent) return false } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaActivity.kt index 00e74d7f74..ae325be9b9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaActivity.kt @@ -23,21 +23,24 @@ class MangaActivity : BaseRxActivity() { companion object { - val FROM_CATALOGUE = "from_catalogue" - val INFO_FRAGMENT = 0 - val CHAPTERS_FRAGMENT = 1 - val MYANIMELIST_FRAGMENT = 2 + const val FROM_CATALOGUE_EXTRA = "from_catalogue" + const val MANGA_EXTRA = "manga" + const val INFO_FRAGMENT = 0 + const val CHAPTERS_FRAGMENT = 1 + const val MYANIMELIST_FRAGMENT = 2 - fun newIntent(context: Context, manga: Manga): Intent { - val intent = Intent(context, MangaActivity::class.java) + fun newIntent(context: Context, manga: Manga, fromCatalogue: Boolean = false): Intent { SharedData.put(MangaEvent(manga)) - return intent + return Intent(context, MangaActivity::class.java).apply { + putExtra(FROM_CATALOGUE_EXTRA, fromCatalogue) + putExtra(MANGA_EXTRA, manga.id) + } } } private lateinit var adapter: MangaDetailAdapter - var isCatalogueManga: Boolean = false + var fromCatalogue: Boolean = false private set override fun onCreate(savedState: Bundle?) { @@ -45,16 +48,21 @@ class MangaActivity : BaseRxActivity() { super.onCreate(savedState) setContentView(R.layout.activity_manga) + presenter.setMangaEvent(SharedData.getOrPut(MangaEvent::class.java) { + val id = intent.getLongExtra(MANGA_EXTRA, 0) + MangaEvent(presenter.db.getManga(id).executeAsBlocking()!!) + }) + setupToolbar(toolbar) - isCatalogueManga = intent.getBooleanExtra(FROM_CATALOGUE, false) + fromCatalogue = intent.getBooleanExtra(FROM_CATALOGUE_EXTRA, false) adapter = MangaDetailAdapter(supportFragmentManager, this) view_pager.adapter = adapter tabs.setupWithViewPager(view_pager) - if (!isCatalogueManga) + if (!fromCatalogue) view_pager.currentItem = CHAPTERS_FRAGMENT requestPermissionsOnMarshmallow() @@ -72,7 +80,7 @@ class MangaActivity : BaseRxActivity() { init { pageCount = 2 - if (!activity.isCatalogueManga && activity.presenter.syncManager.myAnimeList.isLogged) + if (!activity.fromCatalogue && activity.presenter.syncManager.myAnimeList.isLogged) pageCount++ } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt index 825eba8cf8..5cc19fe07b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt @@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.event.MangaEvent import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter import eu.kanade.tachiyomi.util.SharedData import rx.Observable +import rx.Subscription import javax.inject.Inject /** @@ -31,37 +32,21 @@ class MangaPresenter : BasePresenter() { */ lateinit var manga: Manga - /** - * Key to save and restore [manga] from a bundle. - */ - private val MANGA_KEY = "manga_key" + var mangaSubscription: Subscription? = null override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) - if (savedState == null) { - manga = SharedData.get(MangaEvent::class.java)!!.manga - } else { - manga = savedState.getSerializable(MANGA_KEY) as Manga - SharedData.put(MangaEvent(manga)) - } - // Prepare a subject to communicate the chapters and info presenters for the chapter count. SharedData.put(ChapterCountEvent()) - - Observable.just(manga) - .subscribeLatestCache({ view, manga -> view.onSetManga(manga) }) } - override fun onDestroy() { - SharedData.remove(MangaEvent::class.java) - SharedData.remove(ChapterCountEvent::class.java) - super.onDestroy() - } - - override fun onSave(state: Bundle) { - state.putSerializable(MANGA_KEY, manga) - super.onSave(state) + fun setMangaEvent(event: MangaEvent) { + if (isUnsubscribed(mangaSubscription)) { + manga = event.manga + mangaSubscription = Observable.just(manga) + .subscribeLatestCache({ view, manga -> view.onSetManga(manga) }) + } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt index c70d7f3fef..ca59d0bbc1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt @@ -181,11 +181,10 @@ class ChaptersFragment : BaseRxFragment(), ActionMode.Callbac } val isCatalogueManga: Boolean - get() = (activity as MangaActivity).isCatalogueManga + get() = (activity as MangaActivity).fromCatalogue fun openChapter(chapter: Chapter, hasAnimation: Boolean = false) { - presenter.onOpenChapter(chapter) - val intent = ReaderActivity.newIntent(activity) + val intent = ReaderActivity.newIntent(activity, presenter.manga, chapter) if (hasAnimation) { intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt index 38eb5be3d9..ea83b97c60 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt @@ -159,10 +159,6 @@ class ChaptersPresenter : BasePresenter() { refreshChapters() } - fun onOpenChapter(chapter: Chapter) { - SharedData.put(ReaderEvent(manga, chapter)) - } - fun getNextUnreadChapter(): Chapter? { return db.getNextUnreadChapter(manga).executeAsBlocking() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index bf359d5ea1..86ee4d628d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -21,6 +21,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.source.model.Page +import eu.kanade.tachiyomi.event.ReaderEvent import eu.kanade.tachiyomi.ui.base.activity.BaseRxActivity import eu.kanade.tachiyomi.ui.base.listener.SimpleAnimationListener import eu.kanade.tachiyomi.ui.base.listener.SimpleSeekBarListener @@ -30,6 +31,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.pager.horizontal.RightToLeftReader import eu.kanade.tachiyomi.ui.reader.viewer.pager.vertical.VerticalReader import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonReader import eu.kanade.tachiyomi.util.GLUtil +import eu.kanade.tachiyomi.util.SharedData import eu.kanade.tachiyomi.util.toast import kotlinx.android.synthetic.main.activity_reader.* import kotlinx.android.synthetic.main.reader_menu.* @@ -53,7 +55,8 @@ class ReaderActivity : BaseRxActivity() { const val MENU_VISIBLE = "menu_visible" - fun newIntent(context: Context): Intent { + fun newIntent(context: Context, manga: Manga, chapter: Chapter): Intent { + SharedData.put(ReaderEvent(manga, chapter)) return Intent(context, ReaderActivity::class.java) } } @@ -90,6 +93,11 @@ class ReaderActivity : BaseRxActivity() { super.onCreate(savedState) setContentView(R.layout.activity_reader) + if (savedState == null && SharedData.get(ReaderEvent::class.java) == null) { + finish() + return + } + setupToolbar(toolbar) subscriptions = CompositeSubscription() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 70d522c963..748afa58d8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -71,7 +71,7 @@ class ReaderPresenter : BasePresenter() { super.onCreate(savedState) if (savedState == null) { - val event = SharedData.remove(ReaderEvent::class.java) ?: return + val event = SharedData.get(ReaderEvent::class.java) ?: return manga = event.manga chapter = event.chapter } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.kt index fbaa5c7cb6..a84b86f537 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersFragment.kt @@ -103,21 +103,17 @@ class RecentChaptersFragment : BaseRxFragment(), Flexib /** * Open chapter in reader - + * * @param chapter selected chapter */ private fun openChapter(chapter: MangaChapter) { - // Start reader event - presenter.onOpenChapter(chapter) - - //Start reader intent - val intent = ReaderActivity.newIntent(activity) + val intent = ReaderActivity.newIntent(activity, chapter.manga, chapter.chapter) startActivity(intent) } /** * Populate adapter with chapters - + * * @param chapters list of chapters */ fun onNextMangaChapters(chapters: List) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.kt index 0fbd17a230..97e5ee33d9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/RecentChaptersPresenter.kt @@ -10,9 +10,7 @@ import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.source.SourceManager import eu.kanade.tachiyomi.event.DownloadChaptersEvent -import eu.kanade.tachiyomi.event.ReaderEvent import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter -import eu.kanade.tachiyomi.util.SharedData import rx.Observable import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers @@ -251,14 +249,6 @@ class RecentChaptersPresenter : BasePresenter() { return cal.time } - /** - * Open chapter in reader - * @param item chapter that is opened - */ - fun onOpenChapter(item: MangaChapter) { - SharedData.put(ReaderEvent(item.manga, item.chapter)) - } - /** * Download selected chapter * @param selectedChapter chapter that is selected diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt b/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt index 6c0daedc23..98d10b2d47 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt @@ -14,7 +14,7 @@ object SharedData { /** * Map where the objects are saved. */ - private val map = HashMap, Any>() + val map = HashMap, Any>() /** * Publish an object to the shared data. @@ -42,4 +42,14 @@ object SharedData { */ fun remove(classType: Class) = get(classType)?.apply { map.remove(classType) } + /** + * Returns an object from the shared data or introduces a new one with the given function. + * + * @param classType the class of the object to retrieve. + * @param fn the function to execute if it didn't find the object. + * @return an object of type T. + */ + @Suppress("UNCHECKED_CAST") + inline fun getOrPut(classType: Class, fn: () -> T) = map.getOrPut(classType, fn) as T + }