From ed657dfa39226f0048fed00f3a4a79ba50e7e058 Mon Sep 17 00:00:00 2001 From: Rajat Verma Date: Sat, 2 Mar 2024 20:46:55 +0530 Subject: [PATCH 1/2] update: Added UIScreenshotServiceDelegate to AppDelegate for taking full screenshots across all screens with OBAListView --- .../contents.xcworkspacedata | 7 +++++ OBAKit/Agencies/AgenciesViewController.swift | 6 +++- .../Alerts/AgencyAlertsViewController.swift | 6 +++- .../Bookmarks/AddBookmarkViewController.swift | 5 +++- .../Bookmarks/BookmarksViewController.swift | 6 +++- OBAKit/Orchestration/Application.swift | 30 +++++++++++++++++++ OBAKit/Recent/RecentStopsViewController.swift | 5 +++- .../ReportProblemViewController.swift | 5 +++- OBAKit/Search/SearchResultsController.swift | 5 +++- .../ServiceAlertListController.swift | 5 +++- OBAKit/Settings/CreditsViewController.swift | 5 +++- OBAKit/Settings/MoreViewController.swift | 5 +++- OBAKit/Stops/NearbyStopsViewController.swift | 4 +++ OBAKit/Stops/StopViewController.swift | 5 +++- OBAKit/Trip/TripFloatingPanelController.swift | 5 +++- 15 files changed, 92 insertions(+), 12 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/OBAKit/Agencies/AgenciesViewController.swift b/OBAKit/Agencies/AgenciesViewController.swift index 45bc808fe..f67949316 100644 --- a/OBAKit/Agencies/AgenciesViewController.swift +++ b/OBAKit/Agencies/AgenciesViewController.swift @@ -14,6 +14,11 @@ import OBAKitCore /// Loads and displays a list of agencies in the current region. class AgenciesViewController: TaskController<[AgencyWithCoverage]>, OBAListViewDataSource { let listView = OBAListView() + + public override func loadView() { + super.loadView() + self.view = listView + } override func viewDidLoad() { super.viewDidLoad() @@ -21,7 +26,6 @@ class AgenciesViewController: TaskController<[AgencyWithCoverage]>, OBAListViewD view.backgroundColor = ThemeColors.shared.systemBackground listView.obaDataSource = self - view.addSubview(listView) listView.pinToSuperview(.edges) title = OBALoc("agencies_controller.title", value: "Agencies", comment: "Title of the Agencies controller") diff --git a/OBAKit/Alerts/AgencyAlertsViewController.swift b/OBAKit/Alerts/AgencyAlertsViewController.swift index bca6b3492..183406b44 100644 --- a/OBAKit/Alerts/AgencyAlertsViewController.swift +++ b/OBAKit/Alerts/AgencyAlertsViewController.swift @@ -49,6 +49,11 @@ class AgencyAlertsViewController: UIViewController, } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } + public override func viewDidLoad() { super.viewDidLoad() @@ -58,7 +63,6 @@ class AgencyAlertsViewController: UIViewController, listView.collapsibleSectionsDelegate = self listView.contextMenuDelegate = self listView.refreshControl = refreshControl - view.addSubview(listView) listView.pinToSuperview(.edges) view.backgroundColor = ThemeColors.shared.systemBackground diff --git a/OBAKit/Bookmarks/AddBookmarkViewController.swift b/OBAKit/Bookmarks/AddBookmarkViewController.swift index c4aa7cd3f..45cb7c792 100644 --- a/OBAKit/Bookmarks/AddBookmarkViewController.swift +++ b/OBAKit/Bookmarks/AddBookmarkViewController.swift @@ -40,13 +40,16 @@ class AddBookmarkViewController: TaskController<[ArrivalDeparture]>, OBAListView } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } public override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = ThemeColors.shared.systemBackground listView.obaDataSource = self - view.addSubview(listView) listView.pinToSuperview(.edges) } diff --git a/OBAKit/Bookmarks/BookmarksViewController.swift b/OBAKit/Bookmarks/BookmarksViewController.swift index a84691548..24a12d1d0 100644 --- a/OBAKit/Bookmarks/BookmarksViewController.swift +++ b/OBAKit/Bookmarks/BookmarksViewController.swift @@ -91,6 +91,11 @@ public class BookmarksViewController: UIViewController, } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } + public override func viewDidLoad() { super.viewDidLoad() @@ -100,7 +105,6 @@ public class BookmarksViewController: UIViewController, listView.contextMenuDelegate = self listView.formatters = application.formatters listView.register(listViewItem: BookmarkArrivalViewModel.self) - view.addSubview(listView) listView.pinToSuperview(.edges) rebuildSortMenu() diff --git a/OBAKit/Orchestration/Application.swift b/OBAKit/Orchestration/Application.swift index 8ab7c2113..121c3c94b 100644 --- a/OBAKit/Orchestration/Application.swift +++ b/OBAKit/Orchestration/Application.swift @@ -348,6 +348,7 @@ public class Application: CoreApplication, PushServiceDelegate { reloadRootUserInterface() reportAnalyticsUserProperties() + UIApplication.shared.delegate?.window??.windowScene?.screenshotService?.delegate = self } @objc public func applicationDidBecomeActive(_ application: UIApplication) { @@ -589,3 +590,32 @@ public class Application: CoreApplication, PushServiceDelegate { /// `.running` means that the feature is ready to use. public lazy var features = FeatureAvailability(config: self.config, application: self) } + +extension Application: UIScreenshotServiceDelegate { + public func screenshotService(_ screenshotService: UIScreenshotService, generatePDFRepresentationWithCompletion completionHandler: @escaping (Data?, Int, CGRect) -> Void) { + guard let topVC = UIApplication.shared.keyWindowFromScene?.topViewController, + let scrollerView = topVC.view as? OBAListView, + scrollerView.contentSize.height != .zero else { + completionHandler(nil, 0, .zero) + return + } + let data = NSMutableData() + UIGraphicsBeginPDFContextToData(data, .zero, nil) + UIGraphicsBeginPDFPageWithInfo(.init(origin: .zero, size: scrollerView.contentSize), nil) + if let context = UIGraphicsGetCurrentContext() { + let frame = scrollerView.frame + let contentOffset = scrollerView.contentOffset + let contentInset = scrollerView.contentInset + scrollerView.contentOffset = .zero + scrollerView.contentInset = .zero + scrollerView.frame = .init(origin: .zero, size: scrollerView.contentSize) + scrollerView.layer.render(in: context) + scrollerView.frame = frame + scrollerView.contentOffset = contentOffset + scrollerView.contentInset = contentInset + } + UIGraphicsEndPDFContext() + let y = scrollerView.contentSize.height - scrollerView.contentOffset.y - scrollerView.frame.height + completionHandler(data as Data, 0, .init(origin: CGPoint(x: 0, y: y), size: topVC.view.frame.size)) + } +} diff --git a/OBAKit/Recent/RecentStopsViewController.swift b/OBAKit/Recent/RecentStopsViewController.swift index d0ffd536d..90fa8160b 100644 --- a/OBAKit/Recent/RecentStopsViewController.swift +++ b/OBAKit/Recent/RecentStopsViewController.swift @@ -37,6 +37,10 @@ public class RecentStopsViewController: UIViewController, } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } public override func viewDidLoad() { super.viewDidLoad() @@ -44,7 +48,6 @@ public class RecentStopsViewController: UIViewController, navigationItem.rightBarButtonItem = UIBarButtonItem(title: OBALoc("recent_stops.delete_all", value: "Delete All", comment: "A button that deletes all of the recent stops in the app."), style: .plain, target: self, action: #selector(deleteAll)) view.backgroundColor = ThemeColors.shared.systemBackground - view.addSubview(listView) listView.contextMenuDelegate = self listView.pinToSuperview(.edges) } diff --git a/OBAKit/Reporting/ReportProblemViewController.swift b/OBAKit/Reporting/ReportProblemViewController.swift index 7872d97e9..2dbae9251 100644 --- a/OBAKit/Reporting/ReportProblemViewController.swift +++ b/OBAKit/Reporting/ReportProblemViewController.swift @@ -40,6 +40,10 @@ class ReportProblemViewController: TaskController, required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } public override func viewDidLoad() { super.viewDidLoad() @@ -50,7 +54,6 @@ class ReportProblemViewController: TaskController, listView.formatters = application.formatters listView.register(listViewItem: ArrivalDepartureItem.self) - view.addSubview(listView) listView.pinToSuperview(.edges) } diff --git a/OBAKit/Search/SearchResultsController.swift b/OBAKit/Search/SearchResultsController.swift index e3670f7dd..ee118933d 100644 --- a/OBAKit/Search/SearchResultsController.swift +++ b/OBAKit/Search/SearchResultsController.swift @@ -34,13 +34,16 @@ public class SearchResultsController: UIViewController, AppContext, OBAListViewD titleView.subtitleLabel.text = subtitleText(from: searchResponse) listView.obaDataSource = self - view.addSubview(listView) listView.pinToSuperview(.edges) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - UIViewController Lifecycle + public override func loadView() { + super.loadView() + self.view = listView + } override public func viewDidLoad() { super.viewDidLoad() diff --git a/OBAKit/ServiceAlerts/ServiceAlertListController.swift b/OBAKit/ServiceAlerts/ServiceAlertListController.swift index fbfdd32d0..774b91897 100644 --- a/OBAKit/ServiceAlerts/ServiceAlertListController.swift +++ b/OBAKit/ServiceAlerts/ServiceAlertListController.swift @@ -34,6 +34,10 @@ final class ServiceAlertListController: UIViewController, } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } override func viewDidLoad() { super.viewDidLoad() @@ -41,7 +45,6 @@ final class ServiceAlertListController: UIViewController, view.backgroundColor = ThemeColors.shared.systemBackground listView.obaDataSource = self - view.addSubview(listView) listView.pinToSuperview(.edges) } diff --git a/OBAKit/Settings/CreditsViewController.swift b/OBAKit/Settings/CreditsViewController.swift index 8aa615df0..8545df970 100644 --- a/OBAKit/Settings/CreditsViewController.swift +++ b/OBAKit/Settings/CreditsViewController.swift @@ -36,13 +36,16 @@ class CreditsViewController: UIViewController, AppContext, OBAListViewDataSource } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = ThemeColors.shared.systemBackground - view.addSubview(listView) listView.pinToSuperview(.edges) listView.obaDataSource = self listView.applyData() diff --git a/OBAKit/Settings/MoreViewController.swift b/OBAKit/Settings/MoreViewController.swift index c6ad1e10f..8af6bfc1d 100644 --- a/OBAKit/Settings/MoreViewController.swift +++ b/OBAKit/Settings/MoreViewController.swift @@ -51,11 +51,14 @@ public class MoreViewController: UIViewController, } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } public override func viewDidLoad() { super.viewDidLoad() listView.obaDataSource = self - view.addSubview(listView) listView.pinToSuperview(.edges) view.backgroundColor = ThemeColors.shared.systemBackground diff --git a/OBAKit/Stops/NearbyStopsViewController.swift b/OBAKit/Stops/NearbyStopsViewController.swift index 13348b0da..e9f35a725 100644 --- a/OBAKit/Stops/NearbyStopsViewController.swift +++ b/OBAKit/Stops/NearbyStopsViewController.swift @@ -44,6 +44,10 @@ class NearbyStopsViewController: UIViewController, required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } public override func viewDidLoad() { super.viewDidLoad() diff --git a/OBAKit/Stops/StopViewController.swift b/OBAKit/Stops/StopViewController.swift index d9ca433d7..02f637f47 100644 --- a/OBAKit/Stops/StopViewController.swift +++ b/OBAKit/Stops/StopViewController.swift @@ -166,6 +166,10 @@ public class StopViewController: UIViewController, } // MARK: - UIViewController Overrides + public override func loadView() { + super.loadView() + self.view = listView + } public override func viewDidLoad() { super.viewDidLoad() @@ -185,7 +189,6 @@ public class StopViewController: UIViewController, listView.register(listViewItem: StopArrivalWalkItem.self) listView.register(listViewItem: StopHeaderItem.self) - view.addSubview(listView) listView.pinToSuperview(.edges) listView.addSubview(refreshControl) diff --git a/OBAKit/Trip/TripFloatingPanelController.swift b/OBAKit/Trip/TripFloatingPanelController.swift index 2ab7eb8bf..e8677ca6a 100644 --- a/OBAKit/Trip/TripFloatingPanelController.swift +++ b/OBAKit/Trip/TripFloatingPanelController.swift @@ -68,6 +68,10 @@ class TripFloatingPanelController: UIViewController, required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - UIViewController + public override func loadView() { + super.loadView() + self.view = listView + } public override func viewDidLoad() { super.viewDidLoad() @@ -79,7 +83,6 @@ class TripFloatingPanelController: UIViewController, listView.register(listViewItem: TripStopViewModel.self) view.backgroundColor = ThemeColors.shared.systemBackground - view.addSubview(outerStack) outerStack.pinToSuperview(.edges) } From b9f53bd6a339bb7639212bd45eade2dfdf75def1 Mon Sep 17 00:00:00 2001 From: Rajat Verma Date: Sat, 2 Mar 2024 20:56:17 +0530 Subject: [PATCH 2/2] update: Added Mark statement in AppDelegate --- OBAKit/Orchestration/Application.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/OBAKit/Orchestration/Application.swift b/OBAKit/Orchestration/Application.swift index 121c3c94b..47647f128 100644 --- a/OBAKit/Orchestration/Application.swift +++ b/OBAKit/Orchestration/Application.swift @@ -591,6 +591,7 @@ public class Application: CoreApplication, PushServiceDelegate { public lazy var features = FeatureAvailability(config: self.config, application: self) } +// MARK: UIScreenshotServiceDelegate extension Application: UIScreenshotServiceDelegate { public func screenshotService(_ screenshotService: UIScreenshotService, generatePDFRepresentationWithCompletion completionHandler: @escaping (Data?, Int, CGRect) -> Void) { guard let topVC = UIApplication.shared.keyWindowFromScene?.topViewController,