diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index b4dd4ac2e..ec342fe93 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -664,7 +664,7 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope { ViewModelProviders.of(this).get(CreateCollectionViewModel::class.java) } viewModel?.tabs = listOf(tabs) - val selectedSet = setOf(tabs) + val selectedSet = mutableSetOf(tabs) viewModel?.selectedTabs = selectedSet viewModel?.saveCollectionStep = SaveCollectionStep.SelectCollection view?.let { diff --git a/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionFragment.kt b/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionFragment.kt index 3692e2682..e855feba2 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionFragment.kt @@ -19,11 +19,11 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import org.mozilla.fenix.FenixViewModelProvider -import mozilla.components.browser.session.Session import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.home.sessioncontrol.toSessionBundle import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.getAutoDisposeObservable import org.mozilla.fenix.mvi.getManagedEmitter @@ -32,6 +32,8 @@ import kotlin.coroutines.CoroutineContext class CreateCollectionFragment : DialogFragment(), CoroutineScope { private lateinit var collectionCreationComponent: CollectionCreationComponent private lateinit var job: Job + private lateinit var viewModel: CreateCollectionViewModel + override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job @@ -49,13 +51,9 @@ class CreateCollectionFragment : DialogFragment(), CoroutineScope { job = Job() val view = inflater.inflate(R.layout.fragment_create_collection, container, false) - val viewModel = activity?.run { + viewModel = activity!!.run { ViewModelProviders.of(this).get(CreateCollectionViewModel::class.java) } - val tabs = viewModel!!.tabs - val selectedTabs = viewModel.selectedTabs - val step = viewModel.saveCollectionStep - val tabCollections = viewModel.tabCollections collectionCreationComponent = CollectionCreationComponent( view.create_collection_wrapper, @@ -64,7 +62,12 @@ class CreateCollectionFragment : DialogFragment(), CoroutineScope { this, CollectionCreationViewModel::class.java ) { - CollectionCreationViewModel(CollectionCreationState(tabs, selectedTabs, step, tabCollections)) + CollectionCreationViewModel(CollectionCreationState( + viewModel.tabs, + viewModel.selectedTabs, + viewModel.saveCollectionStep, + viewModel.tabCollections + )) } ) return view @@ -98,10 +101,16 @@ class CreateCollectionFragment : DialogFragment(), CoroutineScope { getManagedEmitter() .onNext(CollectionCreationChange.StepChanged(SaveCollectionStep.SelectCollection)) } - is CollectionCreationAction.AddTabToSelection -> getManagedEmitter() - .onNext(CollectionCreationChange.TabAdded(it.tab)) - is CollectionCreationAction.RemoveTabFromSelection -> getManagedEmitter() - .onNext(CollectionCreationChange.TabRemoved(it.tab)) + is CollectionCreationAction.AddTabToSelection -> { + viewModel.selectedTabs.add(it.tab) + getManagedEmitter() + .onNext(CollectionCreationChange.TabAdded(it.tab)) + } + is CollectionCreationAction.RemoveTabFromSelection -> { + viewModel.selectedTabs.remove(it.tab) + getManagedEmitter() + .onNext(CollectionCreationChange.TabRemoved(it.tab)) + } is CollectionCreationAction.SelectAllTapped -> getManagedEmitter() .onNext(CollectionCreationChange.AddAllTabs) is CollectionCreationAction.AddNewCollection -> getManagedEmitter().onNext( @@ -111,16 +120,22 @@ class CreateCollectionFragment : DialogFragment(), CoroutineScope { is CollectionCreationAction.SaveCollectionName -> { showSavedSnackbar(it.tabs.size) dismiss() - - val sessionBundle = mutableListOf() - it.tabs.forEach { - requireComponents.core.sessionManager.findSessionById(it.sessionId)?.let { session -> - sessionBundle.add(session) + context?.let { context -> + val sessionBundle = it.tabs.toSessionBundle(context) + launch(Dispatchers.IO) { + requireComponents.core.tabCollectionStorage.createCollection(it.name, sessionBundle) } } - - launch(Dispatchers.IO) { - requireComponents.core.tabCollectionStorage.createCollection(it.name, sessionBundle) + } + is CollectionCreationAction.SelectCollection -> { + showSavedSnackbar(viewModel.selectedTabs.size) + dismiss() + context?.let { context -> + val sessionBundle = viewModel.selectedTabs.toList().toSessionBundle(context) + launch(Dispatchers.IO) { + requireComponents.core.tabCollectionStorage + .addTabsToCollection(it.collection, sessionBundle) + } } } } diff --git a/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionViewModel.kt b/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionViewModel.kt index cc599c26d..9d480e9d0 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionViewModel.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CreateCollectionViewModel.kt @@ -9,7 +9,7 @@ import org.mozilla.fenix.home.sessioncontrol.Tab import org.mozilla.fenix.home.sessioncontrol.TabCollection class CreateCollectionViewModel : ViewModel() { - var selectedTabs = setOf() + var selectedTabs = mutableSetOf() var tabs = listOf() var saveCollectionStep: SaveCollectionStep = SaveCollectionStep.SelectTabs var tabCollections = listOf() diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 01c914e28..7161c134f 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -534,10 +534,10 @@ class HomeFragment : Fragment(), CoroutineScope { } viewModel?.tabs = tabs val selectedTabs = tabs.find { tab -> tab.sessionId == selectedTabId } - val selectedSet = if (selectedTabs == null) setOf() else setOf(selectedTabs) + val selectedSet = if (selectedTabs == null) mutableSetOf() else mutableSetOf(selectedTabs) viewModel?.selectedTabs = selectedSet viewModel?.saveCollectionStep = SaveCollectionStep.SelectTabs - viewModel?.tabCollections = requireComponents.core.tabCollectionStorage.cachedTabCollections + viewModel?.tabCollections = requireComponents.core.tabCollectionStorage.cachedTabCollections.reversed() view?.let { val directions = HomeFragmentDirections.actionHomeFragmentToCreateCollectionFragment() diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt index a9d3bb87e..1246f6102 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt @@ -4,12 +4,15 @@ package org.mozilla.fenix.home.sessioncontrol +import android.content.Context import android.graphics.Bitmap import android.os.Parcelable import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import io.reactivex.Observer import kotlinx.android.parcel.Parcelize +import mozilla.components.browser.session.Session +import org.mozilla.fenix.ext.components import org.mozilla.fenix.mvi.ViewState import org.mozilla.fenix.mvi.Change import mozilla.components.feature.tab.collections.TabCollection as ACTabCollection @@ -51,6 +54,16 @@ data class Tab( val thumbnail: Bitmap? = null ) : Parcelable +fun List.toSessionBundle(context: Context): MutableList { + val sessionBundle = mutableListOf() + this.forEach { + context.components.core.sessionManager.findSessionById(it.sessionId)?.let { session -> + sessionBundle.add(session) + } + } + + return sessionBundle +} sealed class Mode { object Normal : Mode() object Private : Mode() diff --git a/app/src/main/res/layout/collections_list_item.xml b/app/src/main/res/layout/collections_list_item.xml index ccbfc5051..68c0d03b0 100644 --- a/app/src/main/res/layout/collections_list_item.xml +++ b/app/src/main/res/layout/collections_list_item.xml @@ -6,7 +6,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:foreground="?android:attr/selectableItemBackground">