|
|
@ -7,6 +7,8 @@ package org.mozilla.fenix.library.bookmarks.selectfolder
|
|
|
|
import android.view.View
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import androidx.core.content.ContextCompat
|
|
|
|
import androidx.core.content.ContextCompat
|
|
|
|
|
|
|
|
import androidx.recyclerview.widget.DiffUtil
|
|
|
|
|
|
|
|
import androidx.recyclerview.widget.ListAdapter
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import kotlinx.android.extensions.LayoutContainer
|
|
|
|
import kotlinx.android.extensions.LayoutContainer
|
|
|
|
import mozilla.components.concept.storage.BookmarkNode
|
|
|
|
import mozilla.components.concept.storage.BookmarkNode
|
|
|
@ -16,15 +18,18 @@ import org.jetbrains.anko.image
|
|
|
|
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.bookmarks.BookmarksSharedViewModel
|
|
|
|
import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel
|
|
|
|
|
|
|
|
import org.mozilla.fenix.library.bookmarks.selectfolder.SelectBookmarkFolderAdapter.BookmarkFolderViewHolder
|
|
|
|
|
|
|
|
import org.mozilla.fenix.library.bookmarks.selectfolder.SelectBookmarkFolderAdapter.BookmarkNodeWithDepth
|
|
|
|
|
|
|
|
|
|
|
|
class SelectBookmarkFolderAdapter(private val sharedViewModel: BookmarksSharedViewModel) :
|
|
|
|
class SelectBookmarkFolderAdapter(private val sharedViewModel: BookmarksSharedViewModel) :
|
|
|
|
RecyclerView.Adapter<SelectBookmarkFolderAdapter.BookmarkFolderViewHolder>() {
|
|
|
|
ListAdapter<BookmarkNodeWithDepth, BookmarkFolderViewHolder>(DiffCallback) {
|
|
|
|
|
|
|
|
|
|
|
|
private var tree: List<BookmarkNodeWithDepth> = listOf()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun updateData(tree: BookmarkNode?) {
|
|
|
|
fun updateData(tree: BookmarkNode?) {
|
|
|
|
this.tree = tree!!.convertToFolderDepthTree().drop(1)
|
|
|
|
val updatedData = tree
|
|
|
|
notifyDataSetChanged()
|
|
|
|
?.convertToFolderDepthTree()
|
|
|
|
|
|
|
|
?.drop(1)
|
|
|
|
|
|
|
|
.orEmpty()
|
|
|
|
|
|
|
|
submitList(updatedData)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BookmarkFolderViewHolder {
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BookmarkFolderViewHolder {
|
|
|
@ -38,27 +43,24 @@ class SelectBookmarkFolderAdapter(private val sharedViewModel: BookmarksSharedVi
|
|
|
|
return BookmarkFolderViewHolder(view)
|
|
|
|
return BookmarkFolderViewHolder(view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun getItemCount(): Int = tree.size
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: BookmarkFolderViewHolder, position: Int) {
|
|
|
|
override fun onBindViewHolder(holder: BookmarkFolderViewHolder, position: Int) {
|
|
|
|
holder.bind(
|
|
|
|
val item = getItem(position)
|
|
|
|
tree[position],
|
|
|
|
|
|
|
|
tree[position].node == sharedViewModel.selectedFolder
|
|
|
|
holder.bind(item, selected = item.node.isSelected()) { node ->
|
|
|
|
) { node ->
|
|
|
|
val lastSelectedItemPosition = getSelectedItemIndex()
|
|
|
|
sharedViewModel.apply {
|
|
|
|
|
|
|
|
when (selectedFolder) {
|
|
|
|
sharedViewModel.toggleSelection(node)
|
|
|
|
node -> selectedFolder = null
|
|
|
|
|
|
|
|
else -> selectedFolder = node
|
|
|
|
notifyItemChanged(position)
|
|
|
|
}
|
|
|
|
lastSelectedItemPosition
|
|
|
|
}
|
|
|
|
?.takeIf { it != position }
|
|
|
|
notifyDataSetChanged()
|
|
|
|
?.let { notifyItemChanged(it) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class BookmarkFolderViewHolder(
|
|
|
|
class BookmarkFolderViewHolder(
|
|
|
|
val view: LibrarySiteItemView
|
|
|
|
val view: LibrarySiteItemView
|
|
|
|
) :
|
|
|
|
) : RecyclerView.ViewHolder(view), LayoutContainer {
|
|
|
|
RecyclerView.ViewHolder(view), LayoutContainer {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override val containerView get() = view
|
|
|
|
override val containerView get() = view
|
|
|
|
|
|
|
|
|
|
|
@ -96,8 +98,36 @@ class SelectBookmarkFolderAdapter(private val sharedViewModel: BookmarksSharedVi
|
|
|
|
.orEmpty()
|
|
|
|
.orEmpty()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun getSelectedItemIndex(): Int? {
|
|
|
|
|
|
|
|
val selectedNode = sharedViewModel.selectedFolder
|
|
|
|
|
|
|
|
val selectedNodeIndex = currentList.indexOfFirst { it.node == selectedNode }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return selectedNodeIndex.takeIf { it != -1 }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Suppress("NOTHING_TO_INLINE")
|
|
|
|
|
|
|
|
private inline fun BookmarkNode.isSelected(): Boolean =
|
|
|
|
|
|
|
|
this == sharedViewModel.selectedFolder
|
|
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
companion object {
|
|
|
|
private const val maxDepth = 10
|
|
|
|
private const val maxDepth = 10
|
|
|
|
private const val dpsToIndent = 10
|
|
|
|
private const val dpsToIndent = 10
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private object DiffCallback : DiffUtil.ItemCallback<BookmarkNodeWithDepth>() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun areItemsTheSame(
|
|
|
|
|
|
|
|
oldItem: BookmarkNodeWithDepth,
|
|
|
|
|
|
|
|
newItem: BookmarkNodeWithDepth
|
|
|
|
|
|
|
|
) = oldItem.node.guid == newItem.node.guid
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun areContentsTheSame(
|
|
|
|
|
|
|
|
oldItem: BookmarkNodeWithDepth,
|
|
|
|
|
|
|
|
newItem: BookmarkNodeWithDepth
|
|
|
|
|
|
|
|
) = oldItem == newItem
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun BookmarksSharedViewModel.toggleSelection(node: BookmarkNode?) {
|
|
|
|
|
|
|
|
selectedFolder = if (selectedFolder == node) null else node
|
|
|
|
|
|
|
|
}
|
|
|
|