diff --git a/app/build.gradle b/app/build.gradle index baf6242f6..bd31d5785 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,7 +79,7 @@ afterEvaluate { } dependencies { //noinspection GradleDependency - implementation('com.github.KotatsuApp:kotatsu-parsers:9976ea5dfc') { + implementation('com.github.KotatsuApp:kotatsu-parsers:86a82970fc') { exclude group: 'org.json', module: 'json' } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt index 1cf6c2a79..965fa1db8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/LocalListFragment.kt @@ -10,6 +10,7 @@ import androidx.core.net.toUri import androidx.fragment.app.viewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar +import kotlinx.coroutines.flow.StateFlow import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.ui.list.ListSelectionController 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.withArgs 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.model.FilterHeaderModel +import org.koitharu.kotatsu.filter.ui.model.FilterItem 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.MangaTag import org.koitharu.kotatsu.remotelist.ui.RemoteListFragment -class LocalListFragment : MangaListFragment() { +class LocalListFragment : MangaListFragment(), FilterOwner { override val viewModel by viewModels() @@ -65,6 +71,24 @@ class LocalListFragment : MangaListFragment() { } } + override val filterItems: StateFlow> + get() = viewModel.filterItems + + override val header: StateFlow + get() = viewModel.header + + override fun applyFilter(tags: Set) { + 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, mode: ActionMode) { MaterialAlertDialogBuilder(context ?: return) .setTitle(R.string.delete_manga) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt index fed94e8c9..502afa0ee 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt @@ -10,20 +10,26 @@ import androidx.appcompat.widget.SearchView import androidx.core.view.MenuProvider import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.StateFlow import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.ui.list.ListSelectionController import org.koitharu.kotatsu.core.util.ext.addMenuProvider import org.koitharu.kotatsu.core.util.ext.withArgs 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.model.FilterHeaderModel +import org.koitharu.kotatsu.filter.ui.model.FilterItem 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.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.search.ui.SearchActivity import org.koitharu.kotatsu.settings.SettingsActivity @AndroidEntryPoint -class RemoteListFragment : MangaListFragment() { +class RemoteListFragment : MangaListFragment(), FilterOwner { override val viewModel by viewModels() @@ -49,6 +55,24 @@ class RemoteListFragment : MangaListFragment() { viewModel.resetFilter() } + override val filterItems: StateFlow> + get() = viewModel.filterItems + + override val header: StateFlow + get() = viewModel.header + + override fun applyFilter(tags: Set) { + 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 : MenuProvider, SearchView.OnQueryTextListener, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/search/ui/MangaListActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/search/ui/MangaListActivity.kt index d9ec0af60..84514d437 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/search/ui/MangaListActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/search/ui/MangaListActivity.kt @@ -26,7 +26,6 @@ import org.koitharu.kotatsu.databinding.ActivityMangaListBinding import org.koitharu.kotatsu.filter.ui.FilterHeaderFragment import org.koitharu.kotatsu.filter.ui.FilterOwner 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.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.parsers.model.MangaSource @@ -74,7 +73,10 @@ class MangaListActivity : private fun initList(source: MangaSource, tags: Set?) { 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 { setReorderingAllowed(true) val fragment = if (source == MangaSource.LOCAL) { @@ -83,17 +85,15 @@ class MangaListActivity : RemoteListFragment.newInstance(source) } replace(R.id.container, fragment) - runOnCommit { initFilter() } - if (!tags.isNullOrEmpty() && fragment is RemoteListFragment) { + runOnCommit { initFilter(fragment) } + if (!tags.isNullOrEmpty()) { runOnCommit(ApplyFilterRunnable(fragment, tags)) } } - } else { - initFilter() } } - private fun initFilter() { + private fun initFilter(filterOwner: FilterOwner) { if (viewBinding.containerFilter != null) { if (supportFragmentManager.findFragmentById(R.id.container_filter) == null) { supportFragmentManager.commit { @@ -109,7 +109,6 @@ class MangaListActivity : } } } - val filterOwner = FilterOwner.from(this) val chipSort = viewBinding.chipSort if (chipSort != null) { filterOwner.header.observe(this) { @@ -126,14 +125,12 @@ class MangaListActivity : } private class ApplyFilterRunnable( - private val fragment: MangaListFragment, + private val filterOwner: FilterOwner, private val tags: Set, ) : Runnable { override fun run() { - checkNotNull(FilterOwner.find(fragment)) { - "Cannot find FilterOwner" - }.applyFilter(tags) + filterOwner.applyFilter(tags) } }