Bug 1822446 - Add OnboardingController for handling onboarding functionality

fenix/113.0
Gabriel Luong 1 year ago committed by mergify[bot]
parent 72d5c2dd92
commit f884503a34

@ -124,6 +124,7 @@ import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHol
import org.mozilla.fenix.home.topsites.DefaultTopSitesView import org.mozilla.fenix.home.topsites.DefaultTopSitesView
import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.onboarding.FenixOnboarding import org.mozilla.fenix.onboarding.FenixOnboarding
import org.mozilla.fenix.onboarding.controller.DefaultOnboardingController
import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks
import org.mozilla.fenix.perf.runBlockingIncrement import org.mozilla.fenix.perf.runBlockingIncrement
import org.mozilla.fenix.search.toolbar.SearchSelectorMenu import org.mozilla.fenix.search.toolbar.SearchSelectorMenu
@ -390,7 +391,6 @@ class HomeFragment : Fragment() {
appStore = components.appStore, appStore = components.appStore,
navController = findNavController(), navController = findNavController(),
viewLifecycleScope = viewLifecycleOwner.lifecycleScope, viewLifecycleScope = viewLifecycleOwner.lifecycleScope,
hideOnboarding = ::hideOnboardingAndOpenSearch,
registerCollectionStorageObserver = ::registerCollectionStorageObserver, registerCollectionStorageObserver = ::registerCollectionStorageObserver,
removeCollectionWithUndo = ::removeCollectionWithUndo, removeCollectionWithUndo = ::removeCollectionWithUndo,
showTabTray = ::openTabsTray, showTabTray = ::openTabsTray,
@ -423,6 +423,10 @@ class HomeFragment : Fragment() {
homeActivity = activity, homeActivity = activity,
appStore = components.appStore, appStore = components.appStore,
), ),
onboardingController = DefaultOnboardingController(
activity = activity,
hideOnboarding = ::hideOnboardingAndOpenSearch,
),
) )
updateLayout(binding.root) updateLayout(binding.root)

@ -143,16 +143,6 @@ interface SessionControlController {
*/ */
fun handleSponsorPrivacyClicked() fun handleSponsorPrivacyClicked()
/**
* @see [OnboardingInteractor.onStartBrowsingClicked]
*/
fun handleStartBrowsingClicked()
/**
* @see [OnboardingInteractor.onReadPrivacyNoticeClicked]
*/
fun handleReadPrivacyNoticeClicked()
/** /**
* @see [CollectionInteractor.onToggleCollectionExpanded] * @see [CollectionInteractor.onToggleCollectionExpanded]
*/ */
@ -229,7 +219,6 @@ class DefaultSessionControlController(
private val appStore: AppStore, private val appStore: AppStore,
private val navController: NavController, private val navController: NavController,
private val viewLifecycleScope: CoroutineScope, private val viewLifecycleScope: CoroutineScope,
private val hideOnboarding: () -> Unit,
private val registerCollectionStorageObserver: () -> Unit, private val registerCollectionStorageObserver: () -> Unit,
private val removeCollectionWithUndo: (tabCollection: TabCollection) -> Unit, private val removeCollectionWithUndo: (tabCollection: TabCollection) -> Unit,
private val showTabTray: () -> Unit, private val showTabTray: () -> Unit,
@ -486,10 +475,6 @@ class DefaultSessionControlController(
return url return url
} }
override fun handleStartBrowsingClicked() {
hideOnboarding()
}
override fun handleCustomizeHomeTapped() { override fun handleCustomizeHomeTapped() {
val directions = HomeFragmentDirections.actionGlobalHomeSettingsFragment() val directions = HomeFragmentDirections.actionGlobalHomeSettingsFragment()
navController.nav(navController.currentDestination?.id, directions) navController.nav(navController.currentDestination?.id, directions)
@ -515,16 +500,6 @@ class DefaultSessionControlController(
} }
} }
} }
override fun handleReadPrivacyNoticeClicked() {
activity.startActivity(
SupportUtils.createCustomTabIntent(
activity,
SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.PRIVATE_NOTICE),
),
)
}
override fun handleToggleCollectionExpanded(collection: TabCollection, expand: Boolean) { override fun handleToggleCollectionExpanded(collection: TabCollection, expand: Boolean) {
appStore.dispatch(AppAction.CollectionExpanded(collection, expand)) appStore.dispatch(AppAction.CollectionExpanded(collection, expand))
} }

@ -27,6 +27,7 @@ import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryGrou
import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryHighlight import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryHighlight
import org.mozilla.fenix.home.recentvisits.controller.RecentVisitsController import org.mozilla.fenix.home.recentvisits.controller.RecentVisitsController
import org.mozilla.fenix.home.recentvisits.interactor.RecentVisitsInteractor import org.mozilla.fenix.home.recentvisits.interactor.RecentVisitsInteractor
import org.mozilla.fenix.onboarding.controller.OnboardingController
import org.mozilla.fenix.onboarding.interactor.OnboardingInteractor import org.mozilla.fenix.onboarding.interactor.OnboardingInteractor
import org.mozilla.fenix.search.toolbar.SearchSelectorInteractor import org.mozilla.fenix.search.toolbar.SearchSelectorInteractor
import org.mozilla.fenix.search.toolbar.SearchSelectorMenu import org.mozilla.fenix.search.toolbar.SearchSelectorMenu
@ -234,7 +235,7 @@ interface WallpaperInteractor {
* ExperimentCardInteractor, RecentTabInteractor, RecentBookmarksInteractor * ExperimentCardInteractor, RecentTabInteractor, RecentBookmarksInteractor
* and others. * and others.
*/ */
@SuppressWarnings("TooManyFunctions") @SuppressWarnings("TooManyFunctions", "LongParameterList")
class SessionControlInteractor( class SessionControlInteractor(
private val controller: SessionControlController, private val controller: SessionControlController,
private val recentTabController: RecentTabController, private val recentTabController: RecentTabController,
@ -242,6 +243,7 @@ class SessionControlInteractor(
private val recentBookmarksController: RecentBookmarksController, private val recentBookmarksController: RecentBookmarksController,
private val recentVisitsController: RecentVisitsController, private val recentVisitsController: RecentVisitsController,
private val pocketStoriesController: PocketStoriesController, private val pocketStoriesController: PocketStoriesController,
private val onboardingController: OnboardingController,
) : CollectionInteractor, ) : CollectionInteractor,
OnboardingInteractor, OnboardingInteractor,
TopSiteInteractor, TopSiteInteractor,
@ -310,11 +312,11 @@ class SessionControlInteractor(
} }
override fun onStartBrowsingClicked() { override fun onStartBrowsingClicked() {
controller.handleStartBrowsingClicked() onboardingController.handleStartBrowsingClicked()
} }
override fun onReadPrivacyNoticeClicked() { override fun onReadPrivacyNoticeClicked() {
controller.handleReadPrivacyNoticeClicked() onboardingController.handleReadPrivacyNoticeClicked()
} }
override fun showWallpapersOnboardingDialog(state: WallpaperState): Boolean { override fun showWallpapersOnboardingDialog(state: WallpaperState): Boolean {

@ -0,0 +1,46 @@
/* 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.onboarding.controller
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.onboarding.interactor.OnboardingInteractor
import org.mozilla.fenix.settings.SupportUtils
/**
* An interface that handles the view manipulation of the first run onboarding.
*/
interface OnboardingController {
/**
* @see [OnboardingInteractor.onStartBrowsingClicked]
*/
fun handleStartBrowsingClicked()
/**
* @see [OnboardingInteractor.onReadPrivacyNoticeClicked]
*/
fun handleReadPrivacyNoticeClicked()
}
/**
* The default implementation of [OnboardingController].
*/
class DefaultOnboardingController(
private val activity: HomeActivity,
private val hideOnboarding: () -> Unit,
) : OnboardingController {
override fun handleStartBrowsingClicked() {
hideOnboarding()
}
override fun handleReadPrivacyNoticeClicked() {
activity.startActivity(
SupportUtils.createCustomTabIntent(
activity,
SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.PRIVATE_NOTICE),
),
)
}
}

@ -11,11 +11,8 @@ import io.mockk.Runs
import io.mockk.every import io.mockk.every
import io.mockk.just import io.mockk.just
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.mockkStatic import io.mockk.mockkStatic
import io.mockk.slot
import io.mockk.spyk import io.mockk.spyk
import io.mockk.unmockkObject
import io.mockk.unmockkStatic import io.mockk.unmockkStatic
import io.mockk.verify import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -957,34 +954,6 @@ class DefaultSessionControlControllerTest {
assertFalse(createController().handleShowWallpapersOnboardingDialog(wallpaperState)) assertFalse(createController().handleShowWallpapersOnboardingDialog(wallpaperState))
} }
@Test
fun handleStartBrowsingClicked() {
var hideOnboardingInvoked = false
createController(hideOnboarding = { hideOnboardingInvoked = true }).handleStartBrowsingClicked()
assertTrue(hideOnboardingInvoked)
}
@Test
fun handleReadPrivacyNoticeClicked() {
mockkObject(SupportUtils)
val urlCaptor = slot<String>()
every { SupportUtils.createCustomTabIntent(any(), capture(urlCaptor)) } returns mockk()
createController().handleReadPrivacyNoticeClicked()
verify {
activity.startActivity(
any(),
)
}
assertEquals(
SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.PRIVATE_NOTICE),
urlCaptor.captured,
)
unmockkObject(SupportUtils)
}
@Test @Test
fun handleToggleCollectionExpanded() { fun handleToggleCollectionExpanded() {
val collection = mockk<TabCollection>() val collection = mockk<TabCollection>()
@ -1323,7 +1292,6 @@ class DefaultSessionControlControllerTest {
} }
private fun createController( private fun createController(
hideOnboarding: () -> Unit = { },
registerCollectionStorageObserver: () -> Unit = { }, registerCollectionStorageObserver: () -> Unit = { },
showTabTray: () -> Unit = { }, showTabTray: () -> Unit = { },
removeCollectionWithUndo: (tabCollection: TabCollection) -> Unit = { }, removeCollectionWithUndo: (tabCollection: TabCollection) -> Unit = { },
@ -1342,7 +1310,6 @@ class DefaultSessionControlControllerTest {
appStore = appStore, appStore = appStore,
navController = navController, navController = navController,
viewLifecycleScope = scope, viewLifecycleScope = scope,
hideOnboarding = hideOnboarding,
registerCollectionStorageObserver = registerCollectionStorageObserver, registerCollectionStorageObserver = registerCollectionStorageObserver,
removeCollectionWithUndo = removeCollectionWithUndo, removeCollectionWithUndo = removeCollectionWithUndo,
showTabTray = showTabTray, showTabTray = showTabTray,

@ -24,6 +24,7 @@ import org.mozilla.fenix.home.recenttabs.controller.RecentTabController
import org.mozilla.fenix.home.recentvisits.controller.RecentVisitsController import org.mozilla.fenix.home.recentvisits.controller.RecentVisitsController
import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController
import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor
import org.mozilla.fenix.onboarding.controller.OnboardingController
class SessionControlInteractorTest { class SessionControlInteractorTest {
@ -32,6 +33,7 @@ class SessionControlInteractorTest {
private val recentSyncedTabController: RecentSyncedTabController = mockk(relaxed = true) private val recentSyncedTabController: RecentSyncedTabController = mockk(relaxed = true)
private val recentBookmarksController: RecentBookmarksController = mockk(relaxed = true) private val recentBookmarksController: RecentBookmarksController = mockk(relaxed = true)
private val pocketStoriesController: PocketStoriesController = mockk(relaxed = true) private val pocketStoriesController: PocketStoriesController = mockk(relaxed = true)
private val onboardingController: OnboardingController = mockk(relaxed = true)
// Note: the recent visits tests are handled in [RecentVisitsInteractorTest] and [RecentVisitsControllerTest] // Note: the recent visits tests are handled in [RecentVisitsInteractorTest] and [RecentVisitsControllerTest]
private val recentVisitsController: RecentVisitsController = mockk(relaxed = true) private val recentVisitsController: RecentVisitsController = mockk(relaxed = true)
@ -47,6 +49,7 @@ class SessionControlInteractorTest {
recentBookmarksController, recentBookmarksController,
recentVisitsController, recentVisitsController,
pocketStoriesController, pocketStoriesController,
onboardingController,
) )
} }
@ -109,7 +112,13 @@ class SessionControlInteractorTest {
@Test @Test
fun onStartBrowsingClicked() { fun onStartBrowsingClicked() {
interactor.onStartBrowsingClicked() interactor.onStartBrowsingClicked()
verify { controller.handleStartBrowsingClicked() } verify { onboardingController.handleStartBrowsingClicked() }
}
@Test
fun onReadPrivacyNoticeClicked() {
interactor.onReadPrivacyNoticeClicked()
verify { onboardingController.handleReadPrivacyNoticeClicked() }
} }
@Test @Test

@ -20,6 +20,7 @@ import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryHigh
import org.mozilla.fenix.home.recentvisits.controller.RecentVisitsController import org.mozilla.fenix.home.recentvisits.controller.RecentVisitsController
import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController
import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor
import org.mozilla.fenix.onboarding.controller.OnboardingController
class RecentVisitsInteractorTest { class RecentVisitsInteractorTest {
private val defaultSessionControlController: DefaultSessionControlController = private val defaultSessionControlController: DefaultSessionControlController =
@ -29,6 +30,7 @@ class RecentVisitsInteractorTest {
private val recentBookmarksController: RecentBookmarksController = mockk(relaxed = true) private val recentBookmarksController: RecentBookmarksController = mockk(relaxed = true)
private val pocketStoriesController: PocketStoriesController = mockk(relaxed = true) private val pocketStoriesController: PocketStoriesController = mockk(relaxed = true)
private val recentVisitsController: RecentVisitsController = mockk(relaxed = true) private val recentVisitsController: RecentVisitsController = mockk(relaxed = true)
private val onboardingController: OnboardingController = mockk(relaxed = true)
private lateinit var interactor: SessionControlInteractor private lateinit var interactor: SessionControlInteractor
@ -41,6 +43,7 @@ class RecentVisitsInteractorTest {
recentBookmarksController, recentBookmarksController,
recentVisitsController, recentVisitsController,
pocketStoriesController, pocketStoriesController,
onboardingController,
) )
} }

@ -0,0 +1,58 @@
/* 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.onboarding
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.slot
import io.mockk.unmockkObject
import io.mockk.verify
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.onboarding.controller.DefaultOnboardingController
import org.mozilla.fenix.settings.SupportUtils
class DefaultOnboardingControllerTest {
private val activity: HomeActivity = mockk(relaxed = true)
@Test
fun handleStartBrowsingClicked() {
var hideOnboardingInvoked = false
createController(hideOnboarding = { hideOnboardingInvoked = true }).handleStartBrowsingClicked()
assertTrue(hideOnboardingInvoked)
}
@Test
fun handleReadPrivacyNoticeClicked() {
mockkObject(SupportUtils)
val urlCaptor = slot<String>()
every { SupportUtils.createCustomTabIntent(any(), capture(urlCaptor)) } returns mockk()
createController().handleReadPrivacyNoticeClicked()
verify {
activity.startActivity(
any(),
)
}
assertEquals(
SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.PRIVATE_NOTICE),
urlCaptor.captured,
)
unmockkObject(SupportUtils)
}
private fun createController(
hideOnboarding: () -> Unit = {},
) = DefaultOnboardingController(
activity = activity,
hideOnboarding = hideOnboarding,
)
}
Loading…
Cancel
Save