From 7ce36f25cee42e3c627af6e7c3f62234cbea1dd6 Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Sat, 20 Jun 2020 16:53:09 -0400 Subject: [PATCH] Saved searches internal improvements, lag is now fixed --- .../source/browse/SavedSearchesHolder.kt | 32 +++++++++++++ .../browse/source/browse/SavedSearchesItem.kt | 43 +++++++++++++++++ .../browse/source/browse/SourceFilterSheet.kt | 44 ++++++++---------- .../main/res/layout/source_filter_sheet.xml | 46 ++----------------- .../source_filter_sheet_saved_searches.xml | 27 +++++++++++ 5 files changed, 126 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesHolder.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesItem.kt create mode 100644 app/src/main/res/layout/source_filter_sheet_saved_searches.xml diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesHolder.kt new file mode 100644 index 000000000..aeeaad923 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesHolder.kt @@ -0,0 +1,32 @@ +package eu.kanade.tachiyomi.ui.browse.source.browse + +import android.view.View +import com.google.android.material.chip.Chip +import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.kanade.tachiyomi.databinding.SourceFilterSheetSavedSearchesBinding +import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import eu.kanade.tachiyomi.util.view.gone +import eu.kanade.tachiyomi.util.view.visible +import timber.log.Timber + +class SavedSearchesHolder( + view: View, + adapter: FlexibleAdapter +) : BaseFlexibleViewHolder(view, adapter) { + + var binding: SourceFilterSheetSavedSearchesBinding = SourceFilterSheetSavedSearchesBinding.bind(itemView) + + fun setChips(chips: List = emptyList()) { + Timber.d("Chips set") + binding.savedSearches.removeAllViews() + if (chips.isEmpty()) { + binding.savedSearchesTitle.gone() + } else { + binding.savedSearchesTitle.visible() + } + chips.forEach { + Timber.d(it.text.toString()) + binding.savedSearches.addView(it) + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesItem.kt new file mode 100644 index 000000000..65cf7f251 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SavedSearchesItem.kt @@ -0,0 +1,43 @@ +package eu.kanade.tachiyomi.ui.browse.source.browse + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import eu.davidea.flexibleadapter.items.IFlexible +import eu.kanade.tachiyomi.R + +class SavedSearchesItem : + AbstractFlexibleItem() { + + override fun getLayoutRes(): Int { + return R.layout.source_filter_sheet_saved_searches + } + + override fun isSelectable(): Boolean { + return false + } + + override fun isSwipeable(): Boolean { + return false + } + + override fun createViewHolder(view: View, adapter: FlexibleAdapter>): SavedSearchesHolder { + return SavedSearchesHolder(view, adapter as FlexibleAdapter) + } + + override fun bindViewHolder( + adapter: FlexibleAdapter>, + holder: SavedSearchesHolder, + position: Int, + payloads: MutableList? + ) {} + + override fun equals(other: Any?): Boolean { + return (this === other) + } + + override fun hashCode(): Int { + return this.hashCode() + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterSheet.kt index bd1b76ff7..3fe4167e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterSheet.kt @@ -3,9 +3,9 @@ package eu.kanade.tachiyomi.ui.browse.source.browse import android.app.Activity import android.content.Context import android.util.AttributeSet -import android.util.TypedValue import android.view.View import android.view.ViewGroup +import androidx.recyclerview.widget.MergeAdapter import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.chip.Chip import eu.davidea.flexibleadapter.FlexibleAdapter @@ -13,14 +13,11 @@ import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.inflate -import eu.kanade.tachiyomi.util.view.visible import eu.kanade.tachiyomi.widget.SimpleNavigationView import exh.EXHSavedSearch import kotlinx.android.synthetic.main.source_filter_sheet.view.filter_btn import kotlinx.android.synthetic.main.source_filter_sheet.view.reset_btn import kotlinx.android.synthetic.main.source_filter_sheet.view.save_search_btn -import kotlinx.android.synthetic.main.source_filter_sheet.view.saved_searches -import kotlinx.android.synthetic.main.source_filter_sheet.view.saved_searches_title class SourceFilterSheet( activity: Activity, @@ -71,28 +68,31 @@ class SourceFilterSheet( class FilterNavigationView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : SimpleNavigationView(context, attrs) { - // EXH --> + var onFilterClicked = {} + var onResetClicked = {} + + // SY --> var onSaveClicked = {} var onSavedSearchClicked: (Int) -> Unit = {} var onSavedSearchDeleteClicked: (Int, String) -> Unit = { _, _ -> } - // EXH <-- - var onFilterClicked = {} - var onResetClicked = {} + var savedSearchesItem = SavedSearchesItem() + var savedSearchesAdapter: FlexibleAdapter = FlexibleAdapter(listOf(savedSearchesItem)) + // SY <-- val adapter: FlexibleAdapter> = FlexibleAdapter>(null) .setDisplayHeadersAtStartUp(true) .setStickyHeaders(true) init { - recycler.adapter = adapter + // SY --> + recycler.adapter = MergeAdapter(savedSearchesAdapter, adapter) + // SY <-- recycler.setHasFixedSize(true) val view = inflate(R.layout.source_filter_sheet) - // SY --> - ((view as ViewGroup).findViewById(R.id.source_filter_content) as ViewGroup).addView(recycler) - // SY <-- + ((view as ViewGroup).getChildAt(1) as ViewGroup).addView(recycler) addView(view) // SY --> save_search_btn.setOnClickListener { onSaveClicked() } @@ -103,20 +103,10 @@ class SourceFilterSheet( // EXH --> fun setSavedSearches(searches: List) { - saved_searches.removeAllViews() - - val outValue = TypedValue() - context.theme.resolveAttribute(android.R.attr.selectableItemBackground, outValue, true) - save_search_btn.visibility = if (searches.size < MAX_SAVED_SEARCHES) View.VISIBLE else View.GONE + val chips: MutableList = mutableListOf() - if (searches.isEmpty()) { - saved_searches_title.gone() - } else { - saved_searches_title.visible() - } - - searches.withIndex().sortedBy { it.value.name }.forEach { (index, search) -> + searches.withIndex().sortedBy { it.value.name.toLowerCase() }.forEach { (index, search) -> val chip = Chip(context).apply { text = search.name setOnClickListener { onSavedSearchClicked(index) } @@ -125,7 +115,11 @@ class SourceFilterSheet( } } - saved_searches.addView(chip) + chips += chip + } + savedSearchesAdapter.recyclerView.post { + (recycler.findViewHolderForAdapterPosition(0) as? SavedSearchesHolder)?.setChips(chips) + savedSearchesAdapter.expand(0) } } diff --git a/app/src/main/res/layout/source_filter_sheet.xml b/app/src/main/res/layout/source_filter_sheet.xml index eabb90347..4081c59f9 100644 --- a/app/src/main/res/layout/source_filter_sheet.xml +++ b/app/src/main/res/layout/source_filter_sheet.xml @@ -1,7 +1,6 @@ @@ -65,46 +64,11 @@ - - - - - - - - - - - - - - + android:layout_height="0dp" + android:layout_gravity="top" + android:layout_weight="1" + android:paddingBottom="8dp" /> diff --git a/app/src/main/res/layout/source_filter_sheet_saved_searches.xml b/app/src/main/res/layout/source_filter_sheet_saved_searches.xml new file mode 100644 index 000000000..6cd0254ba --- /dev/null +++ b/app/src/main/res/layout/source_filter_sheet_saved_searches.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file