Hide add folder option when in Desktop Bookmarks folder
parent
31f2e80ab0
commit
b9656a978e
|
@ -25,7 +25,7 @@ class BookmarkAdapter(val emptyView: View, val interactor: BookmarkViewInteracto
|
||||||
RecyclerView.Adapter<BookmarkNodeViewHolder>(), SelectionHolder<BookmarkNode> {
|
RecyclerView.Adapter<BookmarkNodeViewHolder>(), SelectionHolder<BookmarkNode> {
|
||||||
|
|
||||||
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
|
override val selectedItems: Set<BookmarkNode> get() = mode.selectedItems
|
||||||
private var isFirstRun = true
|
private var isFirstRun = true
|
||||||
|
|
||||||
|
|
|
@ -154,8 +154,10 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
when (val mode = bookmarkStore.state.mode) {
|
when (val mode = bookmarkStore.state.mode) {
|
||||||
BookmarkFragmentState.Mode.Normal -> {
|
is BookmarkFragmentState.Mode.Normal -> {
|
||||||
inflater.inflate(R.menu.bookmarks_menu, menu)
|
if (mode.showMenu) {
|
||||||
|
inflater.inflate(R.menu.bookmarks_menu, menu)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is BookmarkFragmentState.Mode.Selecting -> {
|
is BookmarkFragmentState.Mode.Selecting -> {
|
||||||
if (mode.selectedItems.any { it.type != BookmarkNodeType.ITEM }) {
|
if (mode.selectedItems.any { it.type != BookmarkNodeType.ITEM }) {
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
package org.mozilla.fenix.library.bookmarks
|
package org.mozilla.fenix.library.bookmarks
|
||||||
|
|
||||||
|
import mozilla.appservices.places.BookmarkRoot
|
||||||
import mozilla.components.concept.storage.BookmarkNode
|
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
|
||||||
|
@ -22,13 +23,13 @@ class BookmarkFragmentStore(
|
||||||
*/
|
*/
|
||||||
data class BookmarkFragmentState(
|
data class BookmarkFragmentState(
|
||||||
val tree: BookmarkNode?,
|
val tree: BookmarkNode?,
|
||||||
val mode: Mode = Mode.Normal,
|
val mode: Mode = Mode.Normal(),
|
||||||
val isLoading: Boolean = true
|
val isLoading: Boolean = true
|
||||||
) : State {
|
) : State {
|
||||||
sealed class Mode {
|
sealed class Mode {
|
||||||
open val selectedItems = emptySet<BookmarkNode>()
|
open val selectedItems = emptySet<BookmarkNode>()
|
||||||
|
|
||||||
object Normal : 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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,8 +59,10 @@ private fun bookmarkFragmentStateReducer(
|
||||||
val items = state.mode.selectedItems.filter { it in action.tree }
|
val items = state.mode.selectedItems.filter { it in action.tree }
|
||||||
state.copy(
|
state.copy(
|
||||||
tree = action.tree,
|
tree = action.tree,
|
||||||
mode = if (items.isEmpty()) {
|
mode = if (BookmarkRoot.Root.id == action.tree.guid) {
|
||||||
BookmarkFragmentState.Mode.Normal
|
BookmarkFragmentState.Mode.Normal(false)
|
||||||
|
} else if (items.isEmpty()) {
|
||||||
|
BookmarkFragmentState.Mode.Normal()
|
||||||
} else {
|
} else {
|
||||||
BookmarkFragmentState.Mode.Selecting(items.toSet())
|
BookmarkFragmentState.Mode.Selecting(items.toSet())
|
||||||
},
|
},
|
||||||
|
@ -72,14 +75,14 @@ private fun bookmarkFragmentStateReducer(
|
||||||
val items = state.mode.selectedItems - action.item
|
val items = state.mode.selectedItems - action.item
|
||||||
state.copy(
|
state.copy(
|
||||||
mode = if (items.isEmpty()) {
|
mode = if (items.isEmpty()) {
|
||||||
BookmarkFragmentState.Mode.Normal
|
BookmarkFragmentState.Mode.Normal()
|
||||||
} else {
|
} else {
|
||||||
BookmarkFragmentState.Mode.Selecting(items)
|
BookmarkFragmentState.Mode.Selecting(items)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
BookmarkFragmentAction.DeselectAll ->
|
BookmarkFragmentAction.DeselectAll ->
|
||||||
state.copy(mode = BookmarkFragmentState.Mode.Normal)
|
state.copy(mode = BookmarkFragmentState.Mode.Normal())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ class BookmarkView(
|
||||||
val view: View = LayoutInflater.from(container.context)
|
val view: View = LayoutInflater.from(container.context)
|
||||||
.inflate(R.layout.component_bookmark, container, true)
|
.inflate(R.layout.component_bookmark, container, true)
|
||||||
|
|
||||||
private var mode: BookmarkFragmentState.Mode = BookmarkFragmentState.Mode.Normal
|
private var mode: BookmarkFragmentState.Mode = BookmarkFragmentState.Mode.Normal()
|
||||||
private var tree: BookmarkNode? = null
|
private var tree: BookmarkNode? = null
|
||||||
private var canGoBack = false
|
private var canGoBack = false
|
||||||
|
|
||||||
|
|
|
@ -46,12 +46,12 @@ internal class BookmarkAdapterTest {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
bookmarkAdapter.updateData(tree, BookmarkFragmentState.Mode.Normal)
|
bookmarkAdapter.updateData(tree, BookmarkFragmentState.Mode.Normal())
|
||||||
bookmarkAdapter.updateData(null, BookmarkFragmentState.Mode.Normal)
|
bookmarkAdapter.updateData(null, BookmarkFragmentState.Mode.Normal())
|
||||||
verifyOrder {
|
verifyOrder {
|
||||||
bookmarkAdapter.updateData(tree, BookmarkFragmentState.Mode.Normal)
|
bookmarkAdapter.updateData(tree, BookmarkFragmentState.Mode.Normal())
|
||||||
bookmarkAdapter.notifyItemRangeInserted(0, 3)
|
bookmarkAdapter.notifyItemRangeInserted(0, 3)
|
||||||
bookmarkAdapter.updateData(null, BookmarkFragmentState.Mode.Normal)
|
bookmarkAdapter.updateData(null, BookmarkFragmentState.Mode.Normal())
|
||||||
bookmarkAdapter.notifyItemRangeRemoved(0, 3)
|
bookmarkAdapter.notifyItemRangeRemoved(0, 3)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ class BookmarkFragmentInteractorTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `switch between bookmark selection modes`() {
|
fun `switch between bookmark selection modes`() {
|
||||||
interactor.onSelectionModeSwitch(BookmarkFragmentState.Mode.Normal)
|
interactor.onSelectionModeSwitch(BookmarkFragmentState.Mode.Normal())
|
||||||
|
|
||||||
verify {
|
verify {
|
||||||
bookmarkController.handleSelectionModeSwitch()
|
bookmarkController.handleSelectionModeSwitch()
|
||||||
|
|
|
@ -21,7 +21,7 @@ class BookmarkFragmentStoreTest {
|
||||||
val initialState = BookmarkFragmentState(null)
|
val initialState = BookmarkFragmentState(null)
|
||||||
val store = BookmarkFragmentStore(initialState)
|
val store = BookmarkFragmentStore(initialState)
|
||||||
|
|
||||||
assertThat(BookmarkFragmentState(null, BookmarkFragmentState.Mode.Normal)).isEqualTo(store.state)
|
assertThat(BookmarkFragmentState(null, BookmarkFragmentState.Mode.Normal())).isEqualTo(store.state)
|
||||||
|
|
||||||
store.dispatch(BookmarkFragmentAction.Change(tree)).join()
|
store.dispatch(BookmarkFragmentAction.Change(tree)).join()
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ class BookmarkFragmentStoreTest {
|
||||||
val initialState = BookmarkFragmentState(tree)
|
val initialState = BookmarkFragmentState(tree)
|
||||||
val store = BookmarkFragmentStore(initialState)
|
val store = BookmarkFragmentStore(initialState)
|
||||||
|
|
||||||
assertThat(BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal)).isEqualTo(store.state)
|
assertThat(BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal())).isEqualTo(store.state)
|
||||||
|
|
||||||
store.dispatch(BookmarkFragmentAction.Change(newTree)).join()
|
store.dispatch(BookmarkFragmentAction.Change(newTree)).join()
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ class BookmarkFragmentStoreTest {
|
||||||
val initialState = BookmarkFragmentState(tree)
|
val initialState = BookmarkFragmentState(tree)
|
||||||
val store = BookmarkFragmentStore(initialState)
|
val store = BookmarkFragmentStore(initialState)
|
||||||
|
|
||||||
assertThat(BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal)).isEqualTo(store.state)
|
assertThat(BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal())).isEqualTo(store.state)
|
||||||
|
|
||||||
store.dispatch(BookmarkFragmentAction.Change(tree)).join()
|
store.dispatch(BookmarkFragmentAction.Change(tree)).join()
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ class BookmarkFragmentStoreTest {
|
||||||
|
|
||||||
store.dispatch(BookmarkFragmentAction.Deselect(childItem)).join()
|
store.dispatch(BookmarkFragmentAction.Deselect(childItem)).join()
|
||||||
|
|
||||||
assertThat(BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal)).isEqualTo(store.state)
|
assertThat(BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal())).isEqualTo(store.state)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -102,7 +102,7 @@ class BookmarkFragmentStoreTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `deselecting while not in selecting mode does nothing`() = runBlocking {
|
fun `deselecting while not in selecting mode does nothing`() = runBlocking {
|
||||||
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal)
|
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal())
|
||||||
val store = BookmarkFragmentStore(initialState)
|
val store = BookmarkFragmentStore(initialState)
|
||||||
|
|
||||||
store.dispatch(BookmarkFragmentAction.Deselect(item)).join()
|
store.dispatch(BookmarkFragmentAction.Deselect(item)).join()
|
||||||
|
@ -117,12 +117,12 @@ class BookmarkFragmentStoreTest {
|
||||||
|
|
||||||
store.dispatch(BookmarkFragmentAction.DeselectAll).join()
|
store.dispatch(BookmarkFragmentAction.DeselectAll).join()
|
||||||
|
|
||||||
assertThat(initialState.copy(mode = BookmarkFragmentState.Mode.Normal)).isEqualTo(store.state)
|
assertThat(initialState.copy(mode = BookmarkFragmentState.Mode.Normal())).isEqualTo(store.state)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `deselect all bookmarks when none are selected`() = runBlocking {
|
fun `deselect all bookmarks when none are selected`() = runBlocking {
|
||||||
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal)
|
val initialState = BookmarkFragmentState(tree, BookmarkFragmentState.Mode.Normal())
|
||||||
val store = BookmarkFragmentStore(initialState)
|
val store = BookmarkFragmentStore(initialState)
|
||||||
|
|
||||||
store.dispatch(BookmarkFragmentAction.DeselectAll)
|
store.dispatch(BookmarkFragmentAction.DeselectAll)
|
||||||
|
@ -139,7 +139,7 @@ class BookmarkFragmentStoreTest {
|
||||||
|
|
||||||
store.state.run {
|
store.state.run {
|
||||||
assertThat(newTree).isEqualTo(tree)
|
assertThat(newTree).isEqualTo(tree)
|
||||||
assertThat(BookmarkFragmentState.Mode.Normal).isEqualTo(mode)
|
assertThat(BookmarkFragmentState.Mode.Normal()).isEqualTo(mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,6 +167,17 @@ class BookmarkFragmentStoreTest {
|
||||||
assertFalse(store.state.isLoading)
|
assertFalse(store.state.isLoading)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `switching to Desktop Bookmarks folder sets showMenu state to false`() = runBlocking {
|
||||||
|
val initialState = BookmarkFragmentState(tree)
|
||||||
|
val store = BookmarkFragmentStore(initialState)
|
||||||
|
|
||||||
|
store.dispatch(BookmarkFragmentAction.Change(rootFolder)).join()
|
||||||
|
|
||||||
|
assertThat(rootFolder).isEqualTo(store.state.tree)
|
||||||
|
assertThat(BookmarkFragmentState.Mode.Normal(false)).isEqualTo(store.state.mode)
|
||||||
|
}
|
||||||
|
|
||||||
private val item = BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null)
|
private val item = BookmarkNode(BookmarkNodeType.ITEM, "456", "123", 0, "Mozilla", "http://mozilla.org", null)
|
||||||
private val separator = BookmarkNode(BookmarkNodeType.SEPARATOR, "789", "123", 1, null, null, null)
|
private val separator = BookmarkNode(BookmarkNodeType.SEPARATOR, "789", "123", 1, null, null, null)
|
||||||
private val subfolder = BookmarkNode(BookmarkNodeType.FOLDER, "987", "123", 0, "Subfolder", null, listOf())
|
private val subfolder = BookmarkNode(BookmarkNodeType.FOLDER, "987", "123", 0, "Subfolder", null, listOf())
|
||||||
|
@ -191,4 +202,13 @@ class BookmarkFragmentStoreTest {
|
||||||
null,
|
null,
|
||||||
listOf(separator, subfolder)
|
listOf(separator, subfolder)
|
||||||
)
|
)
|
||||||
|
private val rootFolder = BookmarkNode(
|
||||||
|
BookmarkNodeType.FOLDER,
|
||||||
|
"root________",
|
||||||
|
null,
|
||||||
|
0,
|
||||||
|
"Desktop Bookmarks",
|
||||||
|
null,
|
||||||
|
listOf(subfolder)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue