77 lines
2.8 KiB
Kotlin
77 lines
2.8 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.tabhistory
|
|
|
|
import android.view.LayoutInflater
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
import kotlinx.android.extensions.LayoutContainer
|
|
import kotlinx.android.synthetic.main.component_tabhistory.*
|
|
import mozilla.components.browser.state.selector.selectedTab
|
|
import mozilla.components.browser.state.state.BrowserState
|
|
import org.mozilla.fenix.R
|
|
|
|
interface TabHistoryViewInteractor {
|
|
|
|
/**
|
|
* Jump to a specific index in the tab's history.
|
|
*/
|
|
fun goToHistoryItem(item: TabHistoryItem)
|
|
}
|
|
|
|
class TabHistoryView(
|
|
container: ViewGroup,
|
|
private val expandDialog: () -> Unit,
|
|
interactor: TabHistoryViewInteractor
|
|
) : LayoutContainer {
|
|
|
|
override val containerView: View = LayoutInflater.from(container.context)
|
|
.inflate(R.layout.component_tabhistory, container, true)
|
|
|
|
private val adapter = TabHistoryAdapter(interactor)
|
|
private val layoutManager = object : LinearLayoutManager(containerView.context) {
|
|
override fun onLayoutCompleted(state: RecyclerView.State?) {
|
|
super.onLayoutCompleted(state)
|
|
currentIndex?.let { index ->
|
|
// Force expansion of the dialog, otherwise scrolling to the current history item
|
|
// won't work when its position is near the bottom of the recyclerview.
|
|
expandDialog.invoke()
|
|
// Also, attempt to center the current history item.
|
|
val itemView = tabHistoryRecyclerView.findViewHolderForLayoutPosition(
|
|
findFirstCompletelyVisibleItemPosition()
|
|
)?.itemView
|
|
val offset = tabHistoryRecyclerView.height / 2 - (itemView?.height ?: 0) / 2
|
|
scrollToPositionWithOffset(index, offset)
|
|
}
|
|
}
|
|
}.apply {
|
|
reverseLayout = true
|
|
}
|
|
|
|
private var currentIndex: Int? = null
|
|
|
|
init {
|
|
tabHistoryRecyclerView.adapter = adapter
|
|
tabHistoryRecyclerView.layoutManager = layoutManager
|
|
}
|
|
|
|
fun updateState(state: BrowserState) {
|
|
state.selectedTab?.content?.history?.let { historyState ->
|
|
currentIndex = historyState.currentIndex
|
|
val items = historyState.items.mapIndexed { index, historyItem ->
|
|
TabHistoryItem(
|
|
title = historyItem.title,
|
|
url = historyItem.uri,
|
|
index = index,
|
|
isSelected = index == historyState.currentIndex
|
|
)
|
|
}
|
|
adapter.submitList(items)
|
|
}
|
|
}
|
|
}
|