From 602a5eb2abe60610025bb59d619070b7c0d8d397 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 8 Jul 2022 14:57:53 +0300 Subject: [PATCH] Update manga list header --- .../kotatsu/base/ui/widgets/ChipsView.kt | 34 ++++++++--- .../kotatsu/details/ui/DetailsFragment.kt | 2 + .../kotatsu/list/ui/MangaListFragment.kt | 4 +- .../kotatsu/list/ui/MangaListViewModel.kt | 2 +- .../list/ui/adapter/CurrentFilterAD.kt | 23 -------- .../kotatsu/list/ui/adapter/ListHeader2AD.kt | 36 ++++++++++++ .../list/ui/adapter/MangaListAdapter.kt | 6 +- .../list/ui/adapter/MangaListListener.kt | 4 +- .../list/ui/filter/FilterCoordinator.kt | 6 -- .../{CurrentFilterModel.kt => ListHeader2.kt} | 4 +- .../kotatsu/remotelist/RemoteListModule.kt | 1 + .../remotelist/ui/RemoteListViewModel.kt | 57 +++++++++++++------ .../kotatsu/search/ui/MangaListActivity.kt | 13 ++--- .../search/ui/multi/MultiSearchActivity.kt | 2 +- .../suggestion/SearchSuggestionViewModel.kt | 4 +- .../kotatsu/tracker/ui/FeedFragment.kt | 4 +- .../koitharu/kotatsu/utils/ext/OtherExt.kt | 11 ++++ .../main/res/layout/item_current_filter.xml | 8 --- app/src/main/res/layout/item_header_2.xml | 47 +++++++++++++++ 19 files changed, 187 insertions(+), 81 deletions(-) delete mode 100644 app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/CurrentFilterAD.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt rename app/src/main/java/org/koitharu/kotatsu/list/ui/model/{CurrentFilterModel.kt => ListHeader2.kt} (55%) create mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/ext/OtherExt.kt delete mode 100644 app/src/main/res/layout/item_current_filter.xml create mode 100644 app/src/main/res/layout/item_header_2.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt index c20b615cf..73e42259e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt @@ -9,6 +9,7 @@ import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipGroup import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.utils.ext.castOrNull class ChipsView @JvmOverloads constructor( context: Context, @@ -18,10 +19,10 @@ class ChipsView @JvmOverloads constructor( private var isLayoutSuppressedCompat = false private var isLayoutCalledOnSuppressed = false - private var chipOnClickListener = OnClickListener { + private val chipOnClickListener = OnClickListener { onChipClickListener?.onChipClick(it as Chip, it.tag) } - private var chipOnCloseListener = OnClickListener { + private val chipOnCloseListener = OnClickListener { onChipCloseClickListener?.onChipCloseClick(it as Chip, it.tag) } var onChipClickListener: OnChipClickListener? = null @@ -60,15 +61,27 @@ class ChipsView @JvmOverloads constructor( } } + fun getCheckedData(cls: Class): Set { + val result = LinkedHashSet(childCount) + for (child in children) { + if (child is Chip && child.isChecked) { + result += cls.castOrNull(child.tag) ?: continue + } + } + return result + } + private fun bindChip(chip: Chip, model: ChipModel) { chip.text = model.title if (model.icon == 0) { chip.isChipIconVisible = false } else { - chip.isCheckedIconVisible = true + chip.isChipIconVisible = true chip.setChipIconResource(model.icon) } - chip.isClickable = onChipClickListener != null + chip.isClickable = onChipClickListener != null || model.isCheckable + chip.isCheckable = model.isCheckable + chip.isChecked = model.isChecked chip.tag = model.data } @@ -76,11 +89,12 @@ class ChipsView @JvmOverloads constructor( val chip = Chip(context) val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_Kotatsu_Chip) chip.setChipDrawable(drawable) + chip.isCheckedIconVisible = true + chip.setCheckedIconResource(R.drawable.ic_check) chip.isCloseIconVisible = onChipCloseClickListener != null chip.setOnCloseIconClickListener(chipOnCloseListener) chip.setEnsureMinTouchTargetSize(false) chip.setOnClickListener(chipOnClickListener) - chip.isCheckable = false addView(chip) return chip } @@ -98,7 +112,9 @@ class ChipsView @JvmOverloads constructor( class ChipModel( @DrawableRes val icon: Int, val title: CharSequence, - val data: Any? = null + val isCheckable: Boolean, + val isChecked: Boolean, + val data: Any? = null, ) { override fun equals(other: Any?): Boolean { @@ -109,6 +125,8 @@ class ChipsView @JvmOverloads constructor( if (icon != other.icon) return false if (title != other.title) return false + if (isCheckable != other.isCheckable) return false + if (isChecked != other.isChecked) return false if (data != other.data) return false return true @@ -117,7 +135,9 @@ class ChipsView @JvmOverloads constructor( override fun hashCode(): Int { var result = icon result = 31 * result + title.hashCode() - result = 31 * result + data.hashCode() + result = 31 * result + isCheckable.hashCode() + result = 31 * result + isChecked.hashCode() + result = 31 * result + (data?.hashCode() ?: 0) return result } } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index d997f1f4e..e6f74daa6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -341,6 +341,8 @@ class DetailsFragment : title = tag.title, icon = 0, data = tag, + isCheckable = false, + isChecked = false, ) } ) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index aa1e88f10..282ecaa7e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -193,8 +193,8 @@ abstract class MangaListFragment : resolveException(error) } - override fun onTagRemoveClick(tag: MangaTag) { - viewModel.onRemoveFilterTag(tag) + override fun onUpdateFilter(tags: Set) { + viewModel.onUpdateFilter(tags) } private fun onGridScaleChanged(scale: Float) { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt index 6adc8c0d2..a254efc44 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt @@ -25,7 +25,7 @@ abstract class MangaListViewModel( valueProducer = { gridSize / 100f }, ) - open fun onRemoveFilterTag(tag: MangaTag) = Unit + open fun onUpdateFilter(tags: Set) = Unit protected fun createListModeFlow() = settings.observeAsFlow(AppSettings.KEY_LIST_MODE) { listMode } .onEach { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/CurrentFilterAD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/CurrentFilterAD.kt deleted file mode 100644 index c13fd3cfa..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/CurrentFilterAD.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.koitharu.kotatsu.list.ui.adapter - -import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegate -import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.base.ui.widgets.ChipsView -import org.koitharu.kotatsu.list.ui.model.CurrentFilterModel -import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.parsers.model.MangaTag - -fun currentFilterAD( - listener: MangaListListener, -) = adapterDelegate(R.layout.item_current_filter) { - - val chipGroup = itemView as ChipsView - - chipGroup.onChipCloseClickListener = ChipsView.OnChipCloseClickListener { _, data -> - listener.onTagRemoveClick(data as? MangaTag ?: return@OnChipCloseClickListener) - } - - bind { - chipGroup.setChips(item.chips) - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt new file mode 100644 index 000000000..068ad74bc --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/ListHeader2AD.kt @@ -0,0 +1,36 @@ +package org.koitharu.kotatsu.list.ui.adapter + +import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding +import org.koitharu.kotatsu.core.ui.titleRes +import org.koitharu.kotatsu.databinding.ItemHeader2Binding +import org.koitharu.kotatsu.list.ui.model.ListHeader2 +import org.koitharu.kotatsu.list.ui.model.ListModel +import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.utils.ext.setTextAndVisible + +fun listHeader2AD( + listener: MangaListListener, +) = adapterDelegateViewBinding( + { layoutInflater, parent -> ItemHeader2Binding.inflate(layoutInflater, parent, false) } +) { + + var ignoreChecking = false + binding.textViewFilter.setOnClickListener { + listener.onFilterClick() + } + binding.chipsTags.setOnCheckedStateChangeListener { _, _ -> + if (!ignoreChecking) { + listener.onUpdateFilter(binding.chipsTags.getCheckedData(MangaTag::class.java)) + } + } + + bind { payloads -> + if (payloads.isNotEmpty()) { + binding.scrollView.smoothScrollTo(0, 0) + } + ignoreChecking = true + binding.chipsTags.setChips(item.chips) + ignoreChecking = false + binding.textViewFilter.setTextAndVisible(item.sortOrder?.titleRes ?: 0) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt index 6b69445c5..db4594911 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt @@ -26,7 +26,7 @@ class MangaListAdapter( .addDelegate(ITEM_TYPE_ERROR_FOOTER, errorFooterAD(listener)) .addDelegate(ITEM_TYPE_EMPTY, emptyStateListAD(listener)) .addDelegate(ITEM_TYPE_HEADER, listHeaderAD()) - .addDelegate(ITEM_TYPE_FILTER, currentFilterAD(listener)) + .addDelegate(ITEM_TYPE_HEADER_2, listHeader2AD(listener)) .addDelegate(ITEM_TYPE_HEADER_FILTER, listHeaderWithFilterAD(listener)) } @@ -62,7 +62,7 @@ class MangaListAdapter( Unit } } - is CurrentFilterModel -> Unit + is ListHeader2 -> Unit else -> super.getChangePayload(oldItem, newItem) } } @@ -80,7 +80,7 @@ class MangaListAdapter( const val ITEM_TYPE_ERROR_FOOTER = 7 const val ITEM_TYPE_EMPTY = 8 const val ITEM_TYPE_HEADER = 9 - const val ITEM_TYPE_FILTER = 10 + const val ITEM_TYPE_HEADER_2 = 10 const val ITEM_TYPE_HEADER_FILTER = 11 val PAYLOAD_PROGRESS = Any() diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt index c515ef7ec..ece5efc5b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListListener.kt @@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.MangaTag interface MangaListListener : OnListItemClickListener, ListStateHolderListener { - fun onTagRemoveClick(tag: MangaTag) - + fun onUpdateFilter(tags: Set) + fun onFilterClick() } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt index 5ea361168..d01cac4f1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/filter/FilterCoordinator.kt @@ -56,12 +56,6 @@ class FilterCoordinator( fun observeState() = currentState.asStateFlow() - fun removeTag(tag: MangaTag) { - currentState.update { oldValue -> - FilterState(oldValue.sortOrder, oldValue.tags - tag) - } - } - fun setTags(tags: Set) { currentState.update { oldValue -> FilterState(oldValue.sortOrder, tags) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/CurrentFilterModel.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader2.kt similarity index 55% rename from app/src/main/java/org/koitharu/kotatsu/list/ui/model/CurrentFilterModel.kt rename to app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader2.kt index 32cebb25c..95fc79c4e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/model/CurrentFilterModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/model/ListHeader2.kt @@ -1,7 +1,9 @@ package org.koitharu.kotatsu.list.ui.model import org.koitharu.kotatsu.base.ui.widgets.ChipsView +import org.koitharu.kotatsu.parsers.model.SortOrder -data class CurrentFilterModel( +data class ListHeader2( val chips: Collection, + val sortOrder: SortOrder?, ) : ListModel \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt index 7f36562b9..c6b81174a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt @@ -14,6 +14,7 @@ val remoteListModule repository = MangaRepository(params[0]) as RemoteMangaRepository, settings = get(), dataRepository = get(), + searchRepository = get(), ) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt index 092194b96..cdaac9e12 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt @@ -19,13 +19,16 @@ import org.koitharu.kotatsu.list.ui.filter.OnFilterChangedListener import org.koitharu.kotatsu.list.ui.model.* import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import java.util.* -private const val FILTER_MIN_INTERVAL = 750L +private const val FILTER_MIN_INTERVAL = 250L class RemoteListViewModel( private val repository: RemoteMangaRepository, + private val searchRepository: MangaSearchRepository, settings: AppSettings, dataRepository: MangaDataRepository, ) : MangaListViewModel(settings), OnFilterChangedListener { @@ -46,9 +49,8 @@ class RemoteListViewModel( listError, hasNextPage, ) { list, mode, filterState, error, hasNext -> - buildList(list?.size?.plus(3) ?: 3) { - add(ListHeader(repository.source.title, 0, filterState.sortOrder)) - createFilterModel(filterState)?.let { add(it) } + buildList(list?.size?.plus(2) ?: 2) { + add(ListHeader2(createChipsList(filterState), filterState.sortOrder)) when { list.isNullOrEmpty() && error != null -> add(error.toErrorState(canRetry = true)) list == null -> add(LoadingState) @@ -88,10 +90,6 @@ class RemoteListViewModel( loadList(filter.snapshot(), append = !mangaList.value.isNullOrEmpty()) } - override fun onRemoveFilterTag(tag: MangaTag) { - filter.removeTag(tag) - } - override fun onSortItemClick(item: FilterItem.Sort) { filter.onSortItemClick(item) } @@ -110,6 +108,10 @@ class RemoteListViewModel( fun resetFilter() = filter.reset() + override fun onUpdateFilter(tags: Set) { + applyFilter(tags) + } + fun applyFilter(tags: Set) { filter.setTags(tags) } @@ -142,18 +144,41 @@ class RemoteListViewModel( } } - private fun createFilterModel(filterState: FilterState): CurrentFilterModel? { - return if (filterState.tags.isEmpty()) { - null - } else { - CurrentFilterModel(filterState.tags.map { ChipsView.ChipModel(0, it.title, it) }) - } - } - private fun createEmptyState(filterState: FilterState) = EmptyState( icon = R.drawable.ic_empty_search, textPrimary = R.string.nothing_found, textSecondary = 0, actionStringRes = if (filterState.tags.isEmpty()) 0 else R.string.reset_filter, ) + + private suspend fun createChipsList(filterState: FilterState): List { + val selectedTags = filterState.tags.toMutableSet() + val tags = searchRepository.getTagsSuggestion("", 6, repository.source) + val result = LinkedList() + for (tag in tags) { + val model = ChipsView.ChipModel( + icon = 0, + title = tag.title, + isCheckable = true, + isChecked = selectedTags.remove(tag), + data = tag, + ) + if (model.isChecked) { + result.addFirst(model) + } else { + result.addLast(model) + } + } + for (tag in selectedTags) { + val model = ChipsView.ChipModel( + icon = 0, + title = tag.title, + isCheckable = true, + isChecked = true, + data = tag, + ) + result.addFirst(model) + } + return result + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt index d01e19ea6..43859bb68 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/MangaListActivity.kt @@ -3,9 +3,7 @@ package org.koitharu.kotatsu.search.ui import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.ViewGroup import androidx.core.graphics.Insets -import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.commit @@ -28,13 +26,14 @@ class MangaListActivity : BaseActivity() { setContentView(ActivityContainerBinding.inflate(layoutInflater)) val tags = intent.getParcelableExtra(EXTRA_TAGS)?.tags supportActionBar?.setDisplayHomeAsUpEnabled(true) + val source = intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: tags?.firstOrNull()?.source + if (source == null) { + finishAfterTransition() + return + } + title = source.title val fm = supportFragmentManager if (fm.findFragmentById(R.id.container) == null) { - val source = intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: tags?.firstOrNull()?.source - if (source == null) { - finishAfterTransition() - return - } fm.commit { val fragment = if (source == MangaSource.LOCAL) { LocalListFragment.newInstance() diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt index a94949202..c4bec6cb5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/multi/MultiSearchActivity.kt @@ -103,7 +103,7 @@ class MultiSearchActivity : BaseActivity(), MangaLis viewModel.doSearch(viewModel.query.value.orEmpty()) } - override fun onTagRemoveClick(tag: MangaTag) = Unit + override fun onUpdateFilter(tags: Set) = Unit override fun onFilterClick() = Unit diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt index 184b3e746..ed9ec5baf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt @@ -47,7 +47,7 @@ class SearchSuggestionViewModel( setupSuggestion() } } - + fun onSourceToggle(source: MangaSource, isEnabled: Boolean) { settings.hiddenSources = if (isEnabled) { settings.hiddenSources - source.name @@ -113,6 +113,8 @@ class SearchSuggestionViewModel( icon = 0, title = tag.title, data = tag, + isCheckable = false, + isChecked = false, ) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt index 34622c0ab..ca0678a0d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt @@ -17,14 +17,12 @@ import org.koitharu.kotatsu.databinding.FragmentFeedBinding import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.list.ui.adapter.MangaListListener import org.koitharu.kotatsu.list.ui.model.ListModel -import org.koitharu.kotatsu.main.ui.AppBarOwner import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.tracker.ui.adapter.FeedAdapter import org.koitharu.kotatsu.tracker.work.TrackWorker import org.koitharu.kotatsu.utils.ext.addMenuProvider import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.measureHeight class FeedFragment : BaseFragment(), @@ -84,7 +82,7 @@ class FeedFragment : override fun onRetryClick(error: Throwable) = Unit - override fun onTagRemoveClick(tag: MangaTag) = Unit + override fun onUpdateFilter(tags: Set) = Unit override fun onFilterClick() = Unit diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/OtherExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/OtherExt.kt new file mode 100644 index 000000000..9671f9d60 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/OtherExt.kt @@ -0,0 +1,11 @@ +package org.koitharu.kotatsu.utils.ext + +import android.icu.lang.UCharacter.GraphemeClusterBreak.T + +@Suppress("UNCHECKED_CAST") +fun Class.castOrNull(obj: Any?): T? { + if (obj == null || !isInstance(obj)) { + return null + } + return obj as T +} \ No newline at end of file diff --git a/app/src/main/res/layout/item_current_filter.xml b/app/src/main/res/layout/item_current_filter.xml deleted file mode 100644 index e15cdcc80..000000000 --- a/app/src/main/res/layout/item_current_filter.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_header_2.xml b/app/src/main/res/layout/item_header_2.xml new file mode 100644 index 000000000..75f8acb8d --- /dev/null +++ b/app/src/main/res/layout/item_header_2.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + \ No newline at end of file