From 15d887e41ff32dc480bd3b9c372622ce2666a5b5 Mon Sep 17 00:00:00 2001 From: Colin Lee Date: Mon, 8 Jul 2019 14:00:25 -0500 Subject: [PATCH] For #2251 - Add bookmark adapter diffutil (#3936) * For #2251 - Add bookmark adapter diffutil * For #2251 - Fix unit tests for bookmark adapter diffutil --- .../library/bookmarks/BookmarkAdapter.kt | 36 ++++++++++++++++++- .../library/bookmarks/BookmarkAdapterTest.kt | 14 +++++--- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt index beed60065..424f33fe5 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapter.kt @@ -9,6 +9,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import io.reactivex.Observer import kotlinx.android.extensions.LayoutContainer @@ -39,13 +40,46 @@ class BookmarkAdapter(val emptyView: View, val actionEmitter: Observer, + val new: List, + val oldMode: BookmarkState.Mode, + val newMode: BookmarkState.Mode + ) : DiffUtil.Callback() { + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = + old[oldItemPosition].guid == new[newItemPosition].guid + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + val oldSelected = (oldMode as? BookmarkState.Mode.Selecting)?.selectedItems ?: setOf() + val newSelected = (newMode as? BookmarkState.Mode.Selecting)?.selectedItems ?: setOf() + val modesEqual = oldMode::class == newMode::class + val selectedEqual = + ((oldSelected.contains(old[oldItemPosition]) && newSelected.contains(new[newItemPosition])) || + (!oldSelected.contains(old[oldItemPosition]) && !newSelected.contains(new[newItemPosition]))) + return modesEqual && selectedEqual + } + + override fun getOldListSize(): Int = old.size + override fun getNewListSize(): Int = new.size } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BookmarkNodeViewHolder { diff --git a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt index 6d7c43e55..3b1686669 100644 --- a/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt +++ b/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkAdapterTest.kt @@ -9,6 +9,7 @@ import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.spyk +import io.mockk.verifyOrder import io.mockk.verifySequence import io.reactivex.Observer import io.reactivex.observers.TestObserver @@ -16,8 +17,14 @@ import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNodeType import org.junit.Before import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.TestApplication import org.mozilla.fenix.TestUtils.setRxSchedulers +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +@RunWith(RobolectricTestRunner::class) +@Config(application = TestApplication::class) internal class BookmarkAdapterTest { private lateinit var bookmarkAdapter: BookmarkAdapter @@ -26,7 +33,7 @@ internal class BookmarkAdapterTest { @Before fun setup() { setRxSchedulers() - emitter = TestObserver() + emitter = TestObserver() bookmarkAdapter = spyk( BookmarkAdapter(mockk(), emitter), recordPrivateCalls = true ) @@ -51,11 +58,11 @@ internal class BookmarkAdapterTest { ) ) bookmarkAdapter.updateData(tree, BookmarkState.Mode.Normal) - verifySequence { + verifyOrder { bookmarkAdapter.updateData(tree, BookmarkState.Mode.Normal) bookmarkAdapter setProperty "tree" value tree.children bookmarkAdapter setProperty "mode" value BookmarkState.Mode.Normal - bookmarkAdapter.notifyDataSetChanged() + bookmarkAdapter.notifyItemRangeInserted(0, 3) } } @@ -66,7 +73,6 @@ internal class BookmarkAdapterTest { bookmarkAdapter.updateData(null, BookmarkState.Mode.Normal) bookmarkAdapter setProperty "tree" value listOf() bookmarkAdapter setProperty "mode" value BookmarkState.Mode.Normal - bookmarkAdapter.notifyDataSetChanged() } } }