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.
iceraven-browser/app/src/main/java/org/mozilla/fenix/tabstray/browser/TabGroupViewHolder.kt

86 lines
3.1 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.tabstray.browser
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.state.TabGroup
import mozilla.components.browser.state.state.TabSessionState
import org.mozilla.fenix.R
import org.mozilla.fenix.databinding.TabGroupItemBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.selection.SelectionHolder
import org.mozilla.fenix.tabstray.TabsTrayStore
import org.mozilla.fenix.tabstray.TrayPagerAdapter
/**
* A RecyclerView ViewHolder implementation for tab group items.
*
* @param itemView [View] that displays a "tab".
* @param orientation [Int] orientation of the items. Horizontal for grid layout, vertical for list layout
* @param interactor the [BrowserTrayInteractor] for tab interactions.
* @param store the [TabsTrayStore] instance.
* @param selectionHolder the store that holds the currently selected tabs.
*/
class TabGroupViewHolder(
itemView: View,
val orientation: Int,
val interactor: BrowserTrayInteractor,
val store: TabsTrayStore,
val selectionHolder: SelectionHolder<TabSessionState>? = null
) : RecyclerView.ViewHolder(itemView) {
private val binding = TabGroupItemBinding.bind(itemView)
private lateinit var groupListAdapter: TabGroupListAdapter
fun bind(
tabGroup: TabGroup,
) {
val selectedTabId = itemView.context.components.core.store.state.selectedTabId
val selectedIndex = tabGroup.tabIds.indexOfFirst { it == selectedTabId }
binding.tabGroupTitle.text = tabGroup.id
binding.tabGroupList.apply {
layoutManager = LinearLayoutManager(itemView.context, orientation, false)
groupListAdapter = TabGroupListAdapter(
context = itemView.context,
interactor = interactor,
store = store,
selectionHolder = selectionHolder,
featureName = TrayPagerAdapter.TAB_GROUP_FEATURE_NAME
)
adapter = groupListAdapter
val tabGroupTabs = itemView.context.components.core.store.state.normalTabs.filter {
tabGroup.tabIds.contains(it.id)
}
groupListAdapter.submitList(tabGroupTabs)
scrollToPosition(selectedIndex)
}
}
/**
* Notify the nested [RecyclerView] that it has been detached.
*/
fun unbind() {
groupListAdapter.onDetachedFromRecyclerView(binding.tabGroupList)
}
/**
* Notify the nested [RecyclerView] that it has been attached. This is so our observers know when to start again.
*/
fun rebind() {
groupListAdapter.onAttachedToRecyclerView(binding.tabGroupList)
}
companion object {
const val LAYOUT_ID = R.layout.tab_group_item
}
}