1
0
Fork 0

For #355 - Adds history to the recyclerview

master
Jeff Boek 2019-02-08 16:21:55 -08:00
parent 22ab6ac934
commit 64e96495cc
4 changed files with 84 additions and 11 deletions

View File

@ -5,7 +5,6 @@
package org.mozilla.fenix.library
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
@ -13,12 +12,9 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.Group
import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_library.*
import org.jetbrains.anko.constraint.layout.group
import org.jetbrains.anko.view
import org.mozilla.fenix.R
class LibraryFragment : Fragment() {

View File

@ -4,8 +4,13 @@
package org.mozilla.fenix.library.history
import android.view.ViewGroup
import org.mozilla.fenix.home.sessions.SessionsUIView
import org.mozilla.fenix.mvi.*
import org.mozilla.fenix.mvi.Action
import org.mozilla.fenix.mvi.ActionBusFactory
import org.mozilla.fenix.mvi.Change
import org.mozilla.fenix.mvi.UIComponent
import org.mozilla.fenix.mvi.ViewState
data class HistoryItem(val url: String)
class HistoryComponent(
private val container: ViewGroup,
@ -19,7 +24,7 @@ class HistoryComponent(
override val reducer: (HistoryState, HistoryChange) -> HistoryState = { state, change ->
when (change) {
is HistoryChange.Changed -> state // copy state with changes here
is HistoryChange.Change -> state.copy(items = change.list)
}
}
@ -30,12 +35,12 @@ class HistoryComponent(
}
}
data class HistoryState(val items: List<String>) : ViewState
data class HistoryState(val items: List<HistoryItem>) : ViewState
sealed class HistoryAction : Action {
object Select : HistoryAction()
}
sealed class HistoryChange : Change {
object Changed : HistoryChange()
data class Change(val list: List<HistoryItem>) : HistoryChange()
}

View File

@ -15,10 +15,21 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_history.view.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.mvi.ActionBusFactory
import kotlin.coroutines.CoroutineContext
class HistoryFragment : Fragment(), CoroutineScope {
lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
class HistoryFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -32,18 +43,40 @@ class HistoryFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.show()
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.library_menu, menu)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val eventEmitter = ActionBusFactory.get(this)
launch {
val items = requireComponents.core.historyStorage.getVisited().map { HistoryItem(it) }
launch(Dispatchers.Main) {
eventEmitter.emit(HistoryChange::class.java, HistoryChange.Change(items))
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.libraryClose -> {
Navigation.findNavController(requireActivity(), R.id.container).popBackStack(R.id.browserFragment, false)
Navigation.findNavController(requireActivity(), R.id.container)
.popBackStack(R.id.browserFragment, false)
true
}
R.id.librarySearch -> {

View File

@ -5,8 +5,14 @@
package org.mozilla.fenix.library.history
import android.content.Context
import android.graphics.Color
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.reactivex.Observable
@ -28,10 +34,43 @@ class HistoryUIView(
init {
view.apply {
adapter = HistoryAdapter(context)
layoutManager = LinearLayoutManager(container.context)
}
}
override fun updateView() = Consumer<HistoryState> {
(view.adapter as HistoryAdapter).updateData(it.items)
}
}
private class HistoryAdapter(val context: Context) : RecyclerView.Adapter<HistoryAdapter.ViewHolder>() {
class ViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)
private var items: List<HistoryItem> = emptyList()
fun updateData(items: List<HistoryItem>) {
this.items = items
notifyDataSetChanged()
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val textView = TextView(context).apply {
val lp = RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, // Width of TextView
RelativeLayout.LayoutParams.WRAP_CONTENT
)
setLayoutParams(lp)
setText("This is a sample TextView...")
setTextColor(Color.parseColor("#ff0000"))
}
return ViewHolder(textView)
}
override fun getItemCount(): Int = items.count()
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.textView.text = "Cell: ${items[position]}"
}
}