1
0
Fork 0

For #1574: Displays previous tab collections when creating

master
Sawyer Blatz 2019-05-16 14:35:15 -07:00
parent 60e5f8a626
commit 4e6f9b9ef1
12 changed files with 64 additions and 38 deletions

View File

@ -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 {

View File

@ -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() {

View File

@ -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

View File

@ -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>()
}

View File

@ -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 {

View File

@ -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)
}

View File

@ -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()

View File

@ -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)

View File

@ -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" />

View File

@ -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" />

View File

@ -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" />

View File

@ -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" />