For #355 - Adds history to the recyclerview
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…
Reference in New Issue