From 3dcfed376140565a7995b222df648086d29cc41c Mon Sep 17 00:00:00 2001 From: Amaan Marfatia Date: Fri, 20 Mar 2020 12:03:45 -0400 Subject: [PATCH] AboutPageAdapter doesn't use notifyDataSetChanged() We make the AboutPageAdapter inherit from a ListAdapter so that we don't use notifyDataSetChanged(). --- .../fenix/settings/about/AboutFragment.kt | 2 +- .../fenix/settings/about/AboutPageAdapter.kt | 34 +++++++++---------- .../settings/about/AboutPageAdapterTest.kt | 20 ++--------- 3 files changed, 21 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt index 4109e3f95..66cda3490 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/about/AboutFragment.kt @@ -64,7 +64,7 @@ class AboutFragment : Fragment(), AboutPageListener { } populateAboutHeader() - aboutPageAdapter.updateData(populateAboutList()) + aboutPageAdapter.submitList(populateAboutList()) } private fun populateAboutHeader() { diff --git a/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt b/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt index 3e38e04ac..e4b418dd7 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/about/AboutPageAdapter.kt @@ -6,33 +6,33 @@ package org.mozilla.fenix.settings.about import android.view.LayoutInflater import android.view.ViewGroup -import androidx.annotation.VisibleForTesting -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import org.mozilla.fenix.settings.about.viewholders.AboutItemViewHolder -class AboutPageAdapter(private val listener: AboutPageListener) : RecyclerView.Adapter() { - - @VisibleForTesting - var aboutList: List? = null - - fun updateData(items: List) { - this.aboutList = items - notifyDataSetChanged() - } +class AboutPageAdapter(private val listener: AboutPageListener) : + ListAdapter(DiffCallback) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AboutItemViewHolder { val view = LayoutInflater.from(parent.context) .inflate(AboutItemViewHolder.LAYOUT_ID, parent, false) - return AboutItemViewHolder(view, listener) } - override fun getItemCount(): Int = aboutList?.size ?: 0 - override fun onBindViewHolder(holder: AboutItemViewHolder, position: Int) { - (aboutList?.get(position) as AboutPageItem.Item).also { - holder.bind(it) - } + holder.bind(getItem(position) as AboutPageItem.Item) + } + + private object DiffCallback : DiffUtil.ItemCallback() { + + override fun areItemsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) = + oldItem === newItem + + override fun areContentsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) = + when (oldItem) { + is AboutPageItem.Item -> + newItem is AboutPageItem.Item && oldItem.title == newItem.title + } } } diff --git a/app/src/test/java/org/mozilla/fenix/settings/about/AboutPageAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/settings/about/AboutPageAdapterTest.kt index fa693550e..a15c2a494 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/about/AboutPageAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/about/AboutPageAdapterTest.kt @@ -38,20 +38,6 @@ class AboutPageAdapterTest { ) private val listener: AboutPageListener = mockk(relaxed = true) - @Test - fun `updateData should set the new data and call notifyDataSetChanged()`() { - val adapter = spyk(AboutPageAdapter(listener), recordPrivateCalls = true) - every { adapter.notifyDataSetChanged() } just Runs - - adapter.updateData(aboutList) - - // Wasn't able to test in verify block the 'adapter.aboutList' setter from the updateData method - assertThat(adapter.aboutList).isEqualTo(aboutList) - verify { - adapter.notifyDataSetChanged() - } - } - @Test fun `getItemCount on a default instantiated Adapter should return 0`() { val adapter = AboutPageAdapter(listener) @@ -63,7 +49,7 @@ class AboutPageAdapterTest { fun `getItemCount after updateData() call should return the correct list size`() { val adapter = AboutPageAdapter(listener) - adapter.updateData(aboutList) + adapter.submitList(aboutList) assertThat(adapter.itemCount).isEqualTo(2) } @@ -93,9 +79,9 @@ class AboutPageAdapterTest { } returns viewHolder every { viewHolder.bind(any()) } just Runs - adapter.updateData(aboutList) + adapter.submitList(aboutList) adapter.bindViewHolder(viewHolder, 1) - verify { viewHolder.bind(adapter.aboutList?.get(1) as AboutPageItem.Item) } + verify { viewHolder.bind(aboutList[1] as AboutPageItem.Item) } } }