|
|
|
@ -4,27 +4,17 @@
|
|
|
|
|
|
|
|
|
|
package org.mozilla.fenix.library.history
|
|
|
|
|
|
|
|
|
|
import android.graphics.PorterDuff
|
|
|
|
|
import android.graphics.PorterDuffColorFilter
|
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
|
import android.view.View
|
|
|
|
|
import android.view.ViewGroup
|
|
|
|
|
import android.widget.ImageButton
|
|
|
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
|
|
|
import androidx.appcompat.widget.Toolbar
|
|
|
|
|
import androidx.constraintlayout.widget.ConstraintLayout
|
|
|
|
|
import androidx.core.content.ContextCompat
|
|
|
|
|
import androidx.core.view.isVisible
|
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
|
import androidx.recyclerview.widget.SimpleItemAnimator
|
|
|
|
|
import kotlinx.android.extensions.LayoutContainer
|
|
|
|
|
import kotlinx.android.synthetic.main.component_history.*
|
|
|
|
|
import kotlinx.android.synthetic.main.component_history.view.*
|
|
|
|
|
import kotlinx.android.synthetic.main.component_history.view.history_list
|
|
|
|
|
import mozilla.components.support.base.feature.BackHandler
|
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
|
import org.mozilla.fenix.ext.asActivity
|
|
|
|
|
import org.mozilla.fenix.ext.getColorResFromAttr
|
|
|
|
|
import org.mozilla.fenix.library.LibraryPageView
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Interface for the HistoryViewInteractor. This interface is implemented by objects that want
|
|
|
|
@ -73,27 +63,22 @@ interface HistoryViewInteractor {
|
|
|
|
|
* View that contains and configures the History List
|
|
|
|
|
*/
|
|
|
|
|
class HistoryView(
|
|
|
|
|
private val container: ViewGroup,
|
|
|
|
|
container: ViewGroup,
|
|
|
|
|
val interactor: HistoryInteractor
|
|
|
|
|
) : LayoutContainer, BackHandler {
|
|
|
|
|
) : LibraryPageView(container), BackHandler {
|
|
|
|
|
|
|
|
|
|
val view: ConstraintLayout = LayoutInflater.from(container.context)
|
|
|
|
|
.inflate(R.layout.component_history, container, true)
|
|
|
|
|
.findViewById(R.id.history_wrapper)
|
|
|
|
|
|
|
|
|
|
override val containerView: View?
|
|
|
|
|
get() = container
|
|
|
|
|
|
|
|
|
|
val historyAdapter: HistoryAdapter
|
|
|
|
|
private var items: List<HistoryItem> = listOf()
|
|
|
|
|
private val context = container.context
|
|
|
|
|
var mode: HistoryState.Mode = HistoryState.Mode.Normal
|
|
|
|
|
private set
|
|
|
|
|
private val activity = context?.asActivity()
|
|
|
|
|
|
|
|
|
|
val historyAdapter = HistoryAdapter(interactor)
|
|
|
|
|
private val layoutManager = LinearLayoutManager(container.context)
|
|
|
|
|
init {
|
|
|
|
|
historyAdapter = HistoryAdapter(interactor)
|
|
|
|
|
|
|
|
|
|
init {
|
|
|
|
|
view.history_list.apply {
|
|
|
|
|
layoutManager = this@HistoryView.layoutManager
|
|
|
|
|
adapter = historyAdapter
|
|
|
|
@ -102,37 +87,36 @@ class HistoryView(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun update(state: HistoryState) {
|
|
|
|
|
view.progress_bar.visibility =
|
|
|
|
|
if (state.mode is HistoryState.Mode.Deleting) View.VISIBLE else View.GONE
|
|
|
|
|
val oldMode = mode
|
|
|
|
|
|
|
|
|
|
if (state.mode != mode) {
|
|
|
|
|
view.progress_bar.isVisible = state.mode === HistoryState.Mode.Deleting
|
|
|
|
|
items = state.items
|
|
|
|
|
mode = state.mode
|
|
|
|
|
|
|
|
|
|
if (state.mode != oldMode) {
|
|
|
|
|
interactor.onModeSwitched()
|
|
|
|
|
historyAdapter.updateMode(state.mode)
|
|
|
|
|
|
|
|
|
|
val oldMode = mode
|
|
|
|
|
if (oldMode is HistoryState.Mode.Editing) {
|
|
|
|
|
oldMode.selectedItems.forEach {
|
|
|
|
|
historyAdapter.notifyItemChanged(it.id)
|
|
|
|
|
}
|
|
|
|
|
// Deselect all the previously selected items
|
|
|
|
|
oldMode.selectedItems.forEach {
|
|
|
|
|
historyAdapter.notifyItemChanged(it.id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
(state.mode as? HistoryState.Mode.Editing)?.also {
|
|
|
|
|
val oldMode = (mode as? HistoryState.Mode.Editing)
|
|
|
|
|
val unselectedItems = oldMode?.selectedItems?.minus(it.selectedItems) ?: setOf()
|
|
|
|
|
if (state.mode is HistoryState.Mode.Editing) {
|
|
|
|
|
val unselectedItems = oldMode.selectedItems - state.mode.selectedItems
|
|
|
|
|
|
|
|
|
|
it.selectedItems.union(unselectedItems).forEach { item ->
|
|
|
|
|
state.mode.selectedItems.union(unselectedItems).forEach { item ->
|
|
|
|
|
historyAdapter.notifyItemChanged(item.id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
items = state.items
|
|
|
|
|
when (val mode = state.mode) {
|
|
|
|
|
is HistoryState.Mode.Normal -> setUIForNormalMode()
|
|
|
|
|
is HistoryState.Mode.Editing -> setUIForSelectingMode(mode.selectedItems.size)
|
|
|
|
|
is HistoryState.Mode.Normal ->
|
|
|
|
|
setUiForNormalMode(context.getString(R.string.library_history))
|
|
|
|
|
is HistoryState.Mode.Editing ->
|
|
|
|
|
setUiForSelectingMode(context.getString(R.string.history_multi_select_title, mode.selectedItems.size))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mode = state.mode
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun updateEmptyState(userHasHistory: Boolean) {
|
|
|
|
@ -140,59 +124,6 @@ class HistoryView(
|
|
|
|
|
history_empty_view.isVisible = !userHasHistory
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun setUIForSelectingMode(selectedItemSize: Int) {
|
|
|
|
|
activity?.title =
|
|
|
|
|
context.getString(R.string.history_multi_select_title, selectedItemSize)
|
|
|
|
|
setToolbarColors(
|
|
|
|
|
R.color.white_color,
|
|
|
|
|
context!!.getColorResFromAttr(R.attr.accentHighContrast)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun setUIForNormalMode() {
|
|
|
|
|
activity?.title = context.getString(R.string.library_history)
|
|
|
|
|
setToolbarColors(
|
|
|
|
|
context!!.getColorResFromAttr(R.attr.primaryText),
|
|
|
|
|
context.getColorResFromAttr(R.attr.foundation)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun setToolbarColors(foreground: Int, background: Int) {
|
|
|
|
|
val toolbar = (activity as AppCompatActivity).findViewById<Toolbar>(R.id.navigationToolbar)
|
|
|
|
|
val colorFilter = PorterDuffColorFilter(
|
|
|
|
|
ContextCompat.getColor(context, foreground),
|
|
|
|
|
PorterDuff.Mode.SRC_IN
|
|
|
|
|
)
|
|
|
|
|
toolbar.setBackgroundColor(ContextCompat.getColor(context, background))
|
|
|
|
|
toolbar.setTitleTextColor(ContextCompat.getColor(context, foreground))
|
|
|
|
|
|
|
|
|
|
themeToolbar(
|
|
|
|
|
toolbar, foreground,
|
|
|
|
|
background, colorFilter
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun themeToolbar(
|
|
|
|
|
toolbar: Toolbar,
|
|
|
|
|
textColor: Int,
|
|
|
|
|
backgroundColor: Int,
|
|
|
|
|
colorFilter: PorterDuffColorFilter? = null
|
|
|
|
|
) {
|
|
|
|
|
toolbar.setTitleTextColor(ContextCompat.getColor(context!!, textColor))
|
|
|
|
|
toolbar.setBackgroundColor(ContextCompat.getColor(context, backgroundColor))
|
|
|
|
|
|
|
|
|
|
if (colorFilter == null) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
toolbar.overflowIcon?.colorFilter = colorFilter
|
|
|
|
|
(0 until toolbar.childCount).forEach {
|
|
|
|
|
when (val item = toolbar.getChildAt(it)) {
|
|
|
|
|
is ImageButton -> item.drawable.colorFilter = colorFilter
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onBackPressed(): Boolean {
|
|
|
|
|
return interactor.onBackPressed()
|
|
|
|
|
}
|
|
|
|
|