From 84ef2af82fd53b5783dff53dc80ed04bbe586167 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 29 Jun 2020 13:06:40 +0300 Subject: [PATCH] Fix MangaDetailsPresenter sharing --- app/build.gradle | 2 +- .../kotatsu/ui/browser/BrowserActivity.kt | 4 +-- .../kotatsu/ui/common/BaseActivity.kt | 11 -------- .../ui/common/SharedPresenterHolder.kt | 25 +++++++++++++++++++ .../kotatsu/ui/details/ChaptersFragment.kt | 4 ++- .../ui/details/MangaDetailsActivity.kt | 10 +++++--- .../ui/details/MangaDetailsFragment.kt | 4 ++- .../ui/details/MangaDetailsPresenter.kt | 23 +++++++---------- .../ui/details/RelatedMangaFragment.kt | 4 ++- .../ui/list/local/LocalListPresenter.kt | 8 +++--- .../kotatsu/ui/reader/ReaderActivity.kt | 2 +- .../kotatsu/ui/search/SearchActivity.kt | 2 +- .../ui/search/global/GlobalSearchActivity.kt | 2 +- .../ui/widget/shelf/ShelfConfigActivity.kt | 2 +- 14 files changed, 60 insertions(+), 43 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/common/SharedPresenterHolder.kt diff --git a/app/build.gradle b/app/build.gradle index 9606fe6d9..6d1d97bc2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ android { minSdkVersion 21 targetSdkVersion 29 versionCode gitCommits - versionName '0.5-b1' + versionName '0.5-b2' kapt { arguments { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt index a0b406121..a616b6172 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt @@ -29,7 +29,7 @@ class BrowserActivity : BaseActivity(), BrowserCallback { webView.webViewClient = BrowserClient(this) val url = intent?.dataString if (url.isNullOrEmpty()) { - finish() + finishAfterTransition() } else { webView.loadUrl(url) } @@ -43,7 +43,7 @@ class BrowserActivity : BaseActivity(), BrowserCallback { override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { android.R.id.home -> { webView.stopLoading() - finish() + finishAfterTransition() true } R.id.action_browser -> { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseActivity.kt index eb0230f18..f6cb18b76 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseActivity.kt @@ -1,12 +1,10 @@ package org.koitharu.kotatsu.ui.common -import android.view.KeyEvent import android.view.MenuItem import android.view.View import androidx.appcompat.widget.Toolbar import moxy.MvpAppCompatActivity import org.koin.core.KoinComponent -import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R abstract class BaseActivity : MvpAppCompatActivity(), KoinComponent { @@ -29,13 +27,4 @@ abstract class BaseActivity : MvpAppCompatActivity(), KoinComponent { onBackPressed() true } else super.onOptionsItemSelected(item) - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - //TODO remove. Just for testing - if (BuildConfig.DEBUG && keyCode == KeyEvent.KEYCODE_VOLUME_UP) { - recreate() - return true - } - return super.onKeyDown(keyCode, event) - } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/SharedPresenterHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/common/SharedPresenterHolder.kt new file mode 100644 index 000000000..05b676d5d --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/common/SharedPresenterHolder.kt @@ -0,0 +1,25 @@ +package org.koitharu.kotatsu.ui.common + +import android.util.ArrayMap +import moxy.MvpPresenter +import java.lang.ref.WeakReference + +abstract class SharedPresenterHolder> { + + private val cache = ArrayMap>(3) + + fun getInstance(key: Int): T { + var instance = cache[key]?.get() + if (instance == null) { + instance = onCreatePresenter(key) + cache[key] = WeakReference(instance) + } + return instance + } + + fun clear(key: Int) { + cache.remove(key) + } + + protected abstract fun onCreatePresenter(key: Int): T +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt index d07c7fe3d..7c96faa0c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt @@ -25,7 +25,9 @@ class ChaptersFragment : BaseFragment(R.layout.fragment_chapters), MangaDetailsV OnRecyclerItemClickListener, ActionMode.Callback { @Suppress("unused") - private val presenter by moxyPresenter(factory = MangaDetailsPresenter.Companion::getInstance) + private val presenter by moxyPresenter { + MangaDetailsPresenter.getInstance(activity.hashCode()) + } private var manga: Manga? = null diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt index b8bb92fcc..d0c0ddd71 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt @@ -37,7 +37,9 @@ import org.koitharu.kotatsu.utils.ext.getThemeColor class MangaDetailsActivity : BaseActivity(), MangaDetailsView, TabLayoutMediator.TabConfigurationStrategy { - private val presenter by moxyPresenter(factory = MangaDetailsPresenter.Companion::getInstance) + private val presenter by moxyPresenter { + MangaDetailsPresenter.getInstance(hashCode()) + } private var manga: Manga? = null @@ -52,7 +54,7 @@ class MangaDetailsActivity : BaseActivity(), MangaDetailsView, presenter.loadDetails(it, true) } ?: intent?.getLongExtra(EXTRA_MANGA_ID, 0)?.takeUnless { it == 0L }?.let { presenter.findMangaById(it) - } ?: finish() + } ?: finishAfterTransition() } } @@ -73,13 +75,13 @@ class MangaDetailsActivity : BaseActivity(), MangaDetailsView, this, getString(R.string._s_deleted_from_local_storage, manga.title), Toast.LENGTH_SHORT ).show() - finish() + finishAfterTransition() } override fun onError(e: Throwable) { if (manga == null) { Toast.makeText(this, e.getDisplayMessage(resources), Toast.LENGTH_LONG).show() - finish() + finishAfterTransition() } else { Snackbar.make(pager, e.getDisplayMessage(resources), Snackbar.LENGTH_LONG).show() } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt index 68846901b..bf5a02181 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt @@ -29,7 +29,9 @@ class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetai View.OnLongClickListener { @Suppress("unused") - private val presenter by moxyPresenter(factory = MangaDetailsPresenter.Companion::getInstance) + private val presenter by moxyPresenter { + MangaDetailsPresenter.getInstance(activity.hashCode()) + } private var manga: Manga? = null private var history: MangaHistory? = null diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt index fa7a1291c..9c234551e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.ui.details +import android.util.Log import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.* @@ -21,13 +22,13 @@ import org.koitharu.kotatsu.domain.history.HistoryRepository import org.koitharu.kotatsu.domain.history.OnHistoryChangeListener import org.koitharu.kotatsu.domain.tracking.TrackingRepository import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.common.SharedPresenterHolder import org.koitharu.kotatsu.utils.ext.safe import java.io.IOException @InjectViewState -class MangaDetailsPresenter private constructor() : BasePresenter(), - OnHistoryChangeListener, - OnFavouritesChangeListener { +class MangaDetailsPresenter private constructor(private val key: Int) : + BasePresenter(), OnHistoryChangeListener, OnFavouritesChangeListener { private lateinit var historyRepository: HistoryRepository private lateinit var favouritesRepository: FavouritesRepository @@ -55,7 +56,7 @@ class MangaDetailsPresenter private constructor() : BasePresenter() { - private var instance: MangaDetailsPresenter? = null - - fun getInstance(): MangaDetailsPresenter = instance ?: synchronized(this) { - MangaDetailsPresenter().also { - instance = it - } - } + override fun onCreatePresenter(key: Int) = MangaDetailsPresenter(key) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/RelatedMangaFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/RelatedMangaFragment.kt index d74f7b6f1..1a5fddd9b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/RelatedMangaFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/RelatedMangaFragment.kt @@ -10,7 +10,9 @@ import org.koitharu.kotatsu.ui.list.MangaListFragment class RelatedMangaFragment : MangaListFragment(), MangaDetailsView { - private val presenter by moxyPresenter(factory = MangaDetailsPresenter.Companion::getInstance) + private val presenter by moxyPresenter { + MangaDetailsPresenter.getInstance(activity.hashCode()) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt index 62a387803..0d755809c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt @@ -38,11 +38,11 @@ class LocalListPresenter : BasePresenter>() { } fun loadList(offset: Int) { - if (offset != 0) { - viewState.onListAppended(emptyList()) - return - } presenterScope.launch { + if (offset != 0) { + viewState.onListAppended(emptyList()) + return@launch + } viewState.onLoadingStateChanged(true) try { val list = withContext(Dispatchers.IO) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt index eb7629112..2d2662ab3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt @@ -75,7 +75,7 @@ class ReaderActivity : BaseFullscreenActivity(), ReaderView, ChaptersDialog.OnCh ?: intent.getParcelableExtra(EXTRA_STATE) ?: let { Toast.makeText(this, R.string.error_occurred, Toast.LENGTH_SHORT).show() - finish() + finishAfterTransition() return } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt index 0fe84d044..d39465d54 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt @@ -19,7 +19,7 @@ class SearchActivity : BaseActivity(), SearchView.OnQueryTextListener { super.onCreate(savedInstanceState) setContentView(R.layout.activity_search) source = intent.getParcelableExtra(EXTRA_SOURCE) ?: run { - finish() + finishAfterTransition() return } val query = intent.getStringExtra(EXTRA_QUERY) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt index a39d9bd5b..726d4300b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt @@ -14,7 +14,7 @@ class GlobalSearchActivity : BaseActivity() { val query = intent.getStringExtra(EXTRA_QUERY) if (query == null) { - finish() + finishAfterTransition() return } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt index a8cbb1eea..308ea678e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt @@ -48,7 +48,7 @@ class ShelfConfigActivity : BaseActivity(), FavouriteCategoriesView, AppWidgetManager.INVALID_APPWIDGET_ID ) ?: AppWidgetManager.INVALID_APPWIDGET_ID if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { - finish() + finishAfterTransition() return } config = AppWidgetConfig.getInstance(this, appWidgetId)