Fix filter lifecycle
This commit is contained in:
@@ -79,7 +79,7 @@ afterEvaluate {
|
|||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
//noinspection GradleDependency
|
//noinspection GradleDependency
|
||||||
implementation('com.github.KotatsuApp:kotatsu-parsers:9976ea5dfc') {
|
implementation('com.github.KotatsuApp:kotatsu-parsers:86a82970fc') {
|
||||||
exclude group: 'org.json', module: 'json'
|
exclude group: 'org.json', module: 'json'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import androidx.core.net.toUri
|
|||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.core.ui.list.ListSelectionController
|
import org.koitharu.kotatsu.core.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.core.util.ShareHelper
|
import org.koitharu.kotatsu.core.util.ShareHelper
|
||||||
@@ -17,12 +18,17 @@ import org.koitharu.kotatsu.core.util.ext.addMenuProvider
|
|||||||
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
||||||
import org.koitharu.kotatsu.core.util.ext.withArgs
|
import org.koitharu.kotatsu.core.util.ext.withArgs
|
||||||
import org.koitharu.kotatsu.databinding.FragmentListBinding
|
import org.koitharu.kotatsu.databinding.FragmentListBinding
|
||||||
|
import org.koitharu.kotatsu.filter.ui.FilterOwner
|
||||||
import org.koitharu.kotatsu.filter.ui.FilterSheetFragment
|
import org.koitharu.kotatsu.filter.ui.FilterSheetFragment
|
||||||
|
import org.koitharu.kotatsu.filter.ui.model.FilterHeaderModel
|
||||||
|
import org.koitharu.kotatsu.filter.ui.model.FilterItem
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||||
import org.koitharu.kotatsu.remotelist.ui.RemoteListFragment
|
import org.koitharu.kotatsu.remotelist.ui.RemoteListFragment
|
||||||
|
|
||||||
class LocalListFragment : MangaListFragment() {
|
class LocalListFragment : MangaListFragment(), FilterOwner {
|
||||||
|
|
||||||
override val viewModel by viewModels<LocalListViewModel>()
|
override val viewModel by viewModels<LocalListViewModel>()
|
||||||
|
|
||||||
@@ -65,6 +71,24 @@ class LocalListFragment : MangaListFragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val filterItems: StateFlow<List<ListModel>>
|
||||||
|
get() = viewModel.filterItems
|
||||||
|
|
||||||
|
override val header: StateFlow<FilterHeaderModel>
|
||||||
|
get() = viewModel.header
|
||||||
|
|
||||||
|
override fun applyFilter(tags: Set<MangaTag>) {
|
||||||
|
viewModel.applyFilter(tags)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSortItemClick(item: FilterItem.Sort) {
|
||||||
|
viewModel.onSortItemClick(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTagItemClick(item: FilterItem.Tag) {
|
||||||
|
viewModel.onTagItemClick(item)
|
||||||
|
}
|
||||||
|
|
||||||
private fun showDeletionConfirm(ids: Set<Long>, mode: ActionMode) {
|
private fun showDeletionConfirm(ids: Set<Long>, mode: ActionMode) {
|
||||||
MaterialAlertDialogBuilder(context ?: return)
|
MaterialAlertDialogBuilder(context ?: return)
|
||||||
.setTitle(R.string.delete_manga)
|
.setTitle(R.string.delete_manga)
|
||||||
|
|||||||
@@ -10,20 +10,26 @@ import androidx.appcompat.widget.SearchView
|
|||||||
import androidx.core.view.MenuProvider
|
import androidx.core.view.MenuProvider
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.core.ui.list.ListSelectionController
|
import org.koitharu.kotatsu.core.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.core.util.ext.addMenuProvider
|
import org.koitharu.kotatsu.core.util.ext.addMenuProvider
|
||||||
import org.koitharu.kotatsu.core.util.ext.withArgs
|
import org.koitharu.kotatsu.core.util.ext.withArgs
|
||||||
import org.koitharu.kotatsu.databinding.FragmentListBinding
|
import org.koitharu.kotatsu.databinding.FragmentListBinding
|
||||||
|
import org.koitharu.kotatsu.filter.ui.FilterOwner
|
||||||
import org.koitharu.kotatsu.filter.ui.FilterSheetFragment
|
import org.koitharu.kotatsu.filter.ui.FilterSheetFragment
|
||||||
|
import org.koitharu.kotatsu.filter.ui.model.FilterHeaderModel
|
||||||
|
import org.koitharu.kotatsu.filter.ui.model.FilterItem
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
import org.koitharu.kotatsu.main.ui.owners.AppBarOwner
|
import org.koitharu.kotatsu.main.ui.owners.AppBarOwner
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||||
import org.koitharu.kotatsu.search.ui.SearchActivity
|
import org.koitharu.kotatsu.search.ui.SearchActivity
|
||||||
import org.koitharu.kotatsu.settings.SettingsActivity
|
import org.koitharu.kotatsu.settings.SettingsActivity
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class RemoteListFragment : MangaListFragment() {
|
class RemoteListFragment : MangaListFragment(), FilterOwner {
|
||||||
|
|
||||||
override val viewModel by viewModels<RemoteListViewModel>()
|
override val viewModel by viewModels<RemoteListViewModel>()
|
||||||
|
|
||||||
@@ -49,6 +55,24 @@ class RemoteListFragment : MangaListFragment() {
|
|||||||
viewModel.resetFilter()
|
viewModel.resetFilter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val filterItems: StateFlow<List<ListModel>>
|
||||||
|
get() = viewModel.filterItems
|
||||||
|
|
||||||
|
override val header: StateFlow<FilterHeaderModel>
|
||||||
|
get() = viewModel.header
|
||||||
|
|
||||||
|
override fun applyFilter(tags: Set<MangaTag>) {
|
||||||
|
viewModel.applyFilter(tags)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSortItemClick(item: FilterItem.Sort) {
|
||||||
|
viewModel.onSortItemClick(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTagItemClick(item: FilterItem.Tag) {
|
||||||
|
viewModel.onTagItemClick(item)
|
||||||
|
}
|
||||||
|
|
||||||
private inner class RemoteListMenuProvider :
|
private inner class RemoteListMenuProvider :
|
||||||
MenuProvider,
|
MenuProvider,
|
||||||
SearchView.OnQueryTextListener,
|
SearchView.OnQueryTextListener,
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import org.koitharu.kotatsu.databinding.ActivityMangaListBinding
|
|||||||
import org.koitharu.kotatsu.filter.ui.FilterHeaderFragment
|
import org.koitharu.kotatsu.filter.ui.FilterHeaderFragment
|
||||||
import org.koitharu.kotatsu.filter.ui.FilterOwner
|
import org.koitharu.kotatsu.filter.ui.FilterOwner
|
||||||
import org.koitharu.kotatsu.filter.ui.FilterSheetFragment
|
import org.koitharu.kotatsu.filter.ui.FilterSheetFragment
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
|
||||||
import org.koitharu.kotatsu.local.ui.LocalListFragment
|
import org.koitharu.kotatsu.local.ui.LocalListFragment
|
||||||
import org.koitharu.kotatsu.main.ui.owners.AppBarOwner
|
import org.koitharu.kotatsu.main.ui.owners.AppBarOwner
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
@@ -74,7 +73,10 @@ class MangaListActivity :
|
|||||||
|
|
||||||
private fun initList(source: MangaSource, tags: Set<MangaTag>?) {
|
private fun initList(source: MangaSource, tags: Set<MangaTag>?) {
|
||||||
val fm = supportFragmentManager
|
val fm = supportFragmentManager
|
||||||
if (fm.findFragmentById(R.id.container) == null) {
|
val existingFragment = fm.findFragmentById(R.id.container)
|
||||||
|
if (existingFragment is FilterOwner) {
|
||||||
|
initFilter(existingFragment)
|
||||||
|
} else {
|
||||||
fm.commit {
|
fm.commit {
|
||||||
setReorderingAllowed(true)
|
setReorderingAllowed(true)
|
||||||
val fragment = if (source == MangaSource.LOCAL) {
|
val fragment = if (source == MangaSource.LOCAL) {
|
||||||
@@ -83,17 +85,15 @@ class MangaListActivity :
|
|||||||
RemoteListFragment.newInstance(source)
|
RemoteListFragment.newInstance(source)
|
||||||
}
|
}
|
||||||
replace(R.id.container, fragment)
|
replace(R.id.container, fragment)
|
||||||
runOnCommit { initFilter() }
|
runOnCommit { initFilter(fragment) }
|
||||||
if (!tags.isNullOrEmpty() && fragment is RemoteListFragment) {
|
if (!tags.isNullOrEmpty()) {
|
||||||
runOnCommit(ApplyFilterRunnable(fragment, tags))
|
runOnCommit(ApplyFilterRunnable(fragment, tags))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
initFilter()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initFilter() {
|
private fun initFilter(filterOwner: FilterOwner) {
|
||||||
if (viewBinding.containerFilter != null) {
|
if (viewBinding.containerFilter != null) {
|
||||||
if (supportFragmentManager.findFragmentById(R.id.container_filter) == null) {
|
if (supportFragmentManager.findFragmentById(R.id.container_filter) == null) {
|
||||||
supportFragmentManager.commit {
|
supportFragmentManager.commit {
|
||||||
@@ -109,7 +109,6 @@ class MangaListActivity :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val filterOwner = FilterOwner.from(this)
|
|
||||||
val chipSort = viewBinding.chipSort
|
val chipSort = viewBinding.chipSort
|
||||||
if (chipSort != null) {
|
if (chipSort != null) {
|
||||||
filterOwner.header.observe(this) {
|
filterOwner.header.observe(this) {
|
||||||
@@ -126,14 +125,12 @@ class MangaListActivity :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ApplyFilterRunnable(
|
private class ApplyFilterRunnable(
|
||||||
private val fragment: MangaListFragment,
|
private val filterOwner: FilterOwner,
|
||||||
private val tags: Set<MangaTag>,
|
private val tags: Set<MangaTag>,
|
||||||
) : Runnable {
|
) : Runnable {
|
||||||
|
|
||||||
override fun run() {
|
override fun run() {
|
||||||
checkNotNull(FilterOwner.find(fragment)) {
|
filterOwner.applyFilter(tags)
|
||||||
"Cannot find FilterOwner"
|
|
||||||
}.applyFilter(tags)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user