For #1574: Displays previous tab collections when creating
parent
60e5f8a626
commit
4e6f9b9ef1
|
@ -27,7 +27,8 @@ sealed class SaveCollectionStep {
|
|||
data class CollectionCreationState(
|
||||
val tabs: List<Tab> = listOf(),
|
||||
val selectedTabs: Set<Tab> = setOf(),
|
||||
val saveCollectionStep: SaveCollectionStep = SaveCollectionStep.SelectTabs
|
||||
val saveCollectionStep: SaveCollectionStep = SaveCollectionStep.SelectTabs,
|
||||
val tabCollections: List<TabCollection> = listOf()
|
||||
) : ViewState
|
||||
|
||||
sealed class CollectionCreationChange : Change {
|
||||
|
|
|
@ -76,7 +76,7 @@ class CollectionCreationUIView(
|
|||
}
|
||||
|
||||
view.name_collection_edittext.setOnEditorActionListener { v, actionId, event ->
|
||||
if (actionId == EditorInfo.IME_ACTION_DONE) {
|
||||
if (actionId == EditorInfo.IME_ACTION_DONE && !v.text.toString().isEmpty()) {
|
||||
actionEmitter.onNext(
|
||||
CollectionCreationAction.SaveCollectionName(
|
||||
selectedTabs.toList(),
|
||||
|
@ -190,7 +190,7 @@ class CollectionCreationUIView(
|
|||
name_collection_edittext.setText(
|
||||
view.context.getString(
|
||||
R.string.create_collection_default_name,
|
||||
1
|
||||
it.tabCollections.size + 1
|
||||
)
|
||||
)
|
||||
name_collection_edittext.setSelection(0, name_collection_edittext.text.length)
|
||||
|
@ -198,6 +198,8 @@ class CollectionCreationUIView(
|
|||
view.context.getString(R.string.create_collection_name_collection)
|
||||
}
|
||||
}
|
||||
|
||||
collectionSaveListAdapter.reloadData(it.tabCollections)
|
||||
}
|
||||
|
||||
fun onResumed() {
|
||||
|
|
|
@ -55,6 +55,7 @@ class CreateCollectionFragment : DialogFragment(), CoroutineScope {
|
|||
val tabs = viewModel!!.tabs
|
||||
val selectedTabs = viewModel.selectedTabs
|
||||
val step = viewModel.saveCollectionStep
|
||||
val tabCollections = viewModel.tabCollections
|
||||
|
||||
collectionCreationComponent = CollectionCreationComponent(
|
||||
view.create_collection_wrapper,
|
||||
|
@ -63,7 +64,7 @@ class CreateCollectionFragment : DialogFragment(), CoroutineScope {
|
|||
this,
|
||||
CollectionCreationViewModel::class.java
|
||||
) {
|
||||
CollectionCreationViewModel(CollectionCreationState(tabs, selectedTabs, step))
|
||||
CollectionCreationViewModel(CollectionCreationState(tabs, selectedTabs, step, tabCollections))
|
||||
}
|
||||
)
|
||||
return view
|
||||
|
|
|
@ -6,9 +6,11 @@ package org.mozilla.fenix.collections
|
|||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import org.mozilla.fenix.home.sessioncontrol.Tab
|
||||
import org.mozilla.fenix.home.sessioncontrol.TabCollection
|
||||
|
||||
class CreateCollectionViewModel : ViewModel() {
|
||||
var selectedTabs = setOf<Tab>()
|
||||
var tabs = listOf<Tab>()
|
||||
var saveCollectionStep: SaveCollectionStep = SaveCollectionStep.SelectTabs
|
||||
var tabCollections = listOf<TabCollection>()
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ package org.mozilla.fenix.collections
|
|||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
|
@ -21,8 +22,8 @@ class SaveCollectionListAdapter(
|
|||
val actionEmitter: Observer<CollectionCreationAction>
|
||||
) : RecyclerView.Adapter<CollectionViewHolder>() {
|
||||
|
||||
private var collections: List<TabCollection> = listOf()
|
||||
private lateinit var job: Job
|
||||
private var tabCollections = listOf<TabCollection>()
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CollectionViewHolder {
|
||||
val view = LayoutInflater.from(parent.context)
|
||||
|
@ -32,11 +33,11 @@ class SaveCollectionListAdapter(
|
|||
}
|
||||
|
||||
override fun onBindViewHolder(holder: CollectionViewHolder, position: Int) {
|
||||
val collection = collections[position]
|
||||
val collection = tabCollections[position]
|
||||
holder.bind(collection)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = collections.size
|
||||
override fun getItemCount(): Int = tabCollections.size
|
||||
|
||||
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
|
||||
super.onAttachedToRecyclerView(recyclerView)
|
||||
|
@ -47,6 +48,11 @@ class SaveCollectionListAdapter(
|
|||
super.onDetachedFromRecyclerView(recyclerView)
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
fun reloadData(tabCollections: List<TabCollection>) {
|
||||
this.tabCollections = tabCollections
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
class CollectionViewHolder(
|
||||
|
@ -75,6 +81,7 @@ class CollectionViewHolder(
|
|||
fun bind(collection: TabCollection) {
|
||||
this.collection = collection
|
||||
view.collection_item.text = collection.title
|
||||
Log.d("sawyer", "Binding collection: " + collection.title)
|
||||
}
|
||||
|
||||
companion object {
|
|
@ -17,6 +17,8 @@ import org.mozilla.fenix.test.Mockable
|
|||
@Mockable
|
||||
class TabCollectionStorage(private val context: Context, private val sessionManager: SessionManager) {
|
||||
|
||||
var cachedTabCollections = listOf<TabCollection>()
|
||||
|
||||
private val collectionStorage by lazy {
|
||||
TabCollectionStorage(context, sessionManager)
|
||||
}
|
||||
|
@ -29,6 +31,10 @@ class TabCollectionStorage(private val context: Context, private val sessionMana
|
|||
collectionStorage.addTabsToCollection(tabCollection, sessions)
|
||||
}
|
||||
|
||||
fun getTabCollectionsCount(): Int {
|
||||
return collectionStorage.getTabCollectionsCount()
|
||||
}
|
||||
|
||||
fun getCollections(limit: Int = 20): LiveData<List<TabCollection>> {
|
||||
return collectionStorage.getCollections(limit)
|
||||
}
|
||||
|
|
|
@ -395,6 +395,8 @@ class HomeFragment : Fragment(), CoroutineScope {
|
|||
|
||||
private fun subscribeToTabCollections(): Observer<List<TabCollection>> {
|
||||
val observer = Observer<List<TabCollection>> {
|
||||
// TODO is it bad to be caching like this?
|
||||
requireComponents.core.tabCollectionStorage.cachedTabCollections = it
|
||||
getManagedEmitter<SessionControlChange>().onNext(SessionControlChange.CollectionsChange(it))
|
||||
}
|
||||
requireComponents.core.tabCollectionStorage.getCollections().observe(this, observer)
|
||||
|
@ -509,6 +511,7 @@ class HomeFragment : Fragment(), CoroutineScope {
|
|||
val selectedSet = if (selectedTabs == null) setOf() else setOf(selectedTabs)
|
||||
viewModel?.selectedTabs = selectedSet
|
||||
viewModel?.saveCollectionStep = SaveCollectionStep.SelectTabs
|
||||
viewModel?.tabCollections = requireComponents.core.tabCollectionStorage.cachedTabCollections
|
||||
|
||||
view?.let {
|
||||
val directions = HomeFragmentDirections.actionHomeFragmentToCreateCollectionFragment()
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
package org.mozilla.fenix.home.sessioncontrol
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.os.Parcelable
|
||||
import android.view.ViewGroup
|
||||
|
@ -13,10 +12,8 @@ import io.reactivex.Observer
|
|||
import kotlinx.android.parcel.Parcelize
|
||||
import org.mozilla.fenix.mvi.ViewState
|
||||
import org.mozilla.fenix.mvi.Change
|
||||
import mozilla.components.browser.session.Session
|
||||
import mozilla.components.feature.tab.collections.TabCollection as ACTabCollection
|
||||
import mozilla.components.feature.tab.collections.Tab as ComponentTab
|
||||
import org.mozilla.fenix.ext.components
|
||||
import org.mozilla.fenix.mvi.Action
|
||||
import org.mozilla.fenix.mvi.ActionBusFactory
|
||||
import org.mozilla.fenix.mvi.UIComponent
|
||||
|
@ -124,10 +121,6 @@ class SessionControlViewModel(
|
|||
initialState: SessionControlState
|
||||
) : UIComponentViewModelBase<SessionControlState, SessionControlChange>(initialState, reducer) {
|
||||
companion object {
|
||||
fun getSessionFromTab(context: Context, tab: Tab): Session? {
|
||||
return context.components.core.sessionManager.findSessionById(tab.sessionId)
|
||||
}
|
||||
|
||||
val reducer: (SessionControlState, SessionControlChange) -> SessionControlState = { state, change ->
|
||||
when (change) {
|
||||
is SessionControlChange.CollectionsChange -> state.copy(collections = change.collections)
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
android:paddingBottom="12dp"
|
||||
android:textColor="?primaryText"
|
||||
android:textSize="16sp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@+id/divider"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:targetApi="m" />
|
||||
|
|
|
@ -43,13 +43,19 @@
|
|||
android:id="@+id/collections_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="5dp"
|
||||
android:background="@color/photonGreen50"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@+id/add_collection_button" />
|
||||
app:layout_constraintBottom_toTopOf="@id/add_collection_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/back_button"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/add_collection_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="5dp"
|
||||
android:background="?foundation"
|
||||
android:drawableStart="@drawable/ic_new"
|
||||
android:drawablePadding="14dp"
|
||||
|
@ -61,7 +67,7 @@
|
|||
android:textColor="?primaryText"
|
||||
android:textSize="16sp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@+id/divider"
|
||||
app:layout_constraintBottom_toTopOf="@id/divider"
|
||||
tools:targetApi="m" />
|
||||
|
||||
<View
|
||||
|
@ -82,7 +88,7 @@
|
|||
android:focusedByDefault="true"
|
||||
android:imeOptions="actionDone"
|
||||
android:importantForAutofill="no"
|
||||
android:inputType="text"
|
||||
android:inputType="textCapSentences"
|
||||
android:paddingStart="20dp"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingEnd="20dp"
|
||||
|
@ -98,10 +104,12 @@
|
|||
android:id="@+id/tab_list"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:elevation="0dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/add_tabs_layout"
|
||||
android:requiresFadingEdge="vertical"
|
||||
app:layout_constraintBottom_toTopOf="@id/add_tabs_layout"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/back_button" />
|
||||
|
@ -113,7 +121,7 @@
|
|||
android:alpha="0"
|
||||
android:background="@drawable/scrim_background"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/tab_list"
|
||||
app:layout_constraintBottom_toBottomOf="@id/tab_list"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
@ -155,7 +163,7 @@
|
|||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/save_button"
|
||||
app:layout_constraintEnd_toStartOf="@id/save_button"
|
||||
app:layout_constraintStart_toEndOf="@id/close_icon"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
|
|
|
@ -44,16 +44,14 @@
|
|||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/collections_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:alpha="0"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@+id/add_collection_button" />
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintTop_toBottomOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/add_collection_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:alpha="0"
|
||||
android:layout_height="0dp"
|
||||
android:background="?foundation"
|
||||
android:drawableStart="@drawable/ic_new"
|
||||
android:drawablePadding="14dp"
|
||||
|
@ -64,8 +62,8 @@
|
|||
android:text="@string/create_collection_add_new_collection"
|
||||
android:textColor="?primaryText"
|
||||
android:textSize="16sp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@+id/divider"
|
||||
app:layout_constraintTop_toBottomOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
tools:targetApi="m" />
|
||||
|
||||
<View
|
||||
|
@ -87,7 +85,7 @@
|
|||
android:focusedByDefault="true"
|
||||
android:imeOptions="actionDone"
|
||||
android:importantForAutofill="no"
|
||||
android:inputType="text"
|
||||
android:inputType="textCapSentences"
|
||||
android:paddingStart="20dp"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingEnd="20dp"
|
||||
|
@ -108,7 +106,7 @@
|
|||
android:layout_marginEnd="16dp"
|
||||
android:fadingEdgeLength="30dp"
|
||||
android:requiresFadingEdge="vertical"
|
||||
app:layout_constraintBottom_toTopOf="@+id/name_collection_edittext"
|
||||
app:layout_constraintBottom_toTopOf="@id/name_collection_edittext"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/back_button" />
|
||||
|
@ -164,7 +162,7 @@
|
|||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/save_button"
|
||||
app:layout_constraintEnd_toStartOf="@id/save_button"
|
||||
app:layout_constraintStart_toEndOf="@id/close_icon"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
|
|
|
@ -45,14 +45,19 @@
|
|||
android:id="@+id/collections_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="5dp"
|
||||
android:alpha="1"
|
||||
android:background="?foundation"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toTopOf="@+id/add_collection_button" />
|
||||
app:layout_constraintBottom_toTopOf="@id/add_collection_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/add_collection_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="5dp"
|
||||
android:alpha="1"
|
||||
android:background="?foundation"
|
||||
android:drawableStart="@drawable/ic_new"
|
||||
|
@ -65,7 +70,7 @@
|
|||
android:textColor="?primaryText"
|
||||
android:textSize="16sp"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toTopOf="@+id/divider"
|
||||
app:layout_constraintBottom_toTopOf="@id/divider"
|
||||
tools:targetApi="m" />
|
||||
|
||||
<View
|
||||
|
@ -88,7 +93,7 @@
|
|||
android:focusedByDefault="true"
|
||||
android:imeOptions="actionDone"
|
||||
android:importantForAutofill="no"
|
||||
android:inputType="text"
|
||||
android:inputType="textCapSentences"
|
||||
android:paddingStart="20dp"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingEnd="20dp"
|
||||
|
@ -102,6 +107,7 @@
|
|||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/tab_list"
|
||||
android:elevation="0dp"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="16dp"
|
||||
|
@ -109,7 +115,7 @@
|
|||
android:layout_marginEnd="16dp"
|
||||
android:fadingEdgeLength="30dp"
|
||||
android:requiresFadingEdge="vertical"
|
||||
app:layout_constraintBottom_toTopOf="@+id/collections_list"
|
||||
app:layout_constraintBottom_toTopOf="@id/add_collection_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/back_button" />
|
||||
|
@ -121,7 +127,7 @@
|
|||
android:alpha="0.5"
|
||||
android:background="@drawable/scrim_background"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/tab_list"
|
||||
app:layout_constraintBottom_toTopOf="@id/collections_list"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
@ -165,7 +171,7 @@
|
|||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/save_button"
|
||||
app:layout_constraintEnd_toStartOf="@id/save_button"
|
||||
app:layout_constraintStart_toEndOf="@id/close_icon"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
|
|
Loading…
Reference in New Issue