From b5fcbf3f9666589869bdf8cb905ad7fb402f0414 Mon Sep 17 00:00:00 2001 From: Valentina Iancu Date: Fri, 12 Apr 2024 12:38:53 +0200 Subject: [PATCH 1/2] feat(GiniCaptureSDK): Add no results screen events - events added: `screen_shown`, `close_tapped`, `enter_manually_tapped`, `retake_images_tapped` PP-391 --- .../NoResultScreenViewController.swift | 33 ++++++++++++++++++- .../Core/Tracking/AnalyticsEvent.swift | 4 +++ .../Core/Tracking/AnalyticsProperties.swift | 1 + .../Core/Tracking/AnalyticsScreen.swift | 1 + 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift index 7778cc0d7..55bba8df2 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift @@ -30,6 +30,19 @@ final class NoResultScreenViewController: UIViewController { return text } } + + var analyticsValue: String { + switch self { + case .pdf: + return "pdf" + case .image: + return "image" + case .qrCode: + return "qrCode" + default: + return "unknown" + } + } } lazy var tableView: UITableView = { @@ -113,6 +126,11 @@ final class NoResultScreenViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.setupView() + + let eventProperties = [AnalyticsProperty(key: .noResultType, + value: type.analyticsValue)] + AnalyticsManager.trackScreenShown(screenName: .noResults, + properties: eventProperties) } override func viewDidLayoutSubviews() { @@ -175,7 +193,7 @@ final class NoResultScreenViewController: UIViewController { private func configureCustomTopNavigationBar() { let cancelButton = GiniBarButton(ofType: .cancel) - cancelButton.addAction(viewModel, #selector(viewModel.didPressCancell)) + cancelButton.addAction(self, #selector(didPressCancel)) if giniConfiguration.bottomNavigationBarEnabled { navigationItem.rightBarButtonItem = cancelButton.barButton @@ -248,6 +266,19 @@ final class NoResultScreenViewController: UIViewController { viewModel, action: #selector(viewModel.didPressRetake), for: .touchUpInside) + @objc func didPressEnterManually() { + AnalyticsManager.track(event: .enterManuallyTapped, screenName: .noResults) + viewModel.didPressEnterManually() + } + + @objc func didPressRetake() { + AnalyticsManager.track(event: .retakeImagesTapped, screenName: .noResults) + viewModel.didPressRetake() + } + + @objc func didPressCancel() { + AnalyticsManager.track(event: .closeTapped, screenName: .noResults) + viewModel.didPressCancel() } private func configureHeaderContraints() { diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsEvent.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsEvent.swift index cfa68901b..0b0f731ae 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsEvent.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsEvent.swift @@ -27,4 +27,8 @@ enum AnalyticsEvent: String { case deletePagesTapped = "delete_pages_tapped" case addPagesTapped = "add_pages_tapped" case swipePages = "swipe_pages" + + // MARK: - No Results and Error + case enterManuallyTapped = "enter_manually_tapped" + case retakeImagesTapped = "retake_images_tapped" } diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsProperties.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsProperties.swift index 2263e48a3..a5c54ef7b 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsProperties.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsProperties.swift @@ -41,4 +41,5 @@ enum AnalyticsPropertyKey: String { case ibanDetectionLayerVisible = "iban_detection_layer_visible" case errorMessage = "error_message" + case noResultType = "no_result_type" } diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsScreen.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsScreen.swift index 659da7705..487137dce 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsScreen.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Tracking/AnalyticsScreen.swift @@ -12,4 +12,5 @@ enum AnalyticsScreen: String { case camera case review case analysis + case noResults = "no_results" } From 39bb0222def8dbbc32dd8807193611a3e81a9721 Mon Sep 17 00:00:00 2001 From: Valentina Iancu Date: Fri, 12 Apr 2024 12:43:04 +0200 Subject: [PATCH 2/2] refactor(GiniCaptureSDK): Cleanup code - fix typo - fix indentation PP-391 --- .../Error/ErrorScreenViewController.swift | 2 +- .../NoResult/BottomButtonsViewModel.swift | 17 +++---- .../NoResultScreenViewController.swift | 49 ++++++++----------- .../GiniScreenAPICoordinator+Analysis.swift | 2 +- 4 files changed, 31 insertions(+), 39 deletions(-) diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Error/ErrorScreenViewController.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Error/ErrorScreenViewController.swift index e295aea59..2236b5d1b 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Error/ErrorScreenViewController.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Error/ErrorScreenViewController.swift @@ -146,7 +146,7 @@ class ErrorScreenViewController: UIViewController { private func configureCustomTopNavigationBar() { let cancelButton = GiniBarButton(ofType: .cancel) - cancelButton.addAction(viewModel, #selector(viewModel.didPressCancell)) + cancelButton.addAction(viewModel, #selector(viewModel.didPressCancel)) if giniConfiguration.bottomNavigationBarEnabled { navigationItem.rightBarButtonItem = cancelButton.barButton diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/BottomButtonsViewModel.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/BottomButtonsViewModel.swift index 521adb20a..edcd98598 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/BottomButtonsViewModel.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/BottomButtonsViewModel.swift @@ -9,14 +9,13 @@ import Foundation final class BottomButtonsViewModel { - let retakePressed: (() -> Void)? - let enterManuallyPressed: (() -> Void)? - let cancelPressed: (() -> Void) - - init( - retakeBlock: (() -> Void)? = nil, - manuallyPressed: (() -> Void)? = nil, - cancelPressed: @escaping(() -> Void)) { + private let retakePressed: (() -> Void)? + private let enterManuallyPressed: (() -> Void)? + private let cancelPressed: (() -> Void) + + init(retakeBlock: (() -> Void)? = nil, + manuallyPressed: (() -> Void)? = nil, + cancelPressed: @escaping(() -> Void)) { self.retakePressed = retakeBlock self.enterManuallyPressed = manuallyPressed self.cancelPressed = cancelPressed @@ -32,7 +31,7 @@ final class BottomButtonsViewModel { enterManuallyPressed?() } - @objc func didPressCancell() { + @objc func didPressCancel() { errorOccurred = false cancelPressed() } diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift index 55bba8df2..446c6a674 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/NoResult/NoResultScreenViewController.swift @@ -96,11 +96,9 @@ final class NoResultScreenViewController: UIViewController { }).count } - public init( - giniConfiguration: GiniConfiguration, - type: NoResultType, - viewModel: BottomButtonsViewModel - ) { + public init(giniConfiguration: GiniConfiguration, + type: NoResultType, + viewModel: BottomButtonsViewModel) { self.giniConfiguration = giniConfiguration self.type = type switch type { @@ -169,26 +167,21 @@ final class NoResultScreenViewController: UIViewController { } private func configureMainView() { - title = NSLocalizedStringPreferredFormat( - "ginicapture.noresult.title", - comment: "No result screen title") - header.iconImageView.accessibilityLabel = NSLocalizedStringPreferredFormat( - "ginicapture.noresult.title", - comment: "No result screen title") + title = NSLocalizedStringPreferredFormat("ginicapture.noresult.title", + comment: "No result screen title") + header.iconImageView.accessibilityLabel = NSLocalizedStringPreferredFormat("ginicapture.noresult.title", + comment: "No result screen title") header.headerLabel.text = type.description header.headerLabel.font = giniConfiguration.textStyleFonts[.subheadline] - header.headerLabel.textColor = GiniColor( - light: UIColor.GiniCapture.dark1, - dark: UIColor.GiniCapture.light1 - ).uiColor() - view.backgroundColor = GiniColor(light: UIColor.GiniCapture.light2, dark: UIColor.GiniCapture.dark2).uiColor() + header.headerLabel.textColor = GiniColor(light: UIColor.GiniCapture.dark1, + dark: UIColor.GiniCapture.light1).uiColor() + view.backgroundColor = GiniColor(light: UIColor.GiniCapture.light2, + dark: UIColor.GiniCapture.dark2).uiColor() view.addSubview(header) view.addSubview(tableView) view.addSubview(buttonsView) - header.backgroundColor = GiniColor( - light: UIColor.GiniCapture.error4, - dark: UIColor.GiniCapture.error1 - ).uiColor() + header.backgroundColor = GiniColor(light: UIColor.GiniCapture.error4, + dark: UIColor.GiniCapture.error1).uiColor() } private func configureCustomTopNavigationBar() { @@ -258,14 +251,14 @@ final class NoResultScreenViewController: UIViewController { } private func configureButtons() { - buttonsView.enterButton.addTarget( - viewModel, - action: #selector(viewModel.didPressEnterManually), - for: .touchUpInside) - buttonsView.retakeButton.addTarget( - viewModel, - action: #selector(viewModel.didPressRetake), - for: .touchUpInside) + buttonsView.enterButton.addTarget(self, + action: #selector(didPressEnterManually), + for: .touchUpInside) + buttonsView.retakeButton.addTarget(self, + action: #selector(didPressRetake), + for: .touchUpInside) + } + @objc func didPressEnterManually() { AnalyticsManager.track(event: .enterManuallyTapped, screenName: .noResults) viewModel.didPressEnterManually() diff --git a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Screen API Coordinator/GiniScreenAPICoordinator+Analysis.swift b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Screen API Coordinator/GiniScreenAPICoordinator+Analysis.swift index 8b08b8d67..f3bddb4f7 100644 --- a/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Screen API Coordinator/GiniScreenAPICoordinator+Analysis.swift +++ b/CaptureSDK/GiniCaptureSDK/Sources/GiniCaptureSDK/Core/Screens/Screen API Coordinator/GiniScreenAPICoordinator+Analysis.swift @@ -89,7 +89,7 @@ extension GiniScreenAPICoordinator { extension GiniScreenAPICoordinator: AnalysisDelegate { - public func displayError(errorType: ErrorType,animated: Bool) { + public func displayError(errorType: ErrorType, animated: Bool) { let viewModel: BottomButtonsViewModel switch pages.type { case .image: