You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.5 KiB
Kotlin
122 lines
4.5 KiB
Kotlin
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* 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/. */
|
|
|
|
package org.mozilla.fenix.library.bookmarks.viewholders
|
|
|
|
import androidx.core.content.ContextCompat
|
|
import androidx.core.view.isVisible
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
import mozilla.components.concept.storage.BookmarkNode
|
|
import mozilla.components.concept.storage.BookmarkNodeType
|
|
import mozilla.components.support.ktx.android.content.getDrawableWithTint
|
|
import org.mozilla.fenix.R
|
|
import org.mozilla.fenix.ext.removeAndDisable
|
|
import org.mozilla.fenix.ext.hideAndDisable
|
|
import org.mozilla.fenix.ext.showAndEnable
|
|
import org.mozilla.fenix.ext.components
|
|
import org.mozilla.fenix.ext.loadIntoView
|
|
import org.mozilla.fenix.library.LibrarySiteItemView
|
|
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentState
|
|
import org.mozilla.fenix.library.bookmarks.BookmarkItemMenu
|
|
import org.mozilla.fenix.library.bookmarks.BookmarkPayload
|
|
import org.mozilla.fenix.library.bookmarks.BookmarkViewInteractor
|
|
import org.mozilla.fenix.library.bookmarks.inRoots
|
|
import org.mozilla.fenix.utils.Do
|
|
|
|
/**
|
|
* Base class for bookmark node view holders.
|
|
*/
|
|
class BookmarkNodeViewHolder(
|
|
private val containerView: LibrarySiteItemView,
|
|
private val interactor: BookmarkViewInteractor
|
|
) : RecyclerView.ViewHolder(containerView) {
|
|
|
|
var item: BookmarkNode? = null
|
|
private val menu: BookmarkItemMenu
|
|
|
|
init {
|
|
menu = BookmarkItemMenu(containerView.context) { menuItem ->
|
|
val item = this.item ?: return@BookmarkItemMenu
|
|
Do exhaustive when (menuItem) {
|
|
BookmarkItemMenu.Item.Edit -> interactor.onEditPressed(item)
|
|
BookmarkItemMenu.Item.Copy -> interactor.onCopyPressed(item)
|
|
BookmarkItemMenu.Item.Share -> interactor.onSharePressed(item)
|
|
BookmarkItemMenu.Item.OpenInNewTab -> interactor.onOpenInNormalTab(item)
|
|
BookmarkItemMenu.Item.OpenInPrivateTab -> interactor.onOpenInPrivateTab(item)
|
|
BookmarkItemMenu.Item.Delete -> interactor.onDelete(setOf(item))
|
|
}
|
|
}
|
|
|
|
containerView.attachMenu(menu.menuController)
|
|
}
|
|
|
|
fun bind(
|
|
item: BookmarkNode,
|
|
mode: BookmarkFragmentState.Mode,
|
|
payload: BookmarkPayload
|
|
) {
|
|
this.item = item
|
|
|
|
containerView.urlView.isVisible = item.type == BookmarkNodeType.ITEM
|
|
containerView.setSelectionInteractor(item, mode, interactor)
|
|
menu.updateMenu(item.type)
|
|
|
|
// Hide menu button if this item is a root folder or is selected
|
|
if (item.type == BookmarkNodeType.FOLDER && item.inRoots()) {
|
|
containerView.overflowView.removeAndDisable()
|
|
} else if (payload.modeChanged) {
|
|
if (mode is BookmarkFragmentState.Mode.Selecting) {
|
|
containerView.overflowView.hideAndDisable()
|
|
} else {
|
|
containerView.overflowView.showAndEnable()
|
|
}
|
|
}
|
|
|
|
if (payload.selectedChanged) {
|
|
containerView.changeSelected(item in mode.selectedItems)
|
|
}
|
|
|
|
val useTitleFallback = item.type == BookmarkNodeType.ITEM && item.title.isNullOrBlank()
|
|
if (payload.titleChanged) {
|
|
containerView.titleView.text = if (useTitleFallback) item.url else item.title
|
|
} else if (payload.urlChanged && useTitleFallback) {
|
|
containerView.titleView.text = item.url
|
|
}
|
|
|
|
if (payload.urlChanged) {
|
|
containerView.urlView.text = item.url
|
|
}
|
|
|
|
if (payload.iconChanged) {
|
|
updateIcon(item)
|
|
}
|
|
}
|
|
|
|
private fun updateIcon(item: BookmarkNode) {
|
|
val context = containerView.context
|
|
val iconView = containerView.iconView
|
|
val url = item.url
|
|
|
|
when {
|
|
// Item is a folder
|
|
item.type == BookmarkNodeType.FOLDER ->
|
|
iconView.setImageDrawable(
|
|
context.getDrawableWithTint(
|
|
R.drawable.ic_folder_icon,
|
|
ContextCompat.getColor(context, R.color.primary_text_light_theme)
|
|
)
|
|
)
|
|
// Item has a http/https URL
|
|
url != null && url.startsWith("http") ->
|
|
context.components.core.icons.loadIntoView(iconView, url)
|
|
else ->
|
|
iconView.setImageDrawable(null)
|
|
}
|
|
}
|
|
|
|
companion object {
|
|
const val LAYOUT_ID = R.layout.bookmark_list_item
|
|
}
|
|
}
|