From 4c1e6eeb25eeccdb60f78c1a72fdcb26ee349a2c Mon Sep 17 00:00:00 2001 From: Tiger Oakes Date: Thu, 30 Jul 2020 09:59:37 -0700 Subject: [PATCH] For #12887: Use ListAdapter to diff history --- .../fenix/library/LibrarySiteItemView.kt | 5 ++++ .../fenix/tabhistory/TabHistoryAdapter.kt | 25 +++++++++-------- .../fenix/tabhistory/TabHistoryView.kt | 12 ++++---- .../fenix/tabhistory/TabHistoryViewHolder.kt | 28 +++++++++++-------- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/LibrarySiteItemView.kt b/app/src/main/java/org/mozilla/fenix/library/LibrarySiteItemView.kt index 239b9036e..6c6b1915d 100644 --- a/app/src/main/java/org/mozilla/fenix/library/LibrarySiteItemView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/LibrarySiteItemView.kt @@ -67,6 +67,8 @@ class LibrarySiteItemView @JvmOverloads constructor( val overflowView: ImageButton get() = overflow_menu + private var iconUrl: String? = null + init { LayoutInflater.from(context).inflate(R.layout.library_site_item, this, true) @@ -94,6 +96,9 @@ class LibrarySiteItemView @JvmOverloads constructor( } fun loadFavicon(url: String) { + if (iconUrl == url) return + + iconUrl = url context.components.core.icons.loadIntoView(favicon, url) } diff --git a/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryAdapter.kt b/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryAdapter.kt index 433c620e1..d47519ea7 100644 --- a/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryAdapter.kt @@ -6,7 +6,8 @@ package org.mozilla.fenix.tabhistory import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import org.mozilla.fenix.R data class TabHistoryItem( @@ -18,23 +19,23 @@ data class TabHistoryItem( class TabHistoryAdapter( private val interactor: TabHistoryViewInteractor -) : RecyclerView.Adapter() { - - var historyList: List = emptyList() - set(value) { - field = value - notifyDataSetChanged() - } +) : ListAdapter(DiffCallback) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TabHistoryViewHolder { - val view = - LayoutInflater.from(parent.context).inflate(R.layout.history_list_item, parent, false) + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.history_list_item, parent, false) return TabHistoryViewHolder(view, interactor) } override fun onBindViewHolder(holder: TabHistoryViewHolder, position: Int) { - holder.bind(historyList[position]) + holder.bind(getItem(position)) } - override fun getItemCount(): Int = historyList.size + internal object DiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: TabHistoryItem, newItem: TabHistoryItem) = + oldItem.url == newItem.url + + override fun areContentsTheSame(oldItem: TabHistoryItem, newItem: TabHistoryItem) = + oldItem == newItem + } } diff --git a/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryView.kt b/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryView.kt index c02ba038d..cb87a40a5 100644 --- a/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryView.kt +++ b/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryView.kt @@ -24,19 +24,16 @@ interface TabHistoryViewInteractor { } class TabHistoryView( - private val container: ViewGroup, + container: ViewGroup, private val expandDialog: () -> Unit, interactor: TabHistoryViewInteractor ) : LayoutContainer { - override val containerView: View? - get() = container - - val view: View = LayoutInflater.from(container.context) + override val containerView: View = LayoutInflater.from(container.context) .inflate(R.layout.component_tabhistory, container, true) private val adapter = TabHistoryAdapter(interactor) - private val layoutManager = object : LinearLayoutManager(view.context) { + private val layoutManager = object : LinearLayoutManager(containerView.context) { override fun onLayoutCompleted(state: RecyclerView.State?) { super.onLayoutCompleted(state) currentIndex?.let { index -> @@ -60,6 +57,7 @@ class TabHistoryView( init { tabHistoryRecyclerView.adapter = adapter tabHistoryRecyclerView.layoutManager = layoutManager + tabHistoryRecyclerView.itemAnimator = null } fun updateState(state: BrowserState) { @@ -73,7 +71,7 @@ class TabHistoryView( isSelected = index == historyState.currentIndex ) } - adapter.historyList = items + adapter.submitList(items) } } } diff --git a/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolder.kt b/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolder.kt index 88bd26d55..1db9bdada 100644 --- a/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/tabhistory/TabHistoryViewHolder.kt @@ -7,28 +7,34 @@ package org.mozilla.fenix.tabhistory import android.view.View import androidx.core.text.bold import androidx.core.text.buildSpannedString -import androidx.core.view.isVisible -import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.history_list_item.view.* +import kotlinx.android.synthetic.main.history_list_item.* +import org.mozilla.fenix.library.LibrarySiteItemView +import org.mozilla.fenix.utils.view.ViewHolder class TabHistoryViewHolder( - private val view: View, + view: View, private val interactor: TabHistoryViewInteractor -) : RecyclerView.ViewHolder(view) { +) : ViewHolder(view) { + + private lateinit var item: TabHistoryItem + + init { + itemView.setOnClickListener { interactor.goToHistoryItem(item) } + } fun bind(item: TabHistoryItem) { - view.history_layout.overflowView.isVisible = false - view.history_layout.urlView.text = item.url - view.history_layout.loadFavicon(item.url) + this.item = item - view.history_layout.titleView.text = if (item.isSelected) { + history_layout.displayAs(LibrarySiteItemView.ItemType.SITE) + history_layout.urlView.text = item.url + history_layout.loadFavicon(item.url) + + history_layout.titleView.text = if (item.isSelected) { buildSpannedString { bold { append(item.title) } } } else { item.title } - - view.setOnClickListener { interactor.goToHistoryItem(item) } } }