/* 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.history import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.reactivex.Observable import io.reactivex.Observer import io.reactivex.functions.Consumer import org.mozilla.fenix.R import org.mozilla.fenix.mvi.UIView class HistoryUIView( container: ViewGroup, actionEmitter: Observer, changesObservable: Observable ) : UIView(container, actionEmitter, changesObservable) { override val view: RecyclerView = LayoutInflater.from(container.context) .inflate(R.layout.component_history, container, true) .findViewById(R.id.history_list) init { view.apply { adapter = HistoryAdapter(actionEmitter) layoutManager = LinearLayoutManager(container.context) } } override fun updateView() = Consumer { (view.adapter as HistoryAdapter).updateData(it.items) } } private class HistoryAdapter( private val actionEmitter: Observer ) : RecyclerView.Adapter() { class HistoryListItemViewHolder( view: View, private val actionEmitter: Observer ) : RecyclerView.ViewHolder(view) { private var title = view.findViewById(R.id.history_title) private var url = view.findViewById(R.id.history_url) private var item: HistoryItem? = null init { view.setOnClickListener { item?.apply { actionEmitter.onNext(HistoryAction.Select(this)) } } } fun bind(item: HistoryItem) { this.item = item title.text = item.title url.text = item.url } companion object { const val LAYOUT_ID = R.layout.history_list_item } } class HistoryHeaderViewHolder( view: View ) : RecyclerView.ViewHolder(view) { private val title = view.findViewById(R.id.history_header_title) fun bind(title: String) { this.title.text = title } companion object { const val LAYOUT_ID = R.layout.history_header } } private var items: List = emptyList() fun updateData(items: List) { this.items = items notifyDataSetChanged() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false) return when (viewType) { HistoryHeaderViewHolder.LAYOUT_ID -> HistoryHeaderViewHolder(view) HistoryListItemViewHolder.LAYOUT_ID -> HistoryListItemViewHolder(view, actionEmitter) else -> throw IllegalStateException("viewType $viewType does not match to a ViewHolder") } } override fun getItemViewType(position: Int): Int { return when (position) { 0 -> HistoryHeaderViewHolder.LAYOUT_ID else -> HistoryListItemViewHolder.LAYOUT_ID } } override fun getItemCount(): Int = items.count() + NUMBER_OF_SECTIONS override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is HistoryHeaderViewHolder -> holder.bind("Today") is HistoryListItemViewHolder -> holder.bind(items[position - NUMBER_OF_SECTIONS]) } } companion object { private const val NUMBER_OF_SECTIONS = 1 } }