For #635 - Restores a session
parent
3ecf9d338e
commit
2ac2f9a9da
|
@ -26,6 +26,7 @@ import org.mozilla.fenix.HomeActivity
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
import org.mozilla.fenix.ext.requireComponents
|
import org.mozilla.fenix.ext.requireComponents
|
||||||
import org.mozilla.fenix.home.sessions.ArchivedSession
|
import org.mozilla.fenix.home.sessions.ArchivedSession
|
||||||
|
import org.mozilla.fenix.home.sessions.SessionsAction
|
||||||
import org.mozilla.fenix.home.sessions.SessionsChange
|
import org.mozilla.fenix.home.sessions.SessionsChange
|
||||||
import org.mozilla.fenix.home.sessions.SessionsComponent
|
import org.mozilla.fenix.home.sessions.SessionsComponent
|
||||||
import org.mozilla.fenix.home.tabs.TabsAction
|
import org.mozilla.fenix.home.tabs.TabsAction
|
||||||
|
@ -33,7 +34,6 @@ import org.mozilla.fenix.home.tabs.TabsChange
|
||||||
import org.mozilla.fenix.home.tabs.TabsComponent
|
import org.mozilla.fenix.home.tabs.TabsComponent
|
||||||
import org.mozilla.fenix.home.tabs.TabsState
|
import org.mozilla.fenix.home.tabs.TabsState
|
||||||
import org.mozilla.fenix.home.tabs.toSessionViewState
|
import org.mozilla.fenix.home.tabs.toSessionViewState
|
||||||
import org.mozilla.fenix.isPrivate
|
|
||||||
import org.mozilla.fenix.mvi.ActionBusFactory
|
import org.mozilla.fenix.mvi.ActionBusFactory
|
||||||
import org.mozilla.fenix.mvi.getAutoDisposeObservable
|
import org.mozilla.fenix.mvi.getAutoDisposeObservable
|
||||||
import org.mozilla.fenix.mvi.getManagedEmitter
|
import org.mozilla.fenix.mvi.getManagedEmitter
|
||||||
|
@ -75,7 +75,7 @@ class HomeFragment : Fragment() {
|
||||||
|
|
||||||
bundles.observe(this, Observer {sessionBundles ->
|
bundles.observe(this, Observer {sessionBundles ->
|
||||||
val archivedSessions = sessionBundles.mapNotNull { sessionBundle ->
|
val archivedSessions = sessionBundles.mapNotNull { sessionBundle ->
|
||||||
sessionBundle.id?.let { ArchivedSession(it, sessionBundle.lastSavedAt, sessionBundle.urls) }
|
sessionBundle.id?.let { ArchivedSession(it, sessionBundle, sessionBundle.lastSavedAt, sessionBundle.urls) }
|
||||||
}
|
}
|
||||||
|
|
||||||
getManagedEmitter<SessionsChange>().onNext(SessionsChange.Changed(archivedSessions))
|
getManagedEmitter<SessionsChange>().onNext(SessionsChange.Changed(archivedSessions))
|
||||||
|
@ -162,6 +162,17 @@ class HomeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getAutoDisposeObservable<SessionsAction>()
|
||||||
|
.subscribe {
|
||||||
|
when (it) {
|
||||||
|
is SessionsAction.Select -> {
|
||||||
|
it.archivedSession.bundle.restoreSnapshot(requireComponents.core.engine)?.apply {
|
||||||
|
requireComponents.core.sessionManager.restore(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionObserver = subscribeToSessions()
|
sessionObserver = subscribeToSessions()
|
||||||
|
|
|
@ -14,13 +14,14 @@ import android.view.ViewGroup
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import kotlinx.android.synthetic.main.session_item.view.*
|
import io.reactivex.Observer
|
||||||
|
import kotlinx.android.extensions.LayoutContainer
|
||||||
|
import kotlinx.android.synthetic.main.session_item.*
|
||||||
import org.mozilla.fenix.R
|
import org.mozilla.fenix.R
|
||||||
|
|
||||||
class SessionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
class SessionsAdapter(private val actionEmitter: Observer<SessionsAction>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
private var items = listOf<ArchivedSession>()
|
private var items = listOf<ArchivedSession>()
|
||||||
|
|
||||||
|
|
||||||
fun reloadDatat(items: List<ArchivedSession>) {
|
fun reloadDatat(items: List<ArchivedSession>) {
|
||||||
this.items = items
|
this.items = items
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
|
@ -32,7 +33,7 @@ class SessionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
return when (viewType) {
|
return when (viewType) {
|
||||||
HeaderViewHolder.LAYOUT_ID -> HeaderViewHolder(view)
|
HeaderViewHolder.LAYOUT_ID -> HeaderViewHolder(view)
|
||||||
EmptyListViewHolder.LAYOUT_ID -> EmptyListViewHolder(view)
|
EmptyListViewHolder.LAYOUT_ID -> EmptyListViewHolder(view)
|
||||||
SessionItemViewHolder.LAYOUT_ID -> SessionItemViewHolder(view)
|
SessionItemViewHolder.LAYOUT_ID -> SessionItemViewHolder(view, actionEmitter)
|
||||||
PrivateEmptyListViewHolder.LAYOUT_ID -> PrivateEmptyListViewHolder(view)
|
PrivateEmptyListViewHolder.LAYOUT_ID -> PrivateEmptyListViewHolder(view)
|
||||||
else -> EmptyListViewHolder(view)
|
else -> EmptyListViewHolder(view)
|
||||||
}
|
}
|
||||||
|
@ -84,23 +85,28 @@ class SessionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SessionItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
private class SessionItemViewHolder(
|
||||||
private val thumbnail = view.session_card_thumbnail
|
view: View,
|
||||||
private val timestampLabel = view.session_card_timestamp
|
private val actionEmitter: Observer<SessionsAction>,
|
||||||
private val titlesLabel = view.session_card_titles
|
override val containerView: View? = view
|
||||||
private val extrasLabel = view.session_card_extras
|
) :RecyclerView.ViewHolder(view), LayoutContainer {
|
||||||
|
|
||||||
private var session: ArchivedSession? = null
|
private var session: ArchivedSession? = null
|
||||||
|
|
||||||
|
init {
|
||||||
|
session_item.setOnClickListener {
|
||||||
|
session?.apply { actionEmitter.onNext(SessionsAction.Select(this)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun bind(session: ArchivedSession) {
|
fun bind(session: ArchivedSession) {
|
||||||
this.session = session
|
this.session = session
|
||||||
|
|
||||||
thumbnail.setColorFilter(
|
session_card_thumbnail.setColorFilter(
|
||||||
ContextCompat.getColor(itemView.context, AVAILABLE_COLOR_IDS.random()),
|
ContextCompat.getColor(itemView.context, AVAILABLE_COLOR_IDS.random()),
|
||||||
PorterDuff.Mode.MULTIPLY)
|
PorterDuff.Mode.MULTIPLY)
|
||||||
timestampLabel.text = session.formattedSavedAt
|
session_card_timestamp.text = session.formattedSavedAt
|
||||||
titlesLabel.text = session.titles
|
session_card_titles.text = session.titles
|
||||||
extrasLabel.text = if (session.extrasLabel > 0) {
|
session_card_extras.text = if (session.extrasLabel > 0) {
|
||||||
"+${session.extrasLabel} sites..."
|
"+${session.extrasLabel} sites..."
|
||||||
} else { "" }
|
} else { "" }
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ package org.mozilla.fenix.home.sessions
|
||||||
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import mozilla.components.feature.session.bundling.SessionBundle
|
||||||
import org.mozilla.fenix.mvi.Action
|
import org.mozilla.fenix.mvi.Action
|
||||||
import org.mozilla.fenix.mvi.ActionBusFactory
|
import org.mozilla.fenix.mvi.ActionBusFactory
|
||||||
import org.mozilla.fenix.mvi.Change
|
import org.mozilla.fenix.mvi.Change
|
||||||
|
@ -15,7 +16,11 @@ import java.net.URL
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
data class ArchivedSession(val id: Long, private val savedAt: Long, private val _urls: List<String>) {
|
data class ArchivedSession(
|
||||||
|
val id: Long,
|
||||||
|
val bundle: SessionBundle,
|
||||||
|
private val savedAt: Long,
|
||||||
|
private val _urls: List<String>) {
|
||||||
val formattedSavedAt by lazy {
|
val formattedSavedAt by lazy {
|
||||||
val isSameDay: (Calendar, Calendar) -> Boolean = { a, b ->
|
val isSameDay: (Calendar, Calendar) -> Boolean = { a, b ->
|
||||||
a.get(Calendar.ERA) == b.get(Calendar.ERA) &&
|
a.get(Calendar.ERA) == b.get(Calendar.ERA) &&
|
||||||
|
|
|
@ -25,7 +25,7 @@ class SessionsUIView(
|
||||||
.inflate(R.layout.component_sessions, container, true)
|
.inflate(R.layout.component_sessions, container, true)
|
||||||
.findViewById(R.id.session_list)
|
.findViewById(R.id.session_list)
|
||||||
|
|
||||||
private val sessionsAdapter = SessionsAdapter()
|
private val sessionsAdapter = SessionsAdapter(actionEmitter)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
view.apply {
|
view.apply {
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
android:clipChildren="true">
|
android:clipChildren="true">
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/session_item"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
Loading…
Reference in New Issue