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 94053577ca..fe80afd488 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 @@ -31,6 +31,7 @@ import org.mozilla.fenix.home.recenttabs.view.RecentTabViewHolder import org.mozilla.fenix.home.recenttabs.view.RecentTabsHeaderViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder +import org.mozilla.fenix.home.sessioncontrol.viewholders.CustomizeHomeButtonViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.NoCollectionsMessageViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.PrivateBrowsingDescriptionViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder @@ -163,6 +164,8 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) { object OnboardingWhatsNew : AdapterItem(OnboardingWhatsNewViewHolder.LAYOUT_ID) + object CustomizeHomeButton : AdapterItem(CustomizeHomeButtonViewHolder.LAYOUT_ID) + object RecentTabsHeader : AdapterItem(RecentTabsHeaderViewHolder.LAYOUT_ID) object RecentTabItem : AdapterItem(RecentTabViewHolder.LAYOUT_ID) @@ -250,7 +253,7 @@ class SessionControlAdapter( ) : ListAdapter(AdapterItemDiffCallback()) { // This method triggers the ComplexMethod lint error when in fact it's quite simple. - @SuppressWarnings("ComplexMethod") + @SuppressWarnings("ComplexMethod", "LongMethod") override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { when (viewType) { PocketStoriesViewHolder.LAYOUT_ID -> return PocketStoriesViewHolder( @@ -304,6 +307,7 @@ class SessionControlAdapter( view, interactor ) + CustomizeHomeButtonViewHolder.LAYOUT_ID -> CustomizeHomeButtonViewHolder(view, interactor) OnboardingFinishViewHolder.LAYOUT_ID -> OnboardingFinishViewHolder(view, interactor) OnboardingWhatsNewViewHolder.LAYOUT_ID -> OnboardingWhatsNewViewHolder(view, interactor) OnboardingToolbarPositionPickerViewHolder.LAYOUT_ID -> OnboardingToolbarPositionPickerViewHolder( 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 990dc7ac3f..44e4e90284 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 @@ -187,6 +187,11 @@ interface SessionControlController { * @see [TabSessionInteractor.onPrivateModeButtonClicked] */ fun handlePrivateModeButtonClicked(newMode: BrowsingMode, userHasBeenOnboarded: Boolean) + + /** + * @see [CustomizeHomeIteractor.openCustomizeHomePage] + */ + fun handleCustomizeHomeTapped() } @Suppress("TooManyFunctions", "LargeClass") @@ -452,6 +457,11 @@ class DefaultSessionControlController( navController.nav(R.id.homeFragment, directions) } + override fun handleCustomizeHomeTapped() { + val directions = HomeFragmentDirections.actionGlobalCustomizationFragment() + navController.nav(R.id.homeFragment, directions) + } + override fun handleWhatsNewGetAnswersClicked() { activity.openToBrowserAndLoad( searchTermOrURL = SupportUtils.getWhatsNewUrl(activity), 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 49deaa8a65..c01ec07250 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 @@ -165,6 +165,13 @@ interface TipInteractor { fun onCloseTip(tip: Tip) } +interface CustomizeHomeIteractor { + /** + * Opens the customize home settings page. + */ + fun openCustomizeHomePage() +} + /** * Interface for top site related actions in the [SessionControlInteractor]. */ @@ -237,7 +244,8 @@ class SessionControlInteractor( ExperimentCardInteractor, RecentTabInteractor, RecentBookmarksInteractor, - HistoryMetadataInteractor { + HistoryMetadataInteractor, + CustomizeHomeIteractor { override fun onCollectionAddTabTapped(collection: TabCollection) { controller.handleCollectionAddTabTapped(collection) @@ -376,4 +384,8 @@ class SessionControlInteractor( historyMetadataGroup ) } + + override fun openCustomizeHomePage() { + controller.handleCustomizeHomeTapped() + } } 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 d82f0eea4f..383c2a3319 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 @@ -6,6 +6,7 @@ package org.mozilla.fenix.home.sessioncontrol import android.content.Context import android.view.View +import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager @@ -28,7 +29,8 @@ import org.mozilla.fenix.home.OnboardingState // 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. @Suppress("ComplexMethod", "LongParameterList") -private fun normalModeAdapterItems( +@VisibleForTesting +internal fun normalModeAdapterItems( context: Context, topSites: List, collections: List, @@ -42,6 +44,7 @@ private fun normalModeAdapterItems( pocketArticles: List ): List { val items = mutableListOf() + var shouldShowCustomizeHome = false tip?.let { items.add(AdapterItem.TipItem(it)) } @@ -54,15 +57,18 @@ private fun normalModeAdapterItems( } if (recentTabs.isNotEmpty()) { + shouldShowCustomizeHome = true items.add(AdapterItem.RecentTabsHeader) items.add(AdapterItem.RecentTabItem) } if (recentBookmarks.isNotEmpty()) { + shouldShowCustomizeHome = true items.add(AdapterItem.RecentBookmarks(recentBookmarks)) } if (historyMetadata.isNotEmpty()) { + shouldShowCustomizeHome = true showHistoryMetadata(historyMetadata, items) } @@ -75,9 +81,14 @@ private fun normalModeAdapterItems( } if (context.settings().pocketRecommendations && pocketArticles.isNotEmpty()) { + shouldShowCustomizeHome = true items.add(AdapterItem.PocketStoriesItem) } + if (shouldShowCustomizeHome) { + items.add(AdapterItem.CustomizeHomeButton) + } + return items } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt new file mode 100644 index 0000000000..3b01a974e7 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CustomizeHomeButtonViewHolder.kt @@ -0,0 +1,29 @@ +/* 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.recyclerview.widget.RecyclerView +import org.mozilla.fenix.R +import org.mozilla.fenix.databinding.CustomizeHomeListItemBinding +import org.mozilla.fenix.home.sessioncontrol.CustomizeHomeIteractor + +class CustomizeHomeButtonViewHolder( + view: View, + private val interactor: CustomizeHomeIteractor +) : RecyclerView.ViewHolder(view) { + + init { + val binding = CustomizeHomeListItemBinding.bind(view) + + binding.customizeHome.setOnClickListener { + interactor.openCustomizeHomePage() + } + } + + companion object { + const val LAYOUT_ID = R.layout.customize_home_list_item + } +} diff --git a/app/src/main/res/layout/customize_home_list_item.xml b/app/src/main/res/layout/customize_home_list_item.xml new file mode 100644 index 0000000000..18a159b317 --- /dev/null +++ b/app/src/main/res/layout/customize_home_list_item.xml @@ -0,0 +1,26 @@ + + + + + +