454 lines
15 KiB
Kotlin
454 lines
15 KiB
Kotlin
/* 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
|
|
|
|
import mozilla.components.feature.tab.collections.Tab
|
|
import mozilla.components.feature.tab.collections.TabCollection
|
|
import mozilla.components.feature.top.sites.TopSite
|
|
import mozilla.components.service.pocket.PocketRecommendedStory
|
|
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
|
import org.mozilla.fenix.components.appstate.AppState
|
|
import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory
|
|
import org.mozilla.fenix.home.pocket.PocketStoriesController
|
|
import org.mozilla.fenix.home.pocket.PocketStoriesInteractor
|
|
import org.mozilla.fenix.home.recentbookmarks.RecentBookmark
|
|
import org.mozilla.fenix.home.recentbookmarks.controller.RecentBookmarksController
|
|
import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor
|
|
import org.mozilla.fenix.home.recenttabs.RecentTab
|
|
import org.mozilla.fenix.home.recenttabs.controller.RecentTabController
|
|
import org.mozilla.fenix.home.recenttabs.interactor.RecentTabInteractor
|
|
import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryGroup
|
|
import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryHighlight
|
|
import org.mozilla.fenix.home.recentvisits.controller.RecentVisitsController
|
|
import org.mozilla.fenix.home.recentvisits.interactor.RecentVisitsInteractor
|
|
|
|
/**
|
|
* Interface for tab related actions in the [SessionControlInteractor].
|
|
*/
|
|
interface TabSessionInteractor {
|
|
/**
|
|
* Shows the Private Browsing Learn More page in a new tab. Called when a user clicks on the
|
|
* "Common myths about private browsing" link in private mode.
|
|
*/
|
|
fun onPrivateBrowsingLearnMoreClicked()
|
|
|
|
/**
|
|
* Called when a user clicks on the Private Mode button on the homescreen.
|
|
*/
|
|
fun onPrivateModeButtonClicked(newMode: BrowsingMode, userHasBeenOnboarded: Boolean)
|
|
|
|
/**
|
|
* Called when there is an update to the session state and updated metrics need to be reported
|
|
*
|
|
* * @param state The state the homepage from which to report desired metrics.
|
|
*/
|
|
fun reportSessionMetrics(state: AppState)
|
|
}
|
|
|
|
/**
|
|
* Interface for collection related actions in the [SessionControlInteractor].
|
|
*/
|
|
@SuppressWarnings("TooManyFunctions")
|
|
interface CollectionInteractor {
|
|
/**
|
|
* Shows the Collection Creation fragment for selecting the tabs to add to the given tab
|
|
* collection. Called when a user taps on the "Add tab" collection menu item.
|
|
*
|
|
* @param collection The collection of tabs that will be modified.
|
|
*/
|
|
fun onCollectionAddTabTapped(collection: TabCollection)
|
|
|
|
/**
|
|
* Opens the given tab. Called when a user clicks on a tab in the tab collection.
|
|
*
|
|
* @param tab The tab to open from the tab collection.
|
|
*/
|
|
fun onCollectionOpenTabClicked(tab: Tab)
|
|
|
|
/**
|
|
* Opens all the tabs in a given tab collection. Called when a user taps on the "Open tabs"
|
|
* collection menu item.
|
|
*
|
|
* @param collection The collection of tabs to open.
|
|
*/
|
|
fun onCollectionOpenTabsTapped(collection: TabCollection)
|
|
|
|
/**
|
|
* Removes the given tab from the given tab collection. Called when a user swipes to remove a
|
|
* tab or clicks on the tab close button.
|
|
*
|
|
* @param collection The collection of tabs that will be modified.
|
|
* @param tab The tab to remove from the tab collection.
|
|
*/
|
|
fun onCollectionRemoveTab(collection: TabCollection, tab: Tab, wasSwiped: Boolean)
|
|
|
|
/**
|
|
* Shares the tabs in the given tab collection. Called when a user clicks on the Collection
|
|
* Share button.
|
|
*
|
|
* @param collection The collection of tabs to share.
|
|
*/
|
|
fun onCollectionShareTabsClicked(collection: TabCollection)
|
|
|
|
/**
|
|
* Shows a prompt for deleting the given tab collection. Called when a user taps on the
|
|
* "Delete collection" collection menu item.
|
|
*
|
|
* @param collection The collection of tabs to delete.
|
|
*/
|
|
fun onDeleteCollectionTapped(collection: TabCollection)
|
|
|
|
/**
|
|
* Shows the Collection Creation fragment for renaming the given tab collection. Called when a
|
|
* user taps on the "Rename collection" collection menu item.
|
|
*
|
|
* @param collection The collection of tabs to rename.
|
|
*/
|
|
fun onRenameCollectionTapped(collection: TabCollection)
|
|
|
|
/**
|
|
* Toggles expanding or collapsing the given tab collection. Called when a user clicks on a
|
|
* [CollectionViewHolder].
|
|
*
|
|
* @param collection The collection of tabs that will be collapsed.
|
|
* @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()
|
|
|
|
/**
|
|
* User has removed the collections placeholder from home.
|
|
*/
|
|
fun onRemoveCollectionsPlaceholder()
|
|
|
|
/**
|
|
* User has opened collection 3 dot menu.
|
|
*/
|
|
fun onCollectionMenuOpened()
|
|
}
|
|
|
|
interface ToolbarInteractor {
|
|
/**
|
|
* Navigates to browser with clipboard text.
|
|
*/
|
|
fun onPasteAndGo(clipboardText: String)
|
|
|
|
/**
|
|
* Navigates to search with clipboard text.
|
|
*/
|
|
fun onPaste(clipboardText: String)
|
|
}
|
|
|
|
/**
|
|
* Interface for onboarding related actions in the [SessionControlInteractor].
|
|
*/
|
|
interface OnboardingInteractor {
|
|
/**
|
|
* Hides the onboarding and navigates to Search. Called when a user clicks on the "Start Browsing" button.
|
|
*/
|
|
fun onStartBrowsingClicked()
|
|
|
|
/**
|
|
* Opens a custom tab to privacy notice url. Called when a user clicks on the "read our privacy notice" button.
|
|
*/
|
|
fun onReadPrivacyNoticeClicked()
|
|
|
|
/**
|
|
* Show the onboarding dialog to onboard users about recentTabs,recentBookmarks,
|
|
* historyMetadata and pocketArticles sections.
|
|
*/
|
|
fun showOnboardingDialog()
|
|
}
|
|
|
|
interface CustomizeHomeIteractor {
|
|
/**
|
|
* Opens the customize home settings page.
|
|
*/
|
|
fun openCustomizeHomePage()
|
|
}
|
|
|
|
/**
|
|
* Interface for top site related actions in the [SessionControlInteractor].
|
|
*/
|
|
interface TopSiteInteractor {
|
|
/**
|
|
* Opens the given top site in private mode. Called when an user clicks on the "Open in private
|
|
* tab" top site menu item.
|
|
*
|
|
* @param topSite The top site that will be open in private mode.
|
|
*/
|
|
fun onOpenInPrivateTabClicked(topSite: TopSite)
|
|
|
|
/**
|
|
* Opens a dialog to rename the given top site. Called when an user clicks on the "Rename" top site menu item.
|
|
*
|
|
* @param topSite The top site that will be renamed.
|
|
*/
|
|
fun onRenameTopSiteClicked(topSite: TopSite)
|
|
|
|
/**
|
|
* Removes the given top site. Called when an user clicks on the "Remove" top site menu item.
|
|
*
|
|
* @param topSite The top site that will be removed.
|
|
*/
|
|
fun onRemoveTopSiteClicked(topSite: TopSite)
|
|
|
|
/**
|
|
* Selects the given top site. Called when a user clicks on a top site.
|
|
*
|
|
* @param topSite The top site that was selected.
|
|
* @param position The position of the top site.
|
|
*/
|
|
fun onSelectTopSite(topSite: TopSite, position: Int)
|
|
|
|
/**
|
|
* Navigates to the Homepage Settings. Called when an user clicks on the "Settings" top site
|
|
* menu item.
|
|
*/
|
|
fun onSettingsClicked()
|
|
|
|
/**
|
|
* Opens the sponsor privacy support articles. Called when an user clicks on the
|
|
* "Our sponsors & your privacy" top site menu item.
|
|
*/
|
|
fun onSponsorPrivacyClicked()
|
|
|
|
/**
|
|
* Called when top site menu is opened.
|
|
*/
|
|
fun onTopSiteMenuOpened()
|
|
}
|
|
|
|
/**
|
|
* Interface for interactions with the default browser card.
|
|
*/
|
|
interface ExperimentCardInteractor {
|
|
/**
|
|
* Called when set default browser button is clicked
|
|
*/
|
|
fun onSetDefaultBrowserClicked()
|
|
|
|
/**
|
|
* Called when close button on experiment card
|
|
*/
|
|
fun onCloseExperimentCardClicked()
|
|
}
|
|
|
|
/**
|
|
* Interactor for the Home screen. Provides implementations for the CollectionInteractor,
|
|
* OnboardingInteractor, TopSiteInteractor, TabSessionInteractor, ToolbarInteractor,
|
|
* ExperimentCardInteractor, RecentTabInteractor, RecentBookmarksInteractor
|
|
* and others.
|
|
*/
|
|
@SuppressWarnings("TooManyFunctions")
|
|
class SessionControlInteractor(
|
|
private val controller: SessionControlController,
|
|
private val recentTabController: RecentTabController,
|
|
private val recentBookmarksController: RecentBookmarksController,
|
|
private val recentVisitsController: RecentVisitsController,
|
|
private val pocketStoriesController: PocketStoriesController
|
|
) : CollectionInteractor,
|
|
OnboardingInteractor,
|
|
TopSiteInteractor,
|
|
TabSessionInteractor,
|
|
ToolbarInteractor,
|
|
ExperimentCardInteractor,
|
|
RecentTabInteractor,
|
|
RecentBookmarksInteractor,
|
|
RecentVisitsInteractor,
|
|
CustomizeHomeIteractor,
|
|
PocketStoriesInteractor {
|
|
|
|
override fun onCollectionAddTabTapped(collection: TabCollection) {
|
|
controller.handleCollectionAddTabTapped(collection)
|
|
}
|
|
|
|
override fun onCollectionOpenTabClicked(tab: Tab) {
|
|
controller.handleCollectionOpenTabClicked(tab)
|
|
}
|
|
|
|
override fun onCollectionOpenTabsTapped(collection: TabCollection) {
|
|
controller.handleCollectionOpenTabsTapped(collection)
|
|
}
|
|
|
|
override fun onCollectionRemoveTab(collection: TabCollection, tab: Tab, wasSwiped: Boolean) {
|
|
controller.handleCollectionRemoveTab(collection, tab, wasSwiped)
|
|
}
|
|
|
|
override fun onCollectionShareTabsClicked(collection: TabCollection) {
|
|
controller.handleCollectionShareTabsClicked(collection)
|
|
}
|
|
|
|
override fun onDeleteCollectionTapped(collection: TabCollection) {
|
|
controller.handleDeleteCollectionTapped(collection)
|
|
}
|
|
|
|
override fun onOpenInPrivateTabClicked(topSite: TopSite) {
|
|
controller.handleOpenInPrivateTabClicked(topSite)
|
|
}
|
|
|
|
override fun onRenameTopSiteClicked(topSite: TopSite) {
|
|
controller.handleRenameTopSiteClicked(topSite)
|
|
}
|
|
|
|
override fun onRemoveTopSiteClicked(topSite: TopSite) {
|
|
controller.handleRemoveTopSiteClicked(topSite)
|
|
}
|
|
|
|
override fun onRenameCollectionTapped(collection: TabCollection) {
|
|
controller.handleRenameCollectionTapped(collection)
|
|
}
|
|
|
|
override fun onSelectTopSite(topSite: TopSite, position: Int) {
|
|
controller.handleSelectTopSite(topSite, position)
|
|
}
|
|
|
|
override fun onSettingsClicked() {
|
|
controller.handleTopSiteSettingsClicked()
|
|
}
|
|
|
|
override fun onSponsorPrivacyClicked() {
|
|
controller.handleSponsorPrivacyClicked()
|
|
}
|
|
|
|
override fun onStartBrowsingClicked() {
|
|
controller.handleStartBrowsingClicked()
|
|
}
|
|
|
|
override fun onReadPrivacyNoticeClicked() {
|
|
controller.handleReadPrivacyNoticeClicked()
|
|
}
|
|
|
|
override fun showOnboardingDialog() {
|
|
controller.handleShowOnboardingDialog()
|
|
}
|
|
|
|
override fun onToggleCollectionExpanded(collection: TabCollection, expand: Boolean) {
|
|
controller.handleToggleCollectionExpanded(collection, expand)
|
|
}
|
|
|
|
override fun onAddTabsToCollectionTapped() {
|
|
controller.handleCreateCollection()
|
|
}
|
|
|
|
override fun onPrivateBrowsingLearnMoreClicked() {
|
|
controller.handlePrivateBrowsingLearnMoreClicked()
|
|
}
|
|
|
|
override fun onPrivateModeButtonClicked(newMode: BrowsingMode, userHasBeenOnboarded: Boolean) {
|
|
controller.handlePrivateModeButtonClicked(newMode, userHasBeenOnboarded)
|
|
}
|
|
|
|
override fun onPasteAndGo(clipboardText: String) {
|
|
controller.handlePasteAndGo(clipboardText)
|
|
}
|
|
|
|
override fun onPaste(clipboardText: String) {
|
|
controller.handlePaste(clipboardText)
|
|
}
|
|
|
|
override fun onRemoveCollectionsPlaceholder() {
|
|
controller.handleRemoveCollectionsPlaceholder()
|
|
}
|
|
|
|
override fun onCollectionMenuOpened() {
|
|
controller.handleMenuOpened()
|
|
}
|
|
|
|
override fun onTopSiteMenuOpened() {
|
|
controller.handleMenuOpened()
|
|
}
|
|
|
|
override fun onSetDefaultBrowserClicked() {
|
|
controller.handleSetDefaultBrowser()
|
|
}
|
|
|
|
override fun onCloseExperimentCardClicked() {
|
|
controller.handleCloseExperimentCard()
|
|
}
|
|
|
|
override fun onRecentTabClicked(tabId: String) {
|
|
recentTabController.handleRecentTabClicked(tabId)
|
|
}
|
|
|
|
override fun onRecentSearchGroupClicked(tabId: String) {
|
|
recentTabController.handleRecentSearchGroupClicked(tabId)
|
|
}
|
|
|
|
override fun onRecentTabShowAllClicked() {
|
|
recentTabController.handleRecentTabShowAllClicked()
|
|
}
|
|
|
|
override fun onRemoveRecentTab(tab: RecentTab.Tab) {
|
|
recentTabController.handleRecentTabRemoved(tab)
|
|
}
|
|
|
|
override fun onRecentBookmarkClicked(bookmark: RecentBookmark) {
|
|
recentBookmarksController.handleBookmarkClicked(bookmark)
|
|
}
|
|
|
|
override fun onShowAllBookmarksClicked() {
|
|
recentBookmarksController.handleShowAllBookmarksClicked()
|
|
}
|
|
|
|
override fun onRecentBookmarkRemoved(bookmark: RecentBookmark) {
|
|
recentBookmarksController.handleBookmarkRemoved(bookmark)
|
|
}
|
|
|
|
override fun onHistoryShowAllClicked() {
|
|
recentVisitsController.handleHistoryShowAllClicked()
|
|
}
|
|
|
|
override fun onRecentHistoryGroupClicked(recentHistoryGroup: RecentHistoryGroup) {
|
|
recentVisitsController.handleRecentHistoryGroupClicked(
|
|
recentHistoryGroup
|
|
)
|
|
}
|
|
|
|
override fun onRemoveRecentHistoryGroup(groupTitle: String) {
|
|
recentVisitsController.handleRemoveRecentHistoryGroup(groupTitle)
|
|
}
|
|
|
|
override fun onRecentHistoryHighlightClicked(recentHistoryHighlight: RecentHistoryHighlight) {
|
|
recentVisitsController.handleRecentHistoryHighlightClicked(recentHistoryHighlight)
|
|
}
|
|
|
|
override fun onRemoveRecentHistoryHighlight(highlightUrl: String) {
|
|
recentVisitsController.handleRemoveRecentHistoryHighlight(highlightUrl)
|
|
}
|
|
|
|
override fun openCustomizeHomePage() {
|
|
controller.handleCustomizeHomeTapped()
|
|
}
|
|
|
|
override fun onStoriesShown(storiesShown: List<PocketRecommendedStory>) {
|
|
pocketStoriesController.handleStoriesShown(storiesShown)
|
|
}
|
|
|
|
override fun onCategoryClicked(categoryClicked: PocketRecommendedStoriesCategory) {
|
|
pocketStoriesController.handleCategoryClick(categoryClicked)
|
|
}
|
|
|
|
override fun onStoryClicked(storyClicked: PocketRecommendedStory, storyPosition: Pair<Int, Int>) {
|
|
pocketStoriesController.handleStoryClicked(storyClicked, storyPosition)
|
|
}
|
|
|
|
override fun onLearnMoreClicked(link: String) {
|
|
pocketStoriesController.handleLearnMoreClicked(link)
|
|
}
|
|
|
|
override fun onDiscoverMoreClicked(link: String) {
|
|
pocketStoriesController.handleDiscoverMoreClicked(link)
|
|
}
|
|
|
|
override fun reportSessionMetrics(state: AppState) {
|
|
controller.handleReportSessionMetrics(state)
|
|
}
|
|
}
|