From c8dd2190ba7432c52b2276edbaf2c7af2509390c Mon Sep 17 00:00:00 2001 From: inorichi Date: Thu, 7 Jan 2021 15:19:00 +0100 Subject: [PATCH] Minor fixes regarding leaks (cherry picked from commit 36f81b4a623ede11f10049f5869de5b6efa7803a) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt --- .../ui/base/controller/BaseController.kt | 7 +++ .../ui/base/controller/NucleusController.kt | 5 -- .../browse/extension/ExtensionController.kt | 4 +- .../details/ExtensionDetailsController.kt | 2 +- .../ui/browse/latest/LatestController.kt | 2 +- .../advanced/design/PreMigrationController.kt | 27 +++++---- .../migration/search/SearchController.kt | 2 +- .../ui/browse/source/SourceController.kt | 2 +- .../source/browse/BrowseSourceController.kt | 5 +- .../globalsearch/GlobalSearchController.kt | 2 +- .../ui/browse/source/index/IndexController.kt | 5 +- .../ui/category/CategoryController.kt | 12 ++-- .../biometric/BiometricTimesController.kt | 9 ++- .../ui/category/genre/SortTagController.kt | 17 +++--- .../ui/category/repos/RepoController.kt | 9 ++- .../sources/SourceCategoryController.kt | 9 ++- .../ui/download/DownloadController.kt | 26 ++++----- .../library/LibraryComfortableGridHolder.kt | 2 +- .../ui/library/LibraryCompactGridHolder.kt | 2 +- .../tachiyomi/ui/library/LibraryController.kt | 11 ++-- .../kanade/tachiyomi/ui/main/MainActivity.kt | 19 +++++-- .../tachiyomi/ui/manga/EditMangaDialog.kt | 8 +-- .../tachiyomi/ui/manga/MangaController.kt | 56 +++++++++---------- .../ui/manga/track/TrackController.kt | 2 +- .../ui/manga/track/TrackSearchDialog.kt | 4 +- .../ui/recent/history/HistoryController.kt | 2 +- .../ui/recent/updates/UpdatesController.kt | 5 +- .../ui/setting/SettingsEhController.kt | 2 +- .../exh/ui/batchadd/BatchAddController.kt | 4 +- .../ui/smartsearch/SmartSearchController.kt | 2 +- 30 files changed, 132 insertions(+), 132 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/BaseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/BaseController.kt index 1f094cb9d..c13c04448 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/BaseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/BaseController.kt @@ -12,6 +12,9 @@ import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.RestoreViewOnCreateController import kotlinx.android.extensions.LayoutContainer +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel import timber.log.Timber abstract class BaseController(bundle: Bundle? = null) : @@ -20,6 +23,8 @@ abstract class BaseController(bundle: Bundle? = null) : lateinit var binding: VB + lateinit var viewScope: CoroutineScope + init { addLifecycleListener( object : LifecycleListener() { @@ -28,6 +33,7 @@ abstract class BaseController(bundle: Bundle? = null) : } override fun preCreateView(controller: Controller) { + viewScope = MainScope() Timber.d("Create view for ${controller.instance()}") } @@ -40,6 +46,7 @@ abstract class BaseController(bundle: Bundle? = null) : } override fun preDestroyView(controller: Controller, view: View) { + viewScope.cancel() Timber.d("Destroy view for ${controller.instance()}") } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NucleusController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NucleusController.kt index 247b6d8bd..0786d5e13 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NucleusController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NucleusController.kt @@ -4,9 +4,6 @@ import android.os.Bundle import androidx.viewbinding.ViewBinding import eu.kanade.tachiyomi.ui.base.presenter.NucleusConductorDelegate import eu.kanade.tachiyomi.ui.base.presenter.NucleusConductorLifecycleListener -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import nucleus.factory.PresenterFactory import nucleus.presenter.Presenter @@ -17,8 +14,6 @@ abstract class NucleusController>(val bundle: private val delegate = NucleusConductorDelegate(this) - val scope = CoroutineScope(Job() + Dispatchers.Main) - val presenter: P get() = delegate.presenter!! diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionController.kt index 2b86eb831..6dbb31f68 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionController.kt @@ -67,7 +67,7 @@ open class ExtensionController : binding.swipeRefresh.isRefreshing = true binding.swipeRefresh.refreshes() .onEach { presenter.findAvailableExtensions() } - .launchIn(scope) + .launchIn(viewScope) // Initialize adapter, scroll listener and recycler views adapter = ExtensionAdapter(this) @@ -142,7 +142,7 @@ open class ExtensionController : query = it.toString() drawExtensions() } - .launchIn(scope) + .launchIn(viewScope) } override fun onItemClick(view: View, position: Int): Boolean { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsController.kt index a4232d347..a1cc1572f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/ExtensionDetailsController.kt @@ -134,7 +134,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) : isChecked = enabled sourcePrefs.forEach { pref -> pref.isVisible = enabled } } - .launchIn(scope) + .launchIn(viewScope) } // Source enable/disable diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/latest/LatestController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/latest/LatestController.kt index 4ca4e7b91..6612c1364 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/latest/LatestController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/latest/LatestController.kt @@ -126,7 +126,7 @@ open class LatestController : presenter.preferences.latestTabSources() .asImmediateFlow { presenter.getLatest() } - .launchIn(scope) + .launchIn(viewScope) } override fun onDestroyView(view: View) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationController.kt index 1c8fe2645..230fb8ba3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationController.kt @@ -83,25 +83,24 @@ class PreMigrationController(bundle: Bundle? = null) : actionFab = fab fab.setText(R.string.action_migrate) fab.setIconResource(R.drawable.ic_arrow_forward_24dp) - fab.clicks() - .onEach { - if (dialog?.isShowing != true) { - dialog = MigrationBottomSheetDialog(activity!!, R.style.SheetDialog, this) - dialog?.show() - val bottomSheet = dialog?.findViewById( - com.google.android.material.R.id.design_bottom_sheet - ) - if (bottomSheet != null) { - val behavior: BottomSheetBehavior<*> = BottomSheetBehavior.from(bottomSheet) - behavior.state = BottomSheetBehavior.STATE_EXPANDED - behavior.skipCollapsed = true - } + fab.setOnClickListener { + if (dialog?.isShowing != true) { + dialog = MigrationBottomSheetDialog(activity!!, R.style.SheetDialog, this) + dialog?.show() + val bottomSheet = dialog?.findViewById( + com.google.android.material.R.id.design_bottom_sheet + ) + if (bottomSheet != null) { + val behavior: BottomSheetBehavior<*> = BottomSheetBehavior.from(bottomSheet) + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.skipCollapsed = true } } - .launchIn(scope) + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt index 7990eebde..f45d0ed2e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt @@ -181,6 +181,6 @@ class SearchController( searchItem.collapseActionView() setTitle() // Update toolbar title } - .launchIn(scope) + .launchIn(viewScope) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt index 1c9051367..f7b55ce0e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt @@ -362,7 +362,7 @@ class SourceController(bundle: Bundle? = null) : searchView.queryTextEvents() .filterIsInstance() .onEach { performGlobalSearch(it.queryText.toString()) } - .launchIn(scope) + .launchIn(viewScope) } private fun performGlobalSearch(query: String) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt index 8f12d084e..70500bf8a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt @@ -329,6 +329,7 @@ open class BrowseSourceController(bundle: Bundle) : } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { recycler?.removeOnScrollListener(it) } actionFab = null } @@ -366,7 +367,7 @@ open class BrowseSourceController(bundle: Bundle) : .drop(1) // Set again the adapter to recalculate the covers height .onEach { adapter = this@BrowseSourceController.adapter } - .launchIn(scope) + .launchIn(viewScope) (layoutManager as GridLayoutManager).spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { @@ -417,7 +418,7 @@ open class BrowseSourceController(bundle: Bundle) : .filter { router.backstack.lastOrNull()?.controller() == this@BrowseSourceController } .filterIsInstance() .onEach { searchWithQuery(it.queryText.toString()) } - .launchIn(scope) + .launchIn(viewScope) searchItem.fixExpand( onExpand = { invalidateMenuOnExpand() }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt index 012cff720..d277eff5e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt @@ -129,7 +129,7 @@ open class GlobalSearchController( searchItem.collapseActionView() setTitle() // Update toolbar title } - .launchIn(scope) + .launchIn(viewScope) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt index e1ad74b03..d7d2ae960 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt @@ -159,7 +159,7 @@ open class IndexController : onBrowseClick(presenter.query.nullIfBlank()) } } - .launchIn(scope) + .launchIn(viewScope) searchItem.fixExpand( onExpand = { invalidateMenuOnExpand() } @@ -247,7 +247,7 @@ open class IndexController : actionFab?.clicks() ?.onEach { filterSheet?.show() } - ?.launchIn(scope) + ?.launchIn(viewScope) actionFab?.isVisible = true } @@ -263,6 +263,7 @@ open class IndexController : } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt index dd56920d2..f4fc01a1d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt @@ -22,9 +22,6 @@ import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.shrinkOnScroll -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import reactivecircus.flowbinding.android.view.clicks /** * Controller to manage the categories for the users' library. @@ -103,14 +100,13 @@ class CategoryController : actionFab = fab fab.setText(R.string.action_add) fab.setIconResource(R.drawable.ic_add_24dp) - fab.clicks() - .onEach { - CategoryCreateDialog(this@CategoryController).showDialog(router, null) - } - .launchIn(scope) + fab.setOnClickListener { + CategoryCreateDialog(this@CategoryController).showDialog(router, null) + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt index 25509bd78..6169ddfdb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt @@ -102,14 +102,13 @@ class BiometricTimesController : actionFab = fab fab.setText(R.string.action_add) fab.setIconResource(R.drawable.ic_add_24dp) - fab.clicks() - .onEach { - BiometricTimesCreateDialog(this@BiometricTimesController).showDialog(router, null) - } - .launchIn(scope) + fab.setOnClickListener { + BiometricTimesCreateDialog(this@BiometricTimesController).showDialog(router, null) + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt index b288e35aa..3a8f9a71a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt @@ -109,19 +109,18 @@ class SortTagController : actionFab = fab fab.setText(R.string.action_add) fab.setIconResource(R.drawable.ic_add_24dp) - fab.clicks() - .onEach { - if (!shownHelpDialog) { - shownHelpDialog = true - helpDialog(true) - } else { - SortTagCreateDialog(this@SortTagController).showDialog(router, null) - } + fab.setOnClickListener { + if (!shownHelpDialog) { + shownHelpDialog = true + helpDialog(true) + } else { + SortTagCreateDialog(this@SortTagController).showDialog(router, null) } - .launchIn(scope) + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoController.kt index d77a62183..d93f3b77d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoController.kt @@ -99,14 +99,13 @@ class RepoController : actionFab = fab fab.setText(R.string.action_add) fab.setIconResource(R.drawable.ic_add_24dp) - fab.clicks() - .onEach { - RepoCreateDialog(this@RepoController).showDialog(router, null) - } - .launchIn(scope) + fab.setOnClickListener { + RepoCreateDialog(this@RepoController).showDialog(router, null) + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryController.kt index 98002e27e..70d7453da 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryController.kt @@ -100,14 +100,13 @@ class SourceCategoryController : actionFab = fab fab.setText(R.string.action_add) fab.setIconResource(R.drawable.ic_add_24dp) - fab.clicks() - .onEach { - SourceCategoryCreateDialog(this@SourceCategoryController).showDialog(router, null) - } - .launchIn(scope) + fab.setOnClickListener { + SourceCategoryCreateDialog(this@SourceCategoryController).showDialog(router, null) + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt index 2622318b5..9768fda63 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt @@ -18,9 +18,6 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.base.controller.FabController import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.util.view.shrinkOnScroll -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import reactivecircus.flowbinding.android.view.clicks import rx.Observable import rx.Subscription import rx.android.schedulers.AndroidSchedulers @@ -104,23 +101,22 @@ class DownloadController : override fun configureFab(fab: ExtendedFloatingActionButton) { actionFab = fab - fab.clicks() - .onEach { - val context = applicationContext ?: return@onEach + fab.setOnClickListener { + val context = applicationContext ?: return@setOnClickListener - if (isRunning) { - DownloadService.stop(context) - presenter.pauseDownloads() - } else { - DownloadService.start(context) - } - - setInformationView() + if (isRunning) { + DownloadService.stop(context) + presenter.pauseDownloads() + } else { + DownloadService.start(context) } - .launchIn(scope) + + setInformationView() + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt index 72b70796b..bbf579420 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt @@ -42,7 +42,7 @@ class LibraryComfortableGridHolder( .onEach { playButtonClicked() } - .launchIn((adapter as LibraryCategoryAdapter).controller.scope) + .launchIn((adapter as LibraryCategoryAdapter).controller.viewScope) } // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt index edd0da1d8..fe7a82a93 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt @@ -41,7 +41,7 @@ class LibraryCompactGridHolder( .onEach { playButtonClicked() } - .launchIn((adapter as LibraryCategoryAdapter).controller.scope) + .launchIn((adapter as LibraryCategoryAdapter).controller.viewScope) } // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 572a465a9..e0b88a0ae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -200,13 +200,13 @@ class LibraryController( activeCategory = it updateTitle() } - .launchIn(scope) + .launchIn(viewScope) getColumnsPreferenceForCurrentOrientation().asImmediateFlow { mangaPerRow = it } .drop(1) // Set again the adapter to recalculate the covers height .onEach { reattachAdapter() } - .launchIn(scope) + .launchIn(viewScope) if (selectedMangas.isNotEmpty()) { createActionModeIfNeeded() @@ -234,7 +234,7 @@ class LibraryController( GlobalSearchController(query).withFadeTransaction() ) } - .launchIn(scope) + .launchIn(viewScope) (activity!! as MainActivity).fixViewToBottom(binding.actionToolbar) } @@ -249,6 +249,7 @@ class LibraryController( override fun onDestroyView(view: View) { destroyActionModeIfNeeded() + (activity!! as MainActivity).clearFixViewToBottom(binding.actionToolbar) binding.actionToolbar.destroy() adapter?.onDestroy() adapter = null @@ -445,7 +446,7 @@ class LibraryController( query = it.toString() performSearch() } - .launchIn(scope) + .launchIn(viewScope) } private fun performSearch() { @@ -693,7 +694,7 @@ class LibraryController( .onEach { updateSyncStatus(it) } - .launchIn(scope) + .launchIn(viewScope) // <-- EXH } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 6562b96ce..64f4b091f 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -73,6 +73,8 @@ class MainActivity : BaseViewBindingActivity() { private var isConfirmingExit: Boolean = false private var isHandlingShortcut: Boolean = false + private var fixedViewsToBottom = mutableMapOf() + // SY --> // Idle-until-urgent private var firstPaint = false @@ -466,12 +468,17 @@ class MainActivity : BaseViewBindingActivity() { * the collapsing AppBarLayout. */ fun fixViewToBottom(view: View) { - binding.appbar.addOnOffsetChangedListener( - AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> - val maxAbsOffset = appBarLayout.measuredHeight - binding.tabs.measuredHeight - view.translationY = -maxAbsOffset - verticalOffset.toFloat() - } - ) + val listener = AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + val maxAbsOffset = appBarLayout.measuredHeight - binding.tabs.measuredHeight + view.translationY = -maxAbsOffset - verticalOffset.toFloat() + } + binding.appbar.addOnOffsetChangedListener(listener) + fixedViewsToBottom[view] = listener + } + + fun clearFixViewToBottom(view: View) { + val listener = fixedViewsToBottom.remove(view) + binding.appbar.removeOnOffsetChangedListener(listener) } private fun setBottomNavBehaviorOnScroll() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt index 72beaadcf..5291d7ade 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt @@ -125,17 +125,17 @@ class EditMangaDialog : DialogController { binding.mangaGenresTags.clearFocus() binding.coverLayout.clicks() .onEach { infoController.changeCover() } - .launchIn(infoController.scope) + .launchIn(infoController.viewScope) binding.resetTags.clicks() .onEach { resetTags() } - .launchIn(infoController.scope) + .launchIn(infoController.viewScope) binding.resetCover.isVisible = !isLocal binding.resetCover.clicks() .onEach { binding.root.context.toast(R.string.cover_reset_toast) customCoverUri = null willResetCover = true - }.launchIn(infoController.scope) + }.launchIn(infoController.viewScope) } private fun resetTags() { @@ -203,7 +203,7 @@ class EditMangaDialog : DialogController { } .negativeButton(android.R.string.cancel) .show() - }.launchIn(infoController.scope) + }.launchIn(infoController.viewScope) } addView(addTagChip) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index c046dcf96..6c9e7acb6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -327,14 +327,14 @@ class MangaController : binding.recycler.scrollEvents() .onEach { updateToolbarTitleAlpha() } - .launchIn(scope) + .launchIn(viewScope) binding.swipeRefresh.refreshes() .onEach { fetchMangaInfoFromSource(manualFetch = true) fetchChaptersFromSource(manualFetch = true) } - .launchIn(scope) + .launchIn(viewScope) (activity!! as MainActivity).fixViewToBottom(binding.actionToolbar) @@ -351,7 +351,7 @@ class MangaController : // Replace self router?.replaceTopController(MangaController(redirect).withFadeTransaction()) } - .launchIn(scope) + .launchIn(viewScope) updateFilterIconState() } @@ -386,42 +386,42 @@ class MangaController : actionFab = fab fab.setText(R.string.action_start) fab.setIconResource(R.drawable.ic_play_arrow_24dp) - fab.clicks() - .onEach { - 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.setOnClickListener { + 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 - actionFab?.getCoordinates()?.let { coordinates -> - if (!binding.revealView.showRevealEffect( - coordinates.x, - coordinates.y, - revealAnimationListener - ) - ) { - openChapter(item.chapter) - } - } - } else { - view?.context?.toast(R.string.no_next_chapter) } + + // Get coordinates and start animation + actionFab?.getCoordinates()?.let { coordinates -> + if (!binding.revealView.showRevealEffect( + coordinates.x, + coordinates.y, + revealAnimationListener + ) + ) { + openChapter(item.chapter) + } + } + } else { + view?.context?.toast(R.string.no_next_chapter) } - .launchIn(scope) + } } override fun cleanupFab(fab: ExtendedFloatingActionButton) { + fab.setOnClickListener(null) actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) } actionFab = null } override fun onDestroyView(view: View) { destroyActionModeIfNeeded() + (activity!! as MainActivity).clearFixViewToBottom(binding.actionToolbar) binding.actionToolbar.destroy() mangaInfoAdapter = null chaptersHeaderAdapter = null @@ -926,7 +926,7 @@ class MangaController : start() } } - .launchIn(scope) + .launchIn(viewScope) } // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackController.kt index 69ad6fc60..0393fecad 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackController.kt @@ -78,7 +78,7 @@ class TrackController : binding.swipeRefresh.isEnabled = false binding.swipeRefresh.refreshes() .onEach { presenter.refresh() } - .launchIn(scope) + .launchIn(viewScope) } override fun onDestroyView(view: View) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt index bcbcf3c7d..c3238f369 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt @@ -77,7 +77,7 @@ class TrackSearchDialog : DialogController { .onEach { position -> selectedItem = adapter.getItem(position) } - .launchIn(trackController.scope) + .launchIn(trackController.viewScope) // Do an initial search based on the manga's title if (savedState == null) { @@ -99,7 +99,7 @@ class TrackSearchDialog : DialogController { .debounce(TimeUnit.SECONDS.toMillis(1)) .filter { it.isNotBlank() } .onEach { search(it.toString()) } - .launchIn(trackController.scope) + .launchIn(trackController.viewScope) } private fun search(query: String) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryController.kt index 57dd83159..2db2a53e5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/history/HistoryController.kt @@ -189,7 +189,7 @@ class HistoryController : query = it.toString() presenter.updateList(query) } - .launchIn(scope) + .launchIn(viewScope) // Fixes problem with the overflow icon showing up in lieu of search searchItem.fixExpand( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt index a72a77ad9..73960a235 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent/updates/UpdatesController.kt @@ -97,7 +97,7 @@ class UpdatesController : val firstPos = layoutManager.findFirstCompletelyVisibleItemPosition() binding.swipeRefresh.isEnabled = firstPos <= 0 } - .launchIn(scope) + .launchIn(viewScope) binding.swipeRefresh.setDistanceToTriggerSync((2 * 64 * view.resources.displayMetrics.density).toInt()) binding.swipeRefresh.refreshes() @@ -107,13 +107,14 @@ class UpdatesController : // It can be a very long operation, so we disable swipe refresh and show a toast. binding.swipeRefresh.isRefreshing = false } - .launchIn(scope) + .launchIn(viewScope) (activity!! as MainActivity).fixViewToBottom(binding.actionToolbar) } override fun onDestroyView(view: View) { destroyActionModeIfNeeded() + (activity!! as MainActivity).clearFixViewToBottom(binding.actionToolbar) binding.actionToolbar.destroy() adapter = null super.onDestroyView(view) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt index c88802a27..61c7bd36f 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt @@ -604,7 +604,7 @@ class SettingsEhController : SettingsController() { multiSelectListPreference { key = PreferenceKeys.eh_autoUpdateRestrictions titleRes = R.string.auto_update_restrictions - entriesRes = arrayOf(R.string.wifi, R.string.charging) + entriesRes = arrayOf(R.string.network_unmetered, R.string.charging) entryValues = arrayOf("wifi", "ac") summaryRes = R.string.pref_library_update_restriction_summary diff --git a/app/src/main/java/exh/ui/batchadd/BatchAddController.kt b/app/src/main/java/exh/ui/batchadd/BatchAddController.kt index eddb4f46f..260e80c5f 100755 --- a/app/src/main/java/exh/ui/batchadd/BatchAddController.kt +++ b/app/src/main/java/exh/ui/batchadd/BatchAddController.kt @@ -37,13 +37,13 @@ class BatchAddController : NucleusController