diff --git a/app/src/main/java/org/mozilla/fenix/library/LibraryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/LibraryFragment.kt index 2537dad97..8693c6933 100644 --- a/app/src/main/java/org/mozilla/fenix/library/LibraryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/LibraryFragment.kt @@ -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() { diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt index 3faecac25..90566d9d9 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryComponent.kt @@ -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) : ViewState +data class HistoryState(val items: List) : ViewState sealed class HistoryAction : Action { object Select : HistoryAction() } sealed class HistoryChange : Change { - object Changed : HistoryChange() + data class Change(val list: List) : HistoryChange() } diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index 1fdb53a2f..de1a875ba 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -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 -> { diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt index 9afbff85c..b7b715105 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryUIView.kt @@ -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 { + (view.adapter as HistoryAdapter).updateData(it.items) + } +} + +private class HistoryAdapter(val context: Context) : RecyclerView.Adapter() { + class ViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView) + + private var items: List = emptyList() + + fun updateData(items: List) { + 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]}" } }