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
parent
b1db1cf976
commit
1ad9da09b0
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue