For #355 - Adds history to the recyclerview

nightly-build-test
Jeff Boek 5 years ago
parent 22ab6ac934
commit 64e96495cc

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

@ -4,8 +4,13 @@
package org.mozilla.fenix.library.history package org.mozilla.fenix.library.history
import android.view.ViewGroup import android.view.ViewGroup
import org.mozilla.fenix.home.sessions.SessionsUIView import org.mozilla.fenix.mvi.Action
import org.mozilla.fenix.mvi.* 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( class HistoryComponent(
private val container: ViewGroup, private val container: ViewGroup,
@ -19,7 +24,7 @@ class HistoryComponent(
override val reducer: (HistoryState, HistoryChange) -> HistoryState = { state, change -> override val reducer: (HistoryState, HistoryChange) -> HistoryState = { state, change ->
when (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 { sealed class HistoryAction : Action {
object Select : HistoryAction() object Select : HistoryAction()
} }
sealed class HistoryChange : Change { sealed class HistoryChange : Change {
object Changed : HistoryChange() data class Change(val list: List<HistoryItem>) : HistoryChange()
} }

@ -15,10 +15,21 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.Navigation import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_history.view.* 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.R
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.mvi.ActionBusFactory 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( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@ -32,18 +43,40 @@ class HistoryFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
job = Job()
setHasOptionsMenu(true) setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.show() (activity as AppCompatActivity).supportActionBar?.show()
} }
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.library_menu, menu) 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 { override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) { return when (item.itemId) {
R.id.libraryClose -> { 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 true
} }
R.id.librarySearch -> { R.id.librarySearch -> {

@ -5,8 +5,14 @@
package org.mozilla.fenix.library.history 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.LayoutInflater
import android.view.ViewGroup 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.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.reactivex.Observable import io.reactivex.Observable
@ -28,10 +34,43 @@ class HistoryUIView(
init { init {
view.apply { view.apply {
adapter = HistoryAdapter(context)
layoutManager = LinearLayoutManager(container.context) layoutManager = LinearLayoutManager(container.context)
} }
} }
override fun updateView() = Consumer<HistoryState> { 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]}"
} }
} }

Loading…
Cancel
Save