diff --git a/firefox-ios/Client/Application/AccessibilityIdentifiers.swift b/firefox-ios/Client/Application/AccessibilityIdentifiers.swift index a38e463a7287..642561abd3db 100644 --- a/firefox-ios/Client/Application/AccessibilityIdentifiers.swift +++ b/firefox-ios/Client/Application/AccessibilityIdentifiers.swift @@ -99,6 +99,7 @@ struct AccessibilityIdentifiers { static let saveToReadingList = "MainMenu.SaveToReadingList" static let addToShortcuts = "MainMenu.AddToShortcuts" static let bookmarkThisPage = "MainMenu.BookmarkThisPage" + static let print = "MainMenu.Print" static let share = "MainMenu.Share" static let reportBrokenSite = "MainMenu.ReportBrokenSite" static let readerView = "MainMenu.ReaderViewOn" diff --git a/firefox-ios/Client/Coordinators/Browser/BrowserCoordinator.swift b/firefox-ios/Client/Coordinators/Browser/BrowserCoordinator.swift index 88a05681d929..894672ce4250 100644 --- a/firefox-ios/Client/Coordinators/Browser/BrowserCoordinator.swift +++ b/firefox-ios/Client/Coordinators/Browser/BrowserCoordinator.swift @@ -598,6 +598,14 @@ class BrowserCoordinator: BaseCoordinator, ) } + func showPrintSheet() { + if let webView = browserViewController.tabManager.selectedTab?.webView { + let printController = UIPrintInteractionController.shared + printController.printFormatter = webView.viewPrintFormatter() + printController.present(animated: true, completionHandler: nil) + } + } + private func makeMenuNavViewController() -> DismissableNavigationViewController? { if let mainMenuCoordinator = childCoordinators.first(where: { $0 is MainMenuCoordinator }) as? MainMenuCoordinator { mainMenuCoordinator.dismissMenuModal(animated: false) diff --git a/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift b/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift index 272f7d77e8ea..e5de99ec6a3f 100644 --- a/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift +++ b/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuConfigurationUtility.swift @@ -228,6 +228,8 @@ struct MainMenuConfigurationUtility: Equatable, FeatureFlaggable { if shouldShowReportSiteIssue { description += ", \(Preview.ReportBrokenSiteSubtitle)" } + + description += ", \(Preview.PrintSubtitle)" description += ", \(Preview.ShareSubtitle)" return description @@ -309,7 +311,10 @@ struct MainMenuConfigurationUtility: Equatable, FeatureFlaggable { return [ firstSection, - MenuSection(options: [configureShareItem(with: uuid, tabInfo: tabInfo)]), + MenuSection(options: [ + configurePrintItem(with: uuid, tabInfo: tabInfo), + configureShareItem(with: uuid, tabInfo: tabInfo), + ]) ] } @@ -341,6 +346,34 @@ struct MainMenuConfigurationUtility: Equatable, FeatureFlaggable { ) } + private func configurePrintItem( + with uuid: WindowUUID, + tabInfo: MainMenuTabInfo + ) -> MenuElement { + return MenuElement( + title: .MainMenu.Submenus.Tools.Print, + iconName: Icons.print, + isEnabled: true, + isActive: false, + a11yLabel: .MainMenu.Submenus.Tools.AccessibilityLabels.Print, + a11yHint: "", + a11yId: AccessibilityIdentifiers.MainMenu.print, + action: { + store.dispatch( + MainMenuAction( + windowUUID: uuid, + actionType: MainMenuActionType.tapNavigateToDestination, + navigationDestination: MenuNavigationDestination( + .printSheet, + url: tabInfo.canonicalURL + ), + telemetryInfo: TelemetryInfo(isHomepage: tabInfo.isHomepage) + ) + ) + } + ) + } + private func configureShareItem( with uuid: WindowUUID, tabInfo: MainMenuTabInfo diff --git a/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuCoordinator.swift b/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuCoordinator.swift index 16ff50423fe9..e4d8b6b7ab52 100644 --- a/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuCoordinator.swift +++ b/firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuCoordinator.swift @@ -16,6 +16,7 @@ protocol MainMenuCoordinatorDelegate: AnyObject { func showFindInPage() func showSignInView(fxaParameters: FxASignInViewParameters?) func updateZoomPageBarVisibility() + func showPrintSheet() /// Open the share sheet to share the currently selected `Tab`. func showShareSheetForCurrentlySelectedTab() @@ -111,6 +112,9 @@ class MainMenuCoordinator: BaseCoordinator, FeatureFlaggable { ) self.navigationHandler?.showSignInView(fxaParameters: fxaParameters) + case .printSheet: + self.navigationHandler?.showPrintSheet() + case .shareSheet: self.navigationHandler?.showShareSheetForCurrentlySelectedTab() diff --git a/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MainMenuMiddleware.swift b/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MainMenuMiddleware.swift index 20954647d5ae..001b347e0fb6 100644 --- a/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MainMenuMiddleware.swift +++ b/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MainMenuMiddleware.swift @@ -23,6 +23,7 @@ final class MainMenuMiddleware { static let newInFirefox = "new_in_firefox" static let tools = "tools" static let save = "save" + static let print = "print" static let share = "share" static let switchToDesktopSite = "switch_to_desktop_site" static let switchToMobileSite = "switch_to_mobile_site" @@ -270,6 +271,9 @@ final class MainMenuMiddleware { telemetry.mainMenuOptionTapped(with: isHomepage, and: TelemetryAction.newInFirefox) } + case .printSheet: + telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.print) + case .shareSheet: telemetry.toolsSubmenuOptionTapped(with: isHomepage, and: TelemetryAction.share) diff --git a/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MenuNavigationDestination.swift b/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MenuNavigationDestination.swift index cfd937ba5e0c..b40e135e251b 100644 --- a/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MenuNavigationDestination.swift +++ b/firefox-ios/Client/Frontend/Browser/MainMenu/Redux/MenuNavigationDestination.swift @@ -17,6 +17,7 @@ enum MainMenuNavigationDestination: Equatable, CaseIterable { case passwords case settings case syncSignIn + case printSheet case shareSheet case zoom }