2019-03-21 20:41:41 +01:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
2019-07-12 20:38:15 +02:00
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2019-03-21 20:41:41 +01:00
|
|
|
|
|
|
|
package org.mozilla.fenix.library.bookmarks
|
|
|
|
|
2019-05-18 12:01:10 +02:00
|
|
|
import android.util.TypedValue
|
2019-03-21 20:41:41 +01:00
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
2019-04-11 06:30:15 +02:00
|
|
|
import androidx.core.content.ContextCompat
|
2019-07-08 21:00:25 +02:00
|
|
|
import androidx.recyclerview.widget.DiffUtil
|
2019-03-21 20:41:41 +01:00
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import kotlinx.android.extensions.LayoutContainer
|
|
|
|
import kotlinx.android.synthetic.main.bookmark_row.*
|
2019-04-04 22:40:39 +02:00
|
|
|
import mozilla.appservices.places.BookmarkRoot
|
2019-03-21 20:41:41 +01:00
|
|
|
import mozilla.components.browser.menu.BrowserMenu
|
|
|
|
import mozilla.components.concept.storage.BookmarkNode
|
|
|
|
import mozilla.components.concept.storage.BookmarkNodeType
|
|
|
|
import org.mozilla.fenix.R
|
2019-05-31 00:49:58 +02:00
|
|
|
import org.mozilla.fenix.ThemeManager
|
2019-04-02 23:55:48 +02:00
|
|
|
import org.mozilla.fenix.ext.components
|
2019-04-04 22:40:39 +02:00
|
|
|
import org.mozilla.fenix.ext.increaseTapArea
|
2019-06-26 22:40:20 +02:00
|
|
|
import org.mozilla.fenix.ext.loadIntoView
|
2019-03-21 20:41:41 +01:00
|
|
|
|
2019-07-26 04:55:51 +02:00
|
|
|
class BookmarkAdapter(val emptyView: View, val interactor: BookmarkViewInteractor) :
|
2019-06-26 22:40:20 +02:00
|
|
|
RecyclerView.Adapter<BookmarkAdapter.BookmarkNodeViewHolder>() {
|
2019-03-21 20:41:41 +01:00
|
|
|
|
|
|
|
private var tree: List<BookmarkNode> = listOf()
|
|
|
|
private var mode: BookmarkState.Mode = BookmarkState.Mode.Normal
|
2019-06-24 19:10:49 +02:00
|
|
|
val selected: Set<BookmarkNode>
|
|
|
|
get() = (mode as? BookmarkState.Mode.Selecting)?.selectedItems ?: setOf()
|
2019-04-04 22:40:39 +02:00
|
|
|
private var isFirstRun = true
|
2019-03-21 20:41:41 +01:00
|
|
|
|
|
|
|
fun updateData(tree: BookmarkNode?, mode: BookmarkState.Mode) {
|
2019-07-08 21:00:25 +02:00
|
|
|
val diffUtil = DiffUtil.calculateDiff(
|
|
|
|
BookmarkDiffUtil(
|
|
|
|
this.tree,
|
|
|
|
tree?.children ?: listOf(),
|
|
|
|
this.mode,
|
|
|
|
mode
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
2019-06-24 19:10:49 +02:00
|
|
|
this.tree = tree?.children ?: listOf()
|
2019-04-04 22:40:39 +02:00
|
|
|
isFirstRun = if (isFirstRun) false else {
|
|
|
|
emptyView.visibility = if (this.tree.isEmpty()) View.VISIBLE else View.GONE
|
|
|
|
false
|
|
|
|
}
|
2019-03-21 20:41:41 +01:00
|
|
|
this.mode = mode
|
2019-07-08 21:00:25 +02:00
|
|
|
|
|
|
|
diffUtil.dispatchUpdatesTo(this)
|
|
|
|
}
|
|
|
|
|
|
|
|
private class BookmarkDiffUtil(
|
|
|
|
val old: List<BookmarkNode>,
|
|
|
|
val new: List<BookmarkNode>,
|
|
|
|
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
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
|
2019-06-27 00:52:24 +02:00
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BookmarkNodeViewHolder {
|
2019-03-21 20:41:41 +01:00
|
|
|
val view = LayoutInflater.from(parent.context).inflate(R.layout.bookmark_row, parent, false)
|
|
|
|
|
|
|
|
return when (viewType) {
|
2019-04-25 17:09:19 +02:00
|
|
|
BookmarkItemViewHolder.viewType.ordinal -> BookmarkItemViewHolder(
|
2019-06-26 22:40:20 +02:00
|
|
|
view, interactor
|
2019-03-21 20:41:41 +01:00
|
|
|
)
|
2019-04-25 17:09:19 +02:00
|
|
|
BookmarkFolderViewHolder.viewType.ordinal -> BookmarkFolderViewHolder(
|
2019-06-26 22:40:20 +02:00
|
|
|
view, interactor
|
2019-03-21 20:41:41 +01:00
|
|
|
)
|
2019-04-25 17:09:19 +02:00
|
|
|
BookmarkSeparatorViewHolder.viewType.ordinal -> BookmarkSeparatorViewHolder(
|
2019-06-26 22:40:20 +02:00
|
|
|
view, interactor
|
2019-03-21 20:41:41 +01:00
|
|
|
)
|
|
|
|
else -> throw IllegalStateException("ViewType $viewType does not match to a ViewHolder")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getItemViewType(position: Int): Int {
|
|
|
|
return when (tree[position].type) {
|
|
|
|
BookmarkNodeType.ITEM -> ViewType.ITEM.ordinal
|
|
|
|
BookmarkNodeType.FOLDER -> ViewType.FOLDER.ordinal
|
|
|
|
BookmarkNodeType.SEPARATOR -> ViewType.SEPARATOR.ordinal
|
|
|
|
else -> throw IllegalStateException("Item $tree[position] does not match to a ViewType")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun getItemCount(): Int = tree.size
|
|
|
|
|
2019-06-27 00:52:24 +02:00
|
|
|
override fun onBindViewHolder(holder: BookmarkNodeViewHolder, position: Int) {
|
|
|
|
holder.bind(
|
|
|
|
tree[position],
|
|
|
|
mode,
|
|
|
|
tree[position] in selected
|
|
|
|
)
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
|
2019-04-11 06:30:15 +02:00
|
|
|
open class BookmarkNodeViewHolder(
|
2019-03-21 20:41:41 +01:00
|
|
|
view: View,
|
2019-07-26 04:55:51 +02:00
|
|
|
val interactor: BookmarkViewInteractor,
|
2019-03-21 20:41:41 +01:00
|
|
|
override val containerView: View? = view
|
2019-06-26 22:40:20 +02:00
|
|
|
) : RecyclerView.ViewHolder(view), LayoutContainer {
|
2019-03-21 20:41:41 +01:00
|
|
|
|
2019-04-11 06:30:15 +02:00
|
|
|
open fun bind(item: BookmarkNode, mode: BookmarkState.Mode, selected: Boolean) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
class BookmarkItemViewHolder(
|
|
|
|
view: View,
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor: BookmarkViewInteractor,
|
2019-04-11 06:30:15 +02:00
|
|
|
override val containerView: View? = view
|
|
|
|
) :
|
2019-06-26 22:40:20 +02:00
|
|
|
BookmarkNodeViewHolder(view, interactor, containerView) {
|
2019-04-11 06:30:15 +02:00
|
|
|
|
2019-04-30 22:21:59 +02:00
|
|
|
@Suppress("ComplexMethod")
|
2019-04-11 06:30:15 +02:00
|
|
|
override fun bind(item: BookmarkNode, mode: BookmarkState.Mode, selected: Boolean) {
|
2019-03-21 20:41:41 +01:00
|
|
|
|
2019-05-18 14:27:55 +02:00
|
|
|
val shiftTwoDp = TypedValue.applyDimension(
|
|
|
|
TypedValue.COMPLEX_UNIT_DIP, TWO_DIGIT_MARGIN, containerView!!.context.resources.displayMetrics
|
2019-05-18 12:01:10 +02:00
|
|
|
).toInt()
|
2019-06-24 19:10:49 +02:00
|
|
|
val params = bookmark_title.layoutParams as ViewGroup.MarginLayoutParams
|
2019-05-18 14:27:55 +02:00
|
|
|
params.topMargin = shiftTwoDp
|
2019-06-24 19:10:49 +02:00
|
|
|
bookmark_title.layoutParams = params
|
2019-05-18 12:01:10 +02:00
|
|
|
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_favicon.visibility = View.VISIBLE
|
|
|
|
bookmark_title.visibility = View.VISIBLE
|
2019-05-18 12:01:10 +02:00
|
|
|
bookmark_url.visibility = View.VISIBLE
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_overflow.visibility = View.VISIBLE
|
|
|
|
bookmark_separator.visibility = View.GONE
|
|
|
|
bookmark_layout.isClickable = true
|
|
|
|
|
2019-05-27 19:04:17 +02:00
|
|
|
val bookmarkItemMenu = BookmarkItemMenu(containerView.context, item) {
|
2019-04-04 22:40:39 +02:00
|
|
|
when (it) {
|
|
|
|
is BookmarkItemMenu.Item.Edit -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.edit(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.Select -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.select(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.Copy -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.copy(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.Share -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.share(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.OpenInNewTab -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.openInNewTab(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.OpenInPrivateTab -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.openInPrivateTab(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.Delete -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.delete(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bookmark_overflow.increaseTapArea(bookmarkOverflowExtraDips)
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_overflow.setOnClickListener {
|
2019-06-10 17:58:18 +02:00
|
|
|
bookmarkItemMenu.menuBuilder.build(containerView.context).show(anchor = it)
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
2019-04-30 22:21:59 +02:00
|
|
|
bookmark_title.text = if (item.title.isNullOrBlank()) item.url else item.title
|
2019-05-18 12:01:10 +02:00
|
|
|
bookmark_url.text = item.url
|
2019-04-11 06:30:15 +02:00
|
|
|
updateUrl(item, mode, selected)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun updateUrl(item: BookmarkNode, mode: BookmarkState.Mode, selected: Boolean) {
|
|
|
|
setClickListeners(mode, item, selected)
|
|
|
|
|
|
|
|
setColorsAndIcons(selected, item)
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
|
2019-04-11 06:30:15 +02:00
|
|
|
private fun setColorsAndIcons(selected: Boolean, item: BookmarkNode) {
|
|
|
|
val backgroundTint =
|
2019-04-16 17:03:22 +02:00
|
|
|
if (selected) {
|
2019-05-31 00:49:58 +02:00
|
|
|
ThemeManager.resolveAttribute(R.attr.accentHighContrast, containerView!!.context)
|
2019-04-16 17:03:22 +02:00
|
|
|
} else {
|
2019-05-31 00:49:58 +02:00
|
|
|
ThemeManager.resolveAttribute(R.attr.neutral, containerView!!.context)
|
2019-04-16 17:03:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
val backgroundTintList = ContextCompat.getColorStateList(containerView.context, backgroundTint)
|
2019-04-11 06:30:15 +02:00
|
|
|
bookmark_favicon.backgroundTintList = backgroundTintList
|
|
|
|
if (selected) bookmark_favicon.setImageResource(R.drawable.mozac_ic_check)
|
|
|
|
|
2019-06-26 22:40:20 +02:00
|
|
|
val url = item.url ?: return
|
|
|
|
if (!selected && url.startsWith("http")) {
|
|
|
|
bookmark_layout.context.components.core.icons.loadIntoView(bookmark_favicon, url)
|
2019-04-11 06:30:15 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun setClickListeners(
|
|
|
|
mode: BookmarkState.Mode,
|
|
|
|
item: BookmarkNode,
|
|
|
|
selected: Boolean
|
|
|
|
) {
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_layout.setOnClickListener {
|
|
|
|
if (mode == BookmarkState.Mode.Normal) {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.open(item)
|
2019-03-21 20:41:41 +01:00
|
|
|
} else {
|
2019-07-26 04:55:51 +02:00
|
|
|
if (selected) interactor.deselect(item) else interactor.select(item)
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bookmark_layout.setOnLongClickListener {
|
|
|
|
if (mode == BookmarkState.Mode.Normal) {
|
2019-07-26 04:55:51 +02:00
|
|
|
if (selected) interactor.deselect(item) else interactor.select(item)
|
2019-03-21 20:41:41 +01:00
|
|
|
true
|
|
|
|
} else false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
2019-05-18 14:27:55 +02:00
|
|
|
internal const val TWO_DIGIT_MARGIN = 2F
|
2019-05-18 12:01:10 +02:00
|
|
|
|
2019-04-25 17:09:19 +02:00
|
|
|
val viewType = ViewType.ITEM
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class BookmarkFolderViewHolder(
|
|
|
|
view: View,
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor: BookmarkViewInteractor,
|
2019-03-21 20:41:41 +01:00
|
|
|
override val containerView: View? = view
|
|
|
|
) :
|
2019-06-26 22:40:20 +02:00
|
|
|
BookmarkNodeViewHolder(view, interactor, containerView) {
|
2019-04-11 06:30:15 +02:00
|
|
|
|
|
|
|
override fun bind(item: BookmarkNode, mode: BookmarkState.Mode, selected: Boolean) {
|
2019-07-10 21:23:35 +02:00
|
|
|
containerView?.context?.let {
|
|
|
|
val drawable = it.getDrawable(R.drawable.ic_folder_icon)
|
|
|
|
drawable?.setTint(
|
|
|
|
ContextCompat.getColor(
|
|
|
|
it,
|
|
|
|
R.color.primary_text_light_theme
|
|
|
|
)
|
|
|
|
)
|
|
|
|
bookmark_favicon.setImageDrawable(drawable)
|
|
|
|
}
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_favicon.visibility = View.VISIBLE
|
|
|
|
bookmark_title.visibility = View.VISIBLE
|
2019-05-18 12:01:10 +02:00
|
|
|
bookmark_url.visibility = View.GONE
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_overflow.visibility = View.VISIBLE
|
|
|
|
bookmark_separator.visibility = View.GONE
|
|
|
|
bookmark_layout.isClickable = true
|
2019-04-11 06:30:15 +02:00
|
|
|
|
|
|
|
setClickListeners(mode, item, selected)
|
|
|
|
|
|
|
|
setMenu(item, containerView!!)
|
|
|
|
|
2019-04-16 17:03:22 +02:00
|
|
|
val backgroundTint = if (selected) {
|
2019-05-31 00:49:58 +02:00
|
|
|
ThemeManager.resolveAttribute(R.attr.accentHighContrast, containerView.context)
|
2019-04-16 17:03:22 +02:00
|
|
|
} else {
|
2019-05-31 00:49:58 +02:00
|
|
|
ThemeManager.resolveAttribute(R.attr.neutral, containerView.context)
|
2019-04-16 17:03:22 +02:00
|
|
|
}
|
|
|
|
|
2019-04-11 06:30:15 +02:00
|
|
|
val backgroundTintList = ContextCompat.getColorStateList(containerView.context, backgroundTint)
|
|
|
|
bookmark_favicon.backgroundTintList = backgroundTintList
|
|
|
|
val res = if (selected) R.drawable.mozac_ic_check else R.drawable.ic_folder_icon
|
|
|
|
bookmark_favicon.setImageResource(res)
|
|
|
|
|
|
|
|
bookmark_title?.text = item.title
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
|
2019-04-11 06:30:15 +02:00
|
|
|
private fun setMenu(
|
|
|
|
item: BookmarkNode,
|
|
|
|
containerView: View
|
|
|
|
) {
|
|
|
|
val bookmarkItemMenu = BookmarkItemMenu(containerView.context, item) {
|
2019-04-04 22:40:39 +02:00
|
|
|
when (it) {
|
|
|
|
is BookmarkItemMenu.Item.Edit -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.edit(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.Select -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.select(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
is BookmarkItemMenu.Item.Delete -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.delete(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-25 17:09:19 +02:00
|
|
|
if (!item.inRoots()) {
|
2019-04-04 22:40:39 +02:00
|
|
|
bookmark_overflow.increaseTapArea(bookmarkOverflowExtraDips)
|
|
|
|
bookmark_overflow.setOnClickListener {
|
|
|
|
bookmarkItemMenu.menuBuilder.build(containerView.context).show(
|
|
|
|
anchor = it,
|
|
|
|
orientation = BrowserMenu.Orientation.DOWN
|
|
|
|
)
|
|
|
|
}
|
2019-04-25 17:09:19 +02:00
|
|
|
bookmark_layout.setOnLongClickListener(null)
|
2019-04-04 22:40:39 +02:00
|
|
|
} else {
|
|
|
|
bookmark_overflow.visibility = View.GONE
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
2019-04-11 06:30:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun setClickListeners(
|
|
|
|
mode: BookmarkState.Mode,
|
|
|
|
item: BookmarkNode,
|
|
|
|
selected: Boolean
|
|
|
|
) {
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_layout.setOnClickListener {
|
2019-04-11 06:30:15 +02:00
|
|
|
if (mode == BookmarkState.Mode.Normal) {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.expand(item)
|
2019-04-11 06:30:15 +02:00
|
|
|
} else {
|
2019-07-26 04:55:51 +02:00
|
|
|
if (selected) interactor.deselect(item) else interactor.select(item)
|
2019-04-11 06:30:15 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bookmark_layout.setOnLongClickListener {
|
2019-04-25 17:09:19 +02:00
|
|
|
if (mode == BookmarkState.Mode.Normal && !item.inRoots()) {
|
2019-07-26 04:55:51 +02:00
|
|
|
if (selected) interactor.deselect(item) else interactor.select(item)
|
2019-04-11 06:30:15 +02:00
|
|
|
true
|
|
|
|
} else false
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
2019-04-25 17:09:19 +02:00
|
|
|
val viewType = ViewType.FOLDER
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class BookmarkSeparatorViewHolder(
|
|
|
|
view: View,
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor: BookmarkViewInteractor,
|
2019-03-21 20:41:41 +01:00
|
|
|
override val containerView: View? = view
|
2019-06-26 22:40:20 +02:00
|
|
|
) : BookmarkNodeViewHolder(view, interactor, containerView) {
|
2019-04-11 06:30:15 +02:00
|
|
|
|
|
|
|
override fun bind(item: BookmarkNode, mode: BookmarkState.Mode, selected: Boolean) {
|
2019-03-21 20:41:41 +01:00
|
|
|
|
|
|
|
bookmark_favicon.visibility = View.GONE
|
|
|
|
bookmark_title.visibility = View.GONE
|
2019-05-18 12:01:10 +02:00
|
|
|
bookmark_url.visibility = View.GONE
|
2019-04-04 22:40:39 +02:00
|
|
|
bookmark_overflow.increaseTapArea(bookmarkOverflowExtraDips)
|
2019-07-10 21:23:35 +02:00
|
|
|
bookmark_overflow.visibility = View.GONE
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_separator.visibility = View.VISIBLE
|
|
|
|
bookmark_layout.isClickable = false
|
|
|
|
|
2019-04-11 06:30:15 +02:00
|
|
|
val bookmarkItemMenu = BookmarkItemMenu(containerView!!.context, item) {
|
2019-04-04 22:40:39 +02:00
|
|
|
when (it) {
|
|
|
|
is BookmarkItemMenu.Item.Delete -> {
|
2019-07-26 04:55:51 +02:00
|
|
|
interactor.delete(item)
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-21 20:41:41 +01:00
|
|
|
bookmark_overflow.setOnClickListener {
|
2019-04-04 22:40:39 +02:00
|
|
|
bookmarkItemMenu.menuBuilder.build(containerView.context).show(
|
2019-03-21 20:41:41 +01:00
|
|
|
anchor = it,
|
|
|
|
orientation = BrowserMenu.Orientation.DOWN
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
2019-04-25 17:09:19 +02:00
|
|
|
val viewType = ViewType.SEPARATOR
|
2019-03-21 20:41:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-04 22:40:39 +02:00
|
|
|
companion object {
|
2019-04-19 06:44:15 +02:00
|
|
|
private const val bookmarkOverflowExtraDips = 16
|
2019-04-04 22:40:39 +02:00
|
|
|
}
|
|
|
|
|
2019-03-21 20:41:41 +01:00
|
|
|
enum class ViewType {
|
|
|
|
ITEM, FOLDER, SEPARATOR
|
|
|
|
}
|
|
|
|
}
|
2019-04-25 17:09:19 +02:00
|
|
|
|
|
|
|
fun BookmarkNode.inRoots() = enumValues<BookmarkRoot>().any { it.id == guid }
|