diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index d197544f5..d19f3c1af 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -8,7 +8,6 @@ import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.annotation.LayoutRes -import androidx.annotation.StringRes import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -19,7 +18,7 @@ import org.mozilla.fenix.home.OnboardingState import org.mozilla.fenix.home.Tab import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder -import org.mozilla.fenix.home.sessioncontrol.viewholders.NoContentMessageViewHolder +import org.mozilla.fenix.home.sessioncontrol.viewholders.NoCollectionsMessageViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.PrivateBrowsingDescriptionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSiteViewHolder @@ -42,10 +41,7 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) { ButtonTipViewHolder.LAYOUT_ID) data class TopSiteList(val topSites: List) : AdapterItem(TopSiteViewHolder.LAYOUT_ID) object PrivateBrowsingDescription : AdapterItem(PrivateBrowsingDescriptionViewHolder.LAYOUT_ID) - data class NoContentMessage( - @StringRes val header: Int, - @StringRes val description: Int - ) : AdapterItem(NoContentMessageViewHolder.LAYOUT_ID) + object NoCollectionsMessage : AdapterItem(NoCollectionsMessageViewHolder.LAYOUT_ID) object CollectionHeader : AdapterItem(CollectionHeaderViewHolder.LAYOUT_ID) data class CollectionItem( @@ -123,7 +119,7 @@ class SessionControlAdapter( ButtonTipViewHolder.LAYOUT_ID -> ButtonTipViewHolder(view, interactor) TopSiteViewHolder.LAYOUT_ID -> TopSiteViewHolder(view, interactor) PrivateBrowsingDescriptionViewHolder.LAYOUT_ID -> PrivateBrowsingDescriptionViewHolder(view, interactor) - NoContentMessageViewHolder.LAYOUT_ID -> NoContentMessageViewHolder(view) + NoCollectionsMessageViewHolder.LAYOUT_ID -> NoCollectionsMessageViewHolder(view, interactor) CollectionHeaderViewHolder.LAYOUT_ID -> CollectionHeaderViewHolder(view) CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, interactor) TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, interactor, differentLastItem = true) @@ -155,10 +151,6 @@ class SessionControlAdapter( is TopSiteViewHolder -> { holder.bind((item as AdapterItem.TopSiteList).topSites) } - is NoContentMessageViewHolder -> { - val (header, description) = item as AdapterItem.NoContentMessage - holder.bind(header, description) - } is CollectionViewHolder -> { val (collection, expanded) = item as AdapterItem.CollectionItem holder.bindSession(collection, expanded) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index bd8cdf6e4..aa0744459 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -120,6 +120,11 @@ interface SessionControlController { fun handleToggleCollectionExpanded(collection: TabCollection, expand: Boolean) fun handleCloseTip(tip: Tip) + + /** + * @see [CollectionInteractor.onAddTabsToCollectionTapped] + */ + fun handleCreateCollection() } @SuppressWarnings("TooManyFunctions", "LargeClass") @@ -301,6 +306,10 @@ class DefaultSessionControlController( navController.nav(R.id.homeFragment, directions) } + override fun handleCreateCollection() { + showCollectionCreationFragment(step = SaveCollectionStep.SelectTabs) + } + private fun showShareFragment(data: List) { val directions = HomeFragmentDirections.actionGlobalShareFragment( data = data.toTypedArray() diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt index 9b1c710f1..8481fbe68 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt @@ -88,6 +88,11 @@ interface CollectionInteractor { * @param expand True if the given tab collection should be expanded or collapse if false. */ fun onToggleCollectionExpanded(collection: TabCollection, expand: Boolean) + + /** + * Opens the collection creator + */ + fun onAddTabsToCollectionTapped() } /** @@ -219,6 +224,10 @@ class SessionControlInteractor( controller.handleToggleCollectionExpanded(collection, expand) } + override fun onAddTabsToCollectionTapped() { + controller.handleCreateCollection() + } + override fun onCloseTip(tip: Tip) { controller.handleCloseTip(tip) } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt index f35b8503f..41e4b1ad0 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt @@ -19,11 +19,6 @@ import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.OnboardingState import org.mozilla.fenix.components.tips.Tip -val noCollectionMessage = AdapterItem.NoContentMessage( - R.string.no_collections_header1, - R.string.no_collections_description1 -) - // This method got a little complex with the addition of the tab tray feature flag // When we remove the tabs from the home screen this will get much simpler again. @SuppressWarnings("LongParameterList", "ComplexMethod") @@ -43,7 +38,7 @@ private fun normalModeAdapterItems( if (collections.isEmpty()) { items.add(AdapterItem.CollectionHeader) - items.add(noCollectionMessage) + items.add(AdapterItem.NoCollectionsMessage) } else { showCollections(collections, expandedCollections, items) } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt new file mode 100644 index 000000000..8c7421856 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoCollectionsMessageViewHolder.kt @@ -0,0 +1,26 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +package org.mozilla.fenix.home.sessioncontrol.viewholders + +import android.view.View +import kotlinx.android.synthetic.main.no_collections_message.view.* +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.ViewHolder +import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor + +open class NoCollectionsMessageViewHolder( + view: View, + interactor: CollectionInteractor +) : ViewHolder(view) { + + init { + view.add_tabs_to_collections_button.setOnClickListener { + interactor.onAddTabsToCollectionTapped() + } + } + companion object { + const val LAYOUT_ID = R.layout.no_collections_message + } +} diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoContentMessageViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoContentMessageViewHolder.kt deleted file mode 100644 index bbbbfda95..000000000 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/NoContentMessageViewHolder.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * 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/. */ - -package org.mozilla.fenix.home.sessioncontrol.viewholders - -import android.view.View -import androidx.annotation.StringRes -import kotlinx.android.synthetic.main.no_content_message.* -import org.mozilla.fenix.R -import org.mozilla.fenix.ext.ViewHolder - -open class NoContentMessageViewHolder(view: View) : ViewHolder(view) { - - fun bind( - @StringRes header: Int, - @StringRes description: Int - ) { - with(itemView.context) { - no_content_header.text = getString(header) - no_content_description.text = getString(description) - } - } - - companion object { - const val LAYOUT_ID = R.layout.no_content_message - } -} diff --git a/app/src/main/res/layout/no_collections_message.xml b/app/src/main/res/layout/no_collections_message.xml new file mode 100644 index 000000000..45140ccd4 --- /dev/null +++ b/app/src/main/res/layout/no_collections_message.xml @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/no_content_message.xml b/app/src/main/res/layout/no_content_message.xml deleted file mode 100644 index fc7b99078..000000000 --- a/app/src/main/res/layout/no_content_message.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/layout/no_content_message_with_action.xml b/app/src/main/res/layout/no_content_message_with_action.xml deleted file mode 100644 index 90387cd43..000000000 --- a/app/src/main/res/layout/no_content_message_with_action.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 0a71e6b30..f54002236 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -24,10 +24,13 @@ import org.junit.Before import org.junit.Test import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.R +import org.mozilla.fenix.collections.SaveCollectionStep import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.nav import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController import org.mozilla.fenix.settings.SupportUtils import mozilla.components.feature.tab.collections.Tab as ComponentTab @@ -204,4 +207,11 @@ class DefaultSessionControlControllerTest { controller.handleToggleCollectionExpanded(collection, true) verify { fragmentStore.dispatch(HomeFragmentAction.CollectionExpanded(collection, true)) } } + + @Test + fun handleCreateCollection() { + controller.handleCreateCollection() + val directions = HomeFragmentDirections.actionGlobalCollectionCreationFragment(saveCollectionStep = SaveCollectionStep.SelectTabs) + verify { navController.nav(R.id.homeFragment, directions) } + } } diff --git a/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt b/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt index 47686efa7..56936dc32 100644 --- a/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt @@ -92,4 +92,10 @@ class SessionControlInteractorTest { interactor.onToggleCollectionExpanded(collection, true) verify { controller.handleToggleCollectionExpanded(collection, true) } } + + @Test + fun onAddTabsToCollection() { + interactor.onAddTabsToCollectionTapped() + verify { controller.handleCreateCollection() } + } }