1
0
Fork 0

Remove selection holder from bookmark viewholder constructors.

Now that we're passing the mode to the viewholders in their bind
methods, there's no real need to pass them into their constructors. This
also allows us to remove the indirection of having the adapter implement
the SelectionHolder interface and have the mode implement it directly.
master
Kainalu Hagiwara 2020-08-06 12:22:53 -07:00 committed by Jeff Boek
parent b1db1cf976
commit 1ad9da09b0
6 changed files with 21 additions and 33 deletions

View File

@ -16,18 +16,16 @@ import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.concept.storage.BookmarkNodeType import mozilla.components.concept.storage.BookmarkNodeType
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.library.LibrarySiteItemView import org.mozilla.fenix.library.LibrarySiteItemView
import org.mozilla.fenix.library.SelectionHolder
import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkFolderViewHolder import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkFolderViewHolder
import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkItemViewHolder import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkItemViewHolder
import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkNodeViewHolder import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkNodeViewHolder
import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkSeparatorViewHolder import org.mozilla.fenix.library.bookmarks.viewholders.BookmarkSeparatorViewHolder
class BookmarkAdapter(val emptyView: View, val interactor: BookmarkViewInteractor) : class BookmarkAdapter(private val emptyView: View, private val interactor: BookmarkViewInteractor) :
RecyclerView.Adapter<BookmarkNodeViewHolder>(), SelectionHolder<BookmarkNode> { RecyclerView.Adapter<BookmarkNodeViewHolder>() {
private var tree: List<BookmarkNode> = listOf() private var tree: List<BookmarkNode> = listOf()
private var mode: BookmarkFragmentState.Mode = BookmarkFragmentState.Mode.Normal() private var mode: BookmarkFragmentState.Mode = BookmarkFragmentState.Mode.Normal()
override val selectedItems: Set<BookmarkNode> get() = mode.selectedItems
private var isFirstRun = true private var isFirstRun = true
fun updateData(tree: BookmarkNode?, mode: BookmarkFragmentState.Mode) { fun updateData(tree: BookmarkNode?, mode: BookmarkFragmentState.Mode) {
@ -85,8 +83,8 @@ class BookmarkAdapter(val emptyView: View, val interactor: BookmarkViewInteracto
.inflate(R.layout.bookmark_list_item, parent, false) as LibrarySiteItemView .inflate(R.layout.bookmark_list_item, parent, false) as LibrarySiteItemView
return when (viewType) { return when (viewType) {
LibrarySiteItemView.ItemType.SITE.ordinal -> BookmarkItemViewHolder(view, interactor, this) LibrarySiteItemView.ItemType.SITE.ordinal -> BookmarkItemViewHolder(view, interactor)
LibrarySiteItemView.ItemType.FOLDER.ordinal -> BookmarkFolderViewHolder(view, interactor, this) LibrarySiteItemView.ItemType.FOLDER.ordinal -> BookmarkFolderViewHolder(view, interactor)
LibrarySiteItemView.ItemType.SEPARATOR.ordinal -> BookmarkSeparatorViewHolder(view, interactor) LibrarySiteItemView.ItemType.SEPARATOR.ordinal -> BookmarkSeparatorViewHolder(view, interactor)
else -> throw IllegalStateException("ViewType $viewType does not match to a ViewHolder") else -> throw IllegalStateException("ViewType $viewType does not match to a ViewHolder")
} }

View File

@ -9,6 +9,7 @@ import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.lib.state.Action import mozilla.components.lib.state.Action
import mozilla.components.lib.state.State import mozilla.components.lib.state.State
import mozilla.components.lib.state.Store import mozilla.components.lib.state.Store
import org.mozilla.fenix.library.SelectionHolder
class BookmarkFragmentStore( class BookmarkFragmentStore(
initialState: BookmarkFragmentState initialState: BookmarkFragmentState
@ -32,8 +33,8 @@ data class BookmarkFragmentState(
val isLoading: Boolean = true, val isLoading: Boolean = true,
val isSwipeToRefreshEnabled: Boolean = true val isSwipeToRefreshEnabled: Boolean = true
) : State { ) : State {
sealed class Mode { sealed class Mode : SelectionHolder<BookmarkNode> {
open val selectedItems = emptySet<BookmarkNode>() override val selectedItems = emptySet<BookmarkNode>()
data class Normal(val showMenu: Boolean = true) : Mode() data class Normal(val showMenu: Boolean = true) : Mode()
data class Selecting(override val selectedItems: Set<BookmarkNode>) : Mode() data class Selecting(override val selectedItems: Set<BookmarkNode>) : Mode()

View File

@ -12,7 +12,6 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.ext.hideAndDisable import org.mozilla.fenix.ext.hideAndDisable
import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.ext.showAndEnable
import org.mozilla.fenix.library.LibrarySiteItemView import org.mozilla.fenix.library.LibrarySiteItemView
import org.mozilla.fenix.library.SelectionHolder
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState
import org.mozilla.fenix.library.bookmarks.BookmarkPayload import org.mozilla.fenix.library.bookmarks.BookmarkPayload
import org.mozilla.fenix.library.bookmarks.BookmarkViewInteractor import org.mozilla.fenix.library.bookmarks.BookmarkViewInteractor
@ -23,8 +22,7 @@ import org.mozilla.fenix.library.bookmarks.inRoots
*/ */
class BookmarkFolderViewHolder( class BookmarkFolderViewHolder(
view: LibrarySiteItemView, view: LibrarySiteItemView,
interactor: BookmarkViewInteractor, interactor: BookmarkViewInteractor
private val selectionHolder: SelectionHolder<BookmarkNode>
) : BookmarkNodeViewHolder(view, interactor) { ) : BookmarkNodeViewHolder(view, interactor) {
override var item: BookmarkNode? = null override var item: BookmarkNode? = null
@ -43,7 +41,7 @@ class BookmarkFolderViewHolder(
override fun bind(item: BookmarkNode, mode: BookmarkFragmentState.Mode, payload: BookmarkPayload) { override fun bind(item: BookmarkNode, mode: BookmarkFragmentState.Mode, payload: BookmarkPayload) {
this.item = item this.item = item
setSelectionListeners(item, selectionHolder) setSelectionListeners(item, mode)
if (!item.inRoots()) { if (!item.inRoots()) {
setupMenu(item) setupMenu(item)
@ -59,7 +57,7 @@ class BookmarkFolderViewHolder(
} }
if (payload.selectedChanged) { if (payload.selectedChanged) {
containerView.changeSelected(item in selectionHolder.selectedItems) containerView.changeSelected(item in mode.selectedItems)
} }
containerView.iconView.setImageDrawable( containerView.iconView.setImageDrawable(

View File

@ -9,7 +9,6 @@ import mozilla.components.concept.storage.BookmarkNode
import org.mozilla.fenix.ext.hideAndDisable import org.mozilla.fenix.ext.hideAndDisable
import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.ext.showAndEnable
import org.mozilla.fenix.library.LibrarySiteItemView import org.mozilla.fenix.library.LibrarySiteItemView
import org.mozilla.fenix.library.SelectionHolder
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState
import org.mozilla.fenix.library.bookmarks.BookmarkPayload import org.mozilla.fenix.library.bookmarks.BookmarkPayload
import org.mozilla.fenix.library.bookmarks.BookmarkViewInteractor import org.mozilla.fenix.library.bookmarks.BookmarkViewInteractor
@ -19,8 +18,7 @@ import org.mozilla.fenix.library.bookmarks.BookmarkViewInteractor
*/ */
class BookmarkItemViewHolder( class BookmarkItemViewHolder(
view: LibrarySiteItemView, view: LibrarySiteItemView,
interactor: BookmarkViewInteractor, interactor: BookmarkViewInteractor
private val selectionHolder: SelectionHolder<BookmarkNode>
) : BookmarkNodeViewHolder(view, interactor) { ) : BookmarkNodeViewHolder(view, interactor) {
override var item: BookmarkNode? = null override var item: BookmarkNode? = null
@ -50,7 +48,7 @@ class BookmarkItemViewHolder(
} }
if (payload.selectedChanged) { if (payload.selectedChanged) {
containerView.changeSelected(item in selectionHolder.selectedItems) containerView.changeSelected(item in mode.selectedItems)
} }
if (payload.titleChanged) { if (payload.titleChanged) {
@ -64,7 +62,7 @@ class BookmarkItemViewHolder(
setColorsAndIcons(item.url) setColorsAndIcons(item.url)
} }
setSelectionListeners(item, selectionHolder) setSelectionListeners(item, mode)
} }
@VisibleForTesting @VisibleForTesting

View File

@ -18,7 +18,6 @@ import org.junit.Test
import org.mozilla.fenix.ext.hideAndDisable import org.mozilla.fenix.ext.hideAndDisable
import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.ext.showAndEnable
import org.mozilla.fenix.library.LibrarySiteItemView import org.mozilla.fenix.library.LibrarySiteItemView
import org.mozilla.fenix.library.SelectionHolder
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentInteractor import org.mozilla.fenix.library.bookmarks.BookmarkFragmentInteractor
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState
import org.mozilla.fenix.library.bookmarks.BookmarkPayload import org.mozilla.fenix.library.bookmarks.BookmarkPayload
@ -29,8 +28,6 @@ class BookmarkFolderViewHolderTest {
private lateinit var interactor: BookmarkFragmentInteractor private lateinit var interactor: BookmarkFragmentInteractor
@MockK(relaxed = true) @MockK(relaxed = true)
private lateinit var siteItemView: LibrarySiteItemView private lateinit var siteItemView: LibrarySiteItemView
@MockK(relaxed = true)
private lateinit var selectionHolder: SelectionHolder<BookmarkNode>
private lateinit var holder: BookmarkFolderViewHolder private lateinit var holder: BookmarkFolderViewHolder
private val folder = BookmarkNode( private val folder = BookmarkNode(
@ -50,7 +47,7 @@ class BookmarkFolderViewHolderTest {
mockkStatic(AppCompatResources::class) mockkStatic(AppCompatResources::class)
every { AppCompatResources.getDrawable(any(), any()) } returns mockk(relaxed = true) every { AppCompatResources.getDrawable(any(), any()) } returns mockk(relaxed = true)
holder = BookmarkFolderViewHolder(siteItemView, interactor, selectionHolder) holder = BookmarkFolderViewHolder(siteItemView, interactor)
} }
@Test @Test
@ -63,7 +60,6 @@ class BookmarkFolderViewHolderTest {
siteItemView.changeSelected(false) siteItemView.changeSelected(false)
} }
every { selectionHolder.selectedItems } returns setOf(folder)
holder.bind(folder, BookmarkFragmentState.Mode.Selecting(setOf(folder))) holder.bind(folder, BookmarkFragmentState.Mode.Selecting(setOf(folder)))
verify { verify {

View File

@ -5,7 +5,6 @@
package org.mozilla.fenix.library.bookmarks.viewholders package org.mozilla.fenix.library.bookmarks.viewholders
import io.mockk.MockKAnnotations import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.MockK
import io.mockk.verify import io.mockk.verify
import mozilla.components.concept.storage.BookmarkNode import mozilla.components.concept.storage.BookmarkNode
@ -15,7 +14,6 @@ import org.junit.Test
import org.mozilla.fenix.ext.hideAndDisable import org.mozilla.fenix.ext.hideAndDisable
import org.mozilla.fenix.ext.showAndEnable import org.mozilla.fenix.ext.showAndEnable
import org.mozilla.fenix.library.LibrarySiteItemView import org.mozilla.fenix.library.LibrarySiteItemView
import org.mozilla.fenix.library.SelectionHolder
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentInteractor import org.mozilla.fenix.library.bookmarks.BookmarkFragmentInteractor
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState
import org.mozilla.fenix.library.bookmarks.BookmarkPayload import org.mozilla.fenix.library.bookmarks.BookmarkPayload
@ -28,8 +26,6 @@ class BookmarkItemViewHolderTest {
@MockK(relaxed = true) @MockK(relaxed = true)
private lateinit var siteItemView: LibrarySiteItemView private lateinit var siteItemView: LibrarySiteItemView
@MockK(relaxed = true)
private lateinit var selectionHolder: SelectionHolder<BookmarkNode>
private lateinit var holder: BookmarkItemViewHolder private lateinit var holder: BookmarkItemViewHolder
private val item = BookmarkNode( private val item = BookmarkNode(
@ -45,15 +41,16 @@ class BookmarkItemViewHolderTest {
@Before @Before
fun setup() { fun setup() {
MockKAnnotations.init(this) MockKAnnotations.init(this)
holder = BookmarkItemViewHolder(siteItemView, interactor, selectionHolder) holder = BookmarkItemViewHolder(siteItemView, interactor)
} }
@Test @Test
fun `binds views for unselected item`() { fun `binds views for unselected item`() {
holder.bind(item, BookmarkFragmentState.Mode.Normal()) val mode = BookmarkFragmentState.Mode.Normal()
holder.bind(item, mode)
verify { verify {
siteItemView.setSelectionInteractor(item, selectionHolder, interactor) siteItemView.setSelectionInteractor(item, mode, interactor)
siteItemView.titleView.text = item.title siteItemView.titleView.text = item.title
siteItemView.urlView.text = item.url siteItemView.urlView.text = item.url
siteItemView.overflowView.showAndEnable() siteItemView.overflowView.showAndEnable()
@ -64,11 +61,11 @@ class BookmarkItemViewHolderTest {
@Test @Test
fun `binds views for selected item`() { fun `binds views for selected item`() {
every { selectionHolder.selectedItems } returns setOf(item) val mode = BookmarkFragmentState.Mode.Selecting(setOf(item))
holder.bind(item, BookmarkFragmentState.Mode.Selecting(setOf(item))) holder.bind(item, mode)
verify { verify {
siteItemView.setSelectionInteractor(item, selectionHolder, interactor) siteItemView.setSelectionInteractor(item, mode, interactor)
siteItemView.titleView.text = item.title siteItemView.titleView.text = item.title
siteItemView.urlView.text = item.url siteItemView.urlView.text = item.url
siteItemView.overflowView.hideAndDisable() siteItemView.overflowView.hideAndDisable()